2019年5月21日 星期二

Laravel 一部主機開發管理多個虛擬專案

感恩和東國小王麒富組長的指導

1.專案名稱
   (1) test01
   (2) test02
   (3) test03

2.編輯 /etc/hosts
   $sudo pico /etc/hosts
    新增
     127.0.0.1  test01.localhost
     127.0.0.1  test02.localhost
     127.0.0.1  test03.localhost

3.編輯 /etc/apache2/sites-enabled/000-default.conf
   $sudo pico /etc/apache2/sites-enabled/000-default.conf
   新增
<VirtualHost *:80>
       ServerName test01.localhost
       DocumentRoot /var/www/html/test01/public
       <Directory "/var/www/html/test01/public/">
               Options -Indexes
               AllowOverride All
               Require all granted
       </Directory>
</VirtualHost>
<VirtualHost *:80>
       ServerName test02.localhost
       DocumentRoot /var/www/html/test02/public
       <Directory "/var/www/html/test02/public/">
               Options -Indexes
               AllowOverride All
               Require all granted
       </Directory>
</VirtualHost>
<VirtualHost *:80>
       ServerName test03.localhost
       DocumentRoot /var/www/html/test03/public
       <Directory "/var/www/html/test03/public/">
               Options -Indexes
               AllowOverride All
               Require all granted
       </Directory>
</VirtualHost>

資料來源:

2019年5月6日 星期一

Laravel 5.7.0 使用 maatwebsite/excel 匯入匯出 使用者的帳號的 Excel 與 CSV

0.安裝目錄/home/webadmin/html/laravel
1.安裝 laravel 5.7
   $composer create-project laravel/laravel --prefer-dist /home/webadmin/html/laravel 5.7
   $sudo vi /etc/hosts
   $sudo vim /etc/apache2/sites-available/laravel.conf 

    寫入:
-------------------------------------------------------------------------------------
<VirtualHost *:80>
   ServerName localhost

   ServerAdmin webmaster@localhost
   DocumentRoot /home/webadmin/html/laravel/public


<Directory /home/webadmin/html/laravel>
         AllowOverride All
         Require all granted
   
</Directory>

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

-------------------------------------------------------------------------------------

   如果要取消原本80網頁
   $sudo a2dissite 000-default.conf
   啟用新網頁
   $sudo a2ensite laravel.conf
   $sudo a2enmod rewrite
   $sudo service apache2 restart

   更改特定目錄擁有者為www-data,及777
   $cd /home/webadmin/html/laravel/
   $sudo chown -R www-data storage/ bootstrap/cache/
   $sudo chmod -R 777 storage/ bootstrap/cache/

2.安裝套件與生成配置檔案 
   $cd /home/webadmin/html/laravel/
   $composer require "maatwebsite/excel":"~2.1.0"
   編輯 /home/webadmin/html/laravel/config/app.php
   'providers' => [
....
Maatwebsite\Excel\ExcelServiceProvider::class,
    ],
    'aliases' => [
....
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
    ],
  生成配置檔案
   $php artisan vendor:publish

3.建立認證
   $cd /home/webadmin/html/laravel/
   $php artisan make:auth
   $php artisan migrate

4.新增路由:
   編輯/home/webadmin/html/laravel/routes/web.php
   $sudo pico /home/webadmin/html/laravel/routes/web.php
    其內容為:
    Route::get('AllUserExport','IMorExportsController@AllUserExport')->name('AllUserExport');
    Route::get('AllUserDownload/{type}','IMorExportsController@AllUserDownload')->name('AllUserDownload');
    Route::post('AllUserImport','IMorExportsController@AllUserImport')->name('AllUserImport');

5.建立控制器:
    $php artisan make:controller IMorExportsController --resource
    編輯/home/webadmin/html/laravel/app/Http/Controllers/IMorExportsController.php
    $sudo pico /home/webadmin/html/laravel/app/Http/Controllers/IMorExportsController.php
    其內容為:
 <?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Excel;
use DB;

class IMorExportsController extends Controller
{
    public function AllUserExport() {
        return view('ImportAndExport');
    }

    public function AllUserDownload($type) {
        $data = User::get()->toArray();
        return Excel::create('AllUserDownload',function ($excel) use ($data) {
            $excel->sheet('mySheet',function ($sheet) use($data){
                $sheet->fromArray($data);
            });
        })->download($type);
    }

    public function AllUserImport(Request $request) {
        $users = User::get()->toArray();
        $request->validate([
           'import_file' => 'required'
        ]);
       $path = $request->file('import_file')->getRealPath();
       $data = Excel::load($path)->get();
       $fail_message = ' ';
       if ($data->count()) {
           foreach ($data as $key => $value) {
               foreach ($users as $userkey => $user) {
                   if ( $value->email != $user['email']) {
                       $arr[] = [
                           'name'       => $value->name,
                           'email'      => $value->email,
                           'password'   => bcrypt($value->password),
                           'created_at' => now(),
                           'updated_at' => now(),
                       ];
                   } else {
                       $fail_message .= $value->email.' ';
                   }
               }
           }
           if ($fail_message != ' ') {
               return back()->with('fail','Duplicate email: '.$fail_message);
           }
           if(!empty($arr)) {
               User::insert($arr);
           }
       }
       return back()->with('success','Insert Record successfully.');
    }
}

6.建立 Blade 檔案
   建立 ImportAndExport.blade.php
   $touch /home/webadmin/html/laravel/resources/views/ImportAndExport.blsde.php
   編輯/home/webadmin/html/laravel/resources/views/ImportAndExport.blsde.php
   $sudo pico /home/webadmin/html/laravel/resources/views/ImportAndExport.blsde.php
   其內容:
