dev_SaaS
hjm 6 years ago
commit 3b8750dd2b

4
.gitignore vendored

@ -46,3 +46,7 @@ config/oneapm.yml
/public/npm-debug.log /public/npm-debug.log
/vendor /vendor
/workspace/* /workspace/*
.ruby-gemset
.rvmrc

@ -60,7 +60,12 @@ class EcCourseSupportsController < ApplicationController
course_data << { name: name, top_relation: cs.top_relation, weigths: cs.weigths} course_data << { name: name, top_relation: cs.top_relation, weigths: cs.weigths}
end end
gs.ec_course_supports.count > max_support_count && max_support_count = gs.ec_course_supports.count gs.ec_course_supports.count > max_support_count && max_support_count = gs.ec_course_supports.count
course_support_data << {sequence_num: sequence_num, ec_graduation_subitem_id: gs.id, course_data: course_data, num_total: gs.ec_course_supports.count, weights_total: weigths_sum} course_support_data << {sequence_num: sequence_num,
sequence_title: gs.content,
ec_graduation_subitem_id: gs.id,
course_data: course_data,
num_total: gs.ec_course_supports.count,
weights_total: weigths_sum}
end end
end end
render :json => {ec_year_id: @year.id, render :json => {ec_year_id: @year.id,

@ -630,7 +630,7 @@ class EcCoursesController < ApplicationController
# 遍历学生成绩统计数据 # 遍历学生成绩统计数据
student_scores.each do |sc| student_scores.each do |sc|
sub_ecss = EcCourseStudentScore.where(:ec_course_id => @ec_course.id, :ec_year_student_id => sc.ec_year_student_id).first sub_ecss = EcCourseStudentScore.where(:ec_course_id => @ec_course.id, :ec_year_student_id => sc.ec_year_student_id).first
sub_score = base_score == 0 ? 0 : ((sc.try(:score).to_f/base_score) * percentage).round(3) sub_score = base_score == 0 || sc.try(:score).nil? ? 0 : ((sc.try(:score).to_f/base_score) * percentage).round(3)
if sub_ecss if sub_ecss
ess_target = sub_ecss.ec_student_score_targets.where(:ec_course_target_id => target.id, ess_target = sub_ecss.ec_student_score_targets.where(:ec_course_target_id => target.id,

@ -1,6 +1,16 @@
#encoding=utf-8
require 'net/http' require 'net/http'
require 'digest'
class EcloudController < ApplicationController class EcloudController < ApplicationController
skip_before_filter :verify_authenticity_token
before_filter :user_setup
before_filter :require_login, only: [:authorize]
skip_before_filter :verify_authenticity_token, only: [:ps_new, :ps_edit]
def index def index
render file: 'public/react-oschina/build/index.html', :layout => false render file: 'public/react-oschina/build/index.html', :layout => false
@ -9,38 +19,93 @@ class EcloudController < ApplicationController
def trustie_login def trustie_login
end end
CLIENT_ID = 'e5da9855f89bc724a335d100cb63cf02a03a592bd3151bbc84acf7b2e222ddb8' CLIENT_ID = '1022'
CLIENT_SECRET = '4f2f291fac1d3dae338c18a3e3544814be5a1c4ade9e72d62f45ceab914c89f5' CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668'
ROOT_URl = 'http://localhost:3000' ROOT_URl = 'http://localhost:3000'
SERVER_URL = "https://221.176.54.92:9081/restful/services/"
def oschina_login
# 根据session看看有没有存access_token去刷新下。
# 1. 如果过期,则跳转
# 2. 未过期,直接用
redirect_to "https://gitee.com/oauth/authorize?client_id=#{CLIENT_ID}&redirect_uri=#{ROOT_URl}/oschina/login_cb&response_type=code"
## 签名
def sign(timestamp)
Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}")
end end
def open_bs
Eclouduser.create(ecloudeuser_params) # 企业开通
# ecordercode 唯一标志一个企业的订购关系
def bs_new
begin
ecloud = Ecloud.create!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'],
custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'],
userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'],
email: params['email'], productcode: params['productcode'], begintime: params['begintime'],
endtime: params['endtime'])
EcloudService.create(opttype: params['services']['opttype'], code: params['services']['code'], begintime: params['services']['begintime'],
endtime: params['services']['endtime'], ecloud_id: ecloud.try(:id))
render :json => {result: true, errmsg: ""}
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
end
end end
def destroy_bs # 企业更新
def bs_update
ecloud = Ecloud.where(custid: params['custid']).first
ecloud.update_attribute(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'],
operatime: params['operatime'], effecttime: params['effecttime'])
ecloud.ecloud_services.update_attributes(packagecode: params['services']['packagecode'], bossorderid: params['services']['bossorderid'])
end end
# 用户业务开通接口
def ps_new
begin
logger.info("11111######params")
ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
if ecloud_user.present?
render :json => {code: 501, msg: "你已开通过该业务"}
else
EcloudUser.create!(custid: params['custid'], opttype: params['users']['opttype'], userid: params['users']['userid'],
username: params['users']['username'], useralias: params['users']['useralias'],
mobile: params['users']['mobile'], email: params['users']['email'], begintime: params['users']['begintime'].to_s,
endtime: params['users']['endtime'].to_s)
render :json => {success: true, errmsg: ""}
end
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
end
end
# 用户业务变更、销毁接口
def ps_update
begin
ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
if ecloud_user.present?
ecloud_user.update_attributes(opttype: params['users']['opttype'])
render :json => {code: 501, msg: "你已开通过该业务"}
else
render :json => {code: 404, errmsg: ""}
end
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
end
end
def ecloud_login_callback def ecloud_login_callback
#获取code #获取code
# logger.info "oauth2 login_callback: #{params}"
# url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" +
logger.debug params
url = "https://221.176.54.92:9081/restful/services/oauth2/authorization?grant_type=authorization_code" +
"&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}" "&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}"
# url = "https://gitee.com/oauth/token?grant_type=authorization_code"+
# "&code=#{params[:code]}&client_id=#{CLIENT_ID}&redirect_uri=#{ROOT_URl}/oschina/login_cb&client_secret=#{CLIENT_SECRET}"
res = post(url) res = post(url)
logger.debug res logger.info "oauth2 authorization resp: #{res}"
body = decode(res) body = decode(res)
#{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088} #{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088}
@ -50,17 +115,18 @@ class EcloudController < ApplicationController
#获取此用户信息 #获取此用户信息
# res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}") # res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}")
res = get("https://221.176.54.92:9081/restful/services/user/info?access_token=#{body["access_token"]}&userid=%7bUSERID%7d") res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}")
logger.debug res logger.info "oauth2 get user info: #{res}"
info = decode(res)
user = User.find_by_oschina_user_id(info["id"]) # 同步用户
unless user # info = decode(res)
user = User.create_with_oschina!(info) #
end # user = User.find_by_oschina_user_id(info["id"])
# unless user
@current_user = user # user = User.create_with_oschina!(info)
# end
#
# @current_user = user
render :index render :index
end end
@ -101,4 +167,8 @@ class EcloudController < ApplicationController
end end
end end
private
def ecloudeuser_params
{}
end
end end

@ -219,10 +219,10 @@ class GamesController < ApplicationController
@had_passed_testsests_public_count = had_test.blank? ? 0 : had_test.select{|had_test| had_test.result == true && had_test.is_public == true}.count @had_passed_testsests_public_count = had_test.blank? ? 0 : had_test.select{|had_test| had_test.result == true && had_test.is_public == true}.count
@mirror_name = @myshixun.mirror_name @mirror_name = @myshixun.mirror_name
@final_score = ((@shixun.status <= 1) ? 0 : @game.final_score.to_i) @final_score = ((@shixun.status <= 1) ? 0 : @game.final_score.to_i)
if @myshixun.shixun.status <= 1 || (@game.final_score != 0 && @game.answer_open?) if @myshixun.shixun.status <= 1 || (@game.final_score != 0 && @game.answer_open > 0)
@gold = 0 @gold = 0
else else
if @game.answer_open? && @game.final_score ==0 if @game.answer_open > 0 && @game.final_score ==0
@gold = -@game_challenge.score.to_i @gold = -@game_challenge.score.to_i
else else
@gold = @game.final_score.to_i @gold = @game.final_score.to_i

@ -0,0 +1,6 @@
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
has_one :ecloud_users
has_one :ecloud_services
end

@ -0,0 +1,3 @@
class EcloudService < ActiveRecord::Base
attr_accessible :begintime, :code, :endtime, :opttype
end

@ -0,0 +1,3 @@
class EcloudUser < ActiveRecord::Base
attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid
end

@ -0,0 +1,3 @@
class EcloudUser < ActiveRecord::Base
attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid
end

@ -1,7 +0,0 @@
class Eclouduser < ActiveRecord::Base
attr_accessible :applyno, :begintime, :bossorderid, :code, :custcod, :custid, :custname, :custtype, :ecordercoder, :email,
:endtime, :key, :moblile, :opttype, :productcode, :registersource, :trial,
:useralias, :userid, :username, :productparas, :services
serialize :productparas, Hash
serialize :services, Hash
end

@ -43,7 +43,7 @@ class GamesService
# 高性能取上一关、下一关 # 高性能取上一关、下一关
prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position) prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position)
next_game = if current_user.is_certification_teacher || shixun_manager(shixun, current_user) || game.status == 2 next_game = if current_user.is_certification_teacher || shixun_manager(shixun, current_user) || game.status || shixun.task_pass
Game.next_game(shixun.id, game.myshixun_id, game_challenge.position).try(:identifier) Game.next_game(shixun.id, game.myshixun_id, game_challenge.position).try(:identifier)
end end
@ -697,7 +697,7 @@ class GamesService
if had_passed && !game.had_passed? if had_passed && !game.had_passed?
game.update_attributes(:status => 2, :end_time => Time.now) game.update_attributes(:status => 2, :end_time => Time.now)
# TPM实训已发布并且没有查看答案 # TPM实训已发布并且没有查看答案
if shixun.is_published? && !game.answer_open if shixun.is_published? && game.answer_open == 0
# 查看答案的时候处理final_scor和扣分记录 # 查看答案的时候处理final_scor和扣分记录
experience = score experience = score
reward_grade(myshixun.owner, game.id, 'Game', score) reward_grade(myshixun.owner, game.id, 'Game', score)
@ -930,7 +930,8 @@ class GamesService
end end
#end #end
myshixun_job = Base64.urlsafe_encode64("myshixun_#{myshixun.id}") myshixun_job = Base64.urlsafe_encode64("myshixun_#{myshixun.id}")
StudentWork.where(:myshixun_id => myshixun.id).update_all(:myshixun_id => nil, :work_status => 0) StudentWork.where(:myshixun_id => myshixun.id).update_all(:myshixun_id => 0, :work_status => 0, :work_score => nil, :final_score => nil,
:cost_time => 0, :update_time => nil, :compelete_status => 0, :commit_time => nil)
# myshixun.destroy # myshixun.destroy
myshixun.delete myshixun.delete
# 主从复制出现脏读的情况 # 主从复制出现脏读的情况

@ -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.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.2958c8ba.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.c95e49c6.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.5af27f0b.js"></script></body></html>

@ -49,7 +49,7 @@
<!--</span>--> <!--</span>-->
</span> </span>
<span class="column-2 fr edu-txt-center"> <span class="column-2 fr edu-txt-center">
<% if @major_manager && !@major_school.template_major %> <% if @major_manager && !@major_school.template_major || User.current.admin? %>
<a href="javascript:void(0);" onclick="delete_confirm_box_3('<%= ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school) %>','您确定要删除吗?')" class="mr15 color-grey-c">删除</a> <a href="javascript:void(0);" onclick="delete_confirm_box_3('<%= ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school) %>','您确定要删除吗?')" class="mr15 color-grey-c">删除</a>
<% end %> <% end %>
<%#= link_to '删除', ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school), method: :delete, :class => "mr15 color-grey-c", data: { confirm: '您确定要删除吗' } %> <%#= link_to '删除', ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school), method: :delete, :class => "mr15 color-grey-c", data: { confirm: '您确定要删除吗' } %>

@ -46,13 +46,16 @@
</label> </label>
</span> </span>
<span class="column-11 edu-txt-center"> <span class="column-11 edu-txt-center">
<label class="color-red-dd">
<% if course.ec_course_targets.count == 0 %> <% if course.ec_course_targets.count == 0 %>
-- --
<% else %> <% else %>
<%= course.complete_target_count == course.ec_course_targets.count ? "达成" : "未达成" %> <% if course.complete_target_count == course.ec_course_targets.count %>
<label class="color-green">达成</label>
<% else %>
<label class="color-red-dd">未达成</label>
<% end %>
<%#= course.complete_target_count == course.ec_course_targets.count ? "达成" : "未达成" %>
<% end %> <% end %>
</label>
</span> </span>
<span class="column-10 fl edu-txt-left"> <span class="column-10 fl edu-txt-left">
<% if course_manager || @template_major %> <% if course_manager || @template_major %>

@ -9,7 +9,7 @@
<li class="clearfix"> <li class="clearfix">
<span class="column-No">0</span> <span class="column-No">0</span>
<span class="column-2">000000</span> <span class="column-2">000000</span>
<span class="column-3 task-hide"><a href="javascript:void(0)"><%= @template_major.name %>(示例)</a></span> <span class="column-3 task-hide"><a href="<%= ec_major_school_path(@template_major) %>"><%= @template_major.name %>(示例)</a></span>
<span class="column-5"> <span class="column-5">
<a href="<%= ec_major_school_path(@template_major) %>" class="color-blue" target="_blank"><%= User.current.admin? ? "配置" : "查看" %></a> <a href="<%= ec_major_school_path(@template_major) %>" class="color-blue" target="_blank"><%= User.current.admin? ? "配置" : "查看" %></a>
</span> </span>
@ -19,7 +19,7 @@
<li class="clearfix" id="major_list_<%= major_school.id %>"> <li class="clearfix" id="major_list_<%= major_school.id %>">
<span class="column-No major_index"><%= index + 1 %></span> <span class="column-No major_index"><%= index + 1 %></span>
<span class="column-2"><%= major_school.code %></span> <span class="column-2"><%= major_school.code %></span>
<span class="column-3 task-hide"><a href="javascript:void(0)"><%= major_school.name %></a></span> <span class="column-3 task-hide"><a href="<%= ec_major_school_path(major_school) %>"><%= major_school.name %></a></span>
<span class="column-4"> <span class="column-4">
<% if major_manager %> <% if major_manager %>
<a href="javascript:void(0)" data-major-id="<%= major_school.id %>" class="color-blue mr5 mt-3 fl addMajorManager"><i class="iconfont icon-tianjiafangda"></i></a> <a href="javascript:void(0)" data-major-id="<%= major_school.id %>" class="color-blue mr5 mt-3 fl addMajorManager"><i class="iconfont icon-tianjiafangda"></i></a>

@ -0,0 +1,9 @@
Gitlab.configure do |config|
# config.endpoint = 'http://192.168.41.130:3000/trustie/api/v3' # API endpoint URL, default: ENV['GITLAB_API_ENDPOINT']
# config.private_token = 'cK15gUDwvt8EEkzwQ_63' # user's private token, default: ENV['GITLAB_API_PRIVATE_TOKEN']
config.endpoint = 'http://testbdgit.trustie.net/api/v3' # API endpoint URL, default: ENV['GITLAB_API_ENDPOINT']
config.private_token = 's89kqsMPtF8YLZSLyVmF' # user's private token, default: ENV['GITLAB_API_PRIVATE_TOKEN']
# Optional
# config.user_agent = 'Custom User Agent' # user agent, default: 'Gitlab Ruby Gem [version]'
# config.sudo = 'user' # username for sudo mode, default: nil
end

@ -33,7 +33,11 @@ RedmineApp::Application.routes.draw do ## oauth相关
match 'oauth/cb', to: 'oauth#test_callback', :via => :get match 'oauth/cb', to: 'oauth#test_callback', :via => :get
match 'oauth/userinfo', to: 'oauth#get_userinfo', :via => :get match 'oauth/userinfo', to: 'oauth#get_userinfo', :via => :get
match 'ecloud/ecloud_login_callback', to: 'ecloud#ecloud_login_callback', :via => :get match 'ecloud/ecloud_login', to: 'ecloud#ecloud_login_callback', :via => :get
match 'ecloud/bs_new', to: 'ecloud#bs_new', :via => :post
match 'ecloud/bs_edit', to: 'ecloud#bs_edit', :via => :post
match 'ecloud/ps_new', to: 'ecloud#ps_new', :via => :post
match 'ecloud/ps_edit', to: 'ecloud#ps_edit', :via => :post
resources :ec_course_evaluations do resources :ec_course_evaluations do

@ -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

@ -4,23 +4,23 @@ class CreateEcloudusers < ActiveRecord::Migration
t.string :applyno t.string :applyno
t.string :ecordercoder t.string :ecordercoder
t.string :string t.string :string
t.int :opttype t.integer :opttype
t.boolean :trial t.boolean :trial
t.string :bossorderid t.string :bossorderid
t.int :custid t.integer :custid
t.string :custcod t.string :custcod
t.string :string t.string :string
t.int :custtype t.integer :custtype
t.int :registersource t.integer :registersource
t.string :custname t.string :custname
t.int :userid t.integer :userid
t.string :username t.string :username
t.string :useralias t.string :useralias
t.string :moblile t.string :moblile
t.string :email t.string :email
t.string :productcode t.string :productcode
t.long :begintime t.datetime :begintime
t.long :endtime t.datetime :endtime
t.string :productparas t.string :productparas
t.string :services t.string :services

@ -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

@ -1,88 +1,88 @@
{ {
"./static/js/0.f26528b1.chunk.js": "./static/js/0.f26528b1.chunk.js", "./static/js/0.6b9d3c60.chunk.js": "./static/js/0.6b9d3c60.chunk.js",
"./static/js/0.f26528b1.chunk.js.map": "./static/js/0.f26528b1.chunk.js.map", "./static/js/0.6b9d3c60.chunk.js.map": "./static/js/0.6b9d3c60.chunk.js.map",
"./static/js/1.cc33d6fc.chunk.js": "./static/js/1.cc33d6fc.chunk.js", "./static/js/1.5f152c98.chunk.js": "./static/js/1.5f152c98.chunk.js",
"./static/js/1.cc33d6fc.chunk.js.map": "./static/js/1.cc33d6fc.chunk.js.map", "./static/js/1.5f152c98.chunk.js.map": "./static/js/1.5f152c98.chunk.js.map",
"./static/js/10.ab08ae3d.chunk.js": "./static/js/10.ab08ae3d.chunk.js", "./static/js/10.b8deb1cd.chunk.js": "./static/js/10.b8deb1cd.chunk.js",
"./static/js/10.ab08ae3d.chunk.js.map": "./static/js/10.ab08ae3d.chunk.js.map", "./static/js/10.b8deb1cd.chunk.js.map": "./static/js/10.b8deb1cd.chunk.js.map",
"./static/js/11.c1a78f08.chunk.js": "./static/js/11.c1a78f08.chunk.js", "./static/js/11.03d0c22e.chunk.js": "./static/js/11.03d0c22e.chunk.js",
"./static/js/11.c1a78f08.chunk.js.map": "./static/js/11.c1a78f08.chunk.js.map", "./static/js/11.03d0c22e.chunk.js.map": "./static/js/11.03d0c22e.chunk.js.map",
"./static/js/12.fedd75c3.chunk.js": "./static/js/12.fedd75c3.chunk.js", "./static/js/12.63e3fcd0.chunk.js": "./static/js/12.63e3fcd0.chunk.js",
"./static/js/12.fedd75c3.chunk.js.map": "./static/js/12.fedd75c3.chunk.js.map", "./static/js/12.63e3fcd0.chunk.js.map": "./static/js/12.63e3fcd0.chunk.js.map",
"./static/js/13.a7e92c4a.chunk.js": "./static/js/13.a7e92c4a.chunk.js", "./static/js/13.cbef4214.chunk.js": "./static/js/13.cbef4214.chunk.js",
"./static/js/13.a7e92c4a.chunk.js.map": "./static/js/13.a7e92c4a.chunk.js.map", "./static/js/13.cbef4214.chunk.js.map": "./static/js/13.cbef4214.chunk.js.map",
"./static/js/14.97e6fd74.chunk.js": "./static/js/14.97e6fd74.chunk.js", "./static/js/14.7cd4e73b.chunk.js": "./static/js/14.7cd4e73b.chunk.js",
"./static/js/14.97e6fd74.chunk.js.map": "./static/js/14.97e6fd74.chunk.js.map", "./static/js/14.7cd4e73b.chunk.js.map": "./static/js/14.7cd4e73b.chunk.js.map",
"./static/js/15.05fc7db4.chunk.js": "./static/js/15.05fc7db4.chunk.js", "./static/js/15.0dcec662.chunk.js": "./static/js/15.0dcec662.chunk.js",
"./static/js/15.05fc7db4.chunk.js.map": "./static/js/15.05fc7db4.chunk.js.map", "./static/js/15.0dcec662.chunk.js.map": "./static/js/15.0dcec662.chunk.js.map",
"./static/js/16.efbbac6a.chunk.js": "./static/js/16.efbbac6a.chunk.js", "./static/js/16.e8e3aa00.chunk.js": "./static/js/16.e8e3aa00.chunk.js",
"./static/js/16.efbbac6a.chunk.js.map": "./static/js/16.efbbac6a.chunk.js.map", "./static/js/16.e8e3aa00.chunk.js.map": "./static/js/16.e8e3aa00.chunk.js.map",
"./static/js/17.6e20f18f.chunk.js": "./static/js/17.6e20f18f.chunk.js", "./static/js/17.ce02f90b.chunk.js": "./static/js/17.ce02f90b.chunk.js",
"./static/js/17.6e20f18f.chunk.js.map": "./static/js/17.6e20f18f.chunk.js.map", "./static/js/17.ce02f90b.chunk.js.map": "./static/js/17.ce02f90b.chunk.js.map",
"./static/js/18.ee48530e.chunk.js": "./static/js/18.ee48530e.chunk.js", "./static/js/18.a116acb1.chunk.js": "./static/js/18.a116acb1.chunk.js",
"./static/js/18.ee48530e.chunk.js.map": "./static/js/18.ee48530e.chunk.js.map", "./static/js/18.a116acb1.chunk.js.map": "./static/js/18.a116acb1.chunk.js.map",
"./static/js/19.cadd2a48.chunk.js": "./static/js/19.cadd2a48.chunk.js", "./static/js/19.5f9a9263.chunk.js": "./static/js/19.5f9a9263.chunk.js",
"./static/js/19.cadd2a48.chunk.js.map": "./static/js/19.cadd2a48.chunk.js.map", "./static/js/19.5f9a9263.chunk.js.map": "./static/js/19.5f9a9263.chunk.js.map",
"./static/js/2.9a1bdcfa.chunk.js": "./static/js/2.9a1bdcfa.chunk.js", "./static/js/2.eb0d1091.chunk.js": "./static/js/2.eb0d1091.chunk.js",
"./static/js/2.9a1bdcfa.chunk.js.map": "./static/js/2.9a1bdcfa.chunk.js.map", "./static/js/2.eb0d1091.chunk.js.map": "./static/js/2.eb0d1091.chunk.js.map",
"./static/js/20.5086cbe2.chunk.js": "./static/js/20.5086cbe2.chunk.js", "./static/js/20.6efcbe58.chunk.js": "./static/js/20.6efcbe58.chunk.js",
"./static/js/20.5086cbe2.chunk.js.map": "./static/js/20.5086cbe2.chunk.js.map", "./static/js/20.6efcbe58.chunk.js.map": "./static/js/20.6efcbe58.chunk.js.map",
"./static/js/21.d3d939d5.chunk.js": "./static/js/21.d3d939d5.chunk.js", "./static/js/21.6e5a22af.chunk.js": "./static/js/21.6e5a22af.chunk.js",
"./static/js/21.d3d939d5.chunk.js.map": "./static/js/21.d3d939d5.chunk.js.map", "./static/js/21.6e5a22af.chunk.js.map": "./static/js/21.6e5a22af.chunk.js.map",
"./static/js/22.234575f5.chunk.js": "./static/js/22.234575f5.chunk.js", "./static/js/22.7c073e45.chunk.js": "./static/js/22.7c073e45.chunk.js",
"./static/js/22.234575f5.chunk.js.map": "./static/js/22.234575f5.chunk.js.map", "./static/js/22.7c073e45.chunk.js.map": "./static/js/22.7c073e45.chunk.js.map",
"./static/js/23.67ab77f0.chunk.js": "./static/js/23.67ab77f0.chunk.js", "./static/js/23.0abe5b59.chunk.js": "./static/js/23.0abe5b59.chunk.js",
"./static/js/23.67ab77f0.chunk.js.map": "./static/js/23.67ab77f0.chunk.js.map", "./static/js/23.0abe5b59.chunk.js.map": "./static/js/23.0abe5b59.chunk.js.map",
"./static/js/24.27d7be07.chunk.js": "./static/js/24.27d7be07.chunk.js", "./static/js/24.e1553222.chunk.js": "./static/js/24.e1553222.chunk.js",
"./static/js/24.27d7be07.chunk.js.map": "./static/js/24.27d7be07.chunk.js.map", "./static/js/24.e1553222.chunk.js.map": "./static/js/24.e1553222.chunk.js.map",
"./static/js/25.c8a915ae.chunk.js": "./static/js/25.c8a915ae.chunk.js", "./static/js/25.7f05ced8.chunk.js": "./static/js/25.7f05ced8.chunk.js",
"./static/js/25.c8a915ae.chunk.js.map": "./static/js/25.c8a915ae.chunk.js.map", "./static/js/25.7f05ced8.chunk.js.map": "./static/js/25.7f05ced8.chunk.js.map",
"./static/js/26.488c5233.chunk.js": "./static/js/26.488c5233.chunk.js", "./static/js/26.e3927d38.chunk.js": "./static/js/26.e3927d38.chunk.js",
"./static/js/26.488c5233.chunk.js.map": "./static/js/26.488c5233.chunk.js.map", "./static/js/26.e3927d38.chunk.js.map": "./static/js/26.e3927d38.chunk.js.map",
"./static/js/27.ba45f1d3.chunk.js": "./static/js/27.ba45f1d3.chunk.js", "./static/js/27.d2f21a4d.chunk.js": "./static/js/27.d2f21a4d.chunk.js",
"./static/js/27.ba45f1d3.chunk.js.map": "./static/js/27.ba45f1d3.chunk.js.map", "./static/js/27.d2f21a4d.chunk.js.map": "./static/js/27.d2f21a4d.chunk.js.map",
"./static/js/28.8071de5d.chunk.js": "./static/js/28.8071de5d.chunk.js", "./static/js/28.db5cbded.chunk.js": "./static/js/28.db5cbded.chunk.js",
"./static/js/28.8071de5d.chunk.js.map": "./static/js/28.8071de5d.chunk.js.map", "./static/js/28.db5cbded.chunk.js.map": "./static/js/28.db5cbded.chunk.js.map",
"./static/js/29.67275bf0.chunk.js": "./static/js/29.67275bf0.chunk.js", "./static/js/29.95e5a009.chunk.js": "./static/js/29.95e5a009.chunk.js",
"./static/js/29.67275bf0.chunk.js.map": "./static/js/29.67275bf0.chunk.js.map", "./static/js/29.95e5a009.chunk.js.map": "./static/js/29.95e5a009.chunk.js.map",
"./static/js/3.935bae8c.chunk.js": "./static/js/3.935bae8c.chunk.js", "./static/js/3.123eae7e.chunk.js": "./static/js/3.123eae7e.chunk.js",
"./static/js/3.935bae8c.chunk.js.map": "./static/js/3.935bae8c.chunk.js.map", "./static/js/3.123eae7e.chunk.js.map": "./static/js/3.123eae7e.chunk.js.map",
"./static/js/30.4964944f.chunk.js": "./static/js/30.4964944f.chunk.js", "./static/js/30.92e2f4a6.chunk.js": "./static/js/30.92e2f4a6.chunk.js",
"./static/js/30.4964944f.chunk.js.map": "./static/js/30.4964944f.chunk.js.map", "./static/js/30.92e2f4a6.chunk.js.map": "./static/js/30.92e2f4a6.chunk.js.map",
"./static/js/31.5a1072f1.chunk.js": "./static/js/31.5a1072f1.chunk.js", "./static/js/31.3edb9173.chunk.js": "./static/js/31.3edb9173.chunk.js",
"./static/js/31.5a1072f1.chunk.js.map": "./static/js/31.5a1072f1.chunk.js.map", "./static/js/31.3edb9173.chunk.js.map": "./static/js/31.3edb9173.chunk.js.map",
"./static/js/32.2ff1fc95.chunk.js": "./static/js/32.2ff1fc95.chunk.js", "./static/js/32.23fc5ec4.chunk.js": "./static/js/32.23fc5ec4.chunk.js",
"./static/js/32.2ff1fc95.chunk.js.map": "./static/js/32.2ff1fc95.chunk.js.map", "./static/js/32.23fc5ec4.chunk.js.map": "./static/js/32.23fc5ec4.chunk.js.map",
"./static/js/4.017bf48d.chunk.js": "./static/js/4.017bf48d.chunk.js", "./static/js/4.a563b706.chunk.js": "./static/js/4.a563b706.chunk.js",
"./static/js/4.017bf48d.chunk.js.map": "./static/js/4.017bf48d.chunk.js.map", "./static/js/4.a563b706.chunk.js.map": "./static/js/4.a563b706.chunk.js.map",
"./static/js/5.27b42764.chunk.js": "./static/js/5.27b42764.chunk.js", "./static/js/5.459a49ba.chunk.js": "./static/js/5.459a49ba.chunk.js",
"./static/js/5.27b42764.chunk.js.map": "./static/js/5.27b42764.chunk.js.map", "./static/js/5.459a49ba.chunk.js.map": "./static/js/5.459a49ba.chunk.js.map",
"./static/js/6.1d80a66b.chunk.js": "./static/js/6.1d80a66b.chunk.js", "./static/js/6.83516b55.chunk.js": "./static/js/6.83516b55.chunk.js",
"./static/js/6.1d80a66b.chunk.js.map": "./static/js/6.1d80a66b.chunk.js.map", "./static/js/6.83516b55.chunk.js.map": "./static/js/6.83516b55.chunk.js.map",
"./static/js/7.03d1beb1.chunk.js": "./static/js/7.03d1beb1.chunk.js", "./static/js/7.accad232.chunk.js": "./static/js/7.accad232.chunk.js",
"./static/js/7.03d1beb1.chunk.js.map": "./static/js/7.03d1beb1.chunk.js.map", "./static/js/7.accad232.chunk.js.map": "./static/js/7.accad232.chunk.js.map",
"./static/js/8.ea688812.chunk.js": "./static/js/8.ea688812.chunk.js", "./static/js/8.69fefc71.chunk.js": "./static/js/8.69fefc71.chunk.js",
"./static/js/8.ea688812.chunk.js.map": "./static/js/8.ea688812.chunk.js.map", "./static/js/8.69fefc71.chunk.js.map": "./static/js/8.69fefc71.chunk.js.map",
"./static/js/9.2971266e.chunk.js": "./static/js/9.2971266e.chunk.js", "./static/js/9.e77edf45.chunk.js": "./static/js/9.e77edf45.chunk.js",
"./static/js/9.2971266e.chunk.js.map": "./static/js/9.2971266e.chunk.js.map", "./static/js/9.e77edf45.chunk.js.map": "./static/js/9.e77edf45.chunk.js.map",
"main.css": "./static/css/main.80b6ec5e.css", "main.css": "./static/css/main.c95e49c6.css",
"main.css.map": "./static/css/main.80b6ec5e.css.map", "main.css.map": "./static/css/main.c95e49c6.css.map",
"main.js": "./static/js/main.2958c8ba.js", "main.js": "./static/js/main.5af27f0b.js",
"main.js.map": "./static/js/main.2958c8ba.js.map", "main.js.map": "./static/js/main.5af27f0b.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.ee7cd8ed.svg", "static/media/logo.svg": "static/media/logo.5d5d9eef.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.a7af2a8f.svg", "static/media/message.svg": "static/media/message.c4f86b97.svg",
"static\\media\\messagegrey.svg": "static/media/messagegrey.8c1dff55.svg", "static/media/messagegrey.svg": "static/media/messagegrey.31dd74f4.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.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.2958c8ba.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.c95e49c6.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.5af27f0b.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

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

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

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

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

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

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

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

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

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…
Cancel
Save