From 0ffb5f892da0a57a958148ae8c06a08c257e5436 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Mon, 17 Jul 2023 09:34:43 +0800 Subject: [PATCH 01/32] =?UTF-8?q?api=E9=99=90=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/api_limit_service.rb | 137 ++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 app/services/api_limit_service.rb diff --git a/app/services/api_limit_service.rb b/app/services/api_limit_service.rb new file mode 100644 index 000000000..d22684962 --- /dev/null +++ b/app/services/api_limit_service.rb @@ -0,0 +1,137 @@ +class ApiLimitService < ApplicationService + Error = Class.new(StandardError) + + def initialize() end + + def call + + end + + # 时间窗口法 + def is_action_allowed?(user_id, action_key, period, max_count) + key = "#{user_id}:#{action_key}" + count = $redis_cache.multi do |multi| + multi.incr(key) + multi.expire(key, period) + end + count[0] <= max_count + end + + # 漏桶法 + def is_action_allowed_bucket?(user_id, action_key, capacity, rate) + key = "#{user_id}:#{action_key}" + # now = (("%10.3f" % Time.now.to_f).to_f * 1000).to_i + now = Time.now.to_i + count = $redis_cache.multi do |multi| + multi.zadd(key, now, SecureRandom.uuid.gsub("-", "")) + multi.zremrangebyscore(key, 0, now - capacity) + multi.zcard(key) + multi.expire(key, (capacity / rate + 1).to_i) + end + # puts "count1==#{count}" + # puts "count2==#{count[2]}" + count[2] <= capacity + end + + def is_action_allowed_aaa?(user_id, action_key, period, maxCount) + key = "#{user_id}:#{action_key}" + now = (("%10.3f" % Time.now.to_f).to_f * 1000).to_i + count = $redis_cache.multi do |multi| + # 添加命令 + multi.zadd(key, now, SecureRandom.uuid.gsub("-", "")) + # 清楚无用数据 + multi.zremrangebyscore(key, 0, now - period * 1000) + # 判断规定时间内请求数量 + multi.zcard(key) + # 重新设置过期时间 + multi.expire(key, period + 1) + end + # puts "count1==#{count}" + # puts "count2==#{count[2]}" + count[2] <= maxCount + end + + def sdfsf + + # 每秒钟漏斗的容量 + + capacity = 10 + + + # 漏斗填充速度 + + leak_rate = 0.3 + + # 当前漏斗中的水量 + + current_volume = 0 + + # 上一次漏水的时间 + + last_leak_time = Time.now.to_i + + funnel_name = "tests" + + # $redis_cache.hset(funnel_name, "volume", capacity) + $redis_cache.hset(funnel_name, "last_leak_time", Time.now.to_i) + + # 构造事务命令 + + # result = $redis_cache.multi do |pipe| + # # 把当前时间与上一次漏水时间的差值,作为漏斗流出水量 + # + # pipe.hget(funnel_name, "last_leak_time") + # + # pipe.hset(funnel_name, "last_leak_time", Time.now.to_i) + # + # pipe.hget(funnel_name, "volume") + # + # pipe.hget(funnel_name, "capacity") + # + # pipe.hget(funnel_name, "leak_rate") + # end + + current_volume = $redis_cache.hget(funnel_name, "volume") + last_leak_time = $redis_cache.hget(funnel_name, "last_leak_time") + # 先漏水 + leaked_volume = (Time.now.to_i - last_leak_time.to_i) * leak_rate.to_f + + current_volume = [current_volume.to_f + leaked_volume, capacity.to_f].sort.first + puts "current_volume====#{current_volume}" + # 判断是否可以通过请求 + if current_volume >= 1 + $redis_cache.hset(funnel_name, "volume", current_volume.to_i - 1) + # $redis_cache.hset(funnel_name, "last_leak_time", Time.now.to_i) + true + else + false + end + + end + + def done_test3 + 100.times.each do |t| + if t % 2== 0 + sleep(1) + end + puts "#{t}:res====#{sdfsf}" + end + end + + def done_test + 100.times.each do |t| + if t % 10== 0 + sleep(5) + end + puts "#{t}:res====#{is_action_allowed_bucket?("123", "test2", 10, 0.2)}" + end + end + + def done_test2 + 100.times.each do |t| + sleep(1) + puts "#{t}:res====#{is_action_allowed_aaa?("123", "test3", 10, 5)}" + end + end + +end From d0178a4a6c9f102e9a0863b18ab1cafaa9ee1f46 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Mon, 17 Jul 2023 21:46:26 +0800 Subject: [PATCH 02/32] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 6519058f8..55d50ba98 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -191,7 +191,7 @@ class User < Owner scope :like, lambda { |keywords| # 表情处理 keywords = keywords.to_s.each_char.select { |c| c.bytes.first < 240 }.join('') - sql = "CONCAT(lastname, firstname) LIKE :search OR nickname LIKE :search OR login LIKE :search OR mail LIKE :search OR nickname LIKE :search" + sql = "CONCAT(lastname, firstname) LIKE :search OR nickname LIKE :search OR login LIKE :search OR mail LIKE :search OR phone LIKE :search" where(sql, :search => "%#{keywords.strip}%") unless keywords.blank? } From a136a0468ef4ee4444c56eba3d292fe7889e2022 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Mon, 17 Jul 2023 22:24:21 +0800 Subject: [PATCH 03/32] =?UTF-8?q?fixed=20=E6=9B=B4=E6=96=B0=E6=97=B6?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6=E6=9C=89=E6=98=B5=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 25c8ce570..34d617f19 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -212,8 +212,10 @@ class UsersController < ApplicationController def update return render_not_found unless @user = User.find_by(login: params[:id]) || User.find_by_id(params[:id]) return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id) - keywords = user_params[:nickname].to_s.each_char.select { |c| c.bytes.first < 240 }.join('') - return normal_status(-1, "昵称中包含关键词:#{keywords},请重新命名") if ReversedKeyword.check_exists?(keywords) + if user_params[:nickname].present? + keywords = user_params[:nickname].to_s.each_char.select { |c| c.bytes.first < 240 }.join('') + return normal_status(-1, "昵称中包含关键词:#{keywords},请重新命名") if ReversedKeyword.check_exists?(keywords) + end Util.write_file(@image, avatar_path(@user)) if user_params[:image].present? @user.attributes = user_params.except(:image) unless @user.save From ab3cf745e89fcf63d2f75f80fb3296abb3093990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 19 Jul 2023 15:20:26 +0800 Subject: [PATCH 04/32] change response code --- app/controllers/forks_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index 967c1d4d2..b5ad0ff21 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -26,14 +26,14 @@ class ForksController < ApplicationController private def authenticate_project! if params[:organization].present? - return render_forbidden('参数错误,当organization存在时不允许fork重命名') if params[:new_identifier].present? || params[:new_name].present? + return render_forbidden('参数错误,当组织字段存在时,不允许重命名fork仓库') if params[:new_identifier].present? || params[:new_name].present? @organization = Organization.find_by(login:params[:organization]) return render_forbidden('仓库不存在') unless @organization.present? return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) end if params[:organization].blank? && Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) - render_result(-1, "fork失败,您已拥有了这个项目") + render_result(-2, "fork失败,您已拥有了这个项目") elsif @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) render_result(-1, "fork失败,组织已拥有了这个项目") elsif gitea_check_exit(current_user) From 39825e9e02d6dd197c0991227dbb9e6250fb1283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 19 Jul 2023 16:48:29 +0800 Subject: [PATCH 05/32] response forks list user mail --- app/views/forks/fork_list.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/forks/fork_list.json.jbuilder b/app/views/forks/fork_list.json.jbuilder index 185b8e4fc..39c0d2ae1 100644 --- a/app/views/forks/fork_list.json.jbuilder +++ b/app/views/forks/fork_list.json.jbuilder @@ -3,6 +3,7 @@ json.user do json.type @user.type json.name @user.real_name json.login @user.login + json.mail @user.mail json.image_url url_to_avatar(@user) json.forked Project.exists?(user_id: @user.id, forked_from_project_id: @project.id) end From c98e3c9d74915856b1a9bd5b5c217dcaadc5b26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Thu, 20 Jul 2023 17:03:40 +0800 Subject: [PATCH 06/32] update fork --- app/controllers/forks_controller.rb | 8 ++-- app/services/leaky_bucket_rate_limiter.rb | 42 ++++++++++++++++++ app/services/sliding_window_rate_limiter.rb | 39 +++++++++++++++++ app/services/token_bucket_rate_limiter.rb | 48 +++++++++++++++++++++ 4 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 app/services/leaky_bucket_rate_limiter.rb create mode 100644 app/services/sliding_window_rate_limiter.rb create mode 100644 app/services/token_bucket_rate_limiter.rb diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index b5ad0ff21..e20f27efd 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -26,14 +26,16 @@ class ForksController < ApplicationController private def authenticate_project! if params[:organization].present? - return render_forbidden('参数错误,当组织字段存在时,不允许重命名fork仓库') if params[:new_identifier].present? || params[:new_name].present? + return render_forbidden('参数错误,当organization存在时不允许fork重命名') if params[:new_identifier].present? || params[:new_name].present? @organization = Organization.find_by(login:params[:organization]) return render_forbidden('仓库不存在') unless @organization.present? return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) end - if params[:organization].blank? && Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) - render_result(-2, "fork失败,您已拥有了这个项目") + if Project.exists?(user_id: current_user.id, forked_from_project_id: @project.id) + render_result(-1, "fork失败,您已fork过了这个项目") + elsif params[:organization].blank? && Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) + render_result(-2, "fork失败, fork本人项目需要为fork仓库重命名") elsif @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) render_result(-1, "fork失败,组织已拥有了这个项目") elsif gitea_check_exit(current_user) diff --git a/app/services/leaky_bucket_rate_limiter.rb b/app/services/leaky_bucket_rate_limiter.rb new file mode 100644 index 000000000..2508e99e0 --- /dev/null +++ b/app/services/leaky_bucket_rate_limiter.rb @@ -0,0 +1,42 @@ +class LeakyBucketRateLimiter + def initialize(user_id, rate, capacity) + @rate = rate # 令牌发放速率(每秒发放的令牌数) + @capacity = capacity # 桶的容量(最大令牌数) + @redis = $redis_cache + @key = "#{user_id}:LeakyBucket" + @current_time = Time.now.to_f + end + + def allow_request + current_time = Time.now.to_f + last_drip_time = @redis.getset(@key + ':last_drip_time', current_time).to_f + tokens = @redis.getset(@key + ':tokens', @capacity).to_i + + # 计算已经漏掉的令牌数量 + leaked_tokens = (current_time - last_drip_time) * @rate + puts leaked_tokens + # 如果桶中的令牌多于漏掉的令牌数量,则漏水 + tokens = [@capacity, tokens + leaked_tokens].min + puts tokens + if tokens >= 1 + @redis.set(@key + ':last_drip_time', current_time) + @redis.decr(@key + ':tokens') + return true + end + false + end +end + + +=begin + 失败 + limiter = LeakyBucketRateLimiter.new(110,10, 40) # 设置令牌发放速率为10,桶的容量为40 + 30.times do + if limiter.allow_request + puts "Allow" + else + puts "Reject" + end + end + +=end \ No newline at end of file diff --git a/app/services/sliding_window_rate_limiter.rb b/app/services/sliding_window_rate_limiter.rb new file mode 100644 index 000000000..a999345ef --- /dev/null +++ b/app/services/sliding_window_rate_limiter.rb @@ -0,0 +1,39 @@ + +class SlidingWindowRateLimiter + def initialize(user_id, rate, window_size) + @rate = rate # 请求速率限制(每秒的请求数) + @window_size = window_size # 时间窗口大小(秒) + @redis = $redis_cache + @key = "#{user_id}:SlidingWindow" + @current_timestamp = Time.now.to_f + end + + def allow_request + current_timestamp = Time.now.to_f + score = current_timestamp.to_i + start_time = current_timestamp - @window_size + + @redis.zremrangebyscore(@key, '-inf', start_time) + count = @redis.zcount(@key, '-inf', '+inf').to_i + + return false if count >= @rate + + @redis.zadd(@key, score, current_timestamp) + true + end +end + + +=begin + #测试通过 + + limiter = SlidingWindowRateLimiter.new(user_id,10, 1) # 设置请求速率限制为10次/秒,时间窗口大小为1秒 + 40.times do + if limiter.allow_request + puts "Allow" + else + puts "Reject" + end + end + +=end \ No newline at end of file diff --git a/app/services/token_bucket_rate_limiter.rb b/app/services/token_bucket_rate_limiter.rb new file mode 100644 index 000000000..c0d726b37 --- /dev/null +++ b/app/services/token_bucket_rate_limiter.rb @@ -0,0 +1,48 @@ +class TokenBucketRateLimiter + def initialize(user_id,rate, capacity) + @rate = rate # 令牌发放速率(每秒发放的令牌数) + @capacity = capacity # 令牌桶容量 + @redis = $redis_cache + @key = "#{user_id}:TokenBucket" + end + + def refill + now = Time.now.to_f * 1000 + tokens = $redis_cache.hget(@key, 'tokens') + timestamp = $redis_cache.hget(@key, 'timestamp') + + if tokens.nil? + tokens = @capacity + timestamp = now + else + tokens = [@capacity, tokens.to_i + (now - timestamp.to_f) * @rate / 1000].min + timestamp = now + end + + $redis_cache.hset(@key, 'tokens', tokens) + $redis_cache.hset(@key, 'timestamp', timestamp) + end + + def allow_request + refill + tokens = @redis.hget(@key, 'tokens') + if !tokens.nil? && tokens.to_i >= 1 + @redis.hset(@key, 'tokens', tokens.to_i - 1) + return true + end + false + end +end + +=begin + #测试通过 + limiter = TokenBucketRateLimiter.new(user_id,10, 40) # 设置令牌发放速率为10,令牌桶容量为40 + 30.times do + if limiter.allow_request + puts "Allow" + else + puts "Reject" + end + end + +=end \ No newline at end of file From 012077923c32894061429028b6e3ce832b1e88b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Thu, 20 Jul 2023 17:22:18 +0800 Subject: [PATCH 07/32] update fork --- app/controllers/forks_controller.rb | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index e20f27efd..0b6b7ce43 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -30,21 +30,14 @@ class ForksController < ApplicationController @organization = Organization.find_by(login:params[:organization]) return render_forbidden('仓库不存在') unless @organization.present? return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) + return render_result(-1, "fork失败,组织已拥有了这个项目") if @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) + return render_result(-1, "fork失败,请联系系统管理员") if gitea_check_exit(@organization) + else + return render_result(-1, "fork失败,您已fork过了这个项目") if Project.exists?(user_id: current_user.id, forked_from_project_id: @project.id) + return render_result(-2, "fork失败, fork本人项目需要为fork仓库重命名") if Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) + return render_result(-1, "fork失败,请联系系统管理员") if gitea_check_exit(current_user) end - - if Project.exists?(user_id: current_user.id, forked_from_project_id: @project.id) - render_result(-1, "fork失败,您已fork过了这个项目") - elsif params[:organization].blank? && Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) - render_result(-2, "fork失败, fork本人项目需要为fork仓库重命名") - elsif @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) - render_result(-1, "fork失败,组织已拥有了这个项目") - elsif gitea_check_exit(current_user) - render_result(-1, "fork失败,请联系系统管理员") - elsif @organization && gitea_check_exit(@organization) - render_result(-1, "fork失败,请联系系统管理员") - end - # return if current_user != @project.owner - # render_result(-1, "自己不能fork自己的项目") + end def authenticate_user! From 4713f526d08213b0b5c085721b8362a0375f2cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Thu, 20 Jul 2023 17:25:28 +0800 Subject: [PATCH 08/32] update fork org message --- app/controllers/forks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index 0b6b7ce43..b38cde6a3 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -28,7 +28,7 @@ class ForksController < ApplicationController if params[:organization].present? return render_forbidden('参数错误,当organization存在时不允许fork重命名') if params[:new_identifier].present? || params[:new_name].present? @organization = Organization.find_by(login:params[:organization]) - return render_forbidden('仓库不存在') unless @organization.present? + return render_forbidden('组织不存在') unless @organization.present? return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) return render_result(-1, "fork失败,组织已拥有了这个项目") if @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) return render_result(-1, "fork失败,请联系系统管理员") if gitea_check_exit(@organization) From 7eb9f0ce2e90524d2ec57893d94cec53c0c27001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Mon, 24 Jul 2023 09:28:51 +0800 Subject: [PATCH 09/32] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=9B=9E=E6=AD=A3?= =?UTF-8?q?=E5=BC=8F=E6=9C=8Dfork=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/forks_controller.rb | 44 +++++-------------------- app/services/projects/fork_service.rb | 1 - app/views/forks/fork_list.json.jbuilder | 17 ---------- config/routes.rb | 6 +--- 4 files changed, 10 insertions(+), 58 deletions(-) delete mode 100644 app/views/forks/fork_list.json.jbuilder diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index b38cde6a3..0842d2e67 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -2,42 +2,21 @@ class ForksController < ApplicationController before_action :require_login before_action :require_profile_completed, only: [:create] before_action :load_project - before_action :authenticate_user! - before_action :authenticate_project!, only: [:create] - - def fork_list - @user = current_user - @organizations = current_user.organizations - - end + before_action :authenticate_project!, :authenticate_user! def create - target_owner = if params[:organization].present? && @organization - @organization - else - current_user - end - @new_project = Projects::ForkService.new(target_owner, @project, params[:organization], params[:new_name], params[:new_identifier]).call - if @new_project == false - render_result(-1, "已fork过一次该项目,无法再次进行fork") - end + @new_project = Projects::ForkServiceProjects::ForkService.new(current_user, @project, params[:organization]).call end private def authenticate_project! - if params[:organization].present? - return render_forbidden('参数错误,当organization存在时不允许fork重命名') if params[:new_identifier].present? || params[:new_name].present? - @organization = Organization.find_by(login:params[:organization]) - return render_forbidden('组织不存在') unless @organization.present? - return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) - return render_result(-1, "fork失败,组织已拥有了这个项目") if @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) - return render_result(-1, "fork失败,请联系系统管理员") if gitea_check_exit(@organization) - else - return render_result(-1, "fork失败,您已fork过了这个项目") if Project.exists?(user_id: current_user.id, forked_from_project_id: @project.id) - return render_result(-2, "fork失败, fork本人项目需要为fork仓库重命名") if Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) - return render_result(-1, "fork失败,请联系系统管理员") if gitea_check_exit(current_user) + if current_user&.id == @project.user_id + render_result(-1, "自己不能fork自己的项目") + elsif Project.exists?(user_id: current_user.id, identifier: @project.identifier) + render_result(0, "fork失败,你已拥有了这个项目") end - + # return if current_user != @project.owner + # render_result(-1, "自己不能fork自己的项目") end def authenticate_user! @@ -45,9 +24,4 @@ class ForksController < ApplicationController return if @project.member?(current_user) || current_user.admin? render_forbidden('你没有权限操作') end - - def gitea_check_exit(user) - data = Gitea::Repository::GetService.new(user, params[:new_identifier]|| @project.identifier).call - data.present? - end -end +end \ No newline at end of file diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index a46b8d86a..37edf56ee 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -18,7 +18,6 @@ class Projects::ForkService < ApplicationService :license_id, :ignore_id, {repository: [:identifier, :hidden]}] result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization, @new_identifier).call - return false if result['clone_url'].nil? clone_project.owner = @target_owner clone_project.forked_from_project_id = @project.id clone_project.gpid = result['id'] diff --git a/app/views/forks/fork_list.json.jbuilder b/app/views/forks/fork_list.json.jbuilder deleted file mode 100644 index 39c0d2ae1..000000000 --- a/app/views/forks/fork_list.json.jbuilder +++ /dev/null @@ -1,17 +0,0 @@ -json.user do - json.id @user.id - json.type @user.type - json.name @user.real_name - json.login @user.login - json.mail @user.mail - json.image_url url_to_avatar(@user) - json.forked Project.exists?(user_id: @user.id, forked_from_project_id: @project.id) -end -json.organizations @organizations do |organization| - json.forked Project.exists?(user_id: organization.id, forked_from_project_id: @project.id) - json.id organization.id - json.name organization.login - json.nickname organization.nickname.blank? ? organization.name : organization.nickname - json.avatar_url url_to_avatar(organization) - json.created_at organization.created_on.strftime("%Y-%m-%d") -end diff --git a/config/routes.rb b/config/routes.rb index 8750508ea..0d04c498a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -625,11 +625,7 @@ Rails.application.routes.draw do end resources :hooks - resources :forks, only: [:create] do - collection do - get :fork_list - end - end + resources :forks, only: [:create] resources :project_trends, :path => :activity, only: [:index, :create] resources :issue_tags, :path => :labels, only: [:create, :edit, :update, :destroy, :index] resources :version_releases, :path => :releases, only: [:index,:new, :show, :create, :edit, :update, :destroy] From 85fe03e40f740c35f3191daa6715ceda06c64147 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 15:23:06 +0800 Subject: [PATCH 10/32] SyncRepoUpdateTimeJob stop --- app/jobs/sync_repo_update_time_job.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/jobs/sync_repo_update_time_job.rb b/app/jobs/sync_repo_update_time_job.rb index 4391f2c13..8692391a8 100644 --- a/app/jobs/sync_repo_update_time_job.rb +++ b/app/jobs/sync_repo_update_time_job.rb @@ -3,9 +3,9 @@ class SyncRepoUpdateTimeJob < ApplicationJob def perform(*args) # Do something later - Project.forge.find_each do |project| - update_repo_time!(project) - end + # Project.forge.find_each do |project| + # update_repo_time!(project) + # end end private From 28942c7863cb3243bb468a00b5c9c5cae3151842 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 16:53:18 +0800 Subject: [PATCH 11/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 1c1e1aa95..efae6c15d 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -120,14 +120,17 @@ module RepositoriesHelper s_regex_c = /`{1,2}[^`](.*?)`{1,2}/ s_regex = /```([\s\S]*?)```[\s]?/ s_regex_1 = /\[.*?\]\((.*?)\)/ + # 变量图片相对路径 + s_regex_2 = /\[.*?\]:(.*?)\r\n/ src_regex = /src=\"(.*?)\"/ src_regex_1 = /src=\'(.*?)\'/ ss_c = content.to_s.scan(s_regex_c) ss = content.to_s.scan(s_regex) ss_1 = content.to_s.scan(s_regex_1) + ss_2 = content.to_s.scan(s_regex_2) ss_src = content.to_s.scan(src_regex) ss_src_1 = content.to_s.scan(src_regex_1) - total_sources = {ss_c: ss_c,ss: ss, ss_1: ss_1, ss_src: ss_src, ss_src_1: ss_src_1} + total_sources = {ss_c: ss_c,ss: ss, ss_1: ss_1, ss_2: ss_2, ss_src: ss_src, ss_src_1: ss_src_1} # total_sources.uniq! total_sources.except(:ss, :ss_c).each do |k, sources| sources.each do |s| @@ -140,6 +143,7 @@ module RepositoriesHelper if (image_type?(ext) || download_type(ext)) && !ext.blank? s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] + s_content = s_content.gsub(" ", "") # content = content.gsub(s[0], "/#{s_content}") join_xxx = s_content.include?("?") ? "&" : "?" s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join From a29b4546e449475775fdf6c663729cbf9b7bf1d6 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:22:20 +0800 Subject: [PATCH 12/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index efae6c15d..ac3a8aebe 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -143,7 +143,6 @@ module RepositoriesHelper if (image_type?(ext) || download_type(ext)) && !ext.blank? s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] - s_content = s_content.gsub(" ", "") # content = content.gsub(s[0], "/#{s_content}") join_xxx = s_content.include?("?") ? "&" : "?" s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join @@ -152,6 +151,10 @@ module RepositoriesHelper content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") + when 'ss_2' + img_regex = s[0].gsub(" ", "") + content = content.gsub(/]:#{img_regex}/, "]: #{s_content}") + else else content = content.gsub("(#{s[0]})", "(#{s_content})") end From e00da21545a5270bf0e15fac3ea04ade6c74804b Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:23:11 +0800 Subject: [PATCH 13/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index ac3a8aebe..b06f49551 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -155,7 +155,6 @@ module RepositoriesHelper img_regex = s[0].gsub(" ", "") content = content.gsub(/]:#{img_regex}/, "]: #{s_content}") else - else content = content.gsub("(#{s[0]})", "(#{s_content})") end else From 1189388431c9dda21b8fd48269bbd8888da180aa Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:23:35 +0800 Subject: [PATCH 14/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index b06f49551..2b85c5af8 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -166,6 +166,9 @@ module RepositoriesHelper content = content.gsub("src=\"#{s[0]}\"", "src=\"/#{s_content}\"") when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") + when 'ss_2' + img_regex = s[0].gsub(" ", "") + content = content.gsub(/]:#{img_regex}/, "]: #{s_content}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") end From efe1425157c20b0a82c385a5a10dcef438fe5530 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:29:18 +0800 Subject: [PATCH 15/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 2b85c5af8..e09559c73 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -152,8 +152,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - img_regex = s[0].gsub(" ", "") - content = content.gsub(/]:#{img_regex}/, "]: #{s_content}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") else content = content.gsub("(#{s[0]})", "(#{s_content})") end @@ -167,8 +166,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' - img_regex = s[0].gsub(" ", "") - content = content.gsub(/]:#{img_regex}/, "]: #{s_content}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") end From b0e10207a47cb6465ab72ce0193b832db67ce775 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:36:25 +0800 Subject: [PATCH 16/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index e09559c73..933d52e2a 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -152,7 +152,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") + content = content.gsub(/#{s[0]}/, "#{s_content}") else content = content.gsub("(#{s[0]})", "(#{s_content})") end From 64bca88d359717b78cebf4758448d613ccf10540 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:46:04 +0800 Subject: [PATCH 17/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 933d52e2a..167497065 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -146,6 +146,7 @@ module RepositoriesHelper # content = content.gsub(s[0], "/#{s_content}") join_xxx = s_content.include?("?") ? "&" : "?" s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join + puts "##### new_readme_render_decode64_content k.to_s: #{k.to_s}" case k.to_s when 'ss_src' content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") @@ -166,6 +167,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' + puts "##### new_readme_render_decode64_content s[0]: #{s[0]}" content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") From b4029b9aa497870b4af38c8b06852700224dd61c Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:46:23 +0800 Subject: [PATCH 18/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 167497065..998982161 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -153,6 +153,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' + puts "##### new_readme_render_decode64_content1 s[0]: #{s[0]}" content = content.gsub(/#{s[0]}/, "#{s_content}") else content = content.gsub("(#{s[0]})", "(#{s_content})") From 9da15029b0b3c21eae0a7687b7b382ea1a4becda Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:48:22 +0800 Subject: [PATCH 19/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 998982161..6c3501961 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -146,14 +146,14 @@ module RepositoriesHelper # content = content.gsub(s[0], "/#{s_content}") join_xxx = s_content.include?("?") ? "&" : "?" s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join - puts "##### new_readme_render_decode64_content k.to_s: #{k.to_s}" + Rails.logger.info( "##### new_readme_render_decode64_content k.to_s: #{k.to_s}") case k.to_s when 'ss_src' content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - puts "##### new_readme_render_decode64_content1 s[0]: #{s[0]}" + Rails.logger.info( "##### new_readme_render_decode64_content1 s[0]: #{s[0]}") content = content.gsub(/#{s[0]}/, "#{s_content}") else content = content.gsub("(#{s[0]})", "(#{s_content})") @@ -168,7 +168,6 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' - puts "##### new_readme_render_decode64_content s[0]: #{s[0]}" content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") From d9cc7f43b5dbc133a61b9654ab18edf6ecf3a0c5 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:50:25 +0800 Subject: [PATCH 20/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log=20?= =?UTF-8?q?error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 6c3501961..632affb27 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -173,8 +173,8 @@ module RepositoriesHelper content = content.gsub("(#{s[0]})", "(/#{s_content})") end end - rescue - next + # rescue + # next end end end From 8197e3006919ac71e6b14b78ea9b9178a3e178ac Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:52:56 +0800 Subject: [PATCH 21/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log=20?= =?UTF-8?q?error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 632affb27..9a04e59f2 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -140,13 +140,13 @@ module RepositoriesHelper next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:') || s_content.blank? ext = File.extname(s_content)[1..-1] ext = ext.split("?")[0] if ext.include?("?") + Rails.logger.info( "##### new_readme_render_decode64_content k.to_s: #{k.to_s}, s[0] :#{s[0]}") if (image_type?(ext) || download_type(ext)) && !ext.blank? s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] # content = content.gsub(s[0], "/#{s_content}") join_xxx = s_content.include?("?") ? "&" : "?" s_content = [base_url, "/api/#{owner&.login}/#{repo.identifier}/raw/#{s_content}#{join_xxx}ref=#{ref}"].join - Rails.logger.info( "##### new_readme_render_decode64_content k.to_s: #{k.to_s}") case k.to_s when 'ss_src' content = content.gsub("src=\"#{s[0]}\"", "src=\"#{s_content}\"") From 9e0404b24e994b169d2afdd3a08dee9cd11425fc Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:55:54 +0800 Subject: [PATCH 22/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log=20?= =?UTF-8?q?error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 9a04e59f2..7a2405776 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -121,7 +121,7 @@ module RepositoriesHelper s_regex = /```([\s\S]*?)```[\s]?/ s_regex_1 = /\[.*?\]\((.*?)\)/ # 变量图片相对路径 - s_regex_2 = /\[.*?\]:(.*?)\r\n/ + s_regex_2 = /\[.*?\]:(.*?)\n/ src_regex = /src=\"(.*?)\"/ src_regex_1 = /src=\'(.*?)\'/ ss_c = content.to_s.scan(s_regex_c) From 06613493a3f43938cd389cd730214b3b4d365099 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 17:59:43 +0800 Subject: [PATCH 23/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log=20?= =?UTF-8?q?error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 7a2405776..fc90e5ff8 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -140,7 +140,6 @@ module RepositoriesHelper next if s_content.starts_with?('http://') || s_content.starts_with?('https://') || s_content.starts_with?('mailto:') || s_content.blank? ext = File.extname(s_content)[1..-1] ext = ext.split("?")[0] if ext.include?("?") - Rails.logger.info( "##### new_readme_render_decode64_content k.to_s: #{k.to_s}, s[0] :#{s[0]}") if (image_type?(ext) || download_type(ext)) && !ext.blank? s_content = File.expand_path(s_content, file_path) s_content = s_content.split("#{Rails.root}/")[1] @@ -153,8 +152,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - Rails.logger.info( "##### new_readme_render_decode64_content1 s[0]: #{s[0]}") - content = content.gsub(/#{s[0]}/, "#{s_content}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub("","")}") else content = content.gsub("(#{s[0]})", "(#{s_content})") end @@ -173,8 +171,8 @@ module RepositoriesHelper content = content.gsub("(#{s[0]})", "(/#{s_content})") end end - # rescue - # next + rescue + next end end end From 69c840375802ec449058fdfd4159cdb58f13b162 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 18:01:09 +0800 Subject: [PATCH 24/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=20log=20?= =?UTF-8?q?error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index fc90e5ff8..d40e8d17a 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -152,7 +152,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub("","")}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub(" ","")}") else content = content.gsub("(#{s[0]})", "(#{s_content})") end @@ -166,7 +166,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: #{s_content}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub(" ","")}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") end From 61c4e149ded698ae529b911a4bf1cf8dd669f26d Mon Sep 17 00:00:00 2001 From: xxq250 Date: Thu, 27 Jul 2023 18:26:17 +0800 Subject: [PATCH 25/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index d40e8d17a..7390bfb8f 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -166,7 +166,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub(" ","")}") + content = content.gsub(/]:#{s[0]}/, "]: /#{s_content.to_s.gsub(" ","")}") else content = content.gsub("(#{s[0]})", "(/#{s_content})") end From 5fb8c7739f4624fb4fa00d32089784ed10439a18 Mon Sep 17 00:00:00 2001 From: xxq250 Date: Fri, 28 Jul 2023 18:00:31 +0800 Subject: [PATCH 26/32] =?UTF-8?q?readme=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=AD=A3,=E6=94=BE=E8=A1=8C?= =?UTF-8?q?=E7=AC=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 7390bfb8f..d703131d1 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -16,7 +16,7 @@ module RepositoriesHelper def image_type?(str) default_type = %w(png jpg gif tif psd svg bmp webp jpeg ico psd) - default_type.include?(str&.downcase) + default_type.include?(str.to_s.gsub("\r", "").downcase) end def is_readme?(type, str) @@ -152,7 +152,7 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub(" ","")}") + content = content.gsub(/]:#{s[0]}/, "]: #{s_content.to_s.gsub(" ","").gsub("\r", "")}") else content = content.gsub("(#{s[0]})", "(#{s_content})") end @@ -166,8 +166,8 @@ module RepositoriesHelper when 'ss_src_1' content = content.gsub("src=\'#{s[0]}\'", "src=\'/#{s_content}\'") when 'ss_2' - content = content.gsub(/]:#{s[0]}/, "]: /#{s_content.to_s.gsub(" ","")}") - else + content = content.gsub(/]:#{s[0]}/, "]: /#{s_content.to_s.gsub(" ","").gsub("\r", "")}") + else content = content.gsub("(#{s[0]})", "(/#{s_content})") end end From e3b3dacde7de3ba9f393ffd70309184658a41b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Tue, 8 Aug 2023 16:27:54 +0800 Subject: [PATCH 27/32] pr check and send email --- .../javascripts/admins/glcc_pr_check.js | 2 + .../stylesheets/admins/glcc_pr_check.scss | 3 + .../admins/glcc_pr_check_controller.rb | 32 +++++++ app/helpers/admins/glcc_pr_check_helper.rb | 2 + app/mailers/user_mailer.rb | 7 ++ .../glcc_medium_term_examine_material.rb | 85 +++++++++++++++++++ app/models/glcc_registration_student.rb | 22 +++++ app/queries/admins/glcc_examine_material.rb | 29 +++++++ .../glcc_pr_check/_examine_material.html.erb | 34 ++++++++ app/views/admins/glcc_pr_check/index.html.erb | 44 ++++++++++ app/views/admins/glcc_pr_check/index.js.erb | 1 + app/views/admins/shared/_sidebar.html.erb | 1 + .../user_mailer/glcc_pr_check_email.html.erb | 71 ++++++++++++++++ config/routes.rb | 6 ++ .../admins/glcc_pr_check_controller_spec.rb | 5 ++ .../admins/glcc_pr_check_helper_spec.rb | 15 ++++ 16 files changed, 359 insertions(+) create mode 100644 app/assets/javascripts/admins/glcc_pr_check.js create mode 100644 app/assets/stylesheets/admins/glcc_pr_check.scss create mode 100644 app/controllers/admins/glcc_pr_check_controller.rb create mode 100644 app/helpers/admins/glcc_pr_check_helper.rb create mode 100644 app/models/glcc_medium_term_examine_material.rb create mode 100644 app/models/glcc_registration_student.rb create mode 100644 app/queries/admins/glcc_examine_material.rb create mode 100644 app/views/admins/glcc_pr_check/_examine_material.html.erb create mode 100644 app/views/admins/glcc_pr_check/index.html.erb create mode 100644 app/views/admins/glcc_pr_check/index.js.erb create mode 100644 app/views/user_mailer/glcc_pr_check_email.html.erb create mode 100644 spec/controllers/admins/glcc_pr_check_controller_spec.rb create mode 100644 spec/helpers/admins/glcc_pr_check_helper_spec.rb diff --git a/app/assets/javascripts/admins/glcc_pr_check.js b/app/assets/javascripts/admins/glcc_pr_check.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/admins/glcc_pr_check.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. diff --git a/app/assets/stylesheets/admins/glcc_pr_check.scss b/app/assets/stylesheets/admins/glcc_pr_check.scss new file mode 100644 index 000000000..7dfa6e7cf --- /dev/null +++ b/app/assets/stylesheets/admins/glcc_pr_check.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the admins/glcc_pr_check controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/admins/glcc_pr_check_controller.rb b/app/controllers/admins/glcc_pr_check_controller.rb new file mode 100644 index 000000000..1d79ba802 --- /dev/null +++ b/app/controllers/admins/glcc_pr_check_controller.rb @@ -0,0 +1,32 @@ +class Admins::GlccPrCheckController < Admins::BaseController + def index + params[:sort_by] = params[:sort_by].presence || 'created_on' + params[:sort_direction] = params[:sort_direction].presence || 'desc' + examine_materials = Admins::GlccExamineMaterial.call(params) + @examine_materials = paginate examine_materials.includes(:glcc_student) + end + + def send_mail + year = if params[:date].present? + params[:date][:year] + end + if year.nil? + return redirect_to admins_glcc_pr_check_index_path + flash[:error] = "时间不能为空" + end + if params[:term].blank? + return redirect_to admins_glcc_pr_check_index_path + flash[:error] = "考核选项不能为空" + end + + examine_materials = GlccMediumTermExamineMaterial.where(\ + term: params[:term], + created_on: [Time.now.change(year:year).beginning_of_year .. Time.now.change(year:year).end_of_year] + ) + examine_materials.map{ |e| + e.send_mail + } + flash[:danger] = "#{year} 年 #{params[:term].to_i == 1 ? "中期考核": "结项考核"} PR 检测邮件已全部发送完毕,一共#{examine_materials.count}封邮件" + redirect_to admins_glcc_pr_check_index_path + end +end diff --git a/app/helpers/admins/glcc_pr_check_helper.rb b/app/helpers/admins/glcc_pr_check_helper.rb new file mode 100644 index 000000000..9934b83bf --- /dev/null +++ b/app/helpers/admins/glcc_pr_check_helper.rb @@ -0,0 +1,2 @@ +module Admins::GlccPrCheckHelper +end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 28bbccf63..a99948879 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -30,4 +30,11 @@ class UserMailer < ApplicationMailer def feedback_email(mail, title, content) mail(to: mail, subject: title, content_type: "text/html", body: content) end + + def glcc_pr_check_email(mail, title, name, content) + @content = content + @name = name + mail(to: mail, subject: title) + end + end diff --git a/app/models/glcc_medium_term_examine_material.rb b/app/models/glcc_medium_term_examine_material.rb new file mode 100644 index 000000000..70bed6b9a --- /dev/null +++ b/app/models/glcc_medium_term_examine_material.rb @@ -0,0 +1,85 @@ +# == Schema Information +# +# Table name: ignores +# +# student_reg_id +# task_id +# defence_video_url +# code_or_pr_url +# PPT_attachment_id +# term +# created_on +# updated_on +# is_delete +# round + +class GlccMediumTermExamineMaterial < ActiveRecord::Base + self.table_name = "glcc_medium_term_examine_material" + belongs_to :glcc_student, :class_name => :GlccRegistrationStudent, :foreign_key => "student_reg_id" + + def check_pr_url + state = [] + # code_or_pr_url = "https://www.gitlink.org.cn/Gitlink/forgeplus/pulls/337" + url_array = code_or_pr_url.split("/") + gitlink_index = url_array.index("www.gitlink.org.cn") || url_array.index("gitlink.org.cn") + pull_index = url_array.index("pulls") + + #发送没有在gitlink上提交PR的邮件 + unless gitlink_index.present? + state << 1 + end + + # 输入的地址有问题邮件内容 + unless pull_index == 5 + state << 2 + end + + project = Project.find_by(identifier: url_array[4]) + pr = PullRequest.where(project:project, gitea_number:url_array[6]) + + unless pr.present? + state << 3 + end + state + end + + + def send_mail + gcs = glcc_student + mail = gcs.mail + return if mail.nil? || code_or_pr_url.nil? + + state = check_pr_url + return unless state.present? + title = "2023年GitLink确实开源GLCC开源夏令营#{term == 1 ? "中期考核" : "结项考核"}提醒" + content = "" + state.map{|e| + content = content + number_to_content(e) + } + puts content + UserMailer.glcc_pr_check_email(mail,title, gcs.student_name, content).deliver_now + end + + def state_to_html + gcs = glcc_student + mail = gcs.mail + return "数据异常PR连接为空" if mail.nil? || code_or_pr_url.nil? + state = check_pr_url + content = "" + state.map{|e| + content = content + number_to_content(e) + } + content + end + + def number_to_content(num) + case num + when 1 + "

