改進我們的 Laravel Nova CRM(三)

leienshu發表於2019-02-02

在前面的兩篇文章裡,我一步一步介紹了 Laravel Nova 的一些特性,這裡我將針對第二篇文章新建的那個 CRM 做一些改進。

在本教程中,我們將瞭解如何使用 Nova 的操作(Action)和授權。

開始

如果您是 Nova 的新手,我建議您檢視下我以前的文章,我詳細解釋瞭如何在您的機器上安裝和設定 Nova。 在本教程中,我將假設我們在一個新的 Laravel 專案中安裝了 Nova。 所以,你應該能夠登入並看到下面這個圖片:

優化一些CSS樣式

上一篇文章的首頁介面有點醜陋,我這裡增加一點CSS樣式,讓他好看點。

<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Nova CRM Demo</title>
    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
    <!-- Styles -->
    <link href="https://cdn.jsdelivr.net/npm/tailwindcss/dist/tailwind.min.css" rel="stylesheet">
    <title>Nova CRM 演示</title>
</head>
<body>
    <div class="flex flex-col items-center justify-center md:h-screen md:bg-blue-lightest">
        <form class="w-full max-w-md bg-white rounded p-10 md:shadow" action="/form-submit" method="POST">
            <h1 class="text-grey-darkest mb-8 text-center">註冊我們的Nova程式</h1>
            {{ csrf_field() }}
                <div class="flex flex-wrap -mx-3 mb-6">
                    <label  class="block uppercase tracking-wide text-grey-darker text-xs font-bold mb-2" for="name">姓名:</label>
                    <input class="appearance-none block w-full bg-grey-lighter text-grey-darker border rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white {{ $errors->has('name') ? 'border-red mb-3' : 'border-grey-lighter' }} id="name" name="name" type="text" placeholder="Lei">
                </div>

                <div>
                    <div class="flex flex-wrap -mx-3 mb-6">
                        <label class="block uppercase tracking-wide text-grey-darker text-xs font-bold mb-2" for="email">
                            郵箱
                        </label>
                        <input class="appearance-none block w-full bg-grey-lighter text-grey-darker border rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-grey {{ $errors->has('email') ? 'border-red mb-3' : 'border-grey-lighter' }}" id="email" name="email" type="email" placeholder="lei@example.com">
                        @if($errors->has('email'))
                            <p class="text-red text-xs italic">{{ $errors->first('email') }}</p>
                        @endif
                    </div>
                </div>
                <button class="block bg-blue px-6 py-4 text-white rounded mx-auto hover:bg-blue-dark" type="submit">提交</button>
            </form>
            @if (session('form-success'))
                <div class="bg-green mt-8 p-6 rounded shadow">
                    <p class="text-white">{{ session('form-success') }}</p>
                </div>
            @endif
        </div>
</body>
</html>

更改後的樣式

Actions

對於我們的CRM,如果我們可以直接從索引頁面更新我們的潛在客戶狀態,那就太棒了。 這樣,我們的銷售團隊可以在他們打銷售電話時快速管理潛在客戶。

首先,我們將使用Nova cli生成器使用以下命令為我們啟動Action。

php artisan nova:action UpdateVisitorStatus

找到app\Nova\Actions 資料夾下面的 UpdateVisitorStatus.php檔案,你可以看到兩個方法,一個handle 一個 fields 方法。

讓我們首先定義我們的fields(),這樣我們就可以在handle()中使用它們。 在我們的這個例子中,我們想詢問使用者他們希望訪客擁有哪種狀態。 為此,我們可以使用我們在Visitor Resource中使用的相同程式碼。

public function fields()
    {
        return [
            Select::make('Status')
            ->options(\App\Visitor::getStatuses()),
        ];
    }

注意引入:
use Laravel\Nova\Fields\Select;

現在,我們可以接收使用者的狀態選擇,我們可以編寫我們的handle()方法。

public function handle(ActionFields $fields, Collection $models)
    {
        foreach ($models as $model) {
            $model->status = $fields->status;
            $model->save();
        }
    }

到上面我們的Action就完成了,現在在Visitor Resource裡面註冊。

public function actions(Request $request)
    {
        return [
            new Actions\UpdateVisitorStatus,
        ];
    }

Action

如果你這裡沒有顯示的話,請記住選中任意一條記錄,你不選中是不會顯示的。

另外:下面的兩個引數可以控制Action顯示在首頁還是在詳情頁。

public $onlyOnIndex = true;
public $onlyOnDetail = true;

詳情頁的Action

授權

確保使用者只能與他們有權訪問的功能進行互動是一件大事。 在過去的專案中,這個處理起來很麻煩,不過幸運的是,Nova實現起來輕而易舉。

我們的這個CRM,由於是我們團隊使用的內部工具,因此我們沒有大量的訪問問題需要處理。 所以我們只要確保我們的管理員使用者才能刪除潛在客戶,使用者和標籤。

首先,我們要給使用者模型建立一個isAdmin的方法。

當然我這裡是採用硬編碼的方式來處理,你可以儲存到資料庫裡,也可以用一個許可權包來處理。

public function isAdmin()
    {
        $admin_emails = [
            'rennesusher@gmail.com'
        ];

        return in_array($this->email, $admin_emails);
    }

把上面的郵箱換成你的管理員郵箱。

對了,這裡提一下,Nova是開箱即用,它有Laravel的policy功能,你不明白的話去翻文件吧。

php artisan make:policy UserPolicy -m User
php artisan make:policy VisitorPolicy -m Visitor
php artisan make:policy NotePolicy -m Note

在 AuthServiceProvider.php 檔案中註冊。

protected $policies = [
        'App\User' => 'App\Policies\UserPolicy',
        'App\Visitor' => 'App\Policies\VisitorPolicy',
        'App\Note' => 'App\Policies\NotePolicy',
    ];

通過註冊策略,我們可以執行所有預先生成的方法並定義我們的訪問邏輯。

public function view(User $user, <model> $model)
{
    return true;
}

public function create(User $user)
{
    return true;
}

public function update(User $user, <model> $model)
{
    return true;
}

public function delete(User $user, <model> $model)
{
    return $user->isAdmin();
}

public function restore(User $user, <model> $model)
{
    return $user->isAdmin();
}

public function forceDelete(User $user, <model> $model)
{
    return $user->isAdmin();
}

注意上面的對應的就是我們新建的3個policy。

換一個非管理員登入下nova後臺,你可以看到刪除什麼按鈕都消失了。

沒有刪除選項了

完結

好了,關於nova的三篇文章都結束了,歡迎提意見。

專案原始碼地址:https://github.com/leienshu/learn-nova

提前祝大家新春快樂!

求知若飢,虛心若愚!

相關文章