diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 86e8d5e2a..b957a98d4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,7 +1,7 @@ class UsersController < ApplicationController - before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects] - before_action :check_user_exist, only: [:show, :homepage_info] + before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users] + before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users] before_action :require_login, only: %i[me list projects] skip_before_action :check_sign, only: [:attachment_show] @@ -11,7 +11,34 @@ class UsersController < ApplicationController @users = paginate(scope) end - def show;end + def show + #待办事项,现在未做 + @undo_events = 0 + #用户的组织数量 + # @user_composes_count = @user.composes.size + @user_composes_count = 0 + user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible + @projects_common_count = user_projects.common.size + @projects_mirrior_count = user_projects.mirror.size + end + + def watch_users + watchers = Watcher.watching_users(@user.id).includes(:user).order("watchers.created_at asc") + if params[:search].present? + search_user_ids = User.where(id: watchers.pluck(:watchable_id)).like(params[:search]).pluck(:id) + watchers = watchers.where(watchable_id: search_user_ids) + end + @watchers_count = watchers.size + @watchers = paginate(watchers) + end + + def fan_users + watchers = @user.watchers.includes(:user).order("watchers.created_at asc") + watchers = watchers.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login)) LIKE ?", "%#{params[:search].split(" ").join('|')}%") if params[:search].present? + + @watchers_count = watchers.size + @watchers = paginate(watchers) + end def update @user = User.find params[:id] @@ -85,7 +112,7 @@ class UsersController < ApplicationController @projects = projects.select(:id, :name) end - # 个人主页信息 + #TODO 个人主页信息,forge上弃用-hs, 0602 def homepage_info #待办事项,现在未做 @undo_events = 10 @@ -119,7 +146,8 @@ class UsersController < ApplicationController end def projects - scope = Projects::ListMyQuery.call(params.merge(category: params[:category],is_public: params[:status]), @user) + is_current_admin_user = User.current.logged? && (current_user&.admin? || current_user.id == @user.id) + scope = Projects::ListMyQuery.call(params, @user,is_current_admin_user) @total_count = scope.size @projects = paginate(scope) end diff --git a/app/models/user.rb b/app/models/user.rb index f37e61923..2d2e2ce26 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -70,6 +70,8 @@ class User < ApplicationRecord # 关注 has_many :be_watchers, foreign_key: :user_id, dependent: :destroy # 我的关注 has_many :be_watcher_users, through: :be_watchers, dependent: :destroy # 我关注的用户 + + has_many :watchers, as: :watchable, dependent: :destroy # 认证 has_many :apply_user_authentication @@ -143,13 +145,13 @@ class User < ApplicationRecord # 关注数 def follow_count - Watcher.where(user_id: id, watchable_type: %w(Principal User)).count + Watcher.where(user_id: 1, watchable_type: %w(User)).count # User.watched_by(id).count end # 粉丝数 def fan_count - Watcher.where(watchable_type: %w(Principal User), watchable_id: id).count + Watcher.where(watchable_type: %w(User), watchable_id: id).count # watchers.count end diff --git a/app/models/watcher.rb b/app/models/watcher.rb index 3b613b9f0..50bd75809 100644 --- a/app/models/watcher.rb +++ b/app/models/watcher.rb @@ -1,4 +1,7 @@ class Watcher < ApplicationRecord belongs_to :user + belongs_to :watchable, polymorphic: true, counter_cache: :watchers_count + + scope :watching_users, ->(watchable_id){ where("watchable_type = ? and user_id = ?",'User',watchable_id)} end diff --git a/app/queries/projects/list_my_query.rb b/app/queries/projects/list_my_query.rb index 69cd8a9fe..e69280bb3 100644 --- a/app/queries/projects/list_my_query.rb +++ b/app/queries/projects/list_my_query.rb @@ -1,32 +1,48 @@ class Projects::ListMyQuery < ApplicationQuery - attr_reader :params, :user + attr_reader :params, :user, :is_current_admin_user # sort_columns :updated_on, :created_on, :forked_count, :praises_count, default_by: :updated_on, default_direction: :desc - def initialize(params,user) + def initialize(params,user,is_current_admin_user) @params = params @user = user + @is_current_admin_user = is_current_admin_user end def call - if params[:category].blank? - projects = Project.joins(:members).where(members: { user_id: user.id }) - elsif params[:category].to_s == "manage" - projects = Project.where(user_id: user.id) - elsif params[:category].to_s == "watched" #我关注的 - projects = Project.joins(:watchers).where("watchable_type = ? and user_id = ?", "Project", user.id) - elsif params[:category].to_s == "forked" #我fork的 - fork_ids = user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id) - projects = Project.where(id: fork_ids) - else - projects = Project.where.not(user_id: user.id).joins(:members).where(members: { user_id: user.id }) - end - unless params[:is_public].blank? - projects = projects.where(is_public: (params[:is_public].to_s == "publicly")) + if is_current_admin_user + projects = Project + else + projects = Project.visible end - scope = projects.includes(:project_category,:project_score, :project_language,:owner) + if params[:category].blank? + projects = projects.joins(:members).where(members: { user_id: user.id }) + elsif params[:category].to_s == "join" + projects = projects.where.not(user_id: user.id).joins(:members).where(members: { user_id: user.id }) + elsif params[:category].to_s == "manage" + projects = projects.where(user_id: user.id) + elsif params[:category].to_s == "watched" #我关注的 + projects = projects.where.not(user_id: user.id).joins(:watchers).where(watchers: {watchable_type: "Project", user_id: user.id}) + elsif params[:category].to_s == "forked" #我fork的 + fork_ids = user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id) + projects = projects.where(id: fork_ids) + elsif params[:category].to_s == "public" + projects = projects.visible.joins(:members).where(members: { user_id: user.id }) + elsif params[:category].to_s == "private" + projects = projects.is_private.joins(:members).where(members: { user_id: user.id }) + end + + if params[:project_type].to_s === "common" + projects = projects.common + elsif params[:project_type].to_s === "mirror" + projects = projects.mirror + end + + q = projects.ransack(name_or_identifier_cont: params[:search]) + + scope = q.result.includes(:project_category, :project_language,:owner, :repository) sort = params[:sort_by] || "updated_on" sort_direction = params[:sort_direction] || "desc" diff --git a/app/views/projects/_project_detail.json.jbuilder b/app/views/projects/_project_detail.json.jbuilder new file mode 100644 index 000000000..f3a54a32a --- /dev/null +++ b/app/views/projects/_project_detail.json.jbuilder @@ -0,0 +1,39 @@ +user = project.owner +if user.blank? + nil +else + json.id project.id +json.repo_id project&.repository&.id +json.identifier project.identifier +json.name project.name +json.description Nokogiri::HTML(project.description).text +json.visits project.visits +json.praises_count project.praises_count.to_i +json.forked_count project.forked_count.to_i +json.is_public project.is_public +json.mirror_url project.repository&.mirror_url +json.last_update_time render_unix_time(project.updated_on) +json.time_ago time_from_now(project.updated_on) +json.forked_from_project_id project.forked_from_project_id +json.author do + json.name user.try(:show_real_name) + json.login user.login + json.image_url url_to_avatar(project.owner) +end +json.category do + if project.project_category.blank? + json.nil! + else + json.id project.project_category.id + json.name project.project_category.name + end +end +json.language do + if project.project_language.blank? + json.nil! + else + json.id project.project_language.id + json.name project.project_language.name + end +end +end diff --git a/app/views/projects/index.json.jbuilder b/app/views/projects/index.json.jbuilder index 446b622d4..28b7df1b3 100644 --- a/app/views/projects/index.json.jbuilder +++ b/app/views/projects/index.json.jbuilder @@ -1,40 +1,4 @@ json.total_count @total_count json.projects @projects do |project| - user = project.owner - next if user.blank? - - json.id project.id - json.repo_id project&.repository.id - json.identifier project.identifier - json.name project.name - json.description Nokogiri::HTML(project.description).text - json.visits project.visits - json.praises_count project.praises_count.to_i - json.forked_count project.forked_count.to_i - json.is_public project.is_public - json.mirror_url project.repository&.mirror_url - json.last_update_time render_unix_time(project.updated_on) - json.time_ago time_from_now(project.updated_on) - json.forked_from_project_id project.forked_from_project_id - json.author do - json.name user.try(:show_real_name) - json.login user.login - json.image_url url_to_avatar(project.owner) - end - json.category do - if project.project_category.blank? - json.nil! - else - json.id project.project_category.id - json.name project.project_category.name - end - end - json.language do - if project.project_language.blank? - json.nil! - else - json.id project.project_language.id - json.name project.project_language.name - end - end + json.partial! "/projects/project_detail", project: project end diff --git a/app/views/users/_watch_user_detail.json.jbuilder b/app/views/users/_watch_user_detail.json.jbuilder new file mode 100644 index 000000000..5f292f720 --- /dev/null +++ b/app/views/users/_watch_user_detail.json.jbuilder @@ -0,0 +1,8 @@ +user = target.watchable + +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/users/fan_users.json.jbuilder b/app/views/users/fan_users.json.jbuilder new file mode 100644 index 000000000..b23006d6a --- /dev/null +++ b/app/views/users/fan_users.json.jbuilder @@ -0,0 +1,4 @@ +json.count @watchers_count +json.users do + json.partial! "/users/watch_user_detail", collection: @watchers, as: :target +end \ No newline at end of file diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index 5ce471c12..1c83716bd 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -12,6 +12,5 @@ json.user_phone_binded @user.phone.present? # json.email @user.mail json.profile_completed @user.profile_completed? json.professional_certification @user.professional_certification -json.is_watch current_user&.watched?(@user) diff --git a/app/views/users/projects.json.jbuilder b/app/views/users/projects.json.jbuilder index 01c334acd..822402a23 100644 --- a/app/views/users/projects.json.jbuilder +++ b/app/views/users/projects.json.jbuilder @@ -1,24 +1,6 @@ json.count @total_count json.projects do json.array! @projects do |project| - user = project&.owner - json.members_count project.members_count - json.issues_count project.issues_count - json.changesets_count project&.project_score&.changeset_num.to_i - json.can_visited project.can_visited? - json.id project.id - json.identifier project.identifier - json.name project.name - json.is_public project.is_public - json.owner do - json.real_name user.present? ? user.try(:real_name) : "未知用户" - json.avatar_url user.present? ? url_to_avatar(user) : "avatars/User/b" - end - json.category do - json.name project&.project_category&.name - end - json.language do - json.name project&.project_language&.name - end + json.partial! "/projects/project_detail", project: project end end diff --git a/app/views/users/show.json.jbuilder b/app/views/users/show.json.jbuilder index 09fef7e2f..502234316 100644 --- a/app/views/users/show.json.jbuilder +++ b/app/views/users/show.json.jbuilder @@ -1 +1,16 @@ -json.partial! 'users/user', locals: { user: @user } \ No newline at end of file +# json.partial! 'users/user', locals: { user: @user } + +json.username @user.full_name +json.real_name @user.real_name +json.login @user.login +json.user_id @user.id +json.image_url url_to_avatar(@user) +json.admin @user.admin? +json.user_identity @user.identity +json.is_watch current_user&.watched?(@user) +json.watched_count @user.fan_count #粉丝 +json.watching_count @user.follow_count #关注数 +json.undo_events @undo_events +json.user_composes_count @user_composes_count +json.common_projects_count @projects_common_count +json.mirror_projects_count @projects_mirrior_count \ No newline at end of file diff --git a/app/views/users/watch_users.json.jbuilder b/app/views/users/watch_users.json.jbuilder new file mode 100644 index 000000000..b23006d6a --- /dev/null +++ b/app/views/users/watch_users.json.jbuilder @@ -0,0 +1,4 @@ +json.count @watchers_count +json.users do + json.partial! "/users/watch_user_detail", collection: @watchers, as: :target +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index a5be9be67..3ff0d0dd7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -140,6 +140,8 @@ Rails.application.routes.draw do member do get :homepage_info get :projects + get :watch_users + get :fan_users end collection do post :following diff --git a/dump.rdb b/dump.rdb index 6d64e2827..64f9e1903 100644 Binary files a/dump.rdb and b/dump.rdb differ