diff --git a/app/controllers/projects/project_visitors_controller.rb b/app/controllers/projects/project_visitors_controller.rb new file mode 100644 index 000000000..7b1c372a5 --- /dev/null +++ b/app/controllers/projects/project_visitors_controller.rb @@ -0,0 +1,27 @@ +class Projects::ProjectVisitorsController < Projects::BaseController + + def index + project_visitors = @project.project_visitors.joins(:user).order(:created_at) + project_visitors = project_visitors.merge(User.like(params[:search])) + @project_visitors = kaminari_paginate(project_visitors) + end + + def create + @project_visitor = @project.project_visitors.new(project_visitor_params.merge!(user_id: current_user.id) ) + if @project_visitor.save! + render_ok + else + render_error(@project_visitor.errors.full_messages) + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + private + def project_visitor_params + params.require(:project_visitor).permit(:contact, :contact_phone, :contact_unit) + end + + +end \ No newline at end of file diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index c7ef0576e..27580593d 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -25,7 +25,7 @@ class RepositoriesController < ApplicationController # 新版项目详情 def detail @user = current_user - UserAction.find_or_create_by!(action_id: @user.id, action_type: "ViewProject-#{@project.id}", user_id: @user.id) if @project.actionable + # UserAction.find_or_create_by!(action_id: @user.id, action_type: "ViewProject-#{@project.id}", user_id: @user.id) if @project.actionable @result = Repositories::DetailService.call(@owner, @repository, @user) cache_total_forks = $redis_cache.get("ProjectSpecialForks:#{@project.id}") if cache_total_forks.present? diff --git a/app/models/project.rb b/app/models/project.rb index b7eab4821..1d48e0066 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -142,6 +142,7 @@ class Project < ApplicationRecord has_one :project_dataset, dependent: :destroy has_many :sync_repositories, dependent: :destroy has_many :home_top_settings, as: :top, dependent: :destroy + has_many :project_visitors, dependent: :destroy after_create :incre_user_statistic, :incre_platform_statistic after_save :check_project_members before_save :set_invite_code, :reset_unmember_followed, :set_recommend_and_is_pinned, :reset_cache_data diff --git a/app/models/project_visitor.rb b/app/models/project_visitor.rb new file mode 100644 index 000000000..040532f3b --- /dev/null +++ b/app/models/project_visitor.rb @@ -0,0 +1,6 @@ +class ProjectVisitor < ApplicationRecord + + belongs_to :user + belongs_to :project + +end diff --git a/app/models/user.rb b/app/models/user.rb index 1eb3660ee..ea4b35d33 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -198,7 +198,7 @@ class User < Owner scope :like, lambda { |keywords| # 表情处理 keywords = keywords.to_s.each_char.select { |c| c.bytes.first < 240 }.join('') - sql = "CONCAT(lastname, firstname) LIKE :search OR nickname LIKE :search OR login LIKE :search OR mail LIKE :search OR phone LIKE :search" + sql = "CONCAT(users.lastname, users.firstname) LIKE :search OR users.nickname LIKE :search OR users.login LIKE :search OR users.mail LIKE :search OR users.phone LIKE :search" where(sql, :search => "%#{keywords.strip}%") unless keywords.blank? } diff --git a/app/views/projects/project_visitors/index.json.jbuilder b/app/views/projects/project_visitors/index.json.jbuilder new file mode 100644 index 000000000..ee66fb7d6 --- /dev/null +++ b/app/views/projects/project_visitors/index.json.jbuilder @@ -0,0 +1,10 @@ +json.total_count @project_visitors.total_count +json.project_visitors @project_visitors do |project_visitor| + json.id project_visitor.id + json.contact project_visitor.contact + json.contact_phone project_visitor.contact_phone + json.contact_unit project_visitor.contact_unit + json.user do + json.partial! "/users/user_simple", locals: {user: project_visitor.user} + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d2d2af1ed..d630b2804 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -779,6 +779,11 @@ Rails.application.routes.draw do end scope module: :projects do + resources :project_visitors, only: [:index] do + collection do + post :create + end + end resources :members, only: [:index] resources :teams, only: [:index, :create, :destroy] resources :project_units, only: [:index, :create] diff --git a/db/migrate/20250610070104_create_project_visitors.rb b/db/migrate/20250610070104_create_project_visitors.rb new file mode 100644 index 000000000..c364d1b61 --- /dev/null +++ b/db/migrate/20250610070104_create_project_visitors.rb @@ -0,0 +1,13 @@ +class CreateProjectVisitors < ActiveRecord::Migration[5.2] + def change + create_table :project_visitors do |t| + t.references :user + t.references :project + t.string :contact + t.string :contact_phone + t.string :contact_unit + + t.timestamps + end + end +end diff --git a/spec/models/project_visitor_spec.rb b/spec/models/project_visitor_spec.rb new file mode 100644 index 000000000..1af60d95f --- /dev/null +++ b/spec/models/project_visitor_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ProjectVisitor, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end