Manifest 规范
plugin.json 是插件的入口描述文件,平台安装、运行时加载、菜单同步、权益校验、移动端构建都依赖它。
最小示例
json
{
"code": "demo-shop",
"name": "演示商城",
"version": "1.0.0",
"kind": "app",
"author": "Demo",
"description": "商品、订单和移动端商城页面",
"icon": "icon.png",
"psr4": { "Plugin\\DemoShop\\": "app/" },
"lifecycle": "Plugin\\DemoShop\\hooks\\Lifecycle",
"entitlement": "demo-shop",
"routes": {
"tenantapi": "app/tenantapi/route.php",
"api": "app/api/route.php"
},
"tenant": {
"menus": [
{
"code": "demo-shop",
"name": "演示商城",
"path": "/demo-shop",
"icon": "shopping-cart",
"sort": 100
},
{
"code": "demo-shop.product",
"parent_code": "demo-shop",
"name": "商品列表",
"path": "/demo-shop/product",
"component": "plugins/demo-shop/product"
}
],
"permissions": [
{ "code": "demo_shop.product.list", "name": "商品列表" },
{ "code": "demo_shop.product.store", "name": "新增商品" }
]
},
"uniapp": {
"subpackage": "modules/demo-shop",
"pages": [
{ "path": "pages/product-list/index", "title": "商品列表" }
],
"allowHome": true,
"allowTabBar": true
}
}基础字段
| 字段 | 必填 | 说明 |
|---|---|---|
code | 是 | 插件唯一标识,使用 kebab-case |
name | 是 | 插件显示名称 |
version | 是 | 插件版本,建议使用语义化版本 |
kind | 是 | app 或 plugin |
description | 否 | 插件介绍,展示在插件管理和插件中心 |
author | 否 | 作者或组织 |
icon | 否 | 图标路径,相对插件根目录 |
psr4 | 是 | PHP 命名空间映射,必须以 Plugin\\ 开头 |
lifecycle | 否 | 生命周期类 |
entitlement | 否 | 权益 code,默认等于 code |
depends | 否 | 依赖插件 code 数组 |
路由字段
routes 可声明三类入口:
| 路由 | 用途 |
|---|---|
tenantapi | 租户后台 API,会挂载租户认证、生命周期、权益和 RBAC |
api | PC / 移动端公共 API,会挂载租户上下文和 API 权益 |
platformapi | 平台级扩展 API,仅用于平台能力扩展 |
插件路由文件只写裸路由,不要重复声明 /tenantapi/{code} 前缀。
租户菜单
kind=app 必须提供 tenant.menus。菜单会安装到租户后台,并用于生成动态路由。
| 字段 | 说明 |
|---|---|
code | 菜单唯一 code |
parent_code | 父级菜单 code,一级菜单不填 |
name | 菜单名称 |
path | 前端路由路径 |
component | 页面组件路径,插件页面使用 plugins/{code}/{view} |
icon | 图标 |
sort | 排序 |
菜单 code 需要全局唯一,建议使用插件 code 作为前缀。
权限字段
tenant.permissions 用于同步租户 RBAC 权限点。权限 code 建议使用点分格式或下划线格式,并保持稳定。
json
{
"tenant": {
"permissions": [
{ "code": "demo_shop.product.list", "name": "商品列表" },
{ "code": "demo_shop.product.store", "name": "新增商品" },
{ "code": "demo_shop.product.update", "name": "编辑商品" },
{ "code": "demo_shop.product.destroy", "name": "删除商品" }
]
}
}前端按钮使用 v-has-perm 控制显示,后端仍必须做权限校验。
配置面板
能力插件可以通过 tenant.panels 暴露配置面板。它适合没有一级菜单,但需要租户配置的插件。
json
{
"tenant": {
"panels": [
{
"code": "demo-shop.settings",
"name": "商城设置",
"component": "plugins/demo-shop/settings"
}
]
}
}移动端字段
uniapp 用于声明移动端分包:
| 字段 | 说明 |
|---|---|
subpackage | 分包根路径,例如 modules/demo-shop |
pages | 页面列表 |
allowHome | 是否允许作为首页入口 |
allowTabBar | 是否允许进入 TabBar 配置 |
移动端源码必须放在 server/plugins/{code}/uniapp/。
废弃字段
以下旧字段会被校验拒绝:
admin.*- 顶层
menus - 顶层
permissions mobile
请使用 tenant.menus、tenant.permissions 和 uniapp 替代。
