├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── README.md ├── app ├── Console │ ├── Commands │ │ └── Crawler │ │ │ ├── MonitorCommand.php │ │ │ └── RunCommand.php │ └── Kernel.php ├── Enum │ └── BinaryEnum.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── Auth │ │ │ ├── ConfirmPasswordController.php │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── RegisterController.php │ │ │ ├── ResetPasswordController.php │ │ │ └── VerificationController.php │ │ ├── Controller.php │ │ ├── DashboardController.php │ │ └── HomeController.php │ ├── Kernel.php │ └── Middleware │ │ ├── Authenticate.php │ │ ├── CheckForMaintenanceMode.php │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── Sites │ ├── Simple │ │ └── SiteInfo.php │ └── SiteManager.php ├── Spider │ ├── AbstractLinkCollector.php │ ├── AbstractSpider.php │ ├── Browsers │ │ ├── BrowserInterface.php │ │ ├── BrowserManager.php │ │ ├── Guzzle.php │ │ ├── PhantomJsLocal.php │ │ └── Phantomjs │ │ │ ├── RenderWithJs.php │ │ │ └── get_html.js │ ├── Collectors │ │ ├── CrawlerHelper.php │ │ ├── DataCollectorInterface.php │ │ ├── LinkCollectorInterface.php │ │ ├── RuledDataCollector.php │ │ └── RuledLinkCollector.php │ ├── CrawlUrl.php │ ├── Entities │ │ ├── DataRule.php │ │ ├── Link.php │ │ ├── NavigationRule.php │ │ ├── Page.php │ │ └── Selector.php │ ├── Enum │ │ ├── ProcessStatus.php │ │ └── ProcessType.php │ ├── Exceptions │ │ ├── DataCanNotBeWritten.php │ │ ├── SitePageNotFound.php │ │ └── SpiderRunnerException.php │ ├── Monitor.php │ ├── QueueDrivers │ │ ├── CrawlQueueInterface.php │ │ └── SqliteQueue.php │ ├── SpiderFactory.php │ ├── SpiderRunner.php │ └── StorageDrivers │ │ ├── DataStorageInterface.php │ │ ├── FileStorage.php │ │ ├── MysqlStorage.php │ │ └── SqliteStorage.php └── User.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── browsers.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── livewire.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ └── 2019_08_19_000000_create_failed_jobs_table.php └── seeds │ └── DatabaseSeeder.php ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ └── app.css ├── favicon.ico ├── index.php ├── js │ ├── app.js │ └── app.js.LICENSE.txt ├── mix-manifest.json ├── robots.txt ├── vendor │ └── livewire │ │ ├── livewire.js │ │ ├── livewire.js.map │ │ └── manifest.json └── web.config ├── resources ├── js │ ├── app.js │ └── bootstrap.js ├── lang │ └── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php ├── sass │ ├── _variables.scss │ └── app.scss └── views │ ├── auth │ ├── login.blade.php │ ├── passwords │ │ ├── confirm.blade.php │ │ ├── email.blade.php │ │ └── reset.blade.php │ ├── register.blade.php │ └── verify.blade.php │ ├── dashboard │ └── index.blade.php │ ├── home.blade.php │ ├── layouts │ ├── app.blade.php │ └── master.blade.php │ └── welcome.blade.php ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── server.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── data │ └── itviec.com │ │ ├── 0067498478a6e87717c8d91c215f9961.json │ │ ├── 016e8ff9ae1a6d05cff3ea25cbca7c03.json │ │ ├── 017737c4d88cd7a1144acd0b52251826.json │ │ ├── 0ba00d10c40187c66d7d8ba4fe73bf7d.json │ │ ├── 16ede3130e54402c65e409d6ec2eb572.json │ │ ├── 190a6d483907d8826799b06497ba621a.json │ │ ├── 1aa98fe7b1dc0faf38b31b72703017c6.json │ │ ├── 1b63d9fe8b44f34fb9ade851ba76f205.json │ │ ├── 1bee58415ba758294cded32b26b586bf.json │ │ ├── 1fe9d1a035e9411a29fcd72dbc7582df.json │ │ ├── 204f06a7997f25abfefa005812ae2d64.json │ │ ├── 207ba9e81f05333d5b05b8abd1f251b1.json │ │ ├── 23c34a505dffedfa86362f0a6f5aa279.json │ │ ├── 24dae388eec04814cca3f98caf3e8318.json │ │ ├── 255b7ca35f0fc964fea617d6292d83aa.json │ │ ├── 25c9da1da6c1a78b9d333dd23d6b48d3.json │ │ ├── 28958aafbe9914613c437bba5463ae93.json │ │ ├── 2940d53e5cd90115ae8fd6c29b2badc9.json │ │ ├── 2b71be26215f0fe47b887667dcf6fada.json │ │ ├── 2be91372fc975da58b5bbd5c7fa9a890.json │ │ ├── 2d1a68f7a1d3bcd9eeb5f7221a4af82d.json │ │ ├── 2ed3b86de56e6472a3658b4eda3d2663.json │ │ ├── 3051daba0d3d4e72ee385edc27a74b41.json │ │ ├── 3055fc5b4938cbe37ddcfba779630a70.json │ │ ├── 337fbffe1f24bebd238cb5f978cf0ff0.json │ │ ├── 353a42781f20923cfe84dcbf9b174f84.json │ │ ├── 377baba21e23bcab3c776929d121d2ed.json │ │ ├── 3967b1c065b5f426b42945351f21184d.json │ │ ├── 3dedfafb0f58ded5b9c880e6ed7fc6c6.json │ │ ├── 3e7c4ddbddb3b0d187c4b0d287149618.json │ │ ├── 40a7cbbff19acf8797627756c51ff55d.json │ │ ├── 41867bea1ee01951b4a2faff6f816a80.json │ │ ├── 48fc50978bfefc4a7d34f51e335151f7.json │ │ ├── 4a03ebacb9e6f530c40a71cf31a02545.json │ │ ├── 512012223eebbccf718d39dcbd9dd866.json │ │ ├── 52827212da28c141587e89a5401bb0b6.json │ │ ├── 563afc0992a373b46b9d678a861f4455.json │ │ ├── 5b53bcd8648e1c4b4e42c0cc8d38255e.json │ │ ├── 5c24f9ca20843e76328886354ef07d93.json │ │ ├── 60a29c7b7c43f6595be8b250d93dce4b.json │ │ ├── 6164dab98b804c937161ee51e3332981.json │ │ ├── 621cbfb6e4177274ecd218e8426f6f1c.json │ │ ├── 62d00026f104cba935ad070158d60bc2.json │ │ ├── 67e3ecc07112a84ccdbf6496c15fb849.json │ │ ├── 6a5040e2635b1ed80d50be4f9fff0106.json │ │ ├── 6a6bced6b65b22961b2607f873a2d54a.json │ │ ├── 6b77279d222d48b45977852a83c8dd36.json │ │ ├── 74189ae4de0de1ed67cbb6c64d8cd571.json │ │ ├── 777cf5473853fb02094658953536428b.json │ │ ├── 78259175a24f23cb123ee352aa704300.json │ │ ├── 79bd1bb017ad86ea00eb2f594d8c98e6.json │ │ ├── 7b4bec2f12dbe2bd05b63b21143eeedc.json │ │ ├── 7bd11c6f2cb12e4858dca7c1ca9b266a.json │ │ ├── 7df729e2d9bdf4b7addede2b99f53d73.json │ │ ├── 8066330803a42579d91c74ec63499791.json │ │ ├── 823efdedf8df152d5058f43c7def223b.json │ │ ├── 8348960bb97b88c4af0409982931569d.json │ │ ├── 8363fd02f0c4789ca0c4a36a0be3b9e4.json │ │ ├── 84c1d7b4c0956408bb8cf523187944aa.json │ │ ├── 84f9901e8894566f56e49f8d1930aab3.json │ │ ├── 85ced71bf1f949670fd5b549dee87c80.json │ │ ├── 9128f31c48aa7c633b5cfe85c145a915.json │ │ ├── 91883e84b4005f606927cbd2e740f198.json │ │ ├── 932f26e7149454054c989d11eda649a3.json │ │ ├── 944c6f71feea0b3ce07a70202f060f03.json │ │ ├── 99087e14c00d60d8ab2909f49ea93308.json │ │ ├── 99ed687cef41c0eba224aca858cb0d25.json │ │ ├── 9a5c635b8d75de04c8cdb3c4565b3605.json │ │ ├── 9b1d4bc86832333e32d922167d81da32.json │ │ ├── a0cab719ac0cee12579cab58ff0cb9c3.json │ │ ├── a5ee5359584b2fe3532d9175f8fcd6cd.json │ │ ├── a65f21119d78df761018dc60d4ea1bf3.json │ │ ├── ad37e259f699c4f0d5e5bdc330b37c25.json │ │ ├── ae4d40d60e162f06593610b3ae5b6521.json │ │ ├── ae8834b0a04a066f20b4038b3b5ce71c.json │ │ ├── af35c904ac12e9f72d5b13703bc229fc.json │ │ ├── af6c90fe49aaef117b051fb50901c78f.json │ │ ├── af7acb9e8f7bb57e320d813716b569d4.json │ │ ├── b0226294785cbf62828b1ebc188f14d3.json │ │ ├── b11ecc7077ddbf106e05929808f68e66.json │ │ ├── b15727ec6fe2539d21353f8ab9ccc55c.json │ │ ├── b228fa40ae0bc12bfcd34e4ae9558181.json │ │ ├── b24f6d8bdfc0a6725f44821278bc57c4.json │ │ ├── b5ec797453f427bfc64c7c860fc84ab7.json │ │ ├── b8f9562b62007baa32f5de67d32297a8.json │ │ ├── baec8f3aed7dd8b1f3468f602cbd1c76.json │ │ ├── bb9a612eb6e0280eeeb00e93cf399921.json │ │ ├── bc91875633ce6a111b9649b9b83a3bfa.json │ │ ├── c1bccde4caea99480121b5d25009c4e3.json │ │ ├── c6114643348dfc5e6793921e45c98a31.json │ │ ├── c789d299288a4e86c5a08464a67e4809.json │ │ ├── c7a9768216a87fe8b3f3733527aa7093.json │ │ ├── c9b41879a74d92200c3702cfee324212.json │ │ ├── c9f3fbbd944fc580476bc5b92dbe69e6.json │ │ ├── ca00bf41ab1c18c7d24d9a8411d281af.json │ │ ├── caed4823bb1ba78e102774dbee15e9d5.json │ │ ├── cbb29525625b713653f5ba9efe0e1b22.json │ │ ├── cf1eeccd70b9a6adc1e215a2e9b5849a.json │ │ ├── d0bb1db688dfdd16f269fe62022d3fc6.json │ │ ├── d4fe03ded1de2cbee0fd1a43f3303e63.json │ │ ├── d54e8a4089133c81709d896f7e9ca2bc.json │ │ ├── d79369ae4755cc0d8d051d46798868ea.json │ │ ├── d8b308c6b6e93360bf3cfa9b5faa60bc.json │ │ ├── dc44440cfd51606df8dfb4c2afde7579.json │ │ ├── dd7f2317429bba67ed514b34b3f4c96c.json │ │ ├── de3084f6f33843986ae60e8b4fb76ebb.json │ │ ├── de856874a54f5412ca861c1a1605fb54.json │ │ ├── e27faffca9c0d2bc33c80b354f99d8ed.json │ │ ├── e2e2ac0b00911859e5d316f992afb41a.json │ │ ├── e2e791f920f616052dd49838459bb811.json │ │ ├── e2fc0ded4db2da64d65ca313ca867ecf.json │ │ ├── e724b2374120a30687216177f785b05e.json │ │ ├── e73053768ee64fb2b0754956b29c7a66.json │ │ ├── e8555cdd3cb5479c9ce0e46f1d8ef2b9.json │ │ ├── e881f40e1237c58a95f7e28695787244.json │ │ ├── e98c77e92f7139490621f0dcb8c03091.json │ │ ├── ea8a76f5649facfa96c30549efe551e6.json │ │ ├── eb0afea5ef6527ae71034cf65fa9e4fb.json │ │ ├── ecff331d9c1fbb8ec3d30402321f1870.json │ │ ├── ee9c1553a33f5379ceeadf0ca55209d0.json │ │ ├── f008552524cb5f03f3dabed63f8e19d6.json │ │ ├── f05dd2f4e131653a509c01161d645e4c.json │ │ ├── f0ff270b6a9744a3e55d84172fe3ea7e.json │ │ ├── f13f6e56eefa67086f53dd4eab4f4287.json │ │ ├── f2997424d3aa7d63fca9ec63806332c8.json │ │ ├── f6a3077ecb47b331de9c654f2ed8a134.json │ │ ├── f787f142a26d819bb075c3a6c5ac5146.json │ │ ├── fb2b77ecb81cbb8ec42ea298a2e05f7d.json │ │ ├── fd82672db96ed4fff54cb130335cdb47.json │ │ ├── ff5882f1ba95b521fd8b317ca1fabfd8.json │ │ └── ff9222a0695e095751e78eba9d89fc91.json ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore ├── itviec.com.sqlite └── logs │ └── .gitignore ├── tailwind.config.js ├── tests ├── CreatesApplication.php ├── TestCase.php └── Unit │ └── CrawlUrlTest.php └── webpack.mix.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=laravel 13 | DB_USERNAME=root 14 | DB_PASSWORD= 15 | 16 | BROADCAST_DRIVER=log 17 | CACHE_DRIVER=file 18 | QUEUE_CONNECTION=sync 19 | SESSION_DRIVER=file 20 | SESSION_LIFETIME=120 21 | 22 | REDIS_HOST=127.0.0.1 23 | REDIS_PASSWORD=null 24 | REDIS_PORT=6379 25 | 26 | MAIL_MAILER=smtp 27 | MAIL_HOST=smtp.mailtrap.io 28 | MAIL_PORT=2525 29 | MAIL_USERNAME=null 30 | MAIL_PASSWORD=null 31 | MAIL_ENCRYPTION=null 32 | MAIL_FROM_ADDRESS=null 33 | MAIL_FROM_NAME="${APP_NAME}" 34 | 35 | AWS_ACCESS_KEY_ID= 36 | AWS_SECRET_ACCESS_KEY= 37 | AWS_DEFAULT_REGION=us-east-1 38 | AWS_BUCKET= 39 | 40 | PUSHER_APP_ID= 41 | PUSHER_APP_KEY= 42 | PUSHER_APP_SECRET= 43 | PUSHER_APP_CLUSTER=mt1 44 | 45 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 46 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 47 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .env.backup 8 | .phpunit.result.cache 9 | Homestead.json 10 | Homestead.yaml 11 | npm-debug.log 12 | yarn-error.log 13 | /.idea -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - unused_use 5 | finder: 6 | not-name: 7 | - index.php 8 | - server.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Crawler v4 2 | 3 | 4 | 5 | Crawl link and data by rules : 6 | 7 | ```php 8 | // Define pages 9 | $root = new Page( 'root', 'https://itviec.com/it-jobs/php', true ); 10 | $detail = new Page( 'detail', 'https://itviec.com/it-jobs/php-developers-mysql-net-trung-tam-bao-hanh-dell-tai-viet-nam-digipro-1424' ); 11 | $company = new Page( "company", 'https://itviec.com/companies/relia-systems?utm_campaign=gsn_brand&utm_medium=key_cpc&utm_source=google%2Fha-noi', false ); 12 | 13 | // Define get data rules 14 | $company->addDataRule( new DataRule( "company_name", new Selector( "css", "div.name-and-info h1"))); 15 | $company->addDataRule( new DataRule( "company_location", new Selector( "css", "div.name-and-info span"))); 16 | $company->addDataRule( new DataRule( "company_logo", new Selector( "css", "div.headers .logo img"), DataRule::TYPE_ATTRIBUTE, 'data-src')); 17 | 18 | // Define Navigation rules 19 | $root->goTo( 20 | $detail, 21 | Selector::css("#jobs h2", true ) 22 | ); 23 | $root->goTo( 24 | $root, 25 | Selector::css( "#show_more .more-jobs-link", 'link' ) 26 | ); 27 | $detail->goTo( $company, Selector::xpath( "//div[@class='side_bar']//a[text()='View our company page']")); 28 | 29 | 30 | // Add to site 31 | $this->pages[ $root->name ] = $root; 32 | $this->pages[ $detail->name ] = $detail; 33 | $this->pages[ $company->name ] = $company; 34 | ``` -------------------------------------------------------------------------------- /app/Console/Commands/Crawler/MonitorCommand.php: -------------------------------------------------------------------------------- 1 | info( "Getting Children:"); 50 | /** @var Paginator $running_pages */ 51 | $running_pages = $queue->paginate('link', ProcessStatus::PROCESSING, 1, 5); 52 | $this->table( [ "visited", "url" ], $running_pages->map(function ($item, $key) { 53 | return [$item->visited, $item->url]; 54 | })->toArray()); 55 | $this->info( "Getting Data:"); 56 | /** @var Paginator $running_pages */ 57 | $running_pages = $queue->paginate('data', ProcessStatus::PROCESSING, 1, 5); 58 | $this->table( [ "visited", "url" ], $running_pages->map(function ($item, $key) { 59 | return [$item->visited, $item->url]; 60 | })->toArray()); 61 | sleep( 1); 62 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 63 | system('cls'); 64 | } else { 65 | system('clear'); 66 | } 67 | goto get_data; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/Console/Commands/Crawler/RunCommand.php: -------------------------------------------------------------------------------- 1 | 1, all processing task before x minutes from now will be reset}'; 25 | 26 | /** 27 | * The console command description. 28 | * 29 | * @var string 30 | */ 31 | protected $description = 'Run crawl a site'; 32 | 33 | /** 34 | * Create a new command instance. 35 | * 36 | * @return void 37 | */ 38 | public function __construct() 39 | { 40 | parent::__construct(); 41 | } 42 | 43 | /** 44 | * Execute the console command. 45 | * 46 | * @return mixed 47 | */ 48 | public function handle() 49 | { 50 | $site = new SiteInfo( 'itviec.com'); 51 | $db_file = storage_path("itviec.com.sqlite"); 52 | $queue = new SqliteQueue($db_file, 'itviec.com'); 53 | $data_storage = new FileStorage( 54 | new Filesystem( 55 | new Local( 56 | storage_path("data/itviec.com/") 57 | ) 58 | ) 59 | ); 60 | 61 | $mode = $this->option("mode"); 62 | 63 | if($this->option('reset')){ 64 | $queue->reset(); 65 | } 66 | 67 | $resume = $this->option('resume'); 68 | switch ($resume){ 69 | case 0: 70 | break; 71 | case 1: 72 | if($mode == 'all'){ 73 | $queue->resume( 'link'); 74 | $queue->resume( 'data'); 75 | }elseif ($mode){ 76 | $queue->resume( $mode); 77 | } 78 | break; 79 | default: 80 | if($mode == 'all'){ 81 | $queue->resume( 'link', (int)$resume); 82 | $queue->resume( 'data', (int)$resume); 83 | }elseif ($mode){ 84 | $queue->resume( $mode, (int)$resume); 85 | } 86 | } 87 | 88 | $spider = new SpiderRunner( $site, $data_storage, $queue ); 89 | $spider->crawl_init(); 90 | 91 | switch ($mode){ 92 | case "all": 93 | $spider->run_crawl_links(true); 94 | break; 95 | case "link": 96 | $spider->run_crawl_links(); 97 | break; 98 | case "data": 99 | $spider->run_get_data(); 100 | break; 101 | } 102 | // dd($queue->paginate()); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 28 | } 29 | 30 | /** 31 | * Register the commands for the application. 32 | * 33 | * @return void 34 | */ 35 | protected function commands() 36 | { 37 | $this->load(__DIR__.'/Commands'); 38 | 39 | require base_path('routes/console.php'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Enum/BinaryEnum.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 42 | } 43 | 44 | /** 45 | * Get a validator for an incoming registration request. 46 | * 47 | * @param array $data 48 | * @return \Illuminate\Contracts\Validation\Validator 49 | */ 50 | protected function validator(array $data) 51 | { 52 | return Validator::make($data, [ 53 | 'name' => ['required', 'string', 'max:255'], 54 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 55 | 'password' => ['required', 'string', 'min:8', 'confirmed'], 56 | ]); 57 | } 58 | 59 | /** 60 | * Create a new user instance after a valid registration. 61 | * 62 | * @param array $data 63 | * @return \App\User 64 | */ 65 | protected function create(array $data) 66 | { 67 | return User::create([ 68 | 'name' => $data['name'], 69 | 'email' => $data['email'], 70 | 'password' => Hash::make($data['password']), 71 | ]); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | $this->middleware('signed')->only('verify'); 40 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 17 | } 18 | 19 | /** 20 | * Show the application dashboard. 21 | * 22 | * @return \Illuminate\Contracts\Support\Renderable 23 | */ 24 | public function index() 25 | { 26 | return view('home'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 32 | \App\Http\Middleware\EncryptCookies::class, 33 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 34 | \Illuminate\Session\Middleware\StartSession::class, 35 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 36 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 | \App\Http\Middleware\VerifyCsrfToken::class, 38 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 | ], 40 | 41 | 'api' => [ 42 | 'throttle:60,1', 43 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 44 | ], 45 | ]; 46 | 47 | /** 48 | * The application's route middleware. 49 | * 50 | * These middleware may be assigned to groups or used individually. 51 | * 52 | * @var array 53 | */ 54 | protected $routeMiddleware = [ 55 | 'auth' => \App\Http\Middleware\Authenticate::class, 56 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 57 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 58 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 59 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 60 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 61 | 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 62 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 63 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 64 | 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 65 | ]; 66 | } 67 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/CheckForMaintenanceMode.php: -------------------------------------------------------------------------------- 1 | check()) { 22 | return redirect(RouteServiceProvider::HOME); 23 | } 24 | 25 | return $next($request); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | * 26 | * @return void 27 | */ 28 | public function boot() 29 | { 30 | parent::boot(); 31 | 32 | // 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 46 | 47 | $this->mapWebRoutes(); 48 | 49 | // 50 | } 51 | 52 | /** 53 | * Define the "web" routes for the application. 54 | * 55 | * These routes all receive session state, CSRF protection, etc. 56 | * 57 | * @return void 58 | */ 59 | protected function mapWebRoutes() 60 | { 61 | Route::middleware('web') 62 | ->namespace($this->namespace) 63 | ->group(base_path('routes/web.php')); 64 | } 65 | 66 | /** 67 | * Define the "api" routes for the application. 68 | * 69 | * These routes are typically stateless. 70 | * 71 | * @return void 72 | */ 73 | protected function mapApiRoutes() 74 | { 75 | Route::prefix('api') 76 | ->middleware('api') 77 | ->namespace($this->namespace) 78 | ->group(base_path('routes/api.php')); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/Sites/Simple/SiteInfo.php: -------------------------------------------------------------------------------- 1 | name = $name; 30 | $this->init_pages(); 31 | } 32 | 33 | protected function init_pages() { 34 | 35 | // Define pages 36 | $root = new Page( 'root', 'https://itviec.com/it-jobs/php', true ); 37 | $detail = new Page( 'detail', 'https://itviec.com/it-jobs/php-developers-mysql-net-trung-tam-bao-hanh-dell-tai-viet-nam-digipro-1424' ); 38 | $company = new Page( "company", 'https://itviec.com/companies/relia-systems?utm_campaign=gsn_brand&utm_medium=key_cpc&utm_source=google%2Fha-noi', false ); 39 | 40 | // Define get data rules 41 | $company->addDataRule( new DataRule( "company_name", new Selector( "css", "div.name-and-info h1"))); 42 | $company->addDataRule( new DataRule( "company_location", new Selector( "css", "div.name-and-info span"))); 43 | $company->addDataRule( new DataRule( "company_logo", new Selector( "css", "div.headers .logo img"), DataRule::TYPE_ATTRIBUTE, 'data-src')); 44 | 45 | // Define Navigation rules 46 | $root->goTo( 47 | $detail, 48 | Selector::css("#jobs h2", true ) 49 | ); 50 | $root->goTo( 51 | $root, 52 | Selector::css( "#show_more .more-jobs-link", 'link' ) 53 | ); 54 | $detail->goTo( $company, Selector::xpath( "//div[@class='side_bar']//a[text()='View our company page']")); 55 | 56 | 57 | // Add to site 58 | $this->pages[ $root->name ] = $root; 59 | $this->pages[ $detail->name ] = $detail; 60 | $this->pages[ $company->name ] = $company; 61 | } 62 | 63 | public function getPages() { 64 | return $this->pages; 65 | } 66 | 67 | public function getPage( $name ): ?Page { 68 | if ( isset( $this->pages[ $name ] ) ) { 69 | return $this->pages[ $name ]; 70 | } 71 | 72 | return null; 73 | } 74 | 75 | public function getName() { 76 | return $this->name; 77 | } 78 | 79 | public function getDelay(){ 80 | return $this->delay; 81 | } 82 | 83 | } -------------------------------------------------------------------------------- /app/Sites/SiteManager.php: -------------------------------------------------------------------------------- 1 | SiteInfo::class, 18 | ]; 19 | 20 | } -------------------------------------------------------------------------------- /app/Spider/AbstractLinkCollector.php: -------------------------------------------------------------------------------- 1 | home = $home; 36 | } 37 | 38 | public function setQueue(CrawlQueueInterface $queue){ 39 | $this->queue = $queue; 40 | return $this; 41 | } 42 | public function getQueue(){ 43 | return $this->queue; 44 | } 45 | 46 | public function setLinkCollector(LinkCollectorInterface $linkCollector){ 47 | $this->link_collector = $linkCollector; 48 | return $this; 49 | } 50 | public function getLinkCollector(){ 51 | return $this->link_collector; 52 | } 53 | 54 | public function setDataCollector(DataCollectorInterface $dataCollector){ 55 | $this->data_collector = $dataCollector; 56 | return $this; 57 | } 58 | public function getDataCollector(){ 59 | return $this->data_collector; 60 | } 61 | 62 | /** 63 | * @param bool $get_data get data after get link 64 | */ 65 | public function runLinkCollector($get_data = false){ 66 | 67 | } 68 | 69 | /** 70 | * Get data 71 | */ 72 | public function runDataCollector(){ 73 | 74 | } 75 | 76 | } -------------------------------------------------------------------------------- /app/Spider/Browsers/BrowserInterface.php: -------------------------------------------------------------------------------- 1 | client = $client; 26 | }else{ 27 | $this->client = new Client(); 28 | } 29 | } 30 | 31 | 32 | public function getHtml( $url ) { 33 | $response = $this->client->get( $url ); 34 | return $response->getBody()->getContents(); 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/Spider/Browsers/PhantomJsLocal.php: -------------------------------------------------------------------------------- 1 | setTimeout( $timeout ); 32 | return $process; 33 | } 34 | 35 | public function getHtml($url){ 36 | $command = [self::$bin, self::$js, $url]; 37 | $this->run( $command ); 38 | $output = $this->output(); 39 | $result = \GuzzleHttp\json_decode( $output, true); 40 | return $result; 41 | } 42 | 43 | public static function render($url){ 44 | $renderer = new self(); 45 | return $renderer->getHtml( $url); 46 | } 47 | 48 | protected function run($command) 49 | { 50 | $this->command = $command; //escapeshellcmd($command); 51 | $this->process = $this->getProcess( $this->command, self::$timeout); 52 | $this->process->run(); 53 | $this->validateRun(); 54 | 55 | return $this; 56 | } 57 | 58 | protected function validateRun() 59 | { 60 | $status = $this->process->getExitCode(); 61 | $error = $this->process->getErrorOutput(); 62 | 63 | if ($status !== 0 and $error !== '') { 64 | throw new \RuntimeException( 65 | sprintf( 66 | "The exit status code %s says something went wrong:\n stderr: %s\n stdout: %s\ncommand: %s.", 67 | $status, 68 | $error, 69 | $this->process->getOutput(), 70 | $this->process->getCommandLine() 71 | ) 72 | ); 73 | } 74 | } 75 | 76 | protected function output() 77 | { 78 | return $this->process->getOutput(); 79 | } 80 | } -------------------------------------------------------------------------------- /app/Spider/Browsers/Phantomjs/get_html.js: -------------------------------------------------------------------------------- 1 | var page = require('webpage').create(), 2 | system = require('system'),address; 3 | 4 | address = system.args[1]; 5 | var headers = []; 6 | var errors = []; 7 | var last_url = ''; 8 | var last_code = 0; 9 | 10 | page.onError = function (msg, trace) { 11 | errors.push(msg); 12 | } 13 | 14 | page.settings.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"; 15 | page.settings.loadImages = false; 16 | 17 | page.onResourceReceived = function(response) { 18 | // console.log(response.url, address); 19 | // console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response)); 20 | // if (address.replace(/\/$/, "") === response.url.replace(/\/$/, "")){ 21 | // console.log(response.url); 22 | // } 23 | if (response.url === last_url){ 24 | headers = response.headers; 25 | last_code = response.status; 26 | } 27 | }; 28 | 29 | page.onNavigationRequested = function(url, type, willNavigate, main) { 30 | last_url = url; 31 | last_code = response.status; 32 | }; 33 | 34 | page.open(address, function(status) { 35 | var response = { 36 | headers : parseHeader(headers), 37 | status : last_code, 38 | status_text : status, 39 | url : last_url, 40 | errors : errors, 41 | html: "" 42 | }; 43 | // console.log(JSON.stringify(response)); 44 | if (status === 'success') { 45 | response.html = page.evaluate(function() { 46 | return document.documentElement.innerHTML; 47 | }); 48 | } 49 | console.log(JSON.stringify(response)); 50 | phantom.exit(); 51 | }); 52 | 53 | function parseHeader(headers) { 54 | var max_i = headers.length, _headers = {}; 55 | for (var i = 0; i < max_i; i++ ){ 56 | _headers[headers[i].name] = headers[i].value; 57 | } 58 | return _headers; 59 | } -------------------------------------------------------------------------------- /app/Spider/Collectors/CrawlerHelper.php: -------------------------------------------------------------------------------- 1 | type == 'css' ) { 20 | $elm = $crawler->filter( $selector->content ); 21 | } elseif ( $selector->type == 'xpath' ) { 22 | $elm = $crawler->filterXPath( $selector->content ); 23 | } 24 | 25 | return $elm; 26 | } catch ( \Exception $ex ) { 27 | 28 | } 29 | 30 | return null; 31 | } 32 | 33 | protected function getDomNodeLinkInfo( \DOMNode $a ): ?Link { 34 | 35 | $link = new Link(); 36 | 37 | try { 38 | if ( $a->nodeName == 'iframe' ) { 39 | $link->href = $this->safeGetNodeValue( $a, 'src' ); 40 | } else { 41 | $link->href = $this->safeGetNodeValue( $a, 'href' ); 42 | $link->title = $this->safeGetNodeValue( $a, 'title' ); 43 | $link->text = $a->textContent; 44 | } 45 | } catch ( \Exception $ex ) { 46 | } 47 | 48 | if ( $link->href == '#' || ! $link->href || $link->href == 'javascript:void(0);' ) { 49 | $onclick = $this->safeGetNodeValue( $a, 'onclick' ); 50 | $matches = []; 51 | $matched = preg_match( '/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i', $onclick, $matches ); 52 | if ( $matched ) { 53 | $link->href = $matches[0]; 54 | } 55 | } 56 | 57 | $link->href = trim( $link->href ); 58 | 59 | return $link->href ? $link : null; 60 | 61 | } 62 | 63 | protected function safeGetNodeValue( \DOMNode $node, $attribute ) { 64 | if ( $nodeItem = $node->attributes->getNamedItem( $attribute ) ) { 65 | return $nodeItem->nodeValue; 66 | } else { 67 | return null; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /app/Spider/Collectors/DataCollectorInterface.php: -------------------------------------------------------------------------------- 1 | getPage( $crawlUrl->getStep() ); 23 | if ( $page ) { 24 | $rules = $page->data_rules; 25 | /** @var DataRule $rule */ 26 | foreach ( $rules as $rule ) { 27 | $data[ $rule->name ] = $this->getPageData( $crawlUrl, $rule ); 28 | } 29 | } 30 | return $data; 31 | } 32 | 33 | protected function getPageData( CrawlUrl $crawlUrl, DataRule $rule ) { 34 | $element = $this->getElements( $crawlUrl->getHtml(), $rule->selector ); 35 | if ( $element ) { 36 | switch ( $rule->type ) { 37 | case DataRule::TYPE_TEXT: 38 | return $element->text(); 39 | break; 40 | case DataRule::TYPE_HTML: 41 | return $element->html(); 42 | break; 43 | case DataRule::TYPE_URL: 44 | if($element->nodeName() == 'a'){ 45 | return $element->attr('href'); 46 | }elseif($element->nodeName() == 'img'){ 47 | return $element->attr('src'); 48 | } 49 | break; 50 | case DataRule::TYPE_ATTRIBUTE: 51 | return $element->attr($rule->what); 52 | break; 53 | } 54 | } 55 | return null; 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /app/Spider/Collectors/RuledLinkCollector.php: -------------------------------------------------------------------------------- 1 | getHtml() ) { 36 | return $children; 37 | } 38 | try { 39 | $elms = $this->getElements( $crawlUrl->getHtml(), $selector ); 40 | if ( $elms->nodeName() != "a" ) { 41 | $elms = $this->getElements( $elms, new Selector( "css", "a" ) ); 42 | } 43 | foreach ( $elms as $elm ) { 44 | if ( $link = $this->getDomNodeLinkInfo( $elm ) ) { 45 | $link->href = CrawlUrl::join( $crawlUrl->getUrl(), $link->href ); 46 | $children->add( $link ); 47 | } 48 | } 49 | } catch ( \Exception $ex ) { 50 | 51 | } 52 | if($selector->multiple == false && $children->count() > 1){ 53 | return $children->slice( 0, 1); 54 | }else{ 55 | return $children; 56 | } 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /app/Spider/Entities/DataRule.php: -------------------------------------------------------------------------------- 1 | name = $name; 36 | $this->type = $type; 37 | $this->selector = $selector; 38 | $this->what = $what; 39 | } 40 | 41 | 42 | } -------------------------------------------------------------------------------- /app/Spider/Entities/Link.php: -------------------------------------------------------------------------------- 1 | type = $type; 30 | $this->selector = $selector; 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/Spider/Entities/Page.php: -------------------------------------------------------------------------------- 1 | name = $name; 33 | $this->is_root = $is_root; 34 | $this->url = $url; 35 | $this->js = $js; 36 | foreach ($navigation_rules as $page => $rule){ 37 | $this->addNavigationRule( $page, $rule ); 38 | } 39 | foreach ($data_rules as $rule){ 40 | $this->addDataRule( $rule ); 41 | } 42 | } 43 | 44 | //////// Navigation rules manipulate 45 | 46 | /** 47 | * @param Page|string $page 48 | * @param NavigationRule $rule 49 | * 50 | * @return $this 51 | */ 52 | public function addNavigationRule($page, NavigationRule $rule){ 53 | if($page instanceof Page){ 54 | $page = $page->name; 55 | } 56 | $this->navigation_rules[$page] = $rule; 57 | return $this; 58 | } 59 | 60 | /** 61 | * @param Page|string $page 62 | * @param NavigationRule|Selector $rule 63 | * 64 | * @return Page 65 | */ 66 | public function goTo($page, $rule){ 67 | if($rule instanceof Selector){ 68 | $rule = new NavigationRule( $rule ); 69 | } 70 | return $this->addNavigationRule( $page, $rule); 71 | } 72 | 73 | public function removeNavigationRule($page){ 74 | if($page instanceof Page){ 75 | $page = $page->name; 76 | } 77 | unset( $this->navigation_rules[$page] ); 78 | return $this; 79 | } 80 | 81 | public function getNavigationRules(){ 82 | return $this->navigation_rules; 83 | } 84 | 85 | public function emptyNavigationRules(){ 86 | $this->navigation_rules = []; 87 | return $this; 88 | } 89 | 90 | //////// Data rules manipulate 91 | 92 | public function addDataRule(DataRule $rule){ 93 | $this->data_rules[$rule->name] = $rule; 94 | return $this; 95 | } 96 | 97 | public function removeDataRule(DataRule $rule){ 98 | unset( $this->data_rules[$rule->name] ); 99 | return $this; 100 | } 101 | 102 | public function emptyDataRules(){ 103 | $this->data_rules = []; 104 | return $this; 105 | } 106 | 107 | 108 | 109 | } -------------------------------------------------------------------------------- /app/Spider/Entities/Selector.php: -------------------------------------------------------------------------------- 1 | type = $type; 30 | $this->content = $content; 31 | $this->multiple = $multiple; 32 | } 33 | 34 | public static function css($content, $multiple = false){ 35 | return new self(self::TYPE_CSS, $content, $multiple); 36 | } 37 | 38 | public static function xpath($content, $multiple = false){ 39 | return new self(self::TYPE_XPATH, $content, $multiple); 40 | } 41 | 42 | /** 43 | * Kiểm tra selector hiện tại có đạt chuẩn ko 44 | * @return bool 45 | */ 46 | public function isValid() : bool { 47 | return true; 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /app/Spider/Enum/ProcessStatus.php: -------------------------------------------------------------------------------- 1 | filesystem = $filesystem; 34 | } 35 | 36 | /** 37 | * @param array $data 38 | * @param CrawlUrl $crawlUrl 39 | * @param SiteInfo|string $mode 40 | * @param SiteInfo|null $siteInfo 41 | * 42 | * @return bool 43 | * @throws DataCanNotBeWritten 44 | */ 45 | public function store( array $data, CrawlUrl $crawlUrl, $mode = DataStorageInterface::SAVE_MERGE,SiteInfo $siteInfo = null ): bool { 46 | 47 | if($mode != DataStorageInterface::SAVE_MERGE){ 48 | $path = $this->makePath( $crawlUrl ); 49 | try{ 50 | if($mode == DataStorageInterface::SAVE_NORMAL){ 51 | return $this->filesystem->write( $path, json_encode( $data, JSON_PRETTY_PRINT ) ); 52 | }else{ 53 | return $this->filesystem->put( $path, json_encode( $data, JSON_PRETTY_PRINT ) ); 54 | } 55 | }catch (FileExistsException $ex){ 56 | throw new DataCanNotBeWritten($ex->getMessage()); 57 | } 58 | } 59 | 60 | $existed = $this->get( $crawlUrl, $siteInfo); 61 | $data = array_merge( $existed, $data ); 62 | $path = $this->makePath( $crawlUrl ); 63 | return $this->filesystem->put( $path, json_encode( $data, JSON_PRETTY_PRINT ) ); 64 | 65 | } 66 | 67 | public function get( CrawlUrl $crawlUrl, SiteInfo $siteInfo = null ): array { 68 | $path = $this->makePath( $crawlUrl ); 69 | try{ 70 | $data = $this->filesystem->read( $path ); 71 | return json_decode( $data, true ); 72 | }catch (FileNotFoundException $ex){ 73 | return []; 74 | } 75 | } 76 | 77 | protected function makePath(CrawlUrl $crawlUrl){ 78 | return $crawlUrl->getUrlHash() . ".json"; 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /app/Spider/StorageDrivers/MysqlStorage.php: -------------------------------------------------------------------------------- 1 | 'datetime', 38 | ]; 39 | } 40 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The Laravel Framework.", 5 | "keywords": [ 6 | "framework", 7 | "laravel" 8 | ], 9 | "license": "MIT", 10 | "require": { 11 | "php": "^7.2.5", 12 | "ext-pdo": "*", 13 | "avto-dev/roadrunner-laravel": "^3.1", 14 | "fideloper/proxy": "^4.2", 15 | "fruitcake/laravel-cors": "^1.0", 16 | "guzzlehttp/guzzle": "^6.3", 17 | "laravel/framework": "^7.0", 18 | "laravel/tinker": "^2.0", 19 | "laravel/ui": "^2.0", 20 | "league/uri": "^6.2", 21 | "livewire/livewire": "^1.0", 22 | "marcin-orlowski/laravel-api-response-builder": "^7.1", 23 | "myclabs/php-enum": "^1.7", 24 | "spatie/data-transfer-object": "^1.13", 25 | "symfony/css-selector": "^5.0", 26 | "symfony/dom-crawler": "^5.0", 27 | "ext-dom": "*", 28 | "ext-json": "*" 29 | }, 30 | "require-dev": { 31 | "facade/ignition": "^2.0", 32 | "fzaninotto/faker": "^1.9.1", 33 | "mockery/mockery": "^1.3.1", 34 | "nunomaduro/collision": "^4.1", 35 | "phpunit/phpunit": "^8.5" 36 | }, 37 | "config": { 38 | "optimize-autoloader": true, 39 | "preferred-install": "dist", 40 | "sort-packages": true 41 | }, 42 | "extra": { 43 | "laravel": { 44 | "dont-discover": [] 45 | } 46 | }, 47 | "autoload": { 48 | "psr-4": { 49 | "App\\": "app/" 50 | }, 51 | "classmap": [ 52 | "database/seeds", 53 | "database/factories" 54 | ] 55 | }, 56 | "autoload-dev": { 57 | "psr-4": { 58 | "Tests\\": "tests/" 59 | } 60 | }, 61 | "minimum-stability": "dev", 62 | "prefer-stable": true, 63 | "scripts": { 64 | "post-autoload-dump": [ 65 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 66 | "@php artisan package:discover --ansi" 67 | ], 68 | "post-root-package-install": [ 69 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 70 | ], 71 | "post-create-project-cmd": [ 72 | "@php artisan key:generate --ansi" 73 | ] 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => 'web', 18 | 'passwords' => 'users', 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | here which uses session storage and the Eloquent user provider. 29 | | 30 | | All authentication drivers have a user provider. This defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | mechanisms used by this application to persist your user's data. 33 | | 34 | | Supported: "session", "token" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | 44 | 'api' => [ 45 | 'driver' => 'token', 46 | 'provider' => 'users', 47 | 'hash' => false, 48 | ], 49 | ], 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | User Providers 54 | |-------------------------------------------------------------------------- 55 | | 56 | | All authentication drivers have a user provider. This defines how the 57 | | users are actually retrieved out of your database or other storage 58 | | mechanisms used by this application to persist your user's data. 59 | | 60 | | If you have multiple user tables or models you may configure multiple 61 | | sources which represent each model / table. These sources may then 62 | | be assigned to any extra authentication guards you have defined. 63 | | 64 | | Supported: "database", "eloquent" 65 | | 66 | */ 67 | 68 | 'providers' => [ 69 | 'users' => [ 70 | 'driver' => 'eloquent', 71 | 'model' => App\User::class, 72 | ], 73 | 74 | // 'users' => [ 75 | // 'driver' => 'database', 76 | // 'table' => 'users', 77 | // ], 78 | ], 79 | 80 | /* 81 | |-------------------------------------------------------------------------- 82 | | Resetting Passwords 83 | |-------------------------------------------------------------------------- 84 | | 85 | | You may specify multiple password reset configurations if you have more 86 | | than one user table or model in the application and you want to have 87 | | separate password reset settings based on the specific user types. 88 | | 89 | | The expire time is the number of minutes that the reset token should be 90 | | considered valid. This security feature keeps tokens short-lived so 91 | | they have less time to be guessed. You may change this as needed. 92 | | 93 | */ 94 | 95 | 'passwords' => [ 96 | 'users' => [ 97 | 'provider' => 'users', 98 | 'table' => 'password_resets', 99 | 'expire' => 60, 100 | 'throttle' => 60, 101 | ], 102 | ], 103 | 104 | /* 105 | |-------------------------------------------------------------------------- 106 | | Password Confirmation Timeout 107 | |-------------------------------------------------------------------------- 108 | | 109 | | Here you may define the amount of seconds before a password confirmation 110 | | times out and the user is prompted to re-enter their password via the 111 | | confirmation screen. By default, the timeout lasts for three hours. 112 | | 113 | */ 114 | 115 | 'password_timeout' => 10800, 116 | 117 | ]; 118 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'useTLS' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /config/browsers.php: -------------------------------------------------------------------------------- 1 | [ 12 | 'guzzle' => [ 13 | 14 | ], 15 | 'phantomjs' => [ 16 | 'bin' => env('BIN_PHANTOMJS', 'phantomjs'), 17 | ] 18 | ] 19 | ]; -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Cache Stores 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Here you may define all of the cache "stores" for your application as 29 | | well as their drivers. You may even define multiple stores for the 30 | | same cache driver to group types of items stored in your caches. 31 | | 32 | */ 33 | 34 | 'stores' => [ 35 | 36 | 'apc' => [ 37 | 'driver' => 'apc', 38 | ], 39 | 40 | 'array' => [ 41 | 'driver' => 'array', 42 | ], 43 | 44 | 'database' => [ 45 | 'driver' => 'database', 46 | 'table' => 'cache', 47 | 'connection' => null, 48 | ], 49 | 50 | 'file' => [ 51 | 'driver' => 'file', 52 | 'path' => storage_path('framework/cache/data'), 53 | ], 54 | 55 | 'memcached' => [ 56 | 'driver' => 'memcached', 57 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 58 | 'sasl' => [ 59 | env('MEMCACHED_USERNAME'), 60 | env('MEMCACHED_PASSWORD'), 61 | ], 62 | 'options' => [ 63 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 64 | ], 65 | 'servers' => [ 66 | [ 67 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 68 | 'port' => env('MEMCACHED_PORT', 11211), 69 | 'weight' => 100, 70 | ], 71 | ], 72 | ], 73 | 74 | 'redis' => [ 75 | 'driver' => 'redis', 76 | 'connection' => 'cache', 77 | ], 78 | 79 | 'dynamodb' => [ 80 | 'driver' => 'dynamodb', 81 | 'key' => env('AWS_ACCESS_KEY_ID'), 82 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 83 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 84 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 85 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 86 | ], 87 | 88 | ], 89 | 90 | /* 91 | |-------------------------------------------------------------------------- 92 | | Cache Key Prefix 93 | |-------------------------------------------------------------------------- 94 | | 95 | | When utilizing a RAM based store such as APC or Memcached, there might 96 | | be other applications utilizing the same cache. So, we'll specify a 97 | | value to get prefixed to all our keys so we can avoid collisions. 98 | | 99 | */ 100 | 101 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), 102 | 103 | ]; 104 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => false, 29 | 30 | 'max_age' => false, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | /* 70 | |-------------------------------------------------------------------------- 71 | | Symbolic Links 72 | |-------------------------------------------------------------------------- 73 | | 74 | | Here you may configure the symbolic links that will be created when the 75 | | `storage:link` Artisan command is executed. The array keys should be 76 | | the locations of the links and the values should be their targets. 77 | | 78 | */ 79 | 80 | 'links' => [ 81 | public_path('storage') => storage_path('app/public'), 82 | ], 83 | 84 | ]; 85 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 10), 33 | ], 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | Argon Options 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Here you may specify the configuration options that should be used when 41 | | passwords are hashed using the Argon algorithm. These will allow you 42 | | to control the amount of time it takes to hash the given password. 43 | | 44 | */ 45 | 46 | 'argon' => [ 47 | 'memory' => 1024, 48 | 'threads' => 2, 49 | 'time' => 2, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /config/livewire.php: -------------------------------------------------------------------------------- 1 | 'App\\Http\\Livewire', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This value sets the path for Livewire component views. This effects 26 | | File manipulation helper commands like `artisan make:livewire` 27 | | 28 | */ 29 | 30 | 'view_path' => resource_path('views/livewire'), 31 | 32 | /* 33 | |-------------------------------------------------------------------------- 34 | | Livewire Assets URL 35 | |-------------------------------------------------------------------------- 36 | | 37 | | This value sets the path to Livewire JavaScript assets, for cases where 38 | | your app's domain root is not the correct path. By default, Livewire 39 | | will load its JavaScript assets from the app's "relative root". 40 | | 41 | | Examples: "/assets", "myurl.com/app" 42 | | 43 | */ 44 | 45 | 'asset_url' => null, 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | Livewire Endpoint Middleware Group 50 | |-------------------------------------------------------------------------- 51 | | 52 | | This value sets the middleware group that will be applied to the main 53 | | Livewire "message" endpoint (the endpoint that gets hit everytime, 54 | | a Livewire component updates). It is set to "web" by default. 55 | | 56 | */ 57 | 58 | 'middleware_group' => 'web', 59 | 60 | /* 61 | |-------------------------------------------------------------------------- 62 | | Manifest File Path 63 | |-------------------------------------------------------------------------- 64 | | 65 | | This value sets the path to Livewire manifest file path. 66 | | The default should work for most cases (which is 67 | | "/bootstrap/cache/livewire-components.php)", but for specific 68 | | cases like when hosting on Laravel Vapor, it could be set to a different value. 69 | | 70 | | Example: For Laravel Vapor, it would be "/tmp/storage/bootstrap/cache/livewire-components.php" 71 | | 72 | */ 73 | 74 | 'manifest_path' => null, 75 | 76 | ]; 77 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Log Channels 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may configure the log channels for your application. Out of 28 | | the box, Laravel uses the Monolog PHP logging library. This gives 29 | | you a variety of powerful log handlers / formatters to utilize. 30 | | 31 | | Available Drivers: "single", "daily", "slack", "syslog", 32 | | "errorlog", "monolog", 33 | | "custom", "stack" 34 | | 35 | */ 36 | 37 | 'channels' => [ 38 | 'stack' => [ 39 | 'driver' => 'stack', 40 | 'channels' => ['single'], 41 | 'ignore_exceptions' => false, 42 | ], 43 | 44 | 'single' => [ 45 | 'driver' => 'single', 46 | 'path' => storage_path('logs/laravel.log'), 47 | 'level' => 'debug', 48 | ], 49 | 50 | 'daily' => [ 51 | 'driver' => 'daily', 52 | 'path' => storage_path('logs/laravel.log'), 53 | 'level' => 'debug', 54 | 'days' => 14, 55 | ], 56 | 57 | 'slack' => [ 58 | 'driver' => 'slack', 59 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 60 | 'username' => 'Laravel Log', 61 | 'emoji' => ':boom:', 62 | 'level' => 'critical', 63 | ], 64 | 65 | 'papertrail' => [ 66 | 'driver' => 'monolog', 67 | 'level' => 'debug', 68 | 'handler' => SyslogUdpHandler::class, 69 | 'handler_with' => [ 70 | 'host' => env('PAPERTRAIL_URL'), 71 | 'port' => env('PAPERTRAIL_PORT'), 72 | ], 73 | ], 74 | 75 | 'stderr' => [ 76 | 'driver' => 'monolog', 77 | 'handler' => StreamHandler::class, 78 | 'formatter' => env('LOG_STDERR_FORMATTER'), 79 | 'with' => [ 80 | 'stream' => 'php://stderr', 81 | ], 82 | ], 83 | 84 | 'syslog' => [ 85 | 'driver' => 'syslog', 86 | 'level' => 'debug', 87 | ], 88 | 89 | 'errorlog' => [ 90 | 'driver' => 'errorlog', 91 | 'level' => 'debug', 92 | ], 93 | 94 | 'null' => [ 95 | 'driver' => 'monolog', 96 | 'handler' => NullHandler::class, 97 | ], 98 | 99 | 'emergency' => [ 100 | 'path' => storage_path('logs/laravel.log'), 101 | ], 102 | ], 103 | 104 | ]; 105 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'smtp'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Mailer Configurations 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure all of the mailers used by your application plus 24 | | their respective settings. Several examples have been configured for 25 | | you and you are free to add your own as your application requires. 26 | | 27 | | Laravel supports a variety of mail "transport" drivers to be used while 28 | | sending an e-mail. You will specify which one you are using for your 29 | | mailers below. You are free to add additional mailers as required. 30 | | 31 | | Supported: "smtp", "sendmail", "mailgun", "ses", 32 | | "postmark", "log", "array" 33 | | 34 | */ 35 | 36 | 'mailers' => [ 37 | 'smtp' => [ 38 | 'transport' => 'smtp', 39 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 40 | 'port' => env('MAIL_PORT', 587), 41 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 42 | 'username' => env('MAIL_USERNAME'), 43 | 'password' => env('MAIL_PASSWORD'), 44 | ], 45 | 46 | 'ses' => [ 47 | 'transport' => 'ses', 48 | ], 49 | 50 | 'sendmail' => [ 51 | 'transport' => 'sendmail', 52 | 'path' => '/usr/sbin/sendmail -bs', 53 | ], 54 | 55 | 'log' => [ 56 | 'transport' => 'log', 57 | 'channel' => env('MAIL_LOG_CHANNEL'), 58 | ], 59 | 60 | 'array' => [ 61 | 'transport' => 'array', 62 | ], 63 | ], 64 | 65 | /* 66 | |-------------------------------------------------------------------------- 67 | | Global "From" Address 68 | |-------------------------------------------------------------------------- 69 | | 70 | | You may wish for all e-mails sent by your application to be sent from 71 | | the same address. Here, you may specify a name and address that is 72 | | used globally for all e-mails that are sent by your application. 73 | | 74 | */ 75 | 76 | 'from' => [ 77 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 78 | 'name' => env('MAIL_FROM_NAME', 'Example'), 79 | ], 80 | 81 | /* 82 | |-------------------------------------------------------------------------- 83 | | Markdown Mail Settings 84 | |-------------------------------------------------------------------------- 85 | | 86 | | If you are using Markdown based email rendering, you may configure your 87 | | theme and component paths here, allowing you to customize the design 88 | | of the emails. Or, you may simply stick with the Laravel defaults! 89 | | 90 | */ 91 | 92 | 'markdown' => [ 93 | 'theme' => 'default', 94 | 95 | 'paths' => [ 96 | resource_path('views/vendor/mail'), 97 | ], 98 | ], 99 | 100 | ]; 101 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'sync'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection information for each server that 24 | | is used by your application. A default configuration has been added 25 | | for each back-end shipped with Laravel. You are free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | ], 43 | 44 | 'beanstalkd' => [ 45 | 'driver' => 'beanstalkd', 46 | 'host' => 'localhost', 47 | 'queue' => 'default', 48 | 'retry_after' => 90, 49 | 'block_for' => 0, 50 | ], 51 | 52 | 'sqs' => [ 53 | 'driver' => 'sqs', 54 | 'key' => env('AWS_ACCESS_KEY_ID'), 55 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 56 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 57 | 'queue' => env('SQS_QUEUE', 'your-queue-name'), 58 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 59 | ], 60 | 61 | 'redis' => [ 62 | 'driver' => 'redis', 63 | 'connection' => 'default', 64 | 'queue' => env('REDIS_QUEUE', 'default'), 65 | 'retry_after' => 90, 66 | 'block_for' => null, 67 | ], 68 | 69 | ], 70 | 71 | /* 72 | |-------------------------------------------------------------------------- 73 | | Failed Queue Jobs 74 | |-------------------------------------------------------------------------- 75 | | 76 | | These options configure the behavior of failed queue job logging so you 77 | | can control which database and table are used to store the jobs that 78 | | have failed. You may change them to any database / table you wish. 79 | | 80 | */ 81 | 82 | 'failed' => [ 83 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), 84 | 'database' => env('DB_CONNECTION', 'mysql'), 85 | 'table' => 'failed_jobs', 86 | ], 87 | 88 | ]; 89 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Blade View Modification Checking 39 | |-------------------------------------------------------------------------- 40 | | 41 | | On every request the framework will check to see if a view has expired 42 | | to determine if it needs to be recompiled. If you are in production 43 | | and precompiling views this feature may be disabled to save time. 44 | | 45 | */ 46 | 47 | 'expires' => env('VIEW_CHECK_EXPIRATION', true), 48 | 49 | ]; 50 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(User::class, function (Faker $faker) { 21 | return [ 22 | 'name' => $faker->name, 23 | 'email' => $faker->unique()->safeEmail, 24 | 'email_verified_at' => now(), 25 | 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 26 | 'remember_token' => Str::random(10), 27 | ]; 28 | }); 29 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password'); 22 | $table->rememberToken(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('users'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->text('connection'); 19 | $table->text('queue'); 20 | $table->longText('payload'); 21 | $table->longText('exception'); 22 | $table->timestamp('failed_at')->useCurrent(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('failed_jobs'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UsersTableSeeder::class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "npm run development -- --watch", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.19", 14 | "bootstrap": "^4.0.0", 15 | "cross-env": "^7.0", 16 | "jquery": "^3.5", 17 | "laravel-mix": "^5.0.1", 18 | "lodash": "^4.17.19", 19 | "popper.js": "^1.12", 20 | "resolve-url-loader": "^3.1.0", 21 | "sass": "^1.15.2", 22 | "sass-loader": "^8.0.0", 23 | "tailwindcss": "^1.2.0", 24 | "vue-template-compiler": "^2.6.11" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | ./tests/Unit 9 | 10 | 11 | 12 | ./tests/Feature 13 | 14 | 15 | 16 | 17 | ./app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vuthaihoc/crawler-v4/faf49be6277d0f923b27f52c4e34aa185e7b52a4/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /public/js/app.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Lodash 4 | * Copyright OpenJS Foundation and other contributors 5 | * Released under MIT license 6 | * Based on Underscore.js 1.8.3 7 | * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 8 | */ 9 | -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/vendor/livewire/manifest.json: -------------------------------------------------------------------------------- 1 | {"/livewire.js":"/livewire.js?id=e5ca468c0f99e4889959"} -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | window._ = require('lodash'); 2 | 3 | /** 4 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 5 | * for JavaScript based Bootstrap features such as modals and tabs. This 6 | * code may be modified to fit the specific needs of your application. 7 | */ 8 | 9 | try { 10 | window.Popper = require('popper.js').default; 11 | window.$ = window.jQuery = require('jquery'); 12 | 13 | require('bootstrap'); 14 | } catch (e) {} 15 | 16 | /** 17 | * We'll load the axios HTTP library which allows us to easily issue requests 18 | * to our Laravel back-end. This library automatically handles sending the 19 | * CSRF token as a header based on the value of the "XSRF" token cookie. 20 | */ 21 | 22 | window.axios = require('axios'); 23 | 24 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 25 | 26 | /** 27 | * Echo exposes an expressive API for subscribing to channels and listening 28 | * for events that are broadcast by Laravel. Echo and event broadcasting 29 | * allows your team to easily build robust real-time web applications. 30 | */ 31 | 32 | // import Echo from 'laravel-echo'; 33 | 34 | // window.Pusher = require('pusher-js'); 35 | 36 | // window.Echo = new Echo({ 37 | // broadcaster: 'pusher', 38 | // key: process.env.MIX_PUSHER_APP_KEY, 39 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 40 | // encrypted: true 41 | // }); 42 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have emailed your password reset link!', 18 | 'throttled' => 'Please wait before retrying.', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that email address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | // Body 2 | $body-bg: #f8fafc; 3 | 4 | // Typography 5 | $font-family-sans-serif: 'Nunito', sans-serif; 6 | $font-size-base: 0.9rem; 7 | $line-height-base: 1.6; 8 | 9 | // Colors 10 | $blue: #3490dc; 11 | $indigo: #6574cd; 12 | $purple: #9561e2; 13 | $pink: #f66d9b; 14 | $red: #e3342f; 15 | $orange: #f6993f; 16 | $yellow: #ffed4a; 17 | $green: #38c172; 18 | $teal: #4dc0b5; 19 | $cyan: #6cb2eb; 20 | -------------------------------------------------------------------------------- /resources/sass/app.scss: -------------------------------------------------------------------------------- 1 | //@tailwind base; 2 | @import "~tailwindcss/base"; 3 | 4 | //@tailwind components; 5 | @import "~tailwindcss/components"; 6 | 7 | //@tailwind utilities; 8 | @import "~tailwindcss/utilities"; 9 | 10 | -------------------------------------------------------------------------------- /resources/views/auth/login.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Login') }}
9 | 10 |
11 |
12 | @csrf 13 | 14 |
15 | 16 | 17 |
18 | 19 | 20 | @error('email') 21 | 22 | {{ $message }} 23 | 24 | @enderror 25 |
26 |
27 | 28 |
29 | 30 | 31 |
32 | 33 | 34 | @error('password') 35 | 36 | {{ $message }} 37 | 38 | @enderror 39 |
40 |
41 | 42 |
43 |
44 |
45 | 46 | 47 | 50 |
51 |
52 |
53 | 54 |
55 |
56 | 59 | 60 | @if (Route::has('password.request')) 61 | 62 | {{ __('Forgot Your Password?') }} 63 | 64 | @endif 65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | @endsection 74 | -------------------------------------------------------------------------------- /resources/views/auth/passwords/confirm.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Confirm Password') }}
9 | 10 |
11 | {{ __('Please confirm your password before continuing.') }} 12 | 13 |
14 | @csrf 15 | 16 |
17 | 18 | 19 |
20 | 21 | 22 | @error('password') 23 | 24 | {{ $message }} 25 | 26 | @enderror 27 |
28 |
29 | 30 |
31 |
32 | 35 | 36 | @if (Route::has('password.request')) 37 | 38 | {{ __('Forgot Your Password?') }} 39 | 40 | @endif 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | @endsection 50 | -------------------------------------------------------------------------------- /resources/views/auth/passwords/email.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Reset Password') }}
9 | 10 |
11 | @if (session('status')) 12 | 15 | @endif 16 | 17 |
18 | @csrf 19 | 20 |
21 | 22 | 23 |
24 | 25 | 26 | @error('email') 27 | 28 | {{ $message }} 29 | 30 | @enderror 31 |
32 |
33 | 34 |
35 |
36 | 39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | @endsection 48 | -------------------------------------------------------------------------------- /resources/views/auth/passwords/reset.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Reset Password') }}
9 | 10 |
11 |
12 | @csrf 13 | 14 | 15 | 16 |
17 | 18 | 19 |
20 | 21 | 22 | @error('email') 23 | 24 | {{ $message }} 25 | 26 | @enderror 27 |
28 |
29 | 30 |
31 | 32 | 33 |
34 | 35 | 36 | @error('password') 37 | 38 | {{ $message }} 39 | 40 | @enderror 41 |
42 |
43 | 44 |
45 | 46 | 47 |
48 | 49 |
50 |
51 | 52 |
53 |
54 | 57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 | @endsection 66 | -------------------------------------------------------------------------------- /resources/views/auth/register.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Register') }}
9 | 10 |
11 |
12 | @csrf 13 | 14 |
15 | 16 | 17 |
18 | 19 | 20 | @error('name') 21 | 22 | {{ $message }} 23 | 24 | @enderror 25 |
26 |
27 | 28 |
29 | 30 | 31 |
32 | 33 | 34 | @error('email') 35 | 36 | {{ $message }} 37 | 38 | @enderror 39 |
40 |
41 | 42 |
43 | 44 | 45 |
46 | 47 | 48 | @error('password') 49 | 50 | {{ $message }} 51 | 52 | @enderror 53 |
54 |
55 | 56 |
57 | 58 | 59 |
60 | 61 |
62 |
63 | 64 |
65 |
66 | 69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | @endsection 78 | -------------------------------------------------------------------------------- /resources/views/auth/verify.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Verify Your Email Address') }}
9 | 10 |
11 | @if (session('resent')) 12 | 15 | @endif 16 | 17 | {{ __('Before proceeding, please check your email for a verification link.') }} 18 | {{ __('If you did not receive the email') }}, 19 |
20 | @csrf 21 | . 22 |
23 |
24 |
25 |
26 |
27 |
28 | @endsection 29 | -------------------------------------------------------------------------------- /resources/views/dashboard/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.master') -------------------------------------------------------------------------------- /resources/views/home.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
Dashboard
9 | 10 |
11 | @if (session('status')) 12 | 15 | @endif 16 | 17 | You are logged in! 18 |
19 |
20 |
21 |
22 |
23 | @endsection 24 | -------------------------------------------------------------------------------- /resources/views/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {{ config('app.name', 'Laravel') }} 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 74 | 75 |
76 | @yield('content') 77 |
78 |
79 | 80 | 81 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Laravel 8 | 9 | 10 | 11 | 12 | 13 | 65 | 66 | 67 |
68 | @if (Route::has('login')) 69 | 80 | @endif 81 | 82 |
83 |
84 | Laravel 85 |
86 | 87 | 97 |
98 |
99 | 100 | 101 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 18 | return $request->user(); 19 | }); 20 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->describe('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | name('home'); 23 | 24 | Route::get( 'dashboard', ['as' => 'dashboard', ['uses' => 'DashboardController@index']]); 25 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/data/itviec.com/0067498478a6e87717c8d91c215f9961.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Yeah1 Network", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/yeah1-network\/logo\/w170\/GndP1kw986EgtoXHJfV84pEs\/17422a66bc8b44d51d9a.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/016e8ff9ae1a6d05cff3ea25cbca7c03.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "rakumo Co., Ltd", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/rakumo-co-ltd\/logo\/w170\/YkuXV5ahc4dQeCSXCT8cQAXU\/rakumo-co-ltd-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/017737c4d88cd7a1144acd0b52251826.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Manifera Software Development", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/manifera-software-development\/logo\/w170\/XTgSvBXaY4gmwG2o3oVowhKz\/manifera-software-development-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/0ba00d10c40187c66d7d8ba4fe73bf7d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "RiverCrane Vietnam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/rivercrane-vietnam\/logo\/w170\/htQD4ytJeaZj5iea9hb951f8\/rivercrane-vietnam-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/16ede3130e54402c65e409d6ec2eb572.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "TENEOCTO TECHNOLOGIES", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/teneocto-technologies\/logo\/w170\/FABPij3zNuEvw4EYhPuPLQ8m\/crewz-enterprise-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/190a6d483907d8826799b06497ba621a.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ARIS Vietnam", 3 | "company_location": "Ho Chi Minh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/aris-vietnam\/logo\/w170\/4tRr7vqAZpRDd4pAm1DdLZCT\/aris-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/1aa98fe7b1dc0faf38b31b72703017c6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "BO Solution", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/bo-solution\/logo\/w170\/JECG7K37LsjK7nvwjxkwp8ph\/Screen%20Shot%202020-02-28%20at%201.44.21%20PM.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/1b63d9fe8b44f34fb9ade851ba76f205.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ePlatform Solution", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/eplatform-solution\/logo\/w170\/UuxRJH2vV5hduEp9Qzs44waG\/logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/1bee58415ba758294cded32b26b586bf.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Creasia Group", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/creasia-group\/logo\/w170\/gvNTv2KV9xT4txCK5gsbRUpq\/Screen%20Shot%202020-03-05%20at%205.46.50%20PM.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/1fe9d1a035e9411a29fcd72dbc7582df.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Transcosmos Technologic Arts", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/transcosmos-technologic-arts\/logo\/w170\/t26SFHbSHaBeybqnJ5TYoPyr\/transcosmos-technologic-arts-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/204f06a7997f25abfefa005812ae2d64.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ORO Vietnam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/oro-vietnam\/logo\/w170\/pVfei5voqrwhKKcV5aU8mtFM\/oro-vietnam-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/207ba9e81f05333d5b05b8abd1f251b1.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Outsourceit International Vietnam", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/outsourceit-international-vietnam\/logo\/w170\/yvk2PfbFZgLt9aTvjdvBH2cc\/FWH.logo.transp%20(800x216)%20(640x173).jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/23c34a505dffedfa86362f0a6f5aa279.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Trung t\u00e2m b\u1ea3o H\u00e0nh Dell t\u1ea1i Vi\u1ec7t Nam \u2013 Digipro", 3 | "company_location": "Phu Nhuan, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/trung-tam-bao-hanh-dell-tai-viet-nam-digipro\/logo\/w170\/RCvRochbn8EQ6SiwRmVMZMrJ\/logo-dsp.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/24dae388eec04814cca3f98caf3e8318.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "AIMFIRST VIETNAM", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/aimfirst-vietnam\/logo\/w170\/yfX7Vre17Qf5QrKtxRb6Rrx8\/Screen%20Shot%202020-02-28%20at%2010.03.15%20AM.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/255b7ca35f0fc964fea617d6292d83aa.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Deliveree On-Demand Logistics", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/deliveree-on-demand-logistics\/logo\/w170\/u4XYESAgGoQZ9ZF74ZaT91H9\/download.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/25c9da1da6c1a78b9d333dd23d6b48d3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Pasona Tech Vi\u1ec7t Nam", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/pasona-tech-viet-nam\/logo\/w170\/qwmUGRyJ7BM6oVKYFUKLatEQ\/Logo%20of%20Pasona%20Tech.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/28958aafbe9914613c437bba5463ae93.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Ninja Software", 3 | "company_location": "Thanh Xuan, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ninja-software\/logo\/w170\/NAZrYDQdsLoyswfr1sbLLb9m\/ninja-software-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/2940d53e5cd90115ae8fd6c29b2badc9.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "International Digital Services Vietnam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/international-digital-services-vietnam\/logo\/w170\/cQPoJsyZJfdxpPTi1yMkm9q4\/international-digital-services-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/2b71be26215f0fe47b887667dcf6fada.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "MOG Viet Nam", 3 | "company_location": "Dong Da, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/mog-viet-nam\/logo\/w170\/HTVCG6ghUEsUBFzPvZ8zWMkB\/image_2020_03_02T04_09_19_487Z.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/2be91372fc975da58b5bbd5c7fa9a890.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Boon The Lab", 3 | "company_location": "Binh Thanh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/boon-the-lab\/logo\/w170\/A6U2TCkG3z1rkhtDUTBYwDDG\/BTL_logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/2d1a68f7a1d3bcd9eeb5f7221a4af82d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Fado.vn", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/fado-vn\/logo\/w170\/ezLdix7nZXB7H1hgopai87Aj\/fado-vn-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/2ed3b86de56e6472a3658b4eda3d2663.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "GNT VN., LTD", 3 | "company_location": "Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/gnt-vn-ltd\/logo\/w170\/Ug7U7h1zva3STYLdkpdJcY51\/gnt-vn-ltd-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/3051daba0d3d4e72ee385edc27a74b41.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "\u0110inh Thi\u1ec7n L\u00fd School", 3 | "company_location": "Phu My Hung, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dinh-thien-ly-school\/logo\/w170\/d1H1L1Z6wzaGAn2ZLB6Kf2mK\/logo%20LSTS.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/3055fc5b4938cbe37ddcfba779630a70.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "BIT Vietnam", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/bit-vietnam\/logo\/w170\/je5UPKN7VXd4nA1CtHzUTm6i\/BIT%E3%83%AD%E3%82%B4.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/337fbffe1f24bebd238cb5f978cf0ff0.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Open Commerce Group", 3 | "company_location": "Dong Da, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/open-commerce-group\/logo\/w170\/DEaBzu41hdKMYUcoWMuRhGPG\/anh_slide-01.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/353a42781f20923cfe84dcbf9b174f84.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "FIBO", 3 | "company_location": "Tan Phu, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/fibo\/logo\/w170\/h8ss6YEM6zo3hexQz7YYKQeN\/fibo-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/377baba21e23bcab3c776929d121d2ed.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "VTL-Solutions Ltd.", 3 | "company_location": "District 5, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/vtl-solutions-ltd\/logo\/w170\/ZXbQmbPfiBxXF1a5WQ3dztyu\/vtl-solution-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/3967b1c065b5f426b42945351f21184d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "SADOREAL", 3 | "company_location": "District 2, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sadoreal\/logo\/w170\/xwmtH6C6cTvpSpMzRvC3gVWY\/5e4cdbca0a2bb_1582095306.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/3dedfafb0f58ded5b9c880e6ed7fc6c6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Sun* Inc.", 3 | "company_location": "Ha Noi, Da Nang, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sun-inc\/logo\/w170\/cDcdNbGCaVV5xgnmz8Vfv4ed\/framgia-inc-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/3e7c4ddbddb3b0d187c4b0d287149618.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "C\u00f4ng ty C\u1ed5 ph\u1ea7n Fimplus", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/cong-ty-co-phan-fimplus\/logo\/w170\/sHZ9TRekvwPPzHXHj5NmxZQp\/LOGO%203.PNG" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/40a7cbbff19acf8797627756c51ff55d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "bravesoft Vietnam", 3 | "company_location": "District 10, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/bravesoft-vietnam\/logo\/w170\/5phAcy58CcFtFkjfyPo7Qwa6\/bs-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/41867bea1ee01951b4a2faff6f816a80.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "NFQ Asia (8bit Rockstars)", 3 | "company_location": "Ho Chi Minh, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nfq-asia-8bit-rockstars\/logo\/w170\/wSqDe722rToJQ6oXH3Yc8QJZ\/nfq-asia-8bit-rockstars-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/48fc50978bfefc4a7d34f51e335151f7.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Coffeemug", 3 | "company_location": "Nha Be, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/coffeemug\/logo\/w170\/yW1cGtEE4ooqjzPNgUUCYX6f\/Logo%20CoffeeMug.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/4a03ebacb9e6f530c40a71cf31a02545.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Kyanon Digital", 3 | "company_location": "Phu Nhuan, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/kyanon-digital\/logo\/w170\/KiNa7pGFirUmYjVj48ASUDxx\/Copy%20of%20LOGOo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/512012223eebbccf718d39dcbd9dd866.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Kiaisoft Vi\u1ec7t Nam", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/kiaisoft-viet-nam\/logo\/w170\/XCcmHuqWgULtjhJzbCvPVaaF\/download%20(1).png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/52827212da28c141587e89a5401bb0b6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Worknetics Pte Ltd", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/worknetics-pte-ltd\/logo\/w170\/JGeGvq2Ytx8JzTEgVtRFTYPB\/worknetics-pte-ltd-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/563afc0992a373b46b9d678a861f4455.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ZALORA Group", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/zalora-group\/logo\/w170\/iWEscWqmrWxAuuqC6jksj6NF\/zalora-group-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/5b53bcd8648e1c4b4e42c0cc8d38255e.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "TwentyTech", 3 | "company_location": "Ba Dinh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/twentytech\/logo\/w170\/TRG7QG5CBqvK8XAQ59Ti2zAf\/twentytech-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/5c24f9ca20843e76328886354ef07d93.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "TD Company", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/td-company\/logo\/w170\/DibGvisnukTQtDmiFq8rdVdM\/image%20(1).png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/60a29c7b7c43f6595be8b250d93dce4b.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "PowerGate Software", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/powergate-software\/logo\/w170\/R1G869xC6EzAPhRUozkowuXa\/powergate-software-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/6164dab98b804c937161ee51e3332981.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "NitroTech Asia, Inc", 3 | "company_location": "Hai Chau, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nitrotech-asia-inc\/logo\/w170\/HQaGDuphXiCsX4ty9fjhdfR4\/Logo%20NTA.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/621cbfb6e4177274ecd218e8426f6f1c.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Alini", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/alini\/logo\/w170\/5tvTFdv9SH5ozGL97eJLdqho\/download.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/62d00026f104cba935ad070158d60bc2.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Quantic", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/quantic\/logo\/w170\/Kf9DUVm77jwMSJj8ysAZXcMS\/quantic-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/67e3ecc07112a84ccdbf6496c15fb849.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "IVC (ISB Vietnam)", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ivc-isb-vietnam\/logo\/w170\/fu3NC5iUzSpFqzmEZiioLQE7\/isb-vietnam-company-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/6a5040e2635b1ed80d50be4f9fff0106.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Advesa Digital Solutions", 3 | "company_location": "Ha Noi, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/advesa-digital-solutions\/logo\/w170\/HrFa71dEriYZdDf3jTydcrFZ\/unnamed.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/6a6bced6b65b22961b2607f873a2d54a.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "VNJ", 3 | "company_location": "District 12, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/vnj\/logo\/w170\/7EangC8hmVwrZMBNRPtjQHQq\/vnj-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/6b77279d222d48b45977852a83c8dd36.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Th\u01b0\u01a1ng \u0110\u00f4", 3 | "company_location": "Dong Da, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/thuong-do\/logo\/w170\/KHk4pqqujawz2i9sJJjpp6s7\/th-ng-do-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/74189ae4de0de1ed67cbb6c64d8cd571.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Koh Young Technology Inc", 3 | "company_location": "Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/koh-young-technology-inc\/logo\/w170\/15EVwwrbfrQqJbn1gPkp8VA4\/koh-young-technology-inc-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/777cf5473853fb02094658953536428b.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DAC Tech Vi\u1ec7t Nam", 3 | "company_location": "Hai Chau, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dac-tech-viet-nam\/logo\/w170\/gQrKkZySg3EFcNjAevBEiEiC\/dac-tech-vi-t-nam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/78259175a24f23cb123ee352aa704300.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "SohaGame", 3 | "company_location": "Thanh Xuan, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sohagame\/logo\/w170\/9HWpqnS7JGaLnM8nhgpcqAPg\/ta%CC%89i%20xuo%CC%82%CC%81ng.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/79bd1bb017ad86ea00eb2f594d8c98e6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Sutrix Solutions", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sutrix-solutions\/logo\/w170\/xwSACWhYv3h7PaYxf6H6oqMW\/sutrix-solutions-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/7b4bec2f12dbe2bd05b63b21143eeedc.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "GOTEC LAND", 3 | "company_location": "Binh Thanh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/gotec-land\/logo\/w170\/ht9EJ5aQK9eTAL8xRcTwoAXR\/121327logogtec.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/7bd11c6f2cb12e4858dca7c1ca9b266a.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Ferosh", 3 | "company_location": "Ha Noi, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ferosh\/logo\/w170\/xEm2bkzq2DubdpPsRXysqBai\/feros-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/7df729e2d9bdf4b7addede2b99f53d73.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "OCMG", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ocmg\/logo\/w170\/XxEHdKVmgzjBrMRjjFqS8WmH\/LOGO.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/8066330803a42579d91c74ec63499791.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "LEADPLUS VIETNAM", 3 | "company_location": "Thanh Khe, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/leadplus-vietnam\/logo\/w170\/2CWGGbvJBTWMfQe37WzJpPtc\/b67bd0eb6e1116155340a810f7c920f8.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/823efdedf8df152d5058f43c7def223b.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Sudobo", 3 | "company_location": "Thanh Tri, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sudobo\/logo\/w170\/H8sPETmLPhVDtEv8WNxL5477\/40309728_2213501825594641_4989744780876447744_n.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/8348960bb97b88c4af0409982931569d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Mmt Group", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/mmt-group\/logo\/w170\/pEMHWqjV3qUYz2S9dihPGdmf\/logo-vuong.jpeg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/8363fd02f0c4789ca0c4a36a0be3b9e4.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Allied Tech Camp", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/allied-tech-camp\/logo\/w170\/xmGXbTQhnjCh9pQkoaNH4xz9\/allied-tech-camp-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/84c1d7b4c0956408bb8cf523187944aa.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Geo Holdings", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/geo-holdings\/logo\/w170\/E6rXuv1evTN7UAtkRfTPfX89\/logo%20GEO.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/84f9901e8894566f56e49f8d1930aab3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Audience Serv GmbH", 3 | "company_location": "Ba Dinh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/audience-serv-gmbh\/logo\/w170\/v52GtsmXKSUdk6BUnNwQzkEq\/audience-serv-gmbh-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/85ced71bf1f949670fd5b549dee87c80.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Fastboy Marketing", 3 | "company_location": "Tan Phu, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/fastboy-marketing\/logo\/w170\/HM36viZUDjAD8gmrUHi2pnsc\/fastboy-marketing-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/9128f31c48aa7c633b5cfe85c145a915.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "WONDERKIN", 3 | "company_location": "Other, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/wonderkin\/logo\/w170\/a16HJip7NxsdnTJRNkf3zQNd\/logo-25.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/91883e84b4005f606927cbd2e740f198.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "C\u00f4ng ty TNHH Asean Fan", 3 | "company_location": "Binh Thanh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/cong-ty-tnhh-asean-fan\/logo\/w170\/e5KPJJ7njMMrfNyxDH3X6Ku2\/cong-ty-tnhh-asean-fan-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/932f26e7149454054c989d11eda649a3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ICD Vietnam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/icd-vietnam\/logo\/w170\/jwrrpHt54x7D8xAnZNu9qF4X\/icd-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/944c6f71feea0b3ce07a70202f060f03.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Vega Corporation", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/vega-corporation\/logo\/w170\/kd1rg1poLS23izaR75yrYdk9\/vega-corporation-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/99087e14c00d60d8ab2909f49ea93308.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "CASTIS Corp", 3 | "company_location": "Nam Tu Liem, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/castis-corp\/logo\/w170\/eyd6zdazeqnGkDytGwkJX1d7\/castis-corp-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/99ed687cef41c0eba224aca858cb0d25.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Panasonic Appliances Viet Nam", 3 | "company_location": "Dong Anh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/panasonic-appliances-viet-nam\/logo\/w170\/Z3vSNDujHWxTBjn5esgWYrz1\/Screen%20Shot%202020-03-26%20at%202.24.18%20PM.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/9a5c635b8d75de04c8cdb3c4565b3605.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Got It, Inc.", 3 | "company_location": "Tay Ho, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/got-it-inc\/logo\/w170\/jGnUtUbx9Z84m2ZU2hgzJbh5\/logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/9b1d4bc86832333e32d922167d81da32.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "G&G Blockchain Camp", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/g-g-blockchain-camp\/logo\/w170\/PW83fo9YfvnimneufEEXoMHf\/%E1%BA%A3nh%20logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/a0cab719ac0cee12579cab58ff0cb9c3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "It's A Beautiful Way", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/it-s-a-beautiful-way\/logo\/w170\/CHdgNmz8VS4iHRbK212p8ZoA\/52281228_2001022940016943_3968714665298493440_n.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/a5ee5359584b2fe3532d9175f8fcd6cd.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "THUAN PHONG CIVIL EQUIPMENT", 3 | "company_location": "District 6, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/thuan-phong-civil-equipment\/logo\/w170\/oYWi5P9LVufhvhhyJzESGbGp\/download%20(1).png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/a65f21119d78df761018dc60d4ea1bf3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "MC CO., LTD", 3 | "company_location": "Hai Ba Trung, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/mc-co-ltd\/logo\/w170\/NNXSRpkMzL2EzCSRvVsr8b47\/94818mcadvertising_95x50_291209.gif" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ad37e259f699c4f0d5e5bdc330b37c25.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Epsilo", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/epsilo\/logo\/w170\/VXovG43ezxuGX8RG38C58CW7\/1.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ae4d40d60e162f06593610b3ae5b6521.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "MDT GROUP", 3 | "company_location": "Nam Tu Liem, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/mdt-group\/logo\/w170\/umrMwzGXXdFfkDKkjDeUDrKe\/d81c8d65a071db7ed841a7903a4b58ae.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ae8834b0a04a066f20b4038b3b5ce71c.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "SSKPI", 3 | "company_location": "Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/sskpi\/logo\/w170\/cKW5TNjD3ZsNXm9fLANkwxKt\/sskpi-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/af35c904ac12e9f72d5b13703bc229fc.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Docosan", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/docosan\/logo\/w170\/isvL89mNiH2yyCU9FAY6eKxM\/Logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/af6c90fe49aaef117b051fb50901c78f.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Cloud Nine Solutions", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/cloud-nine-solutions\/logo\/w170\/XMY8AYSBwzy8op9eKPbuALFU\/cloud-nine-solutions-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/af7acb9e8f7bb57e320d813716b569d4.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "BLUESKY | CCIntegration", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/bluesky-ccintegration\/logo\/w170\/hCWa4pTJ15SCfpjMzb7R6HGe\/bluesky-ccintegration-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b0226294785cbf62828b1ebc188f14d3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Titan Technology Corporation", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/titan-technology-corporation\/logo\/w170\/U9evmQcMdMwQ9Mw1963h2JP2\/titan-technology-corporation-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b11ecc7077ddbf106e05929808f68e66.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "INTERNET GIANT", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/internet-giant\/logo\/w170\/2sYQUCd8wuV1AJmytsTy1zD5\/LOGO.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b15727ec6fe2539d21353f8ab9ccc55c.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DIMAGE SHARE VIETNAM CO.,LTD", 3 | "company_location": "Nam Tu Liem, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dimage-share-vietnam-co-ltd\/logo\/w170\/zmEafMEp4Fu8r1HXu3KdFbAg\/dimage-share-inc-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b228fa40ae0bc12bfcd34e4ae9558181.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Mirum Agency", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/mirum-agency\/logo\/w170\/Ypj21X8Awqh5znyH2zVgGHji\/mirum-hcmc-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b24f6d8bdfc0a6725f44821278bc57c4.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Giao H\u00e0ng Ti\u1ebft Ki\u1ec7m", 3 | "company_location": "Nam Tu Liem, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/giao-hang-tiet-kiem\/logo\/w170\/RMf6u915d8g3iakGV4KRWQ5G\/Logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b5ec797453f427bfc64c7c860fc84ab7.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "NHN Vietnam", 3 | "company_location": "Binh Thanh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nhn-vietnam\/logo\/w170\/VYEkn4h8zSdeq8fEyxxwnDPj\/nhn-vietnam-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/b8f9562b62007baa32f5de67d32297a8.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Cloudteam", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/cloudteam\/logo\/w170\/1JqRAjdn621sDeL57vWNadZ6\/cloudteam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/baec8f3aed7dd8b1f3468f602cbd1c76.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "JV-IT", 3 | "company_location": "District 10, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/jv-it\/logo\/w170\/8PtdXpBKzM3GJqV7uVTPZRV5\/jv-it-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/bb9a612eb6e0280eeeb00e93cf399921.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Xvolve", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/xvolve\/logo\/w170\/F1GvxUAciCFpJRTvstFFNoiM\/xvolve-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/bc91875633ce6a111b9649b9b83a3bfa.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ILA Viet Nam", 3 | "company_location": "Ho Chi Minh, Ha Noi, Da Nang, Others", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ila-viet-nam\/logo\/w170\/tMTKWgRMrxHzyRpTCxmPPVcT\/ila-viet-nam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c1bccde4caea99480121b5d25009c4e3.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "D\u0169ng Mori", 3 | "company_location": "Thanh Xuan, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dung-mori\/logo\/w170\/XoDwA6H84mXBtrXjVAWqYuzN\/dung-mori-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c6114643348dfc5e6793921e45c98a31.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Nexcel Solutions", 3 | "company_location": "District 12, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nexcel-solutions\/logo\/w170\/P9KronZsWSpwSgEpkvGpPueM\/nexcel-solutions-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c789d299288a4e86c5a08464a67e4809.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Hanbiro Viet Nam Co., Ltd", 3 | "company_location": "District 7, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/hanbiro-viet-nam-co-ltd\/logo\/w170\/yYGAAkzXFfoTHFt39RJM7hBy\/hanbiro-inc-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c7a9768216a87fe8b3f3733527aa7093.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Vntrip OTA", 3 | "company_location": "Thanh Xuan, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/vntrip-ota\/logo\/w170\/Y5JRxg2zmF5ViKus4uoRSU9y\/vntrip-ota-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c9b41879a74d92200c3702cfee324212.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DIGITOP", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/digitop\/logo\/w170\/rP1TfWuZpYSZYEfkhytGspes\/digitop-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/c9f3fbbd944fc580476bc5b92dbe69e6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "FIREAPPS", 3 | "company_location": "Ho Chi Minh, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/fireapps\/logo\/w170\/QsUXoE1hFJiA2KsbMvZ4SNES\/fireapps-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ca00bf41ab1c18c7d24d9a8411d281af.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ekino Vietnam", 3 | "company_location": "District 11, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ekino-vietnam\/logo\/w170\/5Gh8Xw4ygi6d3M4LHQA4JDX8\/ekino-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/caed4823bb1ba78e102774dbee15e9d5.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Nimble", 3 | "company_location": "Ho Chi Minh, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nimble\/logo\/w170\/z64r4BZoX7KGsRmGjpDiSvEB\/nimbl3-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/cbb29525625b713653f5ba9efe0e1b22.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "J&T Express", 3 | "company_location": "Binh Thanh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/j-t-express\/logo\/w170\/SRBKwtd7ZdcLHBVSqShxWqPq\/j-t-express-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/cf1eeccd70b9a6adc1e215a2e9b5849a.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Nexle Corporation", 3 | "company_location": "Ho Chi Minh, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/nexle-corporation\/logo\/w170\/nT2KRmwWLiYyS4RnHNHCSKpr\/nexle-corporation-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/d0bb1db688dfdd16f269fe62022d3fc6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "ESMAC Technology", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/esmac-technology\/logo\/w170\/JkNostsDnJB5vBAZ4aBnjNNB\/esmac-technology-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/d4fe03ded1de2cbee0fd1a43f3303e63.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Zin Linh Ki\u1ec7n", 3 | "company_location": "Dong Da, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/zin-linh-kien\/logo\/w170\/UhcvRq8jxRHV2ubkzJCXg1hk\/UZGImGAkXvLa29GDnTje5daWlN9bECTTIdkLXdBB.jpeg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/d54e8a4089133c81709d896f7e9ca2bc.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DAYONE", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dayone\/logo\/w170\/43yJT9tnWBTtvYc49hp3pqeg\/download.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/d79369ae4755cc0d8d051d46798868ea.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Kh\u1edfi Ngu\u1ed3n Software (Susoft)", 3 | "company_location": "Nam Tu Liem, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/khoi-nguon-software-susoft\/logo\/w170\/VZCfFvrdDXNja7rCC3LvLANJ\/kh-i-ngu-n-software-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/d8b308c6b6e93360bf3cfa9b5faa60bc.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "WEBHOSTINGPAD", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/webhostingpad\/logo\/w170\/Cx7FNkj7ZZnbc7AFCiJzZSqZ\/10885316.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/dc44440cfd51606df8dfb4c2afde7579.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Global Fashion Group", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/global-fashion-group\/logo\/w170\/31GhuSpiSdmBg7smJZDDGkCF\/GFG%20logo%202.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/dd7f2317429bba67ed514b34b3f4c96c.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "APAX ENGLISH", 3 | "company_location": "Ba Dinh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/apax-english\/logo\/w170\/MjVoYorq5Bj9p3xnppY6CRwF\/apax-english-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/de3084f6f33843986ae60e8b4fb76ebb.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "UNISOFT", 3 | "company_location": "Hai Chau, Da Nang", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/unisoft\/logo\/w170\/925bUBF54FfWvQrNQmQz2PJ9\/unisoft.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/de856874a54f5412ca861c1a1605fb54.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Serdao", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/serdao\/logo\/w170\/F4ET7K6eecftDdKJ8hkMQk6v\/vinashore-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e27faffca9c0d2bc33c80b354f99d8ed.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Beetsoft", 3 | "company_location": "Cau Giay, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/beetsoft\/logo\/w170\/eyVfoGE5rGq3gepgfvtuHTuo\/beetsoft-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e2e2ac0b00911859e5d316f992afb41a.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DIGILO", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/digilo\/logo\/w170\/Z3TyV4UQ33UkAu9bmbqMLhZz\/ad-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e2e791f920f616052dd49838459bb811.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "SCHOLA", 3 | "company_location": "District 10, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/schola\/logo\/w170\/8f7QmmHZSbr7J7AFB8oad5Ry\/IMG_1397.JPG" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e2fc0ded4db2da64d65ca313ca867ecf.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "KPMG Digital Enablement", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/kpmg-digital-enablement\/logo\/w170\/DbJy1fMEiHECQMVCaYFq9C8D\/kpmg-limited-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e724b2374120a30687216177f785b05e.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DKIV", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dkiv\/logo\/w170\/mcrvAy2PVBzeTPVGjLvsjniC\/dkiv-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e73053768ee64fb2b0754956b29c7a66.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "eDoctor", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/edoctor\/logo\/w170\/oGfJAPQXPbDGPLV9WJiGcWgF\/edoctor-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e8555cdd3cb5479c9ce0e46f1d8ef2b9.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Deutsche Bekleidungswerke", 3 | "company_location": "Others", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/deutsche-bekleidungswerke\/logo\/w170\/yFLaTrViFnJdKiQoziSXEGzm\/logo%20ROYAL%20SPIRIT%20GROUP.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e881f40e1237c58a95f7e28695787244.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "SOLIS LAB", 3 | "company_location": "Dong Da, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/solis-lab\/logo\/w170\/x3C8SM6pYvnrtySnJQ38SSdC\/solis-lab-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/e98c77e92f7139490621f0dcb8c03091.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Syno Japan", 3 | "company_location": "Ba Dinh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/syno-japan\/logo\/w170\/VTBikm5uBWYXhi45FXwQHFEY\/Syno.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ea8a76f5649facfa96c30549efe551e6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "C\u00f4ng ty TNHH Dynastras Vi\u1ec7t Nam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/cong-ty-tnhh-dynastras-viet-nam\/logo\/w170\/VtZYQVmZHgQCvFbKAXaQmFQo\/LOGO.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/eb0afea5ef6527ae71034cf65fa9e4fb.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Isobar Commerce (Bluecom Solutions)", 3 | "company_location": "Ho Chi Minh, Ha Noi", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/isobar-commerce-bluecom-solutions\/logo\/w170\/Rst4imbvKbjNw32bdRvQ3Xai\/isobar-commerce-bluecom-solutions-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ecff331d9c1fbb8ec3d30402321f1870.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "VLAB J.S.C", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/vlab-j-s-c\/logo\/w170\/Vbv6r5A5rsCRc57cH7rzTsBk\/vlab-j-s-c-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ee9c1553a33f5379ceeadf0ca55209d0.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "XKYLESOFT", 3 | "company_location": "Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/xkylesoft\/logo\/w170\/C3zfon2tkribrBoMsxY62uvg\/10888757.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f008552524cb5f03f3dabed63f8e19d6.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "South Telecom", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/south-telecom\/logo\/w170\/LptAXxP8We5bos2wWwh8daQt\/south-telecom-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f05dd2f4e131653a509c01161d645e4c.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "INFORMATION TECHNOLOGY SERVICES-JAPAN", 3 | "company_location": "Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/information-technology-services-japan\/logo\/w170\/idqxjpJoK7fo3hXoAWRYMSQo\/Screen%20Shot%202020-02-19%20at%2016.23.22.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f0ff270b6a9744a3e55d84172fe3ea7e.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Rem Corp Vietnam", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/rem-corp-vietnam\/logo\/w170\/zpz9YG7cocH2YTuqfwsRMECP\/rem-corp-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f13f6e56eefa67086f53dd4eab4f4287.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Contemi Vietnam", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/contemi-vietnam\/logo\/w170\/xC1xSyJ67Z82cgGGoXnRoU1V\/contemi-vietnam-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f2997424d3aa7d63fca9ec63806332c8.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Applivi", 3 | "company_location": "District 2, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/applivi\/logo\/w170\/NkgzS6PDcJLns7h1kvW3Jrww\/Applivi_Logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f6a3077ecb47b331de9c654f2ed8a134.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "DOSIIN", 3 | "company_location": "District 4, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/dosiin\/logo\/w170\/gNYLHMorEKNQhwAhqbjWDEEJ\/dosiin-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/f787f142a26d819bb075c3a6c5ac5146.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Ateam Vi\u1ec7t Nam", 3 | "company_location": "District 1, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ateam-viet-nam\/logo\/w170\/H7NHFG7AQVmNS9bqSdyXF2bo\/Ateam%20Vietnam%20Inc._%E4%B8%8A%E4%B8%8B%E7%B5%84_%E3%82%AB%E3%83%A9%E3%83%BC.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/fb2b77ecb81cbb8ec42ea298a2e05f7d.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "FANS COMMUNICATIONS", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/fans-communications\/logo\/w170\/rtQvF2TonAiCfNR31Q8Zvigg\/meta_image.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/fd82672db96ed4fff54cb130335cdb47.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Prudential Vietnam Assurance", 3 | "company_location": "Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/prudential-vietnam-assurance\/logo\/w170\/FYDEyK9wtbsB9ChQ9nDPixMk\/prudential-vietnam-assurance-logo.png" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ff5882f1ba95b521fd8b317ca1fabfd8.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "Ambition Vietnam", 3 | "company_location": "District 3, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/ambition-vietnam\/logo\/w170\/rJhCgXWUvziMUpwbm5yTP9aA\/ambition-vietnam-logo.jpg" 5 | } -------------------------------------------------------------------------------- /storage/data/itviec.com/ff9222a0695e095751e78eba9d89fc91.json: -------------------------------------------------------------------------------- 1 | { 2 | "company_name": "LOGICWEB", 3 | "company_location": "Tan Binh, Ho Chi Minh", 4 | "company_logo": "https:\/\/cdn.itviec.com\/employers\/logicweb\/logo\/w170\/fNNH8gVP7VgwB4L8ANyPteTo\/Logo-LogicWeb.png" 5 | } -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/itviec.com.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vuthaihoc/crawler-v4/faf49be6277d0f923b27f52c4e34aa185e7b52a4/storage/itviec.com.sqlite -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | theme: { 3 | }, 4 | variants: {}, 5 | plugins: [] 6 | } 7 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue( $new == CrawlUrl::join( $base, $relative) ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | let tailwindcss = require('tailwindcss'); 4 | 5 | mix.options({ 6 | processCssUrls: false, 7 | postCss: [tailwindcss('./tailwind.config.js')] 8 | }) 9 | 10 | /* 11 | |-------------------------------------------------------------------------- 12 | | Mix Asset Management 13 | |-------------------------------------------------------------------------- 14 | | 15 | | Mix provides a clean, fluent API for defining some Webpack build steps 16 | | for your Laravel application. By default, we are compiling the Sass 17 | | file for the application as well as bundling up all the JS files. 18 | | 19 | */ 20 | 21 | mix.js('resources/js/app.js', 'public/js') 22 | .sass('resources/sass/app.scss', 'public/css'); --------------------------------------------------------------------------------