app:插件后臺php代碼目錄
```
├─adminapi 插件后臺應用接口目錄
│ ├─controller 后臺接口控制器
│ ├─route 后臺接口路由配置文件
│
├─api 插件前臺應用接口目錄
│ ├─controller 前臺接口控制器
│ ├─route 前臺接口路由配置文件
│
├─dict 插件字典目錄
│ ├─menu 插件菜單配置目錄
│ │ ├─admin.php 插件后臺菜單配置文件
...
│
├─job 插件任務目錄(包括消息隊列,異步任務)
│
├─lang 插件接口語言文件目錄
│ ├─zh-cn 插件接口中文語言目錄
│ │ ├─api.php 插件接口調用的語言文件
│ │ ├─dict.php 插件字典調用的語言文件
│ │ ├─validate.php 插件驗證數據調用的語言文件
│ ├─en 插件接口英語語言目錄
...
│
├─listener 插件監聽時間執行目錄
│
├─model 插件數據庫模塊目錄
│
├─service 插件service服務層目錄
│
├─validate 插件接口數據驗證目錄
│
├─event.php 插件事件配置目錄,安裝插件自動加載
```
**1. adminapi:后臺管理接口,包括控制器以及對應的路由**
后臺控制器需要繼承BaseAdminController

對應路由命名,必須命名route.php,注意分組名稱統一按照插件名稱定義,防止沖突

插件adminapi路由規則注意1. 對應的方法需要使用命名空間;2. 注意路由中間件,里面包括檢測站點,檢測用戶權限等功能。
**2. api:前臺接口,包括前臺控制器以及對應路由**
前臺控制器需要繼承BaseApiController, 注意命名空間

對應路由命名,必須命名route.php,注意分組名稱統一按照插件名稱定義,防止沖突

閱讀一下route.php就會發現里面分組有兩部分,一部分路由中間件提示需要驗證登錄,一部分提示不需要驗證登錄,這個與具體業務有關,如果插件的功能需要驗證登錄就要將對應的路由方法寫到驗證登錄的路由配置,反之增加到不驗證登錄的路由配置,比如文章分類,文章管理不需要必須登錄查看,所以放在不驗證登錄的方法。
**3. dict:字典配置,這里主要書寫插件對應的字典配置文件**,比如商城中商品類型等固定的配置項,這里重點說明,插件的菜單配置文件,自定義模板相關配置文件也在這里,例如商城插件

插件菜單配置文件包括dict/menu/admin.php(平臺端菜單配置),dict/menu/site.php(站點端菜單配置),例如商城,注意插件的菜單配置文件頂級菜單需要是以插件名稱,防止沖突



如果插件菜單配置文件以及修改,要進行更新

插件自定義配置文件:參考手冊[http://www.hmoore.net/niucloud/niucloud-admin-develop/3150824]()
**4. job 插件隊列以及計劃任務配置**,比如商城插件訂單自動關閉,訂單完成任務,這些都不是同步完成的,而是系統通過消息隊列進行觸發的。關于消息隊列的配置以及執行方法,參考手冊[計劃任務](http://www.hmoore.net/niucloud/niucloud-admin-develop/3171010),[消息隊列](http://www.hmoore.net/niucloud/niucloud-admin-develop/3169233)
**5. lang:語言包配置,系統默認增加了中文以及英文語言包的配置加載,如果需要特殊的語言需要專門補充**
例如商城插件,里面包含3個文件,包括不同的定義,包括接口用語言,字典用語言,驗證用語言,主要用作后臺返回數據使用。

注意由于語言是整體加載的,要防止沖突,命名規范(api或者dict或者validate)_插件名稱_具體內容例如:dict_shop_category

語言調用: get_lang("分組名稱.內容"),具體分組在語言配置文件是數組形式例如:


**6. listener事件監聽**,具體也可以查看thinkphp手冊中關于[事件說明](http://www.hmoore.net/manual/thinkphp6_0/1037492)
插件的事件配置文件放在對應插件目錄的app/event.php,例如商城插件:
這是插件的event配置文件

對應的配置文件需要在listener中有相關的類事件,否則調用會報錯,例如,商城插件的AfterShopOrderCreate事件對應實現

訂單創建之后通過event()調用

**7. model:插件數據表model模型**,具體書寫參考thinkphp手冊關于[模型定義](http://www.hmoore.net/manual/thinkphp6_0/1037580)
模型類繼承BaseModel,關于具體說明后期專門講解

**8. service:插件業務層,業務層的作用是為接口實現功能,原則上業務層的功能與接口一致**。niucloud插件service分為三部分:admin ,api,core 。admin的作用是為adminapi提供相關數據接口,api的作用是為api接口層提供相關數據接口,core不分端口,所有數據參數需要專門傳入。下面通過商城插件里面的功能對具體service進行說明
這里是商城插件的service層,包括admin,api,core

**adminapi的作用是實現adminapi的接口控制器做數據服務**,比如admin下面的Category類:
需要繼承BaseAdminService,因為繼承之后關于adminapi登錄后的用戶,站點等基礎數據可以直接使用。



service層處理數據庫業務,具體通過實例化model類中的對象,通過thinkphp的連貫操作查詢


**api作用是實現api接口控制器服務**,比如商城插件api下面的GoodsCategory類:
需要繼承BaseApiService,繼承之后官員api的登錄會員,站點等基礎信息直接獲取,而不是傳參


**code不針對接口,一般用作核心業務的處理**,比如商城訂單業務,不會針對前臺或者后臺的數據服務,而是針對商城系統本身,core層的類不能通過控制器直接調用,而是供對應admin或者api的service層調用
比如商城插件的訂單創建,以及訂單操作,admin會使用,api也會使用,注意core的函數參數都需要傳入,不能直接獲取,系統無法預知傳入參數。



**9. validate:用作接口的數據驗證,具體驗證規則可以查看[thinkphp手冊](http://www.hmoore.net/manual/thinkphp6_0/1037624)**

