From 0e41b6cc9bf6e527773c6011d2b4feac6e77b7b9 Mon Sep 17 00:00:00 2001 From: jasder Date: Mon, 15 Mar 2021 16:02:59 +0800 Subject: [PATCH] =?UTF-8?q?FIX=20=E6=95=B4=E7=90=86=E8=A1=A8=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/attachment.rb | 8 +- app/models/chart_rule.rb | 18 +++ app/models/ci/stage.rb | 19 +++ app/models/ci/user.rb | 12 +- app/models/discuss.rb | 35 ++++++ app/models/forge_activity.rb | 21 +++- app/models/help.rb | 16 ++- app/models/laboratory.rb | 6 + app/models/laboratory_setting.rb | 4 + app/models/license.rb | 1 - app/models/live_link.rb | 24 ++++ app/models/member.rb | 1 - app/models/message_detail.rb | 15 +++ app/models/organization.rb | 12 +- app/models/project.rb | 73 ++++++++++++ app/models/project_category.rb | 7 +- app/models/repository.rb | 1 - app/models/school.rb | 36 ++++++ app/models/trustie/course.rb | 85 +++++++++++++- app/models/trustie/course_group.rb | 24 +++- app/models/trustie/homework_common.rb | 53 ++++++++- app/models/user.rb | 12 +- app/models/user_action.rb | 4 +- app/models/user_agent.rb | 5 +- app/models/user_extension.rb | 3 + app/models/version.rb | 2 +- .../20191212110933_add_platform_to_users.rb | 2 +- ...20191213091840_add_gitea_token_to_users.rb | 2 +- ..._id_and_project_language_id_to_projects.rb | 4 +- ...191220092618_add_user_ref_to_repository.rb | 4 +- .../20191223031855_add_gitea_uid_to_users.rb | 2 +- ...23063139_add_mirror_url_to_repositories.rb | 2 +- .../20191224064403_create_issue_tags.rb | 20 ++-- ...225125634_add_praises_count_to_projects.rb | 2 +- ...0191227084951_add_issues_type_and_token.rb | 6 +- .../20191227105755_rename_issue_tag_title.rb | 2 +- ...0191227140150_create_issue_tags_relates.rb | 12 +- ...91227162744_rename_issues_issue_tag_ids.rb | 2 +- .../20200103062707_create_issue_times.rb | 18 +-- .../20200103113839_add_is_lock_to_issue.rb | 2 +- ...06022235_add_watchers_count_to_projects.rb | 2 +- .../20200106082806_create_version_releases.rb | 28 ++--- ...93141_add_project_id_to_version_release.rb | 4 +- ...20200108015358_add_column_to_issue_tags.rb | 4 +- ...00108025756_add_column_to_pull_requests.rb | 8 +- ...0108031646_change_pull_requests_columns.rb | 8 +- ...0108071622_add_columns_to_pull_requests.rb | 4 +- ...955_add_issues_ref_name_and_branch_name.rb | 4 +- .../20200210074241_migrate_tiding_status.rb | 10 +- ...unt_and_pull_requests_count_to_projects.rb | 4 +- .../20200213094050_migrate_user_location.rb | 14 +-- ...0220063545_add_issues_count_to_versions.rb | 6 +- .../20200429085544_change_quill_to_md.rb | 110 +++++++++--------- .../20210315074550_add_columns_to_projects.rb | 6 + lib/tasks/sync_mulan_repo.rake | 7 ++ public/mulan_repo.xlsx | Bin 0 -> 20757 bytes 56 files changed, 617 insertions(+), 179 deletions(-) create mode 100644 db/migrate/20210315074550_add_columns_to_projects.rb create mode 100644 lib/tasks/sync_mulan_repo.rake create mode 100644 public/mulan_repo.xlsx diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 461c835f..1ca17345 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -17,7 +17,7 @@ # disk_directory :string(255) # attachtype :integer default("1") # is_public :integer default("1") -# copy_from :integer +# copy_from :string(255) # 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 diff --git a/app/models/chart_rule.rb b/app/models/chart_rule.rb index a0b344e0..26c7f808 100644 --- a/app/models/chart_rule.rb +++ b/app/models/chart_rule.rb @@ -1,3 +1,21 @@ +# == Schema Information +# +# Table name: chart_rules +# +# id :integer not null, primary key +# rule_type :string(255) +# content :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# competition_id :integer +# competition_stage_id :integer +# +# Indexes +# +# index_chart_rules_on_competition_id (competition_id) +# index_chart_rules_on_competition_stage_id (competition_stage_id) +# + class ChartRule < ApplicationRecord validates :content, length: { maximum: 1000, too_long: "不能超过1000个字符" } diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index 2309f05d..536e51cf 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -1,3 +1,22 @@ +# == Schema Information +# +# Table name: stages +# +# id :integer not null +# subject_id :integer +# name :string(255) +# description :text(65535) +# user_id :integer +# position :integer +# created_at :datetime not null +# updated_at :datetime not null +# shixuns_count :integer default("0") +# +# Indexes +# +# index_stages_on_subject_id (subject_id) +# + class Ci::Stage < Ci::RemoteBase self.primary_key = 'stage_id' diff --git a/app/models/ci/user.rb b/app/models/ci/user.rb index cd624675..fc82596c 100644 --- a/app/models/ci/user.rb +++ b/app/models/ci/user.rb @@ -39,13 +39,14 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") +# gitea_token :string(255) # # Indexes # @@ -53,8 +54,9 @@ # 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) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/discuss.rb b/app/models/discuss.rb index a4c833b5..1a2efc60 100644 --- a/app/models/discuss.rb +++ b/app/models/discuss.rb @@ -1,3 +1,38 @@ +# == Schema Information +# +# Table name: discusses +# +# id :integer not null, primary key +# user_id :integer +# dis_type :string(255) +# dis_id :integer +# content :text(65535) +# parent_id :integer +# root_id :integer +# praise_count :integer +# created_at :datetime not null +# updated_at :datetime not null +# challenge_id :integer +# reward :integer +# hidden :boolean default("0") +# last_reply_id :integer +# position :integer +# praises_count :integer default("0") +# sticky :boolean default("0") +# course_sticky :boolean default("0") +# course_hidden :boolean default("0") +# copy_message_id :integer +# +# Indexes +# +# index_discusses_on_challenge_id (challenge_id) +# index_discusses_on_copy_message_id (copy_message_id) +# index_discusses_on_course_hidden (course_hidden) +# index_discusses_on_course_sticky (course_sticky) +# index_discusses_on_dis_id_and_dis_type (dis_id,dis_type) +# index_discusses_on_user_id (user_id) +# + class Discuss < ApplicationRecord default_scope { order(created_at: :desc) } diff --git a/app/models/forge_activity.rb b/app/models/forge_activity.rb index 77103d0f..b9f11c5a 100644 --- a/app/models/forge_activity.rb +++ b/app/models/forge_activity.rb @@ -1,5 +1,24 @@ +# == Schema Information +# +# Table name: forge_activities +# +# id :integer not null, primary key +# user_id :integer +# project_id :integer +# forge_act_id :integer +# forge_act_type :string(255) +# org_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# forge_act_index (project_id,forge_act_id,created_at,forge_act_type) +# index_forge_activities_on_forge_act_id (forge_act_id) +# + class ForgeActivity < ApplicationRecord belongs_to :user belongs_to :project belongs_to :forge_act, polymorphic: true -end \ No newline at end of file +end diff --git a/app/models/help.rb b/app/models/help.rb index 2b8bf581..5a4c480b 100644 --- a/app/models/help.rb +++ b/app/models/help.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: helps +# +# id :integer not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# about_us :text(65535) +# agreement :text(65535) +# status :text(65535) +# help_center :text(65535) +# join_us :text(65535) +# + class Help < ApplicationRecord -end \ No newline at end of file +end diff --git a/app/models/laboratory.rb b/app/models/laboratory.rb index 73002a84..9d3ca07d 100644 --- a/app/models/laboratory.rb +++ b/app/models/laboratory.rb @@ -10,6 +10,12 @@ # sync_course :boolean default("0") # sync_subject :boolean default("0") # sync_shixun :boolean default("0") +# is_local :boolean default("0") +# +# Indexes +# +# index_laboratories_on_identifier (identifier) UNIQUE +# index_laboratories_on_school_id (school_id) # class Laboratory < ApplicationRecord diff --git a/app/models/laboratory_setting.rb b/app/models/laboratory_setting.rb index 5013dd54..61c677de 100644 --- a/app/models/laboratory_setting.rb +++ b/app/models/laboratory_setting.rb @@ -6,6 +6,10 @@ # laboratory_id :integer # config :text(65535) # +# Indexes +# +# index_laboratory_settings_on_laboratory_id (laboratory_id) +# class LaboratorySetting < ApplicationRecord belongs_to :laboratory diff --git a/app/models/license.rb b/app/models/license.rb index dcd5528f..0a14fb85 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -7,7 +7,6 @@ # content :text(65535) # created_at :datetime not null # updated_at :datetime not null -# is_secret :boolean default("0") # class License < ApplicationRecord diff --git a/app/models/live_link.rb b/app/models/live_link.rb index 9c6531f8..c1c0bf75 100644 --- a/app/models/live_link.rb +++ b/app/models/live_link.rb @@ -1,3 +1,27 @@ +# == Schema Information +# +# Table name: live_links +# +# id :integer not null, primary key +# course_id :integer +# user_id :integer +# url :string(255) +# description :text(65535) +# on_status :boolean default("0") +# created_at :datetime not null +# updated_at :datetime not null +# course_name :string(255) +# platform :string(255) +# live_time :datetime +# duration :integer +# position :integer +# +# Indexes +# +# index_live_links_on_course_id (course_id) +# index_live_links_on_user_id (user_id) +# + class LiveLink < ApplicationRecord # belongs_to :course belongs_to :user diff --git a/app/models/member.rb b/app/models/member.rb index 408710a0..e72ae7c6 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -11,7 +11,6 @@ # course_group_id :integer default("0") # is_collect :integer default("1") # graduation_group_id :integer default("0") -# is_apply_signature :boolean default("0") # # Indexes # diff --git a/app/models/message_detail.rb b/app/models/message_detail.rb index 51f4b17a..c009b474 100644 --- a/app/models/message_detail.rb +++ b/app/models/message_detail.rb @@ -1,3 +1,18 @@ +# == Schema Information +# +# Table name: message_details +# +# id :integer not null, primary key +# content :text(4294967295) +# message_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_message_details_on_message_id (message_id) +# + class MessageDetail < ApplicationRecord # belongs_to :message, :touch => true validates :content, length: { maximum: 10000, too_long: "内容不能超过10000个字符" } diff --git a/app/models/organization.rb b/app/models/organization.rb index a541b203..0eed798a 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -39,13 +39,14 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") +# gitea_token :string(255) # # Indexes # @@ -53,8 +54,9 @@ # 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) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/project.rb b/app/models/project.rb index cde2f101..1cb8c038 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,3 +1,4 @@ +<<<<<<< HEAD # == Schema Information # # Table name: projects @@ -71,6 +72,78 @@ # +======= +# == 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 +# +# 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) +# + +>>>>>>> 823c99bd (FIX 整理表结构) class Project < ApplicationRecord diff --git a/app/models/project_category.rb b/app/models/project_category.rb index 3a981981..458109e6 100644 --- a/app/models/project_category.rb +++ b/app/models/project_category.rb @@ -8,15 +8,10 @@ # 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 include Projectable - has_ancestry + # has_ancestry end diff --git a/app/models/repository.rb b/app/models/repository.rb index b6d2321f..978bc3c5 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -25,7 +25,6 @@ # # Indexes # -# index_repositories_on_identifier (identifier) # index_repositories_on_project_id (project_id) # index_repositories_on_user_id (user_id) # diff --git a/app/models/school.rb b/app/models/school.rb index f3b7ac0a..5b30be9a 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -1,3 +1,39 @@ +# == Schema Information +# +# Table name: schools +# +# id :integer not null, primary key +# name :string(255) +# province :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# logo_link :string(255) +# pinyin :string(255) +# school_type :integer default("0") +# city :string(255) +# address :string(255) +# auto_users_trial :boolean default("0") +# shool_code :string(255) +# authorization_time :datetime +# ec_auth :integer default("0") +# identifier :string(255) +# is_online :boolean default("0") +# video_name :string(255) +# video_desc :string(255) +# course_link :string(255) +# course_name :string(255) +# partner_id :integer +# customer_id :integer +# school_property_id :integer +# +# Indexes +# +# index_schools_on_customer_id (customer_id) +# index_schools_on_identifier (identifier) +# index_schools_on_partner_id (partner_id) +# index_schools_on_school_property_id (school_property_id) +# + class School < ApplicationRecord has_many :departments, dependent: :destroy diff --git a/app/models/trustie/course.rb b/app/models/trustie/course.rb index 6cf6411e..1c951ad6 100644 --- a/app/models/trustie/course.rb +++ b/app/models/trustie/course.rb @@ -1,4 +1,87 @@ +# == Schema Information +# +# Table name: courses +# +# id :integer not null, primary key +# tea_id :integer +# name :string(255) +# state :integer +# code :string(255) +# time :integer +# extra :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# location :string(255) +# term :string(255) +# string :string(255) +# password :string(255) +# setup_time :string(255) +# endup_time :string(255) +# class_period :integer default("0") +# school_id :integer +# description :text(65535) +# status :integer default("1") +# attachmenttype :integer default("2") +# lft :integer +# rgt :integer +# is_public :integer default("1") +# inherit_members :integer default("1") +# open_student :integer default("0") +# outline :integer default("0") +# publish_resource :integer default("0") +# is_delete :integer default("0") +# end_time :integer +# end_term :string(255) +# is_excellent :integer default("0") +# excellent_option :integer default("0") +# is_copy :integer default("0") +# visits :integer default("0") +# syllabus_id :integer +# invite_code :string(255) +# qrcode :string(255) +# qrcode_expiretime :integer default("0") +# invite_code_halt :integer default("0") +# os_allow :integer default("0") +# credit :float(24) +# is_end :boolean default("0") +# end_date :date +# choose_group_allow :boolean default("0") +# homepage_show :boolean default("0") +# course_list_id :integer +# members_count :integer default("0") +# homework_commons_count :integer default("0") +# show_unit :boolean default("0") +# teacher_list :string(255) default("老师") +# student_list :string(255) default("学生") +# is_hidden :boolean default("0") +# course_members_count :integer default("0") +# course_groups_count :integer default("0") +# authentication :boolean default("0") +# professional_certification :boolean default("0") +# graduation_topics_count :integer default("0") +# graduation_tasks_count :integer default("0") +# polls_count :integer default("0") +# exercises_count :integer default("0") +# start_date :date +# subject_id :integer default("0") +# excellent :boolean default("0") +# email_notify :boolean default("0") +# sticky :boolean default("0") +# sticky_time :datetime +# laboratory_id :integer +# mooc_course_id :integer +# +# Indexes +# +# index_courses_on_invite_code (invite_code) UNIQUE +# index_courses_on_laboratory_id (laboratory_id) +# index_courses_on_mooc_course_id (mooc_course_id) +# index_courses_on_school_id_and_is_delete (school_id,is_delete) +# index_courses_on_subject_id (subject_id) +# index_courses_on_tea_id (tea_id) +# + class Trustie::Course < Trustie::Database has_many :course_groups, class_name: "Trustie::CourseGroup" has_many :homework_commons, class_name: "Trustie::HomeworkCommon" -end \ No newline at end of file +end diff --git a/app/models/trustie/course_group.rb b/app/models/trustie/course_group.rb index d9fee73b..539ddaa1 100644 --- a/app/models/trustie/course_group.rb +++ b/app/models/trustie/course_group.rb @@ -1,3 +1,25 @@ +# == Schema Information +# +# Table name: course_groups +# +# id :integer not null, primary key +# name :string(255) +# course_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# members_count :integer +# invite_code :string(255) +# position :integer default("0") +# course_members_count :integer default("0") +# invite_code_halt :boolean default("0") +# invite_code_set :integer default("0") +# +# Indexes +# +# index_course_groups_on_course_id (course_id) +# index_course_groups_on_invite_code (invite_code) UNIQUE +# + class Trustie::CourseGroup < Trustie::Database belongs_to :course, class_name: "Trustie::Course" -end \ No newline at end of file +end diff --git a/app/models/trustie/homework_common.rb b/app/models/trustie/homework_common.rb index 70dd31e6..32af834e 100644 --- a/app/models/trustie/homework_common.rb +++ b/app/models/trustie/homework_common.rb @@ -1,3 +1,54 @@ +# == Schema Information +# +# Table name: homework_commons +# +# id :integer not null, primary key +# name :string(255) +# user_id :integer +# description :text(65535) +# publish_time :datetime +# end_time :datetime +# homework_type :integer default("1") +# late_penalty :string(255) default("0") +# course_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# teacher_priority :integer default("1") +# anonymous_comment :boolean default("0") +# quotes :integer default("0") +# is_open :integer default("0") +# simi_time :datetime +# score_open :boolean default("0") +# anonymous_appeal :boolean default("0") +# homework_bank_id :integer +# is_update :boolean default("0") +# is_public :boolean default("0") +# reference_answer :text(65535) +# answer_public :boolean default("0") +# archive_time :datetime +# allow_late :boolean default("0") +# late_time :datetime +# work_public :boolean default("0") +# explanation :text(65535) +# unified_setting :boolean default("1") +# comment_public :boolean default("1") +# course_homework_category_id :integer +# work_efficiency :boolean default("0") +# eff_score :float(24) default("0") +# max_efficiency :float(24) default("0") +# course_second_category_id :integer default("0") +# calculation_time :datetime +# position :integer default("0") +# total_score :float(24) default("100") +# category_position :integer default("0") +# +# Indexes +# +# index_homework_commons_on_course_id_and_id (course_id,id) +# index_homework_commons_on_course_second_category_id (course_second_category_id) +# index_homework_commons_on_homework_bank_id (homework_bank_id) +# + class Trustie::HomeworkCommon < Trustie::Database belongs_to :course, class_name: "Trustie::Course" -end \ No newline at end of file +end diff --git a/app/models/user.rb b/app/models/user.rb index 5bfe3b6e..97d63280 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,13 +39,14 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") +# gitea_token :string(255) # # Indexes # @@ -53,8 +54,9 @@ # 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) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 3ad8010e..17935969 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -12,7 +12,9 @@ # # Indexes # -# index_user_actions_on_ip (ip) +# 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) # class UserAction < ApplicationRecord diff --git a/app/models/user_agent.rb b/app/models/user_agent.rb index 49d7b35a..ba519d6f 100644 --- a/app/models/user_agent.rb +++ b/app/models/user_agent.rb @@ -10,10 +10,13 @@ # 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) UNIQUE +# index_user_agents_on_ip (ip) +# index_user_agents_on_user_id (user_id) # class UserAgent < ApplicationRecord diff --git a/app/models/user_extension.rb b/app/models/user_extension.rb index 20e2b5c4..4afd89bd 100644 --- a/app/models/user_extension.rb +++ b/app/models/user_extension.rb @@ -22,6 +22,9 @@ # school_id :integer # description :string(255) default("") # department_id :integer +# honor :text(65535) +# edu_background :integer +# edu_entry_year :integer # # Indexes # diff --git a/app/models/version.rb b/app/models/version.rb index bee22cd5..9ba59cb4 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -24,7 +24,7 @@ # class Version < ApplicationRecord - belongs_to :project, counter_cache: true + belongs_to :project, counter_cache: true, optional: true has_many :issues, class_name: "Issue", foreign_key: "fixed_version_id" belongs_to :user, optional: true diff --git a/db/migrate/20191212110933_add_platform_to_users.rb b/db/migrate/20191212110933_add_platform_to_users.rb index 34ca945e..6bb4615a 100644 --- a/db/migrate/20191212110933_add_platform_to_users.rb +++ b/db/migrate/20191212110933_add_platform_to_users.rb @@ -1,5 +1,5 @@ class AddPlatformToUsers < ActiveRecord::Migration[5.2] def change - # add_column :users, :platform, :string, default: 0 + add_column :users, :platform, :string, default: 0 end end diff --git a/db/migrate/20191213091840_add_gitea_token_to_users.rb b/db/migrate/20191213091840_add_gitea_token_to_users.rb index fd5a597e..b76a3cd1 100644 --- a/db/migrate/20191213091840_add_gitea_token_to_users.rb +++ b/db/migrate/20191213091840_add_gitea_token_to_users.rb @@ -1,5 +1,5 @@ class AddGiteaTokenToUsers < ActiveRecord::Migration[5.2] def change - # add_column :users, :gitea_token, :string + add_column :users, :gitea_token, :string end end diff --git a/db/migrate/20191218024615_add_project_category_id_and_project_language_id_to_projects.rb b/db/migrate/20191218024615_add_project_category_id_and_project_language_id_to_projects.rb index 2ac1deaa..4c0e76ad 100644 --- a/db/migrate/20191218024615_add_project_category_id_and_project_language_id_to_projects.rb +++ b/db/migrate/20191218024615_add_project_category_id_and_project_language_id_to_projects.rb @@ -1,6 +1,6 @@ class AddProjectCategoryIdAndProjectLanguageIdToProjects < ActiveRecord::Migration[5.2] def change - # add_column :projects, :project_category_id, :integer - # add_column :projects, :project_language_id, :integer + add_column :projects, :project_category_id, :integer + add_column :projects, :project_language_id, :integer end end diff --git a/db/migrate/20191220092618_add_user_ref_to_repository.rb b/db/migrate/20191220092618_add_user_ref_to_repository.rb index ea2eb4a4..cab95a14 100644 --- a/db/migrate/20191220092618_add_user_ref_to_repository.rb +++ b/db/migrate/20191220092618_add_user_ref_to_repository.rb @@ -1,7 +1,7 @@ class AddUserRefToRepository < ActiveRecord::Migration[5.2] def change - # add_column :repositories, :user_id, :integer - # add_index :repositories, :user_id + add_column :repositories, :user_id, :integer + add_index :repositories, :user_id Project.joins(:repository).find_each do |project| project&.repository&.update_column(:user_id, project&.user_id) unless project&.repository.blank? diff --git a/db/migrate/20191223031855_add_gitea_uid_to_users.rb b/db/migrate/20191223031855_add_gitea_uid_to_users.rb index ff3325a3..1e32e59e 100644 --- a/db/migrate/20191223031855_add_gitea_uid_to_users.rb +++ b/db/migrate/20191223031855_add_gitea_uid_to_users.rb @@ -1,5 +1,5 @@ class AddGiteaUidToUsers < ActiveRecord::Migration[5.2] def change - # add_column :users, :gitea_uid, :integer + add_column :users, :gitea_uid, :integer end end diff --git a/db/migrate/20191223063139_add_mirror_url_to_repositories.rb b/db/migrate/20191223063139_add_mirror_url_to_repositories.rb index 750825e1..2f82c896 100644 --- a/db/migrate/20191223063139_add_mirror_url_to_repositories.rb +++ b/db/migrate/20191223063139_add_mirror_url_to_repositories.rb @@ -1,5 +1,5 @@ class AddMirrorUrlToRepositories < ActiveRecord::Migration[5.2] def change - # add_column :repositories, :mirror_url, :string + add_column :repositories, :mirror_url, :string end end diff --git a/db/migrate/20191224064403_create_issue_tags.rb b/db/migrate/20191224064403_create_issue_tags.rb index ffe3a37b..09564db2 100644 --- a/db/migrate/20191224064403_create_issue_tags.rb +++ b/db/migrate/20191224064403_create_issue_tags.rb @@ -1,14 +1,14 @@ class CreateIssueTags < ActiveRecord::Migration[5.2] def change - # create_table :issue_tags do |t| - # t.string :title - # t.string :description - # t.string :color - # t.integer :user_id - # t.integer :project_id - # t.integer :issues_count,default: 0 - # t.timestamps - # end - # add_index :issue_tags, [:user_id, :title,:project_id] + create_table :issue_tags do |t| + t.string :title + t.string :description + t.string :color + t.integer :user_id + t.integer :project_id + t.integer :issues_count,default: 0 + t.timestamps + end + add_index :issue_tags, [:user_id, :title,:project_id] end end diff --git a/db/migrate/20191225125634_add_praises_count_to_projects.rb b/db/migrate/20191225125634_add_praises_count_to_projects.rb index dbbc4ea4..95d5e510 100644 --- a/db/migrate/20191225125634_add_praises_count_to_projects.rb +++ b/db/migrate/20191225125634_add_praises_count_to_projects.rb @@ -1,5 +1,5 @@ class AddPraisesCountToProjects < ActiveRecord::Migration[5.2] def change - # add_column :projects, :praises_count, :integer, :default => 0 + add_column :projects, :praises_count, :integer, :default => 0 end end diff --git a/db/migrate/20191227084951_add_issues_type_and_token.rb b/db/migrate/20191227084951_add_issues_type_and_token.rb index 078ddb73..4d547f59 100644 --- a/db/migrate/20191227084951_add_issues_type_and_token.rb +++ b/db/migrate/20191227084951_add_issues_type_and_token.rb @@ -1,8 +1,8 @@ class AddIssuesTypeAndToken < ActiveRecord::Migration[5.2] def change - # add_column :issues, :issue_type, :string - # add_column :issues, :token, :string - # add_column :issues, :issue_tag_ids, :string + add_column :issues, :issue_type, :string + add_column :issues, :token, :string + add_column :issues, :issue_tag_ids, :string end end diff --git a/db/migrate/20191227105755_rename_issue_tag_title.rb b/db/migrate/20191227105755_rename_issue_tag_title.rb index b07aee1f..70d53058 100644 --- a/db/migrate/20191227105755_rename_issue_tag_title.rb +++ b/db/migrate/20191227105755_rename_issue_tag_title.rb @@ -1,5 +1,5 @@ class RenameIssueTagTitle < ActiveRecord::Migration[5.2] def change - # rename_column :issue_tags, :title, :name + rename_column :issue_tags, :title, :name end end diff --git a/db/migrate/20191227140150_create_issue_tags_relates.rb b/db/migrate/20191227140150_create_issue_tags_relates.rb index d4b9e8c4..857f1706 100644 --- a/db/migrate/20191227140150_create_issue_tags_relates.rb +++ b/db/migrate/20191227140150_create_issue_tags_relates.rb @@ -1,10 +1,10 @@ class CreateIssueTagsRelates < ActiveRecord::Migration[5.2] def change - # create_table :issue_tags_relates do |t| - # t.integer :issue_id - # t.integer :issue_tag_id - # t.timestamps - # end - # add_index :issue_tags_relates, [:issue_id, :issue_tag_id] + create_table :issue_tags_relates do |t| + t.integer :issue_id + t.integer :issue_tag_id + t.timestamps + end + add_index :issue_tags_relates, [:issue_id, :issue_tag_id] end end diff --git a/db/migrate/20191227162744_rename_issues_issue_tag_ids.rb b/db/migrate/20191227162744_rename_issues_issue_tag_ids.rb index b69dc480..a910b137 100644 --- a/db/migrate/20191227162744_rename_issues_issue_tag_ids.rb +++ b/db/migrate/20191227162744_rename_issues_issue_tag_ids.rb @@ -1,5 +1,5 @@ class RenameIssuesIssueTagIds < ActiveRecord::Migration[5.2] def change - # rename_column :issues, :issue_tag_ids, :issue_tags_value + rename_column :issues, :issue_tag_ids, :issue_tags_value end end diff --git a/db/migrate/20200103062707_create_issue_times.rb b/db/migrate/20200103062707_create_issue_times.rb index 2702e250..b0f2e0b0 100644 --- a/db/migrate/20200103062707_create_issue_times.rb +++ b/db/migrate/20200103062707_create_issue_times.rb @@ -1,13 +1,13 @@ class CreateIssueTimes < ActiveRecord::Migration[5.2] def change - # create_table :issue_times do |t| - # t.integer :issue_id - # t.integer :user_id - # t.datetime :start_time - # t.datetime :end_time - # t.string :cost_time - # t.timestamps - # end - # add_index :issue_times, [:issue_id, :user_id] + create_table :issue_times do |t| + t.integer :issue_id + t.integer :user_id + t.datetime :start_time + t.datetime :end_time + t.string :cost_time + t.timestamps + end + add_index :issue_times, [:issue_id, :user_id] end end diff --git a/db/migrate/20200103113839_add_is_lock_to_issue.rb b/db/migrate/20200103113839_add_is_lock_to_issue.rb index 4166e723..21a2c659 100644 --- a/db/migrate/20200103113839_add_is_lock_to_issue.rb +++ b/db/migrate/20200103113839_add_is_lock_to_issue.rb @@ -1,5 +1,5 @@ class AddIsLockToIssue < ActiveRecord::Migration[5.2] def change - # add_column :issues, :is_lock, :boolean, default: false + add_column :issues, :is_lock, :boolean, default: false end end diff --git a/db/migrate/20200106022235_add_watchers_count_to_projects.rb b/db/migrate/20200106022235_add_watchers_count_to_projects.rb index a5befa16..551e9e5b 100644 --- a/db/migrate/20200106022235_add_watchers_count_to_projects.rb +++ b/db/migrate/20200106022235_add_watchers_count_to_projects.rb @@ -1,5 +1,5 @@ class AddWatchersCountToProjects < ActiveRecord::Migration[5.2] def change - # add_column :projects, :watchers_count, :integer, :default => 0 + add_column :projects, :watchers_count, :integer, :default => 0 end end diff --git a/db/migrate/20200106082806_create_version_releases.rb b/db/migrate/20200106082806_create_version_releases.rb index 1adfca93..b061702c 100644 --- a/db/migrate/20200106082806_create_version_releases.rb +++ b/db/migrate/20200106082806_create_version_releases.rb @@ -1,18 +1,18 @@ class CreateVersionReleases < ActiveRecord::Migration[5.2] def change - # create_table :version_releases do |t| - # t.integer :user_id - # t.string :name - # t.text :body - # t.string :tag_name - # t.string :target_commitish - # t.boolean :draft, default: false - # t.boolean :prerelease, default: false - # t.string :tarball_url - # t.string :zipball_url - # t.string :url - # t.string :version_gid - # t.timestamps - # end + create_table :version_releases do |t| + t.integer :user_id + t.string :name + t.text :body + t.string :tag_name + t.string :target_commitish + t.boolean :draft, default: false + t.boolean :prerelease, default: false + t.string :tarball_url + t.string :zipball_url + t.string :url + t.string :version_gid + t.timestamps + end end end diff --git a/db/migrate/20200106093141_add_project_id_to_version_release.rb b/db/migrate/20200106093141_add_project_id_to_version_release.rb index 97e59b26..df75751b 100644 --- a/db/migrate/20200106093141_add_project_id_to_version_release.rb +++ b/db/migrate/20200106093141_add_project_id_to_version_release.rb @@ -1,6 +1,6 @@ class AddProjectIdToVersionRelease < ActiveRecord::Migration[5.2] def change - # add_column :version_releases, :repository_id, :integer - # add_index :version_releases, [:repository_id] + add_column :version_releases, :repository_id, :integer + add_index :version_releases, [:repository_id] end end diff --git a/db/migrate/20200108015358_add_column_to_issue_tags.rb b/db/migrate/20200108015358_add_column_to_issue_tags.rb index 455a5a2a..3b10b36a 100644 --- a/db/migrate/20200108015358_add_column_to_issue_tags.rb +++ b/db/migrate/20200108015358_add_column_to_issue_tags.rb @@ -1,6 +1,6 @@ class AddColumnToIssueTags < ActiveRecord::Migration[5.2] def change - # add_column :issue_tags, :gid, :integer - # add_column :issue_tags, :gitea_url, :string + add_column :issue_tags, :gid, :integer + add_column :issue_tags, :gitea_url, :string end end diff --git a/db/migrate/20200108025756_add_column_to_pull_requests.rb b/db/migrate/20200108025756_add_column_to_pull_requests.rb index 4255a23d..67002705 100644 --- a/db/migrate/20200108025756_add_column_to_pull_requests.rb +++ b/db/migrate/20200108025756_add_column_to_pull_requests.rb @@ -1,8 +1,8 @@ class AddColumnToPullRequests < ActiveRecord::Migration[5.2] def change - # add_column :pull_requests, :version_id, :integer - # add_column :pull_requests, :body, :text - # add_column :pull_requests, :from_ref, :string - # add_column :pull_requests, :to_ref, :string + add_column :pull_requests, :version_id, :integer + add_column :pull_requests, :body, :text + add_column :pull_requests, :from_ref, :string + add_column :pull_requests, :to_ref, :string end end diff --git a/db/migrate/20200108031646_change_pull_requests_columns.rb b/db/migrate/20200108031646_change_pull_requests_columns.rb index 19a451bf..524576f0 100644 --- a/db/migrate/20200108031646_change_pull_requests_columns.rb +++ b/db/migrate/20200108031646_change_pull_requests_columns.rb @@ -4,10 +4,10 @@ class ChangePullRequestsColumns < ActiveRecord::Migration[5.2] # add_column :pull_request_assigns, :user_login, :string # # add_index :pull_request_assigns, [:user_login] - # - # rename_column :pull_requests, :version_id, :milestone - # rename_column :pull_requests, :from_ref, :head - # rename_column :pull_requests, :to_ref, :base + + rename_column :pull_requests, :version_id, :milestone + rename_column :pull_requests, :from_ref, :head + rename_column :pull_requests, :to_ref, :base end diff --git a/db/migrate/20200108071622_add_columns_to_pull_requests.rb b/db/migrate/20200108071622_add_columns_to_pull_requests.rb index e0a4ed26..8863898d 100644 --- a/db/migrate/20200108071622_add_columns_to_pull_requests.rb +++ b/db/migrate/20200108071622_add_columns_to_pull_requests.rb @@ -1,6 +1,6 @@ class AddColumnsToPullRequests < ActiveRecord::Migration[5.2] def change - # add_column :pull_requests, :issue_id, :integer - # add_column :issues, :issue_classify, :string + add_column :pull_requests, :issue_id, :integer + add_column :issues, :issue_classify, :string end end diff --git a/db/migrate/20200108082955_add_issues_ref_name_and_branch_name.rb b/db/migrate/20200108082955_add_issues_ref_name_and_branch_name.rb index a25a3de2..15d887c8 100644 --- a/db/migrate/20200108082955_add_issues_ref_name_and_branch_name.rb +++ b/db/migrate/20200108082955_add_issues_ref_name_and_branch_name.rb @@ -1,6 +1,6 @@ class AddIssuesRefNameAndBranchName < ActiveRecord::Migration[5.2] def change - # add_column :issues, :ref_name, :string - # add_column :issues, :branch_name, :string + add_column :issues, :ref_name, :string + add_column :issues, :branch_name, :string end end diff --git a/db/migrate/20200210074241_migrate_tiding_status.rb b/db/migrate/20200210074241_migrate_tiding_status.rb index 57e5f994..9646af09 100644 --- a/db/migrate/20200210074241_migrate_tiding_status.rb +++ b/db/migrate/20200210074241_migrate_tiding_status.rb @@ -1,9 +1,9 @@ class MigrateTidingStatus < ActiveRecord::Migration[5.2] def change - Tiding.where(container_type: "JoinCourse", status: 0).each do |tiding| - unless CourseMessage.where(course_message_id: tiding.trigger_user_id, course_id: tiding.container_id, course_message_type: "JoinCourseRequest", status: 0).exists? - tiding.update!(status: 1) - end - end + # Tiding.where(container_type: "JoinCourse", status: 0).each do |tiding| + # unless CourseMessage.where(course_message_id: tiding.trigger_user_id, course_id: tiding.container_id, course_message_type: "JoinCourseRequest", status: 0).exists? + # tiding.update!(status: 1) + # end + # end end end diff --git a/db/migrate/20200213090203_add_issues_count_and_pull_requests_count_to_projects.rb b/db/migrate/20200213090203_add_issues_count_and_pull_requests_count_to_projects.rb index c9e9f95c..a7beb667 100644 --- a/db/migrate/20200213090203_add_issues_count_and_pull_requests_count_to_projects.rb +++ b/db/migrate/20200213090203_add_issues_count_and_pull_requests_count_to_projects.rb @@ -1,6 +1,6 @@ class AddIssuesCountAndPullRequestsCountToProjects < ActiveRecord::Migration[5.2] def change - # add_column :projects, :issues_count, :integer, :default => 0 - # add_column :projects, :pull_requests_count, :integer, :default => 0 + add_column :projects, :issues_count, :integer, :default => 0 + add_column :projects, :pull_requests_count, :integer, :default => 0 end end diff --git a/db/migrate/20200213094050_migrate_user_location.rb b/db/migrate/20200213094050_migrate_user_location.rb index a15d299a..75503ffb 100644 --- a/db/migrate/20200213094050_migrate_user_location.rb +++ b/db/migrate/20200213094050_migrate_user_location.rb @@ -1,11 +1,11 @@ class MigrateUserLocation < ActiveRecord::Migration[5.2] def change - UserExtension.where("location like '%省'").each do |ue| - ue.update_column("location", ue.location.chop) - end - - UserExtension.where("location_city like '%市'").each do |ue| - ue.update_column("location_city", ue.location_city.chop) - end + # UserExtension.where("location like '%省'").each do |ue| + # ue.update_column("location", ue.location.chop) + # end + # + # UserExtension.where("location_city like '%市'").each do |ue| + # ue.update_column("location_city", ue.location_city.chop) + # end end end diff --git a/db/migrate/20200220063545_add_issues_count_to_versions.rb b/db/migrate/20200220063545_add_issues_count_to_versions.rb index c8e5e538..aaf6505d 100644 --- a/db/migrate/20200220063545_add_issues_count_to_versions.rb +++ b/db/migrate/20200220063545_add_issues_count_to_versions.rb @@ -1,7 +1,7 @@ class AddIssuesCountToVersions < ActiveRecord::Migration[5.2] def change - # add_column :versions, :issues_count, :integer, :default => 0 - # add_column :versions, :closed_issues_count, :integer, :default => 0 - # add_column :versions, :percent, :float, default: 0.0 + add_column :versions, :issues_count, :integer, :default => 0 + add_column :versions, :closed_issues_count, :integer, :default => 0 + add_column :versions, :percent, :float, default: 0.0 end end diff --git a/db/migrate/20200429085544_change_quill_to_md.rb b/db/migrate/20200429085544_change_quill_to_md.rb index aa5edfa6..9a7e4c5d 100644 --- a/db/migrate/20200429085544_change_quill_to_md.rb +++ b/db/migrate/20200429085544_change_quill_to_md.rb @@ -1,69 +1,69 @@ class ChangeQuillToMd < ActiveRecord::Migration[5.2] #迁移quill编辑器的内容为md def change - migrate_time = Time.current - 20.days + migrate_time = Time.current - 20.days all_issues = Issue.where("updated_on > ?", migrate_time) pros = PullRequest.where("updated_at > ?", migrate_time) journals = Journal.where("created_on > ?", migrate_time) - Issue.transaction do - if all_issues.size > 0 - all_issues.each do |i| - description = i.description - if description.present? && description.include?("insert") - new_content = change_content(description) - i.update_attribute(:description, new_content) - end - puts "__update_issue_content_____id:#{i.id}__" - end - end - end + # Issue.transaction do + # if all_issues.size > 0 + # all_issues.each do |i| + # description = i.description + # if description.present? && description.include?("insert") + # new_content = change_content(description) + # i.update_attribute(:description, new_content) + # end + # puts "__update_issue_content_____id:#{i.id}__" + # end + # end + # end - Journal.transaction do - if journals.size > 0 - journals.each do |j| - description = j.notes - if description.present? && description.include?("insert") - new_content = change_content(description) - j.update_attribute(:notes, new_content) - end - puts "__update_journal_content_____id:#{j.id}__" - end - end - - end + # Journal.transaction do + # if journals.size > 0 + # journals.each do |j| + # description = j.notes + # if description.present? && description.include?("insert") + # new_content = change_content(description) + # j.update_attribute(:notes, new_content) + # end + # puts "__update_journal_content_____id:#{j.id}__" + # end + # end + # + # end - PullRequest.transaction do - if pros.size > 0 - pros.each do |p| - description = p.body - if description.present? && description.include?("insert") - new_content = change_content(description) - p.update_attribute(:body, new_content) - end - puts "__update_pull_request_content_____id:#{p.id}__" - end - end - end + # PullRequest.transaction do + # if pros.size > 0 + # pros.each do |p| + # description = p.body + # if description.present? && description.include?("insert") + # new_content = change_content(description) + # p.update_attribute(:body, new_content) + # end + # puts "__update_pull_request_content_____id:#{p.id}__" + # end + # end + # end end - def change_content(content) - puts "####________content_____######{content}" - new_content = "" - return "" if content.blank? - desc = JSON.parse(content)["ops"] - if desc.length > 0 - desc.each do |d| - image = d["insert"]["image"] - if image.present? - new_content += "![#{image['alt']}](#{image['url']})" - else - new_content += d["insert"].gsub("\n", "") - end - end - end - new_content - end + # def change_content(content) + # puts "####________content_____######{content}" + # new_content = "" + # return "" if content.blank? + # desc = JSON.parse(content)["ops"] + # if desc.length > 0 + # desc.each do |d| + # image = d["insert"]["image"] + # if image.present? + # new_content += "![#{image['alt']}](#{image['url']})" + # else + # new_content += d["insert"].gsub("\n", "") + # end + # end + # end + # new_content + # end end diff --git a/db/migrate/20210315074550_add_columns_to_projects.rb b/db/migrate/20210315074550_add_columns_to_projects.rb new file mode 100644 index 00000000..23b192ce --- /dev/null +++ b/db/migrate/20210315074550_add_columns_to_projects.rb @@ -0,0 +1,6 @@ +class AddColumnsToProjects < ActiveRecord::Migration[5.2] + def change + add_column :projects, :license_id, :integer + add_column :projects, :ignore_id, :integer + end +end diff --git a/lib/tasks/sync_mulan_repo.rake b/lib/tasks/sync_mulan_repo.rake new file mode 100644 index 00000000..baa1366b --- /dev/null +++ b/lib/tasks/sync_mulan_repo.rake @@ -0,0 +1,7 @@ +desc "create mulan mirror repository" +namespace :create_mulan_repo do + task init: :environment do + doc = SimpleXlsxReader.open("#{Rails.root}/public/mulan_repo.xlsx") + data = doc.sheets.first.rows + end +end \ No newline at end of file diff --git a/public/mulan_repo.xlsx b/public/mulan_repo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1c9e45851dabc2525521874ceffa6a5e0f11489e GIT binary patch literal 20757 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 literal 0 HcmV?d00001