插件开发 · 模板开发 · 上游对接 · 自研受控端 · 数据库结构 · 系统在线更新
语信IDC财务管理系统是一款基于ThinkPHP 8开发的IDC财务管理系统,支持虚拟主机、VPS/云服务器、CDN等产品的销售和管理。系统采用插件化架构,支持通过插件扩展功能,支持多模板切换。
Db::name('表名') 而不是写死表前缀。
├── app/ # 应用目录
│ ├── admin/ # 后台管理
│ ├── home/ # 前台
│ ├── user/ # 用户中心
│ ├── api/ # API接口
│ └── common.php # 公共函数
├── plugins/ # 插件目录
│ └── plugins/ # 插件列表(纯净安装包为空,每个插件一个目录)
│ └── 插件标识/ # 开发者开发的插件目录
├── view/ # 模板视图根目录
│ └── template/ # 模板安装目录(V1.1.3.2 起,原根目录 template/ 已迁移)
│ ├── yuxin/ # 官方默认模板
│ │ └── default/
│ └── 开发者标识/模板名/ # 开发者发布的第三方模板
├── public/ # 公开目录(静态资源发布到 public/static/)
├── route/ # 路由配置
├── config/ # 配置文件
│ └── version.php # 系统版本配置
├── runtime/ # 运行时目录
└── vendor/ # 第三方库
template/ 迁移到 view/template/(与 ThinkPHP 视图根目录统一)。开发新模板请按新目录结构开发;旧模板通过系统在线更新会自动迁移并清理旧目录。
每个插件放在 plugins/plugins/插件标识/ 目录下,包含以下文件:
plugins/plugins/bt/
├── Bt.php # 插件主类
├── plugin.json # 插件配置文件
├── install.sql # 安装SQL(可选,插件自带表)
├── config.html # 插件配置页面模板(可选)
└── README.md # 插件说明
{
"name": "bt",
"title": "宝塔官方API",
"version": "1.0.3",
"author": "语信科技",
"type": "host",
"description": "对接宝塔面板官方API,支持虚拟主机自动开通和自研控制面板",
"config_params": [
{
"key": "php_version",
"name": "PHP版本",
"type": "select",
"options": [
{"value": "", "label": "纯静态"},
{"value": "74", "label": "PHP 7.4"},
{"value": "82", "label": "PHP 8.2"}
],
"default": "82",
"user_selectable": true,
"dynamic": true,
"description": "站点运行的PHP版本(从受控端动态获取已安装版本)"
}
],
"panel_actions": ["site_list", "php_version", "rewrite", "ssl", "ftp", "domain", "backup"]
}
| 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 插件标识(唯一) |
| title | string | 插件名称 |
| version | string | 插件版本 |
| author | string | 插件作者 |
| type | string | 插件类型:host/vps/cdn/dedi/payment/sms |
| description | string | 插件描述 |
| config_params | array | 可配置参数列表 |
| panel_actions | array | 自研控制面板支持的操作(host类型插件) |
| panel | object | 控制面板声明(vps 等类型插件):enabled/title/template/tabs |
系统 PluginManager::hostAction() 同时支持两种插件风格,插件二选一实现:
风格一:静态 nodeAction(bt 风格)——先由系统解析产品关联的节点,再调用插件静态方法:
<?php
namespace plugin\bt;
class Bt
{
public static function nodeAction(array $node, array $product, array $host, string $action, array $extra = []): array
{
// 实现插件逻辑
}
public static function testConnection(array $node): array
{
// 测试连接
}
public static function panelAction(array $node, array $host, string $action, array $params = []): array
{
// 控制面板操作
}
public static function getLoginInfo(array $node, array $host): array
{
// 返回登录信息
}
}
风格二:实例 hostAction(kvm / 对接通用风格,推荐)——插件实例化时传入合并后的配置(插件全局 config + 产品 config,若产品关联上游分组则上游分组 config 优先覆盖),方法签名更简洁,无需自行解析节点:
<?php
namespace plugin\kvm;
class Kvm
{
/**
* 构造注入:合并后的插件配置
*/
public function __construct(array $config = [])
{
$this->config = $config;
}
/**
* 服务操作(系统统一入口)
* @param string $action create/renew/terminate/suspend/unsuspend/resetpwd/upgrade/login/test
* @param array $host 主机服务记录(含 config,开通成功后系统会把 plugin_result 回写到 host.config)
* @param array $extra 额外参数(用户选择的配置等)
*/
public function hostAction(string $action, array $host, array $extra = []): array
{
// 实现插件逻辑
}
}
| 操作类型 | 说明 |
|---|---|
| create | 创建服务(先开通、后扣费) |
| renew | 续期服务 |
| terminate | 删除服务 |
| suspend | 暂停服务 |
| unsuspend | 启用服务 |
| resetpwd | 重置密码 |
| upgrade | 弹性升级(VPS 重构后支持) |
| login | 一键登录(可选) |
| test | 测试连接 |
插件 create 成功时,可在返回的 data 中回传 plugin_result(如受控端返回的虚拟机 ID、IP、SSH 账号等),系统会自动将其合并写入 host.config.plugin_result。后续控制面板等操作通过该 ID 定位上游资源(云主机控制面板依赖此字段,缺失会提示"云主机ID缺失")。
return [
'code' => 0, // 0成功,1失败
'msg' => '成功', // 提示信息
'data' => [] // 返回数据
];
| 类型 | 说明 | 前台显示 |
|---|---|---|
| select | 下拉选择 | 下拉框 |
| radio | 单选 | 单选按钮 |
| text | 文本输入 | 输入框 |
| number | 数字输入 | 数字输入框 |
| textarea | 多行文本 | 文本域 |
{
"key": "php_version", // 参数键名
"name": "PHP版本", // 参数名称
"type": "select", // 参数类型
"options": [ // 选项(select/radio类型需要)
{"value": "", "label": "纯静态"},
{"value": "82", "label": "PHP 8.2"}
],
"default": "82", // 默认值
"user_selectable": true, // 是否允许用户在购买时选择
"dynamic": true, // 是否动态获取选项(如PHP版本从受控端获取)
"description": "站点运行的PHP版本" // 参数描述
}
当 user_selectable 设置为 true 时,用户在购买产品时可以在购买详情页选择该参数的值。用户选择的值会覆盖产品的默认配置,并在开通服务时传递给插件。
当 dynamic 设置为 true 时,参数选项会从受控端动态获取(如PHP版本列表从宝塔面板获取已安装的PHP版本),而不是写死在配置中。
| 参数键名 | 参数名称 | 类型 | 用户可选择 | 动态 | 默认值 |
|---|---|---|---|---|---|
| php_version | PHP版本 | select | 是 | 是 | 82 |
| db_version | 数据库版本 | select | 是 | 否 | 57 |
| db_charset | 数据库字符集 | select | 否 | 否 | utf8mb4 |
| create_db | 创建数据库 | radio | 是 | 否 | 是 |
| create_ftp | 创建FTP | radio | 是 | 否 | 是 |
| space_size | 空间大小 | number | 否 | 否 | 1024 |
| db_size | 数据库大小 | number | 否 | 否 | 100 |
模板安装在系统根目录 view/template/开发者标识/模板名/ 下,一个模板包包含以下内容:
view/template/开发者标识/模板名/
├── template.json # 模板清单(name/title/version/developer)
├── view/ # 模板视图文件(PHP引擎读取,浏览器无法直接访问)
│ ├── home/ # 前台模板
│ ├── user/ # 用户中心模板
│ ├── admin/ # 后台模板(仅官方默认模板)
│ └── agent/ # 代理端模板(仅官方默认模板)
└── static/ # 静态资源(可选,随模板包一起打包)
├── css/
├── js/
└── images/
static/ 目录必须随模板一起打包发布。安装/更新模板时,系统会自动把 static/ 发布到 public/static/template/模板名/ 目录供浏览器访问。view/ 目录是 PHP 引擎读取的模板源码,浏览器无法直接访问,静态资源不能只放在 view/ 下,否则页面加载不到样式。
系统已启用 ThinkPHP 模板字符串替换(tpl_replace_string,自 V1.1.3.7 起)。模板中引用静态资源应使用 __STATIC__ 前缀,编译时自动替换为 /static,不要写死 /static/ 路径(便于子目录部署与路径调整):
<link rel="stylesheet" href="__STATIC__/template/modern/theme.css">
<script src="__STATIC__/template/modern/app.js"></script>
<img src="__STATIC__/template/modern/images/logo.png" alt="">
模板自己的静态资源位于 /static/template/模板名/(安装模板时由系统自动从模板包 static/ 发布),系统公用 JS/CSS(__STATIC__/css/、__STATIC__/js/common.js、__STATIC__/js/dialog.js 等)可直接调用,模板开发时应优先复用公用文件,避免重复编写、确保联动统一。
__STATIC__ 写法要求 IDC 系统版本 ≥ V1.1.3.7(该版本起系统启用 tpl_replace_string)。在更早版本系统上部署模板时,请改回写死 /static/ 路径。
系统支持在后台分别切换前台模板与用户中心模板。模板安装后位于 view/template/开发者标识/ 目录,管理员在「后台 → 模板管理」中选择启用即可。
| 变量 | 说明 |
|---|---|
| $siteName | 站点名称 |
| $userInfo | 当前登录用户信息(用户中心,含 username/money 等) |
| $activeMenu | 用户中心侧边栏高亮菜单标识(index/order/service/finance/recharge/ticket/apikey/profile/password,系统自动赋值) |
| $config | 系统配置 |
| $controller | 当前控制器 |
| $action | 当前操作 |
{extend name="layout" /}
{block name="title"}页面标题{/block}
{block name="content"}
页面内容
{/block}
{include file="xxx" /} 的路径是相对视图根的,不要写场景前缀。例如用户中心的侧边栏文件在 view/user/sidebar.html,应写 {include file="sidebar" /},不能写 {include file="user/sidebar" /}(会被解析成 view/user/user/sidebar.html 导致「模板文件不存在」报错)。
{if} 标签条件内使用单引号,如 {if condition="$activeMenu eq 'index'"},不要使用 \" 转义引号(模板引擎不剥离转义,会编译成 PHP 语法错误)。
系统支持自研控制面板:虚拟主机(站点/数据库/FTP等)与云主机(VPS 电源/重装/重置密码等)均可在系统内直接管理,无需跳转第三方面板。控制面板采用插件化架构,插件通过 panel 声明 + 面板分发方法实现。
控制面板采用插件化架构,不同的插件可以实现自己的控制面板逻辑。系统提供统一的控制面板入口和 UI 框架:虚拟主机插件实现 panelAction 方法;云主机插件在 plugin.json 中声明 panel(enabled/title/template/tabs),面板数据统一走 PluginManager::panel() 分发(module + action + params)。
| 操作 | 说明 |
|---|---|
| site_list | 站点列表 |
| site_info | 站点详情 |
| php_version | PHP版本切换 |
| rewrite | 伪静态规则管理 |
| run_dir | 运行目录设置 |
| domain | 域名列表管理 |
| default_site | 默认站点设置 |
| ssl | SSL证书管理 |
| https_mode | HTTPS模式设置 |
| ftp | FTP管理 |
| backup | 网站备份 |
| reverse_proxy | 反向代理 |
| redirect | 重定向管理 |
public static function panelAction(array $node, array $host, string $action, array $params = []): array
{
switch ($action) {
case 'site_list':
// 获取站点列表
break;
case 'php_version':
// 切换PHP版本
break;
case 'rewrite':
// 伪静态管理
break;
// ... 其他操作
}
return ['code' => 0, 'msg' => '成功', 'data' => []];
}
宝塔官方API文档:https://docs.bt.cn/api/
常用API接口:
/site?action=AddSite、/site?action=DeleteSite/site?action=GetPHPVersion、/site?action=SetPHPVersion/site?action=GetRewriteList、/site?action=SetRewrite/site?action=GetSSL、/site?action=SetSSL/ftp?action=AddFtp、/ftp?action=DeleteFtp/site?action=GetDomains、/site?action=AddDomain自研 KVM 受控端对接插件(type: vps)通过 plugin.json 的 panel 声明控制面板,系统自动渲染面板框架并分发数据请求:
"panel": {
"enabled": true,
"title": "云主机控制面板",
"template": "panel_kvm",
"tabs": [
{"key": "overview", "name": "主机概览"},
{"key": "console", "name": "控制台"},
{"key": "power", "name": "电源管理"},
{"key": "os", "name": "重装系统"},
{"key": "password", "name": "重置密码"},
{"key": "monitor", "name": "性能监控"},
{"key": "network", "name": "网络管理"}
]
}
面板数据接口统一为 POST /user/service/panelApi(参数:host_id、module、action、params=JSON 字符串),系统按 panel.template 加载对应视图模板(如 panel_kvm.html),前端切换 tab 时调用页内 switchTab(key) 重新请求对应模块数据。云主机资源定位依赖 host.config.plugin_result.id(开通时受控端回传的虚拟机 ID),缺失时会提示"云主机ID缺失"。
系统区分两种货源方式:自营(使用自己的受控端:宝塔面板 / 自研 KVM 受控端等)与代理 / 对接(对接第三方财务系统,或同系统互联)。对接第三方统一走「上游分组」机制,系统核心不因第三方单独改版——由对接插件适配系统(PluginManager 契约)。
host.config.plugin_result| 字段 | 说明 |
|---|---|
| 分组名称 | 上游站点标识,如"上游-上海节点" |
| 对接插件 | 选择已安装的对接插件(仅列出与产品类型匹配的对接插件,不出现自研插件) |
| API 配置 | 按插件声明的配置项显示(API 地址 / Key / Secret 等),配置保存在该分组内,多个站点可各填一套 |
| 状态 / 排序 | 启用状态与显示顺序 |
PluginManager::hostAction 会合并上游分组 config 覆盖插件全局 config)。
对接插件通过 listOptions 返回上游产品的弹性配置选项,系统据此在后台「添加产品」与前台「购买详情页」渲染输入控件。插件必须声明每个选项的输入方式 control,系统按契约渲染,不感知上游命名(过滤哪些选项、如何取最低档等也由插件自行处理)。
// listOptions 返回结构
{
"code": 0,
"msg": "成功",
"data": {
"host": { "hostname": "ecs", "password": "xxx", "port": 22 }, // 开通参数(主机名/密码/远程端口)
"min_config": { "cpu": 1, "memory": 2, "disk": 20, "ip_count": 1 }, // 最低配置(自动填入产品默认配置)
"skip_options": { "region_option_id": 223, "os_option_id": 224 }, // 需跳过的选项ID(如系统镜像由购买页联动获取)
"groups": [ // 弹性配置分组
{
"option_key": "ip_count", // 选项键名(唯一,对应 yxidc_product_option.option_key)
"name": "IP数量", // 显示名称
"unit": "个", // 单位
"control": "slider", // 输入方式(见下表)
"qty_min": 1, // 数量型最小值(slider/stepper/number)
"qty_max": 4, // 数量型最大值
"unit_price": 11, // 单价(元/单位,数量型按 数量 × 单价 计价)
"options": [ // 选项列表(select/radio/fixed 使用)
{ "id": 622, "label": "1个", "price": 11 },
{ "id": 197629, "label": "2个", "price": 16 }
]
}
]
}
}
| control 值 | 输入方式 | 前台渲染 | 依赖字段 |
|---|---|---|---|
| select | 下拉选择 | 下拉框(档位,每个档位对应价格) | options |
| radio | 单选卡片 | 单选按钮组 | options |
| number | 数字输入 | 数字输入框(自动校验范围) | qty_min / qty_max / unit_price |
| slider | 滑块调整 | 进度条滑块 + −/+ 按钮 + 当前值(可单点加减、可拖到最大值) | qty_min / qty_max / unit_price |
| stepper | 加减器 | −/+ 步进器 | qty_min / qty_max / unit_price |
| fixed | 固定展示 | 固定值(不可选) | options |
control 时,系统按 input_type 默认降级(qty → slider、fixed → fixed、select → select),旧产品无需重配。后台「添加产品」编辑器也可手动调整每个选项的输入方式、最小值 / 最大值 / 单价;数量型选项按 数量 × unit_price 实时参与计价。
自研受控端(kvm-agent,Go 实现)提供 KVM 虚拟机全生命周期管理 API,IDC 财务系统通过 kvm 插件对接,实现云服务器(VPS)自动化开通、续费、删除、启停、重置密码、重装系统、弹性升级及云主机控制面板。
受控端接口使用 HMAC-SHA256 签名鉴权,请求头携带:
| 请求头 | 说明 |
|---|---|
| Yx-Key | 接入标识(与受控端 config.json 的 yx_key 一致) |
| Yx-Ts | 当前时间戳(秒) |
| Yx-Sign | 签名,算法见下 |
$body = json_encode($data); // 请求体
$signStr = $key . "\n" . $ts . "\n" . hash('sha256', $body);
$sign = hash_hmac('sha256', $signStr, $secret); // Yx-Sign
| 接口 | 说明 |
|---|---|
| yx_node_info | 节点信息(状态/资源) |
| yx_os_list | 系统镜像列表(两级:系统类型 → 版本) |
| yx_vm_create | 创建虚拟机,返回 yx_vm_id / yx_ipv4 / yx_os_user / yx_passwd |
| yx_vm_info | 虚拟机详情 |
| yx_vm_action | 电源操作(开机 / 关机 / 重启) |
| yx_vm_reinstall | 重装系统 |
| yx_vm_resetpwd | 重置密码 |
| yx_vm_upgrade | 弹性升级(CPU / 内存 / 带宽 / 系统盘) |
| yx_vm_delete | 删除虚拟机 |
IDC财务系统提供API接口,供第三方系统对接资源池,实现产品查询、订单创建、主机管理、账户查询等功能。
IDC财务系统提供以下API接口,供第三方系统对接资源池,实现产品查询、订单创建、主机管理、账户查询等功能。
http://your-domain.com/api 数据格式:JSON 字符编码:UTF-8 请求方式:GET / POST
所有API接口都需要进行身份认证。用户需要在语信IDC财务系统的用户中心 → API密钥管理中创建API密钥,获取 app_key 和 app_secret。
请求头参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| X-App-Key | string | 是 | API密钥的app_key |
| X-Timestamp | int | 是 | 当前时间戳(秒),与服务器时间差不能超过300秒 |
| X-Sign | string | 是 | 请求签名,详见签名规则 |
为了保证接口调用的安全性,所有请求都需要进行签名验证。签名算法如下:
key1=value1&key2=value2&... 的格式&app_secret=你的app_secretPHP签名示例代码:
function makeSign($params, $appSecret) {
ksort($params);
$signStr = '';
foreach ($params as $k => $v) {
$signStr .= $k . '=' . $v . '&';
}
$signStr .= 'app_secret=' . $appSecret;
return md5($signStr);
}
所有接口返回JSON格式数据:
{
"code": 0,
"msg": "操作成功",
"data": { }
}
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 状态码,0表示成功,非0表示失败 |
| msg | string | 提示信息 |
| data | mixed | 返回数据,可能是对象、数组或空数组 |
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 0 | 请求成功 | - |
| 40001 | 缺少app_key | 请在请求头或参数中传入X-App-Key |
| 40002 | 缺少时间戳 | 请在请求头或参数中传入X-Timestamp |
| 40003 | 缺少签名 | 请在请求头或参数中传入X-Sign |
| 40004 | API密钥不存在 | 请检查app_key是否正确,或重新创建密钥 |
| 40005 | API密钥已禁用 | 请在用户中心启用该密钥 |
| 40006 | 签名验证失败 | 请检查签名算法是否正确,参数是否完整 |
| 40007 | 请求已过期 | 时间戳与服务器时间差不能超过300秒 |
| 40008 | 调用频率超限 | 请稍后再试,或联系管理员提升配额 |
| 40301 | 余额不足 | 请先充值后再操作 |
| 40401 | 产品不存在 | 请检查产品ID是否正确 |
| 40402 | 订单不存在 | 请检查订单ID是否正确 |
| 40403 | 主机不存在 | 请检查主机ID是否正确 |
产品列表 GET /api/product/list - 获取可购买的产品列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | int | 否 | 页码,默认1 |
| limit | int | 否 | 每页数量,默认10 |
| type | string | 否 | 产品类型:host(虚拟主机)、server(云服务器)等 |
| group_id | int | 否 | 产品分组ID |
产品详情 GET /api/product/detail - 获取单个产品的详细信息
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | 是 | 产品ID |
产品分组 GET /api/product/groups - 获取产品分组列表
订单列表 GET /api/order/list - 获取当前用户的订单列表
订单详情 GET /api/order/detail - 获取单个订单的详细信息
创建订单(购买产品) POST /api/order/create - 创建订单并购买产品,系统会自动扣款并开通服务。先开通、后扣费,开通失败不扣款。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| product_id | int | 是 | 产品ID |
| duration | string | 是 | 购买周期:month(月付)、quarter(季付)、year(年付) |
| domain | string | 条件必填 | 绑定域名,虚拟主机类型产品必填,支持一级域名、二级域名、泛域名 |
| quantity | int | 否 | 购买数量,默认1 |
主机列表 GET /api/host/list - 获取当前用户的主机列表
主机详情 GET /api/host/detail - 获取单个主机的详细信息,包括FTP、数据库等配置信息
主机操作(续费等) POST /api/host/action - 对主机进行操作,目前支持续费操作
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | 是 | 主机ID |
| act | string | 是 | 操作类型:renew(续费) |
| duration | string | 续费必填 | 续费周期:month(月付)、quarter(季付)、year(年付) |
用户信息 GET /api/account/info - 获取当前API密钥关联的用户信息
账户余额 GET /api/account/balance - 获取当前用户的账户余额
财务明细 GET /api/account/finance - 获取当前用户的财务明细记录
充值记录 GET /api/account/recharge - 获取当前用户的充值记录
{prefix} 代表实际配置的表前缀,系统代码中不写死表前缀,全部使用数据库配置联动。
| 表名 | 说明 |
|---|---|
| {prefix}product | 产品表 |
| {prefix}product_group | 产品分组表 |
| {prefix}product_period | 产品周期定价表 |
| {prefix}server_group | 上游分组表(对接第三方站点,选插件+API配置) |
| {prefix}host | 主机服务表 |
| {prefix}order | 订单表 |
| {prefix}order_item | 订单明细表 |
| {prefix}user | 用户表 |
| {prefix}plugin | 插件表 |
| {prefix}template | 模板表 |
| {prefix}update_history | 系统更新历史表 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 产品ID |
| group_id | int | 分组ID |
| plugin_id | int | 关联插件ID(自营 / 对接插件) |
| server_group_id | int | 上游分组ID(代理货源时关联,0=自营) |
| upstream_provider_id | int | 上游供应商ID(对接第三方时) |
| upstream_product_id | string | 上游产品ID(对接第三方时,一键获取上游产品后自动填入) |
| name | string | 产品名称 |
| type | string | 产品类型:host/vps/server/dedi/cdn |
| description | text | 产品描述 |
| config | json | 产品配置(弹性规格、默认镜像等;代理时可一键同步上游最低配置) |
| status | int | 状态:1启用,0停用 |
| is_recommend | int | 是否推荐 |
| sort | int | 排序 |
| create_time | int | 创建时间 |
| update_time | int | 更新时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 服务ID |
| user_id | int | 用户ID |
| product_id | int | 产品ID |
| domain | string | 绑定域名 |
| username | string | 用户名 |
| password | string | 密码 |
| server_group_id | int | 上游分组ID(代理货源服务) |
| config | json | 服务配置(包含用户选择的参数;开通成功后系统回写 plugin_result,含上游资源ID/IP等) |
| status | int | 状态:1正常,5待开通,0停用 |
| expire_time | int | 到期时间 |
| create_time | int | 创建时间 |
| update_time | int | 更新时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 分组ID |
| name | string | 分组名称 |
| type | string | 分组类型:host/vps/cdn |
| sort | int | 排序 |
| status | int | 状态 |
授权站提供开发者中心,开发者可以发布插件、模板、服务,通过销售获得收益。
/developer/productAdd/add,分类联动选择模板/插件/developer/service)后台 /admin/developer/fee 可配置:
(销售手续费20%,提现手续费3%):
开发者发布插件/模板时,价格输入框下方会显示实际到手金额模拟计算:
授权站前台 /market/plugin、/market/template 和 /market/service 展示所有已审核通过的插件、模板和服务:
授权站后台 /admin/developer/product 审核开发者发布的插件/模板:
plugins/plugins/ 目录下创建插件目录plugin.json 配置文件nodeAction(静态风格)或 hostAction(实例风格,推荐)方法panelAction,云主机在 plugin.json 声明 panel在 plugin.json 中定义 config_params,设置 user_selectable 为 true 的参数可以让用户在购买时选择。用户选择的值会保存在服务配置中,开通服务时传递给插件。
需要。宝塔面板V13.0.0及以上版本,API调用时面板地址需要包含安全目录(如 https://ip:port/安全目录)。测试连接时也需要填写完整的带安全目录的地址。
在插件 plugin.json 的 panel 中声明 enabled/title/template/tabs,系统自动渲染面板框架;面板数据统一走 POST /user/service/panelApi(host_id/module/action/params),插件实现对应模块操作即可。资源定位依赖 host.config.plugin_result.id(开通时受控端回传)。