---
# System prepended metadata

title: 程式功能研究
tags: [相關研究]

---

程式功能研究
===
###### tags: `相關研究`
[TOC]
### Laravel登入限制 
使用[RateLimiter](https://blog.twjoin.com/laravel-%E9%99%90%E5%88%B6%E6%B5%81%E9%87%8F%E5%B7%A5%E5%85%B7-ratelimiter-throttlerequests-b8c418a13701)，以公司系統為例，變動的檔案有UserController.php、login.blade.php。
RateLimiter — 簡介
RateLimiter 為 laravel 底層元件, 主要提供簡易的流量限制方法
> RateLimiter::tooManyAttempts 檢查 $key 對應的指定嘗試次數是否超過最大嘗試
```
// 範例: call:123 是否已經超過 100 次
$result = RateLimiter::tooManyAttempts(
    "call:123",
    100,
);

if ($result === true) {
    return 'too many request';
}

return $result;
```
> RateLimiter::hit 會設定 $key 以及其對應的 $decaySeconds (時間範圍) , 且主動對 $key 的嘗試次數 + 1
```
// 範例: 嘗試次數從 0 開始
// 等同於觸發了 3 次嘗試.
RateLimiter::hit("call:123");
RateLimiter::hit("call:123");
RateLimiter::hit("call:123");
```
詳細的其他應用可以參考連結文章，以下為使用公司系統實作

---
> UserController：
> use Illuminate\Support\Facades\RateLimiter
```
    public function login_send(Request $req)
    {
        //檢查是否超過登入嘗試次數限制
        if (RateLimiter::tooManyAttempts($req->ip(), $perMinute = 3)) {
            $seconds = RateLimiter::availableIn($req->ip());
            return redirect()->back()
                ->withInput($req->only('account'))
                ->withErrors(['message_error' => '登入嘗試次數過多，請在 ' . $seconds . ' 秒後再試']);
        }
        
        // 帳號錯誤
        if (!$accontCheck) {
            RateLimiter::hit($req->ip(), $decaySeconds = 100); // 登入失敗時增加登入嘗試計數器(單位：秒) 
            Session::put('message_error', '帳號錯誤');
            return Redirect()->route('login');
        }        
        
    }
    
        // 密碼錯誤
        if (!$passwordCheck) {
            RateLimiter::hit($req->ip(), $decaySeconds = 100); // 登入失敗時增加登入嘗試計數器(單位：秒)
            Session::put('message_error', '密碼錯誤');
            return Redirect()->route('login');
        }    
    
```
> login.blade.php
> 在原本include('admin.common.message')下再新增Error顯示區塊
```
    @if ($errors->any())
    <div class="alert alert-danger">
        @foreach ($errors->all() as $error)
            <p>{{ $error }}</p>
        @endforeach
    </div>
    @endif
```
---
#### Laravel 5版本
> 因教育系統使用Laravel 5.1，所以要先到[此網址](https://github.com/laravel/framework/blob/5.1/src/Illuminate/Cache/RateLimiter.php)copy Illuminate\Support\Facades\RateLimiter php檔到對應的資料夾下，才能引入這工具

> tomanyattempts則為3個參數，hit缺少increment function(8有 5沒有)，要從8的相關檔案copy程式碼
```
1.Contracts\Cache\Repository.php要新增
public function increment($key, $value = 1);

2.Illuminate\Cache\Repository.php要新增
    /**
     * Increment the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return int|bool
     */
    public function increment($key, $value = 1)
    {
        return $this->store->increment($key, $value);
    }
```
---
### PDF相關
#### TCPDF 將程式生成PDF
[說明](https://github.com/elibyy/tcpdf-laravel)
[參考教學](https://tw511.com/a/01/50032.html)
[指令](https://hackmd.io/@nfu-johnny/r1rGzagqY)
> composer require elibyy/tcpdf-laravel
```
config.php要新增相關套件：
'providers' => [
    //...
    Elibyy\TCPDF\ServiceProvider::class,
]

//...

'aliases' => [
    //...
    'PDF' => Elibyy\TCPDF\Facades\TCPDF::class
]
```


#### PDF parser 解析PDF
[說明](https://github.com/smalot/pdfparser)
[進階語法](https://github.com/smalot/pdfparser/blob/master/doc/Usage.md)
> composer require smalot/pdfparser