<html lang="zh-Tw">
  <head>
      <title> Import and Export Excel xls xlsx and CSV</title>
      <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
  </head>
  <body>
     <div class="container">
         <div class="card-text-center">
             <div class="card-header">
                <h5> Download file </h5>
             </div>
             <div class="card-body">
                 <ul class="nav nav-tabs card-header-tabs">
                     <li class="nav-item">
                         <a href="{{ route('AllUserDownload','xls') }}" class="nav-link">Download xls</a>
                     </li>
                     <li class="nav-item">
                         <a href="{{ route('AllUserDownload','xlsx') }}" class="nav-link">Download xlsx</a>
                     </li>
                     <li class="nav-item">
                         <a href="{{ route('AllUserDownload','csv') }}" class="nav-link">Download CSV</a>
                     </li>
                 </ul>
             </div>
         </div>
         <div class="card">
             <div class="card-header">
                <h5> Import CSV </h5>
             </div>
             <div class="card-body">
                <form style="border: 1pt solid #a1cbef;margin: 10px;padding: 10px;" action="{{ route('AllUserImport') }}" class="form" method="post" enctype="multipart/form-data">
                    @csrf
                    @if ($errors->any())
                        <div class="alert alert-danger">
                            <a href="#" class="close" data-dismiss="alert" aria-label="close">x</a>
                            <ul>
                                @foreach($errors->all() as $error)
                                    <li>{{ $error }}</li>
                                @endforeach
                            </ul>
                        </div>
                    @endif

                    @if ( Session::has('success'))
                        <div class="alert alert-success">
                            <a href="#" class="close" data-dismiss="alert" aria-label="close">x</a>
                            <p>{{ Session::get('success') }}</p>
                        </div>
                    @endif

                    @if ( Session::has('fail'))
                        <div class="alert alert-danger">
                            <a href="#" class="close" data-dismiss="alert" aria-label="close">x</a>
                            <p>{{ Session::get('fail') }}</p>
                        </div>
                    @endif

                    <input type="file" name="import_file" />
                    <button class="btn btn-primary">Import CSV</button>
                </form>
             </div>
         </div>
     </div>
  </body>
</html>

7.成果

資料來源:

2019年5月2日 星期四

利用 ZenMate 訂購美國西南航空的機票

1.在瀏覽器輸入 http://www.southwest.com 會出現下列圖示
2.於是網路找尋資料,要如何進入?找到資料來源1

3.開始實作:
   (1) 到 ZenMate 免費 VPN 連線工具,支援美國、香港等五個國家 IP 伺服器
  (2) 加到 Chrome
  (3) 點選新增擴充功能
  (4)在瀏覽器上方,出現新圖示
  (5) 第一次要點選 Sign Up,輸入資料並送出

   (6)請到信箱收信,並點選來確認電子郵件帳戶
   (7)點選完後,你會發現你的帳戶是 Ultimate
  (8)點選 步驟(4)的出現的新圖示
,變更位置。可以選擇美國


   (9)此時,在瀏覽器輸入 http://www.southwest.com 會出現下列圖示。成功!!
  (10) 如何停用,點選如下位置

   (11)使用完畢後,請先登出

   (12)使用完畢後,如何移除 ZenMate。

    (13) 找到下列圖示,並點選移除


資料來源:
1.ZenMate 免費 VPN 連線工具,支援美國、香港等五個國家 IP 伺服器

2019年4月20日 星期六

php socket 修正 Server 與 Client 實作 (一)

目的:
1.Server端:能接收client傳來的訊息並寫入檔案且不傳訊息給client
2.Client端:不接收server傳來的訊息

Server端IP:192.168.32.102 Port:25001
檔名:ServerSocket.php ,檔案所在位置為 /home/webadmin/ServerSocket.php

<?php
$server_ip = '192.168.32.102';
$port = 25001;
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,$server_ip,$port);
socket_listen($socket,SOMAXCONN);
$count = 0;
do {
    $msgsocket = socket_accept($socket);
    if ($msgsocket < 0) {
        echo "socket_accept() fail : ".socket_strerror(socket_last_error())."\n";
        break;
    } else {
        $datetime = date('Y-m-d H:i:s',time());
        $str = "Server datetime:{$datetime}\n";
        $buff = socket_read($msgsocket,2048);
        $str .= "Receive client message: {$buff}"." count: ".$count."\n\n";
        echo $str;
        $str01 = $buff." ".$datetime."\n";
        if ($str01!="") {
            $file = fopen("/home/webadmin/html/ServerSocket", "a+");
            fwrite($file, $str01);
            fclose($file);
        }
    }
    $count++;
    socket_close($msgsocket);
} while ($count <= 5);
socket_close($socket);
?>
執行 ServerSocket.php 的指令
$php ServerSocket.php

Client端:IP:192.168.32.182
檔名:client.php
傳送$in 的內容給 Server 端

<?php
$server_ip = '192.168.32.102';
$port = 25001;
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($socket,$server_ip,$port);
$in = "\$\$H167,864292040653451,AAA,35\n";
socket_write($socket,$in,strlen($in));
socket_close($socket);
?>
執行client.php的指令
$php client.php

另外,在Server端的/home/webadmin/html/ 會出現一個檔案為ServerSocket
其內容為

資料來源:
1.php socket 初步實作Server 與 Client
2.[PHP]開啟及寫入檔案