diff --git a/app/controllers/admins/project_categories_controller.rb b/app/controllers/admins/project_categories_controller.rb index 3b5065a16..8b1dd1f77 100644 --- a/app/controllers/admins/project_categories_controller.rb +++ b/app/controllers/admins/project_categories_controller.rb @@ -5,7 +5,7 @@ class Admins::ProjectCategoriesController < Admins::BaseController def index sort_by = ProjectCategory.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at' sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc' - q = ProjectCategory.includes(:projects).ransack(name_cont: params[:name]) + q = ProjectCategory.ransack(name_cont: params[:name]) project_categories = q.result(distinct: true).order("#{sort_by} #{sort_direction}") @project_categories = paginate(project_categories) diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb index 269ca66cc..b73d1efac 100644 --- a/app/controllers/organizations/organizations_controller.rb +++ b/app/controllers/organizations/organizations_controller.rb @@ -22,7 +22,7 @@ class Organizations::OrganizationsController < Organizations::BaseController @can_create_project = @organization.can_create_project?(current_user.id) @is_admin = can_edit_org? @is_member = @organization.is_member?(current_user.id) - Cache::V2::OwnerCommonService.new(@organization.login, @organization.mail).read + Cache::V2::OwnerCommonService.new(@organization.id).read end def create diff --git a/app/controllers/project_rank_controller.rb b/app/controllers/project_rank_controller.rb index d2477b331..7bd62987e 100644 --- a/app/controllers/project_rank_controller.rb +++ b/app/controllers/project_rank_controller.rb @@ -2,9 +2,11 @@ class ProjectRankController < ApplicationController # 根据时间获取热门项目 def index $redis_cache.zunionstore("recent-days-project-rank", get_timeable_key_names) + deleted_data = $redis_cache.smembers("v2-project-rank-deleted") + $redis_cache.zrem("recent-days-project-rank", deleted_data) unless deleted_data.blank? @project_rank = $redis_cache.zrevrange("recent-days-project-rank", 0, 4, withscores: true) rescue Exception => e - @project_rack = [] + @project_rank = [] end private diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 4c4aa3a00..1864c6964 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -191,7 +191,7 @@ class ProjectsController < ApplicationController def simple # 为了缓存活跃项目的基本信息,后续删除 - Cache::V2::ProjectCommonService.new(@project.id).reset + Cache::V2::ProjectCommonService.new(@project.id).read json_response(@project, current_user) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 48f016b98..744468ed8 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -52,7 +52,7 @@ class UsersController < ApplicationController @projects_mirrior_count = user_projects.mirror.size @projects_sync_mirrior_count = user_projects.sync_mirror.size # 为了缓存活跃用户的基本信息,后续删除 - Cache::V2::OwnerCommonService.new(@user.login, @user.mail).read + Cache::V2::OwnerCommonService.new(@user.id).read end def watch_users diff --git a/app/docs/slate/source/images/logo.png b/app/docs/slate/source/images/logo.png index 30affed0b..2f34775dc 100644 Binary files a/app/docs/slate/source/images/logo.png and b/app/docs/slate/source/images/logo.png differ diff --git a/public/docs/images/logo-b38b63e6.png b/app/docs/slate/source/images/trustie_logo.png similarity index 100% rename from public/docs/images/logo-b38b63e6.png rename to app/docs/slate/source/images/trustie_logo.png diff --git a/app/forms/projects/update_form.rb b/app/forms/projects/update_form.rb index ae93abf30..3048bc079 100644 --- a/app/forms/projects/update_form.rb +++ b/app/forms/projects/update_form.rb @@ -3,11 +3,12 @@ class Projects::UpdateForm < BaseForm validates :name, presence: true validates :name, length: { maximum: 50 } validates :description, length: { maximum: 200 } + validates :identifier, format: { with: CustomRegexp::REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" } + validate do check_project_category(project_category_id) check_project_language(project_language_id) - Rails.logger.info project_identifier - Rails.logger.info identifier + check_repository_name(user_id, identifier) unless identifier.blank? || identifier == project_identifier end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 9cad9f44b..f58436285 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -442,6 +442,14 @@ module ApplicationHelper User.find_by(gitea_uid: gitea_uid) end + def find_user_in_redis_cache(login, email) + $redis_cache.hgetall("v2-owner-common:#{login}-#{email}") + end + + def find_user_in_redis_cache_by_id(id) + $redis_cache.hgetall("v2-owner-common:#{id}") + end + def render_base64_decoded(str) return nil if str.blank? Base64.decode64 str diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 1096d1d21..cc50c8d66 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -35,6 +35,16 @@ module RepositoriesHelper end end + def render_cache_commit_author(author_json) + Rails.logger.info author_json['Email'] + if author_json["name"].present? && author_json["email"].present? + return find_user_in_redis_cache(author_json['name'], author_json['email']) + end + if author_json["Name"].present? && author_json["Email"].present? + return find_user_in_redis_cache(author_json['Name'], author_json['Email']) + end + end + def readme_render_decode64_content(str, path) return nil if str.blank? begin diff --git a/app/jobs/cache_async_clear_job.rb b/app/jobs/cache_async_clear_job.rb new file mode 100644 index 000000000..651dfaf41 --- /dev/null +++ b/app/jobs/cache_async_clear_job.rb @@ -0,0 +1,12 @@ +class CacheAsyncClearJob < ApplicationJob + queue_as :cache + + def perform(type, id=nil) + case type + when "project_common_service" + Cache::V2::ProjectCommonService.new(id).clear + when "owner_common_service" + Cache::V2::OwnnerCommonService.new(id).clear + end + end +end \ No newline at end of file diff --git a/app/jobs/cache_async_reset_job.rb b/app/jobs/cache_async_reset_job.rb index da3f01168..0df0f0fd4 100644 --- a/app/jobs/cache_async_reset_job.rb +++ b/app/jobs/cache_async_reset_job.rb @@ -7,6 +7,8 @@ class CacheAsyncResetJob < ApplicationJob Cache::V2::PlatformStatisticService.new.reset when "project_common_service" Cache::V2::ProjectCommonService.new(id).reset + when "owner_common_service" + Cache::V2::OwnnerCommonService.new(id).reset when "user_statistic_service" Cache::V2::UserStatisticService.new(id).reset end diff --git a/app/jobs/cache_async_set_job.rb b/app/jobs/cache_async_set_job.rb index f617b1316..9c7015d42 100644 --- a/app/jobs/cache_async_set_job.rb +++ b/app/jobs/cache_async_set_job.rb @@ -7,6 +7,8 @@ class CacheAsyncSetJob < ApplicationJob Cache::V2::PlatformStatisticService.new(params).call when "project_common_service" Cache::V2::ProjectCommonService.new(id, params).call + when "owner_common_service" + Cache::V2::OwnnerCommonService.new(id, params).call when "user_statistic_service" Cache::V2::UserStatisticService.new(id, params).call end diff --git a/app/models/organization.rb b/app/models/organization.rb index a967e4782..40c676e05 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -84,7 +84,7 @@ class Organization < Owner after_save :reset_cache_data def reset_cache_data - Cache::V2::OwnerCommonService.new(self.login, self.mail).reset + Cache::V2::OwnerCommonService.new(self.id).reset end def self.build(name, nickname, gitea_token=nil) diff --git a/app/models/project.rb b/app/models/project.rb index e8760acf1..45b93cd00 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -128,7 +128,7 @@ class Project < ApplicationRecord has_many :pinned_projects, dependent: :destroy has_many :has_pinned_users, through: :pinned_projects, source: :user has_many :webhooks, class_name: "Gitea::Webhook", primary_key: :gpid, foreign_key: :repo_id - after_create :init_project_common, :incre_user_statistic, :incre_platform_statistic + after_create :incre_user_statistic, :incre_platform_statistic after_save :check_project_members, :reset_cache_data before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned before_destroy :decre_project_common @@ -169,12 +169,8 @@ class Project < ApplicationRecord end end - def init_project_common - CacheAsyncResetJob.perform_later("project_common_service", self.id) - end - def decre_project_common - $redis_cache.del("v2-project-common:#{self.id}") + CacheAsyncClearJob.perform_later('project_common_service', self.id) end def incre_user_statistic diff --git a/app/models/user.rb b/app/models/user.rb index dcefa8aaa..8613b68a5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -208,7 +208,7 @@ class User < Owner validate :validate_password_length def reset_cache_data - Cache::V2::OwnerCommonService.new(self.login, self.mail).reset + Cache::V2::OwnerCommonService.new(self.id).reset end # 用户参与的所有项目 diff --git a/app/services/cache/v2/owner_common_service.rb b/app/services/cache/v2/owner_common_service.rb index d8b86d097..c97e34d48 100644 --- a/app/services/cache/v2/owner_common_service.rb +++ b/app/services/cache/v2/owner_common_service.rb @@ -1,12 +1,13 @@ class Cache::V2::OwnerCommonService < ApplicationService include AvatarHelper - attr_reader :owner_id, :login, :name, :avatar_url, :email - attr_accessor :owner + attr_reader :owner_id, :name + attr_accessor :owner, :login, :email - def initialize(login, email, params={}) - @login = login - @email = email + def initialize(owner_id, params={}) + @owner_id = owner_id + @email = params[:email] @name = params[:name] + @avatar_url = params[:avatar_url] end def read @@ -14,7 +15,6 @@ class Cache::V2::OwnerCommonService < ApplicationService end def call - load_owner set_owner_common end @@ -22,9 +22,15 @@ class Cache::V2::OwnerCommonService < ApplicationService reset_owner_common end + def clear + clear_owner_common + end + private def load_owner - @owner = Owner.find_by(login: @login) + @owner = Owner.find_by_id @owner_id + @login = @owner&.login + @email ||= @owner&.mail end def owner_common_key @@ -32,35 +38,47 @@ class Cache::V2::OwnerCommonService < ApplicationService end def owner_common_key_by_id - "v2-owner-common:#{@owner.id}" + "v2-owner-common:#{@owner&.id}" end def owner_common - $redis_cache.hgetall(owner_common_key).blank? ? reset_owner_common : $redis_cache.hgetall(owner_common_key) + result = $redis_cache.hgetall(owner_common_key_by_id) + result.blank? ? reset_owner_common : result end def set_owner_common - if $redis_cache.hgetall(owner_common_key).blank? + if $redis_cache.hgetall(owner_common_key_by_id).blank? reset_owner_common return - end - if @name.present? - if $redis_cache.hget(owner_common_key, "name").nil? - reset_owner_name - else - $redis_cache.hset(owner_common_key, "name", @name) - $redis_cache.hset(owner_common_key, "avatar_url", url_to_avatar(owner)) - - $redis_cache.hset(owner_common_key_by_id, "name", @name) - $redis_cache.hset(owner_common_key_by_id, "avatar_url", url_to_avatar(owner)) + else + load_owner + return if @owner.nil? + if @name.present? + if $redis_cache.hget(owner_common_key, "name").nil? + reset_owner_name + else + $redis_cache.hset(owner_common_key, "name", @name) + $redis_cache.hset(owner_common_key_by_id, "name", @name) + end end - end - if @email.present? - if $redis_cache.hget(owner_common_key, "email").nil? - reset_owner_email - else - $redis_cache.hset(owner_common_key, "email", @email) - $redis_cache.hset(owner_common_key_by_id, "email", @email) + if @email.present? + if $redis_cache.hget(owner_common_key, "email").nil? + reset_owner_email + else + # 更改邮箱这里把旧数据删除 + $redis_cache.del("v2-owner-common:#{@login}-*") + $redis_cache.hset(owner_common_key, "email", @email) + $redis_cache.hset(owner_common_key_by_id, "email", @email) + end + end + if @avatar_url.present? + if $redis_cache.hget(owner_common_key, "avatar_url").nil? + reset_owner_avatar_url + else + $redis_cache.hset(owner_common_key, "avatar_url", @avatar_url) + $redis_cache.hset(owner_common_key_by_id, "avatar_url", @avatar_url) + end + end end @@ -88,20 +106,30 @@ class Cache::V2::OwnerCommonService < ApplicationService def reset_owner_name $redis_cache.hset(owner_common_key, "name", owner&.real_name) - $redis_cache.hset(owner_common_key, "avatar_url", url_to_avatar(owner)) $redis_cache.hset(owner_common_key_by_id, "name", owner&.real_name) + end + + def reset_owner_avatar_url + $redis_cache.hset(owner_common_key, "avatar_url", url_to_avatar(owner)) $redis_cache.hset(owner_common_key_by_id, "avatar_url", url_to_avatar(owner)) end def reset_owner_common - load_owner - $redis_cache.del(owner_common_key) + clear_owner_common reset_owner_id reset_owner_type reset_owner_login reset_owner_email reset_owner_name + reset_owner_avatar_url $redis_cache.hgetall(owner_common_key) end + + def clear_owner_common + load_owner + return if @owner.nil? + $redis_cache.del(owner_common_key) + $redis_cache.del(owner_common_key_by_id) + end end \ No newline at end of file diff --git a/app/services/cache/v2/platform_statistic_service.rb b/app/services/cache/v2/platform_statistic_service.rb index bc6621a38..5bf4f4a74 100644 --- a/app/services/cache/v2/platform_statistic_service.rb +++ b/app/services/cache/v2/platform_statistic_service.rb @@ -64,7 +64,9 @@ class Cache::V2::PlatformStatisticService < ApplicationService end def platform_statistic - $redis_cache.hgetall(platform_statistic_key).blank? ? reset_platform_statistic : $redis_cache.hgetall(platform_statistic_key) + result = $redis_cache.hgetall(platform_statistic_key) + + result.blank? ? reset_platform_statistic : result end def set_platform_statistic diff --git a/app/services/cache/v2/project_common_service.rb b/app/services/cache/v2/project_common_service.rb index 77a7d27b7..760c6d05b 100644 --- a/app/services/cache/v2/project_common_service.rb +++ b/app/services/cache/v2/project_common_service.rb @@ -28,6 +28,10 @@ class Cache::V2::ProjectCommonService < ApplicationService reset_project_common end + def clear + clear_project_common + end + private def load_project @project = Project.find_by_id(project_id) @@ -78,109 +82,75 @@ class Cache::V2::ProjectCommonService < ApplicationService end def project_common - $redis_cache.hgetall(project_common_key).blank? ? reset_project_common : $redis_cache.hgetall(project_common_key) + result = $redis_cache.hgetall(project_common_key) + result.blank? ? reset_project_common : result end def set_project_common if $redis_cache.hgetall(project_common_key).blank? reset_project_common return - end - load_project - return unless @project.is_full_public - if @owner_id.present? - if $redis_cache.hget(project_common_key, owner_id_key).nil? - reset_project_owner_id - else - $redis_cache.hset(project_common_key, owner_id_key, @owner_id) + else + load_project + return unless @project.is_full_public + if @owner_id.present? + if $redis_cache.hget(project_common_key, owner_id_key).nil? + reset_project_owner_id + else + $redis_cache.hset(project_common_key, owner_id_key, @owner_id) + end end - end - if @name.present? - if $redis_cache.hget(project_common_key, name_key).nil? - reset_project_name - else - $redis_cache.hset(project_common_key, name_key, @name) + if @name.present? + if $redis_cache.hget(project_common_key, name_key).nil? + reset_project_name + else + $redis_cache.hset(project_common_key, name_key, @name) + end end - end - if @identifier.present? - if $redis_cache.hget(project_common_key, identifier_key).nil? - reset_project_identifier - else - $redis_cache.hset(project_common_key, identifier_key, @identifier) + if @identifier.present? + if $redis_cache.hget(project_common_key, identifier_key).nil? + reset_project_identifier + else + $redis_cache.hset(project_common_key, identifier_key, @identifier) + end end - end - if @description.present? - if $redis_cache.hget(project_common_key, description_key).nil? - reset_project_description - else - $redis_cache.hset(project_common_key, description_key, @description) + if @description.present? + if $redis_cache.hget(project_common_key, description_key).nil? + reset_project_description + else + $redis_cache.hset(project_common_key, description_key, @description) + end end - end - if @visits.present? - if $redis_cache.hget(project_common_key, visits_key).nil? - reset_project_visits - Cache::V2::ProjectRankService.call(@project_id, {visits: @visits}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {visits: @visits}) - else - puts project_common_key - puts visits_key - puts @visits + if @visits.present? $redis_cache.hincrby(project_common_key, visits_key, @visits.to_s) Cache::V2::ProjectRankService.call(@project_id, {visits: @visits}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {visits: @visits}) end - end - if @watchers.present? - if $redis_cache.hget(project_common_key, watchers_key).nil? - reset_project_watchers - else + if @watchers.present? $redis_cache.hincrby(project_common_key, watchers_key, @watchers) end - end - if @praises.present? - if $redis_cache.hget(project_common_key, praises_key).nil? - reset_project_praises - Cache::V2::ProjectRankService.call(@project_id, {praises: @praises}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {praises: @praises}) - else + if @praises.present? $redis_cache.hincrby(project_common_key, praises_key, @praises) - Cache::V2::ProjectRankService.call(@project_id, {praises: @praises}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {praises: @praises}) + Cache::V2::ProjectRankService.call(@project_id, {praises: @praises}) + Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {praises: @praises}) end - end - if @forks.present? - if $redis_cache.hget(project_common_key, forks_key).nil? - reset_project_forks - Cache::V2::ProjectRankService.call(@project_id, {forks: @forks}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {forks: @forks}) - else + if @forks.present? $redis_cache.hincrby(project_common_key, forks_key, @forks) Cache::V2::ProjectRankService.call(@project_id, {forks: @forks}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {forks: @forks}) end - end - if @issues.present? - if $redis_cache.hget(project_common_key, issues_key).nil? - reset_project_issues - Cache::V2::ProjectRankService.call(@project_id, {issues: @issues}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {issues: @issues}) - else + if @issues.present? $redis_cache.hincrby(project_common_key, issues_key, @issues) Cache::V2::ProjectRankService.call(@project_id, {issues: @issues}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {issues: @issues}) end - end - if @pullrequests.present? - if $redis_cache.hget(project_common_key, pullrequests_key).nil? - reset_project_pullrequests - Cache::V2::ProjectRankService.call(@project_id, {pullrequests: @pullrequests}) - Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {pullrequests: @pullrequests}) - else + if @pullrequests.present? $redis_cache.hincrby(project_common_key, pullrequests_key, @pullrequests) Cache::V2::ProjectRankService.call(@project_id, {pullrequests: @pullrequests}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {pullrequests: @pullrequests}) end end + $redis_cache.hgetall(project_common_key) end @@ -241,4 +211,9 @@ class Cache::V2::ProjectCommonService < ApplicationService $redis_cache.hgetall(project_common_key) end + + def clear_project_common + $redis_cache.del(project_common_key) + Cache::V2::ProjectRankService.new(@project_id).clear + end end \ No newline at end of file diff --git a/app/services/cache/v2/project_rank_service.rb b/app/services/cache/v2/project_rank_service.rb index 45484dc08..7e5d323bf 100644 --- a/app/services/cache/v2/project_rank_service.rb +++ b/app/services/cache/v2/project_rank_service.rb @@ -23,6 +23,10 @@ class Cache::V2::ProjectRankService < ApplicationService reset_project_rank end + def clear + clear_project_rank + end + private def load_project_common @project_common = Cache::V2::ProjectCommonService.new(@project_id).read @@ -33,7 +37,8 @@ class Cache::V2::ProjectRankService < ApplicationService end def project_rank - $redis_cache.zscore(project_rank_key, @project_id).blank? ? reset_project_rank : $redis_cache.zscore(project_rank_key, @project_id) + result = $redis_cache.zscore(project_rank_key, @project_id) + result.blank? ? reset_project_rank : result end def set_project_rank @@ -41,23 +46,24 @@ class Cache::V2::ProjectRankService < ApplicationService if $redis_cache.zscore(project_rank_key, @project_id).blank? reset_project_rank return + else + if @visits.present? + $redis_cache.zincrby(project_rank_key, @visits.to_i * 1, @project_id) + end + if @praises.present? + $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) + end + if @forks.present? + $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) + end + if @issues.present? + $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) + end + if @pullrequests.present? + $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) + end + reset_user_project_rank end - if @visits.present? - $redis_cache.zincrby(project_rank_key, @visits.to_i * 1, @project_id) - end - if @praises.present? - $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) - end - if @forks.present? - $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) - end - if @issues.present? - $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) - end - if @pullrequests.present? - $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) - end - reset_user_project_rank $redis_cache.zscore(project_rank_key, @project_id) end @@ -74,4 +80,8 @@ class Cache::V2::ProjectRankService < ApplicationService def reset_user_project_rank $redis_cache.zadd("v2-user-project-rank:#{@project_common["owner_id"]}", $redis_cache.zscore(project_rank_key, @project_id), @project_id) end + + def clear_project_rank + $redis_cache.sadd('v2-project-rank-deleted', @project_id) + end end \ No newline at end of file diff --git a/app/services/cache/v2/user_statistic_service.rb b/app/services/cache/v2/user_statistic_service.rb index 8caa66d88..b82797d84 100644 --- a/app/services/cache/v2/user_statistic_service.rb +++ b/app/services/cache/v2/user_statistic_service.rb @@ -12,6 +12,7 @@ class Cache::V2::UserStatisticService < ApplicationService @project_praise_count = params[:project_praise_count] @project_watcher_count = params[:project_watcher_count] @pullrequest_count = params[:pullrequest_count] + Cache::V2::OwnerCommonService.new(user_id).read end def read @@ -65,7 +66,8 @@ class Cache::V2::UserStatisticService < ApplicationService end def user_statistic - $redis_cache.hgetall(user_statistic_key).blank? ? reset_user_statistic : $redis_cache.hgetall(user_statistic_key) + result = $redis_cache.hgetall(user_statistic_key) + result.blank? ? reset_user_statistic : result end def set_user_statistic diff --git a/app/views/admins/project_categories/_list.html.erb b/app/views/admins/project_categories/_list.html.erb index 1a460a486..1a1626bc4 100644 --- a/app/views/admins/project_categories/_list.html.erb +++ b/app/views/admins/project_categories/_list.html.erb @@ -20,7 +20,7 @@ <%= project_category.pinned_index == 0 ? "" : "√" %> <%= project_category.projects_count %> - <%= project_category.projects.where(is_pinned: true).size %> + <%= project_category.projects.select(:id).where(is_pinned: true).size %> <%= project_category.created_at&.strftime('%Y-%m-%d %H:%M') %> <%= link_to "编辑", edit_admins_project_category_path(project_category), remote: true, class: "action" %> diff --git a/app/views/projects/branches.json.jbuilder b/app/views/projects/branches.json.jbuilder index ad4f4328a..c7c2025b3 100644 --- a/app/views/projects/branches.json.jbuilder +++ b/app/views/projects/branches.json.jbuilder @@ -12,10 +12,10 @@ json.array! @branches do |branch| json.timestamp render_unix_time(branch['commit']['timestamp']) json.time_from_now time_from_now(branch['commit']['timestamp']) json.author do - json.partial! 'repositories/commit_author', user: render_commit_author(branch['commit']['author']), name: branch['commit']['author']['name'] + json.partial! 'repositories/commit_author', user: render_cache_commit_author(branch['commit']['author']), name: branch['commit']['author']['name'] end json.committer do - json.partial! 'repositories/commit_author', user: render_commit_author(branch['commit']['committer']), name: branch['commit']['committer']['name'] + json.partial! 'repositories/commit_author', user: render_cache_commit_author(branch['commit']['committer']), name: branch['commit']['committer']['name'] end end end diff --git a/app/views/projects/branches_slice.json.jbuilder b/app/views/projects/branches_slice.json.jbuilder index 31c662a13..963bca0a8 100644 --- a/app/views/projects/branches_slice.json.jbuilder +++ b/app/views/projects/branches_slice.json.jbuilder @@ -14,10 +14,10 @@ json.array! @branches_slice do |branch_slice| json.timestamp render_unix_time(branch['commit']['timestamp']) json.time_from_now time_from_now(branch['commit']['timestamp']) json.author do - json.partial! 'repositories/commit_author', user: render_commit_author(branch['commit']['author']), name: branch['commit']['author']['name'] + json.partial! 'repositories/commit_author', user: render_cache_commit_author(branch['commit']['author']), name: branch['commit']['author']['name'] end json.committer do - json.partial! 'repositories/commit_author', user: render_commit_author(branch['commit']['committer']), name: branch['commit']['committer']['name'] + json.partial! 'repositories/commit_author', user: render_cache_commit_author(branch['commit']['committer']), name: branch['commit']['committer']['name'] end end end diff --git a/app/views/pull_requests/_commit.json.jbuilder b/app/views/pull_requests/_commit.json.jbuilder index 7a9232efe..52b776008 100644 --- a/app/views/pull_requests/_commit.json.jbuilder +++ b/app/views/pull_requests/_commit.json.jbuilder @@ -1,11 +1,9 @@ json.author do - author = User.find_by(mail: commit['Author']['Email']) - json.partial! 'repositories/commit_author', locals: { user: author, name: commit['Committer']['Name'] } + json.partial! 'repositories/commit_author', locals: { user: render_cache_commit_author(commit['Author']), name: commit['Author']['Name'] } end json.committer do - author = User.find_by(mail: commit['Committer']['Email']) - json.partial! 'repositories/commit_author', locals: { user: author, name: commit['Committer']['Name'] } + json.partial! 'repositories/commit_author', locals: { user: render_cache_commit_author(commit['Committer']), name: commit['Committer']['Name'] } end json.timestamp render_unix_time(commit['Committer']['When']) json.time_from_now time_from_now(commit['Committer']['When']) diff --git a/app/views/repositories/_commit.json.jbuilder b/app/views/repositories/_commit.json.jbuilder index 95cb03412..9c29116e9 100644 --- a/app/views/repositories/_commit.json.jbuilder +++ b/app/views/repositories/_commit.json.jbuilder @@ -26,9 +26,9 @@ if @project.forge? end json.author do - json.partial! 'commit_author', user: render_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] end json.committer do - json.partial! 'commit_author', user: render_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] end end diff --git a/app/views/repositories/_commit_author.json.jbuilder b/app/views/repositories/_commit_author.json.jbuilder index c63edf9b1..83935709a 100644 --- a/app/views/repositories/_commit_author.json.jbuilder +++ b/app/views/repositories/_commit_author.json.jbuilder @@ -1,9 +1,17 @@ -if user - json.id user.id - json.login user.login - json.name user.real_name - json.type user&.type - json.image_url url_to_avatar(user) +if user.present? + if user.is_a?(Hash) + json.id user["id"] + json.login user["login"] + json.name user["name"] + json.type user["type"] + json.image_url user["avatar_url"] + else + json.id user.id + json.login user.login + json.name user.real_name + json.type user&.type + json.image_url url_to_avatar(user) + end else json.id nil json.login name diff --git a/app/views/repositories/_contributor.json.jbuilder b/app/views/repositories/_contributor.json.jbuilder new file mode 100644 index 000000000..56fa9ce86 --- /dev/null +++ b/app/views/repositories/_contributor.json.jbuilder @@ -0,0 +1,16 @@ +user = $redis_cache.hgetall("v2-owner-common:#{contributor["login"]}-#{contributor["email"]}") +if user.blank? + json.contributions contributor["contributions"] + # json.gid contributor["id"] + json.login contributor["login"] + json.type nil + json.name contributor["login"] + json.image_url User::Avatar.get_letter_avatar_url(contributor["login"]) +else + json.contributions contributor["contributions"] + # json.gid contributor["id"] + json.login user["login"] + json.type user["type"] + json.name user["name"] + json.image_url user["avatar_url"] +end diff --git a/app/views/repositories/commits.json.jbuilder b/app/views/repositories/commits.json.jbuilder index cf4a409f5..33406e6a5 100644 --- a/app/views/repositories/commits.json.jbuilder +++ b/app/views/repositories/commits.json.jbuilder @@ -28,10 +28,10 @@ else # end # end json.author do - json.partial! 'commit_author', user: render_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] end json.committer do - json.partial! 'commit_author', user: render_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] end end end diff --git a/app/views/repositories/contributors.json.jbuilder b/app/views/repositories/contributors.json.jbuilder index 9165cf948..fa52475a5 100644 --- a/app/views/repositories/contributors.json.jbuilder +++ b/app/views/repositories/contributors.json.jbuilder @@ -1,16 +1,6 @@ total_count = @contributors.size json.contributors @contributors.each do |contributor| - user = User.find_by(gitea_uid: contributor["id"]) - if contributor["login"] == "root" - total_count -= 1 - next - end - json.contributions contributor["contributions"] - # json.gid contributor["id"] - json.login user.login - json.type user&.type - json.name user.real_name - json.image_url url_to_avatar(user) + json.partial! 'contributor', locals: { contributor: contributor } end json.total_count total_count diff --git a/app/views/repositories/detail.json.jbuilder b/app/views/repositories/detail.json.jbuilder index c489cf47a..20faea44c 100644 --- a/app/views/repositories/detail.json.jbuilder +++ b/app/views/repositories/detail.json.jbuilder @@ -56,17 +56,7 @@ json.tags_count @result[:branch_tag_total_count]['tag_count'] || 0 json.contributors do total_count = @result[:contributor].size json.list @result[:contributor].each do |contributor| - user = User.find_by(gitea_uid: contributor["id"]) - if contributor["login"] == "root" || user.nil? - total_count -= 1 - next - end - json.contributions contributor["contributions"] - json.gid contributor["id"] - json.login user.login - json.type user&.type - json.name user.real_name - json.image_url url_to_avatar(user) + json.partial! 'contributor', locals: { contributor: contributor } end json.total_count total_count end diff --git a/app/views/repositories/tags.json.jbuilder b/app/views/repositories/tags.json.jbuilder index d1ee3671e..eaf11058e 100644 --- a/app/views/repositories/tags.json.jbuilder +++ b/app/views/repositories/tags.json.jbuilder @@ -5,7 +5,7 @@ json.array! @tags do |tag| json.zipball_url render_zip_url(@owner, @repository, tag['name']) json.tarball_url render_tar_url(@owner, @repository, tag['name']) json.tagger do - json.partial! 'commit_author', user: render_commit_author(tag['tagger']), name: tag['tagger']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(tag['tagger']), name: tag['tagger']['name'] end json.time_ago time_from_now(tag['tagger']['date'].to_time) json.created_at_unix tag['tagger']['date'].to_time.to_i @@ -16,10 +16,10 @@ json.array! @tags do |tag| json.time_ago time_from_now(tag['commit']['commiter']['date'].to_time) json.created_at_unix tag['commit']['commiter']['date'].to_time.to_i json.committer do - json.partial! 'commit_author', user: render_commit_author(tag['commit']['commiter']), name: tag['commit']['commiter']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(tag['commit']['commiter']), name: tag['commit']['commiter']['name'] end json.author do - json.partial! 'commit_author', user: render_commit_author(tag['commit']['author']), name: tag['commit']['author']['name'] + json.partial! 'commit_author', user: render_cache_commit_author(tag['commit']['author']), name: tag['commit']['author']['name'] end end end diff --git a/app/views/user_rank/_detail.json.jbuilder b/app/views/user_rank/_detail.json.jbuilder index 54afea5c4..caefa7d31 100644 --- a/app/views/user_rank/_detail.json.jbuilder +++ b/app/views/user_rank/_detail.json.jbuilder @@ -1,15 +1,21 @@ owner_common = $redis_cache.hgetall("v2-owner-common:#{item[0]}") +deleted_data = $redis_cache.smembers("v2-project-rank-deleted") +$redis_cache.zrem("v2-user-project-rank:#{item[0]}", delete_data) unless deleted_data.blank? popular_project = $redis_cache.zrevrange("v2-user-project-rank:#{item[0]}", 0, 1, withscores: true)[0] -popular_project_common = $redis_cache.hgetall("v2-project-common:#{popular_project[0]}") json.id item[0] json.score item[1] json.name owner_common["name"] json.type owner_common["type"] json.login owner_common["login"] json.avatar_url owner_common["avatar_url"] -json.project do - json.id popular_project[0] - json.name popular_project_common["name"] - json.identifier popular_project_common["identifier"] - json.description popular_project_common["description"] +if popular_project.blank? + json.project nil +else + popular_project_common = $redis_cache.hgetall("v2-project-common:#{popular_project[0]}") + json.project do + json.id popular_project[0] + json.name popular_project_common["name"] + json.identifier popular_project_common["identifier"] + json.description popular_project_common["description"] + end end \ No newline at end of file diff --git a/public/docs/api.html b/public/docs/api.html index fe1050fd7..450191d53 100644 --- a/public/docs/api.html +++ b/public/docs/api.html @@ -296,7 +296,7 @@
- +
Shell JavaScript diff --git a/public/docs/images/logo-cf8353ee.png b/public/docs/images/logo-cf8353ee.png new file mode 100644 index 000000000..2f34775dc Binary files /dev/null and b/public/docs/images/logo-cf8353ee.png differ diff --git a/public/docs/images/trustie_logo-b38b63e6.png b/public/docs/images/trustie_logo-b38b63e6.png new file mode 100644 index 000000000..30affed0b Binary files /dev/null and b/public/docs/images/trustie_logo-b38b63e6.png differ diff --git a/public/images/email_logo.png b/public/images/email_logo.png new file mode 100644 index 000000000..ac07686b7 Binary files /dev/null and b/public/images/email_logo.png differ diff --git a/public/message_template/issue_assigned.html b/public/message_template/issue_assigned.html index 8b78dbdaf..86952dd14 100755 --- a/public/message_template/issue_assigned.html +++ b/public/message_template/issue_assigned.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1}在 {nickname2}/{repository} 指派给你一个易修:{title}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/issue_changed.html b/public/message_template/issue_changed.html index 5f8d796b4..52219de58 100755 --- a/public/message_template/issue_changed.html +++ b/public/message_template/issue_changed.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -44,16 +44,11 @@ {ifduedate}{nickname1}将结束日期从 {duedate1} 修改为 {duedate2}{endduedate}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/issue_deleted.html b/public/message_template/issue_deleted.html index 1eb40c81c..4174d179e 100755 --- a/public/message_template/issue_deleted.html +++ b/public/message_template/issue_deleted.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname}已将易修 {title} 删除

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/organization_joined.html b/public/message_template/organization_joined.html index cc0c68ed2..e3848f473 100755 --- a/public/message_template/organization_joined.html +++ b/public/message_template/organization_joined.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你已加入 {organization} 组织

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/organization_left.html b/public/message_template/organization_left.html index 5355129fd..32b1dc30e 100755 --- a/public/message_template/organization_left.html +++ b/public/message_template/organization_left.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你已被移出 {organization} 组织

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/organization_role.html b/public/message_template/organization_role.html index 661698b8a..b411c7340 100755 --- a/public/message_template/organization_role.html +++ b/public/message_template/organization_role.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 组织 {organization} 已把你的角色修改为 {role}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_issue.html b/public/message_template/project_issue.html index d9999e70c..98d645a11 100755 --- a/public/message_template/project_issue.html +++ b/public/message_template/project_issue.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1}在 {nickname2}/{repository} 新建了一个易修:{title}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_joined.html b/public/message_template/project_joined.html index c144da01a..dfafd5d92 100755 --- a/public/message_template/project_joined.html +++ b/public/message_template/project_joined.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你已加入 {nickname}/{repository} 项目

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_left.html b/public/message_template/project_left.html index 5a87e8ba4..94a0e9862 100755 --- a/public/message_template/project_left.html +++ b/public/message_template/project_left.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你已被移出 {nickname}/{repository} 项目

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_member_joined.html b/public/message_template/project_member_joined.html index 9f376d4f3..d2fec456d 100755 --- a/public/message_template/project_member_joined.html +++ b/public/message_template/project_member_joined.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1} 已加入项目 {nickname2}/{repository}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_member_left.html b/public/message_template/project_member_left.html index f1c6b6d95..8dfca4a2e 100755 --- a/public/message_template/project_member_left.html +++ b/public/message_template/project_member_left.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1} 已被移出项目 {nickname2}/{repository}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_pull_request.html b/public/message_template/project_pull_request.html index c342894b0..78aa5c2d4 100755 --- a/public/message_template/project_pull_request.html +++ b/public/message_template/project_pull_request.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1}在 {nickname2}/{repository} 提交了一个合并请求:{title}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_role.html b/public/message_template/project_role.html index db64a4f76..17f53e37b 100755 --- a/public/message_template/project_role.html +++ b/public/message_template/project_role.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 项目 {nickname}/{repository} 已把你的角色修改为 {role}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/project_setting_changed.html b/public/message_template/project_setting_changed.html index ef5af71fd..4d1f9762d 100755 --- a/public/message_template/project_setting_changed.html +++ b/public/message_template/project_setting_changed.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -41,16 +41,11 @@ {ifnavbar}将项目导航更改为"{navbar}"{endnavbar}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/pull_request_assigned.html b/public/message_template/pull_request_assigned.html index fe139ec1b..c12924d1b 100755 --- a/public/message_template/pull_request_assigned.html +++ b/public/message_template/pull_request_assigned.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ {nickname1}在 {nickname2}/{repository} 指派给你一个合并请求:{title}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/pull_request_changed.html b/public/message_template/pull_request_changed.html index 5cafdc47e..ab9c3f6a1 100755 --- a/public/message_template/pull_request_changed.html +++ b/public/message_template/pull_request_changed.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -38,16 +38,11 @@ {ifpriority}{nickname1}将优先级从 {priority1} 修改为 {priority2}{endpriority}

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/pull_request_closed.html b/public/message_template/pull_request_closed.html index d0828c19a..dca5e1c7d 100755 --- a/public/message_template/pull_request_closed.html +++ b/public/message_template/pull_request_closed.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你提交的合并请求:{title} 被拒绝;

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队

diff --git a/public/message_template/pull_request_merged.html b/public/message_template/pull_request_merged.html index e1f028a7e..8c6e3469c 100755 --- a/public/message_template/pull_request_merged.html +++ b/public/message_template/pull_request_merged.html @@ -24,8 +24,8 @@
- -

确实让创新更美好

+ +

确实开源,协同创新

@@ -34,16 +34,11 @@ 你提交的合并请求:{title} 已通过;

- -

- 扫一扫,关注trustie微信公众号,更方便获取平台动态,消息推送等提醒
- 想了解更多信息,请访问 www.trustie.net -

如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见
QQ群:1071514693

-

Trustie团队

+

GitLink团队