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(站点端菜单配置),例如商城,注意插件的菜单配置文件顶级菜单需要是以插件名称,防止冲突



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

插件自定义配置文件:参考手册[https://ihavenolimitations.xyz/niucloud/niucloud-admin-develop/3150824]()
**4. job 插件队列以及计划任务配置**,比如商城插件订单自动关闭,订单完成任务,这些都不是同步完成的,而是系统通过消息队列进行触发的。关于消息队列的配置以及执行方法,参考手册[计划任务](https://ihavenolimitations.xyz/niucloud/niucloud-admin-develop/3171010),[消息队列](https://ihavenolimitations.xyz/niucloud/niucloud-admin-develop/3169233)
**5. lang:语言包配置,系统默认增加了中文以及英文语言包的配置加载,如果需要特殊的语言需要专门补充**
例如商城插件,里面包含3个文件,包括不同的定义,包括接口用语言,字典用语言,验证用语言,主要用作后台返回数据使用。

注意由于语言是整体加载的,要防止冲突,命名规范(api或者dict或者validate)_插件名称_具体内容例如:dict_shop_category

语言调用: get_lang("分组名称.内容"),具体分组在语言配置文件是数组形式例如:


**6. listener事件监听**,具体也可以查看thinkphp手册中关于[事件说明](https://ihavenolimitations.xyz/manual/thinkphp6_0/1037492)
插件的事件配置文件放在对应插件目录的app/event.php,例如商城插件:
这是插件的event配置文件

对应的配置文件需要在listener中有相关的类事件,否则调用会报错,例如,商城插件的AfterShopOrderCreate事件对应实现

订单创建之后通过event()调用

**7. model:插件数据表model模型**,具体书写参考thinkphp手册关于[模型定义](https://ihavenolimitations.xyz/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手册](https://ihavenolimitations.xyz/manual/thinkphp6_0/1037624)**

