# 二次开发
二次开发注意事项
### **应用和插件的区分**
通常的,我们可以把业务相对独立的一个完整的功能,开发为插件。
开发插件的好处是系统具有非常好的扩展性。
基于niucloud-admin框架体系而言,我们一般的把一个功能单元定义为两个类型(**应用、插件**)。非常深刻的理解应用和插件的定义,区分他们的区别,对于系统的可扩展性和开发方案的规划是非常重要的前提。
注意!在niucloud-admin框架体系,一个框架只支持单个应用安装多个插件。而非多应用!niucloud-admin框架不支持多应用。我们设计的初衷是简单,高效,可扩展。如果多应用模式,会成倍增加开发者的复杂度,导致系统最终无法维护。<br>
**区分他们需要考虑两点**
第一,要开发的系统是否庞大,是否可能要修改整个niucloud-admin框架核心代码才能实现最终的业务功能,如果涉及到前面所述,我们一般会基于niucloud-admin框架进行全面的定制。这样的开发一般叫应用开发,插件是运行在应用上的功能扩展,插件是不能独立运行的,niucloud-admin框架是一个最基础的应用。一套niucloud-admin框架开发的系统,安装和运营只能有一个应用,一个应用可以安装多个支持本应用的插件。
第二,对于一些功能,相对单一,和其他系统单元没有过多的耦合性,也几乎没有业务黏连。或者,是实现某项具体的内核功能,这类型的功能,一般定义并开发为插件。比如阿里云短信,这一个系统功能,和任何业务系统没有关联,功能完全是独立的。再比如,开发一个刮刮乐的游戏,或者抽奖的小系统。这一类型的业务系统,一般的,仅仅会对会员账户的积分,佣金等操作。和具体的其他的业务几乎没有关联,这一类型的功能,一般开发为插件。插件的好处是便于流传,各种应用都可以加载,对于小开发商来说,可以从一个插件做起。
### **二次开发中的继承和重写思想**
好的二次开发的系统,是兼容框架代码,不修改框架主体任何代码。并且不会因为二次开发之后,影响到系统与框架的同步升级的架构设计。这个一定要从项目设计阶段就考虑。
在此,牛哥讲解几种思维方式
1. 我们有这样一个业务需求,所有的功能都使用niucloud-admin框架本身的,只是会员列表、会员编辑的功能完全不符合自己的业务需求,因为我们希望实现的会员列表要有储值、累计消费金额、累计消费次数、当月消费金额、当月消费次数、而不要现在框架本身自带的手机号,注册方式等等等。对于这类型的开发,我们一定不要修改框架本身的功能,我们要做的是,我们新建一个插件,然后在插件中实现我们自己的会员列表和会员编辑,然后隐藏系统会员列表菜单,加载自定义的菜单并路由到自己编写的会员列表。这样,框架升级的时候,完全不影响二次开发的功能。完美实现二次开发与框架的兼容升级。
2. 我们有这样一个业务需求,手机端的个人中心和我想要的个人中心样式不同,要考虑几点
    从api 接口,控制器,service考虑。一定有一个非常重要的概念,接口的功能唯一性、单一性。对于niucloud-admin本身查询会员中心的api接口可能是,[*http://127.0.0.1/adminapi/member/center*](http://127.0.0.1/adminapi/member/center), 我们二次开发一定不能修改这个接口,(一定记住!只要修改框架的任何东西,都可能会影响与官方的同步升级)。我们可以在插件中,来定义新的个人中心的接口比如 center\_v2, center\_v3, 然后自己写的页面调用此接口
    对于前台而言,如果某个diy组件实现不了自己的样式和功能,那就重写一个组件,对于某个系统页面实现不了自己的页面需求,那就自己重写个页面,总归不能调整框架的任何东西。这些只是整体的一个复用思维方式,至于真的有复杂的系统,改写部分页面不如大动干戈,那就彻底的改造他。造成的后果就是升级的兼容性问题。
3. 具体的功能代码块,相互调用尽可能通过事件回调减少耦合
4. 整个niucloud-admin框架,对于插件的思想,是以会员账户的积分,余额(可提现、不可提现),佣金的增减业务调整为主体思想的。这样,开发者开发的插件都可以通用,各种应用也可以通用。
                    
        - 源码下载
 - 安装部署
 - 环境要求
 - 安装视频教程
 - 宝塔部署
 - 授权绑定
 - 二次开发须知
 - 技术栈
 - 目录结构
 - 命名规范
 - 二次开发指导
 - 二次开发环境搭建步骤
 - 二次开发注意事项
 - 单站和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云存储配置
 - 三方开放平台小程序托管
 - 计划任务配置
 - 站点域名配置
 - 小票打印配置
 - 电子面单配置
 - 微信小程序客服配置
 - 微信打款配置
 
