Commit 30d04585 by Nguyen Hoang Mai Phuong

admin page

parents 7b1bb3e2 76e39781
Pipeline #1496 failed with stages
in 0 seconds
...@@ -14,7 +14,7 @@ gem 'babosa' ...@@ -14,7 +14,7 @@ gem 'babosa'
gem 'active_storage_validations' gem 'active_storage_validations'
gem 'mini_magick', '>= 4.9.5' gem 'mini_magick', '>= 4.9.5'
gem 'devise' gem 'devise'
gem 'rsolr'
# Use sqlite3 as the database for Active Record # Use sqlite3 as the database for Active Record
gem 'mysql2', '~> 0.5.3' gem 'mysql2', '~> 0.5.3'
# Use Puma as the app server # Use Puma as the app server
......
...@@ -100,6 +100,25 @@ GEM ...@@ -100,6 +100,25 @@ GEM
warden (~> 1.2.3) warden (~> 1.2.3)
erubi (1.10.0) erubi (1.10.0)
execjs (2.8.1) execjs (2.8.1)
faraday (1.8.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0.1)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
multipart-post (>= 1.2, < 3)
ruby2_keywords (>= 0.0.4)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
ffi (1.15.3) ffi (1.15.3)
friendly_id (5.4.2) friendly_id (5.4.2)
activerecord (>= 4.0.0) activerecord (>= 4.0.0)
...@@ -135,6 +154,7 @@ GEM ...@@ -135,6 +154,7 @@ GEM
mini_mime (1.1.0) mini_mime (1.1.0)
minitest (5.14.4) minitest (5.14.4)
msgpack (1.4.2) msgpack (1.4.2)
multipart-post (2.1.1)
mysql2 (0.5.3) mysql2 (0.5.3)
nio4r (2.5.7) nio4r (2.5.7)
nokogiri (1.11.7-x86_64-linux) nokogiri (1.11.7-x86_64-linux)
...@@ -186,6 +206,10 @@ GEM ...@@ -186,6 +206,10 @@ GEM
responders (3.0.1) responders (3.0.1)
actionpack (>= 5.0) actionpack (>= 5.0)
railties (>= 5.0) railties (>= 5.0)
rsolr (2.3.0)
builder (>= 2.1.2)
faraday (>= 0.9.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.1) rubyzip (2.3.1)
sass-rails (6.0.0) sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1) sassc-rails (~> 2.1, >= 2.1.1)
...@@ -272,6 +296,7 @@ DEPENDENCIES ...@@ -272,6 +296,7 @@ DEPENDENCIES
puma (~> 5.0) puma (~> 5.0)
rack-mini-profiler (~> 2.0) rack-mini-profiler (~> 2.0)
rails (~> 6.1.3, >= 6.1.3.2) rails (~> 6.1.3, >= 6.1.3.2)
rsolr
sass-rails (>= 6) sass-rails (>= 6)
selenium-webdriver selenium-webdriver
slim-rails slim-rails
......
...@@ -21,6 +21,15 @@ class JobsController < ApplicationController ...@@ -21,6 +21,15 @@ class JobsController < ApplicationController
@job = Job.find_by(slug: params[:job_slug]) or not_found @job = Job.find_by(slug: params[:job_slug]) or not_found
end end
def search
@keyword = job_params[:search].gsub!(/[^[:alnum:]]/, ' ')
response = SolrSearch.new.search(@keyword, params[:page])
job_ids = response['response']['docs'].map { |job| job['job_id'] }
jobs = Job.latest_jobs.find(job_ids)
@total = response['response']['numFound']
@jobs = Kaminari.paginate_array(jobs, total_count: @total).page(params[:page])
end
private private
def history_action def history_action
...@@ -34,7 +43,7 @@ class JobsController < ApplicationController ...@@ -34,7 +43,7 @@ class JobsController < ApplicationController
end end
def job_params def job_params
params.permit(:job_slug) params.permit(:job_slug, :search)
end end
def history_query def history_query
......
...@@ -8,7 +8,7 @@ class Job < ApplicationRecord ...@@ -8,7 +8,7 @@ class Job < ApplicationRecord
has_and_belongs_to_many :industries has_and_belongs_to_many :industries
has_and_belongs_to_many :cities has_and_belongs_to_many :cities
LATEST_JOB_NUMBER = 5 LATEST_JOB_NUMBER = 5
scope :latest_jobs, -> { includes(:cities, :company).order('created_at DESC') } scope :latest_jobs, -> { includes(:cities, :company, :industries).order('created_at DESC') }
def normalize_friendly_id(string) def normalize_friendly_id(string)
string.to_s.to_slug.normalize(transliterations: :vietnamese).to_s string.to_s.to_slug.normalize(transliterations: :vietnamese).to_s
......
...@@ -3,9 +3,9 @@ nav.breadcrumb[style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb"] ...@@ -3,9 +3,9 @@ nav.breadcrumb[style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb"]
li.breadcrumb-item li.breadcrumb-item
= link_to "Top", root_path = link_to "Top", root_path
li.breadcrumb-item li.breadcrumb-item
- @job.cities.each.uniq do |city| - @job.cities.uniq.each do |city|
= link_to city.name + ' ', city_slug_path(city.slug) = link_to city.name + ' ', city_slug_path(city.slug)
li.breadcrumb-item li.breadcrumb-item
- @job.industries.each do |industry| - @job.industries.uniq.each do |industry|
= link_to industry.name + ' ', industry_slug_path(industry.slug) = link_to industry.name + ' ', industry_slug_path(industry.slug)
li.breadcrumb-item.active = @job.title li.breadcrumb-item.active = @job.title
\ No newline at end of file
.search.p-3.offset-md-2 .search.p-3.offset-md-2
= form_with(url: '/jobs', local: true) do = form_with(url: '/jobs', method: 'get', local: true) do
= text_field_tag :search, params[:search], placeholder: "Search", class: "form" = text_field_tag :search, params[:search], placeholder: "Search", class: "form"
= submit_tag "Search", name: nil, class: 'btn-primary' = submit_tag "Search", name: nil, class: 'btn-primary'
.container.p-3
h5.fw-normal
| Total:
= pluralize(@total, 'job')
h5.fw-normal
| Result for:
= @keyword
.d-flex.justify-content-center.p-2
= paginate @jobs, window: 1
.job-list
- @jobs.each do |job|
.row.bg-white
.col-10.p-3.card-body.text-dark
h5.mb-1
= link_to job.title, detail_path(job.slug)
p.mb-1
= job.company.name
p.mb-1
i.fas.fa-dollar-sign.m-1
| Lương:
= job.salary
p.mb-1
i.fas.fa-map-marker-alt.m-1
= job.cities.map(&:name).uniq.join(' | ')
p.mb-1
i.fas.fa-map-marker-alt.m-1
= job.industries.map(&:name).uniq.join(' | ')
p.mb-1
= truncate(job.overview, length: 250)
.col-sm-2.p-3.favourite
= render partial: "favorite_jobs/favorite", locals: { job: job }
-if @jobs.any?
.d-flex.justify-content-center.p-2
= page_entries_info @jobs
.d-flex.justify-content-center.p-2
= paginate @jobs, window: 1
-else
h4.text-center
| Not have any jobs you need
\ No newline at end of file
...@@ -17,6 +17,7 @@ module VeNJOB ...@@ -17,6 +17,7 @@ module VeNJOB
# in config/environments, which are processed later. # in config/environments, which are processed later.
# #
config.time_zone = 'Hanoi' config.time_zone = 'Hanoi'
config.eager_load_paths << "#{Rails.root}/lib/solr"
# config.eager_load_paths << Rails.root.join("extras") # config.eager_load_paths << Rails.root.join("extras")
end end
end end
...@@ -13,8 +13,9 @@ Rails.application.routes.draw do ...@@ -13,8 +13,9 @@ Rails.application.routes.draw do
delete 'unfavorite', to: 'favorite_jobs#destroy' delete 'unfavorite', to: 'favorite_jobs#destroy'
get 'history', to: 'history_jobs#index', as: 'history' get 'history', to: 'history_jobs#index', as: 'history'
get '/my/jobs', to: 'apply_jobs#index', as: 'applied_job' get '/my/jobs', to: 'apply_jobs#index', as: 'applied_job'
get 'jobs', to: 'jobs#search', as: 'search'
devise_for :users, path: 'users', skip: %i[sessions registrations passwords], controllers: { confirmations: 'users/confirmations' } devise_for :users, path: 'users', skip: %i[sessions registrations passwords], controllers: { confirmations: 'users/confirmations' }
get 'my', to: 'users#show' get '/my', to: 'users#show'
devise_scope :user do devise_scope :user do
get 'register/1', to: 'users/registrations#new', as: :new_user_registration get 'register/1', to: 'users/registrations#new', as: :new_user_registration
get 'register/2', to: 'users/registrations#show' get 'register/2', to: 'users/registrations#show'
......
class SolrSearch
def initialize
@solr = RSolr.connect url: 'http://localhost:8983/solr/VeNJOB'
end
def search(keyword, current_page)
@solr.paginate current_page, 20, 'select', params: {
q: "cities_name: #{keyword} or title: #{keyword} or industries_name: #{keyword} or company_name: #{keyword}",
fl: 'job_id'
}
end
def add_data
logger = Logger.new("#{Rails.root}/log/add_data_solr.log")
logger.info "Start add data at: #{Time.current}"
data = Job.all.includes(:cities, :industries, :company)
data.each do |record|
job_id = record.id
title = record.title
company_name = record.company.name
cities = record.cities.uniq.map(&:name)
industries = record.industries.uniq.map(&:name)
slug = record.slug
@solr.add(job_id: job_id, title: title, company_name: company_name, cities_name: cities,
industries_name: industries, slug: slug)
@solr.commit
rescue StandardError => error
logger.error("The job has error: #{job_id}")
logger.error(error)
next
end
logger.info "End add data at: #{Time.current}"
end
def delete_data
@solr.delete_by_query '*:*'
@solr.commit
end
end
namespace :solr do
desc 'Add data into apache solr'
task setup: :environment do
connect_solr.add_data
end
desc 'Delete data in apache solr'
task delete_data: :environment do
connect_solr.delete_data
end
def connect_solr
SolrSearch.new
end
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment