# 插件开发
插件目录结构
```
├─niucloud                                     niucloud-admin框架目录
│  ├─addon                                     插件目录
│  │  ├─helloworld                             hello World插件
│  │  │  ├─admin                               admin端口
│  │  │  ├─app                                 app
│  │  │  ├─package                             依赖包,系统安装时会自动安装依赖包
│  │  │  │  ├─admin-package.json               admin端口的依赖包
│  │  │  │  ├─composer.json            主应用依赖包
│  │  │  │  ├─uni-app-package.json             uni-app端依赖包
│  │  │  │  ├─uni-app-pages.php                uni-app端口页面文件
│  │  │  │  ├─web-package.json                 web前端依赖包
│  │  │  ├─resource                            插件资源文件
│  │  │  ├─sql                                 插件的sql文件夹
│  │  │  │  ├─install.sql                      插件安装时会自动调用执行
│  │  │  │  ├─unInstall.sql                    插件卸载时会自动调用执行
│  │  │  ├─uni-app                             uni-app端口
│  │  │  ├─HelloWorld.php                      插件主安装、卸载、更新时自动调用相关函数
│  │  │  ├─info.json                           插件的配置文件
│  │  ├─myctl                     myctl插件
│  │  ├─...                       其他插件
│  ├─app                          主应用目录
```
### 开发插件步骤
1. 建立插件文件目录
我们要在niucloud\addon\ 建立插件的目录。这个目录要注意一般带有自己公司或者厂家的前缀或者后缀,防止和别人开发的同名插件冲突。
插件目录结构几乎和app的目录结构相同,这样,同样的配置文件config、数据字典dict、前后端端口,基本可以参照app目录结构来建立。
### **info.json 插件的配置文件**
title 插件的标题
desc 插件描述
key  插件关键字
version 插件版本号
author 插件作者
url 开发者网址
type 插件类型 默认值为"addon",一般不做修改
support_app 插件支持的应用,为空或省略时表示该插件支持任何应用安装。如果制定插件名称,只能指定应用安装
```
{
  "title": "hello world", 
  "desc": "Niucloud hello world演示插件",
  "key": "hello_world",
  "version": "1.0.1",
  "author": "niucloud",
  "url": "https://www.niucloud.com",
  "type": "addon",
  "support_app": "niucloud"
}
```
### **HelloWorld.php 插件程序**
每个插件都需要自己实现install, unstall, upgrade 方法。
```
class HelloWorld
{
    /**
     * 插件安装执行
     */
    public function install()
    {
        return true;
    }
    /**
     * 插件卸载执行
     */
    public function uninstall()
    {
        return true;
    }
    /**
     * 插件升级执行
     */
    public function upgrade()
    {
        return true;
    }
}
```
### **install.sql**
```
CREATE TABLE IF NOT EXISTS `{{prefix}}hello_world` (
                                                `id` int unsigned NOT NULL AUTO_INCREMENT,
                                                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
                                                PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='演示插件表';
INSERT INTO `{{prefix}}hello_world`(`id`, `name`) VALUES (1, '名称');
```
### **unInstall.sql**
```
DROP TABLE IF EXISTS `{{prefix}}hello_world`;
```
### **resource 插件资源文件**
                           
                    
        - 源码下载
 - 安装部署
 - 环境要求
 - 安装视频教程
 - 宝塔部署
 - 授权绑定
 - 二次开发须知
 - 技术栈
 - 目录结构
 - 命名规范
 - 二次开发指导
 - 二次开发环境搭建步骤
 - 二次开发注意事项
 - 单站和Saas模式开发
 - 插件结构描述
 - MENU开发
 - DIY组件/页面开发
 - 自定义手机端DIY装修页面
 - Route 路由处理
 - Services中的core文件夹
 - 自定义站点管理端控制台页面样式
 - 调用素材资源
 - Resource资源文件
 - 引入图标ICON
 - SMS发送短信开发
 - Job 消息队列和计划任务
 - 消息队列
 - 计划任务开发
 - 生产环境编译打包处理步骤
 - 生产环境搭建步骤
 - 插件安装时npm,composer检测不可用问题处理
 - 上传图片大小限制修改
 - 插件uniapp开发
 - 菜单语言包
 - 插件打包
 - 插件内测在线升级
 - 自定义端口开发
 - 如何开发自定义布局后台布局
 - 二次开发应用插件视频教程
 - 二次开发安装视频教程
 - 准备工作与创建插件
 - 插件目录整体说明
 - 插件admin目录
 - 插件app目录说明(adminapi、api、验证器)
 - 插件app目录(dict、job)
 - 插件app目录说明(lang、listener)
 - 插件app目录说明(model、service)
 - 插件uniapp目录说明
 - 插件开发之后台功能开发(代码生成器)
 - 插件开发之uniapp功能开发(api)第一节
 - 插件开发之uniapp功能开发(api)第二节
 - 插件开发之uniapp功能开发(api)第三节
 - 插件安装与打包原理
 - 消息队列开发
 - 计划任务开发
 - DIY组件和自定义页面装修开发
 - 支付接口开发
 - 插件升级包打包流程以及云编译功能
 - 常见问题
 - 怎么添加菜单,添加了菜单不出现怎么回事
 - 站点site端(租户端、商家端)和saas管理端(平台端)究竟啥意思,有啥区别
 - 框架中是有订单表order,假如开发一个商城插件,请问商城的订单数据是不是重新搞一个订单表shop_order
 - 有些支付平台是绑定回调唯一网址或目录,如果有几个开发者开发插件都有支付那这块怎么解决?
 - 站点过期,可以登录,这样对吗?
 - 计划任务怎么启动啊
 - Git多分支开发,切换分支
 - 安装应用出现is_dir():报错处理方案
 - 绑定授权时出现“请求来源产品与授权产品不一致”解决方案
 - “未找到admin源码所在目录”的解决方案
 - 页面装修本地开发环境配置
 - 接口请求错误处理方案
 - 未获取到授权信息问题处理方案
 - 腾讯地图配置
 - 请求超时问题处理方案
 - 下载应用时提示找不到zip解决方案
 - 怎么关闭开发调试模式
 - 获取数据失败问题处理方案
 - 框架安装后,访问域名无法进入admin端(多数发生在本地)
 - 底部导航失效问题
 - 开放平台小程序审核通过发布失败问题
 - 先升级插件后升级框架,导致云编译报debounce的错误
 - 微信公众号自动回复不通
 - 修改访问域名默认跳转端口
 - 插件与框架的兼容问题处理
 - 升级提示mkdir()处理方案
 - 云编译时node.js内存不足导致内存溢出处理方案
 - 报错Allowed memory size of ** bytes exhausted (tried to allocate ** bytes)处理方法
 - 安装插件提示不适配框架版本的处理
 - 代码生成器
 - 设计数据表
 - 导入数据表
 - 添加字段
 - 代码生成
 - 效果预览
 - niucloud (服务端)
 - 服务端目录结构
 - 整体运行流程
 - 入口文件
 - 模块
 - 中间件
 - 控制器
 - 路由
 - 模型类
 - 服务类
 - 验证类
 - 消息队列
 - 开发消息队列
 - 多语言
 - 装载器
 - 短信发送
 - 上传文件
 - 第三方支付
 - 第三方登录
 - 数据字典装载器
 - 打印
 - 事件
 - 消息提醒(模版消息)
 - 数据字典
 - admin (后台管理端)
 - 准备工作
 - 新手入门
 - 目录结构
 - 系统配置
 - 路由
 - 接口
 - 管理端编译上传
 - uni-app(手机端前端)
 - 准备工作
 - 前端目录结构
 - Hbuilder开发
 - 发行h5
 - 运行uniapp
 - 发行uniapp
 - Visual Studio Code开发
 - 发行 uniapp
 - 运行 uniapp
 - 配置项
 - 路由
 - 接口
 - 分包建议
 - 手机端编译
 - 微信小程序编译上传
 - web端(PC前端)
 - 准备工作
 - 目录结构
 - 代码运行
 - 路由
 - 接口
 - 黑暗主题
 - web端打包上线
 - api接口
 - 配置手册
 - 阿里云oss云存储配置
 - 三方开放平台小程序托管
 - 计划任务配置
 - 站点域名配置
 - 小票打印配置
 - 电子面单配置
 - 微信小程序客服配置
 - 微信打款配置
 
