| @@ -176,7 +176,9 @@ GEM | |||
| mimemagic (~> 0.3.2) | |||
| maruku (0.7.3) | |||
| method_source (0.9.2) | |||
| mimemagic (0.3.4) | |||
| mimemagic (0.3.10) | |||
| nokogiri (~> 1) | |||
| rake | |||
| mini_mime (1.0.2) | |||
| mini_portile2 (2.4.0) | |||
| minitest (5.14.0) | |||
| @@ -196,6 +196,25 @@ class AccountsController < ApplicationController | |||
| # session[:user_id] = @user.id | |||
| end | |||
| def change_password | |||
| @user = User.find_by(login: params[:login]) | |||
| return render_error("未找到相关用户!") if @user.blank? | |||
| return render_error("旧密码不正确") unless @user.check_password?(params[:old_password]) | |||
| sync_params = { | |||
| password: params[:password].to_s, | |||
| email: @user.mail | |||
| } | |||
| interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params) | |||
| if interactor.success? | |||
| @user.update_attribute(:password, params[:password]) | |||
| render_ok | |||
| else | |||
| render_error(interactor.error) | |||
| end | |||
| end | |||
| # 忘记密码 | |||
| def reset_password | |||
| begin | |||
| @@ -773,7 +773,26 @@ class ApplicationController < ActionController::Base | |||
| def base_url | |||
| request.base_url | |||
| end | |||
| def convert_image! | |||
| @image = params[:image] || user_params[:image] | |||
| return unless @image.present? | |||
| max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M | |||
| if @image.class == ActionDispatch::Http::UploadedFile | |||
| render_error('请上传文件') if @image.size.zero? | |||
| render_error('文件大小超过限制') if @image.size > max_size.to_i | |||
| else | |||
| image = @image.to_s.strip | |||
| return render_error('请上传正确的图片') if image.blank? | |||
| @image = Util.convert_base64_image(image, max_size: max_size.to_i) | |||
| end | |||
| rescue Base64ImageConverter::Error => ex | |||
| render_error(ex.message) | |||
| end | |||
| def avatar_path(object) | |||
| ApplicationController.helpers.disk_filename(object.class, object.id) | |||
| end | |||
| private | |||
| def object_not_found | |||
| @@ -70,25 +70,6 @@ class Organizations::OrganizationsController < Organizations::BaseController | |||
| end | |||
| private | |||
| def convert_image! | |||
| return unless params[:image].present? | |||
| max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M | |||
| if params[:image].class == ActionDispatch::Http::UploadedFile | |||
| @image = params[:image] | |||
| render_error('请上传文件') if @image.size.zero? | |||
| render_error('文件大小超过限制') if @image.size > max_size.to_i | |||
| else | |||
| image = params[:image].to_s.strip | |||
| return render_error('请上传正确的图片') if image.blank? | |||
| @image = Util.convert_base64_image(image, max_size: max_size.to_i) | |||
| end | |||
| rescue Base64ImageConverter::Error => ex | |||
| render_error(ex.message) | |||
| end | |||
| def avatar_path(organization) | |||
| ApplicationController.helpers.disk_filename(organization.class, organization.id) | |||
| end | |||
| def organization_params | |||
| params.permit(:name, :description, :website, :location, | |||
| @@ -0,0 +1,26 @@ | |||
| class Users::HeadmapsController < Users::BaseController | |||
| def index | |||
| result = Gitea::User::HeadmapService.call(observed_user.login, start_stamp, end_stamp) | |||
| @headmaps = result[2] | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| private | |||
| def start_stamp | |||
| if params[:year].present? | |||
| Date.new(params[:year], 1).to_time.to_i | |||
| else | |||
| Date.today.to_time.to_i - 365*24*60*60 | |||
| end | |||
| end | |||
| def end_stamp | |||
| if params[:year].present? | |||
| Date.new(params[:year], 1).to_time.to_i + 365*24*60*60 | |||
| else | |||
| Date.today.to_time.to_i | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,45 @@ | |||
| class Users::IsPinnedProjectsController < Users::BaseController | |||
| before_action :private_user_resources!, only: [:pin] | |||
| def index | |||
| @is_pinned_projects = observed_user.pinned_projects.order(position: :desc, created_at: :asc).includes(project: [:project_category, :project_language, :repository]).order(position: :desc) | |||
| @is_pinned_projects = kaminari_paginate(@is_pinned_projects) | |||
| end | |||
| def pin | |||
| observed_user.is_pinned_project_ids = is_pinned_project_ids | |||
| render_ok | |||
| rescue ActiveRecord::RecordNotFound => e | |||
| render_not_found | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| def update | |||
| @pinned_project = PinnedProject.find_by_id(params[:id]) | |||
| @pinned_project.attributes = pinned_project_params | |||
| if @pinned_project.save | |||
| render_ok | |||
| else | |||
| render_error | |||
| end | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| private | |||
| def is_pinned_project_ids | |||
| if params[:is_pinned_project_ids].present? | |||
| return params[:is_pinned_project_ids].select{|id| observed_user.full_member_projects.visible.pluck(:id).include?(id.to_i) } | |||
| end | |||
| if params[:is_pinned_project_id].present? | |||
| return observed_user.is_pinned_project_ids unless observed_user.full_member_projects.visible.pluck(:id).include?(params[:is_pinned_project_id].to_i) | |||
| return observed_user.is_pinned_project_ids.include?(params[:is_pinned_project_id].to_i) ? observed_user.is_pinned_project_ids : observed_user.is_pinned_project_ids.push(params[:is_pinned_project_id].to_i) | |||
| end | |||
| end | |||
| def pinned_project_params | |||
| params.require(:pinned_project).permit(:position) | |||
| end | |||
| end | |||
| @@ -0,0 +1,11 @@ | |||
| class Users::ProjectTrendsController < Users::BaseController | |||
| def index | |||
| if params[:date].present? | |||
| @project_trends = observed_user.project_trends.where("DATE(created_at) = ?", params[:date]) | |||
| else | |||
| @project_trends = observed_user.project_trends | |||
| end | |||
| @project_trends = kaminari_paginate(@project_trends.includes(:trend, :project).order(created_at: :desc)) | |||
| end | |||
| end | |||
| @@ -0,0 +1,190 @@ | |||
| class Users::StatisticsController < Users::BaseController | |||
| before_action :preload_develop_data, only: [:develop] | |||
| # 近期活动统计 | |||
| def activity | |||
| date_range = (1.week.ago.to_date..Date.today).to_a | |||
| commit_request = Gitea::User::HeadmapService.call(observed_user.login, 1.week.ago.to_date.to_time.to_i, Date.today.to_time.to_i) | |||
| commit_data = commit_request[2] | |||
| @date_data = [] | |||
| @issue_data = [] | |||
| @pull_request_data = [] | |||
| @commit_data = [] | |||
| date_range.each do |date| | |||
| @date_data << date.strftime("%Y.%m.%d") | |||
| @issue_data << observed_user.issues.where("DATE(created_on) = ?", date).size | |||
| @pull_request_data << observed_user.pull_requests.where("DATE(created_at) = ?", date).size | |||
| date_commit_data = commit_data.select{|item| item["timestamp"] == date.to_time.to_i} | |||
| @commit_data << (date_commit_data.blank? ? 0 : date_commit_data[0]["contributions"].to_i) | |||
| end | |||
| render :json => {dates: @date_data, issues_count: @issue_data, pull_requests_count: @pull_request_data, commits_count: @commit_data} | |||
| end | |||
| # 开发能力 | |||
| def develop | |||
| if params[:start_time].present? && params[:end_time].present? | |||
| # 影响力 | |||
| @influence = (60.0 + @follow_count / (@follow_count + 10.0) * 40.0).to_i | |||
| @platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 10.0) * 40.0).to_i | |||
| # 贡献度 | |||
| @contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 10.0) * 40.0).to_i | |||
| @platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 10.0) * 40.0).to_i | |||
| # 活跃度 | |||
| @activity = (60.0 + @issues_count / (@issues_count + 10.0) * 40.0).to_i | |||
| @platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 10.0) * 40.0).to_i | |||
| # 项目经验 | |||
| @experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count | |||
| @experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i | |||
| @platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count | |||
| @platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i | |||
| # 语言能力 | |||
| @language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i | |||
| @platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i | |||
| # 语言百分比 | |||
| @languages_percent = Hash.new | |||
| for key in @project_languages_count.keys do | |||
| @languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2) | |||
| end | |||
| @platform_languages_percent = Hash.new | |||
| for key in @platform_project_languages_count.keys do | |||
| @platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2) | |||
| end | |||
| # 各门语言分数 | |||
| @each_language_score = Hash.new | |||
| for key in @project_languages_count.keys do | |||
| @each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i | |||
| end | |||
| @platform_each_language_score = Hash.new | |||
| for key in @platform_project_languages_count.keys do | |||
| @platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i | |||
| end | |||
| else | |||
| # 影响力 | |||
| @influence = (60.0 + @follow_count / (@follow_count + 20.0) * 40.0).to_i | |||
| @platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 20.0) * 40.0).to_i | |||
| # 贡献度 | |||
| @contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 20.0) * 40.0).to_i | |||
| @platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 20.0) * 40.0).to_i | |||
| # 活跃度 | |||
| @activity = (60.0 + @issues_count / (@issues_count + 80.0) * 40.0).to_i | |||
| @platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 80.0) * 40.0).to_i | |||
| # 项目经验 | |||
| @experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count | |||
| @experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i | |||
| @platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count | |||
| @platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i | |||
| # 语言能力 | |||
| @language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i | |||
| @platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i | |||
| # 语言百分比 | |||
| @languages_percent = Hash.new | |||
| for key in @project_languages_count.keys do | |||
| @languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2) | |||
| end | |||
| @platform_languages_percent = Hash.new | |||
| for key in @platform_project_languages_count.keys do | |||
| @platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2) | |||
| end | |||
| # 各门语言分数 | |||
| @each_language_score = Hash.new | |||
| for key in @project_languages_count.keys do | |||
| @each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i | |||
| end | |||
| @platform_each_language_score = Hash.new | |||
| for key in @platform_project_languages_count.keys do | |||
| @platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i | |||
| end | |||
| end | |||
| end | |||
| # 角色定位 | |||
| def role | |||
| full_member_projects = observed_user.full_member_projects | |||
| owner_projects = filter_member_projects_by_role("Owner") | |||
| manager_projects = filter_member_projects_by_role("Manager").where.not(id: owner_projects.ids) | |||
| developer_projects = filter_member_projects_by_role("Developer").where.not(id: owner_projects.ids + manager_projects.ids) | |||
| reporter_projects = filter_member_projects_by_role("Reporter").where.not(id: owner_projects.ids + manager_projects.ids + developer_projects.ids) | |||
| @full_member_projects_count = full_member_projects.size | |||
| @owner_projects_count = owner_projects.size | |||
| @manager_projects_count = manager_projects.size | |||
| @developer_projects_count = developer_projects.size | |||
| @reporter_projects_count = reporter_projects.size | |||
| end | |||
| # 专业定位 | |||
| def major | |||
| # 参与项目 | |||
| join_normal_projects_sql = Project.members_projects(observed_user.id).to_sql | |||
| join_org_projects_sql = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: observed_user.id}).to_sql | |||
| # 关注项目 | |||
| star_projects_sql = Project.joins(:watchers).where(watchers: {watchable_type: "Project", user_id: observed_user.id}).to_sql | |||
| # fork项目 | |||
| fork_projects_sql = Project.where(id: observed_user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id)).to_sql | |||
| major_projects = Project.from("( #{ join_normal_projects_sql} UNION #{ join_org_projects_sql } UNION #{ star_projects_sql } UNION #{fork_projects_sql}) AS projects").distinct | |||
| categories = ProjectCategory.joins(:projects).merge(Project.where(id: time_filter(major_projects, 'created_on'))).distinct.pluck(:name) | |||
| render :json => {categories: categories} | |||
| end | |||
| private | |||
| def time_filter(collection, time_field) | |||
| if params[:start_time].present? && params[:end_time].present? | |||
| return collection.where("#{time_field} > ? AND #{time_field} < ?", Time.at(params[:start_time].to_i).beginning_of_day, Time.at(params[:end_time].to_i).end_of_day) | |||
| else | |||
| return collection | |||
| end | |||
| rescue | |||
| return collection | |||
| end | |||
| def filter_member_projects_by_role(role) | |||
| case role | |||
| when 'Owner' | |||
| normal_projects_sql = Project.joins(members: :roles).where(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql | |||
| org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "owner"}, team_users: {user_id: observed_user.id}).to_sql | |||
| when "Manager" | |||
| normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql | |||
| org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "admin"}, team_users: {user_id: observed_user.id}).to_sql | |||
| when "Developer" | |||
| normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Developer'}).to_sql | |||
| org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "write"}, team_users: {user_id: observed_user.id}).to_sql | |||
| when "Reporter" | |||
| normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Reporter'}).to_sql | |||
| org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "read"}, team_users: {user_id: observed_user.id}).to_sql | |||
| end | |||
| return time_filter(Project.from("( #{normal_projects_sql} UNION #{org_projects_sql} ) AS projects").distinct, 'created_on') | |||
| end | |||
| def preload_develop_data | |||
| # 用户被follow数量 | |||
| @follow_count = time_filter(Watcher.where(watchable: observed_user), 'created_at').count | |||
| @platform_follow_count = time_filter(Watcher.where(watchable_type: 'User'), 'created_at').count | |||
| # 用户pr数量 | |||
| @pullrequest_count = time_filter(PullRequest.where(user_id: observed_user.id), 'created_at').count | |||
| @platform_pullrequest_count = time_filter(PullRequest, 'created_at').count | |||
| # 用户issue数量 | |||
| @issues_count = time_filter(Issue.where(author_id: observed_user.id), 'created_on').count | |||
| @platform_issues_count = time_filter(Issue, 'created_on').count | |||
| # 用户总项目数 @fork_count + @project_watchers_count + @project_praises_count | |||
| @project_count = filter_member_projects_by_role("Owner").count | |||
| @platform_project_count = time_filter(Project, 'created_on').count | |||
| # 用户项目被fork数量 | |||
| @fork_count = filter_member_projects_by_role("Owner").sum("forked_count") | |||
| @platform_fork_count = time_filter(Project, 'created_on').sum("forked_count") | |||
| # 用户项目关注数 | |||
| @project_watchers_count = filter_member_projects_by_role("Owner").sum("watchers_count") | |||
| @platform_project_watchers_count = time_filter(Project, 'created_on').sum("watchers_count") | |||
| # 用户项目点赞数 | |||
| @project_praises_count = filter_member_projects_by_role("Owner").sum("praises_count") | |||
| @platform_project_praises_count = time_filter(Project, 'created_on').sum("praises_count") | |||
| # 用户不同语言项目数量 | |||
| @project_languages_count = filter_member_projects_by_role("Owner").joins(:project_language).group("project_languages.name").count | |||
| @platform_project_languages_count = time_filter(Project, 'created_on').joins(:project_language).group("project_languages.name").count | |||
| end | |||
| end | |||
| @@ -6,6 +6,7 @@ class UsersController < ApplicationController | |||
| before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users, :hovercard] | |||
| before_action :require_login, only: %i[me list sync_user_info] | |||
| before_action :connect_to_ci_db, only: [:get_user_info] | |||
| before_action :convert_image!, only: [:update] | |||
| skip_before_action :check_sign, only: [:attachment_show] | |||
| def connect_to_ci_db(options={}) | |||
| @@ -72,9 +73,13 @@ class UsersController < ApplicationController | |||
| end | |||
| def update | |||
| @user = User.find params[:id] | |||
| @user.update!(user_params) | |||
| render_ok | |||
| return render_not_found unless @user = User.find_by_id(params[:id]) || User.find_by(login: params[:id]) | |||
| return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id) | |||
| Util.write_file(@image, avatar_path(@user)) if user_params[:image].present? | |||
| @user.attributes = user_params.except(:image) | |||
| unless @user.save | |||
| render_error(@user.errors.full_messages.join(", ")) | |||
| end | |||
| end | |||
| def me | |||
| @@ -274,11 +279,13 @@ class UsersController < ApplicationController | |||
| end | |||
| def user_params | |||
| params.require(:user).permit(:nickname, :lastname, :show_realname,:login,:mail, | |||
| params.require(:user).permit(:nickname, :image, | |||
| user_extension_attributes: [ | |||
| :gender, :location, :location_city, | |||
| :occupation, :technical_title, | |||
| :school_id, :department_id,:identity, :student_id, :description] | |||
| :school_id, :department_id, :province, :city, | |||
| :custom_department, :identity, :student_id, :description, | |||
| :show_email, :show_location, :show_department] | |||
| ) | |||
| end | |||
| @@ -1,7 +1,7 @@ | |||
| <!-- | |||
| * @Date: 2021-03-01 10:35:21 | |||
| * @LastEditors: viletyy | |||
| * @LastEditTime: 2021-04-26 10:47:30 | |||
| * @LastEditTime: 2021-06-03 10:18:53 | |||
| * @FilePath: /forgeplus/app/docs/slate/source/includes/_users.md | |||
| --> | |||
| # Users | |||
| @@ -47,6 +47,918 @@ await octokit.request('GET /api/users/me.json') | |||
| Success Data. | |||
| </aside> | |||
| ## 更改用户信息 | |||
| 更改用户信息 | |||
| > 示例: | |||
| ```shell | |||
| curl -X PATCH/PUT http://localhost:3000/api/users/yystopf.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('PATCH/PUT /api/users/:login.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `PATCH/PUT /api/users/:login.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |user.nickname |string |用户昵称 | | |||
| |user.image |base64/file |用户头像 | | |||
| |user.user_extension_attributes.gender |int |性别, 0男 1女 | | |||
| |user.user_extension_attributes.province |string |省份 | | |||
| |user.user_extension_attributes.city |string |城市 | | |||
| |user.user_extension_attributes.description |string |简介 | | |||
| |user.user_extension_attributes.custom_department|string |单位名称 | | |||
| |user.user_extension_attributes.technical_title |string |职业 | | |||
| |user.user_extension_attributes.show_email |bool |是否展示邮箱 | | |||
| |user.user_extension_attributes.show_location |bool |是否展示位置 | | |||
| |user.user_extension_attributes.show_department |bool |是否展示公司 | | |||
| > 请求的JSON示例: | |||
| ```json | |||
| { | |||
| "user": { | |||
| "nickname": "xxx", | |||
| "user_extension_attributes": { | |||
| "gender": 0, | |||
| "province": "湖南", | |||
| "city": "长沙", | |||
| "description": "个性签名", | |||
| "custom_department": "湖南智擎科技有限公司", | |||
| } | |||
| } | |||
| } | |||
| ``` | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ## 获取用户星标项目 | |||
| 获取用户星标项目 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/is_pinned_projects.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/is_pinned_projects.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET api/users/:login/is_pinned_projects.json` | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |total_count |int |星标项目数量 | | |||
| |identifier |string |项目标识 | | |||
| |name |string |项目名称 | | |||
| |description |string |项目描述 | | |||
| |visits |int |项目访问数量| | |||
| |praises_count |int |项目点赞数量| | |||
| |watchers_count |int |项目关注数量| | |||
| |issues_count |int |项目issue数量| | |||
| |pull_requests_count |int |项目合并请求数量| | |||
| |forked_count |int |项目复刻数量| | |||
| |is_public |bool |项目是否公开| | |||
| |mirror_url |string |镜像地址| | |||
| |type |int |项目类型 0 普通项目 1 普通镜像项目 2 同步镜像项目| | |||
| |time_ago |string |上次更新时间| | |||
| |open_devops |int |是否开启devops| | |||
| |forked_from_project_id |int |fork项目id| | |||
| |platform |string |项目平台| | |||
| |author.name |string |项目拥有者名称| | |||
| |author.type |string |项目拥有者类型| | |||
| |author.login |string |项目拥有者用户名| | |||
| |author.image_url |string |项目拥有者头像| | |||
| |category.name |string |项目分类名称| | |||
| |language.name |string |项目语言名称| | |||
| |position |int |项目排序| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "total_count": 1, | |||
| "projects": [ | |||
| { | |||
| "id": 89, | |||
| "repo_id": 89, | |||
| "identifier": "monkey", | |||
| "name": "boke", | |||
| "description": "dkkd", | |||
| "visits": 4, | |||
| "praises_count": 0, | |||
| "watchers_count": 0, | |||
| "issues_count": 0, | |||
| "pull_requests_count": 0, | |||
| "forked_count": 0, | |||
| "is_public": true, | |||
| "mirror_url": "https://github.com/viletyy/monkey.git", | |||
| "type": 1, | |||
| "last_update_time": 1619685144, | |||
| "time_ago": "27天前", | |||
| "forked_from_project_id": null, | |||
| "open_devops": false, | |||
| "platform": "forge", | |||
| "author": { | |||
| "name": "测试组织", | |||
| "type": "Organization", | |||
| "login": "ceshi_org", | |||
| "image_url": "images/avatars/Organization/9?t=1612706073" | |||
| }, | |||
| "category": { | |||
| "id": 3, | |||
| "name": "深度学习" | |||
| }, | |||
| "language": { | |||
| "id": 2, | |||
| "name": "C" | |||
| } | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 用户添加星标项目 | |||
| 用户添加星标项目 | |||
| > 示例: | |||
| ```shell | |||
| curl -X POST http://localhost:3000/api/users/yystopf/is_pinned_projects/pin.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/is_pinned_projects/pin.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `POST /api/users/:login/is_pinned_projects/pin.json` | |||
| ### 请求字段说明: | |||
| #### 同时设定多个星标项目 | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |is_pinned_project_ids |array |设定为星标项目的id | | |||
| #### 只设定一个星标项目 | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |is_pinned_project_id |integer |设定为星标项目的id | | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ## 星标项目展示排序 | |||
| 星标项目展示排序 | |||
| > 示例: | |||
| ```shell | |||
| curl -X PATCH http://localhost:3000/api/users/yystopf/is_pinned_projects/11.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('PATCH/PUT /api/users/:login/is_pinned_projects/:id.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `PATCH/PUT /api/users/:login/is_pinned_projects/:id.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |pinned_projects.position |int |排序,数字越大排名越前 | | |||
| > 请求的JSON示例: | |||
| ```json | |||
| { | |||
| "pinned_project": { | |||
| "position": 1 | |||
| } | |||
| } | |||
| ``` | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ## 用户近期活动统计 | |||
| 用户近期活动统计, 默认显示近一周的数据 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/statistics/activity.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/statistics/activity.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET /api/users/:login/statistics/activity.json` | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |dates |array |时间 | | |||
| |issues_count |array |易修数量| | |||
| |pull_requests_count |array |合并请求数量| | |||
| |commtis_count |array |贡献数量| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "dates": [ | |||
| "2021.05.21", | |||
| "2021.05.22", | |||
| "2021.05.23", | |||
| "2021.05.24", | |||
| "2021.05.25", | |||
| "2021.05.26", | |||
| "2021.05.27", | |||
| "2021.05.28" | |||
| ], | |||
| "issues_count": [ | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0 | |||
| ], | |||
| "pull_requests_count": [ | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0 | |||
| ], | |||
| "commits_count": [ | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0, | |||
| 0 | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 获取用户贡献度 | |||
| 获取用户贡献度 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/headmaps.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/headmaps.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET api/users/:login/headmaps.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |year |string |年份 | | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |total_contributions |int |所选时间内的总贡献度 | | |||
| |headmaps.date |string|时间| | |||
| |headmaps.contributions |int|贡献度| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "total_contributions": 139, | |||
| "headmaps": [ | |||
| { | |||
| "date": "2021-02-07", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-02-21", | |||
| "contributions": 13 | |||
| }, | |||
| { | |||
| "date": "2021-02-25", | |||
| "contributions": 5 | |||
| }, | |||
| { | |||
| "date": "2021-03-01", | |||
| "contributions": 2 | |||
| }, | |||
| { | |||
| "date": "2021-03-04", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-03-15", | |||
| "contributions": 9 | |||
| }, | |||
| { | |||
| "date": "2021-03-22", | |||
| "contributions": 14 | |||
| }, | |||
| { | |||
| "date": "2021-03-24", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-03-30", | |||
| "contributions": 11 | |||
| }, | |||
| { | |||
| "date": "2021-04-06", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-04-12", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-04-13", | |||
| "contributions": 2 | |||
| }, | |||
| { | |||
| "date": "2021-04-19", | |||
| "contributions": 3 | |||
| }, | |||
| { | |||
| "date": "2021-04-23", | |||
| "contributions": 37 | |||
| }, | |||
| { | |||
| "date": "2021-04-25", | |||
| "contributions": 2 | |||
| }, | |||
| { | |||
| "date": "2021-04-26", | |||
| "contributions": 6 | |||
| }, | |||
| { | |||
| "date": "2021-04-28", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-04-29", | |||
| "contributions": 18 | |||
| }, | |||
| { | |||
| "date": "2021-04-30", | |||
| "contributions": 9 | |||
| }, | |||
| { | |||
| "date": "2021-05-04", | |||
| "contributions": 1 | |||
| }, | |||
| { | |||
| "date": "2021-05-06", | |||
| "contributions": 1 | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 获取用户动态 | |||
| 获取用户动态 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/project_trends.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/project_trends.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET api/users/:login/project_trends.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |date |string |日期,格式: 2021-05-28 | | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |total_count |int |所选时间内的总动态数 | | |||
| |project_trends.trend_type |string|动态类型,Issue:易修,VersionRelease:版本发布,PullRequest:合并请求| | |||
| |project_trends.action_type |string|操作类型| | |||
| |project_trends.trend_id |integer|动态id| | |||
| |project_trends.user_name |string|用户名称| | |||
| |project_trends.user_login |string|用户用户名| | |||
| |project_trends.user_avatar |string|用户头像| | |||
| |project_trends.action_time |string|操作时间| | |||
| |project_trends.name |string|动态标题| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "total_count": 16, | |||
| "project_trends": [ | |||
| { | |||
| "id": 27, | |||
| "trend_type": "Issue", | |||
| "action_type": "创建了工单", | |||
| "trend_id": 18, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "21天前", | |||
| "name": "31213123123", | |||
| "issue_type": "1", | |||
| "status_id": 2, | |||
| "priority_id": 4, | |||
| "created_at": "2021-05-07 15:39", | |||
| "updated_at": "2021-05-27 15:42", | |||
| "assign_user_name": "yystopf", | |||
| "assign_user_login": "yystopf", | |||
| "issue_journal_size": 1, | |||
| "issue_journals": [] | |||
| }, | |||
| { | |||
| "id": 8, | |||
| "trend_type": "VersionRelease", | |||
| "action_type": "创建了版本发布", | |||
| "trend_id": 8, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "24天前", | |||
| "name": "heihei1", | |||
| "tag_name": "v1.0", | |||
| "target_commitish": "master", | |||
| "tarball_url": "http://localhost:10080/forgeceshiorg1/ceshi1/archive/v1.0.tar.gz", | |||
| "zipball_url": "http://localhost:10080/forgeceshiorg1/ceshi1/archive/v1.0.zip", | |||
| "url": "http://localhost:10080/api/v1/repos/forgeceshiorg1/ceshi1/releases/84", | |||
| "version_gid": "84", | |||
| "created_at": "2021-05-04 12:04" | |||
| }, | |||
| { | |||
| "id": 25, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "关闭了合并请求", | |||
| "trend_id": 14, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "13", | |||
| "created_at": "2021-04-30 15:39" | |||
| }, | |||
| { | |||
| "id": 24, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "创建了合并请求", | |||
| "trend_id": 13, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "211212", | |||
| "created_at": "2021-04-30 15:37" | |||
| }, | |||
| { | |||
| "id": 23, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "创建了合并请求", | |||
| "trend_id": 12, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "奇偶哦iu", | |||
| "created_at": "2021-04-30 10:19" | |||
| }, | |||
| { | |||
| "id": 22, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "创建了合并请求", | |||
| "trend_id": 11, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "2112123", | |||
| "created_at": "2021-04-29 18:46" | |||
| }, | |||
| { | |||
| "id": 21, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "关闭了合并请求", | |||
| "trend_id": 10, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "23123", | |||
| "created_at": "2021-04-29 18:45" | |||
| }, | |||
| { | |||
| "id": 20, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "创建了合并请求", | |||
| "trend_id": 9, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "33", | |||
| "created_at": "2021-04-29 18:37" | |||
| }, | |||
| { | |||
| "id": 19, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "关闭了合并请求", | |||
| "trend_id": 8, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "28天前", | |||
| "name": "gggg", | |||
| "created_at": "2021-04-29 17:51" | |||
| }, | |||
| { | |||
| "id": 16, | |||
| "trend_type": "Issue", | |||
| "action_type": "创建了工单", | |||
| "trend_id": 8, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "1个月前", | |||
| "name": "hjhkj", | |||
| "issue_type": "1", | |||
| "status_id": 1, | |||
| "priority_id": 2, | |||
| "created_at": "2021-04-19 10:52", | |||
| "updated_at": "2021-04-19 10:52", | |||
| "assign_user_name": null, | |||
| "assign_user_login": null, | |||
| "issue_journal_size": 0, | |||
| "issue_journals": [] | |||
| }, | |||
| { | |||
| "id": 7, | |||
| "trend_type": "VersionRelease", | |||
| "action_type": "创建了版本发布", | |||
| "trend_id": 7, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "1个月前", | |||
| "name": "v3.0.1", | |||
| "tag_name": "v3.0.1", | |||
| "target_commitish": "master", | |||
| "tarball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v3.0.1.tar.gz", | |||
| "zipball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v3.0.1.zip", | |||
| "url": "http://localhost:10080/api/v1/repos/yystopf/ceshirepo1/releases/78", | |||
| "version_gid": "78", | |||
| "created_at": "2021-03-30 15:51" | |||
| }, | |||
| { | |||
| "id": 6, | |||
| "trend_type": "VersionRelease", | |||
| "action_type": "创建了版本发布", | |||
| "trend_id": 6, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "1个月前", | |||
| "name": "v3.0.0", | |||
| "tag_name": "v3.0.0", | |||
| "target_commitish": "master", | |||
| "tarball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v3.0.0.tar.gz", | |||
| "zipball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v3.0.0.zip", | |||
| "url": "http://localhost:10080/api/v1/repos/yystopf/ceshirepo1/releases/77", | |||
| "version_gid": "77", | |||
| "created_at": "2021-03-30 15:33" | |||
| }, | |||
| { | |||
| "id": 5, | |||
| "trend_type": "VersionRelease", | |||
| "action_type": "创建了版本发布", | |||
| "trend_id": 5, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "1个月前", | |||
| "name": "v1.0.0", | |||
| "tag_name": "v1.0.0", | |||
| "target_commitish": "master", | |||
| "tarball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v1.0.0.tar.gz", | |||
| "zipball_url": "http://localhost:10080/yystopf/ceshirepo1/archive/v1.0.0.zip", | |||
| "url": "http://localhost:10080/api/v1/repos/yystopf/ceshirepo1/releases/76", | |||
| "version_gid": "76", | |||
| "created_at": "2021-03-30 15:27" | |||
| }, | |||
| { | |||
| "id": 2, | |||
| "trend_type": "VersionRelease", | |||
| "action_type": "创建了版本发布", | |||
| "trend_id": 2, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "2个月前", | |||
| "name": "vvvv", | |||
| "tag_name": "v1.1", | |||
| "target_commitish": "dev", | |||
| "tarball_url": "http://localhost:10080/yystopf/virus_blog/archive/v1.1.tar.gz", | |||
| "zipball_url": "http://localhost:10080/yystopf/virus_blog/archive/v1.1.zip", | |||
| "url": "http://localhost:10080/api/v1/repos/yystopf/virus_blog/releases/6", | |||
| "version_gid": "6", | |||
| "created_at": "2021-03-15 14:18" | |||
| }, | |||
| { | |||
| "id": 2, | |||
| "trend_type": "PullRequest", | |||
| "action_type": "创建了合并请求", | |||
| "trend_id": 2, | |||
| "user_name": "yystopf", | |||
| "user_login": "yystopf", | |||
| "user_avatar": "system/lets/letter_avatars/2/Y/241_125_89/120.png", | |||
| "action_time": "3个月前", | |||
| "name": "444", | |||
| "created_at": "2021-02-25 17:31" | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 用户开发能力 | |||
| 用户开发能力, 默认为所有时间下的开发能力 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/statistics/develop.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/statistics/develop.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET /api/users/:login/statistics/develop.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |start_time |integer |时间戳,开始时间,格式:1621526400| | |||
| |end_time |integer |时间戳,结束时间,格式:1622131200| | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |influence |int |影响力 | | |||
| |contribution |int |贡献度| | |||
| |activity |int |活跃度| | |||
| |experience |int |项目经验| | |||
| |language |int |语言能力| | |||
| |languages_percent |float |语言百分比| | |||
| |each_language_score |int |各门语言分数| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "platform": { | |||
| "influence": 61, | |||
| "contribution": 75, | |||
| "activity": 66, | |||
| "experience": 95, | |||
| "language": 87, | |||
| "languages_percent": { | |||
| "CSS": 0.03, | |||
| "C#": 0.13, | |||
| "Ruby": 0.04, | |||
| "Go": 0.05, | |||
| "C": 0.19, | |||
| "Java": 0.34, | |||
| "Python": 0.09, | |||
| "C+": 0.01, | |||
| "C++": 0.11, | |||
| "Scala": 0.01, | |||
| "HTML": 0.01 | |||
| }, | |||
| "each_language_score": { | |||
| "CSS": 71, | |||
| "C#": 86, | |||
| "Ruby": 75, | |||
| "Go": 77, | |||
| "C": 90, | |||
| "Java": 93, | |||
| "Python": 83, | |||
| "C+": 66, | |||
| "C++": 85, | |||
| "Scala": 66, | |||
| "HTML": 66 | |||
| } | |||
| }, | |||
| "user": { | |||
| "influence": 60, | |||
| "contribution": 72, | |||
| "activity": 65, | |||
| "experience": 88, | |||
| "language": 84, | |||
| "languages_percent": { | |||
| "C": 0.25, | |||
| "C#": 0.33, | |||
| "C++": 0.13, | |||
| "CSS": 0.08, | |||
| "Go": 0.04, | |||
| "HTML": 0.04, | |||
| "Java": 0.04, | |||
| "Ruby": 0.08 | |||
| }, | |||
| "each_language_score": { | |||
| "C": 81, | |||
| "C#": 84, | |||
| "C++": 75, | |||
| "CSS": 71, | |||
| "Go": 66, | |||
| "HTML": 66, | |||
| "Java": 66, | |||
| "Ruby": 71 | |||
| } | |||
| } | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 用户角色定位 | |||
| 用户角色定位,默认显示所有时间下的角色定位数据 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/statistics/role.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/statistics/role.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET /api/users/:login/statistics/role.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |start_time |integer |时间戳,开始时间,格式:1621526400| | |||
| |end_time |integer |时间戳,结束时间,格式:1622131200| | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |total_projects_count |int |用户所有的项目数量 | | |||
| |role.object.count |int |用户该语言下的项目数量| | |||
| |role.object.percent |float |用户该语言下的项目占比| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "total_projects_count": 27, | |||
| "role": { | |||
| "owner": { | |||
| "count": 24, | |||
| "percent": 0.89 | |||
| }, | |||
| "manager": { | |||
| "count": 1, | |||
| "percent": 0.04 | |||
| }, | |||
| "developer": { | |||
| "count": 2, | |||
| "percent": 0.07 | |||
| }, | |||
| "reporter": { | |||
| "count": 0, | |||
| "percent": 0.0 | |||
| } | |||
| } | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 用户专业定位 | |||
| 用户专业定位,默认显示所有时间下的专业定位数据 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET http://localhost:3000/api/users/yystopf/statistics/major.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/users/:login/statistics/major.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET /api/users/:login/statistics/major.json` | |||
| ### 请求字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |start_time |integer |时间戳,开始时间,格式:1621526400| | |||
| |end_time |integer |时间戳,结束时间,格式:1622131200| | |||
| ### 返回字段说明: | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| |categories |int |用户项目分类 | | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "categories": [ | |||
| "大数据", | |||
| "机器学习", | |||
| "深度学习", | |||
| "人工智能", | |||
| "智慧医疗", | |||
| "云计算" | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success Data. | |||
| </aside> | |||
| ## 待办事项-用户通知信息 | |||
| 待办事项-用户通知信息 | |||
| @@ -17,7 +17,7 @@ | |||
| # disk_directory :string(255) | |||
| # attachtype :integer default("1") | |||
| # is_public :integer default("1") | |||
| # copy_from :string(255) | |||
| # copy_from :integer | |||
| # quotes :integer default("0") | |||
| # is_publish :integer default("1") | |||
| # publish_time :datetime | |||
| @@ -26,15 +26,15 @@ | |||
| # cloud_url :string(255) default("") | |||
| # course_second_category_id :integer default("0") | |||
| # delay_publish :boolean default("0") | |||
| # link :string(255) | |||
| # clone_id :integer | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_attachments_on_author_id (author_id) | |||
| # index_attachments_on_clone_id (clone_id) | |||
| # index_attachments_on_container_id_and_container_type (container_id,container_type) | |||
| # index_attachments_on_course_second_category_id (course_second_category_id) | |||
| # index_attachments_on_created_on (created_on) | |||
| # index_attachments_on_is_public (is_public) | |||
| # index_attachments_on_quotes (quotes) | |||
| # | |||
| class Attachment < ApplicationRecord | |||
| @@ -39,15 +39,13 @@ | |||
| # business :boolean default("0") | |||
| # profile_completed :boolean default("0") | |||
| # laboratory_id :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # admin_visitable :boolean default("0") | |||
| # collaborator :boolean default("0") | |||
| # platform :string(255) default("0") | |||
| # gitea_token :string(255) | |||
| # gitea_uid :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # is_sync_pwd :boolean default("1") | |||
| # watchers_count :integer default("0") | |||
| # devops_step :integer default("0") | |||
| # gitea_token :string(255) | |||
| # platform :string(255) | |||
| # | |||
| # Indexes | |||
| # | |||
| @@ -55,9 +53,8 @@ | |||
| # index_users_on_homepage_engineer (homepage_engineer) | |||
| # index_users_on_homepage_teacher (homepage_teacher) | |||
| # index_users_on_laboratory_id (laboratory_id) | |||
| # index_users_on_login (login) UNIQUE | |||
| # index_users_on_mail (mail) UNIQUE | |||
| # index_users_on_phone (phone) UNIQUE | |||
| # index_users_on_login (login) | |||
| # index_users_on_mail (mail) | |||
| # index_users_on_type (type) | |||
| # | |||
| @@ -9,6 +9,7 @@ module ProjectOperable | |||
| has_many :reporters, -> { joins(:roles).where(roles: { name: 'Reporter' }) }, class_name: 'Member' | |||
| has_many :writable_members, -> { joins(:roles).where.not(roles: {name: 'Reporter'}) }, class_name: 'Member' | |||
| has_many :team_projects, dependent: :destroy | |||
| has_many :teams, through: :team_projects, source: :team | |||
| end | |||
| def set_owner_permission(creator) | |||
| @@ -6,7 +6,7 @@ | |||
| # tracker_id :integer not null | |||
| # project_id :integer not null | |||
| # subject :string(255) default(""), not null | |||
| # description :text(4294967295) | |||
| # description :text(65535) | |||
| # due_date :date | |||
| # category_id :integer | |||
| # status_id :integer not null | |||
| @@ -14,6 +14,7 @@ | |||
| # priority_id :integer not null | |||
| # fixed_version_id :integer | |||
| # author_id :integer not null | |||
| # lock_version :integer default("0"), not null | |||
| # created_on :datetime | |||
| # updated_on :datetime | |||
| # start_date :date | |||
| @@ -27,7 +28,7 @@ | |||
| # closed_on :datetime | |||
| # project_issues_index :integer | |||
| # issue_type :string(255) | |||
| # token :integer default("0") | |||
| # token :string(255) | |||
| # issue_tags_value :string(255) | |||
| # is_lock :boolean default("0") | |||
| # issue_classify :string(255) | |||
| @@ -10,7 +10,6 @@ | |||
| # sync_course :boolean default("0") | |||
| # sync_subject :boolean default("0") | |||
| # sync_shixun :boolean default("0") | |||
| # is_local :boolean default("0") | |||
| # | |||
| # Indexes | |||
| # | |||
| @@ -39,15 +39,13 @@ | |||
| # business :boolean default("0") | |||
| # profile_completed :boolean default("0") | |||
| # laboratory_id :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # admin_visitable :boolean default("0") | |||
| # collaborator :boolean default("0") | |||
| # platform :string(255) default("0") | |||
| # gitea_token :string(255) | |||
| # gitea_uid :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # is_sync_pwd :boolean default("1") | |||
| # watchers_count :integer default("0") | |||
| # devops_step :integer default("0") | |||
| # gitea_token :string(255) | |||
| # platform :string(255) | |||
| # | |||
| # Indexes | |||
| # | |||
| @@ -55,9 +53,8 @@ | |||
| # index_users_on_homepage_engineer (homepage_engineer) | |||
| # index_users_on_homepage_teacher (homepage_teacher) | |||
| # index_users_on_laboratory_id (laboratory_id) | |||
| # index_users_on_login (login) UNIQUE | |||
| # index_users_on_mail (mail) UNIQUE | |||
| # index_users_on_phone (phone) UNIQUE | |||
| # index_users_on_login (login) | |||
| # index_users_on_mail (mail) | |||
| # index_users_on_type (type) | |||
| # | |||
| @@ -0,0 +1,22 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: pinned_projects | |||
| # | |||
| # id :integer not null, primary key | |||
| # user_id :integer | |||
| # project_id :integer | |||
| # position :integer default("0") | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_pinned_projects_on_project_id (project_id) | |||
| # index_pinned_projects_on_user_id (user_id) | |||
| # | |||
| class PinnedProject < ApplicationRecord | |||
| belongs_to :user | |||
| belongs_to :project | |||
| end | |||
| @@ -1,76 +1,65 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: projects | |||
| # | |||
| # id :integer not null, primary key | |||
| # name :string(255) default(""), not null | |||
| # description :text(4294967295) | |||
| # homepage :string(255) default("") | |||
| # is_public :boolean default("1"), not null | |||
| # parent_id :integer | |||
| # created_on :datetime | |||
| # updated_on :datetime | |||
| # identifier :string(255) | |||
| # status :integer default("1"), not null | |||
| # lft :integer | |||
| # rgt :integer | |||
| # inherit_members :boolean default("0"), not null | |||
| # project_type :integer default("0") | |||
| # hidden_repo :boolean default("0"), not null | |||
| # attachmenttype :integer default("1") | |||
| # user_id :integer | |||
| # dts_test :integer default("0") | |||
| # enterprise_name :string(255) | |||
| # organization_id :integer | |||
| # project_new_type :integer | |||
| # gpid :integer | |||
| # forked_from_project_id :integer | |||
| # forked_count :integer default("0") | |||
| # publish_resource :integer default("0") | |||
| # visits :integer default("0") | |||
| # hot :integer default("0") | |||
| # invite_code :string(255) | |||
| # qrcode :string(255) | |||
| # qrcode_expiretime :integer default("0") | |||
| # script :text(65535) | |||
| # training_status :integer default("0") | |||
| # rep_identifier :string(255) | |||
| # project_category_id :integer | |||
| # project_language_id :integer | |||
| # praises_count :integer default("0") | |||
| # watchers_count :integer default("0") | |||
| # issues_count :integer default("0") | |||
| # pull_requests_count :integer default("0") | |||
| # language :string(255) | |||
| # versions_count :integer default("0") | |||
| # issue_tags_count :integer default("0") | |||
| # closed_issues_count :integer default("0") | |||
| # open_devops :boolean default("0") | |||
| # gitea_webhook_id :integer | |||
| # open_devops_count :integer default("0") | |||
| # recommend :boolean default("0") | |||
| # platform :integer default("0") | |||
| # license_id :integer | |||
| # ignore_id :integer | |||
| # default_branch :string(255) default("master") | |||
| # website :string(255) | |||
| # lesson_url :string(255) | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_projects_on_forked_from_project_id (forked_from_project_id) | |||
| # index_projects_on_identifier (identifier) | |||
| # index_projects_on_is_public (is_public) | |||
| # index_projects_on_lft (lft) | |||
| # index_projects_on_name (name) | |||
| # index_projects_on_platform (platform) | |||
| # index_projects_on_project_type (project_type) | |||
| # index_projects_on_recommend (recommend) | |||
| # index_projects_on_rgt (rgt) | |||
| # index_projects_on_status (status) | |||
| # index_projects_on_updated_on (updated_on) | |||
| # | |||
| # == Schema Information | |||
| # | |||
| # Table name: projects | |||
| # | |||
| # id :integer not null, primary key | |||
| # name :string(255) default(""), not null | |||
| # description :text(65535) | |||
| # homepage :string(255) default("") | |||
| # is_public :boolean default("1"), not null | |||
| # parent_id :integer | |||
| # created_on :datetime | |||
| # updated_on :datetime | |||
| # identifier :string(255) | |||
| # status :integer default("1"), not null | |||
| # lft :integer | |||
| # rgt :integer | |||
| # inherit_members :boolean default("0"), not null | |||
| # project_type :integer default("0") | |||
| # hidden_repo :boolean default("0"), not null | |||
| # attachmenttype :integer default("1") | |||
| # user_id :integer | |||
| # dts_test :integer default("0") | |||
| # enterprise_name :string(255) | |||
| # organization_id :integer | |||
| # project_new_type :integer | |||
| # gpid :integer | |||
| # forked_from_project_id :integer | |||
| # forked_count :integer default("0") | |||
| # publish_resource :integer default("0") | |||
| # visits :integer default("0") | |||
| # hot :integer default("0") | |||
| # invite_code :string(255) | |||
| # qrcode :string(255) | |||
| # qrcode_expiretime :integer default("0") | |||
| # script :text(65535) | |||
| # training_status :integer default("0") | |||
| # rep_identifier :string(255) | |||
| # project_category_id :integer | |||
| # project_language_id :integer | |||
| # license_id :integer | |||
| # ignore_id :integer | |||
| # praises_count :integer default("0") | |||
| # watchers_count :integer default("0") | |||
| # issues_count :integer default("0") | |||
| # pull_requests_count :integer default("0") | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_projects_on_forked_from_project_id (forked_from_project_id) | |||
| # index_projects_on_identifier (identifier) | |||
| # index_projects_on_is_public (is_public) | |||
| # index_projects_on_lft (lft) | |||
| # index_projects_on_name (name) | |||
| # index_projects_on_platform (platform) | |||
| # index_projects_on_project_type (project_type) | |||
| # index_projects_on_recommend (recommend) | |||
| # index_projects_on_rgt (rgt) | |||
| # index_projects_on_status (status) | |||
| # index_projects_on_updated_on (updated_on) | |||
| # | |||
| class Project < ApplicationRecord | |||
| include Matchable | |||
| @@ -111,9 +100,10 @@ class Project < ApplicationRecord | |||
| has_many :praise_treads, as: :praise_tread_object, dependent: :destroy | |||
| has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" | |||
| has_one :project_detail, dependent: :destroy | |||
| has_many :team_projects, dependent: :destroy | |||
| has_many :project_units, dependent: :destroy | |||
| has_one :applied_transfer_project,-> { order created_at: :desc }, dependent: :destroy | |||
| has_many :pinned_projects, dependent: :destroy | |||
| has_many :has_pinned_users, through: :pinned_projects, source: :user | |||
| after_save :check_project_members | |||
| scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)} | |||
| @@ -8,6 +8,11 @@ | |||
| # projects_count :integer default("0") | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # ancestry :string(255) | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_project_categories_on_ancestry (ancestry) | |||
| # | |||
| class ProjectCategory < ApplicationRecord | |||
| @@ -16,11 +16,6 @@ | |||
| # head :string(255) | |||
| # base :string(255) | |||
| # issue_id :integer | |||
| # fork_project_id :integer | |||
| # is_original :boolean default("0") | |||
| # comments_count :integer default("0") | |||
| # commits_count :integer default("0") | |||
| # files_count :integer default("0") | |||
| # | |||
| class PullRequest < ApplicationRecord | |||
| @@ -27,6 +27,7 @@ | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_repositories_on_identifier (identifier) | |||
| # index_repositories_on_project_id (project_id) | |||
| # index_repositories_on_user_id (user_id) | |||
| # | |||
| @@ -39,15 +39,13 @@ | |||
| # business :boolean default("0") | |||
| # profile_completed :boolean default("0") | |||
| # laboratory_id :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # admin_visitable :boolean default("0") | |||
| # collaborator :boolean default("0") | |||
| # platform :string(255) default("0") | |||
| # gitea_token :string(255) | |||
| # gitea_uid :integer | |||
| # is_shixun_marker :boolean default("0") | |||
| # is_sync_pwd :boolean default("1") | |||
| # watchers_count :integer default("0") | |||
| # devops_step :integer default("0") | |||
| # gitea_token :string(255) | |||
| # platform :string(255) | |||
| # | |||
| # Indexes | |||
| # | |||
| @@ -55,9 +53,8 @@ | |||
| # index_users_on_homepage_engineer (homepage_engineer) | |||
| # index_users_on_homepage_teacher (homepage_teacher) | |||
| # index_users_on_laboratory_id (laboratory_id) | |||
| # index_users_on_login (login) UNIQUE | |||
| # index_users_on_mail (mail) UNIQUE | |||
| # index_users_on_phone (phone) UNIQUE | |||
| # index_users_on_login (login) | |||
| # index_users_on_mail (mail) | |||
| # index_users_on_type (type) | |||
| # | |||
| @@ -164,6 +161,11 @@ class User < Owner | |||
| has_many :organization_users, dependent: :destroy | |||
| has_many :organizations, through: :organization_users | |||
| has_many :pinned_projects, dependent: :destroy | |||
| has_many :is_pinned_projects, through: :pinned_projects, source: :project | |||
| accepts_nested_attributes_for :is_pinned_projects | |||
| has_many :issues, dependent: :destroy, foreign_key: :author_id | |||
| has_many :pull_requests, dependent: :destroy | |||
| # Groups and active users | |||
| scope :active, lambda { where(status: STATUS_ACTIVE) } | |||
| @@ -176,7 +178,9 @@ class User < Owner | |||
| attr_accessor :password, :password_confirmation | |||
| delegate :gender, :department_id, :school_id, :location, :location_city, :technical_title, to: :user_extension, allow_nil: true | |||
| delegate :description, :gender, :department_id, :school_id, :location, :location_city, | |||
| :show_email, :show_location, :show_department, | |||
| :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true | |||
| before_save :update_hashed_password | |||
| after_create do | |||
| @@ -195,6 +199,13 @@ class User < Owner | |||
| validate :validate_sensitive_string | |||
| validate :validate_password_length | |||
| # 用户参与的所有项目 | |||
| def full_member_projects | |||
| normal_projects = Project.members_projects(self.id).to_sql | |||
| org_projects = Project.joins(teams: :team_users).where(team_users: {user_id: self.id}).to_sql | |||
| return Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct | |||
| end | |||
| def name | |||
| login | |||
| end | |||
| @@ -12,9 +12,7 @@ | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_user_actions_on_ip (ip) | |||
| # index_user_actions_on_user_id (user_id) | |||
| # index_user_actions_on_user_id_and_action_type (user_id,action_type) | |||
| # index_user_actions_on_ip (ip) | |||
| # | |||
| class UserAction < ApplicationRecord | |||
| @@ -10,13 +10,10 @@ | |||
| # updated_at :datetime not null | |||
| # register_status :integer default("0") | |||
| # action_status :integer default("0") | |||
| # is_delete :boolean default("0") | |||
| # user_id :integer | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_user_agents_on_ip (ip) | |||
| # index_user_agents_on_user_id (user_id) | |||
| # index_user_agents_on_ip (ip) UNIQUE | |||
| # | |||
| class UserAgent < ApplicationRecord | |||
| @@ -22,9 +22,12 @@ | |||
| # school_id :integer | |||
| # description :string(255) default("") | |||
| # department_id :integer | |||
| # honor :text(65535) | |||
| # edu_background :integer | |||
| # edu_entry_year :integer | |||
| # province :string(255) | |||
| # city :string(255) | |||
| # custom_department :string(255) | |||
| # show_email :boolean default("0") | |||
| # show_location :boolean default("0") | |||
| # show_department :boolean default("0") | |||
| # | |||
| # Indexes | |||
| # | |||
| @@ -33,25 +36,25 @@ | |||
| # index_user_extensions_on_user_id (user_id) | |||
| # | |||
| class UserExtension < ApplicationRecord | |||
| # identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者 | |||
| enum identity: { teacher: 0, student: 1, professional: 2, developer: 3, enterprise: 4, unselect: -1 } | |||
| belongs_to :user, touch: true | |||
| belongs_to :school, optional: true | |||
| # belongs_to :department, optional: true | |||
| # before_save :set_laboratory_school | |||
| def identity_text | |||
| I18n.t("user.identity.#{identity}") | |||
| end | |||
| private | |||
| def set_laboratory_school | |||
| # return unless new_record? | |||
| # self.school_id = Laboratory.current.school_id if school_id.blank? && !Laboratory.current.main_site? | |||
| end | |||
| end | |||
| class UserExtension < ApplicationRecord | |||
| # identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者 | |||
| enum identity: { teacher: 0, student: 1, professional: 2, developer: 3, enterprise: 4, unselect: -1 } | |||
| belongs_to :user, touch: true | |||
| belongs_to :school, optional: true | |||
| # belongs_to :department, optional: true | |||
| # before_save :set_laboratory_school | |||
| def identity_text | |||
| I18n.t("user.identity.#{identity}") | |||
| end | |||
| private | |||
| def set_laboratory_school | |||
| # return unless new_record? | |||
| # self.school_id = Laboratory.current.school_id if school_id.blank? && !Laboratory.current.main_site? | |||
| end | |||
| end | |||
| @@ -53,10 +53,15 @@ class Projects::ListMyQuery < ApplicationQuery | |||
| q = projects.ransack(name_or_identifier_cont: params[:search]) | |||
| scope = q.result.includes(:project_category, :project_language,:owner, :repository) | |||
| scope = q.result.includes(:project_category, :project_language,:owner, :repository, :has_pinned_users) | |||
| sort = params[:sort_by] || "updated_on" | |||
| sort_direction = params[:sort_direction] || "desc" | |||
| scope.order("projects.#{sort} #{sort_direction}") | |||
| if params[:choosed].present? && params[:choosed].is_a?(Array) | |||
| scope.order("FIELD(id, #{params[:choosed].reverse.join(",")}) desc") | |||
| else | |||
| scope.order("projects.#{sort} #{sort_direction}") | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,23 @@ | |||
| class Gitea::User::HeadmapService < Gitea::ClientService | |||
| attr_reader :start_time, :end_time, :username | |||
| def initialize(username, start_time, end_time) | |||
| @username = username | |||
| @start_time = start_time | |||
| @end_time = end_time | |||
| end | |||
| def call | |||
| response = get(url, params) | |||
| render_response(response) | |||
| end | |||
| private | |||
| def params | |||
| Hash.new.merge(start: start_time, end: end_time) | |||
| end | |||
| def url | |||
| "/users/#{username}/heatmap".freeze | |||
| end | |||
| end | |||
| @@ -34,7 +34,7 @@ class Projects::TransferService < ApplicationService | |||
| def update_visit_teams | |||
| if new_owner.is_a?(Organization) | |||
| # 为包含组织所有项目的团队创建项目访问权限 | |||
| new_owner.build_permit_team_projects(project.id) | |||
| new_owner.build_permit_team_projects!(project.id) | |||
| else | |||
| project.team_projects.each(&:destroy!) | |||
| end | |||
| @@ -1,4 +1,10 @@ | |||
| json.name issue.try(:subject) | |||
| json.issue_type issue.issue_type == "1" ? "普通" : "悬赏" | |||
| json.status_id issue.try(:status_id) | |||
| json.issue_status issue.issue_status.try(:name) | |||
| json.priority issue.priority.try(:name) | |||
| json.priority_id issue.try(:priority_id) | |||
| json.version issue.version.try(:name) | |||
| json.created_at format_time(issue.try(:created_on)) | |||
| json.updated_at format_time(issue.try(:updated_on)) | |||
| json.assign_user_name issue&.get_assign_user.try(:show_real_name) | |||
| @@ -0,0 +1,17 @@ | |||
| json.id trend.id | |||
| json.trend_type trend.trend_type | |||
| json.action_type l("trend.#{trend.action_type}") + l("trend.#{trend.trend_type}") | |||
| json.trend_id trend.trend_id | |||
| json.user_name trend.user.try(:show_real_name) | |||
| json.user_login trend.user.login | |||
| json.user_avatar url_to_avatar(trend.user) | |||
| json.action_time time_from_now(trend.created_at) | |||
| if trend.trend_type == "Issue" | |||
| json.partial! "issues/simple_issue_item", locals: {issue: trend.trend} | |||
| elsif trend.trend_type == "VersionRelease" | |||
| json.partial! "version_releases/simple_version_release", locals: {version: trend.trend} | |||
| else | |||
| json.name trend.trend&.title | |||
| json.created_at format_time(trend.trend&.created_at) | |||
| end | |||
| @@ -9,25 +9,9 @@ json.limit @limit | |||
| json.project_trends_size @project_trends_size | |||
| json.project_trends do | |||
| json.array! @project_trends.to_a.each do |trend| | |||
| json.id trend.id | |||
| json.trend_type trend.trend_type | |||
| json.action_type l("trend.#{trend.action_type}") + l("trend.#{trend.trend_type}") | |||
| json.trend_id trend.trend_id | |||
| json.user_name trend.user.try(:show_real_name) | |||
| json.user_login trend.user.login | |||
| json.user_avatar url_to_avatar(trend.user) | |||
| if trend.trend_type == "Issue" | |||
| json.partial! "issues/simple_issue_item", locals: {issue: trend.trend} | |||
| elsif trend.trend_type == "VersionRelease" | |||
| json.partial! "version_releases/simple_version_release", locals: {version: trend.trend} | |||
| else | |||
| json.name trend.trend.title | |||
| json.created_at format_time(trend.trend.created_at) | |||
| end | |||
| #后续需要天际pullrequest 和 版本的内容 | |||
| json.partial! "detail", trend: trend | |||
| end | |||
| end | |||
| @@ -5,6 +5,9 @@ json.name project.name | |||
| json.description Nokogiri::HTML(project.description).text | |||
| json.visits project.visits | |||
| json.praises_count project.praises_count.to_i | |||
| json.watchers_count project.watchers_count.to_i | |||
| json.issues_count project.issues_count.to_i | |||
| json.pull_requests_count project.pull_requests_count.to_i | |||
| json.forked_count project.forked_count.to_i | |||
| json.is_public project.is_public | |||
| json.mirror_url project.repository&.mirror_url | |||
| @@ -14,6 +17,7 @@ json.time_ago time_from_now(project.updated_on) | |||
| json.forked_from_project_id project.forked_from_project_id | |||
| json.open_devops project.open_devops? | |||
| json.platform project.platform | |||
| json.is_pinned project.has_pinned_users.include?(current_user) | |||
| json.author do | |||
| if project.educoder? | |||
| project_educoder = project.project_educoder | |||
| @@ -12,4 +12,5 @@ json.permission render_permission(current_user, @project) | |||
| json.is_transfering @project.is_transfering | |||
| json.transfer do | |||
| json.partial! "/users/user_simple", locals: {user: @project&.applied_transfer_project&.owner} | |||
| end | |||
| end | |||
| json.is_pinned @project.has_pinned_users.include?(current_user) | |||
| @@ -1,7 +1,20 @@ | |||
| json.user_id user.id | |||
| json.login user.login | |||
| json.name user.full_name | |||
| json.username @user.full_name | |||
| json.real_name @user.real_name | |||
| json.grade user.grade | |||
| json.identity user&.user_extension&.identity | |||
| # json.email user.mail # 邮箱原则上不暴露的,如果实在需要的话只能对某些具体的接口公开 | |||
| json.image_url url_to_avatar(user) | |||
| json.gender @user.gender | |||
| json.login @user.login | |||
| json.user_id @user.id | |||
| json.image_url url_to_avatar(@user) | |||
| json.admin @user.admin? | |||
| json.user_identity @user.identity | |||
| json.is_watch current_user&.watched?(@user) | |||
| json.watched_count @user.fan_count #粉丝 | |||
| json.watching_count @user.follow_count #关注数 | |||
| json.created_time format_time(@user.created_on) | |||
| json.email @user.show_email ? @user.mail : nil | |||
| json.province @user.show_location ? @user.province : nil | |||
| json.city @user.show_location ? @user.city : nil | |||
| json.custom_department @user.show_department ? @user.custom_department : nil | |||
| json.description @user.description | |||
| @@ -3,7 +3,7 @@ json.format_time target.created_at.strftime("%Y-%m-%d") | |||
| json.name user.try(:show_real_name) | |||
| json.login user.try(:login) | |||
| json.image_url url_to_avatar(user) | |||
| json.is_current_user current_user.try(:id) == target.user_id | |||
| json.is_current_user current_user.try(:id) == user.id | |||
| json.is_watch current_user&.watched?(user) | |||
| @@ -1,5 +1,6 @@ | |||
| json.username @user.full_name | |||
| json.real_name @user.real_name | |||
| json.gender @user.gender | |||
| json.login @user.login | |||
| json.user_id @user.id | |||
| json.image_url url_to_avatar(@user) | |||
| @@ -14,3 +15,9 @@ json.profile_completed @user.profile_completed? | |||
| json.professional_certification @user.professional_certification | |||
| json.devops_step @user.devops_step | |||
| json.ci_certification @user.ci_certification? | |||
| json.email @user.mail | |||
| json.province @user.province | |||
| json.city @user.city | |||
| json.custom_department @user.custom_department | |||
| json.description @user.description | |||
| json.(@user, :show_email, :show_department, :show_location) | |||
| @@ -0,0 +1,5 @@ | |||
| json.total_contributions @headmaps.collect{|map| map["contributions"]}.reduce(0, :+) | |||
| json.headmaps @headmaps.each do |map| | |||
| json.date Time.at(map["timestamp"].to_i).strftime("%Y-%m-%d") | |||
| json.contributions map["contributions"] | |||
| end | |||
| @@ -0,0 +1,7 @@ | |||
| json.total_count @is_pinned_projects.total_count | |||
| json.projects @is_pinned_projects.each do |project| | |||
| json.partial! "projects/project_detail", project: project&.project | |||
| json.id project.id | |||
| json.position project.position | |||
| json.project_id project.project_id | |||
| end | |||
| @@ -0,0 +1,4 @@ | |||
| json.total_count @project_trends.total_count | |||
| json.project_trends @project_trends.each do |trend| | |||
| json.partial! "project_trends/detail", trend: trend | |||
| end | |||
| @@ -1,15 +1,4 @@ | |||
| # json.partial! 'users/user', locals: { user: @user } | |||
| json.username @user.full_name | |||
| json.real_name @user.real_name | |||
| json.login @user.login | |||
| json.user_id @user.id | |||
| json.image_url url_to_avatar(@user) | |||
| json.admin @user.admin? | |||
| json.user_identity @user.identity | |||
| json.is_watch current_user&.watched?(@user) | |||
| json.watched_count @user.fan_count #粉丝 | |||
| json.watching_count @user.follow_count #关注数 | |||
| json.partial! 'users/user', locals: { user: @user } | |||
| json.undo_messages @waiting_applied_messages.size | |||
| json.undo_transfer_projects @common_applied_transfer_projects.size | |||
| json.undo_events @undo_events | |||
| @@ -17,4 +6,10 @@ json.user_composes_count @user_composes_count | |||
| json.user_org_count @user_org_count | |||
| json.common_projects_count @projects_common_count | |||
| json.mirror_projects_count @projects_mirrior_count | |||
| json.sync_mirror_projects_count @projects_sync_mirrior_count | |||
| json.sync_mirror_projects_count @projects_sync_mirrior_count | |||
| json.created_time format_time(@user.created_on) | |||
| json.email @user.show_email ? @user.mail : nil | |||
| json.province @user.show_location ? @user.province : nil | |||
| json.city @user.show_location ? @user.city : nil | |||
| json.custom_department @user.show_department ? @user.custom_department : nil | |||
| json.description @user.description | |||
| @@ -0,0 +1,19 @@ | |||
| json.platform do | |||
| json.influence @platform_influence | |||
| json.contribution @platform_contribution | |||
| json.activity @platform_activity | |||
| json.experience @platform_experience | |||
| json.language @platform_language | |||
| json.languages_percent @platform_languages_percent | |||
| json.each_language_score @platform_each_language_score | |||
| end | |||
| json.user do | |||
| json.influence @influence | |||
| json.contribution @contribution | |||
| json.activity @activity | |||
| json.experience @experience | |||
| json.language @language | |||
| json.languages_percent @languages_percent | |||
| json.each_language_score @each_language_score | |||
| end | |||
| @@ -0,0 +1,19 @@ | |||
| json.total_projects_count @full_member_projects_count | |||
| json.role do | |||
| json.owner do | |||
| json.count @owner_projects_count | |||
| json.percent (@owner_projects_count.to_f/@full_member_projects_count).round(2) | |||
| end | |||
| json.manager do | |||
| json.count @manager_projects_count | |||
| json.percent (@manager_projects_count.to_f/@full_member_projects_count).round(2) | |||
| end | |||
| json.developer do | |||
| json.count @developer_projects_count | |||
| json.percent (@developer_projects_count.to_f/@full_member_projects_count).round(2) | |||
| end | |||
| json.reporter do | |||
| json.count @reporter_projects_count | |||
| json.percent (@reporter_projects_count.to_f/@full_member_projects_count).round(2) | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| json.partial! 'users/user', locals: { user: @user } | |||
| @@ -1,7 +1,7 @@ | |||
| json.count @watchers_count | |||
| json.users do | |||
| json.array! @watchers do |watcher| | |||
| json.partial! "/users/watch_user_detail", locals: {target: watcher, user: watcher.watchable} | |||
| json.partial! "/users/watch_user_detail", target: watcher, user: watcher.watchable | |||
| end | |||
| # json.partial! "/users/watch_user_detail", collection: @watchers, as: :target | |||
| end | |||
| @@ -15,7 +15,7 @@ zh-CN: | |||
| 'refused': '已拒绝' | |||
| 'agreed': '已同意' | |||
| trend: | |||
| Issue: 工单 | |||
| Issue: 易修(Issue) | |||
| PullRequest: 合并请求 | |||
| VersionRelease: 版本发布 | |||
| create: 创建了 | |||
| @@ -190,6 +190,7 @@ Rails.application.routes.draw do | |||
| post :remote_update | |||
| post :remote_login | |||
| post :remote_password | |||
| post :change_password | |||
| end | |||
| end | |||
| @@ -265,6 +266,21 @@ Rails.application.routes.draw do | |||
| post :refuse | |||
| end | |||
| end | |||
| resources :headmaps, only: [:index] | |||
| resources :is_pinned_projects, only: [:index, :update] do | |||
| collection do | |||
| post :pin | |||
| end | |||
| end | |||
| resources :statistics, only: [:index] do | |||
| collection do | |||
| get :activity | |||
| get :develop | |||
| get :role | |||
| get :major | |||
| end | |||
| end | |||
| resources :project_trends, only: [:index] | |||
| resources :organizations, only: [:index] | |||
| # resources :projects, only: [:index] | |||
| # resources :subjects, only: [:index] | |||
| @@ -0,0 +1,95 @@ | |||
| -- ---------------------------- | |||
| -- Records of roles | |||
| -- ---------------------------- | |||
| BEGIN; | |||
| INSERT INTO `roles` (`id`, `name`, `position`, `assignable`, `builtin`, `permissions`, `issues_visibility`) VALUES | |||
| (1, 'Non member', 1, 1, 1, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (2, 'Anonymous', 2, 1, 2, '---\n- :memos_attachments_download\n- :view_course_files\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (3, 'Manager', 3, 1, 0, '---\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :is_manager\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :quote_project\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :add_code_review\n- :edit_code_review\n- :delete_code_review\n- :assign_code_review\n- :code_review_setting\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'all'), | |||
| (4, 'Developer', 5, 1, 0, '---\n- :add_project\n- :manage_versions\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n', 'all'), | |||
| (5, 'Reporter', 4, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :edit_issues\n- :add_issue_notes\n- :edit_own_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'all'), | |||
| (7, 'TeachingAsistant', 6, 1, 0, '---\n- :add_project\n- :edit_project\n- :manage_members\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :manage_news\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'default'), | |||
| (9, 'Teacher', 7, 1, 0, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'default'), | |||
| (10, 'Student', 9, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :as_student\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (11, 'orgManager', 8, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (12, 'orgMember', 10, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (13, 'ContestManager', 11, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (14, 'Judge', 12, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (15, 'Contestant', 13, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :notificationcomment_contestnotifications\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'); | |||
| COMMIT; | |||
| -- ---------------------------- | |||
| -- Records of ci_languages | |||
| -- ---------------------------- | |||
| BEGIN; | |||
| INSERT INTO `ci_languages` (`id`, `name`, `content`, `usage_amount`, `created_at`, `updated_at`, `cover_id`) VALUES | |||
| (1, 'C', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (2, 'C++', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (3, 'Docker', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuL2RvY2tlci5zb2NrCiAgICBjb21t\nYW5kczoKICAgIC0gZG9ja2VyIHBzIC1hCgp2b2x1bWVzOgotIG5hbWU6IGRv\nY2tlcnNvY2sKICBob3N0OgogICAgcGF0aDogL3Zhci9ydW4vZG9ja2VyLnNv\nY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:35:20', 351688), | |||
| (4, 'Java', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (5, 'R', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHItYmFzZQogIGNvbW1hbmRzOgogIC0gUiAtZSAnaW5zdGFsbC5w\nYWNrYWdlcyhjKCdwYWNrYWdlMScsJ3BhY2thZ2UyJykpJwogIC0gUiBDTUQg\nYnVpbGQgLg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (6, 'Ruby', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1YnkKICBjb21tYW5kczoKICAtIGJ1bmRsZSBpbnN0YWxsIC0t\nam9icz0zIC0tcmV0cnk9MwogIC0gcmFrZQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (7, 'PHP', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBpbnN0YWxs\nCiAgaW1hZ2U6IGNvbXBvc2VyCiAgY29tbWFuZHM6CiAgLSBjb21wb3NlciBp\nbnN0YWxsCgotIG5hbWU6IHRlc3QKICBpbWFnZTogcGhwOjcKICBjb21tYW5k\nczoKICAtIHZlbmRvci9iaW4vcGhwdW5pdCAtLWNvbmZpZ3VyYXRpb24gY29u\nZmlnLnhtbA==\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:37:04', 351690), | |||
| (8, 'Python', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHB5dGhvbgogIGNvbW1hbmRzOgogIC0gcGlwIGluc3RhbGwgLXIg\ncmVxdWlyZW1lbnRzLnR4dAogIC0gcHl0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:40:00', 351693), | |||
| (9, 'MySQL', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG15c3FsCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQogIC0gbXlz\ncWwgLXUgcm9vdCAtaCBkYXRhYmFzZSAtLWV4ZWN1dGU9J1NFTEVDVCBWRVJT\nSU9OKCk7JwoKc2VydmljZXM6Ci0gbmFtZTogZGF0YWJhc2UKICBpbWFnZTog\nbXlzcWwKICBlbnZpcm9ubWVudDoKICAgIE1ZU1FMX0FMTE9XX0VNUFRZX1BB\nU1NXT1JEOiAneWVzJwogICAgTVlTUUxfREFUQUJBU0U6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (10, 'MongoDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBwaW5nCiAg\naW1hZ2U6IG1vbmdvOjQKICBjb21tYW5kczoKICAtIHNsZWVwIDUKICAtIG1v\nbmdvIC0taG9zdCBtb25nbyAtLWV2YWwgJ2RiLnZlcnNpb24oKScKCnNlcnZp\nY2VzOgotIG5hbWU6IG1vbmdvCiAgaW1hZ2U6IG1vbmdvOjQKICBjb21tYW5k\nOiBbIC0tc21hbGxmaWxlcyBd\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (11, 'Clojure', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNsb2p1cmUKICBjb21tYW5kczoKICAtIGxlaW4gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (12, 'CouchDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNvdWNoZGI6Mi4yCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQog\nIC0gY3VybCBodHRwOi8vZGF0YWJhc2U6NTk4NAoKc2VydmljZXM6Ci0gbmFt\nZTogZGF0YWJhc2UKICBpbWFnZTogY291Y2hkYjoyLjI=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (13, 'Crystal', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNyeXN0YWxsYW5nL2NyeXN0YWwKICBjb21tYW5kczoKICAtIHNo\nYXJkcyBpbnN0YWxsCiAgLSBjcnlzdGFsIHNwZWMuMg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (14, 'D', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRsYW5ndWFnZS9kbWQKICBjb21tYW5kczoKICAtIGR1YiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (15, 'Dart', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvb2dsZS9kYXJ0CiAgY29tbWFuZHM6CiAgLSBwdWIgZ2V0CiAg\nLSBwdWIgcnVuIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (16, 'Docker (dind)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuCiAgICBjb21tYW5kczoKICAgIC0g\nc2xlZXAgNSAjIGdpdmUgZG9ja2VyIGVub3VnaCB0aW1lIHRvIHN0YXJ0CiAg\nICAtIGRvY2tlciBwcyAtYQoKc2VydmljZXM6Ci0gbmFtZTogZG9ja2VyCiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgcHJpdmlsZWdlZDogdHJ1ZQogIHZvbHVt\nZXM6CiAgLSBuYW1lOiBkb2NrZXJzb2NrCiAgICBwYXRoOiAvdmFyL3J1bgoK\ndm9sdW1lczoKLSBuYW1lOiBkb2NrZXJzb2NrCiAgdGVtcDoge30=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (17, 'Elasticsearch', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGFscGluZTozLjgKICBjb21tYW5kczoKICAtIGFwayBhZGQgY3Vy\nbAogIC0gc2xlZXAgNDUKICAtIGN1cmwgaHR0cDovL2RhdGFiYXNlOjkyMDAK\nCnNlcnZpY2VzOgotIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IGVsYXN0aWNz\nZWFyY2g6NS1hbHBpbmU=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (18, 'Elixir', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVsaXhpcjoxLjUKICBjb21tYW5kczoKICAtIG1peCBsb2NhbC5y\nZWJhciAtLWZvcmNlCiAgLSBtaXggbG9jYWwuaGV4IC0tZm9yY2UKICAtIG1p\neCBkZXBzLmdldAogIC0gbWl4IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (19, 'Erlang', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVybGFuZzoyMQogIGNvbW1hbmRzOgogIC0gcmViYXIgZ2V0LWRl\ncHMKICAtIHJlYmFyIGNvbXBpbGUKICAtIHJlYmFyIHNraXBfZGVwcz10cnVl\nIGV1bml0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (20, '20.Go (with Gopath)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0Cgp3b3Jrc3BhY2U6CiAgYmFzZTogL2dv\nCiAgcGF0aDogc3JjL2hlbGxvLXdvcmxkCgpzdGVwczoKLSBuYW1lOiB0ZXN0\nCiAgaW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gZ2V0CiAgLSBn\nbyB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (21, '21.Go (with Modules)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gdGVzdAogIC0gZ28g\nYnVpbGQ=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (22, 'Gradle', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZTpqZGsxMAogIGNvbW1hbmRzOgogIC0gZ3JhZGxlIGFz\nc2VtYmxlCiAgLSBncmFkbGUgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:36:17', 351689), | |||
| (23, 'Groovy', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZToyLjUtamRrOAogIGNvbW1hbmRzOgogIC0gLi9ncmFk\nbGV3IGFzc2VtYmxlCiAgLSAuL2dyYWRsZXcgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (24, 'Haskell', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhhc2tlbGwKICBjb21tYW5kczoKICAtIGNhYmFsIGluc3RhbGwg\nLS1vbmx5LWRlcGVuZGVuY2llcyAtLWVuYWJsZS10ZXN0cwogIC0gY2FiYWwg\nY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCiAgLSBjYWJhbCBidWlsZAogIC0g\nY2FiYWwgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (25, 'Haxe', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhheGUKICBjb21tYW5kczoKICAtIGhheGVsaWIgaW5zdGFsbCBi\ndWlsZC5oeG1sCiAgLSBoYXhlIGJ1aWxkLmh4bWw=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (26, 'MariaDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hcmlhZGIKICBjb21tYW5kczoKICAtIHNsZWVwIDE1CiAgLSBt\neXNxbCAtdSByb290IC1oIGRhdGFiYXNlIC0tZXhlY3V0ZT0nU0VMRUNUIFZF\nUlNJT04oKTsnCgpzZXJ2aWNlczoKLSBuYW1lOiBkYXRhYmFzZQogIGltYWdl\nOiBtYXJpYWRiCiAgZW52aXJvbm1lbnQ6CiAgICBNWVNRTF9BTExPV19FTVBU\nWV9QQVNTV09SRDogJ3llcycKICAgIE1ZU1FMX0RBVEFCQVNFOiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (27, 'Maven', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (28, 'Memcached', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHVidW50dQogIGNvbW1hbmRzOgogIC0gYXB0LWdldCB1cGRhdGUg\nLXFxCiAgLSBhcHQtZ2V0IGluc3RhbGwgLXkgLXFxIHRlbG5ldCA+IC9kZXYv\nbnVsbAogIC0gKHNsZWVwIDE7IGVjaG8gJ3N0YXRzJzsgc2xlZXAgMjsgZWNo\nbyAncXVpdCc7KSB8IHRlbG5ldCBjYWNoZSAxMTIxMSB8fCB0cnVlCgpzZXJ2\naWNlczoKLSBuYW1lOiBjYWNoZQogIGltYWdlOiBtZW1jYWNoZWQ6YWxwaW5l\nCiAgY29tbWFuZDogWyAtdnYgXQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (29, 'Nats', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1Ynk6MgogIGNvbW1hbmRzOgogIC0gZ2VtIGluc3RhbGwgbmF0\ncwogIC0gbmF0cy1wdWIgLXMgdGNwOi8vbmF0czo0MjIyIGdyZWV0aW5nICdo\nZWxsbycKICAtIG5hdHMtcHViIC1zIHRjcDovL25hdHM6NDIyMiBncmVldGlu\nZyAnd29ybGQnCgpzZXJ2aWNlczoKLSBuYW1lOiBuYXRzCiAgaW1hZ2U6IG5h\ndHM6MS4zLjA=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (30, 'Node', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGUKICBjb21tYW5kczoKICAtIG5wbSBpbnN0YWxsCiAgLSBu\ncG0gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (31, 'Perl', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBlcmwKICBjb21tYW5kczoKICAtIGNwYW5tIC0tcXVpZXQgLS1p\nbnN0YWxsZGVwcyAtLW5vdGVzdCAuCiAgLSBwZXJsIEJ1aWxkLlBMCiAgLSAu\nL0J1aWxkIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (32, 'Postgres', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAgY29tbWFuZHM6CiAgLSBwc3Fs\nIC1VIHBvc3RncmVzIC1kIHRlc3QgLWggZGF0YWJhc2UKCnNlcnZpY2VzOgot\nIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAg\nZW52aXJvbm1lbnQ6CiAgICBQT1NUR1JFU19VU0VSOiBwb3N0Z3JlcwogICAg\nUE9TVEdSRVNfREI6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (33, 'Redis', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJlZGlzCiAgY29tbWFuZHM6CiAgLSBzbGVlcCA1CiAgLSByZWRp\ncy1jbGkgLWggcmVkaXMgcGluZwogIC0gcmVkaXMtY2xpIC1oIHJlZGlzIHNl\ndCBGT08gYmFyCiAgLSByZWRpcy1jbGkgLWggcmVkaXMgZ2V0IEZPTwoKc2Vy\ndmljZXM6Ci0gbmFtZTogcmVkaXMKICBpbWFnZTogcmVkaXM=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (34, 'RethinkDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGU6OQogIGNvbW1hbmRzOgogIC0gbnBtIGluc3RhbGwgLXMg\nLWcgcmVjbGkKICAtIHJlY2xpIC1oIGRhdGFiYXNlIC1qICdyLmRiKCdyZXRo\naW5rZGInKS50YWJsZSgnc3RhdHMnKScKCnNlcnZpY2VzOgotIG5hbWU6IGRh\ndGFiYXNlCiAgaW1hZ2U6IHJldGhpbmtkYjoyCiAgY29tbWFuZDogWyByZXRo\naW5rZGIsIC0tYmluZCwgYWxsIF0=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (35, 'Rust', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1c3Q6MS4zMAogIGNvbW1hbmRzOgogIC0gY2FyZ28gYnVpbGQg\nLS12ZXJib3NlIC0tYWxsCiAgLSBjYXJnbyB0ZXN0IC0tdmVyYm9zZSAtLWFs\nbA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (36, 'Swift', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHN3aWZ0OjQKICBjb21tYW5kczoKICAtIHN3aWZ0IGJ1aWxkCiAg\nLSBzd2lmdCB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (37, 'Vault', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAgICBW\nQVVMVF9BRERSOiBodHRwOi8vdmF1bHQ6ODIwMAogICAgVkFVTFRfVE9LRU46\nIGR1bW15CiBjb21tYW5kczoKIC0gc2xlZXAgNQogLSB2YXVsdCBrdiBwdXQg\nc2VjcmV0L215LXNlY3JldCBteS12YWx1ZT1zM2NyM3QKIC0gdmF1bHQga3Yg\nZ2V0IHNlY3JldC9teS1zZWNyZXQKCnNlcnZpY2VzOgotIG5hbWU6IHZhdWx0\nCiAgaW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAg\nICBWQVVMVF9ERVZfUk9PVF9UT0tFTl9JRDogZHVtbXk=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL); | |||
| COMMIT; | |||
| -- ---------------------------- | |||
| -- Records of ci_templates | |||
| -- ---------------------------- | |||
| BEGIN; | |||
| INSERT INTO `ci_templates` (`id`, `template_name`, `stage_type`, `category`, `content`, `created_at`, `updated_at`, `parent_category`, `login`) VALUES | |||
| (2, 'linux/amd64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: amd64', '2021-01-12 02:44:23', '2021-02-02 10:51:36', '初始化', 'admin'), | |||
| (3, 'linux/arm64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: arm64', '2021-01-12 02:45:17', '2021-02-02 10:51:47', '初始化', 'admin'), | |||
| (4, 'maven', 'build', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn install -DskipTests=true', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '编译构建', 'admin'), | |||
| (5, 'maven单元测试', 'customize', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn test', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '单元测试', 'admin'), | |||
| (6, 'golang单元测试', 'customize', 'Golang', '- name: golang单元测试\r\n image: golang\r\n commands:\r\n - go test', '2021-01-12 03:03:35', '2021-01-12 03:03:35', '单元测试', 'admin'), | |||
| (8, 'gradle', 'build', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle build -x test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '编译构建', 'admin'), | |||
| (9, 'gradle单元测试', 'customize', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '单元测试', 'admin'), | |||
| (10, '远程主机部署', 'deploy', '部署', '# 需要将软件包与部署脚本提前上传到远程主机(见文件上传模板)\r\n# host、username、password可在参数管理中配置\r\n- name: 远程主机部署\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - chmod +x /home/deploy.sh\r\n - ./home/deploy.sh', '2021-01-12 03:32:46', '2021-03-05 06:22:02', '部署', 'admin'), | |||
| (11, '远程命令', 'customize', '其他', '# host、username、password可在参数管理中配置\r\n- name: 远程命令\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - echo ''hello world!''', '2021-01-12 03:40:38', '2021-03-05 06:19:44', '其他', 'admin'), | |||
| (12, '上传文件', 'customize', '其他', '# 本模板示例为上传软件包和部署脚本到home目录\r\n# host、username、password可在参数管理中配置\r\n- name: 上传文件\r\n image: appleboy/drone-scp\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n target: /home\r\n source: \r\n - target/*.jar\r\n - deploy.sh', '2021-01-12 03:40:55', '2021-03-05 06:22:22', '其他', 'admin'), | |||
| (17, 'make-c', 'build', 'C', '- name: 编译\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:19:38', '2021-02-02 10:52:15', '编译构建', 'admin'), | |||
| (19, 'make-c++', 'build', 'C++', '- name: 编译构建\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:21:05', '2021-01-15 01:21:05', '编译构建', 'admin'), | |||
| (20, 'python', 'build', 'Python', '- name: 编译构建\r\n image: python\r\n commands:\r\n - pip install -r requirements.txt', '2021-01-15 01:22:36', '2021-01-15 01:22:36', '编译构建', 'admin'), | |||
| (21, 'Docker', 'build', 'Docker', '# 构建Docker镜像并推送到仓库\r\n# 定义镜像Hub路径以及账号密码\r\n- name: Docker镜像构建\r\n image: plugins/docker\r\n settings:\r\n username: username\r\n password: pwd\r\n repo: repoUrl\r\n tags: latest', '2021-01-15 01:23:16', '2021-02-03 03:40:49', '编译构建', 'admin'), | |||
| (22, '空白模板', 'customize', 'customize', '', '2021-01-15 02:53:02', '2021-01-15 02:53:02', '其他', 'admin'), | |||
| (25, 'Go (with Gopath)', 'build', 'Go', '- name: golang\r\n image: golang\r\n commands:\r\n - go get\r\n - go test', '2021-02-03 00:57:32', '2021-02-03 03:36:15', '编译构建', 'admin'), | |||
| (26, 'PHP', 'build', 'PHP', '- name: install\r\n image: composer\r\n commands:\r\n - composer install', '2021-02-03 00:59:15', '2021-02-03 00:59:15', '编译构建', 'admin'), | |||
| (27, 'Ruby', 'build', 'Ruby', '- name: ruby\r\n image: ruby\r\n commands:\r\n - bundle install --jobs=3 --retry=3\r\n - rake', '2021-02-03 00:59:52', '2021-02-03 00:59:52', '编译构建', 'admin'), | |||
| (29, 'Go (with Modules)', 'build', 'Go', '- name: test\r\n image: golang\r\n commands:\r\n - go test\r\n - go build', '2021-02-03 03:35:45', '2021-02-03 03:35:45', '编译构建', 'admin'), | |||
| (30, 'Node', 'build', 'Node', '- name: Node编译\r\n image: node\r\n commands:\r\n - npm install\r\n - npm test', '2021-02-03 03:37:31', '2021-02-03 03:37:31', '编译构建', 'admin'), | |||
| (31, 'Perl ', 'build', 'Perl', '- name: perl\r\n image: perl\r\n commands:\r\n - cpanm --quiet --installdeps --notest .\r\n - perl Build.PL\r\n - ./Build test', '2021-02-03 03:38:06', '2021-02-03 03:38:06', '编译构建', 'admin'), | |||
| (32, 'Rust ', 'build', 'Rust', '- name: rust\r\n image: rust:1.30\r\n commands:\r\n - cargo build --verbose --all\r\n - cargo test --verbose --all', '2021-02-03 03:38:37', '2021-02-03 03:38:37', '编译构建', 'admin'), | |||
| (33, 'test', 'init', '初始化', 'qqqq', '2021-02-04 09:02:42', '2021-02-04 09:02:42', '初始化', 'admin'); | |||
| COMMIT; | |||
| @@ -0,0 +1,11 @@ | |||
| class CreatePinnedProjects < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :pinned_projects do |t| | |||
| t.references :user | |||
| t.references :project | |||
| t.integer :position, default: 0 | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,8 @@ | |||
| class AddFieldsToUserExtensions < ActiveRecord::Migration[5.2] | |||
| def change | |||
| add_column :user_extensions, :province, :string # 省份 | |||
| add_column :user_extensions, :city, :string # 城市 | |||
| add_column :user_extensions, :custom_department, :string #自己填写的单位名称 | |||
| # remove_column :users, :description | |||
| end | |||
| end | |||
| @@ -0,0 +1,7 @@ | |||
| class AddShowConditionToUserExtensions < ActiveRecord::Migration[5.2] | |||
| def change | |||
| add_column :user_extensions, :show_email, :boolean, default: false | |||
| add_column :user_extensions, :show_location, :boolean, default: false | |||
| add_column :user_extensions, :show_department, :boolean, default: false | |||
| end | |||
| end | |||
| @@ -3424,98 +3424,3 @@ COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `laboratory_settings` VALUES (1, 1, '{\"name\":\"EduCoder\",\"navbar\":[{\"name\":\"实践课程\",\"link\":\"/paths\",\"hidden\":false},{\"name\":\"翻转课堂\",\"link\":\"/courses\",\"hidden\":false},{\"name\":\"实现项目\",\"link\":\"/shixuns\",\"hidden\":false},{\"name\":\"在线竞赛\",\"link\":\"/competitions\",\"hidden\":false},{\"name\":\"教学案例\",\"link\":\"/moop_cases\",\"hidden\":false},{\"name\":\"交流问答\",\"link\":\"/forums\",\"hidden\":false}],\"footer\":\"\\n\\u003cp class=\\\"footer_con-p inline lineh-30 font-14\\\"\\u003e\\n \\u003cspan class=\\\"font-18 fl\\\"\\u003e©\\u003c/span\\u003e\\u0026nbsp;2019\\u0026nbsp;EduCoder\\n \\u003ca target=\\\"_blank\\\" href=\\\"http://beian.miit.gov.cn/\\\" class=\\\"ml15 mr15\\\" style=\\\"color: rgb(136, 136, 136);\\\"\\u003e湘ICP备17009477号\\u003c/a\\u003e\\n \\u003ca target=\\\"_blank\\\" href=\\\"http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=43019002000962\\\" class=\\\"mr15\\\" style=\\\"color: rgb(136, 136, 136);\\\"\\u003e\\n \\u003cimg class=\\\"vertical4\\\" src=\\\"https://ali-cdn.educoder.net/react/build/static/media/beian.d0289dc0.png\\\"\\u003e湘公网安备43019002000962号\\n \\u003c/a\\u003e\\n \\u003ca href=\\\"https://team.trustie.net\\\" target=\\\"_blank\\\" style=\\\"color: rgb(136, 136, 136);\\\"\\u003eTrustie\\u003c/a\\u003e\\n \\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026amp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;IntelliDE inside.\\n \\u003cspan class=\\\"mr15\\\"\\u003e版权所有 湖南智擎科技有限公司\\u003c/span\\u003e\\u003c/p\\u003e\\n \"}'); | |||
| COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `roles` (`id`, `name`, `position`, `assignable`, `builtin`, `permissions`, `issues_visibility`) VALUES | |||
| (1, 'Non member', 1, 1, 1, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (2, 'Anonymous', 2, 1, 2, '---\n- :memos_attachments_download\n- :view_course_files\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (3, 'Manager', 3, 1, 0, '---\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :is_manager\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :quote_project\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :add_code_review\n- :edit_code_review\n- :delete_code_review\n- :assign_code_review\n- :code_review_setting\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'all'), | |||
| (4, 'Developer', 5, 1, 0, '---\n- :add_project\n- :manage_versions\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n', 'all'), | |||
| (5, 'Reporter', 4, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :edit_issues\n- :add_issue_notes\n- :edit_own_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'all'), | |||
| (7, 'TeachingAsistant', 6, 1, 0, '---\n- :add_project\n- :edit_project\n- :manage_members\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :manage_news\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'default'), | |||
| (9, 'Teacher', 7, 1, 0, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'default'), | |||
| (10, 'Student', 9, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :as_student\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (11, 'orgManager', 8, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (12, 'orgMember', 10, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (13, 'ContestManager', 11, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (14, 'Judge', 12, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (15, 'Contestant', 13, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :notificationcomment_contestnotifications\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'); | |||
| COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `ci_languages` (`id`, `name`, `content`, `usage_amount`, `created_at`, `updated_at`, `cover_id`) VALUES | |||
| (1, 'C', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (2, 'C++', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (3, 'Docker', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuL2RvY2tlci5zb2NrCiAgICBjb21t\nYW5kczoKICAgIC0gZG9ja2VyIHBzIC1hCgp2b2x1bWVzOgotIG5hbWU6IGRv\nY2tlcnNvY2sKICBob3N0OgogICAgcGF0aDogL3Zhci9ydW4vZG9ja2VyLnNv\nY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:35:20', 351688), | |||
| (4, 'Java', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (5, 'R', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHItYmFzZQogIGNvbW1hbmRzOgogIC0gUiAtZSAnaW5zdGFsbC5w\nYWNrYWdlcyhjKCdwYWNrYWdlMScsJ3BhY2thZ2UyJykpJwogIC0gUiBDTUQg\nYnVpbGQgLg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (6, 'Ruby', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1YnkKICBjb21tYW5kczoKICAtIGJ1bmRsZSBpbnN0YWxsIC0t\nam9icz0zIC0tcmV0cnk9MwogIC0gcmFrZQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (7, 'PHP', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBpbnN0YWxs\nCiAgaW1hZ2U6IGNvbXBvc2VyCiAgY29tbWFuZHM6CiAgLSBjb21wb3NlciBp\nbnN0YWxsCgotIG5hbWU6IHRlc3QKICBpbWFnZTogcGhwOjcKICBjb21tYW5k\nczoKICAtIHZlbmRvci9iaW4vcGhwdW5pdCAtLWNvbmZpZ3VyYXRpb24gY29u\nZmlnLnhtbA==\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:37:04', 351690), | |||
| (8, 'Python', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHB5dGhvbgogIGNvbW1hbmRzOgogIC0gcGlwIGluc3RhbGwgLXIg\ncmVxdWlyZW1lbnRzLnR4dAogIC0gcHl0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:40:00', 351693), | |||
| (9, 'MySQL', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG15c3FsCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQogIC0gbXlz\ncWwgLXUgcm9vdCAtaCBkYXRhYmFzZSAtLWV4ZWN1dGU9J1NFTEVDVCBWRVJT\nSU9OKCk7JwoKc2VydmljZXM6Ci0gbmFtZTogZGF0YWJhc2UKICBpbWFnZTog\nbXlzcWwKICBlbnZpcm9ubWVudDoKICAgIE1ZU1FMX0FMTE9XX0VNUFRZX1BB\nU1NXT1JEOiAneWVzJwogICAgTVlTUUxfREFUQUJBU0U6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (10, 'MongoDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBwaW5nCiAg\naW1hZ2U6IG1vbmdvOjQKICBjb21tYW5kczoKICAtIHNsZWVwIDUKICAtIG1v\nbmdvIC0taG9zdCBtb25nbyAtLWV2YWwgJ2RiLnZlcnNpb24oKScKCnNlcnZp\nY2VzOgotIG5hbWU6IG1vbmdvCiAgaW1hZ2U6IG1vbmdvOjQKICBjb21tYW5k\nOiBbIC0tc21hbGxmaWxlcyBd\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (11, 'Clojure', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNsb2p1cmUKICBjb21tYW5kczoKICAtIGxlaW4gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (12, 'CouchDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNvdWNoZGI6Mi4yCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQog\nIC0gY3VybCBodHRwOi8vZGF0YWJhc2U6NTk4NAoKc2VydmljZXM6Ci0gbmFt\nZTogZGF0YWJhc2UKICBpbWFnZTogY291Y2hkYjoyLjI=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (13, 'Crystal', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNyeXN0YWxsYW5nL2NyeXN0YWwKICBjb21tYW5kczoKICAtIHNo\nYXJkcyBpbnN0YWxsCiAgLSBjcnlzdGFsIHNwZWMuMg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (14, 'D', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRsYW5ndWFnZS9kbWQKICBjb21tYW5kczoKICAtIGR1YiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (15, 'Dart', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvb2dsZS9kYXJ0CiAgY29tbWFuZHM6CiAgLSBwdWIgZ2V0CiAg\nLSBwdWIgcnVuIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (16, 'Docker (dind)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuCiAgICBjb21tYW5kczoKICAgIC0g\nc2xlZXAgNSAjIGdpdmUgZG9ja2VyIGVub3VnaCB0aW1lIHRvIHN0YXJ0CiAg\nICAtIGRvY2tlciBwcyAtYQoKc2VydmljZXM6Ci0gbmFtZTogZG9ja2VyCiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgcHJpdmlsZWdlZDogdHJ1ZQogIHZvbHVt\nZXM6CiAgLSBuYW1lOiBkb2NrZXJzb2NrCiAgICBwYXRoOiAvdmFyL3J1bgoK\ndm9sdW1lczoKLSBuYW1lOiBkb2NrZXJzb2NrCiAgdGVtcDoge30=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (17, 'Elasticsearch', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGFscGluZTozLjgKICBjb21tYW5kczoKICAtIGFwayBhZGQgY3Vy\nbAogIC0gc2xlZXAgNDUKICAtIGN1cmwgaHR0cDovL2RhdGFiYXNlOjkyMDAK\nCnNlcnZpY2VzOgotIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IGVsYXN0aWNz\nZWFyY2g6NS1hbHBpbmU=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (18, 'Elixir', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVsaXhpcjoxLjUKICBjb21tYW5kczoKICAtIG1peCBsb2NhbC5y\nZWJhciAtLWZvcmNlCiAgLSBtaXggbG9jYWwuaGV4IC0tZm9yY2UKICAtIG1p\neCBkZXBzLmdldAogIC0gbWl4IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (19, 'Erlang', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVybGFuZzoyMQogIGNvbW1hbmRzOgogIC0gcmViYXIgZ2V0LWRl\ncHMKICAtIHJlYmFyIGNvbXBpbGUKICAtIHJlYmFyIHNraXBfZGVwcz10cnVl\nIGV1bml0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (20, '20.Go (with Gopath)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0Cgp3b3Jrc3BhY2U6CiAgYmFzZTogL2dv\nCiAgcGF0aDogc3JjL2hlbGxvLXdvcmxkCgpzdGVwczoKLSBuYW1lOiB0ZXN0\nCiAgaW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gZ2V0CiAgLSBn\nbyB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (21, '21.Go (with Modules)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gdGVzdAogIC0gZ28g\nYnVpbGQ=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (22, 'Gradle', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZTpqZGsxMAogIGNvbW1hbmRzOgogIC0gZ3JhZGxlIGFz\nc2VtYmxlCiAgLSBncmFkbGUgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:36:17', 351689), | |||
| (23, 'Groovy', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZToyLjUtamRrOAogIGNvbW1hbmRzOgogIC0gLi9ncmFk\nbGV3IGFzc2VtYmxlCiAgLSAuL2dyYWRsZXcgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (24, 'Haskell', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhhc2tlbGwKICBjb21tYW5kczoKICAtIGNhYmFsIGluc3RhbGwg\nLS1vbmx5LWRlcGVuZGVuY2llcyAtLWVuYWJsZS10ZXN0cwogIC0gY2FiYWwg\nY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCiAgLSBjYWJhbCBidWlsZAogIC0g\nY2FiYWwgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (25, 'Haxe', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhheGUKICBjb21tYW5kczoKICAtIGhheGVsaWIgaW5zdGFsbCBi\ndWlsZC5oeG1sCiAgLSBoYXhlIGJ1aWxkLmh4bWw=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (26, 'MariaDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hcmlhZGIKICBjb21tYW5kczoKICAtIHNsZWVwIDE1CiAgLSBt\neXNxbCAtdSByb290IC1oIGRhdGFiYXNlIC0tZXhlY3V0ZT0nU0VMRUNUIFZF\nUlNJT04oKTsnCgpzZXJ2aWNlczoKLSBuYW1lOiBkYXRhYmFzZQogIGltYWdl\nOiBtYXJpYWRiCiAgZW52aXJvbm1lbnQ6CiAgICBNWVNRTF9BTExPV19FTVBU\nWV9QQVNTV09SRDogJ3llcycKICAgIE1ZU1FMX0RBVEFCQVNFOiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (27, 'Maven', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (28, 'Memcached', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHVidW50dQogIGNvbW1hbmRzOgogIC0gYXB0LWdldCB1cGRhdGUg\nLXFxCiAgLSBhcHQtZ2V0IGluc3RhbGwgLXkgLXFxIHRlbG5ldCA+IC9kZXYv\nbnVsbAogIC0gKHNsZWVwIDE7IGVjaG8gJ3N0YXRzJzsgc2xlZXAgMjsgZWNo\nbyAncXVpdCc7KSB8IHRlbG5ldCBjYWNoZSAxMTIxMSB8fCB0cnVlCgpzZXJ2\naWNlczoKLSBuYW1lOiBjYWNoZQogIGltYWdlOiBtZW1jYWNoZWQ6YWxwaW5l\nCiAgY29tbWFuZDogWyAtdnYgXQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (29, 'Nats', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1Ynk6MgogIGNvbW1hbmRzOgogIC0gZ2VtIGluc3RhbGwgbmF0\ncwogIC0gbmF0cy1wdWIgLXMgdGNwOi8vbmF0czo0MjIyIGdyZWV0aW5nICdo\nZWxsbycKICAtIG5hdHMtcHViIC1zIHRjcDovL25hdHM6NDIyMiBncmVldGlu\nZyAnd29ybGQnCgpzZXJ2aWNlczoKLSBuYW1lOiBuYXRzCiAgaW1hZ2U6IG5h\ndHM6MS4zLjA=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (30, 'Node', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGUKICBjb21tYW5kczoKICAtIG5wbSBpbnN0YWxsCiAgLSBu\ncG0gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (31, 'Perl', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBlcmwKICBjb21tYW5kczoKICAtIGNwYW5tIC0tcXVpZXQgLS1p\nbnN0YWxsZGVwcyAtLW5vdGVzdCAuCiAgLSBwZXJsIEJ1aWxkLlBMCiAgLSAu\nL0J1aWxkIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (32, 'Postgres', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAgY29tbWFuZHM6CiAgLSBwc3Fs\nIC1VIHBvc3RncmVzIC1kIHRlc3QgLWggZGF0YWJhc2UKCnNlcnZpY2VzOgot\nIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAg\nZW52aXJvbm1lbnQ6CiAgICBQT1NUR1JFU19VU0VSOiBwb3N0Z3JlcwogICAg\nUE9TVEdSRVNfREI6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (33, 'Redis', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJlZGlzCiAgY29tbWFuZHM6CiAgLSBzbGVlcCA1CiAgLSByZWRp\ncy1jbGkgLWggcmVkaXMgcGluZwogIC0gcmVkaXMtY2xpIC1oIHJlZGlzIHNl\ndCBGT08gYmFyCiAgLSByZWRpcy1jbGkgLWggcmVkaXMgZ2V0IEZPTwoKc2Vy\ndmljZXM6Ci0gbmFtZTogcmVkaXMKICBpbWFnZTogcmVkaXM=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (34, 'RethinkDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGU6OQogIGNvbW1hbmRzOgogIC0gbnBtIGluc3RhbGwgLXMg\nLWcgcmVjbGkKICAtIHJlY2xpIC1oIGRhdGFiYXNlIC1qICdyLmRiKCdyZXRo\naW5rZGInKS50YWJsZSgnc3RhdHMnKScKCnNlcnZpY2VzOgotIG5hbWU6IGRh\ndGFiYXNlCiAgaW1hZ2U6IHJldGhpbmtkYjoyCiAgY29tbWFuZDogWyByZXRo\naW5rZGIsIC0tYmluZCwgYWxsIF0=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (35, 'Rust', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1c3Q6MS4zMAogIGNvbW1hbmRzOgogIC0gY2FyZ28gYnVpbGQg\nLS12ZXJib3NlIC0tYWxsCiAgLSBjYXJnbyB0ZXN0IC0tdmVyYm9zZSAtLWFs\nbA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (36, 'Swift', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHN3aWZ0OjQKICBjb21tYW5kczoKICAtIHN3aWZ0IGJ1aWxkCiAg\nLSBzd2lmdCB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (37, 'Vault', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAgICBW\nQVVMVF9BRERSOiBodHRwOi8vdmF1bHQ6ODIwMAogICAgVkFVTFRfVE9LRU46\nIGR1bW15CiBjb21tYW5kczoKIC0gc2xlZXAgNQogLSB2YXVsdCBrdiBwdXQg\nc2VjcmV0L215LXNlY3JldCBteS12YWx1ZT1zM2NyM3QKIC0gdmF1bHQga3Yg\nZ2V0IHNlY3JldC9teS1zZWNyZXQKCnNlcnZpY2VzOgotIG5hbWU6IHZhdWx0\nCiAgaW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAg\nICBWQVVMVF9ERVZfUk9PVF9UT0tFTl9JRDogZHVtbXk=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL); | |||
| COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `ci_templates` (`id`, `template_name`, `stage_type`, `category`, `content`, `created_at`, `updated_at`, `parent_category`, `login`) VALUES | |||
| (2, 'linux/amd64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: amd64', '2021-01-12 02:44:23', '2021-02-02 10:51:36', '初始化', 'admin'), | |||
| (3, 'linux/arm64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: arm64', '2021-01-12 02:45:17', '2021-02-02 10:51:47', '初始化', 'admin'), | |||
| (4, 'maven', 'build', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn install -DskipTests=true', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '编译构建', 'admin'), | |||
| (5, 'maven单元测试', 'customize', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn test', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '单元测试', 'admin'), | |||
| (6, 'golang单元测试', 'customize', 'Golang', '- name: golang单元测试\r\n image: golang\r\n commands:\r\n - go test', '2021-01-12 03:03:35', '2021-01-12 03:03:35', '单元测试', 'admin'), | |||
| (8, 'gradle', 'build', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle build -x test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '编译构建', 'admin'), | |||
| (9, 'gradle单元测试', 'customize', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '单元测试', 'admin'), | |||
| (10, '远程主机部署', 'deploy', '部署', '# 需要将软件包与部署脚本提前上传到远程主机(见文件上传模板)\r\n# host、username、password可在参数管理中配置\r\n- name: 远程主机部署\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - chmod +x /home/deploy.sh\r\n - ./home/deploy.sh', '2021-01-12 03:32:46', '2021-03-05 06:22:02', '部署', 'admin'), | |||
| (11, '远程命令', 'customize', '其他', '# host、username、password可在参数管理中配置\r\n- name: 远程命令\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - echo ''hello world!''', '2021-01-12 03:40:38', '2021-03-05 06:19:44', '其他', 'admin'), | |||
| (12, '上传文件', 'customize', '其他', '# 本模板示例为上传软件包和部署脚本到home目录\r\n# host、username、password可在参数管理中配置\r\n- name: 上传文件\r\n image: appleboy/drone-scp\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n target: /home\r\n source: \r\n - target/*.jar\r\n - deploy.sh', '2021-01-12 03:40:55', '2021-03-05 06:22:22', '其他', 'admin'), | |||
| (17, 'make-c', 'build', 'C', '- name: 编译\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:19:38', '2021-02-02 10:52:15', '编译构建', 'admin'), | |||
| (19, 'make-c++', 'build', 'C++', '- name: 编译构建\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:21:05', '2021-01-15 01:21:05', '编译构建', 'admin'), | |||
| (20, 'python', 'build', 'Python', '- name: 编译构建\r\n image: python\r\n commands:\r\n - pip install -r requirements.txt', '2021-01-15 01:22:36', '2021-01-15 01:22:36', '编译构建', 'admin'), | |||
| (21, 'Docker', 'build', 'Docker', '# 构建Docker镜像并推送到仓库\r\n# 定义镜像Hub路径以及账号密码\r\n- name: Docker镜像构建\r\n image: plugins/docker\r\n settings:\r\n username: username\r\n password: pwd\r\n repo: repoUrl\r\n tags: latest', '2021-01-15 01:23:16', '2021-02-03 03:40:49', '编译构建', 'admin'), | |||
| (22, '空白模板', 'customize', 'customize', '', '2021-01-15 02:53:02', '2021-01-15 02:53:02', '其他', 'admin'), | |||
| (25, 'Go (with Gopath)', 'build', 'Go', '- name: golang\r\n image: golang\r\n commands:\r\n - go get\r\n - go test', '2021-02-03 00:57:32', '2021-02-03 03:36:15', '编译构建', 'admin'), | |||
| (26, 'PHP', 'build', 'PHP', '- name: install\r\n image: composer\r\n commands:\r\n - composer install', '2021-02-03 00:59:15', '2021-02-03 00:59:15', '编译构建', 'admin'), | |||
| (27, 'Ruby', 'build', 'Ruby', '- name: ruby\r\n image: ruby\r\n commands:\r\n - bundle install --jobs=3 --retry=3\r\n - rake', '2021-02-03 00:59:52', '2021-02-03 00:59:52', '编译构建', 'admin'), | |||
| (29, 'Go (with Modules)', 'build', 'Go', '- name: test\r\n image: golang\r\n commands:\r\n - go test\r\n - go build', '2021-02-03 03:35:45', '2021-02-03 03:35:45', '编译构建', 'admin'), | |||
| (30, 'Node', 'build', 'Node', '- name: Node编译\r\n image: node\r\n commands:\r\n - npm install\r\n - npm test', '2021-02-03 03:37:31', '2021-02-03 03:37:31', '编译构建', 'admin'), | |||
| (31, 'Perl ', 'build', 'Perl', '- name: perl\r\n image: perl\r\n commands:\r\n - cpanm --quiet --installdeps --notest .\r\n - perl Build.PL\r\n - ./Build test', '2021-02-03 03:38:06', '2021-02-03 03:38:06', '编译构建', 'admin'), | |||
| (32, 'Rust ', 'build', 'Rust', '- name: rust\r\n image: rust:1.30\r\n commands:\r\n - cargo build --verbose --all\r\n - cargo test --verbose --all', '2021-02-03 03:38:37', '2021-02-03 03:38:37', '编译构建', 'admin'), | |||
| (33, 'test', 'init', '初始化', 'qqqq', '2021-02-04 09:02:42', '2021-02-04 09:02:42', '初始化', 'admin'); | |||
| COMMIT; | |||
| @@ -18,4 +18,22 @@ namespace :sync_table_structure do | |||
| puts "init success" | |||
| end | |||
| task data: :environment do | |||
| puts "init table data......." | |||
| database_config = Rails.configuration.database_configuration | |||
| database = database_config[Rails.env]["database"] | |||
| database_username = database_config[Rails.env]["username"] | |||
| database_password = database_config[Rails.env]["password"] | |||
| database_host = database_config[Rails.env]["host"] | |||
| database_port = database_config[Rails.env]["port"] || 3306 | |||
| puts "bash: mysql -u#{database_username} -p#{database_password} -P#{database_port} -h#{database_host} #{database}" | |||
| system "mysql -u#{database_username} -p#{database_password} -P#{database_port} -h#{database_host} #{database} < #{Rails.root}/db/init_data.sql" | |||
| puts "init success" | |||
| end | |||
| end | |||
| @@ -0,0 +1,5 @@ | |||
| require 'rails_helper' | |||
| RSpec.describe PinnedProject, type: :model do | |||
| pending "add some examples to (or delete) #{__FILE__}" | |||
| end | |||