commit
6786b6ee10
@ -0,0 +1,3 @@
|
|||||||
|
# Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
# All this logic will automatically be available in application.js.
|
||||||
|
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
|
@ -0,0 +1,3 @@
|
|||||||
|
# Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
# All this logic will automatically be available in application.js.
|
||||||
|
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
|
@ -0,0 +1,3 @@
|
|||||||
|
// Place all the styles related to the ecloud controller here.
|
||||||
|
// They will automatically be included in application.css.
|
||||||
|
// You can use Sass (SCSS) here: http://sass-lang.com/
|
@ -0,0 +1,3 @@
|
|||||||
|
// Place all the styles related to the oauth controller here.
|
||||||
|
// They will automatically be included in application.css.
|
||||||
|
// You can use Sass (SCSS) here: http://sass-lang.com/
|
@ -0,0 +1,2 @@
|
|||||||
|
module EcloudHelper
|
||||||
|
end
|
@ -0,0 +1,2 @@
|
|||||||
|
module OauthHelper
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
#encoding=utf-8
|
||||||
|
class Ecloud < ActiveRecord::Base
|
||||||
|
attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime,
|
||||||
|
:mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username, :email,
|
||||||
|
:effecttime, :operatime
|
||||||
|
|
||||||
|
has_many :ecloud_services, :dependent => :destroy # 业务列表
|
||||||
|
has_many :ecloud_productparas, :dependent => :destroy # 开通参数列表
|
||||||
|
|
||||||
|
has_one :ecloud_user
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
class EcloudLog < ActiveRecord::Base
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,4 @@
|
|||||||
|
class EcloudProductpara < ActiveRecord::Base
|
||||||
|
attr_accessible :key, :value, :ecloud_id
|
||||||
|
belongs_to :ecloud
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class EcloudService < ActiveRecord::Base
|
||||||
|
attr_accessible :begintime, :code, :endtime, :opttype, :ecloud_id, :packagecode, :bossorderid
|
||||||
|
belongs_to :ecloud
|
||||||
|
has_many :ecloud_serviece_serviceparas
|
||||||
|
end
|
@ -0,0 +1,4 @@
|
|||||||
|
class EcloudServieceServicepara < ActiveRecord::Base
|
||||||
|
attr_accessible :key, :value, :ecloud_service_id
|
||||||
|
belongs_to :ecloud_service
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
class EcloudUser < ActiveRecord::Base
|
||||||
|
has_many :ecloud_user_paras
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
class EcloudUserPara < ActiveRecord::Base
|
||||||
|
belongs_to :ecloud_user
|
||||||
|
end
|
@ -0,0 +1,53 @@
|
|||||||
|
require 'base64'
|
||||||
|
|
||||||
|
class Oauth < ActiveRecord::Base
|
||||||
|
attr_accessible :client_id, :client_secret, :redirect_uri, :access_token,
|
||||||
|
:refresh_token, :token_created_at,:token_expires_in, :user_id
|
||||||
|
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
def gen_code
|
||||||
|
code = Base64.urlsafe_encode64 Digest::MD5.hexdigest "#{Time.now}-#{Random.new_seed}"
|
||||||
|
update_column(:code, code)
|
||||||
|
code
|
||||||
|
end
|
||||||
|
|
||||||
|
def gen_token
|
||||||
|
access_token = Digest::MD5.hexdigest "#{Time.now}-#{Random.new_seed}"
|
||||||
|
refresh_token = Digest::MD5.hexdigest "#{Random.new_seed}-#{Time.now}-#{Random.new_seed}"
|
||||||
|
|
||||||
|
self.update_attributes(access_token: access_token,
|
||||||
|
refresh_token: refresh_token,
|
||||||
|
token_created_at: Time.now.to_i,
|
||||||
|
token_expires_in: Time.now.to_i + 24*60*60,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def self.code_valid?(code)
|
||||||
|
# 1. 是否存在
|
||||||
|
oauth = Oauth.where(code: code).order("ID desc").first
|
||||||
|
return false unless oauth
|
||||||
|
|
||||||
|
# 2. 是否超过10分钟
|
||||||
|
return false if Time.now.to_i - oauth.created_at.to_i > 10*60
|
||||||
|
|
||||||
|
# 3. 是否有使用过
|
||||||
|
return false if oauth.access_token.present?
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def self.auth_code(code, client_id, client_secret)
|
||||||
|
Oauth.where(code: code, client_id: client_id, client_secret: client_secret).order('id desc').first
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.auth(access_token)
|
||||||
|
oauth = self.find_by_access_token(access_token)
|
||||||
|
return nil unless oauth
|
||||||
|
oauth.user
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
class OauthConfig < ActiveRecord::Base
|
||||||
|
attr_accessible :client_id, :client_secret, :redirect_uri, :scope
|
||||||
|
end
|
@ -1,6 +1,7 @@
|
|||||||
class EcloudService
|
class EcloudService
|
||||||
|
|
||||||
def list
|
def list params
|
||||||
return {status: 0, message: "test"}
|
|
||||||
|
return {status: 0, message: "test", code: params[:code], params: params}
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -1 +1 @@
|
|||||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/react/build/css/css_min_all.css"><link rel="stylesheet" href="/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.3274c43b.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/react/build/js/js_min_all.js"></script><script type="text/javascript" src="/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/react/build/js/create_kindeditor.js"></script><script type="text/javascript" src="/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.9f01900e.js"></script></body></html>
|
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/react/build/css/css_min_all.css"><link rel="stylesheet" href="/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.80b6ec5e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/react/build/js/js_min_all.js"></script><script type="text/javascript" src="/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/react/build/js/create_kindeditor.js"></script><script type="text/javascript" src="/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.b4ee5e8a.js"></script></body></html>
|
@ -1,5 +1,5 @@
|
|||||||
class AddForbidCopyToShixun < ActiveRecord::Migration
|
class AddForbidCopyToShixun < ActiveRecord::Migration
|
||||||
def change
|
def change
|
||||||
add_column :shixuns, :forbid_copy, :boolean, :default => 0
|
# add_column :shixuns, :forbid_copy, :boolean, :default => 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
class CreateOauths < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
|
||||||
|
create_table :oauths do |t|
|
||||||
|
t.string :client_id
|
||||||
|
t.string :client_secret
|
||||||
|
t.string :code
|
||||||
|
t.string :redirect_uri
|
||||||
|
t.string :scope
|
||||||
|
|
||||||
|
t.string :access_token
|
||||||
|
t.string :refresh_token
|
||||||
|
t.integer :token_created_at
|
||||||
|
t.integer :token_expires_in #过期时间
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
add_column :oauths, :user_id, :integer, default: 0
|
||||||
|
|
||||||
|
add_index :oauths, :user_id
|
||||||
|
|
||||||
|
|
||||||
|
create_table :oauth_configs do |t|
|
||||||
|
t.string :client_id
|
||||||
|
t.string :client_secret
|
||||||
|
t.string :redirect_uri
|
||||||
|
t.string :scope
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
OauthConfig.create(
|
||||||
|
client_id: '88d893c5a345313e7b8c6fcf23d3d024ee08d5e41ce120c3448b6eea77d8de30',
|
||||||
|
client_secret: 'e9240cc5fc913741db5aea93f2986a8ea0631bb67f7c00e41e491b95d9619e64',
|
||||||
|
redirect_uri: 'http://localhost:3000/oschina/login_cb',
|
||||||
|
scope: ''
|
||||||
|
)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
class AddPassedScoreForUsers < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
games = Game.where("final_score = 0 and status = 2 and answer_open = 0 and created_at > '2019-03-09 00:00:00'").includes(:challenge)
|
||||||
|
puts "game_count: #{games.count}"
|
||||||
|
games.find_each do |game|
|
||||||
|
puts "#{game.id}"
|
||||||
|
challenge = game.challenge
|
||||||
|
# 选择题和实践题的分数
|
||||||
|
score = challenge.choose_score
|
||||||
|
user = game.user
|
||||||
|
game.update_column(:final_score, score)
|
||||||
|
# 奖励金币和提供记录
|
||||||
|
grade = Grade.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
|
||||||
|
if grade.nil?
|
||||||
|
Grade.create!(:user_id => user.id,
|
||||||
|
:container_id => game.id,
|
||||||
|
:container_type => "Game",
|
||||||
|
:score => score,
|
||||||
|
:created_at => game.end_time || Time.now,
|
||||||
|
:updated_at => game.end_time || Time.now)
|
||||||
|
user.update_column(:grade, (score + user.grade.to_i))
|
||||||
|
end
|
||||||
|
# 经验奖励
|
||||||
|
experience = Experience.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
|
||||||
|
if experience.nil?
|
||||||
|
Experience.create!(:user_id => user.id,
|
||||||
|
:container_id => game.id,
|
||||||
|
:container_type => "Game",
|
||||||
|
:score => score,
|
||||||
|
:created_at => game.end_time || Time.now,
|
||||||
|
:updated_at => game.end_time || Time.now)
|
||||||
|
user.update_column(:experience, (score + user.experience.to_i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,30 @@
|
|||||||
|
class CreateEcloudusers < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloudusers do |t|
|
||||||
|
t.string :applyno
|
||||||
|
t.string :ecordercoder
|
||||||
|
t.string :string
|
||||||
|
t.integer :opttype
|
||||||
|
t.boolean :trial
|
||||||
|
t.string :bossorderid
|
||||||
|
t.integer :custid
|
||||||
|
t.string :custcod
|
||||||
|
t.string :string
|
||||||
|
t.integer :custtype
|
||||||
|
t.integer :registersource
|
||||||
|
t.string :custname
|
||||||
|
t.integer :userid
|
||||||
|
t.string :username
|
||||||
|
t.string :useralias
|
||||||
|
t.string :moblile
|
||||||
|
t.string :email
|
||||||
|
t.string :productcode
|
||||||
|
t.datetime :begintime
|
||||||
|
t.datetime :endtime
|
||||||
|
t.string :productparas
|
||||||
|
t.string :services
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,18 @@
|
|||||||
|
class CreateEcloudUser < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_users do |t|
|
||||||
|
t.integer :opttype
|
||||||
|
t.integer :userid
|
||||||
|
t.string :username
|
||||||
|
t.string :useralias
|
||||||
|
t.string :mobile
|
||||||
|
t.string :email
|
||||||
|
t.string :begintime
|
||||||
|
t.string :endtime
|
||||||
|
t.string :paras
|
||||||
|
t.integer :custid
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,25 @@
|
|||||||
|
class CreateEclouds < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :eclouds do |t|
|
||||||
|
t.string :applyno
|
||||||
|
t.string :ecordercode
|
||||||
|
t.integer :opttype
|
||||||
|
t.boolean :trial
|
||||||
|
t.string :bossorderid
|
||||||
|
t.integer :custid
|
||||||
|
t.string :custcode
|
||||||
|
t.integer :registersource
|
||||||
|
t.integer :custtype
|
||||||
|
t.string :custname
|
||||||
|
t.integer :userid
|
||||||
|
t.string :username
|
||||||
|
t.string :useralias
|
||||||
|
t.string :mobile
|
||||||
|
t.string :productcode
|
||||||
|
t.string :begintime
|
||||||
|
t.string :endtime
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,13 @@
|
|||||||
|
class CreateEcloudServices < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_services do |t|
|
||||||
|
t.integer :opttype
|
||||||
|
t.string :code
|
||||||
|
t.string :begintime
|
||||||
|
t.string :endtime
|
||||||
|
t.integer :ecloud_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddIndexToEcloud < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_index :eclouds, [:ecordercode, :custcode], :unique => true, :name => 'ecorder_cust_code'
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddEmailToEcloud < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :eclouds, :email, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddPackagecodeToEcloudServices < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_services, :packagecode, :string
|
||||||
|
add_column :ecloud_services, :bossorderid, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddOperatimeToEcloud < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :eclouds, :operatime, :string
|
||||||
|
add_column :eclouds, :effecttime, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,39 @@
|
|||||||
|
class AddScoreForPassGames < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
games = Game.where("final_score = 0 and status = 2 and answer_open = 0 and end_time > '2019-03-08 00:00:00'").includes(:challenge)
|
||||||
|
puts "game_count: #{games.count}"
|
||||||
|
games.find_each do |game|
|
||||||
|
puts "#{game.id}"
|
||||||
|
challenge = game.challenge
|
||||||
|
# 选择题和实践题的分数
|
||||||
|
score = challenge.choose_score
|
||||||
|
user = game.user
|
||||||
|
game.update_column(:final_score, score)
|
||||||
|
# 奖励金币和提供记录
|
||||||
|
grade = Grade.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
|
||||||
|
if grade.nil?
|
||||||
|
Grade.create!(:user_id => user.id,
|
||||||
|
:container_id => game.id,
|
||||||
|
:container_type => "Game",
|
||||||
|
:score => score,
|
||||||
|
:created_at => game.end_time,
|
||||||
|
:updated_at => game.end_time)
|
||||||
|
user.update_column(:grade, (score + user.grade.to_i))
|
||||||
|
end
|
||||||
|
# 经验奖励
|
||||||
|
experience = Experience.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
|
||||||
|
if experience.nil?
|
||||||
|
Experience.create!(:user_id => user.id,
|
||||||
|
:container_id => game.id,
|
||||||
|
:container_type => "Game",
|
||||||
|
:score => score,
|
||||||
|
:created_at => game.end_time,
|
||||||
|
:updated_at => game.end_time)
|
||||||
|
user.update_column(:experience, (score + user.experience.to_i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class RemoveIndexFromEcloud < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
remove_index :eclouds, :name => 'ecorder_cust_code'
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddEcloudIdToEcloudUser < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_users, :ecloud_id, :integer
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddStatusToEcloudUser < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_users, :status, :integer, :limit => 1
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
class CreateEcloudProductpara < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_productparas do |t|
|
||||||
|
t.string :key
|
||||||
|
t.string :value
|
||||||
|
t.integer :ecloud_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
class CreateEcloudServieceServicepara < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_serviece_serviceparas do |t|
|
||||||
|
t.string :key
|
||||||
|
t.string :value
|
||||||
|
t.integer :ecloud_service_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddEcoderUserIdToUsers < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :users, :ecoder_user_id, :integer, default: 0
|
||||||
|
add_index :users, :ecoder_user_id
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,13 @@
|
|||||||
|
class CreateEcloudLogs < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_logs do |t|
|
||||||
|
t.string :url
|
||||||
|
t.string :applyno
|
||||||
|
t.integer :custid
|
||||||
|
t.string :custcode
|
||||||
|
t.string :para_value
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,16 @@
|
|||||||
|
class ChangeClo < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
change_column :eclouds, :begintime, :bigint, :limit => 20
|
||||||
|
change_column :eclouds, :endtime, :bigint, :limit => 20
|
||||||
|
change_column :eclouds, :operatime, :bigint, :limit => 20
|
||||||
|
change_column :eclouds, :effecttime, :bigint, :limit => 20
|
||||||
|
change_column :ecloud_services, :endtime, :bigint, :limit => 20
|
||||||
|
change_column :ecloud_services, :begintime, :bigint, :limit => 20
|
||||||
|
change_column :ecloud_users, :begintime, :bigint, :limit => 20
|
||||||
|
change_column :ecloud_users, :endtime, :bigint, :limit => 20
|
||||||
|
change_column :ecloud_logs, :para_value, :longtext
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,8 @@
|
|||||||
|
class AddIndexToHomework < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_index :homework_detail_manuals, :homework_common_id
|
||||||
|
add_index :homework_commons_shixuns, :homework_common_id
|
||||||
|
add_index :student_works_evaluation_distributions, :student_work_id
|
||||||
|
add_index :tidings, :container_id
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddProductcodeToUcloudService < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_services, :productcode, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddUseridToEcloudLog < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_logs, :userid, :integer
|
||||||
|
add_column :ecloud_logs, :username, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
class CreateEcloudUserParas < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :ecloud_user_paras do |t|
|
||||||
|
t.string :key
|
||||||
|
t.string :value
|
||||||
|
t.integer :ecloud_user_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,6 @@
|
|||||||
|
class AddOperatimeToEcloudUsers < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :ecloud_users, :operatime, :bigint
|
||||||
|
add_column :ecloud_users, :effecttime, :bigint
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,46 @@
|
|||||||
|
#coding=utf-8
|
||||||
|
|
||||||
|
require 'net/http'
|
||||||
|
require 'uri'
|
||||||
|
|
||||||
|
|
||||||
|
module Trustie
|
||||||
|
module Http
|
||||||
|
|
||||||
|
def get(url)
|
||||||
|
uri = URI(url)
|
||||||
|
res = Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https')) do |http|
|
||||||
|
req = Net::HTTP::Get.new(uri)
|
||||||
|
#req['Content-Type'] = 'application/json'
|
||||||
|
# The body needs to be a JSON string, use whatever you know to parse Hash to JSON
|
||||||
|
#req.body = {a: 1}.to_json
|
||||||
|
http.request(req)
|
||||||
|
end
|
||||||
|
|
||||||
|
res.body
|
||||||
|
end
|
||||||
|
|
||||||
|
def post(url, data=nil)
|
||||||
|
uri = URI(url)
|
||||||
|
res = Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https')) do |http|
|
||||||
|
req = Net::HTTP::Post.new(uri)
|
||||||
|
#req['Content-Type'] = 'application/json'
|
||||||
|
# The body needs to be a JSON string, use whatever you know to parse Hash to JSON
|
||||||
|
req.body = data if data
|
||||||
|
http.request(req)
|
||||||
|
end
|
||||||
|
|
||||||
|
res.body
|
||||||
|
end
|
||||||
|
|
||||||
|
def decode(s)
|
||||||
|
begin
|
||||||
|
obj = ActiveSupport::JSON.decode(s)
|
||||||
|
rescue ActiveSupport::JSON.parse_error
|
||||||
|
logger.error("Attempted to decode invalid JSON: #{s}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 293 KiB |
@ -1,88 +1,88 @@
|
|||||||
{
|
{
|
||||||
"./static/js/0.d15cdb8c.chunk.js": "./static/js/0.d15cdb8c.chunk.js",
|
"./static/js/0.f26528b1.chunk.js": "./static/js/0.f26528b1.chunk.js",
|
||||||
"./static/js/0.d15cdb8c.chunk.js.map": "./static/js/0.d15cdb8c.chunk.js.map",
|
"./static/js/0.f26528b1.chunk.js.map": "./static/js/0.f26528b1.chunk.js.map",
|
||||||
"./static/js/1.b37de40f.chunk.js": "./static/js/1.b37de40f.chunk.js",
|
"./static/js/1.cc33d6fc.chunk.js": "./static/js/1.cc33d6fc.chunk.js",
|
||||||
"./static/js/1.b37de40f.chunk.js.map": "./static/js/1.b37de40f.chunk.js.map",
|
"./static/js/1.cc33d6fc.chunk.js.map": "./static/js/1.cc33d6fc.chunk.js.map",
|
||||||
"./static/js/10.0b59b6d9.chunk.js": "./static/js/10.0b59b6d9.chunk.js",
|
"./static/js/10.943803f2.chunk.js": "./static/js/10.943803f2.chunk.js",
|
||||||
"./static/js/10.0b59b6d9.chunk.js.map": "./static/js/10.0b59b6d9.chunk.js.map",
|
"./static/js/10.943803f2.chunk.js.map": "./static/js/10.943803f2.chunk.js.map",
|
||||||
"./static/js/11.03d0c22e.chunk.js": "./static/js/11.03d0c22e.chunk.js",
|
"./static/js/11.c1a78f08.chunk.js": "./static/js/11.c1a78f08.chunk.js",
|
||||||
"./static/js/11.03d0c22e.chunk.js.map": "./static/js/11.03d0c22e.chunk.js.map",
|
"./static/js/11.c1a78f08.chunk.js.map": "./static/js/11.c1a78f08.chunk.js.map",
|
||||||
"./static/js/12.33ef9274.chunk.js": "./static/js/12.33ef9274.chunk.js",
|
"./static/js/12.fd69873b.chunk.js": "./static/js/12.fd69873b.chunk.js",
|
||||||
"./static/js/12.33ef9274.chunk.js.map": "./static/js/12.33ef9274.chunk.js.map",
|
"./static/js/12.fd69873b.chunk.js.map": "./static/js/12.fd69873b.chunk.js.map",
|
||||||
"./static/js/13.84649bc7.chunk.js": "./static/js/13.84649bc7.chunk.js",
|
"./static/js/13.d7c70bf4.chunk.js": "./static/js/13.d7c70bf4.chunk.js",
|
||||||
"./static/js/13.84649bc7.chunk.js.map": "./static/js/13.84649bc7.chunk.js.map",
|
"./static/js/13.d7c70bf4.chunk.js.map": "./static/js/13.d7c70bf4.chunk.js.map",
|
||||||
"./static/js/14.57622e23.chunk.js": "./static/js/14.57622e23.chunk.js",
|
"./static/js/14.af9b2fb8.chunk.js": "./static/js/14.af9b2fb8.chunk.js",
|
||||||
"./static/js/14.57622e23.chunk.js.map": "./static/js/14.57622e23.chunk.js.map",
|
"./static/js/14.af9b2fb8.chunk.js.map": "./static/js/14.af9b2fb8.chunk.js.map",
|
||||||
"./static/js/15.cd2747c4.chunk.js": "./static/js/15.cd2747c4.chunk.js",
|
"./static/js/15.05fc7db4.chunk.js": "./static/js/15.05fc7db4.chunk.js",
|
||||||
"./static/js/15.cd2747c4.chunk.js.map": "./static/js/15.cd2747c4.chunk.js.map",
|
"./static/js/15.05fc7db4.chunk.js.map": "./static/js/15.05fc7db4.chunk.js.map",
|
||||||
"./static/js/16.e8e3aa00.chunk.js": "./static/js/16.e8e3aa00.chunk.js",
|
"./static/js/16.efbbac6a.chunk.js": "./static/js/16.efbbac6a.chunk.js",
|
||||||
"./static/js/16.e8e3aa00.chunk.js.map": "./static/js/16.e8e3aa00.chunk.js.map",
|
"./static/js/16.efbbac6a.chunk.js.map": "./static/js/16.efbbac6a.chunk.js.map",
|
||||||
"./static/js/17.db50ac9a.chunk.js": "./static/js/17.db50ac9a.chunk.js",
|
"./static/js/17.17bd092d.chunk.js": "./static/js/17.17bd092d.chunk.js",
|
||||||
"./static/js/17.db50ac9a.chunk.js.map": "./static/js/17.db50ac9a.chunk.js.map",
|
"./static/js/17.17bd092d.chunk.js.map": "./static/js/17.17bd092d.chunk.js.map",
|
||||||
"./static/js/18.e8b5b490.chunk.js": "./static/js/18.e8b5b490.chunk.js",
|
"./static/js/18.24d189e1.chunk.js": "./static/js/18.24d189e1.chunk.js",
|
||||||
"./static/js/18.e8b5b490.chunk.js.map": "./static/js/18.e8b5b490.chunk.js.map",
|
"./static/js/18.24d189e1.chunk.js.map": "./static/js/18.24d189e1.chunk.js.map",
|
||||||
"./static/js/19.5f9a9263.chunk.js": "./static/js/19.5f9a9263.chunk.js",
|
"./static/js/19.cadd2a48.chunk.js": "./static/js/19.cadd2a48.chunk.js",
|
||||||
"./static/js/19.5f9a9263.chunk.js.map": "./static/js/19.5f9a9263.chunk.js.map",
|
"./static/js/19.cadd2a48.chunk.js.map": "./static/js/19.cadd2a48.chunk.js.map",
|
||||||
"./static/js/2.48f59130.chunk.js": "./static/js/2.48f59130.chunk.js",
|
"./static/js/2.9a1bdcfa.chunk.js": "./static/js/2.9a1bdcfa.chunk.js",
|
||||||
"./static/js/2.48f59130.chunk.js.map": "./static/js/2.48f59130.chunk.js.map",
|
"./static/js/2.9a1bdcfa.chunk.js.map": "./static/js/2.9a1bdcfa.chunk.js.map",
|
||||||
"./static/js/20.6efcbe58.chunk.js": "./static/js/20.6efcbe58.chunk.js",
|
"./static/js/20.5086cbe2.chunk.js": "./static/js/20.5086cbe2.chunk.js",
|
||||||
"./static/js/20.6efcbe58.chunk.js.map": "./static/js/20.6efcbe58.chunk.js.map",
|
"./static/js/20.5086cbe2.chunk.js.map": "./static/js/20.5086cbe2.chunk.js.map",
|
||||||
"./static/js/21.6e5a22af.chunk.js": "./static/js/21.6e5a22af.chunk.js",
|
"./static/js/21.d3d939d5.chunk.js": "./static/js/21.d3d939d5.chunk.js",
|
||||||
"./static/js/21.6e5a22af.chunk.js.map": "./static/js/21.6e5a22af.chunk.js.map",
|
"./static/js/21.d3d939d5.chunk.js.map": "./static/js/21.d3d939d5.chunk.js.map",
|
||||||
"./static/js/22.7c073e45.chunk.js": "./static/js/22.7c073e45.chunk.js",
|
"./static/js/22.234575f5.chunk.js": "./static/js/22.234575f5.chunk.js",
|
||||||
"./static/js/22.7c073e45.chunk.js.map": "./static/js/22.7c073e45.chunk.js.map",
|
"./static/js/22.234575f5.chunk.js.map": "./static/js/22.234575f5.chunk.js.map",
|
||||||
"./static/js/23.0abe5b59.chunk.js": "./static/js/23.0abe5b59.chunk.js",
|
"./static/js/23.67ab77f0.chunk.js": "./static/js/23.67ab77f0.chunk.js",
|
||||||
"./static/js/23.0abe5b59.chunk.js.map": "./static/js/23.0abe5b59.chunk.js.map",
|
"./static/js/23.67ab77f0.chunk.js.map": "./static/js/23.67ab77f0.chunk.js.map",
|
||||||
"./static/js/24.e1553222.chunk.js": "./static/js/24.e1553222.chunk.js",
|
"./static/js/24.27d7be07.chunk.js": "./static/js/24.27d7be07.chunk.js",
|
||||||
"./static/js/24.e1553222.chunk.js.map": "./static/js/24.e1553222.chunk.js.map",
|
"./static/js/24.27d7be07.chunk.js.map": "./static/js/24.27d7be07.chunk.js.map",
|
||||||
"./static/js/25.7f05ced8.chunk.js": "./static/js/25.7f05ced8.chunk.js",
|
"./static/js/25.c8a915ae.chunk.js": "./static/js/25.c8a915ae.chunk.js",
|
||||||
"./static/js/25.7f05ced8.chunk.js.map": "./static/js/25.7f05ced8.chunk.js.map",
|
"./static/js/25.c8a915ae.chunk.js.map": "./static/js/25.c8a915ae.chunk.js.map",
|
||||||
"./static/js/26.00916fb9.chunk.js": "./static/js/26.00916fb9.chunk.js",
|
"./static/js/26.488c5233.chunk.js": "./static/js/26.488c5233.chunk.js",
|
||||||
"./static/js/26.00916fb9.chunk.js.map": "./static/js/26.00916fb9.chunk.js.map",
|
"./static/js/26.488c5233.chunk.js.map": "./static/js/26.488c5233.chunk.js.map",
|
||||||
"./static/js/27.85a886e8.chunk.js": "./static/js/27.85a886e8.chunk.js",
|
"./static/js/27.ba45f1d3.chunk.js": "./static/js/27.ba45f1d3.chunk.js",
|
||||||
"./static/js/27.85a886e8.chunk.js.map": "./static/js/27.85a886e8.chunk.js.map",
|
"./static/js/27.ba45f1d3.chunk.js.map": "./static/js/27.ba45f1d3.chunk.js.map",
|
||||||
"./static/js/28.db5cbded.chunk.js": "./static/js/28.db5cbded.chunk.js",
|
"./static/js/28.8071de5d.chunk.js": "./static/js/28.8071de5d.chunk.js",
|
||||||
"./static/js/28.db5cbded.chunk.js.map": "./static/js/28.db5cbded.chunk.js.map",
|
"./static/js/28.8071de5d.chunk.js.map": "./static/js/28.8071de5d.chunk.js.map",
|
||||||
"./static/js/29.95e5a009.chunk.js": "./static/js/29.95e5a009.chunk.js",
|
"./static/js/29.67275bf0.chunk.js": "./static/js/29.67275bf0.chunk.js",
|
||||||
"./static/js/29.95e5a009.chunk.js.map": "./static/js/29.95e5a009.chunk.js.map",
|
"./static/js/29.67275bf0.chunk.js.map": "./static/js/29.67275bf0.chunk.js.map",
|
||||||
"./static/js/3.a357162e.chunk.js": "./static/js/3.a357162e.chunk.js",
|
"./static/js/3.935bae8c.chunk.js": "./static/js/3.935bae8c.chunk.js",
|
||||||
"./static/js/3.a357162e.chunk.js.map": "./static/js/3.a357162e.chunk.js.map",
|
"./static/js/3.935bae8c.chunk.js.map": "./static/js/3.935bae8c.chunk.js.map",
|
||||||
"./static/js/30.3482c43d.chunk.js": "./static/js/30.3482c43d.chunk.js",
|
"./static/js/30.4964944f.chunk.js": "./static/js/30.4964944f.chunk.js",
|
||||||
"./static/js/30.3482c43d.chunk.js.map": "./static/js/30.3482c43d.chunk.js.map",
|
"./static/js/30.4964944f.chunk.js.map": "./static/js/30.4964944f.chunk.js.map",
|
||||||
"./static/js/31.3edb9173.chunk.js": "./static/js/31.3edb9173.chunk.js",
|
"./static/js/31.5a1072f1.chunk.js": "./static/js/31.5a1072f1.chunk.js",
|
||||||
"./static/js/31.3edb9173.chunk.js.map": "./static/js/31.3edb9173.chunk.js.map",
|
"./static/js/31.5a1072f1.chunk.js.map": "./static/js/31.5a1072f1.chunk.js.map",
|
||||||
"./static/js/32.23fc5ec4.chunk.js": "./static/js/32.23fc5ec4.chunk.js",
|
"./static/js/32.2ff1fc95.chunk.js": "./static/js/32.2ff1fc95.chunk.js",
|
||||||
"./static/js/32.23fc5ec4.chunk.js.map": "./static/js/32.23fc5ec4.chunk.js.map",
|
"./static/js/32.2ff1fc95.chunk.js.map": "./static/js/32.2ff1fc95.chunk.js.map",
|
||||||
"./static/js/4.a72da972.chunk.js": "./static/js/4.a72da972.chunk.js",
|
"./static/js/4.017bf48d.chunk.js": "./static/js/4.017bf48d.chunk.js",
|
||||||
"./static/js/4.a72da972.chunk.js.map": "./static/js/4.a72da972.chunk.js.map",
|
"./static/js/4.017bf48d.chunk.js.map": "./static/js/4.017bf48d.chunk.js.map",
|
||||||
"./static/js/5.1853fe23.chunk.js": "./static/js/5.1853fe23.chunk.js",
|
"./static/js/5.27b42764.chunk.js": "./static/js/5.27b42764.chunk.js",
|
||||||
"./static/js/5.1853fe23.chunk.js.map": "./static/js/5.1853fe23.chunk.js.map",
|
"./static/js/5.27b42764.chunk.js.map": "./static/js/5.27b42764.chunk.js.map",
|
||||||
"./static/js/6.070d1eab.chunk.js": "./static/js/6.070d1eab.chunk.js",
|
"./static/js/6.1d80a66b.chunk.js": "./static/js/6.1d80a66b.chunk.js",
|
||||||
"./static/js/6.070d1eab.chunk.js.map": "./static/js/6.070d1eab.chunk.js.map",
|
"./static/js/6.1d80a66b.chunk.js.map": "./static/js/6.1d80a66b.chunk.js.map",
|
||||||
"./static/js/7.1ad7321f.chunk.js": "./static/js/7.1ad7321f.chunk.js",
|
"./static/js/7.03d1beb1.chunk.js": "./static/js/7.03d1beb1.chunk.js",
|
||||||
"./static/js/7.1ad7321f.chunk.js.map": "./static/js/7.1ad7321f.chunk.js.map",
|
"./static/js/7.03d1beb1.chunk.js.map": "./static/js/7.03d1beb1.chunk.js.map",
|
||||||
"./static/js/8.d5642b7b.chunk.js": "./static/js/8.d5642b7b.chunk.js",
|
"./static/js/8.ea688812.chunk.js": "./static/js/8.ea688812.chunk.js",
|
||||||
"./static/js/8.d5642b7b.chunk.js.map": "./static/js/8.d5642b7b.chunk.js.map",
|
"./static/js/8.ea688812.chunk.js.map": "./static/js/8.ea688812.chunk.js.map",
|
||||||
"./static/js/9.c6b81c3d.chunk.js": "./static/js/9.c6b81c3d.chunk.js",
|
"./static/js/9.2971266e.chunk.js": "./static/js/9.2971266e.chunk.js",
|
||||||
"./static/js/9.c6b81c3d.chunk.js.map": "./static/js/9.c6b81c3d.chunk.js.map",
|
"./static/js/9.2971266e.chunk.js.map": "./static/js/9.2971266e.chunk.js.map",
|
||||||
"main.css": "./static/css/main.3274c43b.css",
|
"main.css": "./static/css/main.80b6ec5e.css",
|
||||||
"main.css.map": "./static/css/main.3274c43b.css.map",
|
"main.css.map": "./static/css/main.80b6ec5e.css.map",
|
||||||
"main.js": "./static/js/main.9f01900e.js",
|
"main.js": "./static/js/main.b4ee5e8a.js",
|
||||||
"main.js.map": "./static/js/main.9f01900e.js.map",
|
"main.js.map": "./static/js/main.b4ee5e8a.js.map",
|
||||||
"static/media/ERASBD.ttf": "static/media/ERASBD.d5213044.ttf",
|
"static\\media\\ERASBD.ttf": "static/media/ERASBD.d5213044.ttf",
|
||||||
"static/media/background1.png": "static/media/background1.a34df396.png",
|
"static\\media\\background1.png": "static/media/background1.a34df396.png",
|
||||||
"static/media/background2.png": "static/media/background2.22ee659e.png",
|
"static\\media\\background2.png": "static/media/background2.22ee659e.png",
|
||||||
"static/media/courses.jpg": "static/media/courses.7b27495b.jpg",
|
"static\\media\\courses.jpg": "static/media/courses.7b27495b.jpg",
|
||||||
"static/media/group.png": "static/media/group.2f91e9cd.png",
|
"static\\media\\group.png": "static/media/group.2f91e9cd.png",
|
||||||
"static/media/introduceback.jpg": "static/media/introduceback.3d75d3db.jpg",
|
"static\\media\\introduceback.jpg": "static/media/introduceback.3d75d3db.jpg",
|
||||||
"static/media/logo.svg": "static/media/logo.5d5d9eef.svg",
|
"static\\media\\logo.svg": "static/media/logo.ee7cd8ed.svg",
|
||||||
"static/media/match_ad.jpg": "static/media/match_ad.4e957369.jpg",
|
"static\\media\\match_ad.jpg": "static/media/match_ad.4e957369.jpg",
|
||||||
"static/media/message.svg": "static/media/message.c4f86b97.svg",
|
"static\\media\\message.svg": "static/media/message.a7af2a8f.svg",
|
||||||
"static/media/messagegrey.svg": "static/media/messagegrey.31dd74f4.svg",
|
"static\\media\\messagegrey.svg": "static/media/messagegrey.8c1dff55.svg",
|
||||||
"static/media/nodata.png": "static/media/nodata.cde5b659.png",
|
"static\\media\\nodata.png": "static/media/nodata.cde5b659.png",
|
||||||
"static/media/passall.png": "static/media/passall.46817e26.png",
|
"static\\media\\passall.png": "static/media/passall.46817e26.png",
|
||||||
"static/media/passpart.png": "static/media/passpart.4aaf3e6b.png",
|
"static\\media\\passpart.png": "static/media/passpart.4aaf3e6b.png",
|
||||||
"static/media/rc-tree.png": "static/media/rc-tree.776c7fe6.png",
|
"static\\media\\rc-tree.png": "static/media/rc-tree.776c7fe6.png",
|
||||||
"static/media/search.svg": "static/media/search.0e1dcc19.svg",
|
"static\\media\\search.svg": "static/media/search.0e1dcc19.svg",
|
||||||
"static/media/vedio.png": "static/media/vedio.6a98b4f1.png"
|
"static\\media\\vedio.png": "static/media/vedio.6a98b4f1.png"
|
||||||
}
|
}
|
@ -1 +1 @@
|
|||||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/css/css_min_all.css"><link rel="stylesheet" href="http://testbdweb.educoder.net/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.3274c43b.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/js/js_min_all.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/js/create_kindeditor.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.9f01900e.js"></script></body></html>
|
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/css/css_min_all.css"><link rel="stylesheet" href="http://testbdweb.educoder.net/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.80b6ec5e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/js/js_min_all.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/js/create_kindeditor.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.b4ee5e8a.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue