forked from Gitlink/forgeplus
Compare commits
37 Commits
master
...
integrated
Author | SHA1 | Date |
---|---|---|
|
c9b15a02d6 | |
|
7776ab29ed | |
|
661c8dda85 | |
|
8b11fb604a | |
|
eaf78c4d8f | |
|
b524111ae6 | |
|
244c1b865a | |
|
dafdbadb6b | |
|
bf68c1c544 | |
|
6de617d898 | |
|
5addece8d5 | |
|
ffbe4942b7 | |
|
c963a80e8c | |
|
01f15da5ed | |
|
cd595646d8 | |
|
1ac5498091 | |
|
faf2302b8e | |
|
5433920724 | |
|
0e33b12989 | |
|
1c45b48063 | |
|
80d6cbf823 | |
|
0ebcf3d7f7 | |
|
0f69255422 | |
|
d480deee64 | |
|
50bef66261 | |
|
9915c10bcf | |
|
c546eda537 | |
|
769bf2b90e | |
|
94ad4ce56c | |
|
98176f839d | |
|
33951af37d | |
|
46b906d2ac | |
|
0a460d1d37 | |
![]() |
cb089b1bb8 | |
![]() |
8e2cf4ecc0 | |
|
38193dff54 | |
|
e07dddde98 |
5
Gemfile
5
Gemfile
|
@ -100,6 +100,7 @@ gem 'rails-i18n', '~> 5.1'
|
||||||
# job
|
# job
|
||||||
gem 'sidekiq'
|
gem 'sidekiq'
|
||||||
gem 'sinatra'
|
gem 'sinatra'
|
||||||
|
gem 'whenever'
|
||||||
gem "sidekiq-cron", "~> 1.1"
|
gem "sidekiq-cron", "~> 1.1"
|
||||||
|
|
||||||
# batch insert
|
# batch insert
|
||||||
|
@ -126,3 +127,7 @@ gem 'request_store'
|
||||||
gem 'harmonious_dictionary', '~> 0.0.1'
|
gem 'harmonious_dictionary', '~> 0.0.1'
|
||||||
|
|
||||||
gem 'parallel', '~> 1.19', '>= 1.19.1'
|
gem 'parallel', '~> 1.19', '>= 1.19.1'
|
||||||
|
|
||||||
|
# log
|
||||||
|
gem 'multi_logger'
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ GEM
|
||||||
chromedriver-helper (2.1.1)
|
chromedriver-helper (2.1.1)
|
||||||
archive-zip (~> 0.10)
|
archive-zip (~> 0.10)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
|
chronic (0.10.2)
|
||||||
chunky_png (1.3.11)
|
chunky_png (1.3.11)
|
||||||
concurrent-ruby (1.1.6)
|
concurrent-ruby (1.1.6)
|
||||||
connection_pool (2.2.2)
|
connection_pool (2.2.2)
|
||||||
|
@ -181,6 +182,8 @@ GEM
|
||||||
minitest (5.14.0)
|
minitest (5.14.0)
|
||||||
msgpack (1.3.3)
|
msgpack (1.3.3)
|
||||||
multi_json (1.14.1)
|
multi_json (1.14.1)
|
||||||
|
multi_logger (0.2.0)
|
||||||
|
railties
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
mustermann (1.1.1)
|
mustermann (1.1.1)
|
||||||
|
@ -420,6 +423,8 @@ GEM
|
||||||
websocket-driver (0.7.1)
|
websocket-driver (0.7.1)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.4)
|
websocket-extensions (0.1.4)
|
||||||
|
whenever (1.0.0)
|
||||||
|
chronic (>= 0.6.3)
|
||||||
wkhtmltopdf-binary (0.12.5.4)
|
wkhtmltopdf-binary (0.12.5.4)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
|
@ -457,6 +462,7 @@ DEPENDENCIES
|
||||||
jquery-rails
|
jquery-rails
|
||||||
kaminari (~> 1.1, >= 1.1.1)
|
kaminari (~> 1.1, >= 1.1.1)
|
||||||
listen (>= 3.0.5, < 3.2)
|
listen (>= 3.0.5, < 3.2)
|
||||||
|
multi_logger
|
||||||
mysql2 (>= 0.4.4, < 0.6.0)
|
mysql2 (>= 0.4.4, < 0.6.0)
|
||||||
oauth2
|
oauth2
|
||||||
omniauth (~> 1.9.0)
|
omniauth (~> 1.9.0)
|
||||||
|
@ -498,6 +504,7 @@ DEPENDENCIES
|
||||||
tzinfo-data
|
tzinfo-data
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
web-console (>= 3.3.0)
|
web-console (>= 3.3.0)
|
||||||
|
whenever
|
||||||
wkhtmltopdf-binary
|
wkhtmltopdf-binary
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
// All this logic will automatically be available in application.js.
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
// All this logic will automatically be available in application.js.
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
// All this logic will automatically be available in application.js.
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Place all the behaviors and hooks related to the matching controller here.
|
||||||
|
// All this logic will automatically be available in application.js.
|
|
@ -0,0 +1,3 @@
|
||||||
|
// Place all the styles related to the log controller here.
|
||||||
|
// They will automatically be included in application.css.
|
||||||
|
// You can use Sass (SCSS) here: http://sass-lang.com/
|
|
@ -0,0 +1,84 @@
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #333;
|
||||||
|
margin: 33px;
|
||||||
|
font-family: verdana, arial, helvetica, sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, ol, ul, td {
|
||||||
|
font-family: verdana, arial, helvetica, sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background-color: #eee;
|
||||||
|
padding: 10px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
&:visited {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 0 5px 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
&.field, &.actions {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#notice {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field_with_errors {
|
||||||
|
padding: 2px;
|
||||||
|
background-color: red;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
#error_explanation {
|
||||||
|
width: 450px;
|
||||||
|
border: 2px solid red;
|
||||||
|
padding: 7px 7px 0;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 5px 5px 5px 15px;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: -7px -7px 0;
|
||||||
|
background-color: #c00;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul li {
|
||||||
|
font-size: 12px;
|
||||||
|
list-style: square;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
// Place all the styles related to the SponsorTiers 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 Sponsorships 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 Wallets controller here.
|
||||||
|
// They will automatically be included in application.css.
|
||||||
|
// You can use Sass (SCSS) here: http://sass-lang.com/
|
|
@ -234,6 +234,7 @@ class AccountsController < ApplicationController
|
||||||
|
|
||||||
set_autologin_cookie(user)
|
set_autologin_cookie(user)
|
||||||
UserAction.create(:action_id => user.try(:id), :action_type => "Login", :user_id => user.try(:id), :ip => request.remote_ip)
|
UserAction.create(:action_id => user.try(:id), :action_type => "Login", :user_id => user.try(:id), :ip => request.remote_ip)
|
||||||
|
# user.daily_reward
|
||||||
user.update_column(:last_login_on, Time.now)
|
user.update_column(:last_login_on, Time.now)
|
||||||
session[:"#{default_yun_session}"] = user.id
|
session[:"#{default_yun_session}"] = user.id
|
||||||
Rails.logger.info("#########_____session_default_yun_session__________###############{default_yun_session}")
|
Rails.logger.info("#########_____session_default_yun_session__________###############{default_yun_session}")
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
require 'oauth2'
|
require 'oauth2'
|
||||||
|
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
include CodeExample
|
include CodeExample
|
||||||
include RenderExpand
|
include RenderExpand
|
||||||
include RenderHelper
|
include RenderHelper
|
||||||
|
@ -10,12 +11,14 @@ class ApplicationController < ActionController::Base
|
||||||
include LoggerHelper
|
include LoggerHelper
|
||||||
include LoginHelper
|
include LoginHelper
|
||||||
include RegisterHelper
|
include RegisterHelper
|
||||||
|
include UpdateHelper
|
||||||
|
|
||||||
protect_from_forgery prepend: true, unless: -> { request.format.json? }
|
protect_from_forgery prepend: true, unless: -> { request.format.json? }
|
||||||
|
|
||||||
before_action :check_sign
|
before_action :check_sign
|
||||||
before_action :user_setup
|
before_action :user_setup
|
||||||
#before_action :check_account
|
#before_action :check_account
|
||||||
|
after_action :user_trace_log
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
# check sql query time
|
# check sql query time
|
||||||
|
@ -343,7 +346,8 @@ class ApplicationController < ActionController::Base
|
||||||
User.current = User.find 8686
|
User.current = User.find 8686
|
||||||
elsif params[:debug] == 'admin'
|
elsif params[:debug] == 'admin'
|
||||||
logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....."
|
logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....."
|
||||||
user = User.find 36480
|
# user = User.find 36480
|
||||||
|
user = User.find 5
|
||||||
User.current = user
|
User.current = user
|
||||||
cookies.signed[:user_id] = user.id
|
cookies.signed[:user_id] = user.id
|
||||||
end
|
end
|
||||||
|
@ -366,7 +370,19 @@ class ApplicationController < ActionController::Base
|
||||||
# RSS key authentication does not start a session
|
# RSS key authentication does not start a session
|
||||||
User.find_by_rss_key(params[:key])
|
User.find_by_rss_key(params[:key])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_trace_log
|
||||||
|
user = current_user
|
||||||
|
# print("*********************url:", request.url, "****routes", request.request_method)
|
||||||
|
Rails.logger.user_trace.info("{id: #{user.id}, login: #{user.login}, url: #{request.url}, method: #{request.method}, params: #{params}, response_code: #{response.code}, time: #{Time.now}}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_trace_update_log(old_value_hash)
|
||||||
|
user = current_user
|
||||||
|
str = "{id: #{user.id}, login: #{user.login}, url: #{request.url}, method: #{request.method}, params: #{params.merge(old_value: old_value_hash)}, response_code: #{response.code}, time: #{Time.now}}"
|
||||||
|
Rails.logger.user_trace.info(str)
|
||||||
|
end
|
||||||
|
|
||||||
def try_to_autologin
|
def try_to_autologin
|
||||||
if cookies[autologin_cookie_name]
|
if cookies[autologin_cookie_name]
|
||||||
|
@ -392,291 +408,291 @@ class ApplicationController < ActionController::Base
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.json
|
format.json
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
## 输出错误信息
|
## 输出错误信息
|
||||||
def error_status(message = nil)
|
def error_status(message = nil)
|
||||||
@status = -1
|
@status = -1
|
||||||
@message = message
|
@message = message
|
||||||
end
|
end
|
||||||
|
|
||||||
# 实训等对应的仓库地址
|
# 实训等对应的仓库地址
|
||||||
def repo_ip_url(repo_path)
|
def repo_ip_url(repo_path)
|
||||||
"#{edu_setting('git_address_ip')}/#{repo_path}"
|
"#{edu_setting('git_address_ip')}/#{repo_path}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def repo_url(repo_path)
|
def repo_url(repo_path)
|
||||||
"#{edu_setting('git_address_domain')}/#{repo_path}"
|
"#{edu_setting('git_address_domain')}/#{repo_path}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# 通关后,把最后一次成功的代码存到数据库
|
# 通关后,把最后一次成功的代码存到数据库
|
||||||
# type 0 创始内容, 1 最新内容
|
# type 0 创始内容, 1 最新内容
|
||||||
# def game_passed_code(path, myshixun, game_id)
|
# def game_passed_code(path, myshixun, game_id)
|
||||||
# # 如果代码窗口是隐藏的,则不用保存代码
|
# # 如果代码窗口是隐藏的,则不用保存代码
|
||||||
# return if myshixun.shixun.hide_code || myshixun.shixun.vnc
|
# return if myshixun.shixun.hide_code || myshixun.shixun.vnc
|
||||||
# file_content = git_fle_content myshixun.repo_path, path
|
# file_content = git_fle_content myshixun.repo_path, path
|
||||||
# #unless file_content.present?
|
# #unless file_content.present?
|
||||||
# # raise("获取文件代码异常")
|
# # raise("获取文件代码异常")
|
||||||
# #end
|
# #end
|
||||||
# logger.info("#######game_id:#{game_id}, file_content:#{file_content}")
|
# logger.info("#######game_id:#{game_id}, file_content:#{file_content}")
|
||||||
# game_code = GameCode.where(:game_id => game_id, :path => path).first
|
# game_code = GameCode.where(:game_id => game_id, :path => path).first
|
||||||
# if game_code.nil?
|
# if game_code.nil?
|
||||||
# GameCode.create!(:game_id => game_id, :new_code => file_content, :path => path)
|
# GameCode.create!(:game_id => game_id, :new_code => file_content, :path => path)
|
||||||
# else
|
# else
|
||||||
# game_code.update_attributes!(:new_code => file_content)
|
# game_code.update_attributes!(:new_code => file_content)
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# Post请求
|
# Post请求
|
||||||
def uri_post(uri, params)
|
def uri_post(uri, params)
|
||||||
begin
|
begin
|
||||||
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
||||||
uri = URI.parse(URI.encode(uri.strip))
|
uri = URI.parse(URI.encode(uri.strip))
|
||||||
res = Net::HTTP.post_form(uri, params).body
|
res = Net::HTTP.post_form(uri, params).body
|
||||||
uid_logger_dubug("--uri_exec: .....res is #{res}")
|
uid_logger_dubug("--uri_exec: .....res is #{res}")
|
||||||
JSON.parse(res)
|
JSON.parse(res)
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger_error("--uri_exec: exception #{e.message}")
|
uid_logger_error("--uri_exec: exception #{e.message}")
|
||||||
raise Educoder::TipException.new("实训平台繁忙(繁忙等级:84)")
|
raise Educoder::TipException.new("实训平台繁忙(繁忙等级:84)")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# 处理返回非0就报错的请求
|
# 处理返回非0就报错的请求
|
||||||
def interface_post(uri, params, status, message)
|
def interface_post(uri, params, status, message)
|
||||||
begin
|
begin
|
||||||
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
||||||
uri = URI.parse(URI.encode(uri.strip))
|
uri = URI.parse(URI.encode(uri.strip))
|
||||||
res = Net::HTTP.post_form(uri, params).body
|
res = Net::HTTP.post_form(uri, params).body
|
||||||
uid_logger_dubug("--uri_exec: .....res is #{res}")
|
uid_logger_dubug("--uri_exec: .....res is #{res}")
|
||||||
res = JSON.parse(res)
|
res = JSON.parse(res)
|
||||||
if (res && res['code'] != 0)
|
if (res && res['code'] != 0)
|
||||||
tip_exception(status, message)
|
tip_exception(status, message)
|
||||||
else
|
else
|
||||||
res
|
res
|
||||||
end
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger("--uri_exec: exception #{e.message}")
|
uid_logger("--uri_exec: exception #{e.message}")
|
||||||
raise Educoder::TipException.new(message)
|
raise Educoder::TipException.new(message)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# json格式请求
|
# json格式请求
|
||||||
def interface_json_post(uri, params, status, message)
|
def interface_json_post(uri, params, status, message)
|
||||||
begin
|
begin
|
||||||
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}")
|
||||||
uri = URI.parse(URI.encode(uri.strip))
|
uri = URI.parse(URI.encode(uri.strip))
|
||||||
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
||||||
req = Net::HTTP::Post.new(uri)
|
req = Net::HTTP::Post.new(uri)
|
||||||
req['Content-Type'] = 'application/json'
|
req['Content-Type'] = 'application/json'
|
||||||
req.body = params.to_json
|
req.body = params.to_json
|
||||||
http.request(req)
|
http.request(req)
|
||||||
end
|
end
|
||||||
uid_logger_dubug("--uri_exec: .....res is #{res.body}")
|
uid_logger_dubug("--uri_exec: .....res is #{res.body}")
|
||||||
res = JSON.parse(res.body)
|
res = JSON.parse(res.body)
|
||||||
if (res && res['code'] != 0)
|
if (res && res['code'] != 0)
|
||||||
tip_exception(status, message)
|
tip_exception(status, message)
|
||||||
else
|
else
|
||||||
res
|
res
|
||||||
end
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger("--uri_exec: exception #{e.message}")
|
uid_logger("--uri_exec: exception #{e.message}")
|
||||||
raise Educoder::TipException.new("服务器繁忙")
|
raise Educoder::TipException.new("服务器繁忙")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# 适用与已经用url_safe编码后,回调字符串形式
|
# 适用与已经用url_safe编码后,回调字符串形式
|
||||||
def tran_base64_decode64(str)
|
def tran_base64_decode64(str)
|
||||||
s_size = str.size % 4
|
s_size = str.size % 4
|
||||||
if s_size != 0
|
if s_size != 0
|
||||||
str += "=" * (4 - s_size)
|
str += "=" * (4 - s_size)
|
||||||
end
|
end
|
||||||
if str.blank?
|
if str.blank?
|
||||||
str
|
str
|
||||||
else
|
else
|
||||||
Base64.decode64(str.tr("-_", "+/")).force_encoding("utf-8")
|
Base64.decode64(str.tr("-_", "+/")).force_encoding("utf-8")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def sucess_status(message = 'success')
|
def sucess_status(message = 'success')
|
||||||
render :json => { status: 1, message: message }
|
render :json => { status: 1, message: message }
|
||||||
end
|
end
|
||||||
|
|
||||||
# 随机生成字符
|
# 随机生成字符
|
||||||
def generate_identifier(container, num, pre='')
|
def generate_identifier(container, num, pre='')
|
||||||
code = DCODES.sample(num).join
|
code = DCODES.sample(num).join
|
||||||
if container == User
|
if container == User
|
||||||
while container.exists?(login: pre+code) do
|
while container.exists?(login: pre+code) do
|
||||||
code = DCODES.sample(num).join
|
code = DCODES.sample(num).join
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
while container.exists?(identifier: code) do
|
while container.exists?(identifier: code) do
|
||||||
code = DCODES.sample(num).join
|
code = DCODES.sample(num).join
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
code
|
code
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# 实训主类别列表,自带描述
|
# 实训主类别列表,自带描述
|
||||||
def shixun_main_type
|
def shixun_main_type
|
||||||
list = []
|
list = []
|
||||||
mirrors = MirrorRepository.select([:id, :type_name, :description, :name]).published_main_mirror
|
mirrors = MirrorRepository.select([:id, :type_name, :description, :name]).published_main_mirror
|
||||||
mirrors.try(:each) do |mirror|
|
mirrors.try(:each) do |mirror|
|
||||||
list << {id: mirror.id, type_name: mirror.type_name, description: mirror.try(:description), mirror_name: mirror.name}
|
list << {id: mirror.id, type_name: mirror.type_name, description: mirror.try(:description), mirror_name: mirror.name}
|
||||||
end
|
end
|
||||||
list
|
list
|
||||||
end
|
end
|
||||||
|
|
||||||
# 小类别列表
|
# 小类别列表
|
||||||
def shixun_small_type
|
def shixun_small_type
|
||||||
list = []
|
list = []
|
||||||
mirrors = MirrorRepository.select([:id, :type_name, :description, :name]).published_small_mirror
|
mirrors = MirrorRepository.select([:id, :type_name, :description, :name]).published_small_mirror
|
||||||
mirrors.try(:each) do |mirror|
|
mirrors.try(:each) do |mirror|
|
||||||
list << {id: mirror.id, type_name: mirror.type_name, description: mirror.description, mirror_name: mirror.name}
|
list << {id: mirror.id, type_name: mirror.type_name, description: mirror.description, mirror_name: mirror.name}
|
||||||
end
|
end
|
||||||
list
|
list
|
||||||
end
|
end
|
||||||
|
|
||||||
def container_limit(mirror_repositories)
|
def container_limit(mirror_repositories)
|
||||||
container = []
|
container = []
|
||||||
mirror_repositories.each do |mr|
|
mirror_repositories.each do |mr|
|
||||||
if mr.name.present?
|
if mr.name.present?
|
||||||
container << {:image => mr.name, :cpuLimit => mr.cpu_limit, :memoryLimit => "#{mr.memory_limit}M", :type => mr.try(:main_type) == "1" ? "main" : "sub"}
|
container << {:image => mr.name, :cpuLimit => mr.cpu_limit, :memoryLimit => "#{mr.memory_limit}M", :type => mr.try(:main_type) == "1" ? "main" : "sub"}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
container.to_json
|
container.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
# 实训中间层pod配置
|
# 实训中间层pod配置
|
||||||
def shixun_container_limit shixun
|
def shixun_container_limit shixun
|
||||||
container = []
|
container = []
|
||||||
shixun.shixun_service_configs.each do |config|
|
shixun.shixun_service_configs.each do |config|
|
||||||
mirror = config.mirror_repository
|
mirror = config.mirror_repository
|
||||||
if mirror.name.present?
|
if mirror.name.present?
|
||||||
# 资源限制没有就传默认值。
|
# 资源限制没有就传默认值。
|
||||||
cpu_limit = config.cpu_limit.presence || 1
|
cpu_limit = config.cpu_limit.presence || 1
|
||||||
cpu_request = config.lower_cpu_limit.presence || 0.1
|
cpu_request = config.lower_cpu_limit.presence || 0.1
|
||||||
memory_limit = config.memory_limit.presence || 1024
|
memory_limit = config.memory_limit.presence || 1024
|
||||||
request_limit = config.request_limit.presence || 10
|
request_limit = config.request_limit.presence || 10
|
||||||
resource_limit = config.resource_limit.presence || 10000
|
resource_limit = config.resource_limit.presence || 10000
|
||||||
container << {:image => mirror.name,
|
container << {:image => mirror.name,
|
||||||
:cpuLimit => cpu_limit,
|
:cpuLimit => cpu_limit,
|
||||||
:cpuRequest => cpu_request,
|
:cpuRequest => cpu_request,
|
||||||
:memoryLimit => "#{memory_limit}M",
|
:memoryLimit => "#{memory_limit}M",
|
||||||
:memoryRequest => "#{request_limit}M",
|
:memoryRequest => "#{request_limit}M",
|
||||||
:resourceLimit => "#{resource_limit}K",
|
:resourceLimit => "#{resource_limit}K",
|
||||||
:type => mirror.try(:main_type) == "1" ? "main" : "sub"}
|
:type => mirror.try(:main_type) == "1" ? "main" : "sub"}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
container.to_json
|
container.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
# 毕设任务列表的赛选
|
# 毕设任务列表的赛选
|
||||||
def course_work(task, **option)
|
def course_work(task, **option)
|
||||||
logger.info("#############{option}")
|
logger.info("#############{option}")
|
||||||
course = task.course
|
course = task.course
|
||||||
work_list = task.graduation_works.includes(user: [:user_extension])
|
work_list = task.graduation_works.includes(user: [:user_extension])
|
||||||
# 教师评阅搜索 0: 未评, 1 已评
|
# 教师评阅搜索 0: 未评, 1 已评
|
||||||
if option[:teacher_comment]
|
if option[:teacher_comment]
|
||||||
graduation_work_ids = GraduationWorkScore.where(graduation_work_id: work_list.map(&:id)).pluck(:graduation_work_id)
|
graduation_work_ids = GraduationWorkScore.where(graduation_work_id: work_list.map(&:id)).pluck(:graduation_work_id)
|
||||||
if option[:teacher_comment].zero?
|
if option[:teacher_comment].zero?
|
||||||
work_list = work_list.where.not(id: graduation_work_ids)
|
work_list = work_list.where.not(id: graduation_work_ids)
|
||||||
elsif option[:teacher_comment] == 1
|
elsif option[:teacher_comment] == 1
|
||||||
work_list = work_list.where(id: graduation_work_ids).where.not(work_status: 0)
|
work_list = work_list.where(id: graduation_work_ids).where.not(work_status: 0)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# 作品状态 0: 未提交, 1 按时提交, 2 延迟提交
|
# 作品状态 0: 未提交, 1 按时提交, 2 延迟提交
|
||||||
if option[:task_status]
|
if option[:task_status]
|
||||||
work_list = work_list.where(work_status: option[:task_status])
|
work_list = work_list.where(work_status: option[:task_status])
|
||||||
end
|
end
|
||||||
|
|
||||||
# 分班情况
|
# 分班情况
|
||||||
if option[:course_group]
|
if option[:course_group]
|
||||||
group_user_ids = course.course_members.where(course_group_id: option[:course_group]).pluck(:user_id)
|
group_user_ids = course.course_members.where(course_group_id: option[:course_group]).pluck(:user_id)
|
||||||
# 有分组只可能是老师身份查看列表
|
# 有分组只可能是老师身份查看列表
|
||||||
work_list = work_list.where(user_id: group_user_ids)
|
work_list = work_list.where(user_id: group_user_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
# 只看我的交叉评阅
|
# 只看我的交叉评阅
|
||||||
if option[:cross_comment]
|
if option[:cross_comment]
|
||||||
graduation_work_id = task.graduation_work_comment_assignations.where(:user_id => current_user.id)
|
graduation_work_id = task.graduation_work_comment_assignations.where(:user_id => current_user.id)
|
||||||
.pluck(:graduation_work_id).uniq if task.graduation_work_comment_assignations
|
.pluck(:graduation_work_id).uniq if task.graduation_work_comment_assignations
|
||||||
work_list = work_list.where(id: graduation_work_id)
|
work_list = work_list.where(id: graduation_work_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
# 输入姓名和学号搜索
|
# 输入姓名和学号搜索
|
||||||
# TODO user_extension 如果修改 请调整
|
# TODO user_extension 如果修改 请调整
|
||||||
if option[:search]
|
if option[:search]
|
||||||
work_list = work_list.joins(user: :user_extension).where("concat(lastname, firstname) like ?
|
work_list = work_list.joins(user: :user_extension).where("concat(lastname, firstname) like ?
|
||||||
or student_id like ?", "%#{option[:search]}%", "%#{option[:search]}%")
|
or student_id like ?", "%#{option[:search]}%", "%#{option[:search]}%")
|
||||||
end
|
end
|
||||||
|
|
||||||
# 排序
|
# 排序
|
||||||
rorder = option[:order] || "updated_at"
|
rorder = option[:order] || "updated_at"
|
||||||
b_order = option[:b_order] || "desc"
|
b_order = option[:b_order] || "desc"
|
||||||
if rorder == "created_at" || rorder == "work_score"
|
if rorder == "created_at" || rorder == "work_score"
|
||||||
work_list = work_list.order("graduation_works.#{rorder} #{b_order}")
|
work_list = work_list.order("graduation_works.#{rorder} #{b_order}")
|
||||||
elsif rorder == "student_id"
|
elsif rorder == "student_id"
|
||||||
work_list = work_list.joins(user: :user_extension).order("user_extensions.#{rorder} #{b_order}")
|
work_list = work_list.joins(user: :user_extension).order("user_extensions.#{rorder} #{b_order}")
|
||||||
end
|
end
|
||||||
work_list
|
work_list
|
||||||
end
|
end
|
||||||
|
|
||||||
def strip_html(text, len=0, endss="...")
|
def strip_html(text, len=0, endss="...")
|
||||||
ss = ""
|
ss = ""
|
||||||
if !text.nil? && text.length>0
|
if !text.nil? && text.length>0
|
||||||
ss=text.gsub(/<\/?.*?>/, '').strip
|
ss=text.gsub(/<\/?.*?>/, '').strip
|
||||||
ss = ss.gsub(/ */, '')
|
ss = ss.gsub(/ */, '')
|
||||||
ss = ss.gsub(/\r\n/,'') #新增
|
ss = ss.gsub(/\r\n/,'') #新增
|
||||||
ss = ss.gsub(/\n/,'') #新增
|
ss = ss.gsub(/\n/,'') #新增
|
||||||
if len > 0 && ss.length > len
|
if len > 0 && ss.length > len
|
||||||
ss = ss[0, len] + endss
|
ss = ss[0, len] + endss
|
||||||
elsif len > 0 && ss.length <= len
|
elsif len > 0 && ss.length <= len
|
||||||
ss = ss
|
ss = ss
|
||||||
#ss = truncate(ss, :length => len)
|
#ss = truncate(ss, :length => len)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ss
|
ss
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a string that can be used as filename value in Content-Disposition header
|
# Returns a string that can be used as filename value in Content-Disposition header
|
||||||
def filename_for_content_disposition(name)
|
def filename_for_content_disposition(name)
|
||||||
request.env['HTTP_USER_AGENT'] =~ %r{MSIE|Trident|Edge} ? ERB::Util.url_encode(name) : name
|
request.env['HTTP_USER_AGENT'] =~ %r{MSIE|Trident|Edge} ? ERB::Util.url_encode(name) : name
|
||||||
end
|
end
|
||||||
|
|
||||||
def format_time(time)
|
def format_time(time)
|
||||||
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M")
|
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M")
|
||||||
end
|
end
|
||||||
|
|
||||||
# 获取Oauth Client
|
# 获取Oauth Client
|
||||||
def get_client(site)
|
def get_client(site)
|
||||||
client_id = Rails.configuration.educoder['client_id']
|
client_id = Rails.configuration.educoder['client_id']
|
||||||
client_secret = Rails.configuration.educoder['client_secret']
|
client_secret = Rails.configuration.educoder['client_secret']
|
||||||
|
|
||||||
OAuth2::Client.new(client_id, client_secret, site: site)
|
OAuth2::Client.new(client_id, client_secret, site: site)
|
||||||
end
|
end
|
||||||
|
|
||||||
def paginate(relation)
|
def paginate(relation)
|
||||||
limit = params[:limit] || params[:per_page]
|
limit = params[:limit] || params[:per_page]
|
||||||
limit = (limit.to_i.zero? || limit.to_i > 20) ? 20 : limit.to_i
|
limit = (limit.to_i.zero? || limit.to_i > 20) ? 20 : limit.to_i
|
||||||
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
|
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
|
||||||
offset = (page - 1) * limit
|
offset = (page - 1) * limit
|
||||||
|
|
||||||
if relation.is_a?(Array)
|
if relation.is_a?(Array)
|
||||||
relation[offset, limit]
|
relation[offset, limit]
|
||||||
else
|
else
|
||||||
relation.limit(limit).offset(offset)
|
relation.limit(limit).offset(offset)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def kaminari_paginate(relation)
|
def kaminari_paginate(relation)
|
||||||
limit = params[:limit] || params[:per_page]
|
limit = params[:limit] || params[:per_page]
|
||||||
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
|
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
|
||||||
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
|
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
|
||||||
|
|
||||||
relation.page(page).per(limit)
|
relation.page(page).per(limit)
|
||||||
end
|
end
|
||||||
|
|
||||||
def kaminari_array_paginate(relation)
|
def kaminari_array_paginate(relation)
|
||||||
|
@ -691,29 +707,30 @@ class ApplicationController < ActionController::Base
|
||||||
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S")
|
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
end
|
end
|
||||||
|
|
||||||
def strf_date(date)
|
def strf_date(date)
|
||||||
date.blank? ? '' : date.to_date.strftime("%Y-%m-%d")
|
date.blank? ? '' : date.to_date.strftime("%Y-%m-%d")
|
||||||
end
|
end
|
||||||
|
|
||||||
def logger_error(error)
|
def logger_error(error)
|
||||||
Rails.logger.error(error.message)
|
Rails.logger.error(error.message)
|
||||||
error.backtrace.each { |msg| Rails.logger.error(msg) }
|
error.backtrace.each { |msg| Rails.logger.error(msg) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_user
|
def find_user
|
||||||
@user = User.find_by_login params[:login]
|
@user = User.find_by_login params[:login]
|
||||||
render_not_found("未找到’#{params[:login]}’相关的用户") unless @user
|
render_not_found("未找到’#{params[:login]}’相关的用户") unless @user
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_user_with_id
|
def find_user_with_id
|
||||||
@user = User.find_by_id params[:user_id]
|
@user = User.find_by_id params[:user_id]
|
||||||
# render_not_found("未找到’#{params[:login]}’相关的用户") unless @user
|
# render_not_found("未找到’#{params[:login]}’相关的用户") unless @user
|
||||||
render_error("未找到相关的用户") unless @user
|
render_error("未找到相关的用户") unless @user
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_repository
|
def find_repository
|
||||||
@repo = @user.repositories.find_by_identifier params[:repo_identifier]
|
@repo = @user.repositories.find_by_identifier params[:repo_identifier]
|
||||||
render_not_found("未找到’#{params[:repo_identifier]}’相关的项目") unless @repo
|
render_not_found("未找到’#{params[:repo_identifier]}’相关的项目") unless @repo
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_repository_by_id
|
def find_repository_by_id
|
||||||
|
@ -770,55 +787,55 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def object_not_found
|
def object_not_found
|
||||||
uid_logger("Missing template or cant't find record, responding with 404")
|
uid_logger("Missing template or cant't find record, responding with 404")
|
||||||
render json: {message: "您访问的页面不存在或已被删除", status: 404}
|
render json: {message: "您访问的页面不存在或已被删除", status: 404}
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def tip_show(exception)
|
def tip_show(exception)
|
||||||
uid_logger("Tip show status is #{exception.status}, message is #{exception.message}")
|
uid_logger("Tip show status is #{exception.status}, message is #{exception.message}")
|
||||||
render json: exception.tip_json
|
render json: exception.tip_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_parameter_missing
|
def render_parameter_missing
|
||||||
render json: { status: -1, message: '参数缺失' }
|
render json: { status: -1, message: '参数缺失' }
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_export_cookies
|
def set_export_cookies
|
||||||
cookies[:fileDownload] = true
|
cookies[:fileDownload] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
# 149课程的评审用户数据创建(包含创建课堂学生)
|
# 149课程的评审用户数据创建(包含创建课堂学生)
|
||||||
def open_class_user
|
def open_class_user
|
||||||
user = User.find_by(login: "OpenClassUser")
|
user = User.find_by(login: "OpenClassUser")
|
||||||
unless user
|
unless user
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
user_params = {status: 1, login: "OpenClassUser", lastname: "开放课程",
|
user_params = {status: 1, login: "OpenClassUser", lastname: "开放课程",
|
||||||
nickname: "开放课程", professional_certification: 1, certification: 1, grade: 0,
|
nickname: "开放课程", professional_certification: 1, certification: 1, grade: 0,
|
||||||
password: "12345678", phone: "11122223333", profile_completed: 1}
|
password: "12345678", phone: "11122223333", profile_completed: 1}
|
||||||
user = User.create!(user_params)
|
user = User.create!(user_params)
|
||||||
|
|
||||||
UserExtension.create!(user_id: user.id, gender: 0, school_id: 3396, :identity => 1, :student_id => "openclassuser") # 3396
|
UserExtension.create!(user_id: user.id, gender: 0, school_id: 3396, :identity => 1, :student_id => "openclassuser") # 3396
|
||||||
|
|
||||||
subject = Subject.find_by(id: 149)
|
subject = Subject.find_by(id: 149)
|
||||||
if subject
|
if subject
|
||||||
subject.courses.each do |course|
|
subject.courses.each do |course|
|
||||||
CourseMember.create!(course_id: course.id, role: 3, user_id: user.id) if !course.course_members.exists?(user_id: user.id)
|
CourseMember.create!(course_id: course.id, role: 3, user_id: user.id) if !course.course_members.exists?(user_id: user.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
user
|
user
|
||||||
end
|
end
|
||||||
|
|
||||||
# 记录热门搜索关键字
|
# 记录热门搜索关键字
|
||||||
def record_search_keyword
|
def record_search_keyword
|
||||||
keyword = params[:keyword].to_s.strip
|
keyword = params[:keyword].to_s.strip
|
||||||
return if keyword.blank? || keyword.size <= 1
|
return if keyword.blank? || keyword.size <= 1
|
||||||
return unless HotSearchKeyword.available?
|
return unless HotSearchKeyword.available?
|
||||||
|
|
||||||
HotSearchKeyword.add(keyword)
|
HotSearchKeyword.add(keyword)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
|
@ -44,6 +44,7 @@ module LoginHelper
|
||||||
set_autologin_cookie(user)
|
set_autologin_cookie(user)
|
||||||
|
|
||||||
UserAction.create(action_id: user&.id, action_type: 'Login', user_id: user&.id, ip: request.remote_ip)
|
UserAction.create(action_id: user&.id, action_type: 'Login', user_id: user&.id, ip: request.remote_ip)
|
||||||
|
# user.daily_reward
|
||||||
user.update_column(:last_login_on, Time.now)
|
user.update_column(:last_login_on, Time.now)
|
||||||
# 注册完成后有一天的试用申请(先去掉)
|
# 注册完成后有一天的试用申请(先去掉)
|
||||||
# UserDayCertification.create(user_id: user.id, status: 1)
|
# UserDayCertification.create(user_id: user.id, status: 1)
|
||||||
|
|
|
@ -2,9 +2,12 @@ class ForksController < ApplicationController
|
||||||
before_action :require_login
|
before_action :require_login
|
||||||
before_action :load_project
|
before_action :load_project
|
||||||
before_action :authenticate_project!, :authenticate_user!
|
before_action :authenticate_project!, :authenticate_user!
|
||||||
|
skip_after_action :user_trace_log, only: [:create]
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@new_project = Projects::ForkService.new(current_user, @project, params[:organization]).call
|
@new_project = Projects::ForkService.new(current_user, @project, params[:organization]).call
|
||||||
|
user = current_user
|
||||||
|
Rails.logger.user_trace.info("{id: #{user.id}, login: #{user.login}, url: #{request.url}, method: #{request.method}, params: #{params.merge(forkee: @new_project.id)}, response_code: #{response.code}, time: #{Time.now}}")
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -8,6 +8,8 @@ class IssuesController < ApplicationController
|
||||||
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
|
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
|
||||||
before_action :check_token_enough, only: [:create, :update]
|
before_action :check_token_enough, only: [:create, :update]
|
||||||
|
|
||||||
|
skip_after_action :user_trace_log, only: [:update]
|
||||||
|
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
include TagChosenHelper
|
include TagChosenHelper
|
||||||
|
|
||||||
|
@ -139,6 +141,15 @@ class IssuesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
|
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
|
||||||
|
|
||||||
|
########## sponsor
|
||||||
|
amount = 2
|
||||||
|
user_wallet = current_user.get_wallet
|
||||||
|
user_wallet.receive(amount)
|
||||||
|
reason = "创建任务"
|
||||||
|
CoinChange.create(amount: amount, reason: reason, to_wallet_id: user_wallet.id)
|
||||||
|
##########
|
||||||
|
|
||||||
render json: {status: 0, message: "创建成", id: @issue.id}
|
render json: {status: 0, message: "创建成", id: @issue.id}
|
||||||
else
|
else
|
||||||
normal_status(-1, "创建失败")
|
normal_status(-1, "创建失败")
|
||||||
|
@ -194,6 +205,7 @@ class IssuesController < ApplicationController
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
|
issue_hash = old_value_to_hash(@issue, params)
|
||||||
|
|
||||||
if @issue.issue_type.to_s == "2" && params[:status_id].to_i == 5 && @issue.author_id != current_user.try(:id)
|
if @issue.issue_type.to_s == "2" && params[:status_id].to_i == 5 && @issue.author_id != current_user.try(:id)
|
||||||
normal_status(-1, "不允许修改为关闭状态")
|
normal_status(-1, "不允许修改为关闭状态")
|
||||||
|
@ -201,6 +213,7 @@ class IssuesController < ApplicationController
|
||||||
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
|
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
|
||||||
|
|
||||||
if @issue.update_attributes(issue_params)
|
if @issue.update_attributes(issue_params)
|
||||||
|
user_trace_update_log(issue_hash)
|
||||||
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
|
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
|
||||||
@issue.issue_times.update_all(end_time: Time.now)
|
@issue.issue_times.update_all(end_time: Time.now)
|
||||||
@issue.update_closed_issues_count_in_project!
|
@issue.update_closed_issues_count_in_project!
|
||||||
|
|
|
@ -3,6 +3,7 @@ class JournalsController < ApplicationController
|
||||||
before_action :set_issue
|
before_action :set_issue
|
||||||
before_action :check_issue_permission
|
before_action :check_issue_permission
|
||||||
before_action :set_journal, only: [:destroy, :edit, :update]
|
before_action :set_journal, only: [:destroy, :edit, :update]
|
||||||
|
skip_after_action :user_trace_log, only: [:update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@page = params[:page] || 1
|
@page = params[:page] || 1
|
||||||
|
@ -67,7 +68,9 @@ class JournalsController < ApplicationController
|
||||||
def update
|
def update
|
||||||
content = params[:content]
|
content = params[:content]
|
||||||
if content.present?
|
if content.present?
|
||||||
|
old_value = old_value_to_hash(@journal, params)
|
||||||
if @journal.update_attribute(:notes, content)
|
if @journal.update_attribute(:notes, content)
|
||||||
|
user_trace_update_log(old_value)
|
||||||
normal_status(0, "更新成功")
|
normal_status(0, "更新成功")
|
||||||
else
|
else
|
||||||
normal_status(-1, "更新失败")
|
normal_status(-1, "更新失败")
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
class LogController < ApplicationController
|
||||||
|
def list
|
||||||
|
path = "#{Rails.root}/log"
|
||||||
|
@file_list = []
|
||||||
|
Dir.foreach(path) do |file|
|
||||||
|
@file_list << file
|
||||||
|
end
|
||||||
|
@file_list = @file_list.sort
|
||||||
|
end
|
||||||
|
|
||||||
|
def download
|
||||||
|
path = "#{Rails.root}/log/#{params[:filename]}"
|
||||||
|
if params[:filename] && File.exist?(path) && File.file?(path)
|
||||||
|
send_file(path, filename: params[:filename])
|
||||||
|
else
|
||||||
|
render json: { message: 'no such file!' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -5,6 +5,7 @@ class MembersController < ApplicationController
|
||||||
before_action :operate!, except: %i[index]
|
before_action :operate!, except: %i[index]
|
||||||
before_action :check_member_exists!, only: %i[create]
|
before_action :check_member_exists!, only: %i[create]
|
||||||
before_action :check_member_not_exists!, only: %i[remove change_role]
|
before_action :check_member_not_exists!, only: %i[remove change_role]
|
||||||
|
skip_after_action :user_trace_log, only: [:change_role]
|
||||||
|
|
||||||
def create
|
def create
|
||||||
interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user)
|
interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user)
|
||||||
|
@ -34,7 +35,9 @@ class MembersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_role
|
def change_role
|
||||||
|
old_value = @project.members.where(user_id: params[:user_id])[0].roles.last.name
|
||||||
interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role])
|
interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role])
|
||||||
|
user_trace_update_log(old_value)
|
||||||
render_response(interactor)
|
render_response(interactor)
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger_error(e.message)
|
uid_logger_error(e.message)
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
class PullRequestsController < ApplicationController
|
class PullRequestsController < ApplicationController
|
||||||
|
|
||||||
before_action :require_login, except: [:index, :show, :files, :commits]
|
before_action :require_login, except: [:index, :show, :files, :commits]
|
||||||
before_action :load_repository
|
before_action :load_repository
|
||||||
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits]
|
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits]
|
||||||
before_action :load_pull_request, only: [:files, :commits]
|
before_action :load_pull_request, only: [:files, :commits]
|
||||||
|
|
||||||
|
skip_after_action :user_trace_log, only: [:update]
|
||||||
include TagChosenHelper
|
include TagChosenHelper
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
|
|
||||||
|
@ -86,8 +89,14 @@ class PullRequestsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
old_issue_value = old_value_to_hash(@issue, @issue_params)
|
||||||
|
old_pr_value = old_value_to_hash(@pull_request, @local_params.compact)
|
||||||
|
old_value = {issue: old_issue_value, pull_request: old_pr_value}
|
||||||
|
|
||||||
if @issue.update_attributes(@issue_params)
|
if @issue.update_attributes(@issue_params)
|
||||||
if @pull_request.update_attributes(@local_params.compact)
|
if @pull_request.update_attributes(@local_params.compact)
|
||||||
|
|
||||||
|
user_trace_update_log(old_value)
|
||||||
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
|
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
|
||||||
@pull_request.gpid, @requests_params, current_user.gitea_token)
|
@pull_request.gpid, @requests_params, current_user.gitea_token)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
class SettingsController < ApplicationController
|
class SettingsController < ApplicationController
|
||||||
def show
|
def show
|
||||||
@old_projects_url = nil
|
@old_projects_url = nil
|
||||||
|
@old_projects_url = "https://www.trustie.net/users/#{current_user.try(:login)}/projects" if User.current.logged?
|
||||||
get_add_menu
|
get_add_menu
|
||||||
get_common_menu
|
get_common_menu
|
||||||
get_personal_menu
|
get_personal_menu
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
class SponsorTiersController < ApplicationController
|
||||||
|
before_action :set_sponsor_tier, only: [:show, :edit, :update, :destroy]
|
||||||
|
before_action :check_sponsor, only: [:show]
|
||||||
|
before_action :require_login, only: [:create, :update, :destroy]
|
||||||
|
|
||||||
|
# GET /sponsor_tiers
|
||||||
|
# GET /sponsor_tiers.json
|
||||||
|
def index
|
||||||
|
# @sponsor_tiers = SponsorTier.all
|
||||||
|
user = User.find_by_login(params[:login])
|
||||||
|
@sponsor_tiers = user.sponsor_tier
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /sponsor_tiers/1
|
||||||
|
# GET /sponsor_tiers/1.json
|
||||||
|
def show
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /sponsor_tiers
|
||||||
|
# POST /sponsor_tiers.json
|
||||||
|
def create
|
||||||
|
# print("------------\n", sponsor_tier_params, "\n------------\n")
|
||||||
|
@check_sponsorship = nil
|
||||||
|
@sponsor_tier = SponsorTier.new(sponsor_tier_params)
|
||||||
|
respond_to do |format|
|
||||||
|
if @sponsor_tier.user_id == User.current.id && @sponsor_tier.save
|
||||||
|
format.html { redirect_to @sponsor_tier, notice: 'Sponsor tier was successfully created.' }
|
||||||
|
format.json { render :show, status: :created, location: @sponsor_tier }
|
||||||
|
# render json: {status: 1, message: '创建成功' }
|
||||||
|
else
|
||||||
|
format.html { render :new }
|
||||||
|
format.json { render json: @sponsor_tier.errors, status: :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# PATCH/PUT /sponsor_tiers/1
|
||||||
|
# PATCH/PUT /sponsor_tiers/1.json
|
||||||
|
def update
|
||||||
|
@check_sponsorship = nil
|
||||||
|
old_value = old_value_to_hash(@sponsor_tier, params)
|
||||||
|
respond_to do |format|
|
||||||
|
if User.current.id == @sponsor_tier.user_id && @sponsor_tier.update(sponsor_tier_update_params)
|
||||||
|
user_trace_update_log(old_value)
|
||||||
|
format.html { redirect_to @sponsor_tier, notice: 'Sponsor tier was successfully updated.' }
|
||||||
|
format.json { render :show, status: :ok, location: @sponsor_tier }
|
||||||
|
# render json: {status: 1, message: '修改成功' }
|
||||||
|
else
|
||||||
|
format.html { render :edit }
|
||||||
|
format.json { render json: @sponsor_tier.errors, status: :unprocessable_entity }
|
||||||
|
# format.json { render status: :unprocessable_entity }
|
||||||
|
# render json: {status: -1, message: '修改失败' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /sponsor_tiers/1
|
||||||
|
# DELETE /sponsor_tiers/1.json
|
||||||
|
def destroy
|
||||||
|
if User.current.id == @sponsor_tier.user_id
|
||||||
|
@sponsor_tier.destroy
|
||||||
|
respond_to do |format|
|
||||||
|
format.html { redirect_to sponsor_tiers_url, notice: 'Sponsor tier was successfully destroyed.' }
|
||||||
|
format.json { head :no_content }
|
||||||
|
end
|
||||||
|
else
|
||||||
|
format.json { render json: @sponsor_tier.errors, status: :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
# Use callbacks to share common setup or constraints between actions.
|
||||||
|
def check_sponsor
|
||||||
|
@check_sponsorship = Sponsorship.where("sponsor_id=? AND developer_id=?", current_user.id, @sponsor_tier.user.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_sponsor_tier
|
||||||
|
@sponsor_tier = SponsorTier.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def sponsor_tier_update_params
|
||||||
|
params.require(:sponsor_tier).permit(:tier, :description)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Only allow a list of trusted parameters through.
|
||||||
|
def sponsor_tier_params
|
||||||
|
params.require(:sponsor_tier).permit(:tier, :user_id, :description)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,211 @@
|
||||||
|
class SponsorshipsController < ApplicationController
|
||||||
|
before_action :set_sponsorship, only: [:show, :edit, :update, :destroy]
|
||||||
|
# before_action :require_login, except: [:index, :stopped, :sponsored, :sponsoring, :stopped_sponsored, :stopped_sponsoring]
|
||||||
|
before_action :require_login, only: [:create, :edit, :update, :destroy]
|
||||||
|
skip_after_action :user_trace_log, only: [:update]
|
||||||
|
|
||||||
|
# GET /sponsorships
|
||||||
|
# GET /sponsorships.json
|
||||||
|
def index
|
||||||
|
@sponsorships = Sponsorship.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def stopped
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.all
|
||||||
|
end
|
||||||
|
|
||||||
|
def sponsored
|
||||||
|
if User.current.id == Integer(params[:id])
|
||||||
|
@sponsorships = Sponsorship.where('developer_id=?', params[:id])
|
||||||
|
else
|
||||||
|
@sponsorships = Sponsorship.where('developer_id=? AND visible=1', params[:id])
|
||||||
|
end
|
||||||
|
sort = params[:sort_by] || 'created_at'
|
||||||
|
sort_direction = params[:sort_direction] || 'desc'
|
||||||
|
@sponsorships = @sponsorships.reorder("#{sort} #{sort_direction}")
|
||||||
|
@total = @sponsorships.length
|
||||||
|
@sponsorships = kaminari_paginate(@sponsorships)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sponsoring
|
||||||
|
if User.current.id == Integer(params[:id])
|
||||||
|
@sponsorships = Sponsorship.where('sponsor_id=?', params[:id])
|
||||||
|
else
|
||||||
|
@sponsorships = Sponsorship.where('sponsor_id=? AND visible=1', params[:id])
|
||||||
|
end
|
||||||
|
sort = params[:sort_by] || 'created_at'
|
||||||
|
sort_direction = params[:sort_direction] || 'desc'
|
||||||
|
@sponsorships = @sponsorships.reorder("#{sort} #{sort_direction}")
|
||||||
|
@total = @sponsorships.length
|
||||||
|
@sponsorships = kaminari_paginate(@sponsorships)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stopped_sponsored
|
||||||
|
if User.current.id == Integer(params[:id])
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.where('developer_id=?', params[:id])
|
||||||
|
else
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.where('developer_id=? AND visible=1', params[:id])
|
||||||
|
end
|
||||||
|
sort = params[:sort_by] || 'created_at'
|
||||||
|
sort_direction = params[:sort_direction] || 'desc'
|
||||||
|
@stopped_sponsorships = @stopped_sponsorships.reorder("#{sort} #{sort_direction}")
|
||||||
|
@total = @stopped_sponsorships.length
|
||||||
|
@stopped_sponsorships = kaminari_paginate(@stopped_sponsorships)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stopped_sponsoring
|
||||||
|
if User.current.id == Integer(params[:id])
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.where('sponsor_id=?', params[:id])
|
||||||
|
else
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.where('sponsor_id=? AND visible=1', params[:id])
|
||||||
|
end
|
||||||
|
sort = params[:sort_by] || 'created_at'
|
||||||
|
sort_direction = params[:sort_direction] || 'desc'
|
||||||
|
@stopped_sponsorships = @stopped_sponsorships.reorder("#{sort} #{sort_direction}")
|
||||||
|
@total = @stopped_sponsorships.length
|
||||||
|
@stopped_sponsorships = kaminari_paginate(@stopped_sponsorships)
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /sponsorships/1
|
||||||
|
# GET /sponsorships/1.json
|
||||||
|
def show; end
|
||||||
|
|
||||||
|
# POST /sponsorships
|
||||||
|
# POST /sponsorships.json
|
||||||
|
def create
|
||||||
|
sponsor_id = User.current.id
|
||||||
|
check_sponsorship = Sponsorship.where('sponsor_id=? AND developer_id=?', sponsor_id, params[:developer_id])
|
||||||
|
|
||||||
|
@sponsorship = Sponsorship.new(sponsorship_params.merge({sponsor_id: sponsor_id}))
|
||||||
|
|
||||||
|
unless check_sponsorship.length.zero?
|
||||||
|
return render json: {status: -1, message: '您已经赞助了TA' }
|
||||||
|
end
|
||||||
|
|
||||||
|
if @sponsorship.pay && @sponsorship.save
|
||||||
|
if params[:single] && @sponsorship.stop
|
||||||
|
return render json: { status: 1, message: '赞助成功' }
|
||||||
|
elsif !params[:single]
|
||||||
|
User.current.update(sponsor_num: User.current.sponsor_num+1)
|
||||||
|
@sponsorship.developer.update(sponsored_num: @sponsorship.developer.sponsored_num + 1)
|
||||||
|
return render json: { status: 1, message: '赞助成功' }
|
||||||
|
else
|
||||||
|
return render json: { status: -1, message: '赞助失败' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# return render_result message: '赞助成功' if @sponsorship.save
|
||||||
|
# respond_to do |format|
|
||||||
|
# if check_sponsorship.length.zero? && @sponsorship.save
|
||||||
|
# format.html { redirect_to @sponsorship, notice: 'Sponsorship was successfully created.' }
|
||||||
|
# format.json { render :show, status: :created, location: @sponsorship }
|
||||||
|
# # render_result status=0, message="赞助成功"
|
||||||
|
# else
|
||||||
|
# format.html { render :new }
|
||||||
|
# format.json { render json: @sponsorship.errors, status: :unprocessable_entity }
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
end
|
||||||
|
|
||||||
|
# PATCH/PUT /sponsorships/1
|
||||||
|
# PATCH/PUT /sponsorships/1.json
|
||||||
|
def update
|
||||||
|
# respond_to do |format|
|
||||||
|
# if @sponsorship.update(sponsorship_params)
|
||||||
|
# format.html { redirect_to @sponsorship, notice: 'Sponsorship was successfully updated.' }
|
||||||
|
# format.json { render :show, status: :ok, location: @sponsorship }
|
||||||
|
# else
|
||||||
|
# format.html { render :edit }
|
||||||
|
# format.json { render json: @sponsorship.errors, status: :unprocessable_entity }
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
if @sponsorship.sponsor.id != current_user.id
|
||||||
|
return render json: {status: 401, message: '没有权限' }
|
||||||
|
end
|
||||||
|
old_value = old_value_to_hash(@sponsorship, params)
|
||||||
|
|
||||||
|
if @sponsorship.update(sponsorship_params)
|
||||||
|
user_trace_update_log(old_value)
|
||||||
|
render json: {status: 1, message: '修改成功' }
|
||||||
|
else
|
||||||
|
render json: {status: -1, message: '修改失败' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /sponsorships/1
|
||||||
|
# DELETE /sponsorships/1.json
|
||||||
|
def destroy
|
||||||
|
# @sponsorship.destroy
|
||||||
|
# respond_to do |format|
|
||||||
|
# format.html { redirect_to sponsorships_url, notice: 'Sponsorship was successfully destroyed.' }
|
||||||
|
# format.json { head :no_content }
|
||||||
|
# end
|
||||||
|
developer = @sponsorship.developer
|
||||||
|
sponsor = @sponsorship.sponsor
|
||||||
|
if (User.current.id == developer.id || User.current.id == sponsor.id) && developer.update(sponsored_num: developer.sponsored_num-1) && sponsor.update(sponsor_num: sponsor.sponsor_num-1) && @sponsorship.stop
|
||||||
|
render json: {status: 1, message: '终止成功'}
|
||||||
|
else
|
||||||
|
render json: {status: -1, message: '失败'}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def community_data
|
||||||
|
@sponsorships = Sponsorship.all
|
||||||
|
t1 = Time.now
|
||||||
|
t2 = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
@stopped_sponsorships = StoppedSponsorship.where('created_at >= ?', t2)
|
||||||
|
@community_data_array = to_array(@sponsorships, @stopped_sponsorships)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Use callbacks to share common setup or constraints between actions.
|
||||||
|
def set_sponsorship
|
||||||
|
@sponsorship = Sponsorship.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
# Only allow a list of trusted parameters through.
|
||||||
|
def sponsorship_params
|
||||||
|
params.require(:sponsorship).permit(:amount, :visible, :sponsor_id, :developer_id, :single, :page, :limit, :sort_by, :search)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_array(sponsorships, stopped_sponsorships)
|
||||||
|
t1 = Time.now
|
||||||
|
start_time = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
|
||||||
|
sponsor = Array.new(7)
|
||||||
|
sponsored = Array.new(7)
|
||||||
|
date = Array.new(7)
|
||||||
|
# date[0] = Time.new(start_time.year, start_time.month, start_time.day)
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
(0..6).each do |i|
|
||||||
|
# 更新日期,date[i]表示第i天0点
|
||||||
|
date[i] = Time.new(start_time.year, start_time.month, start_time.day + i)
|
||||||
|
end_time = Time.new(start_time.year, start_time.month, start_time.day + i+1)
|
||||||
|
|
||||||
|
sponsor_set = Set.new
|
||||||
|
sponsored_set = Set.new
|
||||||
|
|
||||||
|
# 所有创建时间早于今天23:59的sponsorship
|
||||||
|
today_sponsor = sponsorships.where('created_at < ?', end_time)
|
||||||
|
# 所有结束时间晚于今天0:00的stopped_sponsorship
|
||||||
|
today_stopped_sponsor = stopped_sponsorships.where('created_at <= ?', date[i])
|
||||||
|
today_sponsor.each do |s|
|
||||||
|
sponsor_set.add s.sponsor_id
|
||||||
|
sponsored_set.add s.developer_id
|
||||||
|
end
|
||||||
|
|
||||||
|
today_stopped_sponsor.each do |s|
|
||||||
|
sponsor_set.add s.sponsor_id
|
||||||
|
sponsored_set.add s.developer_id
|
||||||
|
end
|
||||||
|
|
||||||
|
sponsor[i] = sponsor_set.size
|
||||||
|
sponsored[i] = sponsored_set.size
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
Array[sponsor, sponsored, date]
|
||||||
|
end
|
||||||
|
end
|
|
@ -72,6 +72,10 @@ class UsersController < ApplicationController
|
||||||
@user = current_user
|
@user = current_user
|
||||||
# TODO 等消息上线再打开注释
|
# TODO 等消息上线再打开注释
|
||||||
#@tidding_count = unviewed_tiddings(current_user) if current_user.present?
|
#@tidding_count = unviewed_tiddings(current_user) if current_user.present?
|
||||||
|
#
|
||||||
|
if(@user.logged?)
|
||||||
|
@user.daily_reward
|
||||||
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger_error(e.message)
|
uid_logger_error(e.message)
|
||||||
missing_template
|
missing_template
|
||||||
|
@ -233,6 +237,15 @@ class UsersController < ApplicationController
|
||||||
render_ok
|
render_ok
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_description
|
||||||
|
@user = User.find params[:id]
|
||||||
|
if @user.id == User.current.id && @user.update(description: params[:description])
|
||||||
|
render_ok
|
||||||
|
else
|
||||||
|
render_error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def sync_user_info
|
def sync_user_info
|
||||||
user = User.find_by_login params[:login]
|
user = User.find_by_login params[:login]
|
||||||
return render_forbidden unless user === current_user
|
return render_forbidden unless user === current_user
|
||||||
|
|
|
@ -3,6 +3,7 @@ class VersionReleasesController < ApplicationController
|
||||||
before_action :set_user
|
before_action :set_user
|
||||||
before_action :require_login, except: [:index]
|
before_action :require_login, except: [:index]
|
||||||
before_action :find_version , only: [:edit, :update, :destroy]
|
before_action :find_version , only: [:edit, :update, :destroy]
|
||||||
|
skip_after_action :user_trace_log, only: [:update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call
|
version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call
|
||||||
|
@ -78,14 +79,14 @@ class VersionReleasesController < ApplicationController
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
begin
|
begin
|
||||||
version_params = releases_params
|
version_params = releases_params
|
||||||
|
old_value = old_value_to_hash(@version, version_params)
|
||||||
if @version.update_attributes!(version_params)
|
if @version.update_attributes!(version_params)
|
||||||
create_attachments(params[:attachment_ids], @version) if params[:attachment_ids].present?
|
create_attachments(params[:attachment_ids], @version) if params[:attachment_ids].present?
|
||||||
git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
|
git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call
|
||||||
unless git_version_release
|
unless git_version_release
|
||||||
raise Error, "更新失败"
|
raise Error, "更新失败"
|
||||||
end
|
end
|
||||||
|
user_trace_update_log(old_value)
|
||||||
normal_status(0, "更新成功")
|
normal_status(0, "更新成功")
|
||||||
else
|
else
|
||||||
normal_status(-1, "更新失败")
|
normal_status(-1, "更新失败")
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
class WalletsController < ApplicationController
|
||||||
|
before_action :require_login, except: :community_data
|
||||||
|
|
||||||
|
def balance
|
||||||
|
user = User.find_by_id(params[:id])
|
||||||
|
@wallet = user.get_wallet
|
||||||
|
end
|
||||||
|
|
||||||
|
def coin_changes
|
||||||
|
user = User.find_by_id(params[:id])
|
||||||
|
@wallet = user.get_wallet
|
||||||
|
if params[:category] == 'all'
|
||||||
|
scope = CoinChange.where('to_wallet_id = ? OR from_wallet_id = ?', @wallet.id, @wallet.id)
|
||||||
|
elsif params[:category] == 'income'
|
||||||
|
# @coin_changes = CoinChange.where('to_wallet_id = ?', @wallet.id).limit(100)
|
||||||
|
scope = @wallet.income
|
||||||
|
elsif params[:category] == 'outcome'
|
||||||
|
scope = @wallet.outcome
|
||||||
|
end
|
||||||
|
|
||||||
|
sort = params[:sort_by] || "created_at"
|
||||||
|
sort_direction = params[:sort_direction] || "desc"
|
||||||
|
scope = scope.reorder("#{sort} #{sort_direction}") unless scope.nil?
|
||||||
|
|
||||||
|
@total = 0
|
||||||
|
@total = scope.length unless scope.nil?
|
||||||
|
@coin_changes = kaminari_paginate(scope) unless scope.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def balance_chart
|
||||||
|
user = User.find_by_id(params[:id])
|
||||||
|
@wallet = user.get_wallet
|
||||||
|
scope = CoinChange.where('to_wallet_id = ? OR from_wallet_id = ?', @wallet.id, @wallet.id)
|
||||||
|
t1 = Time.now
|
||||||
|
t2 = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
@balance_chart_data = scope.where('created_at > ? AND created_at < ?', t2, t1)
|
||||||
|
@balance_chart_array = to_array(@balance_chart_data, @wallet.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def community_data
|
||||||
|
t1 = Time.now
|
||||||
|
t2 = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
coin_changes = CoinChange.where('created_at >= ?', t2)
|
||||||
|
@community_data_array = community_data_to_array(coin_changes)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def to_array(data, id)
|
||||||
|
t1 = Time.now
|
||||||
|
start_time = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
end_time = Time.new(start_time.year, start_time.month, start_time.day + 1)
|
||||||
|
|
||||||
|
income = Array.new(7, 0) # 收入、支出
|
||||||
|
outcome = Array.new(7, 0)
|
||||||
|
date = Array.new(7)
|
||||||
|
date[0] = Time.new(start_time.year, start_time.month, start_time.day)
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
data.each do |i|
|
||||||
|
# 更新日期
|
||||||
|
until (i.created_at >= start_time) && (i.created_at < end_time)
|
||||||
|
index += 1
|
||||||
|
start_time = end_time
|
||||||
|
end_time = Time.new(start_time.year, start_time.month, start_time.day + 1)
|
||||||
|
date[index] = Time.new(start_time.year, start_time.month, start_time.day)
|
||||||
|
end
|
||||||
|
|
||||||
|
if i.from_wallet_id == id
|
||||||
|
outcome[index] += i.amount
|
||||||
|
else
|
||||||
|
next if params[:sponsor] == true && i.from_wallet_id.nil?
|
||||||
|
income[index] += i.amount
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
until end_time >= Time.now
|
||||||
|
index += 1
|
||||||
|
start_time = end_time
|
||||||
|
end_time = Time.new(start_time.year, start_time.month, start_time.day + 1)
|
||||||
|
date[index] = Time.new(start_time.year, start_time.month, start_time.day)
|
||||||
|
end
|
||||||
|
|
||||||
|
Array[income, outcome, date]
|
||||||
|
end
|
||||||
|
|
||||||
|
def community_data_to_array(coin_changes)
|
||||||
|
t1 = Time.now
|
||||||
|
start_time = Time.new(t1.year, t1.month, t1.day - 6)
|
||||||
|
|
||||||
|
nums = Array.new(7, 0)
|
||||||
|
date = Array.new(7)
|
||||||
|
end_time = Array.new(7)
|
||||||
|
# date[0] = Time.new(start_time.year, start_time.month, start_time.day)
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
(0..6).each do |i|
|
||||||
|
# 更新日期,date[i]表示第i天0点
|
||||||
|
date[i] = Time.new(start_time.year, start_time.month, start_time.day + i)
|
||||||
|
end_time[i] = Time.new(start_time.year, start_time.month, start_time.day + i+1)
|
||||||
|
end
|
||||||
|
|
||||||
|
coin_changes.each do |cc|
|
||||||
|
(0..6).each do |i|
|
||||||
|
if !cc.from_wallet_id.nil? && cc.created_at>=date[i] && cc.created_at<end_time[i]
|
||||||
|
nums[i] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Array[nums, date]
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module LogHelper
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module SponsorTiersHelper
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module SponsorshipsHelper
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
module UpdateHelper
|
||||||
|
def old_value_to_hash(old_value, params)
|
||||||
|
params = params.dup.stringify_keys
|
||||||
|
old_value.attributes.select { |key, value| params.key?(key) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module WalletsHelper
|
||||||
|
end
|
|
@ -0,0 +1,15 @@
|
||||||
|
class MonthlyPaymentWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
include Sidetiq::Schedulable
|
||||||
|
|
||||||
|
recurrence do
|
||||||
|
minutely(2)
|
||||||
|
# monthly.day_of_month(12) #每月的12号0点执行
|
||||||
|
# monthly.day_of_month(23).hour_of_day(20) #每月的12号1点执行
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform(*args)
|
||||||
|
Sponsorship.monthly_payment
|
||||||
|
puts Time.now, 'sponsor payment done'
|
||||||
|
end
|
||||||
|
end
|
|
@ -45,7 +45,12 @@
|
||||||
# is_shixun_marker :boolean default("0")
|
# is_shixun_marker :boolean default("0")
|
||||||
# is_sync_pwd :boolean default("1")
|
# is_sync_pwd :boolean default("1")
|
||||||
# watchers_count :integer default("0")
|
# watchers_count :integer default("0")
|
||||||
|
# sponsor_certification :integer default("0")
|
||||||
|
# sponsor_num :integer default("0")
|
||||||
|
# sponsored_num :integer default("0")
|
||||||
|
# description :text(65535)
|
||||||
# devops_step :integer default("0")
|
# devops_step :integer default("0")
|
||||||
|
# award_time :datetime
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: coin_changes
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# amount :integer
|
||||||
|
# description :string(255)
|
||||||
|
# reason :string(255)
|
||||||
|
# to_wallet_id :integer
|
||||||
|
# from_wallet_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class CoinChange < ApplicationRecord
|
||||||
|
belongs_to :to_wallet, class_name: 'Wallet'
|
||||||
|
belongs_to :from_wallet, class_name: 'Wallet', optional: true
|
||||||
|
validates :amount, presence: true
|
||||||
|
end
|
|
@ -11,6 +11,11 @@
|
||||||
# sync_subject :boolean default("0")
|
# sync_subject :boolean default("0")
|
||||||
# sync_shixun :boolean default("0")
|
# sync_shixun :boolean default("0")
|
||||||
#
|
#
|
||||||
|
# Indexes
|
||||||
|
#
|
||||||
|
# index_laboratories_on_identifier (identifier) UNIQUE
|
||||||
|
# index_laboratories_on_school_id (school_id)
|
||||||
|
#
|
||||||
|
|
||||||
class Laboratory < ApplicationRecord
|
class Laboratory < ApplicationRecord
|
||||||
belongs_to :school, optional: true
|
belongs_to :school, optional: true
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
# laboratory_id :integer
|
# laboratory_id :integer
|
||||||
# config :text(65535)
|
# config :text(65535)
|
||||||
#
|
#
|
||||||
|
# Indexes
|
||||||
|
#
|
||||||
|
# index_laboratory_settings_on_laboratory_id (laboratory_id)
|
||||||
|
#
|
||||||
|
|
||||||
class LaboratorySetting < ApplicationRecord
|
class LaboratorySetting < ApplicationRecord
|
||||||
belongs_to :laboratory
|
belongs_to :laboratory
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
# content :text(65535)
|
# content :text(65535)
|
||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# is_secret :boolean default("0")
|
|
||||||
#
|
#
|
||||||
|
|
||||||
class License < ApplicationRecord
|
class License < ApplicationRecord
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
# course_group_id :integer default("0")
|
# course_group_id :integer default("0")
|
||||||
# is_collect :integer default("1")
|
# is_collect :integer default("1")
|
||||||
# graduation_group_id :integer default("0")
|
# graduation_group_id :integer default("0")
|
||||||
# is_apply_signature :boolean default("0")
|
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -45,7 +45,12 @@
|
||||||
# is_shixun_marker :boolean default("0")
|
# is_shixun_marker :boolean default("0")
|
||||||
# is_sync_pwd :boolean default("1")
|
# is_sync_pwd :boolean default("1")
|
||||||
# watchers_count :integer default("0")
|
# watchers_count :integer default("0")
|
||||||
|
# sponsor_certification :integer default("0")
|
||||||
|
# sponsor_num :integer default("0")
|
||||||
|
# sponsored_num :integer default("0")
|
||||||
|
# description :text(65535)
|
||||||
# devops_step :integer default("0")
|
# devops_step :integer default("0")
|
||||||
|
# award_time :datetime
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: passed_waitlists
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# applicant_id :string(255)
|
||||||
|
# integer :string(255)
|
||||||
|
# reviewer_id :string(255)
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class PassedWaitlist < ApplicationRecord
|
||||||
|
belongs_to :applicant, class_name: 'User'
|
||||||
|
belongs_to :reviewer, class_name: 'User'
|
||||||
|
end
|
|
@ -74,6 +74,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Project < ApplicationRecord
|
class Project < ApplicationRecord
|
||||||
include Matchable
|
include Matchable
|
||||||
include Publicable
|
include Publicable
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: sponsor_tiers
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# tier :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# description :string(255) default("")
|
||||||
|
# user_id :integer
|
||||||
|
#
|
||||||
|
|
||||||
|
class SponsorTier < ApplicationRecord
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,49 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: sponsorships
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# amount :integer
|
||||||
|
# visible :integer
|
||||||
|
# sponsor_id :integer
|
||||||
|
# developer_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# accumulate :integer default("0")
|
||||||
|
#
|
||||||
|
|
||||||
|
class Sponsorship < ApplicationRecord
|
||||||
|
belongs_to :sponsor, class_name: 'User'
|
||||||
|
belongs_to :developer, class_name: 'User'
|
||||||
|
validates :amount, presence: true
|
||||||
|
|
||||||
|
def stop
|
||||||
|
stopped_sponsorship = StoppedSponsorship.new(developer_id: developer_id, sponsor_id: sponsor_id, start_time: created_at, amount: amount, visible: visible, accumulate: accumulate)
|
||||||
|
stopped_sponsorship.save && destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
def pay
|
||||||
|
sponsor_wallet = sponsor.get_wallet
|
||||||
|
developer_wallet = developer.get_wallet
|
||||||
|
|
||||||
|
success = false
|
||||||
|
Wallet.transaction do
|
||||||
|
success = sponsor_wallet.pay(amount)
|
||||||
|
if success
|
||||||
|
developer_wallet.receive(amount)
|
||||||
|
update(accumulate: self.accumulate += amount)
|
||||||
|
reason = "#{sponsor.full_name}向#{developer.full_name}的赞助支付。"
|
||||||
|
coinchange = CoinChange.new(amount: amount, reason: reason, to_wallet_id: developer_wallet.id, from_wallet_id: sponsor_wallet.id)
|
||||||
|
return true if coinchange.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
success
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.monthly_payment
|
||||||
|
sponsorships = Sponsorship.all
|
||||||
|
sponsorships.each do |s|
|
||||||
|
s.stop unless s.pay
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,20 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: stopped_sponsorships
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# amount :integer
|
||||||
|
# sponsor_id :integer
|
||||||
|
# developer_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# start_time :datetime
|
||||||
|
# visible :integer
|
||||||
|
# accumulate :integer default("0")
|
||||||
|
#
|
||||||
|
|
||||||
|
class StoppedSponsorship < ApplicationRecord
|
||||||
|
belongs_to :sponsor, class_name: 'User'
|
||||||
|
belongs_to :developer, class_name: 'User'
|
||||||
|
validates :amount, presence: true
|
||||||
|
end
|
|
@ -14,6 +14,7 @@
|
||||||
# tokens_value (value) UNIQUE
|
# tokens_value (value) UNIQUE
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -45,7 +45,12 @@
|
||||||
# is_shixun_marker :boolean default("0")
|
# is_shixun_marker :boolean default("0")
|
||||||
# is_sync_pwd :boolean default("1")
|
# is_sync_pwd :boolean default("1")
|
||||||
# watchers_count :integer default("0")
|
# watchers_count :integer default("0")
|
||||||
|
# sponsor_certification :integer default("0")
|
||||||
|
# sponsor_num :integer default("0")
|
||||||
|
# sponsored_num :integer default("0")
|
||||||
|
# description :text(65535)
|
||||||
# devops_step :integer default("0")
|
# devops_step :integer default("0")
|
||||||
|
# award_time :datetime
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
@ -158,6 +163,18 @@ class User < Owner
|
||||||
has_many :project_trends, dependent: :destroy
|
has_many :project_trends, dependent: :destroy
|
||||||
has_many :oauths , dependent: :destroy
|
has_many :oauths , dependent: :destroy
|
||||||
|
|
||||||
|
# sponsor
|
||||||
|
has_many :as_sponsors, class_name: 'Sponsorship', foreign_key: 'sponsor_id', dependent: :destroy
|
||||||
|
has_many :as_sponsored, class_name: 'Sponsorship', foreign_key: 'developer_id', dependent: :destroy
|
||||||
|
has_many :stopped_sponsors, class_name: 'StoppedSponsorship', foreign_key: 'sponsor_id', dependent: :destroy
|
||||||
|
has_many :stopped_sponsored, class_name: 'StoppedSponsorship', foreign_key: 'developer_id', dependent: :destroy
|
||||||
|
has_many :sponsor_tier, dependent: :destroy
|
||||||
|
has_one :wallet, dependent: :destroy
|
||||||
|
has_many :waitlist, class_name: 'Waitlist', foreign_key: 'reviewer_id'
|
||||||
|
has_many :passed_waitlist, class_name: 'PassedWaitlist', foreign_key: 'reviewer_id' #as reviewer
|
||||||
|
has_one :application, class_name: 'Waitlist', foreign_key: 'applicant_id'
|
||||||
|
has_one :passed_application, class_name: 'PassedWaitlist', foreign_key: 'applicant_id'
|
||||||
|
|
||||||
has_many :organization_users, dependent: :destroy
|
has_many :organization_users, dependent: :destroy
|
||||||
has_many :organizations, through: :organization_users
|
has_many :organizations, through: :organization_users
|
||||||
|
|
||||||
|
@ -592,6 +609,7 @@ class User < Owner
|
||||||
# Returns the user who matches the given autologin +key+ or nil
|
# Returns the user who matches the given autologin +key+ or nil
|
||||||
def self.try_to_autologin(key)
|
def self.try_to_autologin(key)
|
||||||
user = Token.find_active_user('autologin', key)
|
user = Token.find_active_user('autologin', key)
|
||||||
|
# user.daily_reward if user
|
||||||
user.update(last_login_on: Time.now) if user
|
user.update(last_login_on: Time.now) if user
|
||||||
user
|
user
|
||||||
end
|
end
|
||||||
|
@ -738,6 +756,63 @@ class User < Owner
|
||||||
laboratory_id.present? && laboratory_id != 1
|
laboratory_id.present? && laboratory_id != 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_wallet
|
||||||
|
# if wallet.nil?
|
||||||
|
# Wallet.transaction(isolation: :serializable) do
|
||||||
|
# if wallet.nil?
|
||||||
|
# create_wallet(balance: 100)
|
||||||
|
# reason = "系统初始赠送"
|
||||||
|
# CoinChange.create(amount: amount, reason: reason, to_wallet_id: wallet.id)
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
if wallet.nil?
|
||||||
|
Wallet.transaction(isolation: :serializable) do
|
||||||
|
if wallet.nil?
|
||||||
|
create_wallet(balance: 100)
|
||||||
|
reason = "系统初始赠送"
|
||||||
|
CoinChange.create(amount: 100, reason: reason, to_wallet_id: wallet.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
wallet
|
||||||
|
end
|
||||||
|
|
||||||
|
def daily_reward
|
||||||
|
t1 = Time.now
|
||||||
|
t2 = Time.new(t1.year, t1.month, t1.day)
|
||||||
|
|
||||||
|
if(award_time.nil? or t2 > award_time)
|
||||||
|
self.update_column(:award_time, Time.now)
|
||||||
|
amount = 2
|
||||||
|
user_wallet = get_wallet
|
||||||
|
user_wallet.receive(amount)
|
||||||
|
reason = "每日登录奖励"
|
||||||
|
CoinChange.create(amount: amount, reason: reason, to_wallet_id: user_wallet.id)
|
||||||
|
end
|
||||||
|
=begin
|
||||||
|
award = false
|
||||||
|
if(last_login_on.nil? or t2 > last_login_on)
|
||||||
|
User.transaction(isolation: :serializable) do
|
||||||
|
# User.transaction do
|
||||||
|
if(self.last_login_on.nil? or t2 > self.last_login_on)
|
||||||
|
self.update_column(:last_login_on, Time.now)
|
||||||
|
award = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if(award)
|
||||||
|
amount = 2
|
||||||
|
user_wallet = get_wallet
|
||||||
|
user_wallet.update(balance: user_wallet.balance += amount)
|
||||||
|
reason = "每日登录奖励"
|
||||||
|
CoinChange.create(amount: amount, reason: reason, to_wallet_id: user_wallet.id)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# puts("#################################NOOO DAILY REWARD, #{last_login_on}, #{t2}")
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
def validate_password_length
|
def validate_password_length
|
||||||
# 管理员的初始密码是5位
|
# 管理员的初始密码是5位
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: waitlists
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# applicant_id :string(255)
|
||||||
|
# integer :string(255)
|
||||||
|
# reviewer_id :string(255)
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class Waitlist < ApplicationRecord
|
||||||
|
belongs_to :applicant, class_name: 'User'
|
||||||
|
belongs_to :reviewer, class_name: 'User', optional: true
|
||||||
|
end
|
|
@ -0,0 +1,42 @@
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: wallets
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# balance :integer
|
||||||
|
# user_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class Wallet < ApplicationRecord
|
||||||
|
belongs_to :user
|
||||||
|
has_many :outcome, class_name: 'CoinChange', foreign_key: 'from_wallet_id', dependent: :destroy
|
||||||
|
has_many :income, class_name: 'CoinChange', foreign_key: 'to_wallet_id', dependent: :destroy
|
||||||
|
validates :balance, presence: true
|
||||||
|
@@wallet_lock = Mutex.new
|
||||||
|
|
||||||
|
def receive(amount)
|
||||||
|
with_lock do
|
||||||
|
self.balance += amount
|
||||||
|
save!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def pay(amount)
|
||||||
|
with_lock do
|
||||||
|
if self.balance < amount
|
||||||
|
reload
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
self.balance -= amount
|
||||||
|
save!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.wallet_lock
|
||||||
|
@@wallet_lock
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
json.array! @file_list
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
<%= simple_form_for(@sponsor_tier) do |f| %>
|
||||||
|
<%= f.error_notification %>
|
||||||
|
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
||||||
|
|
||||||
|
<div class="form-inputs">
|
||||||
|
<%= f.input :tier %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions">
|
||||||
|
<%= f.button :submit %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,2 @@
|
||||||
|
json.extract! sponsor_tier, :id, :tier, :description, :created_at, :updated_at
|
||||||
|
json.url sponsor_tier_url(sponsor_tier, format: :json)
|
|
@ -0,0 +1,6 @@
|
||||||
|
<h1>Editing Sponsor Tier</h1>
|
||||||
|
|
||||||
|
<%= render 'form', sponsor_tier: @sponsor_tier %>
|
||||||
|
|
||||||
|
<%= link_to 'Show', @sponsor_tier %> |
|
||||||
|
<%= link_to 'Back', sponsor_tiers_path %>
|
|
@ -0,0 +1 @@
|
||||||
|
json.array! @sponsor_tiers, partial: "sponsor_tiers/sponsor_tier", as: :sponsor_tier
|
|
@ -0,0 +1,5 @@
|
||||||
|
<h1>New Sponsor Tier</h1>
|
||||||
|
|
||||||
|
<%= render 'form', sponsor_tier: @sponsor_tier %>
|
||||||
|
|
||||||
|
<%= link_to 'Back', sponsor_tiers_path %>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<p id="notice"><%= notice %></p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Tier:</strong>
|
||||||
|
<%= @sponsor_tier.tier %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= link_to 'Edit', edit_sponsor_tier_path(@sponsor_tier) %> |
|
||||||
|
<%= link_to 'Back', sponsor_tiers_path %>
|
|
@ -0,0 +1,9 @@
|
||||||
|
json.tier do
|
||||||
|
json.partial! "sponsor_tiers/sponsor_tier", sponsor_tier: @sponsor_tier
|
||||||
|
end
|
||||||
|
if @check_sponsorship.nil? || @check_sponsorship.length.zero?
|
||||||
|
json.is_sponsoring false
|
||||||
|
else
|
||||||
|
json.is_sponsoring true
|
||||||
|
json.sponsorship_id @check_sponsorship[0].id
|
||||||
|
end
|
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
<%= simple_form_for(@sponsorship) do |f| %>
|
||||||
|
<%= f.error_notification %>
|
||||||
|
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
||||||
|
|
||||||
|
<div class="form-inputs">
|
||||||
|
<%= f.input :amount %>
|
||||||
|
<%= f.input :visible %>
|
||||||
|
<%= f.input :sponsor_id %>
|
||||||
|
<%= f.input :developer_id %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions">
|
||||||
|
<%= f.button :submit %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,2 @@
|
||||||
|
json.extract! sponsorship, :id, :amount, :visible, :sponsor_id, :developer_id, :created_at, :updated_at, :accumulate
|
||||||
|
json.url sponsorship_url(sponsorship, format: :json)
|
|
@ -0,0 +1,12 @@
|
||||||
|
json.sponsor do
|
||||||
|
json.array! (0..6).each do |i|
|
||||||
|
json.y @community_data_array[0][i]
|
||||||
|
json.x @community_data_array[2][i].to_date
|
||||||
|
end
|
||||||
|
end
|
||||||
|
json.sponsored do
|
||||||
|
json.array! (0..6).each do |i|
|
||||||
|
json.y @community_data_array[1][i]
|
||||||
|
json.x @community_data_array[2][i].to_date
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
<h1>Editing Sponsorship</h1>
|
||||||
|
|
||||||
|
<%= render 'form', sponsorship: @sponsorship %>
|
||||||
|
|
||||||
|
<%= link_to 'Show', @sponsorship %> |
|
||||||
|
<%= link_to 'Back', sponsorships_path %>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<p id="notice"><%= notice %></p>
|
||||||
|
|
||||||
|
<h1>Sponsorships</h1>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Amount</th>
|
||||||
|
<th>Visible</th>
|
||||||
|
<th>Sponsor</th>
|
||||||
|
<th>Developer</th>
|
||||||
|
<th colspan="3"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<% @sponsorships.each do |sponsorship| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= sponsorship.amount %></td>
|
||||||
|
<td><%= sponsorship.visible %></td>
|
||||||
|
<td><%= sponsorship.sponsor_id %></td>
|
||||||
|
<td><%= sponsorship.developer_id %></td>
|
||||||
|
<td><%= link_to 'Show', sponsorship %></td>
|
||||||
|
<td><%= link_to 'Edit', edit_sponsorship_path(sponsorship) %></td>
|
||||||
|
<td><%= link_to 'Destroy', sponsorship, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<%= link_to 'New Sponsorship', new_sponsorship_path %>
|
|
@ -0,0 +1 @@
|
||||||
|
json.array! @sponsorships, partial: "sponsorships/sponsorship", as: :sponsorship
|
|
@ -0,0 +1,5 @@
|
||||||
|
<h1>New Sponsorship</h1>
|
||||||
|
|
||||||
|
<%= render 'form', sponsorship: @sponsorship %>
|
||||||
|
|
||||||
|
<%= link_to 'Back', sponsorships_path %>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<p id="notice"><%= notice %></p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Amount:</strong>
|
||||||
|
<%= @sponsorship.amount %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Visible:</strong>
|
||||||
|
<%= @sponsorship.visible %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Sponsor:</strong>
|
||||||
|
<%= @sponsorship.sponsor_id %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Developer:</strong>
|
||||||
|
<%= @sponsorship.developer_id %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= link_to 'Edit', edit_sponsorship_path(@sponsorship) %> |
|
||||||
|
<%= link_to 'Back', sponsorships_path %>
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! "sponsorships/sponsorship", sponsorship: @sponsorship
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.count @total
|
||||||
|
json.sponsorships do
|
||||||
|
json.array! @sponsorships do |sponsorship|
|
||||||
|
json.id sponsorship.id
|
||||||
|
json.start_time sponsorship.created_at.to_date
|
||||||
|
# json.stop_time '-'
|
||||||
|
if sponsorship.visible.zero?
|
||||||
|
json.visible false
|
||||||
|
else
|
||||||
|
json.visible true
|
||||||
|
end
|
||||||
|
json.amount sponsorship.amount
|
||||||
|
sponsor = sponsorship.sponsor
|
||||||
|
json.image_url url_to_avatar(sponsor)
|
||||||
|
json.username sponsor.full_name
|
||||||
|
json.user_id sponsor.id
|
||||||
|
json.login sponsor.login
|
||||||
|
json.accumulate sponsorship.accumulate
|
||||||
|
json.sponsor_id sponsorship.sponsor.id
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.count @total
|
||||||
|
json.sponsorships do
|
||||||
|
json.array! @sponsorships do |sponsorship|
|
||||||
|
json.id sponsorship.id
|
||||||
|
json.start_time sponsorship.created_at.to_date
|
||||||
|
# json.stop_time '-'
|
||||||
|
if sponsorship.visible.zero?
|
||||||
|
json.visible false
|
||||||
|
else
|
||||||
|
json.visible true
|
||||||
|
end
|
||||||
|
json.amount sponsorship.amount
|
||||||
|
sponsor = sponsorship.developer
|
||||||
|
json.image_url url_to_avatar(sponsor)
|
||||||
|
json.username sponsor.full_name
|
||||||
|
json.user_id sponsor.id
|
||||||
|
json.login sponsor.login
|
||||||
|
json.accumulate sponsorship.accumulate
|
||||||
|
json.sponsor_id sponsorship.sponsor.id
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
json.array! @stopped_sponsorships do |sponsorship|
|
||||||
|
json.id sponsorship.id
|
||||||
|
json.amount sponsorship.amount
|
||||||
|
json.visible sponsorship.visible
|
||||||
|
json.sponsor_id sponsorship.sponsor_id
|
||||||
|
json.developer_id sponsorship.developer_id
|
||||||
|
json.start_time sponsorship.start_time
|
||||||
|
json.created_at sponsorship.created_at
|
||||||
|
json.updated_at sponsorship.updated_at
|
||||||
|
json.accumulate sponsorship.accumulate
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.count @total
|
||||||
|
json.sponsorships do
|
||||||
|
json.array! @stopped_sponsorships do |sponsorship|
|
||||||
|
json.id sponsorship.id
|
||||||
|
json.start_time sponsorship.start_time.to_date
|
||||||
|
json.stop_time sponsorship.created_at.to_date
|
||||||
|
if sponsorship.visible.zero?
|
||||||
|
json.visible false
|
||||||
|
else
|
||||||
|
json.visible true
|
||||||
|
end
|
||||||
|
json.amount sponsorship.amount
|
||||||
|
sponsor = sponsorship.sponsor
|
||||||
|
json.image_url url_to_avatar(sponsor)
|
||||||
|
json.username sponsor.full_name
|
||||||
|
json.user_id sponsor.id
|
||||||
|
json.login sponsor.login
|
||||||
|
json.accumulate sponsorship.accumulate
|
||||||
|
json.sponsor_id sponsorship.sponsor.id
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.count @total
|
||||||
|
json.sponsorships do
|
||||||
|
json.array! @stopped_sponsorships do |sponsorship|
|
||||||
|
json.id sponsorship.id
|
||||||
|
json.start_time sponsorship.start_time.to_date
|
||||||
|
json.stop_time sponsorship.created_at.to_date
|
||||||
|
if sponsorship.visible.zero?
|
||||||
|
json.visible false
|
||||||
|
else
|
||||||
|
json.visible true
|
||||||
|
end
|
||||||
|
json.amount sponsorship.amount
|
||||||
|
sponsor = sponsorship.developer
|
||||||
|
json.image_url url_to_avatar(sponsor)
|
||||||
|
json.username sponsor.full_name
|
||||||
|
json.user_id sponsor.id
|
||||||
|
json.login sponsor.login
|
||||||
|
json.accumulate sponsorship.accumulate
|
||||||
|
json.sponsor_id sponsorship.sponsor.id
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,5 +13,6 @@ json.need_edit_info @user.need_edit_info?
|
||||||
json.email @user.mail
|
json.email @user.mail
|
||||||
json.profile_completed @user.profile_completed?
|
json.profile_completed @user.profile_completed?
|
||||||
json.professional_certification @user.professional_certification
|
json.professional_certification @user.professional_certification
|
||||||
|
json.description @user.description
|
||||||
json.devops_step @user.devops_step
|
json.devops_step @user.devops_step
|
||||||
json.ci_certification @user.ci_certification?
|
json.ci_certification @user.ci_certification?
|
||||||
|
|
|
@ -16,3 +16,4 @@ json.user_org_count @user_org_count
|
||||||
json.common_projects_count @projects_common_count
|
json.common_projects_count @projects_common_count
|
||||||
json.mirror_projects_count @projects_mirrior_count
|
json.mirror_projects_count @projects_mirrior_count
|
||||||
json.sync_mirror_projects_count @projects_sync_mirrior_count
|
json.sync_mirror_projects_count @projects_sync_mirrior_count
|
||||||
|
json.description @user.description
|
|
@ -0,0 +1,2 @@
|
||||||
|
<h1>Wallets#balance</h1>
|
||||||
|
<p>Find me in app/views/wallets/balance.html.erb</p>
|
|
@ -0,0 +1 @@
|
||||||
|
json.balance @wallet.balance
|
|
@ -0,0 +1,12 @@
|
||||||
|
json.income do
|
||||||
|
json.array! (0..6).each do |i|
|
||||||
|
json.y @balance_chart_array[0][i]
|
||||||
|
json.x @balance_chart_array[2][i].to_date
|
||||||
|
end
|
||||||
|
end
|
||||||
|
json.outcome do
|
||||||
|
json.array! (0..6).each do |i|
|
||||||
|
json.y @balance_chart_array[1][i]
|
||||||
|
json.x @balance_chart_array[2][i].to_date
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,25 @@
|
||||||
|
json.balance @wallet.balance
|
||||||
|
json.count @total
|
||||||
|
json.coin_changes do
|
||||||
|
json.array! @coin_changes do |coin_change|
|
||||||
|
from_user = if coin_change.from_wallet.nil?
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
coin_change.from_wallet.user
|
||||||
|
end
|
||||||
|
to_user = coin_change.to_wallet.user
|
||||||
|
json.amount coin_change.amount
|
||||||
|
if !from_user.nil?
|
||||||
|
json.from_user from_user.full_name
|
||||||
|
json.from_user_login from_user.login
|
||||||
|
else
|
||||||
|
json.from_user '系统'
|
||||||
|
json.from_user_login '-'
|
||||||
|
end
|
||||||
|
json.to_user to_user.full_name
|
||||||
|
json.to_user_login to_user.login
|
||||||
|
json.description coin_change.description
|
||||||
|
json.reason coin_change.reason
|
||||||
|
json.date coin_change.created_at.to_date
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,4 @@
|
||||||
|
json.array! (0..6).each do |i|
|
||||||
|
json.y @community_data_array[0][i]
|
||||||
|
json.x @community_data_array[1][i].to_date
|
||||||
|
end
|
|
@ -55,6 +55,9 @@ Rails.application.configure do
|
||||||
# Suppress logger output for asset requests.
|
# Suppress logger output for asset requests.
|
||||||
config.assets.quiet = true
|
config.assets.quiet = true
|
||||||
|
|
||||||
|
# config.logger = Logger.new("#{Rails.root}/log/#{Rails.env}#{Date.today.to_s}.log", "daily")
|
||||||
|
# config.logger.level = Logger::INFO
|
||||||
|
|
||||||
# config.assets.prefix = '/dev-assets'
|
# config.assets.prefix = '/dev-assets'
|
||||||
|
|
||||||
# Raises error for missing translations
|
# Raises error for missing translations
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
require 'multi_logger'
|
||||||
|
formatter = Proc.new{|severity, time, progname, msg|
|
||||||
|
formatted_severity = sprintf("%-5s",severity.to_s)
|
||||||
|
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
# "[#{formatted_severity} #{formatted_time} #{$$}] #{msg.to_s.strip}\n"
|
||||||
|
"#{msg.to_s.strip}\n"
|
||||||
|
}
|
||||||
|
MultiLogger.add_logger('user_trace', formatter: formatter, shift_age: 'daily')
|
||||||
|
Rails.logger.user_trace.level = Logger::INFO
|
|
@ -24,6 +24,28 @@ Rails.application.routes.draw do
|
||||||
resources :edu_settings
|
resources :edu_settings
|
||||||
|
|
||||||
scope '/api' do
|
scope '/api' do
|
||||||
|
get 'wallets/balance'
|
||||||
|
get 'wallets/coin_changes'
|
||||||
|
get 'wallets/balance_chart'
|
||||||
|
|
||||||
|
get 'sponsorships/community_data'
|
||||||
|
get 'wallets/community_data'
|
||||||
|
|
||||||
|
get 'log/list', to: 'log#list'
|
||||||
|
# post 'log/download', to: 'log#download'
|
||||||
|
match 'log/download/:filename' => 'log#download', :constraints => { filename: /[0-z\.]+/ }, via:[:get]
|
||||||
|
|
||||||
|
resources :sponsor_tiers, only: [:index, :show, :create, :update, :destroy]
|
||||||
|
resources :sponsorships, only: [:index, :show, :create, :update, :destroy] do
|
||||||
|
collection do
|
||||||
|
get :sponsored
|
||||||
|
get :sponsoring
|
||||||
|
get :stopped_sponsored
|
||||||
|
get :stopped_sponsoring
|
||||||
|
get :stopped
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
namespace :ci do
|
namespace :ci do
|
||||||
resources :languages, only: [:index, :show] do
|
resources :languages, only: [:index, :show] do
|
||||||
collection do
|
collection do
|
||||||
|
@ -198,6 +220,7 @@ Rails.application.routes.draw do
|
||||||
get :projects
|
get :projects
|
||||||
get :watch_users
|
get :watch_users
|
||||||
get :fan_users
|
get :fan_users
|
||||||
|
put :update_description
|
||||||
end
|
end
|
||||||
collection do
|
collection do
|
||||||
post :following
|
post :following
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Use this file to easily define all of your cron jobs.
|
||||||
|
#
|
||||||
|
# It's helpful, but not entirely necessary to understand cron before proceeding.
|
||||||
|
# http://en.wikipedia.org/wiki/Cron
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# set :output, "/path/to/my/cron_log.log"
|
||||||
|
#
|
||||||
|
# every 2.hours do
|
||||||
|
# command "/usr/bin/some_great_command"
|
||||||
|
# runner "MyModel.some_method"
|
||||||
|
# rake "some:great:rake:task"
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# every 4.days do
|
||||||
|
# runner "AnotherModel.prune_old_records"
|
||||||
|
# end
|
||||||
|
|
||||||
|
# Learn more: http://github.com/javan/whenever
|
||||||
|
#
|
||||||
|
set :environment, :development
|
||||||
|
every '0 1 20 * *' do
|
||||||
|
runner 'Sponsorship.monthly_payment'
|
||||||
|
end
|
||||||
|
# every 1.month, at: 'January 20th 10:00am' do
|
||||||
|
# runner 'Sponsorship.monthly_payment'
|
||||||
|
# end
|
||||||
|
# #######################################################
|
||||||
|
# * * * * * command to be executed
|
||||||
|
# - - - - -
|
||||||
|
# | | | | |
|
||||||
|
# | | | | +----- day of week (0 - 6) (Sunday=0)
|
||||||
|
# | | | +------- month (1 - 12)
|
||||||
|
# | | +--------- day of month (1 - 31)
|
||||||
|
# | +----------- hour (0 - 23)
|
||||||
|
# +------------- min (0 - 59)
|
||||||
|
# #######################################################
|
|
@ -0,0 +1,8 @@
|
||||||
|
class AddColumnToTableUsers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :users, :description, :string, default: ""
|
||||||
|
add_column :users, :sponsor_certification, :integer, default: 0
|
||||||
|
add_column :users, :sponsor_num, :integer, default: 0
|
||||||
|
add_column :users, :sponsored_num, :integer, default: 0
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,12 @@
|
||||||
|
class CreateSponsorships < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :sponsorships do |t|
|
||||||
|
t.integer :amount
|
||||||
|
t.integer :visible
|
||||||
|
t.integer :sponsor_id
|
||||||
|
t.integer :developer_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
class CreateSponsorTiers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :sponsor_tiers do |t|
|
||||||
|
t.integer :tier
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
class AddColumnToSponsorTiers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :sponsor_tiers, :description, :string, default: ""
|
||||||
|
add_column :sponsor_tiers, :user_id, :integer
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
class CreateStoppedSponsorships < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :stopped_sponsorships do |t|
|
||||||
|
t.integer :amount
|
||||||
|
t.integer :sponsor_id
|
||||||
|
t.integer :developer_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,10 @@
|
||||||
|
class CreateWallets < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :wallets do |t|
|
||||||
|
t.integer :balance
|
||||||
|
t.integer :user_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,13 @@
|
||||||
|
class CreateCoinChanges < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :coin_changes do |t|
|
||||||
|
t.integer :amount
|
||||||
|
t.string :description
|
||||||
|
t.string :reason
|
||||||
|
t.integer :to_wallet_id
|
||||||
|
t.integer :from_wallet_id
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,12 @@
|
||||||
|
class CreateWaitlists < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :waitlists do |t|
|
||||||
|
t.string :applicant_id
|
||||||
|
t.string :integer
|
||||||
|
t.string :reviewer_id
|
||||||
|
t.string :integer
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,12 @@
|
||||||
|
class CreatePassedWaitlists < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :passed_waitlists do |t|
|
||||||
|
t.string :applicant_id
|
||||||
|
t.string :integer
|
||||||
|
t.string :reviewer_id
|
||||||
|
t.string :integer
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddColumnToStoppedSponsorship < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :stopped_sponsorships, :start_time, :datetime
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddVisibleToStoppedSponsorship < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :stopped_sponsorships, :visible, :integer
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
class ChangeUserDescriptionType < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
remove_column :users, :description
|
||||||
|
add_column :users, :description, :text
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
class AddAccumulateToSponsorships < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :sponsorships, :accumulate, :integer, default: 0
|
||||||
|
add_column :stopped_sponsorships, :accumulate, :integer, default: 0
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddAwardTimeToUser < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :users, :award_time, :datetime
|
||||||
|
end
|
||||||
|
end
|
|
@ -55,6 +55,7 @@ CREATE TABLE `applied_contests` (
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for applied_messages
|
-- Table structure for applied_messages
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
-- DROP TABLE IF /home/qyzh/datadict.txtpplied_messages`;
|
||||||
DROP TABLE IF EXISTS `applied_messages`;
|
DROP TABLE IF EXISTS `applied_messages`;
|
||||||
CREATE TABLE `applied_messages` (
|
CREATE TABLE `applied_messages` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 9.7 KiB |
|
@ -0,0 +1,20 @@
|
||||||
|
## 从命令行创建一个新的仓库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
touch README.md
|
||||||
|
git init
|
||||||
|
git add README.md
|
||||||
|
git commit -m "first commit"
|
||||||
|
git remote add origin http://gitea.trustie.net/qiubing/gitea_binary_package.git
|
||||||
|
git push -u origin master
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## 从命令行推送已经创建的仓库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git remote add origin http://gitea.trustie.net/qiubing/gitea_binary_package.git
|
||||||
|
git push -u origin master
|
||||||
|
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe LogController, type: :controller do
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,188 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
# This spec was generated by rspec-rails when you ran the scaffold generator.
|
||||||
|
# It demonstrates how one might use RSpec to specify the controller code that
|
||||||
|
# was generated by Rails when you ran the scaffold generator.
|
||||||
|
#
|
||||||
|
# It assumes that the implementation code is generated by the rails scaffold
|
||||||
|
# generator. If you are using any extension libraries to generate different
|
||||||
|
# controller code, this generated spec may or may not pass.
|
||||||
|
#
|
||||||
|
# It only uses APIs available in rails and/or rspec-rails. There are a number
|
||||||
|
# of tools you can use to make these specs even more expressive, but we're
|
||||||
|
# sticking to rails and rspec-rails APIs to keep things simple and stable.
|
||||||
|
#
|
||||||
|
# Compared to earlier versions of this generator, there is very limited use of
|
||||||
|
# stubs and message expectations in this spec. Stubs are only used when there
|
||||||
|
# is no simpler way to get a handle on the object needed for the example.
|
||||||
|
# Message expectations are only used when there is no simpler way to specify
|
||||||
|
# that an instance is receiving a specific message.
|
||||||
|
#
|
||||||
|
# Also compared to earlier versions of this generator, there are no longer any
|
||||||
|
# expectations of assigns and templates rendered. These features have been
|
||||||
|
# removed from Rails core in Rails 5, but can be added back in via the
|
||||||
|
# `rails-controller-testing` gem.
|
||||||
|
|
||||||
|
RSpec.describe SponsorTiersController, type: :controller do
|
||||||
|
|
||||||
|
# This should return the minimal set of attributes required to create a valid
|
||||||
|
# SponsorTier. As you add validations to SponsorTier, be sure to
|
||||||
|
# adjust the attributes here as well.
|
||||||
|
let(:valid_attributes) {
|
||||||
|
{tier: 10, user_id: 5, description: 'Rspec test description'}
|
||||||
|
}
|
||||||
|
|
||||||
|
let(:invalid_attributes) {
|
||||||
|
{t: '10', user_id: -1, descrip: 'Rspec test description'}
|
||||||
|
}
|
||||||
|
|
||||||
|
let(:invalid_user_attributes) {
|
||||||
|
{tier: 10, user_id: 4, description: 'Rspec test invalid user description'}
|
||||||
|
}
|
||||||
|
# This should return the minimal set of values that should be in the session
|
||||||
|
# in order to pass any filters (e.g. authentication) defined in
|
||||||
|
# SponsorTiersController. Be sure to keep this updated too.
|
||||||
|
let(:valid_session) {
|
||||||
|
# user = User.find 5
|
||||||
|
# User.current = user
|
||||||
|
# cookies.signed[:user_id] = user.id
|
||||||
|
# cookies["autologin"] = "060a555275563b9f096c6ceed84518f64a4614ee"
|
||||||
|
{user_id: 5, www_user_id: 5}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe 'GET #index' do
|
||||||
|
it 'returns a success response' do
|
||||||
|
SponsorTier.create! valid_attributes
|
||||||
|
get :index, params: {login: 'qyzh123123'}, session: valid_session
|
||||||
|
expect(response).to be_successful
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'GET #show' do
|
||||||
|
it 'returns a success response' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
get :show, params: {id: sponsor_tier.to_param}, session: valid_session
|
||||||
|
expect(response).to be_successful
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'POST #create' do
|
||||||
|
context 'with valid params' do
|
||||||
|
it 'creates a new SponsorTier' do
|
||||||
|
expect {
|
||||||
|
post :create, params: {sponsor_tier: valid_attributes}, session: valid_session
|
||||||
|
}.to change(SponsorTier, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to the created sponsor_tier' do
|
||||||
|
post :create, params: {sponsor_tier: valid_attributes}, session: valid_session
|
||||||
|
expect(response).to redirect_to(SponsorTier.last)
|
||||||
|
# expect(response).to be_successful
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with invalid params' do
|
||||||
|
it "returns a success response (i.e. to display the 'new' template)" do
|
||||||
|
post :create, params: {sponsor_tier: invalid_attributes}, session: valid_session
|
||||||
|
expect(response).to be_successful
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with invalid user id' do
|
||||||
|
it 'does not creates a new SponsorTier' do
|
||||||
|
expect {
|
||||||
|
post :create, params: {sponsor_tier: invalid_user_attributes}, session: valid_session
|
||||||
|
}.to change(SponsorTier, :count).by(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns a success response" do
|
||||||
|
post :create, params: {sponsor_tier: invalid_user_attributes}, session: valid_session
|
||||||
|
expect(response).to be_successful
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'PUT #update' do
|
||||||
|
context 'with valid params' do
|
||||||
|
let(:new_attributes) {
|
||||||
|
{tier: 12, description: 'Rspec test update description'}
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'updates the requested sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
put :update, params: {id: sponsor_tier.to_param, sponsor_tier: new_attributes}, session: valid_session
|
||||||
|
sponsor_tier.reload
|
||||||
|
expect(sponsor_tier.tier).to eq(12)
|
||||||
|
expect(sponsor_tier.description).to eq('Rspec test update description')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to the sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
put :update, params: {id: sponsor_tier.to_param, sponsor_tier: valid_attributes}, session: valid_session
|
||||||
|
expect(response).to redirect_to(sponsor_tier)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with invalid params' do
|
||||||
|
it 'does not update and redirects to the sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
put :update, params: {id: sponsor_tier.to_param, sponsor_tier: invalid_attributes}, session: valid_session
|
||||||
|
expect(response).to redirect_to(sponsor_tier)
|
||||||
|
expect(sponsor_tier.tier).to eq(10)
|
||||||
|
expect(sponsor_tier.description).to eq('Rspec test description')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with invalid user id' do
|
||||||
|
let(:new_attributes) {
|
||||||
|
{tier: 12, description: 'Rspec test update description'}
|
||||||
|
}
|
||||||
|
it 'does not update SponsorTier' do
|
||||||
|
sponsor_tier = SponsorTier.create! invalid_user_attributes
|
||||||
|
put :update, params: {id: sponsor_tier.to_param, sponsor_tier: new_attributes}, session: valid_session
|
||||||
|
sponsor_tier.reload
|
||||||
|
expect(sponsor_tier.tier).to eq(10)
|
||||||
|
expect(sponsor_tier.description).to eq('Rspec test invalid user description')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to the sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! invalid_user_attributes
|
||||||
|
put :update, params: {id: sponsor_tier.to_param, sponsor_tier: valid_attributes}, session: valid_session
|
||||||
|
expect(response).to be_ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'DELETE #destroy' do
|
||||||
|
context 'with valid user id' do
|
||||||
|
it 'destroys the requested sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
expect {
|
||||||
|
delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session
|
||||||
|
}.to change(SponsorTier, :count).by(-1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to the sponsor_tiers list' do
|
||||||
|
sponsor_tier = SponsorTier.create! valid_attributes
|
||||||
|
delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session
|
||||||
|
expect(response).to redirect_to(sponsor_tiers_url)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with invalid user id' do
|
||||||
|
it 'does not destroy the requested sponsor_tier' do
|
||||||
|
sponsor_tier = SponsorTier.create! invalid_user_attributes
|
||||||
|
expect {
|
||||||
|
delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session
|
||||||
|
}.to change(SponsorTier, :count).by(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'be ok' do
|
||||||
|
sponsor_tier = SponsorTier.create! invalid_user_attributes
|
||||||
|
delete :destroy, params: {id: sponsor_tier.to_param}, session: valid_session
|
||||||
|
expect(response).to be_ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue