cms/README.md
2020-02-23 22:02:33 +08:00

404 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 1. 系統需求
- PHP 7.3
- PHP Extensions
- BCMath
- Ctype
- JSON
- Mbstring
- OpenSSL
- PDO PHP
- Tokenizer
- XML,
## 2. IDE需求
- 支援Editor Config
## 3. 額外Composer套件
#### 3.1 Dev
- **[barryvdh/laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper)**
> 會自動產生Laravel相關的phpDocs, 使IDE對Laravel的支援度提高
- **[barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)**
> 輔助偵錯用的小工具
#### 3.2 Online
- **[spatie/laravel-permission](https://github.com/spatie/laravel-permission)**
> 權限管理(Role、Permission)
- **[predis/predis](https://github.com/nrk/predis)**
> Redis連線套件
## 4. 安裝注意事項(網站資料庫重置後請從4.2開始)
#### 4.1 Laravel安裝步驟
1. 安裝Node Packages
> npm i
2. 複製.env.example 至 .env
> cp .env.example .env
3. 產生APP Key
> php artisan key:generate
4. 在.env填好資料庫資訊
#### 4.2 網站安裝步驟
1. 安裝資料表,建立預設資料
> php artisan migrate --seed
2. 建立管理員權限帳號
> php artisan account:create-admin {email} {password}
3. 建立編輯者權限帳號
> php artisan account:create-editor {email} {password}
4. 訪問後台,預設路徑為*/adm*
## 5. Debugbar使用說明
使用套件為 [barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)*(正式環境請勿開啟)*
#### 5.1 載入Debugbar
`.env` 檔案內的 `APP_DEBUG` 設為 `true`
#### 5.2 啟用與停用
啟用: 在網址後傳入參數: `__debugbar` , 值為 `enable`
例: `https://example.com/?__debugbar=enable`
停用: 在網址後傳入參數: `__debugbar` , 值為 `enable` 之外的任意值
例: `https://example.com/?__debugbar=disable`
## 6. 設定語系
新訪問的使用者會根據瀏覽器語言自動設定語系
如不支援,則設定成設定檔`app.fallback_locale`所定義的語系
#### 6.1 支援的語系
所有支援的語系資訊在 `config/languages.php`
#### 6.2 切換語系
網址傳入參數: `locale`
例: `https://example.com/?locale=ja`
## 7. 資料夾檔案與類別
#### 7.1 程式類別
- **Controllers**
App\Http\Controllers\Admin
> 後台
App\Http\Controllers\Admin\Menu
> 後台選單
- **App\Presenters**
> 用來輔助產生Html或文字的類別
- **App\Repositories**
> 用來進行複雜的資料庫存取可繼承BaseRepository
- **App\Service**
> 其他的輔助類別
#### 7.2 Config(設定檔)
- config/admin.php
> 後台相關設定檔
- config/data-resets.php
> 網站的種子資料(須在網站安裝時存入的資料透過Seeder安裝)
- config/languages.php
> 網站所支援的語系
#### 7.3 圖片檔案
- storage/app/public/uploads/app
> 媒體庫上傳的檔案
## 8.自訂Artisan指令列表
Artisan指令參數格式
- `{xxx}` 必填,輸入 xxx
- `{xxx?}` 選填,輸入 xxx
- `{--xxx}` 可選選項,輸入 --xxx
- `{--xxx=}` 可選選項,輸入 --xxx=值,不帶的話都是隨機產生
輸入範例指令media:create {amount?} {--app} {--user=} {--width=} {--height=} {--category=}
```bash
media:create 1
media:create --app --user=1 --width=1080
media:create --user=1 --category=12
```
#### 8.1 帳號
- 建立管理員帳號
```bash
account:create-admin {Email} {密碼}
```
- 產生編輯帳號
```bash
account:create-editor{Email} {密碼}
```
#### 8.2 建立檔案
- 建立一個Repository類別檔案
```bash
make:repository {類別名稱: xxxRepository}
```
- 建立一個後台選單Controller(MenuItemController)檔案
> 主項目
```bash
make:menu-item-controller ParentMenuItemController
```
> 子項目
```bash
make:menu-item-controller Parent/Children/ChildrenMenuItemController
```
#### 8.3 媒體庫(參考9.)
- 產生媒體庫圖片
```bash
media:generate {數量?}預設1 {--user=}使用者id {--width=}寬度 {--height=}高度 {--category=}媒體庫分類id
```
#### 8.5 媒體庫分類
- 產生媒體庫分類
```bash
media-category:generate {數量?}預設1 {--app}是否為網站媒體庫分類 {--user=}使用者id
```
#### 8.6 Permission
- 重新安裝所有角色與權限當data-presets檔內有修改權限的話可用這個指令重新安裝會將原本有的重新對應權限給角色
```bash
permission:reinstall
```
## 9. 媒體庫
後台使用者共用媒體庫圖片
## 10. 後台選單架構
#### 10.1 建立選單的流程
1. 於`app/Http/Controllers/Admin/Menu/` 下依照原有結構去建立資料夾及Controller一個Menu項目建立一個Controller
2. 每個Controller皆繼承`App\Http\Controllers\Admin\Menu\BaseMenuItemController`
3. Controller內填入
- `name` (選單名稱,可支援翻譯路徑表示法)
- `slug` (選單項目唯一名稱,不可重複)
- `permissions` (選填,設定後台選單項目的權限,須有權限才能看得到項目及進去頁面,如果有子母選單,則要看到子選單,必須要有母選單的權限才行,子選單也可獨立設定權限,這樣就兩個權限都要符合才行)
- `iconClasses` (選填選單項目圖示的class, 可為陣列或字串)
- `badge` (選填Bootstrap的badge)
- `type` (badge類型) secondary、dange、success等等
- `label` (badge的文字內容)
- `isPill` (是否為橢圓形)
4. 繼承"handle" method處理進去選單項目時的動作如果是母選單項目可不設因為母選單點下去就只是展開子選單而已不會有動作
5. 在`config/admin.php`的`menuItems`內填入新增的Controller
> type支援item、title(文字)、divider(分隔線),參考`App\Presenters\Admin\MainMenuItemPresenter`
#### 10.2 相關類別
- App\Services\Admin\MainMenuItemService
`Singleton Instance`建構及儲存Menu項目的資料
- App\Provider\AdminMenuServiceProvider
讀取`config/admin.php`中的`menuItems`設定建立route與儲存到MainMenuItemService
- App\Presenters\Admin\MainMenuItemPresenter
根據`MainMenuItemService`內儲存的Menu資料建構Html
- App\Http\Middleware\CheckAdminMenuPagePermission
檢查Admin選單項目的route權限
## 11. 後台"設定"頁面及程式架構
#### 11.1 新增一個設定子頁面的流程
1. 於`config/app.php`的`options`內設定頁面的slug及頁面下面有哪些選項
```php
'page_slug' => [ // 頁面slug
'permission': 'admin manage options page_slug' // OptionsController的gate
'option_1' => [ // 選項slug實際儲存在資料庫中的key
'type' => 'checkbox', // 選填預設值為input text選項的類型支援的類型參考`App\Presenters\Admin\OptionFormFieldsPresenter`
'label(選項的名稱)' => 'abc', // 翻譯的字串定義在lang/form.php內的labels
'validator' => 'required|min:8', // 選填選項更新時的後端驗證規則此為Laravel Validator的規則
'required' => true, // 選填選項輸入欄位的html中的required屬性,
]
]
```
2. 建立設定頁面的`選單項目Controller`,在`App\Http\Controller\Admin\Menu\Options\Children`,並加入至`config`
#### 11.2 相關類別
- App\Providers\OptionRouteServiceProvider
> 建立儲存選項時的Route
- App\Http\Controllers\Admin\OptionsController
> 儲存選項時的 Route Controller
## 12. MiddlWare
- App\Http\Middleware\AdminAreaGuard
> 判斷後台權限
- App\Http\Middlwware\CheckAdminMenuPagePermission
> 檢查Admin選單項目的route權限
- App\Http\Middleware\DebugbarEnabler
> 開啟或關閉debugbar並處理
- App\Http\Middlware\SetAppLanguage
> 設定網站語系
- App\Http\Middleware\SetSiteStates
> 設定SiteStateService中的資料
## 13. Service
- App\Services\AppJsObjectService
> 提供資料給前端js使用
- App\Services\MediaFileFactoryService
> 產生假的媒體檔案
- App\Services\SiteStateService
> 紀錄全域的網站狀態
## 14. Service Provider
- App\Providers\AdminMenuServiceProvider
> 從Config檔案建立Menu Item並註冊相關Route
- App\Providers\OptionRouteServiceProvider
> 建立後台設定頁面的route
- App\Providers\SingletonServiceProvider
> 初始化所有singleton class 的 instance
## 15. 資料表 & Model
- **disks** **Disk**
> 本機儲存位置定義在config/filesystems.php
- **media_categories** **MediaCategory**
> 媒體分類
- **media_files** **MediaFile**
> 媒體檔案
- **media_sources** **MediaSource**
> 外部媒體來源
- **model_translations** **ModelTranslation**
> Model的翻譯
- **options** **Option**
> 設定選項
- **users** **User**
> 使用者
- **password_resets**
> 重設密碼的tokens
- **model_has_permissions**
> model的權限給spatie/laravel-permission套件使用的table
- **model_has_roles**
> model的角色給spatie/laravel-permission套件使用的table
- **permissions**
> 權限給spatie/laravel-permission套件使用的table
- **roles**
> 角色給spatie/laravel-permission套件使用的table
- **role_has_permissions**
> 角色的能力給spatie/laravel-permission套件使用的table
## 16. Model
- App\TranslatableModel
> 被繼承用需要翻譯的Model繼承的Model要設定需要被翻譯的屬性
- App\Post
> 被繼承用為各文章類型的Parent Model
## 17. 文章類型
建立文章類型的流程
1. 建立Model繼承App\Post
2. 建立migration基本屬性可使用*App\Traits\PostBlueprintGettable:processSchema()*傳入Blueprint
3. 加入文章類型至`/config/postTypes.php`
4. 加入選單項目(參考現有),後台管理功能和模板會自動共用
## 18. Event及Listener
用來在Model產生特定資料庫操作動作(增刪修)後做特定的事情
例如
- Media刪除後須跟著刪除檔案
- 可翻譯的Model被刪除後須跟著刪除翻譯資料
#### 17.1 類別
- App\Event
> Model做特定動作之後會發出的Event
- App\Listeners
> 發出Event之後要做的動作
- App\Observers
> 觀察Model並在Model做特定動作之後要做的動作
#### 17.2 使用方法
**Event**
1. 新增一個Event
2. 新增一個Listener
3. 在Model內註冊event
4. 在EventServiceProvider內註冊Event對應的Listener
5. 在Event內設定Event發生的主體Model
6. 在Listener內處理要做的事情
**Observer**
1. 新增一個Oberserver
2. 在Model內註冊Observer
3. 在Observer內處理要做的事情