业务系统开发文档>插件开发
一、位置插件放在\public\plugins\addon\目录下 二、目录结构\plugins\addon\idcsmart_ticket|--- controller(控制器目录,后台控制器直接放此目录下)|--- clientarea(前台控制器放此目录下)|--- lang(语言目录)|--- zh-cn.php(中文语言文件)|--- template(模板)|--- admin(后台模板目录)|--- clientarea(前台模板目录)|--- IdcsmartTicket.php(插件主文件)|--- route.php(自定义路由文件)|--- sidebar.php(后台插件导航文件) 三、开发流程以工单插件为例:1、创建工单插件目录\public\plugins\addon\idcsmart_ticket\;①目录名以小写字母+下划线形式,必须以字母开头,如idcsmart_ticket; 2、创建入口文件:IdcsmartTicket.php:①命名空间namespace addon\idcsmart_ticket(控制器下命名空间对应相应目录即可,其它同理);②以目录名大驼峰+.php,创建在插件根目录下,如idcsmart_ticket\IdcsmartTicket.php;③文件中需要定义info属性,示例:# 插件基本信息public $info = array( 'name' => 'IdcsmartTicket', //插件英文名,作为插件唯一标识,改成你的插件英文就行了 'title' => '智简魔方工单插件', //插件名称 'description' => '智简魔方工单插件', //插件描述 'author' => 'idcsmart', //开发者 'version' => '1.0', // 版本号);④必须实现install()安装以及uninstall()卸载方法⑤可实现钩子方法,如要实现订单创建后钩子after_order_create,则可在此文件中创建public function afterOrderCreate($param)公共方法;⑥系统会在订单创建后的位置放置⑤中的钩子,放置方式:hook(‘after_order_create’,[‘id’=>$orderId]) ;⑦如果定义变量noNav,表示不需要默认导航(具体参考7,插件后台导航)public $noNav; 3、创建插件后台控制器 idcsmart_ticket\controller\TicketController.php①命名空间addon\idcsmart_ticket\controller;②继承后台基类控制器PluginAdminBaseController,增加了权限控制,允许使用一些通用方法;③get_admin_id()可获取后台管理员登录ID;④实现接口,如public function ticketList(),系统默认访问此接口的url为:网站地址/admin/addon?_plugin=idcsmart_ticket&_controller=ticket&_action=ticket_list,说明:系统默认地址默认登录,若需要免登录访问,需要自定义路由(见后面自定义路由);⑤系统提供了生成④中默认访问地址的方法:idcsmart_addon_url($url,$vars=[],$is_admin=false)参数说明:url: 格式:插件名://控制器名/方法,如 IdcsmartTicket://Ticket/ticketListvars: 参数,默认为空数组Is_admin: 是否后台,默认为false 4、创建插件前台控制器idcsmart_ticket\controller\clientarea\TicketController.php①命名空间addon\idcsmart_ticket\controller\clientarea;②继承前台基类控制器PluginBaseController,允许使用一些通用方法;③get_client_id()可获取前台客户登录ID;④实现接口,如public function ticketList(),系统默认访问此接口的url为:网站地址/console/addon?_plugin=idcsmart_ticket&_controller=ticket&_action=ticket_list或者:网站地址/console/addon?_plugin=1&_controller=ticket&_action=ticket_list,1表示插件ID;说明:系统默认地址默认登录,若需要免登录访问,需要自定义路由(见后面自定义路由);⑤系统提供了生成④中默认访问地址的方法:idcsmart_addon_url($url,$vars=[],$is_admin=false)参数说明:url: 格式:插件名://控制器名/方法,如 IdcsmartTicket://Ticket/ticketListvars: 参数,默认为空数组Is_admin: 是否后台,默认为false 5、插件提供两种路由:①、系统默认url带参数,参考4②、自定义路由,插件根目录下定义route.php,示例:前台路由:Route::group('console/v1',function (){Route::get('ticket',"\\addon\\idcsmart_ticket\\controller\\clientarea\\TicketController@ticketList")->append(['_plugin'=>'idcsmart_ticket','_controller'=>'ticket','_action'=>'ticket_list']);# 带上默认参数,可以使用继承控制器app\admin\controller\PluginBaseController的一些通用方法,也可以不追加这些参数(_plugin插件名称C风格,_controller控制器名称C风格,_action方法名称C风格)})->middleware(\app\http\middleware\ParamFilter::class)->middleware(\app\http\middleware\CheckHome::class);#前台需要登录就使用此中间件后台路由:Route::group(DIR_ADMIN . '/v1',function (){ Route::get('ticket',"\\addon\idcsmart_ticket\controller\TicketController@ticketList")->append(['_plugin'=>'idcsmart_ticket','_controller'=>'ticket','_action'=>'ticket_list']);})->middleware(\app\http\middleware\ParamFilter::class)->middleware(\app\http\middleware\CheckAdmin::class);#后台需要登录就使用此中间件 6、插件多语言①创建语言文件lang/zh-cn.php,返回如下格式的数组:return [ 'success_message' => '请求成功', 'ticket_title_require' => '请输入工单标题','ticket_log_client_create_ticket' => '{client}新建工单:{ticket_id}',] ②使用lang_plugins('语言标识',$param=[])实现多语言,$param为语言文件中参数,格式['{client}'=>'wyh'],如:lang_plugins('ticket_log_client_create_ticket',['{client}'=>'wyh','{ticket_id}'=>1]);③前端多语言文件 前台语言文件:在template/clientarea/lang/目录下index.js文件; 后台语言文件:在template/admin/lang目录下(function () { const module_lang = { "zh-cn": { add: "添加", }, "zh-hk": { add: "添加", }, "en-us": { add: "Add", }, }; const DEFAULT_LANG = localStorage.getItem("backLang") || "zh-cn"; window.module_lang = module_lang[DEFAULT_LANG];})(); 具体参考idcsmart_ticket工单插件 7、插件后台导航①导航默认会创建在插件导航之下,默认链接:plugin/插件名/index.html,对应template/admin/index.php文件,同时需要在lang/下的语言文件创建如下格式的语言,nav_plugin_addon_插件名:'nav_plugin_addon_idcsmart_ticket' => '工单', ②自定义导航,若是一级导航,会增加在插件导航之上,管理导航之下,在插件根目录下创建sidebar.php,示例:/* * 自定义后台导航菜单(仅支持一二级),注意系统会在插件导航下默认创建url为"plugin/插件名称/index.html"的导航,因此需要在template/admin/目录下创建index.php文件作为插件入口 */return [ [ # 一级导航 'name' => 'nav_plugin_addon_ticket', # 导航名称,不要与系统冲突(参考idcsmart_nav表中name字段),同时需要在lang/目录下定义语言 'url' => '', # 为空表示一级导航,不需要链接 'icon' => 'tools', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon 'in' => '', # 一级导航,此值为空 'child' => [ # 二级导航 [ 'name' => 'nav_plugin_addon_ticket_list', # 导航名称 'url' => 'ticket', # 链接格式,会自动加上.html 'in' => 'nav_user_management', # 可定义导航在某个一级导航之下,默认会放置在此一级导航最后的位置(获取方式:idcsmart_nav表中的parent_id==0的name字段) 'icon' => '', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon ], [ 'name' => 'nav_plugin_addon_ticket_internal_list', # 导航名称 'url' => 'ticket_internal', # 链接格式,会自动加上.html 'in' => '', # 可定义导航在某个一级导航之下,默认会放置在此一级导航最后的位置 'icon' => '', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon ], ] ],]; 8、插件前台导航①导航默认会创建在插件导航之下,默认链接:plugin/插件名/index.html;②自定义导航,会增加在插件导航之上,管理导航之下,在插件根目录下创建sidebar_clientarea.php,示例:/* * 自定义前台导航菜单(仅支持一二级) */return [ [ 'name' => 'nav_plugin_addon_ticket', # 链接名称,同时需要在lang/目录下定义语言 'url' => '', # 链接格式,会自动加上.html 'icon' => '', # 图标 'child' => [ # 二级菜单 [ 'name' => 'nav_plugin_addon_ticket_list', 'url' => 'ticket', 'icon' => '', # 图标 ], ] ],]; 9、插件后台权限管理在插件根目录下创建auth.php,示例如下(注意定义语言):<?php/* * 定义权限,系统会默认插入名称为插件名的一级权限,以下仅需定义二级/三级权限;(首先,要使用二级权限,插件后台控制器需要继承app\event\controller\PluginAdminBaseController基类控制器) */return [ [ 'title' => 'auth_plugin_addon_ticket_list', # y用户工单 'url' => 'ticket', 'child' => [ # 操作权限 [ 'title' => 'auth_plugin_addon_ticket_view', # 工单查看 'url' => '', 'auth_rule' => 'TicketController::ticketList', # 工单列表具体控制器方法 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_list' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_receive', 'url' => '', 'auth_rule' => 'TicketController::receive', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_receive' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_resolved', 'url' => '', 'auth_rule' => 'TicketController::resolved', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_resolved' # 具体权限名称 ], ] ], [ 'title' => 'auth_plugin_addon_ticket_detail', # 工单详情 'url' => 'ticket_detail', 'child' => [ [ 'title' => 'auth_plugin_addon_ticket_view', 'url' => '', 'auth_rule' => 'TicketController::index', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_index' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_reply', 'url' => '', 'auth_rule' => 'TicketController::reply', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_reply' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_download', 'url' => '', 'auth_rule' => 'TicketController::download', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_download' # 具体权限名称 ], ] ], [ 'title' => 'auth_plugin_addon_ticket_internal_list', # 内部工单 'url' => 'ticket_internal', 'child' => [ [ 'title' => 'auth_plugin_addon_ticket_view', 'url' => '', 'auth_rule' => 'TicketInternalController::ticketInternalList', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_list' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_view', 'url' => '', 'auth_rule' => 'TicketInternalController::index', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_index' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_add', 'url' => '', 'auth_rule' => 'TicketInternalController::create', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_create' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_receive', 'url' => '', 'auth_rule' => 'TicketInternalController::receive', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_receive' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_resolved', 'url' => '', 'auth_rule' => 'TicketInternalController::resolved', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_resolved' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_reply', 'url' => '', 'auth_rule' => 'TicketInternalController::reply', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_reply' # 具体权限名称 ], [ 'title' => 'auth_plugin_addon_ticket_forward', 'url' => '', 'auth_rule' => 'TicketInternalController::forward', 'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_forward' # 具体权限名称 ], ] ],]; 10、插件接口内部调用使用plugin_api($addon,$controller,$action,$param=[])函数可内部调用插件API,需要开发者提供插件API开发文档,具体格式参考系统API文档 * @param string addon - 插件 require * @param string controller - 控制器前缀 require * @param string action - 方法 require * @param array param - 传入的参数 四、示例具体可参考智简魔方工单插件public\plugins\addon\idcsmart_ticket\