diff --git a/app/assets/stylesheets/admins/common.scss b/app/assets/stylesheets/admins/common.scss
index 510e7f8f1..8d48a67ed 100644
--- a/app/assets/stylesheets/admins/common.scss
+++ b/app/assets/stylesheets/admins/common.scss
@@ -135,5 +135,6 @@
padding: 10px 20px 0;
background: #fff;
}
+ .mt-10{margin-top: 10px;}
}
diff --git a/app/controllers/admins/project_categories_controller.rb b/app/controllers/admins/project_categories_controller.rb
new file mode 100644
index 000000000..944a2cf04
--- /dev/null
+++ b/app/controllers/admins/project_categories_controller.rb
@@ -0,0 +1,83 @@
+class Admins::ProjectCategoriesController < Admins::BaseController
+ before_action :get_category, only: [:edit,:update, :destroy]
+ before_action :validate_names, only: [:create, :update]
+
+ def index
+ sort_by = params[:sort_by] ||= 'created_at'
+ sort_direction = params[:sort_direction] ||= 'desc'
+ q = ProjectCategory.ransack(name_cont: params[:name])
+ project_categories = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
+ @project_categories = paginate(project_categories)
+
+ end
+
+ def new
+ @project_category = ProjectCategory.new
+ end
+
+ def edit
+ end
+
+ def create
+ max_position_items = ProjectCategory.select(:id, :position).pluck(:position).reject!(&:blank?)
+ max_position = max_position_items.present? ? max_position_items.max.to_i : 0
+
+ @project_category = ProjectCategory.new(name: @name,position: max_position)
+ if @project_category.save
+ redirect_to admins_project_categories_path
+ flash[:success] = '创建成功'
+ else
+ redirect_to admins_project_categories_path
+ flash[:danger] = '创建失败'
+ end
+ end
+
+ def update
+ if @project_category.update_attribute(:name, @name)
+ redirect_to admins_project_categories_path
+ flash[:success] = '更新成功'
+ else
+ redirect_to admins_project_categories_path
+ flash[:success] = '更新失败'
+ end
+ end
+
+ def destroy
+ if @project_language.destroy
+ redirect_to admins_project_categories_path
+ flash[:success] = "删除成功"
+ else
+ redirect_to admins_project_categories_path
+ flash[:danger] = "删除失败"
+ end
+ end
+
+ private
+
+ def get_category
+ @project_category = ProjectCategory.find_by(id: params[:id])
+ unless @project_category.present?
+ redirect_to admins_project_categories_path
+ flash[:danger] = "分类不存在"
+ end
+ end
+
+ def check_language_present?(name)
+ return true if name.blank?
+ name_downcase = name.downcase
+ name_upcase = name.upcase
+ name_first_big = name.capitalize
+ ProjectCategory.exists?(name: name_downcase) || ProjectCategory.exists?(name: name_upcase) || ProjectCategory.exists?(name: name_first_big)
+ end
+
+ def validate_names
+ @name = params[:project_category][:name].to_s.first(64)
+ if @name.blank?
+ redirect_to admins_project_categories_path
+ flash[:danger] = '名称不能为空'
+ elsif check_language_present?(@name) && @project_category.blank?
+ redirect_to admins_project_categories_path
+ flash[:danger] = '分类已存在'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/admins/project_ignores_controller.rb b/app/controllers/admins/project_ignores_controller.rb
new file mode 100644
index 000000000..427ee86b8
--- /dev/null
+++ b/app/controllers/admins/project_ignores_controller.rb
@@ -0,0 +1,120 @@
+class Admins::ProjectIgnoresController < Admins::BaseController
+ before_action :set_ignore, only: [:edit,:update, :destroy,:show]
+ before_action :validate_params, only: [:create, :update]
+
+ def index
+ sort_by = params[:sort_by] ||= 'created_at'
+ sort_direction = params[:sort_direction] ||= 'desc'
+ q = Ignore.ransack(name_cont: params[:search])
+ project_ignores = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
+ @project_ignores = paginate(project_ignores)
+ end
+
+ def new
+ @project_ignore = Ignore.new
+ end
+
+ def show
+ end
+
+ def create
+ # conditions = params[:license][:conditions_array].reject(&:blank?).join(",") if params[:license][:conditions_array].present?
+ # permissions = params[:license][:permissions_array].reject(&:blank?).join(",") if params[:license][:permissions_array].present?
+ # limitations = params[:license][:limitations_array].reject(&:blank?).join(",") if params[:license][:limitations_array].present?
+ # max_position_items = License.select(:id, :position).pluck(:position).reject!(&:blank?)
+ # max_position = max_position_items.present? ? max_position_items.max.to_i : 0
+ # other_params = {
+ # conditions: conditions.to_s,
+ # permissions: permissions.to_s,
+ # limitations: limitations.to_s,
+ # position: max_position
+ # }
+ @project_ignore = Ignore.new(ignore_params)
+
+ if @project_ignore.save!
+ redirect_to admins_project_ignores_path
+ flash[:success] = "创建成功"
+ else
+ render :new
+ flash[:danger] = "创建失败"
+ end
+ end
+
+ def edit
+
+ end
+
+ def update
+ # conditions = params[:license][:conditions_array].reject(&:blank?).join(",") if params[:license][:conditions_array].present?
+ # permissions = params[:license][:permissions_array].reject(&:blank?).join(",") if params[:license][:permissions_array].present?
+ # limitations = params[:license][:limitations_array].reject(&:blank?).join(",") if params[:license][:limitations_array].present?
+
+ # other_params = {
+ # conditions: conditions.to_s,
+ # permissions: permissions.to_s,
+ # limitations: limitations.to_s
+ # }
+ if @project_ignore.update_attributes(ignore_params)
+ redirect_to admins_project_ignores_path
+ flash[:success] = "更新成功"
+ else
+ render :edit
+ flash[:danger] = "更新失败"
+ end
+ end
+
+ def destroy
+ if @project_ignore.present?
+ if @project_ignore.destroy
+ redirect_to admins_project_ignores_path
+ flash[:success] = "删除成功"
+ else
+ redirect_to admins_project_ignores_path
+ flash[:success] = "删除失败"
+ end
+ else
+ redirect_to admins_project_ignores_path
+ flash[:success] = "删除失败:许可证已被项目引用"
+ end
+ end
+
+ # def move
+ # cate_opt = params[:opr]
+ # cate_position = @project_license.position.to_i
+ # move_status = up_and_down(cate_opt,@project_license,cate_position,"license")
+ # if move_status == 0
+ # @c_msg = "移动成功"
+ # else
+ # @c_msg = "移动失败"
+ # end
+ # end
+
+ private
+ def set_ignore
+ @project_ignore = Ignore.find_by_id(params[:id])
+ end
+
+ def ignore_params
+ params.require(:ignore).permit(:name,:content)
+ end
+
+ def validate_params
+ name = params[:ignore][:name]
+ if name.blank?
+ flash[:danger] = "名称不允许为空"
+ redirect_to admins_project_ignores_path
+ elsif check_ignore_present?(name) && @project_ignore.blank?
+ flash[:danger] = "创建失败:名称已存在"
+ redirect_to admins_project_ignores_path
+ end
+ end
+
+ def check_ignore_present?(name)
+ return true if name.blank?
+ name_downcase = name.downcase
+ name_upcase = name.upcase
+ name_first_big = name.capitalize
+ Ignore.exists?(name: name_downcase) || Ignore.exists?(name: name_upcase) || Ignore.exists?(name: name_first_big)
+ end
+
+end
diff --git a/app/controllers/admins/project_languages_controller.rb b/app/controllers/admins/project_languages_controller.rb
new file mode 100644
index 000000000..e188b75ef
--- /dev/null
+++ b/app/controllers/admins/project_languages_controller.rb
@@ -0,0 +1,82 @@
+class Admins::ProjectLanguagesController < Admins::BaseController
+ before_action :get_language, only: [:edit,:update, :destroy]
+ before_action :validate_names, only: [:create, :update]
+
+ def index
+ sort_by = params[:sort_by] ||= 'created_at'
+ sort_direction = params[:sort_direction] ||= 'desc'
+ q = ProjectLanguage.ransack(name_cont: params[:search])
+ project_languages = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
+ @project_languages = paginate(project_languages)
+
+ end
+
+ def new
+ @project_language = ProjectLanguage.new
+ end
+
+ def edit
+ end
+
+ def create
+ max_position_items = ProjectLanguage.select(:id, :position).pluck(:position).reject!(&:blank?)
+ max_position = max_position_items.present? ? max_position_items.max.to_i : 0
+ @project_language = ProjectLanguage.new(name: @name,position:max_position)
+ if @project_language.save
+ redirect_to admins_project_languages_path
+ flash[:success] = '创建成功'
+ else
+ redirect_to admins_project_languages_path
+ flash[:danger] = '创建失败'
+ end
+ end
+
+ def update
+ if @project_language.update_attribute(:name, @name)
+ redirect_to admins_project_languages_path
+ flash[:success] = '更新成功'
+ else
+ redirect_to admins_project_languages_path
+ flash[:success] = '更新失败'
+ end
+ end
+
+ def destroy
+ if @project_language.destroy
+ redirect_to admins_project_languages_path
+ flash[:success] = "项目语言删除成功"
+ else
+ redirect_to admins_project_languages_path
+ flash[:danger] = "项目语言删除失败"
+ end
+ end
+
+ private
+
+ def get_language
+ @project_language = ProjectLanguage.find_by(id: params[:id])
+ unless @project_language.present?
+ redirect_to admins_project_languages_path
+ flash[:danger] = "项目语言不存在"
+ end
+ end
+
+ def check_language_present?(name)
+ return true if name.blank?
+ name_downcase = name.downcase
+ name_upcase = name.upcase
+ name_first_big = name.capitalize
+ ProjectLanguage.exists?(name: name_downcase) || ProjectLanguage.exists?(name: name_upcase) || ProjectLanguage.exists?(name: name_first_big)
+ end
+
+ def validate_names
+ @name = params[:project_language][:name].to_s.first(64)
+ if @name.blank?
+ redirect_to admins_project_languages_path
+ flash[:danger] = '名称不能为空'
+ elsif check_language_present?(@name) && @project_language.blank?
+ redirect_to admins_project_languages_path
+ flash[:danger] = '项目语言已存在'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/admins/project_licenses_controller.rb b/app/controllers/admins/project_licenses_controller.rb
new file mode 100644
index 000000000..bc5789026
--- /dev/null
+++ b/app/controllers/admins/project_licenses_controller.rb
@@ -0,0 +1,120 @@
+class Admins::ProjectLicensesController < Admins::BaseController
+ before_action :set_license, only: [:edit,:update, :destroy,:show]
+ before_action :validate_params, only: [:create, :update]
+
+ def index
+ sort_by = params[:sort_by] ||= 'created_at'
+ sort_direction = params[:sort_direction] ||= 'desc'
+ q = License.ransack(name_cont: params[:search])
+ project_licenses = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
+ @project_licenses = paginate(project_licenses)
+ end
+
+ def new
+ @project_license = License.new
+ end
+
+ def show
+ end
+
+ def create
+ # conditions = params[:license][:conditions_array].reject(&:blank?).join(",") if params[:license][:conditions_array].present?
+ # permissions = params[:license][:permissions_array].reject(&:blank?).join(",") if params[:license][:permissions_array].present?
+ # limitations = params[:license][:limitations_array].reject(&:blank?).join(",") if params[:license][:limitations_array].present?
+ # max_position_items = License.select(:id, :position).pluck(:position).reject!(&:blank?)
+ # max_position = max_position_items.present? ? max_position_items.max.to_i : 0
+ # other_params = {
+ # conditions: conditions.to_s,
+ # permissions: permissions.to_s,
+ # limitations: limitations.to_s,
+ # position: max_position
+ # }
+ @project_license = License.new(license_params)
+
+ if @project_license.save!
+ redirect_to admins_project_licenses_path
+ flash[:success] = "创建成功"
+ else
+ render :new
+ flash[:danger] = "创建失败"
+ end
+ end
+
+ def edit
+
+ end
+
+ def update
+ # conditions = params[:license][:conditions_array].reject(&:blank?).join(",") if params[:license][:conditions_array].present?
+ # permissions = params[:license][:permissions_array].reject(&:blank?).join(",") if params[:license][:permissions_array].present?
+ # limitations = params[:license][:limitations_array].reject(&:blank?).join(",") if params[:license][:limitations_array].present?
+
+ # other_params = {
+ # conditions: conditions.to_s,
+ # permissions: permissions.to_s,
+ # limitations: limitations.to_s
+ # }
+ if @project_license.update_attributes(license_params)
+ redirect_to admins_project_licenses_path
+ flash[:success] = "更新成功"
+ else
+ render :edit
+ flash[:danger] = "更新失败"
+ end
+ end
+
+ def destroy
+ if @project_license.present?
+ if @project_license.destroy
+ redirect_to admins_project_licenses_path
+ flash[:success] = "删除成功"
+ else
+ redirect_to admins_project_licenses_path
+ flash[:success] = "删除失败"
+ end
+ else
+ redirect_to admins_project_licenses_path
+ flash[:success] = "删除失败:许可证已被项目引用"
+ end
+ end
+
+ # def move
+ # cate_opt = params[:opr]
+ # cate_position = @project_license.position.to_i
+ # move_status = up_and_down(cate_opt,@project_license,cate_position,"license")
+ # if move_status == 0
+ # @c_msg = "移动成功"
+ # else
+ # @c_msg = "移动失败"
+ # end
+ # end
+
+ private
+ def set_license
+ @project_license = License.find_by_id(params[:id])
+ end
+
+ def license_params
+ params.require(:license).permit(:name,:content)
+ end
+
+ def validate_params
+ name = params[:license][:name]
+ if name.blank?
+ flash[:danger] = "名称不允许为空"
+ redirect_to admins_project_licenses_path
+ elsif check_license_present?(name) && @project_license.blank?
+ flash[:danger] = "创建失败:名称已存在"
+ redirect_to admins_project_licenses_path
+ end
+ end
+
+ def check_license_present?(name)
+ return true if name.blank?
+ name_downcase = name.downcase
+ name_upcase = name.upcase
+ name_first_big = name.capitalize
+ License.exists?(name: name_downcase) || License.exists?(name: name_upcase) || License.exists?(name: name_first_big)
+ end
+
+end
diff --git a/app/controllers/admins/projects_controller.rb b/app/controllers/admins/projects_controller.rb
index 53d94fd9b..2ef79a8e9 100644
--- a/app/controllers/admins/projects_controller.rb
+++ b/app/controllers/admins/projects_controller.rb
@@ -1,10 +1,11 @@
class Admins::ProjectsController < Admins::BaseController
def index
- default_sort('created_at', 'desc')
+ sort_by = params[:sort_by] ||= 'created_on'
+ sort_direction = params[:sort_direction] ||= 'desc'
search = params[:search].to_s.strip
- projects = Project.where("name like ?", "%#{search}%")
+ projects = Project.where("name like ?", "%#{search}%").order("#{sort_by} #{sort_direction}")
@projects = paginate projects.includes(:owner, :members, :issues, :versions, :attachments, :project_score)
end
@@ -21,5 +22,4 @@ class Admins::ProjectsController < Admins::BaseController
render_delete_success
end
end
-
end
\ No newline at end of file
diff --git a/app/controllers/admins/users_controller.rb b/app/controllers/admins/users_controller.rb
index dee37b0ba..98f0a6bfb 100644
--- a/app/controllers/admins/users_controller.rb
+++ b/app/controllers/admins/users_controller.rb
@@ -4,7 +4,7 @@ class Admins::UsersController < Admins::BaseController
params[:sort_direction] = params[:sort_direction].presence || 'desc'
users = Admins::UserQuery.call(params)
- @users = paginate users.includes(:user_extension)
+ @users = paginate users.includes(:user_extension, projects: :members)
end
def edit
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 7a049ee35..aeadbd930 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -2,8 +2,9 @@ class ProjectsController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
before_action :require_login, except: %i[index branches group_type_list]
- before_action :find_project_with_id, only: %i[show branches update destroy]
+ before_action :find_project_with_id, only: %i[show branches update destroy fork_users praise_users watch_users]
before_action :authorizate_user_can_edit_project!, only: %i[update]
+ before_action :project_public?, only: %i[fork_users praise_users watch_user]
def index
scope = Projects::ListQuery.call(params)
@@ -81,6 +82,24 @@ class ProjectsController < ApplicationController
tip_exception(e.message)
end
+ def watch_users
+ watchers = @project.watchers.includes(:user).order("watchers.created_at asc").distinct
+ @watchers_count = watchers.size
+ @watchers = paginate(watchers)
+ end
+
+ def praise_users
+ praises = @project.praise_treads.includes(:user).order("praise_treads.created_at asc").distinct
+ @praises_count = praises.size
+ @praises = paginate(praises)
+ end
+
+ def fork_users
+ fork_users = @project.fork_users.includes(:user, :project).order("fork_users.created_at asc").distinct
+ @forks_count = fork_users.size
+ @fork_users = paginate(fork_users)
+ end
+
private
def project_params
params.permit(:user_id, :name, :description, :repository_name,
@@ -91,4 +110,10 @@ class ProjectsController < ApplicationController
params.permit(:user_id, :name, :description, :repository_name, :is_mirror, :auth_username,
:auth_password, :project_category_id, :project_language_id, :clone_addr, :private)
end
+
+ def project_public?
+ unless @project.is_public || current_user&admin?
+ tip_exception(403, "..")
+ end
+ end
end
diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb
index 626e5dad1..38f60ebae 100644
--- a/app/controllers/watchers_controller.rb
+++ b/app/controllers/watchers_controller.rb
@@ -1,17 +1,18 @@
class WatchersController < ApplicationController
before_action :require_login, except: %i[index]
- before_action :find_project_with_id
+ # before_action :find_project_with_id
+ before_action :get_target
def index
- scope = @project.watchers.includes(:user)
+ scope = @target.watchers.includes(:user)
@watchers = paginate(scope)
end
def unfollow
begin
- return normal_status(2, "你还没有关注哦") unless current_user.watched?(@project)
- current_user.unwatch!(@project)
- render_ok({watchers_count: @project.watchers_count, watched: current_user.watched?(@project)})
+ return normal_status(2, "你还没有关注哦") unless current_user.watched?(@target)
+ current_user.unwatch!(@target)
+ render_ok({watchers_count: @target.watchers_count, watched: false})
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
@@ -21,9 +22,9 @@ class WatchersController < ApplicationController
def follow
begin
- return normal_status(2, "你已关注了") if current_user.watched?(@project)
- current_user.watch!(@project)
- render_ok({watchers_count: @project.watchers_count, watched: current_user.watched?(@project)})
+ return normal_status(2, "你已关注了") if current_user.watched?(@target)
+ current_user.watch!(@target)
+ render_ok({watchers_count: @target.watchers_count, watched: true})
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
@@ -32,11 +33,28 @@ class WatchersController < ApplicationController
end
def check_watch
- is_watch = current_user.watched?(@project)
+ is_watch = current_user.watched?(@target)
render_result(is_watch ? 1 : 0)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
+ private
+
+ def get_target
+ target_type = params[:target_type].to_s
+ case target_type
+ when "project"
+ @target = target_type.capitalize.constantize.find_by(id: params[:id])
+ else
+ @target = target_type.capitalize.constantize.find_by(login: params[:id]) #用户
+ end
+
+ unless @target.present?
+ normal_status(-1, "目标不存在")
+ end
+
+ end
+
end
diff --git a/app/models/concerns/watchable.rb b/app/models/concerns/watchable.rb
index ad707a0cf..4c52cf99a 100644
--- a/app/models/concerns/watchable.rb
+++ b/app/models/concerns/watchable.rb
@@ -13,7 +13,7 @@ module Watchable
end
def watch!(watchable)
- watchable.watchers.create!(user: self)
+ watchable.watchers.create!(user: self, created_at: Time.current)
end
def unwatch!(watchable)
diff --git a/app/models/fork_user.rb b/app/models/fork_user.rb
new file mode 100644
index 000000000..10ae32328
--- /dev/null
+++ b/app/models/fork_user.rb
@@ -0,0 +1,4 @@
+class ForkUser < ApplicationRecord
+ belongs_to :project
+ belongs_to :user
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index 737320aa6..a5ae46256 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -16,6 +16,8 @@ class Project < ApplicationRecord
belongs_to :project_category, optional: true , :counter_cache => true
belongs_to :project_language, optional: true , :counter_cache => true
has_many :project_trends, dependent: :destroy
+ has_many :watchers, as: :watchable, dependent: :destroy
+ has_many :fork_users, dependent: :destroy
# has_many :commits, dependent: :destroy
diff --git a/app/models/user.rb b/app/models/user.rb
index a093665f3..859c02986 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -51,6 +51,7 @@ class User < ApplicationRecord
has_one :wechat_open_user, class_name: 'OpenUsers::Wechat'
has_one :qq_open_user, class_name: 'OpenUsers::QQ'
accepts_nested_attributes_for :user_extension, update_only: true
+ has_many :fork_users, dependent: :destroy
has_many :versions
has_many :issue_times, :dependent => :destroy
@@ -607,7 +608,7 @@ class User < ApplicationRecord
end
def projects_count
- Project.joins(:members).where(members: { user_id: self.id }).select(:id).size
+ Project.includes(:members).joins(:members).where(members: { user_id: self.id }).select(:id).size
end
# 是否已经签到
diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb
index 3c24455ff..f2cdca409 100644
--- a/app/services/projects/fork_service.rb
+++ b/app/services/projects/fork_service.rb
@@ -27,6 +27,8 @@ class Projects::ForkService < ApplicationService
@project.update_column('forked_count', @project&.forked_count.to_i + 1)
new_repository.update_column('url', result['clone_url']) if result
+
+ ForkUser.create(project_id: @project.id, fork_project_id: clone_project.id, user_id: clone_project.user_id)
clone_project
end
diff --git a/app/views/admins/project_categories/_form_modal.html.erb b/app/views/admins/project_categories/_form_modal.html.erb
new file mode 100644
index 000000000..fd20936b6
--- /dev/null
+++ b/app/views/admins/project_categories/_form_modal.html.erb
@@ -0,0 +1,21 @@
+
+
+
+
+ <%= form_for @project_category, url: {controller: "project_categories", action: "#{type}"} do |p| %>
+
+ <%= p.text_field :name,class: "form-control input-lg",placeholder: "分类名称",required: true, maxlength: 64%>
+
+
+ <% end %>
+
+
+
\ No newline at end of file
diff --git a/app/views/admins/project_categories/_list.html.erb b/app/views/admins/project_categories/_list.html.erb
new file mode 100644
index 000000000..1d3316817
--- /dev/null
+++ b/app/views/admins/project_categories/_list.html.erb
@@ -0,0 +1,33 @@
+
+
+
+ 序号
+ 名称
+ <%= sort_tag('项目数', name: 'projects_count', path: admins_project_categories_path) %>
+ <%= sort_tag('创建时间', name: 'created_at', path: admins_project_categories_path) %>
+ 操作
+
+
+
+ <% if project_categories.present? %>
+ <% project_categories.each_with_index do |project_category, index| %>
+
+ <%= list_index_no((params[:page] || 1).to_i, index) %>
+
+ <%= link_to(project_category.name, "/projects?category_id=#{project_category.id}", target: '_blank') %>
+
+ <%= project_category.projects_count %>
+ <%= project_category.created_at&.strftime('%Y-%m-%d %H:%M') %>
+
+ <%= link_to "编辑", edit_admins_project_category_path(project_category), remote: true, class: "action" %>
+ <%= link_to "删除", admins_project_category_path(project_category), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %>
+
+
+ <% end %>
+ <% else %>
+ <%= render 'admins/shared/no_data_for_table' %>
+ <% end %>
+
+
+
+<%= render partial: 'admins/shared/paginate', locals: { objects: project_categories } %>
\ No newline at end of file
diff --git a/app/views/admins/project_categories/edit.js.erb b/app/views/admins/project_categories/edit.js.erb
new file mode 100644
index 000000000..a8636cfce
--- /dev/null
+++ b/app/views/admins/project_categories/edit.js.erb
@@ -0,0 +1,2 @@
+$("#project-category-modals").html("<%= j render(partial: 'admins/project_categories/form_modal', locals: {type: 'update'}) %>")
+$(".project-category-change-modal").modal('show');
\ No newline at end of file
diff --git a/app/views/admins/project_categories/index.html.erb b/app/views/admins/project_categories/index.html.erb
new file mode 100644
index 000000000..b635cef43
--- /dev/null
+++ b/app/views/admins/project_categories/index.html.erb
@@ -0,0 +1,18 @@
+<% define_admin_breadcrumbs do %>
+ <% add_admin_breadcrumb('分类列表') %>
+<% end %>
+
+
+ <%= form_tag(admins_project_categories_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
+ <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '名称检索') %>
+ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
+
+ <% end %>
+ <%= link_to "新增", new_admins_project_category_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %>
+
+
+
+ <%= render partial: 'admins/project_categories/list', locals: { project_categories: @project_categories } %>
+
+
+
diff --git a/app/views/admins/project_categories/index.js.erb b/app/views/admins/project_categories/index.js.erb
new file mode 100644
index 000000000..0a5ef2d13
--- /dev/null
+++ b/app/views/admins/project_categories/index.js.erb
@@ -0,0 +1 @@
+$('.project-category-list-container').html("<%= j( render partial: 'admins/project_categories/list', locals: { project_categories: @project_categories } ) %>");
\ No newline at end of file
diff --git a/app/views/admins/project_categories/new.js.erb b/app/views/admins/project_categories/new.js.erb
new file mode 100644
index 000000000..8266fd40c
--- /dev/null
+++ b/app/views/admins/project_categories/new.js.erb
@@ -0,0 +1,2 @@
+$("#project-category-modals").html("<%= j render(partial: 'admins/project_categories/form_modal', locals: {type: 'create'}) %>")
+$(".project-category-change-modal").modal('show');
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/_content.html.erb b/app/views/admins/project_ignores/_content.html.erb
new file mode 100644
index 000000000..048feadb8
--- /dev/null
+++ b/app/views/admins/project_ignores/_content.html.erb
@@ -0,0 +1,9 @@
+
+
+
+<%= @project_ignore.content.html_safe %>
+
+
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/_form.html.erb b/app/views/admins/project_ignores/_form.html.erb
new file mode 100644
index 000000000..9a6ded0ba
--- /dev/null
+++ b/app/views/admins/project_ignores/_form.html.erb
@@ -0,0 +1,38 @@
+
+
+
+ <%= form_for @project_ignore, url: {controller: "project_ignores", action: "#{type}"} do |f| %>
+
+
+
+ <%= f.submit "确认", class: "btn btn-primary submit-btn" %>
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/_list.html.erb b/app/views/admins/project_ignores/_list.html.erb
new file mode 100644
index 000000000..066ef8540
--- /dev/null
+++ b/app/views/admins/project_ignores/_list.html.erb
@@ -0,0 +1,45 @@
+
+
+
+ 序号
+ 名称
+ 简介
+ <%
+=begin%>
+ <%= sort_tag('项目数', name: 'projects_count', path: admins_project_licenses_path) %>
+<%
+=end%>
+ <%= sort_tag('创建时间', name: 'created_at', path: admins_project_licenses_path) %>
+ 操作
+
+
+
+ <% if project_ignores.present? %>
+ <% project_ignores.each_with_index do |project_ignore, index| %>
+
+ <%= list_index_no((params[:page] || 1).to_i, index) %>
+
+ <%= link_to project_ignore.name, admins_project_ignore_path(project_ignore.id), remote: true %>
+
+
+ <%= project_ignore.content.to_s.truncate(200) %>
+
+ <%
+=begin%>
+ <%= project_license.projects_count %>
+<%
+=end%>
+ <%= project_ignore.created_at&.strftime('%Y-%m-%d %H:%M') %>
+
+ <%= link_to "编辑", edit_admins_project_ignore_path(project_ignore),remote: true, class: "action" %>
+ <%= link_to "删除", admins_project_ignore_path(project_ignore), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %>
+
+
+ <% end %>
+ <% else %>
+ <%= render 'admins/shared/no_data_for_table' %>
+ <% end %>
+
+
+
+<%= render partial: 'admins/shared/paginate', locals: { objects: project_ignores } %>
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/edit.js.erb b/app/views/admins/project_ignores/edit.js.erb
new file mode 100644
index 000000000..36fe6852a
--- /dev/null
+++ b/app/views/admins/project_ignores/edit.js.erb
@@ -0,0 +1 @@
+$("#admins-project-ignore-content").html("<%= j render partial: 'admins/project_ignores/form', locals:{type: 'update'} %>")
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/index.html.erb b/app/views/admins/project_ignores/index.html.erb
new file mode 100644
index 000000000..a9fc9982e
--- /dev/null
+++ b/app/views/admins/project_ignores/index.html.erb
@@ -0,0 +1,18 @@
+<% define_admin_breadcrumbs do %>
+ <% add_admin_breadcrumb('git忽略文件') %>
+<% end %>
+
+
+ <%= form_tag(admins_project_ignores_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
+ <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '名称检索') %>
+ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
+
+ <% end %>
+ <%= link_to "新增", new_admins_project_ignore_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %>
+
+
+
+ <%= render partial: 'admins/project_ignores/list', locals: { project_ignores: @project_ignores } %>
+
+
+
diff --git a/app/views/admins/project_ignores/index.js.erb b/app/views/admins/project_ignores/index.js.erb
new file mode 100644
index 000000000..9d86113c1
--- /dev/null
+++ b/app/views/admins/project_ignores/index.js.erb
@@ -0,0 +1 @@
+$('.project-ignore-list-container').html("<%= j( render partial: 'admins/project_ignores/list', locals: { project_ignores: @project_ignores } ) %>");
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/new.js.erb b/app/views/admins/project_ignores/new.js.erb
new file mode 100644
index 000000000..607a092e6
--- /dev/null
+++ b/app/views/admins/project_ignores/new.js.erb
@@ -0,0 +1 @@
+$("#admins-project-ignore-content").html("<%= j render partial: 'admins/project_ignores/form', locals:{type: 'create'} %>")
\ No newline at end of file
diff --git a/app/views/admins/project_ignores/show.js.erb b/app/views/admins/project_ignores/show.js.erb
new file mode 100644
index 000000000..0c99dd7fd
--- /dev/null
+++ b/app/views/admins/project_ignores/show.js.erb
@@ -0,0 +1 @@
+$("#admins-project-ignore-content").html("<%= j render partial: 'admins/project_ignores/content' %>")
\ No newline at end of file
diff --git a/app/views/admins/project_languages/_form_modal.html.erb b/app/views/admins/project_languages/_form_modal.html.erb
new file mode 100644
index 000000000..79ceae969
--- /dev/null
+++ b/app/views/admins/project_languages/_form_modal.html.erb
@@ -0,0 +1,21 @@
+
+
+
+
+ <%= form_for @project_language, url: {controller: "project_languages", action: "#{type}"} do |p| %>
+
+ <%= p.text_field :name,class: "form-control input-lg",placeholder: "项目语言名称",required: true, maxlength: 64%>
+
+
+ <% end %>
+
+
+
\ No newline at end of file
diff --git a/app/views/admins/project_languages/_list.html.erb b/app/views/admins/project_languages/_list.html.erb
new file mode 100644
index 000000000..9afaca07c
--- /dev/null
+++ b/app/views/admins/project_languages/_list.html.erb
@@ -0,0 +1,33 @@
+
+
+
+ 序号
+ 名称
+ <%= sort_tag('项目数', name: 'projects_count', path: admins_project_languages_path) %>
+ <%= sort_tag('创建时间', name: 'created_at', path: admins_project_languages_path) %>
+ 操作
+
+
+
+ <% if project_languages.present? %>
+ <% project_languages.each_with_index do |project_language, index| %>
+
+ <%= list_index_no((params[:page] || 1).to_i, index) %>
+
+ <%= link_to(project_language.name, "javascript:void(0)") %>
+
+ <%= project_language.projects_count %>
+ <%= project_language.created_at&.strftime('%Y-%m-%d %H:%M') %>
+
+ <%= link_to "编辑", edit_admins_project_language_path(project_language), remote: true, class: "action" %>
+ <%= link_to "删除", admins_project_language_path(project_language), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %>
+
+
+ <% end %>
+ <% else %>
+ <%= render 'admins/shared/no_data_for_table' %>
+ <% end %>
+
+
+
+<%= render partial: 'admins/shared/paginate', locals: { objects: project_languages } %>
\ No newline at end of file
diff --git a/app/views/admins/project_languages/edit.js.erb b/app/views/admins/project_languages/edit.js.erb
new file mode 100644
index 000000000..4bd5aef5a
--- /dev/null
+++ b/app/views/admins/project_languages/edit.js.erb
@@ -0,0 +1,2 @@
+$("#project-language-modals").html("<%= j render(partial: 'admins/project_languages/form_modal', locals: {type: 'update'}) %>")
+$(".project-language-change-modal").modal('show');
\ No newline at end of file
diff --git a/app/views/admins/project_languages/index.html.erb b/app/views/admins/project_languages/index.html.erb
new file mode 100644
index 000000000..ae1d81ee4
--- /dev/null
+++ b/app/views/admins/project_languages/index.html.erb
@@ -0,0 +1,18 @@
+<% define_admin_breadcrumbs do %>
+ <% add_admin_breadcrumb('项目语言') %>
+<% end %>
+
+
+ <%= form_tag(admins_project_languages_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
+ <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '名称检索') %>
+ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
+
+ <% end %>
+ <%= link_to "新增", new_admins_project_language_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %>
+
+
+
+ <%= render partial: 'admins/project_languages/list', locals: { project_languages: @project_languages } %>
+
+
+
diff --git a/app/views/admins/project_languages/index.js.erb b/app/views/admins/project_languages/index.js.erb
new file mode 100644
index 000000000..3bd78628c
--- /dev/null
+++ b/app/views/admins/project_languages/index.js.erb
@@ -0,0 +1 @@
+$('.project-language-list-container').html("<%= j( render partial: 'admins/project_languages/list', locals: { project_languages: @project_languages } ) %>");
\ No newline at end of file
diff --git a/app/views/admins/project_languages/new.js.erb b/app/views/admins/project_languages/new.js.erb
new file mode 100644
index 000000000..4b88b4f8b
--- /dev/null
+++ b/app/views/admins/project_languages/new.js.erb
@@ -0,0 +1,2 @@
+$("#project-language-modals").html("<%= j render(partial: 'admins/project_languages/form_modal', locals: {type: 'create'}) %>")
+$(".project-language-change-modal").modal('show');
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/_content.html.erb b/app/views/admins/project_licenses/_content.html.erb
new file mode 100644
index 000000000..f25189a49
--- /dev/null
+++ b/app/views/admins/project_licenses/_content.html.erb
@@ -0,0 +1,9 @@
+
+
+
+<%= @project_license.content.html_safe %>
+
+
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/_form.html.erb b/app/views/admins/project_licenses/_form.html.erb
new file mode 100644
index 000000000..115b67935
--- /dev/null
+++ b/app/views/admins/project_licenses/_form.html.erb
@@ -0,0 +1,38 @@
+
+
+
+ <%= form_for @project_license, url: {controller: "project_licenses", action: "#{type}"} do |f| %>
+
+
+
+ <%= f.submit "确认", class: "btn btn-primary submit-btn" %>
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/_list.html.erb b/app/views/admins/project_licenses/_list.html.erb
new file mode 100644
index 000000000..1fa4f8d6b
--- /dev/null
+++ b/app/views/admins/project_licenses/_list.html.erb
@@ -0,0 +1,45 @@
+
+
+
+ 序号
+ 名称
+ 简介
+ <%
+=begin%>
+ <%= sort_tag('项目数', name: 'projects_count', path: admins_project_licenses_path) %>
+<%
+=end%>
+ <%= sort_tag('创建时间', name: 'created_at', path: admins_project_licenses_path) %>
+ 操作
+
+
+
+ <% if project_licenses.present? %>
+ <% project_licenses.each_with_index do |project_license, index| %>
+
+ <%= list_index_no((params[:page] || 1).to_i, index) %>
+
+ <%= link_to project_license.name, admins_project_license_path(project_license.id), remote: true %>
+
+
+ <%= project_license.content.to_s.truncate(200) %>
+
+ <%
+=begin%>
+ <%= project_license.projects_count %>
+<%
+=end%>
+ <%= project_license.created_at&.strftime('%Y-%m-%d %H:%M') %>
+
+ <%= link_to "编辑", edit_admins_project_license_path(project_license),remote: true, class: "action" %>
+ <%= link_to "删除", admins_project_license_path(project_license), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %>
+
+
+ <% end %>
+ <% else %>
+ <%= render 'admins/shared/no_data_for_table' %>
+ <% end %>
+
+
+
+<%= render partial: 'admins/shared/paginate', locals: { objects: project_licenses } %>
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/edit.js.erb b/app/views/admins/project_licenses/edit.js.erb
new file mode 100644
index 000000000..ac48e7e15
--- /dev/null
+++ b/app/views/admins/project_licenses/edit.js.erb
@@ -0,0 +1 @@
+$("#admins-project-license-content").html("<%= j render partial: 'admins/project_licenses/form', locals:{type: 'update'} %>")
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/index.html.erb b/app/views/admins/project_licenses/index.html.erb
new file mode 100644
index 000000000..31e648006
--- /dev/null
+++ b/app/views/admins/project_licenses/index.html.erb
@@ -0,0 +1,18 @@
+<% define_admin_breadcrumbs do %>
+ <% add_admin_breadcrumb('开源许可证') %>
+<% end %>
+
+
+ <%= form_tag(admins_project_licenses_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
+ <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '名称检索') %>
+ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
+
+ <% end %>
+ <%= link_to "新增", new_admins_project_license_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %>
+
+
+
+ <%= render partial: 'admins/project_licenses/list', locals: { project_licenses: @project_licenses } %>
+
+
+
diff --git a/app/views/admins/project_licenses/index.js.erb b/app/views/admins/project_licenses/index.js.erb
new file mode 100644
index 000000000..670c34542
--- /dev/null
+++ b/app/views/admins/project_licenses/index.js.erb
@@ -0,0 +1 @@
+$('.project-license-list-container').html("<%= j( render partial: 'admins/project_licenses/list', locals: { project_licenses: @project_licenses } ) %>");
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/new.js.erb b/app/views/admins/project_licenses/new.js.erb
new file mode 100644
index 000000000..ee1c173e2
--- /dev/null
+++ b/app/views/admins/project_licenses/new.js.erb
@@ -0,0 +1 @@
+$("#admins-project-license-content").html("<%= j render partial: 'admins/project_licenses/form', locals:{type: 'create'} %>")
\ No newline at end of file
diff --git a/app/views/admins/project_licenses/show.js.erb b/app/views/admins/project_licenses/show.js.erb
new file mode 100644
index 000000000..eddc040e9
--- /dev/null
+++ b/app/views/admins/project_licenses/show.js.erb
@@ -0,0 +1 @@
+$("#admins-project-license-content").html("<%= j render partial: 'admins/project_licenses/content' %>")
\ No newline at end of file
diff --git a/app/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb
index e2a6307ad..90c328792 100644
--- a/app/views/admins/projects/shared/_list.html.erb
+++ b/app/views/admins/projects/shared/_list.html.erb
@@ -12,7 +12,7 @@
里程碑
成员
管理员
- <%= sort_tag('创建时间', name: 'created_at', path: admins_projects_path) %>
+ <%= sort_tag('创建时间', name: 'created_on', path: admins_projects_path) %>
操作
diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb
index d89e9a6f8..7287c0347 100644
--- a/app/views/admins/shared/_sidebar.html.erb
+++ b/app/views/admins/shared/_sidebar.html.erb
@@ -14,54 +14,18 @@
<%= sidebar_item(admins_path, '概览', icon: 'dashboard', controller: 'admins-dashboards') %>
-
-
- <%= sidebar_item_group('#schools-submenu', '单位管理', icon: 'building') do %>
- <%= sidebar_item(admins_schools_path, '单位列表', icon: 'university', controller: 'admins-schools') %>
- <%= sidebar_item(admins_departments_path, '部门列表', icon: 'sitemap', controller: 'admins-departments') %>
- <%= sidebar_item(admins_partners_path, '合作伙伴', icon: 'handshake-o', controller: 'admins-partners') %>
- <% end %>
-
-
<%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
<%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %>
- <%= sidebar_item(admins_user_statistics_path, '用户实训情况', icon: 'area-chart', controller: 'admins-user_statistics') %>
<% end %>
-
- <%= sidebar_item_group('#apply-review-submenu', '审核', icon: 'gavel') do %>
- <%= sidebar_item(admins_identity_authentications_path, '实名认证', icon: 'id-card-o', controller: 'admins-identity_authentications') %>
- <%= sidebar_item(admins_professional_authentications_path, '职业认证', icon: 'drivers-license', controller: 'admins-professional_authentications') %>
- <%= sidebar_item(admins_department_applies_path, '部门审批', icon: 'newspaper-o', controller: 'admins-department_applies') %>
- <%= sidebar_item(admins_unit_applies_path, '单位审批', icon: 'building-o', controller: 'admins-unit_applies') %>
- <%= sidebar_item(admins_project_package_applies_path, '众包需求发布', icon: 'joomla', controller: 'admins-project_package_applies') %>
- <% end %>
-
-
-
- <%= sidebar_item_group('#comments-submenu', '消息', icon: 'comments') do %>
- <%= sidebar_item(admins_shixun_feedback_messages_path, '实训反馈', icon: 'comment', controller: 'admins-shixun_feedback_messages') %>
- <% end %>
-
-
-
- <%= sidebar_item_group('#running-data', '运营数据', icon: 'bar-chart') do %>
- <%= sidebar_item(admins_salesmans_path, '销售数据列表', icon: 'columns', controller: 'admins-salesmans') %>
- <% end %>
-
-
-
- <%= sidebar_item_group('#other-submenu', '其他', icon: 'list-alt') do %>
- <%= sidebar_item(admins_repertoires_path, '技术体系', icon: 'sitemap', controller: 'admins-repertoires') %>
- <% end %>
-
-
-
- <%= sidebar_item_group('#major-identification-submenu', '工程认证', icon: 'anchor') do %>
- <%= sidebar_item(admins_major_informations_path, '本科专业目录', icon: 'outdent', controller: 'admins-major_informations') %>
- <%= sidebar_item(admins_auth_schools_path, '认证单位列表', icon: 'th', controller: 'admins-auth_schools') %>
+ <%= sidebar_item_group('#projects-submenu', '开源项目', icon: 'database') do %>
+ <%= sidebar_item(admins_projects_path, '项目列表', icon: 'database', controller: 'admins-projects') %>
+ <%= sidebar_item(admins_project_languages_path, '项目语言', icon: 'language', controller: 'admins-project_languages') %>
+ <%= sidebar_item(admins_project_categories_path, '分类列表', icon: 'sitemap', controller: 'admins-project_categories') %>
+ <%= sidebar_item(admins_project_licenses_path, '开源许可证', icon: 'file-text-o', controller: 'admins-project_licenses') %>
+ <%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %>
<% end %>
@@ -76,7 +40,9 @@
<%= sidebar_item(edit_admins_help_center_path, '帮助中心', icon: 'question-circle-o', controller: 'admins-help_centers') %>
<% end %>
-
+
+ <%= sidebar_item('/sidekiq', '定时任务', icon: 'bell', controller: 'root') %>
+
<%= sidebar_item('/', '返回主站', icon: 'sign-out', controller: 'root') %>
diff --git a/app/views/admins/users/index.html.erb b/app/views/admins/users/index.html.erb
index 74c9215b2..37ca242e3 100644
--- a/app/views/admins/users/index.html.erb
+++ b/app/views/admins/users/index.html.erb
@@ -23,12 +23,20 @@
<%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-sm-2 ml-3', placeholder: 'ID/姓名/邮箱/手机号检索') %>
- <%= text_field_tag(:school_name, params[:school_name], class: 'form-control col-sm-2', placeholder: '学校/单位检索') %>
+ <%
+=begin%>
+ <%= text_field_tag(:school_name, params[:school_name], class: 'form-control col-sm-2', placeholder: '学校/单位检索') %>
+<%
+=end%>
<%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
<% end %>
<%= javascript_void_link '导入用户', class: 'btn btn-secondary btn-sm', data: { toggle: 'modal', target: '.admin-import-user-modal'} %>
- <%= javascript_void_link '导入课堂成员', class: 'btn btn-secondary btn-sm ml-2', data: { toggle: 'modal', target: '.admin-import-course-member-modal'} %>
+ <%
+=begin%>
+ <%= javascript_void_link '导入课堂成员', class: 'btn btn-secondary btn-sm ml-2', data: { toggle: 'modal', target: '.admin-import-course-member-modal'} %>
+<%
+=end%>
diff --git a/app/views/admins/users/shared/_user_list.html.erb b/app/views/admins/users/shared/_user_list.html.erb
index 2949a087b..5c033d282 100644
--- a/app/views/admins/users/shared/_user_list.html.erb
+++ b/app/views/admins/users/shared/_user_list.html.erb
@@ -8,8 +8,7 @@
角色
<%= sort_tag('创建于', name: 'created_on', path: admins_users_path) %>
<%= sort_tag('最后登录', name: 'last_login_on', path: admins_users_path) %>
- <%= sort_tag('经验值', name: 'experience', path: admins_users_path) %>
- <%= sort_tag('金币', name: 'grade', path: admins_users_path) %>
+ 项目数
操作
@@ -28,8 +27,7 @@
<%= user.identity %>
<%= display_text(user.created_on&.strftime('%Y-%m-%d %H:%M')) %>
<%= display_text(user.last_login_on&.strftime('%Y-%m-%d %H:%M')) %>
- <%= user.experience.to_i %>
- <%= user.grade.to_i %>
+ <%= link_to user.projects_count, "/users/#{user.login}/projects", target: "_blank" %>
<%= link_to '编辑', edit_admins_user_path(user), class: 'action' %>
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index f61aaba4f..91a77bf65 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -1,7 +1,7 @@
- EduCoder后台管理
+ ForgePlus后台管理
diff --git a/app/views/projects/_list_user.json.jbuilder b/app/views/projects/_list_user.json.jbuilder
new file mode 100644
index 000000000..3e457486f
--- /dev/null
+++ b/app/views/projects/_list_user.json.jbuilder
@@ -0,0 +1,8 @@
+user = target.user
+
+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_watch current_user&.watched?(user)
diff --git a/app/views/projects/fork_users.json.jbuilder b/app/views/projects/fork_users.json.jbuilder
new file mode 100644
index 000000000..95e69ca75
--- /dev/null
+++ b/app/views/projects/fork_users.json.jbuilder
@@ -0,0 +1,12 @@
+json.count @forks_count
+json.users do
+ json.array! @fork_users.each do |f|
+ user = f.user
+ fork_project = Project.select(:id,:name).find_by(id: f.fork_project_id)
+ json.id f.fork_project_id
+ json.name "#{user.try(:show_real_name)}/#{fork_project.try(:name)}"
+ json.login user.try(:login)
+ json.image_url url_to_avatar(user)
+ json.format_time f.created_at.strftime("%Y-%m-%d")
+ end
+end
\ No newline at end of file
diff --git a/app/views/projects/praise_users.json.jbuilder b/app/views/projects/praise_users.json.jbuilder
new file mode 100644
index 000000000..27a854d38
--- /dev/null
+++ b/app/views/projects/praise_users.json.jbuilder
@@ -0,0 +1,4 @@
+json.count @praises_count
+json.users do
+ json.partial! "/projects/list_user", collection: @praises, as: :target
+end
\ No newline at end of file
diff --git a/app/views/projects/watch_users.json.jbuilder b/app/views/projects/watch_users.json.jbuilder
new file mode 100644
index 000000000..3e69ab985
--- /dev/null
+++ b/app/views/projects/watch_users.json.jbuilder
@@ -0,0 +1,4 @@
+json.count @watchers_count
+json.users do
+ json.partial! "/projects/list_user", collection: @watchers, as: :target
+end
\ No newline at end of file
diff --git a/app/views/watchers/index.json.jbuilder b/app/views/watchers/index.json.jbuilder
index 72f0083c4..7418a8fd8 100644
--- a/app/views/watchers/index.json.jbuilder
+++ b/app/views/watchers/index.json.jbuilder
@@ -1,4 +1,4 @@
-json.total_count @watchers.size
+json.total_count @scopes_size
json.watchers do
json.partial! 'watcher', collection: @watchers, as: :watcher
end
diff --git a/config/routes.rb b/config/routes.rb
index 2008d6734..6e40144f4 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -44,7 +44,14 @@ Rails.application.routes.draw do
resources :project_languages, only: [:index, :show]
resources :ignores, only: [:index, :show]
resources :licenses, only: [:index, :show]
-
+
+ resources :watchers, only: [:index] do
+ collection do
+ post :follow
+ delete :unfollow
+ get :check_watch
+ end
+ end
resources :projects do
resources :pull_requests, except: [:destroy] do
member do
@@ -75,13 +82,7 @@ Rails.application.routes.draw do
post :update_status
end
end
- resources :watchers, only: [:index] do
- collection do
- post :follow
- delete :unfollow
- get :check_watch
- end
- end
+
resources :praise_tread, only: [:index] do
collection do
post :like
@@ -104,6 +105,9 @@ Rails.application.routes.draw do
member do
get :branches
post :watch
+ get :watch_users
+ get :praise_users
+ get :fork_users
end
end
@@ -390,6 +394,10 @@ Rails.application.routes.draw do
get :visits_static
end
end
+ resources :project_languages
+ resources :project_categories
+ resources :project_licenses
+ resources :project_ignores
resources :major_informations, only: [:index]
resources :ec_templates, only: [:index, :destroy] do
collection do
diff --git a/db/migrate/20200515080705_add_created_at_to_watcher.rb b/db/migrate/20200515080705_add_created_at_to_watcher.rb
new file mode 100644
index 000000000..f44039c9c
--- /dev/null
+++ b/db/migrate/20200515080705_add_created_at_to_watcher.rb
@@ -0,0 +1,6 @@
+class AddCreatedAtToWatcher < ActiveRecord::Migration[5.2]
+ def change
+ add_column :watchers, :created_at, :datetime
+ Watcher.update_all(created_at: Time.current)
+ end
+end
diff --git a/db/migrate/20200515082628_create_fork_users.rb b/db/migrate/20200515082628_create_fork_users.rb
new file mode 100644
index 000000000..476c67ed6
--- /dev/null
+++ b/db/migrate/20200515082628_create_fork_users.rb
@@ -0,0 +1,17 @@
+class CreateForkUsers < ActiveRecord::Migration[5.2]
+ def change
+ create_table :fork_users do |t|
+ t.integer :project_id #原始项目id
+ t.integer :fork_project_id #fork后的项目id
+ t.integer :user_id #fork用户的id
+ t.timestamps
+ end
+ add_index :fork_users, :project_id
+ add_index :fork_users, :user_id
+
+ projects = Project.where("forked_from_project_id is not null")
+ projects.each do |p|
+ ForkUser.create(project_id: p.forked_from_project_id, fork_project_id: p.id, user_id: p.user_id)
+ end
+ end
+end
diff --git a/db/migrate/20200518065521_add_watchers_count_to_user.rb b/db/migrate/20200518065521_add_watchers_count_to_user.rb
new file mode 100644
index 000000000..3e839b344
--- /dev/null
+++ b/db/migrate/20200518065521_add_watchers_count_to_user.rb
@@ -0,0 +1,5 @@
+class AddWatchersCountToUser < ActiveRecord::Migration[5.2]
+ def change
+ add_column :users, :watchers_count, :integer, default: 0
+ end
+end
diff --git a/db/migrate/20200518092612_change_project_watchers_count.rb b/db/migrate/20200518092612_change_project_watchers_count.rb
new file mode 100644
index 000000000..10d205416
--- /dev/null
+++ b/db/migrate/20200518092612_change_project_watchers_count.rb
@@ -0,0 +1,13 @@
+class ChangeProjectWatchersCount < ActiveRecord::Migration[5.2]
+ #修改project的watchers_count 不正确的问题
+ def change
+ watcher_ids = Watcher.where(watchable_type: "Project").pluck(:watchable_id).uniq
+ watcher_ids.each do |i|
+ puts "#######____update_project_watchers_id____##############{i}"
+ p = Project.includes(:watchers).select(:id, :watchers_count).find_by(id:i)
+ if p.present?
+ Project.reset_counters(i, :watchers)
+ end
+ end
+ end
+end
diff --git a/public/favicon.ico b/public/favicon.ico
old mode 100755
new mode 100644
index 9c65fe8c7..75a4c3dfd
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/spec/models/fork_user_spec.rb b/spec/models/fork_user_spec.rb
new file mode 100644
index 000000000..e151b5c00
--- /dev/null
+++ b/spec/models/fork_user_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe ForkUser, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end