Commit df25189d by Van Hau Le

Merge branch 'industry_list' into 'master'

Create Industry list

See merge request !2
parents 784ae619 c113d3e9
Pipeline #893 canceled with stages
in 0 seconds
......@@ -13,5 +13,6 @@
//= require rails-ujs
//= require activestorage
//= require jquery-3.5.1.slim.min.js
//= require jquery-3.5.1.min.js
//= require turbolinks
//= require_tree .
......@@ -6,7 +6,11 @@
font-style: italic;
font-family: Bookman, URW Bookman L, serif;
}
.city-name {
.vn-name, .international-name{
text-decoration: none;
color: black;
}
.vn-name, .international-name {
margin: 10px;
padding: 10px;
text-align: center;
......
.industry-banner{
background: linear-gradient(to top, #33ccff 0%, #006600 100%);
font-size: 38px;
text-align: center;
color: white;
font-style: italic;
font-family: Bookman, URW Bookman L, serif;
}
.industry-details {
margin: 20px;
padding: 15px;
text-align: center;
}
.industry-details {
text-decoration: none;
color: black;
}
.remove-decoration {
&:hover{
a {
text-decoration: none;
}
}
}
// Place all the styles related to the Jobs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
.total-jobs {
margin: 5px;
padding: 5px;
}
class CitiesController < ApplicationController
def index
@cities_vietnam = City.all_city.vietnam
@cities_international = City.all_city.international
@cities_vietnam = City.location(City::VIETNAM)
@cities_international = City.location(City::FOREIGN)
end
end
class IndustriesController < ApplicationController
def index
@industries = Industry.all_industry
end
end
class JobsController < ApplicationController
def index
@total_job = Job.count
@jobs_list = Job.all_job
@cities = City.all
@industries = Industry.all
end
end
......@@ -3,7 +3,7 @@ class TopPagesController < ApplicationController
@cities = City.all
@industries = Industry.all
@total_jobs = Job.count
@jobs = Job.limit(5).order(created_at: :desc)
@jobs = Job.limit_job
@jobs_of_cities = City.top_city
@jobs_of_industries = Industry.top_industry
end
......
module JobsHelper
def job_description(description)
strip_tags(description).truncate_words(250)
end
end
......@@ -2,11 +2,9 @@ class City < ApplicationRecord
has_many :city_jobs
has_many :jobs, through: :city_jobs
scope :all_city, -> { joins(:jobs).group(:city_id).order('count(job_id) DESC') }
scope :vietnam, -> { where('location = 1') }
scope :international, -> { where('location = 0') }
VIETNAM = 1
FOREIGN = 0
def self.top_city
joins(:jobs).group(:city_id).order('count(job_id) DESC').limit(9)
end
scope :top_city, -> { joins(:jobs).group(:city_id).order('count(job_id) DESC').limit(9) }
scope :location, ->(number) { joins(:jobs).group(:city_id).order('count(job_id) DESC').where(location: number) }
end
......@@ -2,7 +2,7 @@ class Industry < ApplicationRecord
has_many :industry_jobs
has_many :jobs, through: :industry_jobs
def self.top_industry
joins(:jobs).group(:industry_id).order('count(job_id) DESC').limit(9)
end
scope :top_industry, -> { joins(:jobs).group(:industry_id).order('count(job_id) DESC').limit(9) }
scope :all_industry, -> { joins(:jobs).group(:industry_id).order('count(job_id) DESC') }
end
......@@ -15,8 +15,11 @@ class Job < ApplicationRecord
has_many :histories
has_many :users, through: :histories
scope :limit_job, -> { includes(:cities, :company).order(created_at: :desc).limit(5) }
scope :all_job, -> { limit(20).order(created_at: :desc) }
def company_name
@company_name ||= company&.name
company&.name
end
end
<% @cities_international.each do |city| %>
<div class="col-3 remove-decoration">
<%= link_to '#' do %>
<div class="border border-dark rounded city-name">
<div>
<strong><%= city.name %></strong>
</div>
<div>
<%= city.jobs.count %>
</div>
<div class="col-3 remove-decoration">
<%= link_to '#' do %>
<div class="border border-dark rounded vn-name">
<div>
<strong><%= city.name %></strong>
</div>
<% end %>
</div>
<% end %>
<div>
<%= city.jobs.count %>
</div>
</div>
<% end %>
</div>
<% @cities_vietnam.each do |city| %>
<div class="col-3 remove-decoration">
<%= link_to '#' do %>
<div class="border border-dark rounded city-name">
<div>
<strong><%= city.name %></strong>
</div>
<div>
<%= city.jobs.count %>
</div>
<div class="col-3 remove-decoration">
<%= link_to '#' do %>
<div class="border border-dark rounded international-name">
<div>
<strong><%= city.name %></strong>
</div>
<% end %>
</div>
<% end %>
<div>
<%= city.jobs.count %>
</div>
</div>
<% end %>
</div>
<% provide(:title, 'All Cities') %>
<div class="container">
<div class="all-cities">
<div class="city-banner rounded">City list</div>
<div class="city-banner rounded">City List</div>
<div class="row">
<div class="col-6">
<div class="row-table border border-dark rounded viet-nam">Việt Nam</div>
<div class="row-table border border-dark rounded viet-nam">
<strong>Việt Nam</strong>
</div>
</div>
<div class="col-6">
<div class="row-table border border-dark rounded international">International</div>
<div class="row-table border border-dark rounded international">
<strong>International</strong>
</div>
</div>
</div>
</div>
<div class="city-banner rounded vietnam-area">Việt Nam</div>
<div class="city-vietnam">
<div class="row">
<%= render 'cities/cities_vietnam' %>
<%= render partial: "vietnam", collection: @cities_vietnam, as: :city %>
</div>
</div>
<div class="city-banner rounded international-area">International</div>
<div class="city-international">
<div class="row">
<%= render 'cities/cities_international' %>
<%= render partial: "international", collection: @cities_international, as: :city %>
</div>
</div>
</div>
<div class="col-3 remove-decoration">
<%= link_to '#' do %>
<div class="border border-dark rounded industry-details">
<div>
<strong><%= industry.name %></strong>
</div>
<div>
<%= industry.jobs.count %>
</div>
</div>
<% end %>
</div>
<% provide(:title, 'All Industries') %>
<div class="container">
<div class="all-industries">
<div class="industry-banner rounded">Industry List</div>
<div class="row">
<%= render partial: "industry", collection: @industries, as: :industry %>
</div>
</div>
</div>
<% if job.cities.present? %>
<div class="border border-dark rounded">
<div class="job-details">
<div class="title"><strong><%= job.title %></strong></div>
<div class="row">
<div class="col-4">
<% job.cities.each do |city| %>
<%= city.name %>
<% end %>
</div>
<div class="col-4 salary">Salary: <%= job.salary %></div>
<div class="col-10 introduction">
<%= job_description(job.description) %><br>
<%= link_to 'Read more..', '#'%>
</div>
</div>
<button type="button" class="btn btn-success" id="button-follow">♥ Favorite</button>
</div>
</div>
<br>
<% end %>
<% provide(:title, 'Jobs') %>
<div class="container">
<div class="search-bar">
<%= render 'layouts/search_bar' %>
</div>
<div class="row total-jobs">
<div class="col-4"><strong>Total: <%= @total_job %> jobs</strong></div>
<div class="col-4"><strong>Result for: ... jobs</strong></div>
</div>
<div class="job-list">
<%= render partial: "job", collection: @jobs_list, as: :job %>
</div>
</div>
<% @jobs_of_cities.each do |city| %>
<div class="col-4">
<div class="row-table border border-dark rounded city-list">
<%= link_to '#' do %>
<div class="city-name"><strong><%= city.name %></strong></div>
<div class="count-job"><%= city.jobs.count %></div>
<% end %>
</div>
<div class="col-4">
<div class="row-table border border-dark rounded city-list">
<%= link_to '#' do %>
<div class="city-name"><strong><%= city.name %></strong></div>
<div class="count-job"><%= city.jobs.count %></div>
<% end %>
</div>
<% end %>
</div>
<% @jobs_of_industries.each do |industry| %>
<div class="col-4">
<div class="row-table border border-dark rounded industry-list">
<%= link_to '#' do %>
<div class="industry-name"><strong><%= industry.name %></strong></div>
<div class="count-job"><%= industry.jobs.count %></div>
<% end %>
</div>
<div class="col-4">
<div class="row-table border border-dark rounded industry-list">
<%= link_to '#' do %>
<div class="industry-name"><strong><%= industry.name %></strong></div>
<div class="count-job"><%= industry.jobs.count %></div>
<% end %>
</div>
<% end %>
</div>
<% @jobs.each do |job| %>
<% if job.cities.present? %>
<div class="border border-dark rounded">
<div class="job-details">
<div class="title"><strong><%= job.title %></strong></div>
<div><%= job.company_name %></div>
<div class="salary">Salary: <%= job.salary %></div>
<div>
<% job.cities.each do |city| %>
<%= city.name %>
<% end %>
<% if job.cities.present? %>
<div class="border border-dark rounded">
<div class="job-details">
<div class="title"><strong><%= job.title %></strong></div>
<div><%= job.company_name %></div>
<div class="salary">Salary: <%= job.salary %></div>
<div>
<% job.cities.each do |city| %>
<%= city.name %>
<% end %>
</div>
<div class="row">
<div class="col-10 introduction">
<%= job_description(job.description) %><br>
<%= link_to 'Read more..', '#'%>
</div>
<button type="button" class="btn btn-primary" id="button-follow">♥ Follow</button>
</div>
<button type="button" class="btn btn-primary" id="button-follow">♥ Follow</button>
</div>
<br>
<% end %>
</div>
<br>
<% end %>
......@@ -6,22 +6,30 @@
</div>
<div class="container">
<div class="search-bar"><%= render 'layouts/search_bar' %></div>
<div class="job-list"><%= render 'layouts/show_jobs' %></div>
<div class="search-bar">
<%= render 'layouts/search_bar' %>
</div>
<div class="job-list">
<%= render partial: "layouts/show_job", collection: @jobs, as: :job %>
</div>
<div class="city-banner rounded">City</div>
<div class="row"><%= render 'layouts/show_cities' %></div>
<div class="row">
<%= render partial: "layouts/show_city", collection: @jobs_of_cities, as: :city %>
</div>
<div class="all-city">
<%= link_to '#' do %>
<%= link_to cities_path do %>
<div class="row-table border border-dark rounded all-cities">
<strong>All Cities</strong>
</div>
<% end %>
</div>
<div class="industry-banner rounded">Industry</div>
<div class="row"><%= render 'layouts/show_industries' %></div>
<div class="row">
<%= render partial: "layouts/show_industry", collection: @jobs_of_industries, as: :industry %>
</div>
<div class="all-industry">
<%= link_to '#' do %>
<%= link_to industries_path do %>
<div class="row-table border border-dark rounded all-industries">
<strong>All Industries</strong>
</div>
......
class Crawler
VIETNAM = 0
FOREIGN = 1
def initialize(logger, url)
@logger = logger
@url = url
......@@ -17,14 +19,16 @@ class Crawler
page = Nokogiri::HTML(URI.open(@url))
get_name = page.search('select#location')
data_city = get_name.search('option').map(&:text).map(&:strip)
data_city.each do |name_city|
if City.find_by(id: 70)
city = City.create!(name: name_city,
location: 0)
city = City.find_or_create_by!(name: name_city) do
city.update!(location: VIETNAM)
end
else
city = City.create!(name: name_city,
location: 1)
city = City.find_or_create_by!(name: name_city) do
city.update!(location: FOREIGN)
end
end
end
end
......@@ -35,7 +39,7 @@ class Crawler
data_industry = get_name.search('option').map { |p| p.text.strip }
data_industry.each do |name_industry|
industry = Industry.create!(name: name_industry)
industry = Industry.find_or_create_by!(name: name_industry)
end
end
......@@ -43,15 +47,17 @@ class Crawler
def city_relationship(row, job)
location_relationship = row.css('div.map p a').children.map { |name_city| name_city.text.strip }
cities_relationship = City.where(name: location_relationship)
city_job_relationship = CityJob.where(job_id: job.id ,city_id: cities_relationship.ids)
job.cities << cities_relationship
job.cities << cities_relationship if city_job_relationship.blank?
end
def industry_relationship(row, job)
industry_relationship = row.css('li a').children.map { |name_industry| name_industry.text.strip }
industries_relationship = Industry.where(name: industry_relationship)
industry_job_relationship = IndustryJob.where(job_id: job.id, industry_id: industries_relationship.ids)
job.industries << industries_relationship
job.industries << industries_relationship if industry_job_relationship.blank?
end
def create_job(title, link_page, row, company)
......@@ -78,17 +84,17 @@ class Crawler
info = Nokogiri::HTML(URI.open("https://careerbuilder.vn/viec-lam/tat-ca-viec-lam-trang-#{n}-vi.html"))
links = info.css('div.caption a.company-name').map { |link| link['href'] }
links.each do |link|
next if link == 'javascript:void(0);'
begin
next if link == 'javascript:void(0);'
page = Nokogiri::HTML(URI.open(URI.escape(link)))
name = page.search('p.name')&.text
next if name.blank?
next if name.blank?
address = page.css('div.content p').children[1]&.text
introduction = page.css('div.main-about-us').text
begin
address = page.css('div.content p').children[1]&.text
introduction = page.css('div.main-about-us').text
Company.find_or_create_by!(name: name,
address: address,
introduction: introduction)
address: address,
introduction: introduction)
rescue StandardError => e
@logger.error e.message
end
......
......@@ -6,7 +6,6 @@ class CSVImporter
NAME_DOMAIN = '192.168.1.156'.freeze
FTP_USERNAME = 'training'.freeze
FTP_PASSWORD = 'training'.freeze
def initialize(logger)
@logger = logger
@extracting_directory = Rails.root.join('lib', 'csv')
......@@ -21,7 +20,7 @@ class CSVImporter
end
def get_file_csv
Net::FTP.open(NAME_DOMAIN, USERNAME_FTP, PASSWORD_FTP) do |ftp|
Net::FTP.open(NAME_DOMAIN, FTP_USERNAME, FTP_PASSWORD) do |ftp|
ftp.getbinaryfile('jobs.zip')
end
end
......@@ -41,6 +40,7 @@ class CSVImporter
begin
company_name = row["company name"]
next if company_name.blank?
company_address = row["company address"]
company_introduction = row["benefit"]
company = Company.find_or_create_by!(name: company_name,
......@@ -49,24 +49,34 @@ class CSVImporter
title_job = row["name"]
next if title_job.blank?
description_job = "#{row["description"]} #{row["requirement"]}"
level = row["level"]
salary = row["salary"]
job = Job.find_or_create_by!(title: title_job,
description: description_job,
level: level,
salary: salary,
company_id: company.id)
company_id: company_id)
industry_name = row["category"]
industries_relationship = Industry.where(name: industry_name)
next if industries_relationship.blank?
industry_job_relationship = IndustryJob.where(job_id: job.id, industry_id: industries_relationship.ids)
next if industry_job_relationship.present?
job.industries << industries_relationship
location_data = row["work place"]
location = location_data.gsub('["', '').gsub('"]', '')
location_relationship = City.where(name: location)
next if location_relationship.blank?
location_job_relationship = CityJob.where(job_id: job.id ,city_id: location_relationship.ids)
next if location_job_relationship.present?
job.cities << location_relationship
rescue StandardError => e
......
......@@ -35,15 +35,17 @@ class JobParser
def city_relationship(row, job)
location_relationship = row.css('div.map p a').children.map { |name_city| name_city.text.strip }
cities_relationship = City.where(name: location_relationship)
city_job_relationship = CityJob.where(job_id: job.id ,city_id: cities_relationship.ids)
job.cities << cities_relationship
job.cities << cities_relationship if city_job_relationship.blank?
end
def industry_relationship(row, job)
industry_relationship = row.css('li a').children.map { |name_industry| name_industry.text.strip }
industries_relationship = Industry.where(name: industry_relationship)
industry_job_relationship = IndustryJob.where(job_id: job.id, industry_id: industries_relationship.ids)
job.industries << industries_relationship
job.industries << industries_relationship if industry_job_relationship.blank?
end
def create_job(title, link_page, row, company)
......
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