PR链接为非GitLink平台链接

" + when 2 + "

PR链接为GitLink平台非PR链接

" + when 3 + "

PR链接中的PR不存在

" + end + end +end diff --git a/app/models/glcc_registration_student.rb b/app/models/glcc_registration_student.rb new file mode 100644 index 000000000..3ea0c3134 --- /dev/null +++ b/app/models/glcc_registration_student.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: ignores +# user_id +# student_name +# school +# profession +# location +# grade +# phone +# mail +# created_on +# is_delete +# prove_attachment_id +# cancel_count +# round +# + +class GlccRegistrationStudent < ActiveRecord::Base + self.table_name = "glcc_registration_student" + has_many :examines, :class_name => :GlccMediumTermExamineMaterial, :foreign_key => "student_reg_id" +end diff --git a/app/queries/admins/glcc_examine_material.rb b/app/queries/admins/glcc_examine_material.rb new file mode 100644 index 000000000..4e8f2bea7 --- /dev/null +++ b/app/queries/admins/glcc_examine_material.rb @@ -0,0 +1,29 @@ +class Admins::GlccExamineMaterial < ApplicationQuery + include CustomSortable + + attr_reader :params + + sort_columns :created_on, default_direction: :desc + + def initialize(params) + @params = params + end + + def call + materials = GlccMediumTermExamineMaterial.all + + # term + term = params[:term] || [1,2] + if term.present? + materials = materials.where(term: term) + end + #year + year = if params[:date] + params[:date][:year] + end + year = year || Time.now.year + date = Time.now.change(year:year) + materials = materials.where(created_on: [date.beginning_of_year..date.end_of_year]) + custom_sort(materials, params[:sort_by], params[:sort_direction]) + end +end \ No newline at end of file diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb new file mode 100644 index 000000000..6daf14546 --- /dev/null +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + <% if examine_materials.present? %> + <% examine_materials.each_with_index do |user, index| %> + + + + + + + + + + + <% end %> + <% else %> + <%= render 'admins/shared/no_data_for_table' %> + <% end %> + +
序号昵称邮件地址视频地址PR地址考核阶段检测状态提交时间
<%= list_index_no((params[:page] || 1).to_i, index) %><%= user.glcc_student.student_name %><%= user.glcc_student.mail %> 查看视频 查看PR <%= user.term == 1 ? "中期考核" : "结项考核"%><%= user.state_to_html.html_safe %><%= user.created_on.strftime("%Y-%m-%d %H:%M")%>
+ +<%= render partial: 'admins/shared/paginate', locals: { objects: examine_materials } %> diff --git a/app/views/admins/glcc_pr_check/index.html.erb b/app/views/admins/glcc_pr_check/index.html.erb new file mode 100644 index 000000000..a70a09f6e --- /dev/null +++ b/app/views/admins/glcc_pr_check/index.html.erb @@ -0,0 +1,44 @@ +
+ <%= form_tag(admins_glcc_pr_check_index_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %> +
+ + <% status_options = [['中期考核',1], ['结项考核', 2]] %> + <%= select_tag(:term, options_for_select(status_options), class: 'form-control') %> +
+ +
+ + <%= select_year(Date.today, {field_name:"year"}, {class:"form-control"})%> + +
+ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> + <% end %> + +
+ + + +
+ <%= render partial: 'examine_material', locals: { examine_materials: @examine_materials } %> +
+ + diff --git a/app/views/admins/glcc_pr_check/index.js.erb b/app/views/admins/glcc_pr_check/index.js.erb new file mode 100644 index 000000000..8bc043f70 --- /dev/null +++ b/app/views/admins/glcc_pr_check/index.js.erb @@ -0,0 +1 @@ +$('.glcc-examine-list-container').html("<%= j( render partial: 'examine_material', locals: { examine_materials: @examine_materials } ) %>"); \ No newline at end of file diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index fc2fe6068..481676b8f 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -57,6 +57,7 @@ <%= sidebar_item(EduSetting.get("glcc_apply_informations_admin_url"), '报名列表', icon: 'user', controller: 'root') %> <% end %> +
  • <%= sidebar_item(admins_glcc_pr_check_index_path, '考核PR检测', icon: 'edit', controller: 'admins-glcc_pr_check') %>
  • <% end %>
  • diff --git a/app/views/user_mailer/glcc_pr_check_email.html.erb b/app/views/user_mailer/glcc_pr_check_email.html.erb new file mode 100644 index 000000000..aa01d45bf --- /dev/null +++ b/app/views/user_mailer/glcc_pr_check_email.html.erb @@ -0,0 +1,71 @@ + + + + + 验证码发送 + + + + + +
    +
    +
    + + + +
    +
    +
    + +

    + 尊敬的<%=@name%>同学: +

    + +

    +   您好!经过一个多月的开发,GLCC开源编程夏令营终于迎来中期考核。为了确保您能够顺利通过考核,现对您提交的PR链接进行检测,发现存在以下问题: +

    + +
    + <%=@content.html_safe%> +
    + +

    +   您提交的PR链接的真实有效性对于后期的开发和奖金的发放至关重要,请您务必予以重视。请您尽快核查链接的有效性,并按照组委会要求提交中期考核材料。若确认链接无误,请忽略本邮件。​ +

    + +

    +   如有其他问题,请联系:glcc@ccf.org.cn +

    + +

    + GLCC组委会 +

    +

    + <%=Time.now.strftime('%Y年%m月%d日')%> +

    +
    + +
    +
    + + diff --git a/config/routes.rb b/config/routes.rb index 0d04c498a..8297f5377 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -789,6 +789,12 @@ Rails.application.routes.draw do resources :glcc_news resources :pinned_forums end + resources :glcc_pr_check do + collection do + post :send_mail + end + end + resources :project_statistics, only: [:index] do collection do get :visits_static diff --git a/spec/controllers/admins/glcc_pr_check_controller_spec.rb b/spec/controllers/admins/glcc_pr_check_controller_spec.rb new file mode 100644 index 000000000..1dfcff7d4 --- /dev/null +++ b/spec/controllers/admins/glcc_pr_check_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Admins::GlccPrCheckController, type: :controller do + +end diff --git a/spec/helpers/admins/glcc_pr_check_helper_spec.rb b/spec/helpers/admins/glcc_pr_check_helper_spec.rb new file mode 100644 index 000000000..d47be7eda --- /dev/null +++ b/spec/helpers/admins/glcc_pr_check_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Admins::GlccPrCheckHelper. For example: +# +# describe Admins::GlccPrCheckHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Admins::GlccPrCheckHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end From 6c44ecae2de4357255626652674b0067a196d854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 9 Aug 2023 14:30:23 +0800 Subject: [PATCH 28/32] white list for glcc pr check --- app/controllers/settings_controller.rb | 14 +++++++++++ .../glcc_medium_term_examine_material.rb | 25 +++++++++++++++---- .../glcc_pr_check/_examine_material.html.erb | 4 ++- config/routes.rb | 1 + 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index ecabeca21..90ed5bc37 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -11,6 +11,20 @@ class SettingsController < ApplicationController get_top_system_notification end + def check_url + url = params[:url] + task_id = params[:task] + term = params[:term] + return normal_status(-1, "缺少url参数") unless url.present? + return normal_status(-1, "缺少term参数") unless term.present? + return normal_status(-1, "缺少task参数") unless task_id.present? + glcc_mate = GlccMediumTermExamineMaterial.new(code_or_pr_url: url, task_id: task_id, term: term, created_on:Time.now) + state = glcc_mate.check_pr_url + errors = glcc_mate.gennerate_content(state) + render_ok({ state:state, state_html: errors}) + end + + private def get_navbar @navbar = default_laboratory.navbar diff --git a/app/models/glcc_medium_term_examine_material.rb b/app/models/glcc_medium_term_examine_material.rb index 70bed6b9a..1e7c3bedb 100644 --- a/app/models/glcc_medium_term_examine_material.rb +++ b/app/models/glcc_medium_term_examine_material.rb @@ -40,10 +40,25 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base unless pr.present? state << 3 end + if white_list && term == 1 #特殊处理 白名单的中期考核不处理 中期考核后去掉 + state = [] + end state end + def white_list + # 全局设置白名单 key + key = "glcc_white_task_#{self.created_on.year}" + white_task = EduSetting.find_by_name(key) + if white_task + task_ids = white_task.value.split(",") + task_ids.map(&:to_i).include?(self.task_id) + else + false + end + end + def send_mail gcs = glcc_student mail = gcs.mail @@ -52,11 +67,7 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base state = check_pr_url return unless state.present? title = "2023年GitLink确实开源GLCC开源夏令营#{term == 1 ? "中期考核" : "结项考核"}提醒" - content = "" - state.map{|e| - content = content + number_to_content(e) - } - puts content + content = gennerate_content(state) UserMailer.glcc_pr_check_email(mail,title, gcs.student_name, content).deliver_now end @@ -65,6 +76,10 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base mail = gcs.mail return "数据异常PR连接为空" if mail.nil? || code_or_pr_url.nil? state = check_pr_url + gennerate_content(state) + end + + def gennerate_content(state) content = "" state.map{|e| content = content + number_to_content(e) diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb index 6daf14546..36454232c 100644 --- a/app/views/admins/glcc_pr_check/_examine_material.html.erb +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -6,7 +6,8 @@ 邮件地址 视频地址 PR地址 - 考核阶段 + 考核阶段 + 白名单 检测状态 提交时间 @@ -21,6 +22,7 @@ 查看视频 查看PR <%= user.term == 1 ? "中期考核" : "结项考核"%> + <%= user.white_list ? "是":"否" %> <%= user.state_to_html.html_safe %> <%= user.created_on.strftime("%Y-%m-%d %H:%M")%> diff --git a/config/routes.rb b/config/routes.rb index 8297f5377..6d9fda2e9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,6 +19,7 @@ Rails.application.routes.draw do get 'attachments/entries/get_file', to: 'attachments#get_file' get 'attachments/download/:id', to: 'attachments#show' get 'attachments/download/:id/:filename', to: 'attachments#show' + get 'check_pr_url',to: "settings#check_url" # get 'auth/qq/callback', to: 'oauth/qq#create' get 'auth/failure', to: 'oauth/base#auth_failure' From 2784405847bf8919d1e527693a5c54444e0bd61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 9 Aug 2023 14:40:22 +0800 Subject: [PATCH 29/32] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=BE=E9=A2=98ID?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../glcc_pr_check/_examine_material.html.erb | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb index 36454232c..df7c52abe 100644 --- a/app/views/admins/glcc_pr_check/_examine_material.html.erb +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -1,8 +1,9 @@ - - + + + @@ -14,17 +15,18 @@ <% if examine_materials.present? %> - <% examine_materials.each_with_index do |user, index| %> - + <% examine_materials.each_with_index do |material, index| %> + - - - - - - - - + + + + + + + + + <% end %> <% else %> From c811ded37fb44056058393b39fb058500ce035e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 16 Aug 2023 10:54:51 +0800 Subject: [PATCH 30/32] update pr detection --- .../glcc_medium_term_examine_material.rb | 7 +++-- app/models/glcc_registration_task.rb | 23 +++++++++++++++ .../glcc_pr_check/_examine_material.html.erb | 28 ++++++++++--------- 3 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 app/models/glcc_registration_task.rb diff --git a/app/models/glcc_medium_term_examine_material.rb b/app/models/glcc_medium_term_examine_material.rb index 1e7c3bedb..ca4cf2e7a 100644 --- a/app/models/glcc_medium_term_examine_material.rb +++ b/app/models/glcc_medium_term_examine_material.rb @@ -16,6 +16,7 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base self.table_name = "glcc_medium_term_examine_material" belongs_to :glcc_student, :class_name => :GlccRegistrationStudent, :foreign_key => "student_reg_id" + belongs_to :task, :class_name => :GlccRegistrationTask, :foreign_key => "task_id" def check_pr_url state = [] @@ -66,7 +67,7 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base state = check_pr_url return unless state.present? - title = "2023年GitLink确实开源GLCC开源夏令营#{term == 1 ? "中期考核" : "结项考核"}提醒" + title = "#{self.created_on.year}年GitLink确实开源GLCC开源夏令营#{term == 1 ? "中期考核" : "结项考核"}提醒" content = gennerate_content(state) UserMailer.glcc_pr_check_email(mail,title, gcs.student_name, content).deliver_now end @@ -74,7 +75,7 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base def state_to_html gcs = glcc_student mail = gcs.mail - return "数据异常PR连接为空" if mail.nil? || code_or_pr_url.nil? + return "数据异常,PR链接为空" if mail.nil? || code_or_pr_url.nil? state = check_pr_url gennerate_content(state) end @@ -92,7 +93,7 @@ class GlccMediumTermExamineMaterial < ActiveRecord::Base when 1 "

    PR链接为非GitLink平台链接

    " when 2 - "

    PR链接为GitLink平台非PR链接

    " + "

    PR链接为GitLink平台链接, 但非PR链接

    " when 3 "

    PR链接中的PR不存在

    " end diff --git a/app/models/glcc_registration_task.rb b/app/models/glcc_registration_task.rb new file mode 100644 index 000000000..7c8671e6f --- /dev/null +++ b/app/models/glcc_registration_task.rb @@ -0,0 +1,23 @@ + +# == Schema Information +# +# Table name: ignores +# user_id +# student_name +# school +# profession +# location +# grade +# phone +# mail +# created_on +# is_delete +# prove_attachment_id +# cancel_count +# round +# + +class GlccRegistrationTask < ActiveRecord::Base + self.table_name = "glcc_registration_task" + has_many :examines, :class_name => :GlccMediumTermExamineMaterial, :foreign_key => "task_id" +end diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb index df7c52abe..4fd0da8ec 100644 --- a/app/views/admins/glcc_pr_check/_examine_material.html.erb +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -1,16 +1,17 @@
    序号昵称序号昵称课题ID 邮件地址 视频地址 PR地址
    <%= list_index_no((params[:page] || 1).to_i, index) %><%= user.glcc_student.student_name %><%= user.glcc_student.mail %> 查看视频 查看PR <%= user.term == 1 ? "中期考核" : "结项考核"%><%= user.white_list ? "是":"否" %><%= user.state_to_html.html_safe %><%= user.created_on.strftime("%Y-%m-%d %H:%M")%><%= material.glcc_student.student_name %><%= material.task_id %><%= material.glcc_student.mail %> 查看视频 查看PR <%= material.term == 1 ? "中期考核" : "结项考核"%><%= material.white_list ? "是":"否" %><%= material.state_to_html.html_safe %><%= material.created_on.strftime("%Y-%m-%d %H:%M")%>
    - - - - - - - - - - + + + + + + + + + + + @@ -20,12 +21,13 @@ + - - + + - + <% end %> From 9a2610cfc522b3e71f95e0666e5a69f3ab2a4a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 16 Aug 2023 11:30:30 +0800 Subject: [PATCH 31/32] update glcc_pr_check list --- .../glcc_pr_check/_examine_material.html.erb | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb index 4fd0da8ec..286c18217 100644 --- a/app/views/admins/glcc_pr_check/_examine_material.html.erb +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -2,8 +2,8 @@ - - + + @@ -23,11 +23,23 @@ - - + + - + <% end %> From 7b2db3bd93ccb7478434bba3e44a7e8ad53d273d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1=E5=91=B1?= Date: Wed, 16 Aug 2023 14:21:58 +0800 Subject: [PATCH 32/32] update glcc_pr_check list view --- .../glcc_pr_check/_examine_material.html.erb | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/views/admins/glcc_pr_check/_examine_material.html.erb b/app/views/admins/glcc_pr_check/_examine_material.html.erb index 286c18217..ac8e550ac 100644 --- a/app/views/admins/glcc_pr_check/_examine_material.html.erb +++ b/app/views/admins/glcc_pr_check/_examine_material.html.erb @@ -1,16 +1,17 @@
    序号昵称课题ID邮件地址视频地址PR地址考核阶段白名单检测状态提交时间序号学生姓名课题ID课题名称邮件地址视频地址PR地址考核阶段白名单检测状态提交时间
    <%= list_index_no((params[:page] || 1).to_i, index) %> <%= material.glcc_student.student_name %> <%= material.task_id %><%= material.task.task_name %> <%= material.glcc_student.mail %> 查看视频 查看PR

    <%= material.defence_video_url.to_s %>

    <%= material.code_or_pr_url.to_s %>

    <%= material.term == 1 ? "中期考核" : "结项考核"%> <%= material.white_list ? "是":"否" %><%= material.state_to_html.html_safe %><%= material.state_to_html.blank? ? "通过" : material.state_to_html.html_safe %> <%= material.created_on.strftime("%Y-%m-%d %H:%M")%>
    序号学生姓名课题ID学生姓名课题ID 课题名称 邮件地址 视频地址<%= material.task_id %> <%= material.task.task_name %> <%= material.glcc_student.mail %>

    <%= material.defence_video_url.to_s %>

    <%= material.code_or_pr_url.to_s %>

    + + + <%= material.defence_video_url.nil? ? "" : material.defence_video_url.truncate(50) %> + + + + + + <%= material.code_or_pr_url.nil? ? "" : material.code_or_pr_url.truncate(50) %> + + + <%= material.term == 1 ? "中期考核" : "结项考核"%> <%= material.white_list ? "是":"否" %><%= material.state_to_html.blank? ? "通过" : material.state_to_html.html_safe %><%= material.state_to_html.blank?&&!material.white_list ? "通过" : material.state_to_html.html_safe %> <%= material.created_on.strftime("%Y-%m-%d %H:%M")%>
    - - - - + + + + - - - + 60 + + + @@ -22,18 +23,23 @@ - + +
    序号学生姓名课题ID课题名称序号学生姓名课题ID课题名称 邮件地址 视频地址 PR地址考核阶段白名单检测状态考核阶段白名单检测状态 提交时间
    <%= material.glcc_student.student_name %> <%= material.task_id %> <%= material.task.task_name %><%= material.glcc_student.mail %> + + <%=material.glcc_student.mail.truncate(20) %> + + - <%= material.defence_video_url.nil? ? "" : material.defence_video_url.truncate(50) %> + <%= material.defence_video_url.nil? ? "" : material.defence_video_url.truncate(30) %> - <%= material.code_or_pr_url.nil? ? "" : material.code_or_pr_url.truncate(50) %> + <%= material.code_or_pr_url.nil? ? "" : material.code_or_pr_url.truncate(30) %>