包含“n”的产品文档
业务系统开发文档>官网、主题开发文档
ntarea/template/目录下,如官方default主题:public/clientarea/template/default;2、模块主题,放在public/plugins/server/模块/template/clientarea/目录下,以官方default主题为例:public/plugins/server/模块/template/default(这个待处理); 二、官网1、放在public/web/目录下,如public/web/default  三、购物车主题(待处理)购物车主题分为两部分:系统购物车主题,模块购物车主题1、系统购物车主题,放在public/cart/template/目录下,如官方default主题:Public/cart/template/default;2、模块购物车主题,放在public/plugins/server/模块/template/cart/目录下,以官方default主题为例:public/plugins/server/模块/template/cart/default; 开发方式具体参考对应目录下得default主题
业务系统开发文档>模块开发文档
一.目录结构\plugins\server\demo_module|--- controller(控制器目录)|----- home(前台控制器)|----- admin(后台控制器)|--- lang(语言)|----- zh-cn.php(中文简体)|----- en-us.php(English)|----- zh-hk.php(中文繁体)|--- model(模型目录)|--- template(前端代码目录)|--- validate(验证目录)|--- DemoModule.php(模块主文件)|--- route.php(路由)|--- hooks.php(钩子)&nbsp;二.钩子由hooks.php实现例如, 实现after_host_delete钩子&nbsp;add_hook('after_host_delete', function($param){&nbsp;&nbsp;&nbsp;&nbsp;// 具体处理逻辑});&nbsp;注意:模块钩子一开始就会引入,需要在钩子里面自行增加判断,防止超出模块处理范围具体使用可以参考mf_dcim模块&nbsp;三.多语言1、需要在lang目录下提前预设语言,为了防止模块语言不冲突,尽量把模块标识作为语言文件使用时使用 lang_plugins('语言标识',$param=[]) 实现多语言,该方法定义在系统app/common.php下具体使用可以参考mf_dcim模块&nbsp;2、前端多语言&nbsp;&nbsp;&nbsp;前台多语言文件:在template/clientarea/lang/index.js&nbsp;&nbsp;&nbsp;后台多语言文件:在template/admin/lang/index.js&nbsp;&nbsp;&nbsp;(function () {&nbsp;&nbsp;const module_lang = {&nbsp;&nbsp;&nbsp;&nbsp;"zh-cn": {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add: "添加",&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;&nbsp;"zh-hk": {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add: "添加",&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;&nbsp;"en-us": {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add: "Add",&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;};&nbsp;&nbsp;const DEFAULT_LANG = localStorage.getItem("backLang") || "zh-cn";&nbsp;&nbsp;window.module_lang = module_lang[DEFAULT_LANG];})();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体参考idcsmart_common模块 &nbsp;&nbsp;&nbsp;四.路由注意:方法只有登录验证,其他鉴权需要开发者自己处理具体使用可以参考mf_dcim模块&nbsp;五.系统方法和参数方法在模块主文件里实现,主文件类名和文件名一致&nbsp;1.模块基础信息 &nbsp;metaData模块必须实现该方法&nbsp;例子:public function metaData(){return ['display_name'=>'DCIM(自定义配置)', 'version'=>'1.0.4'];}&nbsp;参数:无&nbsp;返回: string display_name 模块名称string version 版本号&nbsp;2.第一次使用模块创建该接口后 &nbsp;afterCreateFirstServer按需实现该方法,通常该方法用于添加模块需要的数据表模块表名建议idcsmart_module_+模块目录+具体,如idcsmart_module_mf_dcim_model_config_option_link&nbsp;例子:public function afterCreateFirstServer(){$sql = ["CREATE TABLE `idcsmart_module_mf_dcim_model_config_option_link` (&nbsp;&nbsp;`model_config_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'dcim型号配置id',&nbsp;&nbsp;`option_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '可选配optionID',&nbsp;&nbsp;`option_rel_type` tinyint(7) unsigned NOT NULL DEFAULT '0' COMMENT 'option表的rel_type',&nbsp;&nbsp;KEY `idx_model_config_id` (`model_config_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='型号配置可选配置表';",];foreach($sql as $v){Db::execute($v);}}&nbsp;参数:无&nbsp;返回:无&nbsp;3.删除最后一个使用该模块的接口 &nbsp;afterDeleteLastServer按需实现该方法,通常该方法用于删除模块添加的数据表&nbsp;例子:public function afterDeleteLastServer(){$sql = ['drop table `idcsmart_module_mf_dcim_model_config_option_link`;',];foreach($sql as $v){Db::execute($v);}}&nbsp;参数:无&nbsp;返回:无&nbsp;4.测试连接 &nbsp;testConnect建议实现该方法,通常使用该方法来测试和三方接口的连接状态是否可用使用位置: 后台-商品管理-接口管理页面 接口名称前面的状态&nbsp;例子:public function testConnect($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '连接成功',];return $res;}&nbsp;参数:ServerModel param.server 当前接口ServerModel,可直接获取相关接口参数&nbsp;返回:int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息&nbsp;5.产品模块开通 &nbsp;createAccount建议实现该方法,当产品自动开通或者在产品内页开通会调用该方法注意: 如果未实现该方法,开通时默认会成功&nbsp;例子:public function createAccount($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '开通成功',];return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息&nbsp;6.产品模块暂停 &nbsp;suspendAccount建议实现该方法,当产品到期或其他原因暂停或者在产品内页暂停会调用该方法注意: 如果未实现该方法,暂停时默认会成功&nbsp;例子:public function suspendAccount($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '暂停成功',];return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数string &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.suspend_type 暂停类型(overdue=到期暂停,overtraffic=超流暂停,certification_not_complete=实名未完成,other=其他,downstream=下游暂停)string &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.suspend_reason 暂停原因&nbsp;返回:int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息&nbsp;7.产品模块解除暂停 &nbsp;unsuspendAccount建议实现该方法,当产品解除暂停会调用该方法注意: 如果未实现该方法,解除暂停时默认会成功&nbsp;例子:public function unsuspendAccount($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '解除暂停成功',];return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息&nbsp;8.产品模块删除 &nbsp;terminateAccount建议实现该方法,当产品模块删除时会调用该方法注意: 如果未实现该方法,删除时默认会成功&nbsp;例子:public function terminateAccount($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '删除成功',];return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息&nbsp;9.产品续费后调用 &nbsp;renew建议实现该方法,当产品续费后会调用该方法&nbsp;例子:public function renew($param){// 续费逻辑}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:无&nbsp;10.升降级配置项后调用 &nbsp;changePackage按需实现该方法,当产品升降级配置项后会调用该方法&nbsp;例子:public function changePackage($param){// 具体逻辑}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:无&nbsp;11.升降级商品后调用 &nbsp;changeProduct按需实现该方法,当产品升降级商品后会调用该方法&nbsp;例子:public function changeProduct($param){// 具体逻辑}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client 当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server 当前产品关联接口ServerModel,可获取关联接口相关参数array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.custom 升降级参数&nbsp;返回:无&nbsp;12.购物车价格计算 &nbsp;cartCalculatePrice必须实现该方法,当商品计算价格或结算时会调用该方法&nbsp;例子:public function cartCalculatePrice($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '请求成功',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'data' &nbsp;&nbsp;=> [&nbsp;&nbsp;'price' => 1.1,&nbsp;&nbsp;'renew_price' => 1.1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'billing_cycle' => '月',&nbsp;&nbsp;'duration' => 30*24*3600,&nbsp;&nbsp;'description' => 'CPU:2核,内存:4G通用型云主机',&nbsp;&nbsp;'base_price' => 1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]];return $res;}&nbsp;参数:ProductModel param.product当前商品ProductModel,可获商品相关参数array &nbsp;param.custom 模块自定义参数int &nbsp;&nbsp;&nbsp;param.qty &nbsp;&nbsp;&nbsp;商品数量string param.scene &nbsp;场景(cal_price=计算价格,buy=结算)&nbsp;返回: int &nbsp;&nbsp;&nbsp;status 状态(200=成功,400=失败)string msg &nbsp;&nbsp;&nbsp;信息float &nbsp;data.price 价格float &nbsp;data.renew_price 续费价格string data.billing_cycle 周期名称int data.duration 周期时长(秒)string data.description 订单子项描述float data.base_price 基础价格&nbsp;13.后台商品接口配置输出 &nbsp;serverConfigOption建议实现该方法位置: 后台-商品管理-商品内页-接口管理,关联接口或接口分组后下方输出&nbsp;例子:public function serverConfigOption($param){$res = ['template'=>'template/admin/mf_dcim.html','vars' &nbsp;&nbsp;=> []];// $res = "<p>我是输出</p>";return $res;}&nbsp;参数:ProductModel param.product当前商品ProductModel,可获取商品相关参数&nbsp;返回:string|array返回string时:要输出的内容返回array时:string template 模板地址,从模块根目录开始算array &nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;替换模板变量,注意不要和系统变量冲突,使用thinkphp自带模板语法&nbsp;14.前台导航产品列表 &nbsp;hostList必须实现该方法&nbsp;例子:public function hostList($param){$res = ['template'=>'template/clientarea/product_list.html','vars' &nbsp;&nbsp;=> []];// $res = "<p>我是输出</p>";return $res;}&nbsp;参数:array param.product_id 当前导航关联的所有商品ID&nbsp;返回:string|array返回string时:要输出的内容返回array时:string template 模板地址,从模块根目录开始算array &nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;替换模板变量,注意不要和系统变量冲突,使用thinkphp自带模板语法&nbsp;15.前台产品内页输出 &nbsp;clientArea必须实现该方法&nbsp;例子:public function clientArea($param){$res = ['template'=>'template/clientarea/product_detail.html','vars' &nbsp;&nbsp;=> []];// $res = "<p>我是输出</p>";return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client &nbsp;当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product 当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server &nbsp;当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:string|array返回string时:要输出的内容返回array时:string template 模板地址,从模块根目录开始算array &nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;替换模板变量,注意不要和系统变量冲突,使用thinkphp自带模板语法&nbsp;16.后台产品内页输出 &nbsp;adminArea按需实现该方法位置: 后台-用户管理-用户列表-用户详情-产品信息最底部输出&nbsp;例子:public function adminArea($param){$res = ['template'=>'template/admin/product_detail.html','vars' &nbsp;&nbsp;=> []];// $res = "<p>我是输出</p>";return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client &nbsp;当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product 当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server &nbsp;当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:string|array返回string时:要输出的内容返回array时:string template 模板地址,从模块根目录开始算array &nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;替换模板变量,注意不要和系统变量冲突,使用thinkphp自带模板语法&nbsp;17.前台商品购买页面输出 &nbsp;clientProductConfigOption必须实现该方法,否则将不能购买该商品位置: 前台-订购产品-具体商品购买&nbsp;例子:public function clientProductConfigOption($param){$res = ['template'=>'template/clientarea/goods.html','vars' &nbsp;&nbsp;=> []];// $res = "<p>我是输出</p>";return $res;}&nbsp;参数:ProductModel param.product 当前商品ProductModel,可获取商品相关参数&nbsp;返回:string|array返回string时:要输出的内容返回array时:string template 模板地址,从模块根目录开始算array &nbsp;vars &nbsp;&nbsp;&nbsp;&nbsp;替换模板变量,注意不要和系统变量冲突,使用thinkphp自带模板语法&nbsp;18.结算之后调用 &nbsp;afterSettle建议实现该方法,一般用于存入关联关系&nbsp;例子:public function afterSettle($param){// 具体逻辑}&nbsp;参数:ProductModel param.product &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前商品ProductModel,可获取商品相关参数int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.host_id &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建的产品IDarray &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.custom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模块自定义参数array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.customfields 其他自定义参数&nbsp;返回:无 &nbsp;19.获取当前产品所有周期价格 &nbsp;durationPrice建议实现该方法, 一般用于给续费提供周期价格&nbsp;例子:public function durationPrice($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '请求成功',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'data' &nbsp;&nbsp;=> [[&nbsp;&nbsp;&nbsp;'duration' => 30*24*3600,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'billing_cycle' => '月',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'price' => 1.1,]&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp; ];}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client &nbsp;当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product 当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server &nbsp;当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:int status 状态(200=成功,400=失败)string msg 信息float data[].price &nbsp;价格string data[].billing_cycle 周期名称int data[].duration 周期时长(秒)&nbsp;20.获取商品起售周期价格 &nbsp;getPriceCycle建议实现该方法显示位置:后台-商品管理-商品管理-商品内页基础信息-商品起售价格前台-订购商品列表周期价格&nbsp;例子:public function getPriceCycle($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'price' => 1.1,&nbsp;&nbsp;&nbsp;&nbsp;'cycle' => '月',&nbsp; ];return $res;}&nbsp;参数:ProductModel param.product 当前商品ProductModel,可获取商品相关参数&nbsp;返回float &nbsp;price 商品起售价格string cycle 周期&nbsp;21.下载上游资源 &nbsp;downloadResource按需实现该方法如果需要实现上下游,需要使用该方法, 并且需要实现对应的reserver模块,同时把reserver模块打包在该模块中&nbsp;例子:public function downloadResource($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '获取成功',&nbsp;&nbsp;&nbsp;&nbsp;'data' &nbsp;&nbsp;=> ['module' => 'mf_dcim','url' &nbsp;&nbsp;&nbsp;=> request()->domain() . '/plugins/server/mf_dcim/data/abc.zip',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'version'=> '1.0.1',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp; ];return $res;}&nbsp;参数:ProductModel param.product 当前商品ProductModel,可获取商品相关参数&nbsp;返回:int status 状态(200=成功,400=失败)string msg 信息string data.module 对应reserver模块名称string data.url 对应reserver模块zip包string version 当前模块版本号&nbsp;22.产品内页模块配置信息输出 &nbsp;adminField按需实现该方法位置:用户管理-用户列表-用户内页-产品信息-产品内页配置信息&nbsp;例子:public function adminField($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;['name' &nbsp;=> '基础配置',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;'name' &nbsp;&nbsp;&nbsp;=> '数据中心',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'key' &nbsp;&nbsp;&nbsp;&nbsp;=> 'data_center',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'value' &nbsp;&nbsp;=> '中国-香港',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'disable' => true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp; ];return $res;}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client &nbsp;当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product 当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server &nbsp;当前产品关联接口ServerModel,可获取关联接口相关参数&nbsp;返回:string [].name 配置小标题string [].field[].name &nbsp;&nbsp;&nbsp;名称string [].field[].key &nbsp;&nbsp;&nbsp;&nbsp;标识(不要重复)string [].field[].value &nbsp;&nbsp;当前值bool &nbsp;&nbsp;[].field[].disable 状态(false=可修改,true=不可修改)&nbsp;23.产品保存后 &nbsp;hostUpdate按需实现该方法,该方法建议和adminField方法一起使用&nbsp;例子:public function hostUpdate($param){// 实现配置变更逻辑}&nbsp;参数:HostModel &nbsp;&nbsp;&nbsp;param.host &nbsp;&nbsp;&nbsp;当前产品HostModel,可获取产品相关参数ClientModel &nbsp;param.client &nbsp;当前产品所属用户ClientModel,可获取产品所属用户相关参数ProductModel param.product 当前产品所属商品ProductModel,可获取产品对应商品相关参数ServerModel &nbsp;param.server &nbsp;当前产品关联接口ServerModel,可获取关联接口相关参数array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.module_admin_field 模块自定义配置信息(键是配置标识,值是填写的内容)&nbsp;返回:int status 状态(200=成功,400=失败)string msg 提示信息&nbsp;24.获取商品所有配置项 &nbsp;allConfigOption不推荐使用该方法,需要返回商品的所有配置&nbsp;例子:public function allConfigOption($param){$res = [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'status' => 200,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'msg' &nbsp;&nbsp;&nbsp;=> '获取成功',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'data' &nbsp;&nbsp;=> [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' &nbsp;=> '内存',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'memory',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' &nbsp;=> 'dropdown',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'option'=> [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => '2G',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'value'=> '2',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]];return $res;}&nbsp;参数:ProductModel param.product 当前商品ProductModel,可获取商品相关参数&nbsp;返回:int status 状态(200=成功,400=失败)string msg 信息string data[].name &nbsp;配置项名称string data[].field 订购时对应配置的键string data[].type &nbsp;类型(dropdown=下拉),只支持下拉string data[].option[].name 选项名称int|string data[].option[].value 对应选项值&nbsp;&nbsp;
业务系统开发文档>挂件开发文档
ns/widget/目录下2、挂件文件名不能重复,挂件文件名以大写开头的驼峰命名,如: ActiveClient&nbsp;二、挂件类1、文件名和类名保持一致,挂件标识即文件名,如: public/plugins/widget/ActiveClient.php<?php namespace widget;&nbsp;use app\common\lib\Widget;use app\common\model\ClientModel;&nbsp;class ActiveClient extends Widget{&nbsp;&nbsp;&nbsp;&nbsp;protected $title = '活跃用户';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected $weight = 60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected $columns = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function getData()&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; $data = [];&nbsp;&nbsp;&nbsp;&nbsp; $active = ClientModel::where('status', 1)->where('last_login_time', '>=', time()-15*24*3600)->count();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$count = ClientModel::where('status', 1)->count();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['active_client_count'] = $active;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['active_client_percent'] = $count>0 ? bcmul(($active/$count), 100, 1) : '0.0';&nbsp;&nbsp;&nbsp;&nbsp; return $data;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function output(){&nbsp;&nbsp;&nbsp;&nbsp; $data = $this->getData();&nbsp;&nbsp;&nbsp;&nbsp; return <<<HTML<div class="top-item active-div"><div><span>{$data['active_client_count']}</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;活跃用户(人)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> <div class="trend blue-text active-box">活跃率 {$data['active_client_percent']}%</div> <div><span></span> <span></span> <span></span> <span></span></div></div>HTML;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;2、挂件类必须继承 &nbsp;app\common\lib\Widget&nbsp;3、挂件属性$title &nbsp;挂件名称,必须$weight &nbsp; 挂件排序权重,越小越靠前,默认=100,$columns &nbsp; 挂件占用列数,范围1-4,默认=1&nbsp;4、挂件必须实现 getData,output方法方法名称描述参数返回getData获取挂件数据需要返回一个数组, 返回的内容会通过 "获取挂件数据"接口返回&nbsp;output 输出需要返回一个字符串用于显示,返回的内容支持html标签和javascript, 返回的内容会通过 "获取挂件内容"接口返回&nbsp;&nbsp;三、通过hook增加挂件1、hook名称是 admin_widget2、返回的必须是实例化的挂件类,注意不要和挂件路径下的挂件冲突3、示例:add_hook("admin_widget", function(){return new ActiveClient();});&nbsp;四、挂件上传后,需要重新登录,在管理组添加对应挂件权限就可使用&nbsp;&nbsp;&nbsp;&nbsp;
DCIM使用文档>3.功能介绍>3.4 产品销售>3.4.6 产品销售常见问题
N,请先设置],需如何解决?在WHMCS自动开通服务器时,提示[可分配的IP不足,只可分配0个]是什么原因?在WHMCS中,对服务器点击开机时,提示[模块命令错误,产品不一致,无法操作]是什么原因?在WHMCS中,对机器进行暂停或删除命令时,会对服务器执行哪些命令?WHMCS与DCIM可以不在同一服务器上吗?WHMCS系统中,在实现自动开通时,有些操作按钮不存在该怎么解决在产品销售-服务器租用里,点击客户信息后,出现404页面,该怎么解决?问题解答1.在WHMCS订购并收到付款后,并不能实现自动开通是什么原因?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)在WHMCS添加产品时,注意在【模块设置】中,需勾选【当收到客户首付款时自动开通】.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)如果已经设置为自动开通,确没有自动开通,请尝试手动点击开通,看具体错误是什么原因。2.在自动开通时,提示[无法连接服务器管理系统],是什么原因?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)请检查DCIM系统-【系统设置】-【API授权】中的IP地址是否填写正确,该地址必须为WHMCS系统的IP地址(如果服务器有多个IP,需要填写主IP)。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)检查WHMCS系统中,通过【导航栏】-【系统设置】-【产品/服务】-【服务器设置】中,主机名与IP必须是DCIM系统的主IP。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)在【服务器详情】区域,类型必须为IPMI,且用户名和密码必须是DCIM系统种设置的API授权中的用户名和IP。3.在WHMCS自动开通服务器时,提示[交换机没有可用的VLAN,请先设置],需如何解决?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在服务器详情页面,点击交换机信息进入交换机详情页面,然后在连接信息区域点击可用VLAN后方区域设置。4.在WHMCS自动开通服务器时,提示[可分配的IP不足,只可分配0个]是什么原因?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在【DCIM系统】-【IP资源管理】中,IP段必须启用自动分配才支持开通服务器时自动分配。5.在WHMCS中,对服务器点击开机时,提示[模块命令错误,产品不一致,无法操作]是什么原因?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出现这个问题的原因时因为DCIM系统中记录的该服务器用户和WHMCS系统中记录的用户不是同一个,只需要在DCIM系统中清除销售数据里面的用户信息,然后在WHMCS系统后台产品详情页点击状态同步按钮即可解决。6.在WHMCS中,对机器进行暂停或删除命令时,会对服务器执行哪些命令?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些命令会根据您在【DCIM系统设置】的【WHMCS设置】里面执行。7.WHMCS与DCIM可以安装在不同服务器吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以,DCIM系统和WHMCS两套系统是分开的。用API对接,WHMCS管理财务和客户。DCIM管理服务器资源。通过WHMCS的server modules对接,实现WHMCS里面记录一个客户有哪个服务器,操作到DCIM,对接对WHMCS本身不会有任何数据查询和资料变动。8.WHMCS系统中,在实现自动开通时,有些操作按钮不存在该怎么解决?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些功能需要在配置IPMI WHMCS插件的时候在参数里面设置,具体参考:ipmi插件配置Access Hash(访问散列值)参数说明9.在产品销售-服务器租用里,点击客户信息后,出现404页面,该怎么解决?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在DCIM系统设置 - 【WHMCS设置】里面,输入正确的WHMCS后台地址即可。
DCIM使用文档>3.功能介绍>3.6 数据与监控>3.6.1 流量图相关设置 cvs/单位设置
nbsp; &nbsp;&nbsp;5.1 95计费和进出方向设置&nbsp; &nbsp;&nbsp;5.2&nbsp;csv数据下载&nbsp; &nbsp;&nbsp;5.3&nbsp;设置流量频率&nbsp; &nbsp;&nbsp;5.4&nbsp;流量图进制换算六、其他问题&nbsp; &nbsp;&nbsp;6.1 储存时间&nbsp; &nbsp;&nbsp;6.2 断点的情况&nbsp; &nbsp;&nbsp;6.3 交换机Snmp连接失败一、系统工作原理和要求系统内置流量图功能,无需部署mrtg或zabbix等流量图软件,即可实现流量图和每日用量统计,流量图还可导出为csv数据及单位换算选项,以适应不同的客户场景。DCIM系统流量图是通过交换机SNMP获取,因此确保交换机SNMP在系统中能正常连接。二、使用前的设置①添加交换机设备。详细请查看:>>如何添加交换机②snmp拉取成功。详细请查看:>>&nbsp;如何填写SNMP信息三、查看流量图和用量图①查看流量图及95数据实时监控交换机各端口的进出口带宽规模和网速,并对每个端口分别统计流量以及帐户流量消耗信息。【设备管理】-【物理服务器/交换机】-点击交换机标签,进入设备摘要,下拉页面即可看到流量图及95信息。②查看用量图在交换机页面中点击用量信息,统计出交换机出入口流量计总流量使用情况。注:如交换机snmp连接异常,则无法获取数据四、交换机服务器端口实时流量图【设备管理】-【物理服务器】-点击交换机名称进入服务器摘要图,点击查看流量图。五、其他设置&nbsp;①95计费和进出方向设置实现对端口、机柜租用、服务器租用/托管的流量95th计费能力,包含进方向、出方向、进出双向三种类型的自由计费组合。【系统设置】栏选择【常规设置】-【流量设置】,在【流量图95线】中选择3种设置。② csv数据下载选择【交换机端口】和【查看时间】后,点击【导出CSV】后,会下载一个excel表格文件。打开excel表格,即可清晰看到交换机端口在所选时间段中进/出带宽每秒所传输的速率,如下图。③设置流量频率【系统设置】栏选择【常规设置】,在【流量采集间隔】中选择频率。④流量图进制换算可根据需求,选择流量图单位换算,进制分别是1000/1024。【系统设置】栏选择【常规设置】,在【流量图换算单位进制】中选择单位进制。六、其他问题①流量图数据会存储多久?流量数据理论上永久存在被控设备上,请确保硬盘正常工作。若使用交换机重建流量图功能,则会清空之前的流量数据,请谨慎操作。②流量图为什么出现了断点的情况?&nbsp;&nbsp;&nbsp;&nbsp;网络状况异常被控硬盘性能不足③我的交换机为什么snmp连接失败?请确保交换机snmp信息填写正确,可前往【检测工具】-【SNMP检测】进行检测。
业务系统开发文档>三方登录开发文档
ns\oauth\ 目录下&nbsp;二、目录结构\public\plugins\oauth\qq\|--- Qq.php (入口文件)|--- config.php (配置项客户配置项,在插件设置中显示)|--- qq.svg (登录界面上要显示的图片&nbsp;三、开发流程(本文以QQ为例)&nbsp;1、创建QQ目录,示例\public\plugins\oauth\qq\目录名以 小写字母+下划线 形式,必须以字母开头,如 qq&nbsp;2、创建config.php注意返回的键不要是name,callback,state,code,system_oauth_state以及三方跳转自带的参数,示例return [&nbsp;&nbsp;&nbsp;&nbsp;'app_key' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> [ &nbsp;&nbsp;&nbsp;# 在后台插件配置表单中的键名(统一规范:小写+下划线),会是config[app_key]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'AppKey', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 表单的label标题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' &nbsp;=> 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 表单的类型:text文本,password密码,checkbox复选框,select下拉,radio单选,textarea文本区域,tip提示&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'value' => '', &nbsp;&nbsp;&nbsp;&nbsp;# 表单的默认值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tip' &nbsp;&nbsp;=> 'AppKey', &nbsp;# 表单的帮助提示&nbsp;&nbsp;&nbsp;&nbsp;],&nbsp;&nbsp;&nbsp;&nbsp;'app_secret' &nbsp;&nbsp;&nbsp;=> [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'AppSecret',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' &nbsp;=> 'text',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'value' => '',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tip' &nbsp;&nbsp;=> 'AppSecret',&nbsp;&nbsp;&nbsp;&nbsp;],];&nbsp;3、创建入口文件①示例:Qq.php&nbsp;②操作步骤命名空间 namespace oauth\qq (控制器下命名空间对应相应目录即可,其它同理);以目录名 大驼峰+.php ,创建在根目录下,如 qq\Qq.php,类需要继承app\common\lib\Oauth&nbsp;③文件中需要定义info属性,示例:// 插件基础信息public $info = ['name' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'Qq', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 必填 插件标识,一般就是该类名 (唯一)'title' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'QQ', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 必填 插件显示名称'description' => 'QQ', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 必填 插件功能描述'author' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'idcsmart',// 必填 作者'version' &nbsp;&nbsp;&nbsp;&nbsp;=> '1.0.0', &nbsp;&nbsp;// 必填 插件版本'author_url' &nbsp;=> '', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 选填 作者链接'help_url' &nbsp;&nbsp;&nbsp;=> 'https://connect.qq.com/', // 选填 申请链接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'logo_url' &nbsp;&nbsp;&nbsp;=> 'qq.svg', &nbsp;// 必填 图标地址];&nbsp;④必须实现url和callback 两个方法方法名称描述请求地址参数返回url生成授权地址&nbsp;GET /console/v1/oauth/:name;name为插件标识接收参数$params ,$params是数组,包含了下面两种信息;数组包含了config.php中的所有参数(key相同,注意不要覆盖了三方的信息),外加一个$params['callback']回调地址;$params['system_oauth_state']如果授权地址需要state参数,必须使用该参数,系统会自动验证;示例:["app_id"=>"123","callback"=>"test.com","system_oauth_state"=>"123"]&nbsp;返回的类型:string返回的数据:三方登录地址示例:https://graph.qq.com/oauth2.0/authorize/testcallback处理回调GET /console/v1/oauth/callback/:name, name是插件标识接收参数$params ,$params是数组,包含了下面三种信息&nbsp;数组包含了config.php中的所有参数(key相同,注意不要覆盖了三方的信息)外加一个$params['callback']回调地址三方登录成功后跳转返回的参数&nbsp;返回的类型:array返回的数据:示例:return ['openid' => '', // 必须,三方登录授权成功后返回的用户唯一标识'data' &nbsp;=> ['username' => '', &nbsp;// 可选,名称],];&nbsp;&nbsp;⑤实现可选方法方法名称描述请求地址参数返回receive如果需要接受三方服务商推送信息,可以使用该接口来实现&nbsp;ANY /console/v1/oauth/:name/command/receive, :name是插件标识数组包含了config.php中的所有参数(key相同,注意不要覆盖了三方的信息)&nbsp;数组可能不会包含请求体参数, 需要自行获取&nbsp;返回:根据要求自行返回中断即可&nbsp;&nbsp;4、查看到后台插件管理界面刷新就会看到新添加的插件,安装、配置即可使用。&nbsp;四、示例1、参考qyweixin,qq,weixin,dingtalk2、系统源码参考app\home\controller\OauthControllerapp\home\model\OauthModel&nbsp;
业务系统开发文档>短信接口开发文档
ns\sms\目录下&nbsp;二、目录结构以智简魔方官方短信平台接口为例,其主要目录结构如下:\public\plugins\sms\idcsmart\|--- Idcsmart.php&nbsp;(入口文件)|--- config.php&nbsp;(配置项客户配置项,在插件设置中显示)&nbsp;三、开发流程以智简魔方官方短信平台接口为例:1、创建实名认证目录\public\plugins\sms\idcsmart\;①目录名以小写字母+下划线形式,必须以字母开头,如idcsmart;&nbsp;2、创建入口文件:Idcsmart.php:①命名空间namespace sms\idcsmart(控制器下命名空间对应相应目录即可,其它同理);②以目录名大驼峰+.php,创建在短信接口根目录下,如idcsmart\Idcsmart.php;③文件中需要定义info属性,示例:# 基础信息public $info = array(&nbsp;&nbsp;&nbsp;&nbsp;'name' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'Idcsmart',//Demo插件英文名,改成你的插件英文就行了&nbsp;&nbsp;&nbsp;&nbsp;'title' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '智简魔方',&nbsp;&nbsp;&nbsp;&nbsp;'description' => '智简魔方官方短信平台接口',&nbsp;&nbsp;&nbsp;&nbsp;'status' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 1,&nbsp;&nbsp;&nbsp;&nbsp;'author' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '智简魔方',&nbsp;&nbsp;&nbsp;&nbsp;'version' &nbsp;&nbsp;&nbsp;&nbsp;=> '1.0.1',&nbsp;&nbsp;&nbsp;&nbsp;'help_url' &nbsp;&nbsp;&nbsp;&nbsp;=> 'https://my.idcsmart.com/goods.htm?id=922',//申请接口地址);④必须实现install()安装以及uninstall()卸载方法,没有额外操作,返回true即可;⑤需要实现以下方法方法名称描述参数返回getCnTemplate获取国内模板template_id:模板ID;config:自定义配置;示例:['template_id'=>1,'config'=>{}];status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]createCnTemplate创建国内模板title:模板标题;content:模板内容;config:自定义配置;示例:["title"=>"test","content"=>"测试内容","config"=>{"key"=>"value"}]status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;putCnTemplate修改国内模板title:模板标题;content:模板内容;config:自定义配置;示例:["title"=>"test","content"=>"测试内容","config"=>{"key"=>"value"}]status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;deleteCnTemplate删除国内模板template_id:模板ID;config:自定义配置;示例:['template_id'=>1,'config'=>{}];status:状态,success成功,error失败;成功示例:["status"=>"success"];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;sendCnSms发送国内短信mobile:手机号;content:模板内容;config:自定义配置;template_id:模板ID;templateParam:模板参数,参考附表1示例:["mobile"=>"129483782423","content"=>"测试内容","config"=>{"key"=>"value"},'template_id'=>1,'templateParam'=>1]status:状态,success成功,error失败;content:已替换参数的模板内容;msg:错误信息成功示例:["status"=>"success","content"=>"测试内容"];失败示例:["status"=>"error","msg"=>"模板ID错误","content"=>"测试内容"]&nbsp;getGlobalTemplate获取国际模板template_id:模板ID;config:自定义配置;示例:['template_id'=>1,'config'=>{}];status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]createGlobalTemplate创建国际模板title:模板标题;content:模板内容;config:自定义配置;示例:["title"=>"test","content"=>"测试内容","config"=>{"key"=>"value"}]status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;putGlobalTemplate修改国际模板title:模板标题;content:模板内容;config:自定义配置;示例:["title"=>"test","content"=>"测试内容","config"=>{"key"=>"value"}]status:状态,success成功,error失败;template.template_id:模板ID;template.template_status:模板状态,0未提交,1审核中,2通过,3未通过;成功示例:["status"=>"success","template"=>["template_id"=>"w3423","template_status"=>2]];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;deleteGlobalTemplate删除国际模板template_id:模板ID;config:自定义配置;示例:['template_id'=>1,'config'=>{}];status:状态,success成功,error失败;成功示例:["status"=>"success"];失败示例:["status"=>"error","msg"=>"模板ID错误"]&nbsp;sendGlobalSms发送国际短信mobile:手机号;content:模板内容;config:自定义配置;template_id:模板ID;templateParam:模板参数,参考附表1示例:["mobile"=>"129483782423","content"=>"测试内容","config"=>{"key"=>"value"},'template_id'=>1,'templateParam'=>1]status:状态,success成功,error失败;content:已替换参数的模板内容;msg:错误信息成功示例:["status"=>"success","content"=>"测试内容"];失败示例:["status"=>"error","msg"=>"模板ID错误","content"=>"测试内容"]&nbsp;&nbsp;3、创建默认短信模板①在插件根目录下创建config/smsTemplate.php文件;②文件内容返回一个数组即可,如下:return [&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => '验证码',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'content' => '验证码@var(code),5分钟内有效!请勿泄漏于他人',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'=>'code'&nbsp;&nbsp;&nbsp;&nbsp;],]title标题;content内容,带参数;name为系统模板标识,唯一;③系统默认模板参考附表2;④在install安装中返回模板数组,系统会自动创建模板;&nbsp;4、到后台短信通知管理,可以查看接口列表,安装、配置即可使用。&nbsp;四、示例参考智简魔方官方短信平台接口idcsmart&nbsp;五、附附表1、templateParam参数列表(国际国内参数一样)参数名描述类型示例system_website_name系统网站名系统智简魔方system_website_url系统网站地址系统www.idcsmart.comorder_id订单ID订单125order_create_time订单创建时间订单1707094285order_amount订单金额订单1.00product_name产品名称(包括商品名和主机名)产品测试-ser23142123product_marker_name商品名称产品测试product_first_payment_amount产品首付金额产品100.00product_renew_amount产品续费金额产品100.00product_binlly_cycle产品周期产品计费周期免费free,一次onetime,周期先付recurring_prepayment,周期后付recurring_postpaidproduct_active_time产品激活时间产品1707094285product_due_time产品到期时间产品1707094285product_suspend_reason产品暂停原因产品到期暂停renewal_first续费X天后到期第一次提醒产品1renewal_second续费X天后到期第二次提醒产品2client_register_time客户注册时间客户1707094285client_username用户名客户testclient_email邮件客户135460@qq.comclient_phone手机号客户16548765643client_company公司客户智简魔方client_last_login_time最后登录时间客户1707094285client_last_login_ip最后登录ip客户122.32.13.3account账户名客户test&nbsp;附表2、系统默认短信模板(以下模板内容为官方短信平台模板内容,使用需修改)系统模板标识(name)模板标题(title)模板类型模板内容(content)示例code验证码系统验证码@var(code),5分钟内有效!请勿泄漏于他人client_login_success用户登录客户您的账号@var(account)成功登录系统,如不是本人操作请及时修改密码client_register_success用户注册客户@var(account),感谢您支持@var(system_website_name)client_change_phone客户更改手机客户您的手机号被改为:@var(client_phone),请注意账户安全client_change_password客户更改密码客户您的密码被改为:@var(client_password),请注意账户安全order_create订单创建订单您已下单,订单:@var(order_id)(订单号),请及时支付host_pending产品开通中产品您的产品:@var(product_name)(产品名称)正在开通,请耐心等待host_active开通成功产品您的产品:@var(product_name)(产品名称),已开通可使用host_suspend产品暂停通知产品您的产品:@var(product_name)(产品名称),由于@var(product_suspend_reason),已停用host_unsuspend产品解除暂停通知产品您的产品:@var(product_name)(产品名称),已解除暂停host_terminate产品删除通知产品您的产品:@var(product_name)(产品名称),由于到期未续费,已删除host_upgrad产品升降级产品您已成功升级产品@var(product_name),感谢您的支持host_renewal_first第一次续费提醒产品您的产品:@var(product_name)(产品名称),还有@var(renewal_first)天到期,请及时续费host_renewal_second第二次续费提醒产品您的产品:@var(product_name)(产品名称),还有@var(renewal_second)天到期,请及时续费host_overdue_first逾期付款第一次提醒产品您的产品:@var(product_name)(产品名称)已到期,将会删除,请及时续费host_overdue_second逾期付款第二次提醒产品您的产品:@var(product_name)(产品名称)已到期,将会删除,请及时续费host_overdue_third逾期付款第三次提醒产品您的产品:@var(product_name)(产品名称)已到期,将会删除,请及时续费order_overdue订单未付款通知订单您的订单:@var(order_id)(订单号)尚未支付,金额@var(order_amount),请及时支付admin_order_amount订单金额修改订单您的订单:@var(order_id)(订单号)金额修改为@var(order_amount),请及时支付order_pay订单支付通知订单您的订单:@var(order_id)(订单号)支付成功,支付金额为:@var(order_amount)元order_recharge充值成功通知订单充值成功,本次充值金额为:@var(order_amount)元&nbsp;
财务系统使用文档>其他>财务更新后-前台用户无法登录
nbsp; &nbsp; &nbsp; &nbsp; 注意:该问题不是BUG,而是更新后的财务,增加了会员中心加密功能,增强了安全性。(该特性是 V3.6.1之后添加的)&nbsp; &nbsp; &nbsp; &nbsp; 该加密机制以适配官方的主题模板,但若是使用了三方的主题模板,可能不支持加密,就会导致用户前台无法登录。解决办法一、更换为魔方官方的会员中心(不演示了)解决办法二、为 自定义的会员中心&nbsp;关闭 登录加密功能。
魔方云系统使用文档>10. 网站管理与升级>资源包
nbsp;1、进入资源包页面,创建资源包&nbsp;2、资源包创建&nbsp;3、将创建的资源包分配给用户使用注意:分配了资源包的用户就是代理商,可以根据资源包的配置创建实例或者创建子账户&nbsp;4、管理员查看资源分配情况&nbsp;5、代理商必须选择资源包,进行实例创建、子账户创建,当资源包里面的资源被使用完毕,则不能再创建实例/子账户&nbsp;&nbsp;6、代理商查看自己名下资源包资源的使用情况&nbsp;