阅读说明
这份文档面向购买源码并独立部署云团的商家。你可以把云团理解为一个可二次开发的应用运营平台:主系统负责登录、权限、上传、应用管理、订单和应用市场;每个业务应用放在 addons 目录下独立维护。
商家自研应用与平台应用使用同一套模块规范,但来源不同。商家自研应用属于本地站点资产,不需要远程平台授权;平台应用需要从平台应用市场购买或由平台授权后同步。
面向独立部署商家的完整实施与自研应用开发指南,从环境安装、后台初始化、远程平台绑定,到 addons 应用模块、接口、权限、前端构建和发布打包。
这份文档面向购买源码并独立部署云团的商家。你可以把云团理解为一个可二次开发的应用运营平台:主系统负责登录、权限、上传、应用管理、订单和应用市场;每个业务应用放在 addons 目录下独立维护。
商家自研应用与平台应用使用同一套模块规范,但来源不同。商家自研应用属于本地站点资产,不需要远程平台授权;平台应用需要从平台应用市场购买或由平台授权后同步。
fileinfo、openssl、pdo_mysql、mbstring、curl、zip 扩展。utf8mb4。public 目录。runtime、public/uploads、addons 以及应用发布目录。先创建数据库,再导入安装脚本。数据库名可以按实际环境调整,默认示例为 yuntuan。
CREATE DATABASE `yuntuan` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
导入项目中的安装脚本:
mysql -uroot -p yuntuan < database/install.sql
在项目根目录维护 .env。独立部署商家版至少需要配置数据库、发行版本、授权密钥和远程平台地址。
APP_DEBUG = false
DB_TYPE = mysql
DB_HOST = 127.0.0.1
DB_NAME = yuntuan
DB_USER = root
DB_PASS = your_password
DB_PORT = 3306
DB_CHARSET = utf8mb4
DB_PREFIX = yt_
YUNTUAN_EDITION = merchant
YUNTUAN_PLATFORM_API_BASE = https://platform.example.com
YUNTUAN_LICENSE_PATH = license.json
YUNTUAN_AUTH_KEY = 请生成并妥善保存的对称加密密钥
Nginx 站点根目录应指向 public,并把不存在的文件转交给 index.php,这样 MVC 页面、API 和 Vue 后台路由都能正常工作。
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
商家独立部署后,第一次进入后台应先绑定远程平台账号。绑定成功后,本地会保存商家编号、商家账号、授权域名、源码授权状态和已授权平台应用列表。
源码销售按域名和商家账号共同绑定。后台登录时会检查上次授权校验时间,超过 24 小时会重新请求平台校验。
平台应用需要远程平台授权后才能同步和安装。商家自研应用不走平台授权,默认内置应用由源码随附。
authorized_addons 来尝试开通平台应用。商家版最终会以签名授权文件和远程平台校验结果为准,平台应用安装和升级也会再次校验授权。
商家后台访问路径为 /admin。后台前端使用 TypeScript、Vite、Vue3、TailwindCSS 和 Ant Design Vue 开发,构建后的文件部署在 public/admin,接口统一走 /api。
平台概览:查看系统信息、应用类型统计和运行状态。应用管理:管理已安装应用、同步远程平台应用、安装自研应用包、进入应用独立后台。后台用户及权限:维护管理员账号、用户分组、后台菜单和分组权限。系统设置:维护上传存储方式,本地、七牛云、阿里云、腾讯云等配置都从这里管理。个人中心:维护当前账号昵称、头像和密码。每个应用都是一个独立模块,必须放在 addons 目录下。目录名就是应用标识,只允许小写字母、数字和下划线,并建议以业务名称命名。
addons/
└── demo_app/
├── manifest.json
├── route.php
├── install.sql
├── upgrade.sql
├── backend/
│ ├── controller/
│ │ └── api/
│ ├── model/
│ └── service/
├── frontend/
│ ├── src/
│ ├── package.json
│ └── vite.config.ts
└── public/
└── admin/
| 目录或文件 | 用途 |
|---|---|
manifest.json |
应用清单,声明名称、版本、价格、支持平台、权限、菜单、接口前缀和打包规则。 |
route.php |
应用独立路由,主系统启动时会自动加载 addons 下各应用的路由文件。 |
backend |
应用 PHP 后端源码,包含控制器、模型、服务类等。 |
frontend |
应用后台前端开发源码,仅开发阶段保留,发布应用包时不允许包含未构建源码。 |
public |
应用构建后的前端和静态资源,安装时会发布到主站 public 下。 |
manifest.json 是应用被平台识别、安装和管理的核心文件。应用管理、安装器、远程同步都会读取它。
{
"name": "demo_app",
"title": "演示应用",
"version": "1.0.0",
"description": "用于演示商家自研应用开发规范。",
"type": "system_plugin",
"type_label": "系统插件",
"source": "merchant_local",
"market_visible": true,
"merchant_market_visible": true,
"default_installed": false,
"icon": "/static/addons/demo_app/icon.svg",
"price": 0,
"support_platforms": ["merchant"],
"backend_url": "/addons/demo_app/admin/",
"api_prefix": "/api/addons/demo_app/admin",
"permissions": [
{ "permission": "demo_app.manage", "title": "管理演示应用" }
],
"menus": [
{
"title": "演示应用",
"path": "/addons/demo_app/admin/",
"permission": "demo_app.manage",
"icon": "SettingOutlined",
"sort": 10,
"visible": true
}
],
"install": { "sql": "install.sql" },
"upgrade": { "sql": "upgrade.sql" },
"runtime": {
"backend": true,
"frontend": true,
"php": ">=8.1",
"yuntuan": ">=0.1.0",
"frontend_source": "frontend"
},
"package": {
"source": "frontend",
"public": "public",
"exclude": ["frontend/src", "frontend/node_modules", "frontend/**/*.map"],
"include": ["manifest.json", "route.php", "install.sql", "upgrade.sql", "backend", "public"]
}
}
source:商家自研应用使用 merchant_local;平台应用使用 platform;远程同步到商家站点后的平台应用会变为 platform_remote。market_visible:是否在平台应用市场展示。merchant_market_visible:安装到商家站点后,是否进入商家面向普通用户的本地应用市场。default_installed:是否随源码默认安装,例如自定义首页这类站点级系统插件。support_platforms:声明应用适用的部署环境,商家自研应用固定填写 ["merchant"],平台应用由平台端统一维护。应用后端建议按照控制器、服务类、模型分层。控制器只做认证、权限、参数接收和响应;业务逻辑写在服务类;数据库表操作写在模型或服务中。
<?php
use think\facade\Route;
Route::get(
'api/addons/demo_app/admin/setting',
'\\addons\\demo_app\\backend\\controller\\api\\Setting@detail'
);
Route::put(
'api/addons/demo_app/admin/setting',
'\\addons\\demo_app\\backend\\controller\\api\\Setting@save'
);
demo_app.manage。应用表建议使用 yt_应用标识_业务名,例如 yt_demo_app_setting。这样卸载、排查和迁移时都能快速识别归属。
应用后台前端仍使用 TypeScript、Vite、Vue3、TailwindCSS 和 Ant Design Vue。开发源码放在应用自己的 frontend 目录下,构建产物输出到应用自己的 public/admin。
base 应设置为应用后台访问路径,例如 /addons/demo_app/admin/。outDir 应输出到 addons/demo_app/public/admin。api_prefix,例如 /api/addons/demo_app/admin。pnpm install
pnpm build
frontend/src、node_modules、源码映射文件和 TypeScript 构建缓存。只发布 PHP 后端、manifest、SQL、路由和 build 后的前端产物。
主系统提供统一上传能力,应用可以调用公共上传组件和上传接口。数据库中建议保存资源编号,而不是保存完整 URL。
图片、视频、音频和附件都应走统一上传入口。当前后台优先使用图片选择器,后续应用需要其他文件类型时,保持相同接口协议即可。
应用后台是独立入口,但仍建议使用主系统的后台账号和权限体系。应用权限写在 manifest 的 permissions 中,应用菜单写在 menus 中。
应用标识.动作,例如 demo_app.manage。/addons/demo_app/admin/。商家自研应用可以在本地打包后通过商家后台“安装应用”上传。平台应用则由平台后台上传版本安装包,商家授权后再同步安装。
manifest.json 中的 name 与应用目录名完全一致。backend_url 和 api_prefix 都绑定当前应用目录。pnpm build,确保 public/admin 存在入口文件。node_modules、调试日志和本地密钥。demo_app.zip
├── manifest.json
├── route.php
├── install.sql
├── upgrade.sql
├── backend/
└── public/
云团同时支持平台自营应用市场和商家独立部署后的本地应用市场。两者展示规则不同,需要在开发应用时提前确认。
| 场景 | 展示规则 | 适用应用 |
|---|---|---|
| 平台应用市场 | 应用已安装、启用、上架、审核通过,并且 market_visible=1。 |
平台上架售卖或免费分发的应用。 |
| 商家本地应用市场 | 商家自研应用或已授权远程平台应用,并且 merchant_market_visible=1。 |
商家面向普通用户售卖或开放使用的应用。 |
| 默认内置应用 | 随源码默认安装,可在商家后台应用管理中使用,但可以不进入商家本地应用市场。 | 自定义首页、站点配置、系统工具等站点级应用。 |
APP_DEBUG,避免暴露错误堆栈和调试入口。YUNTUAN_AUTH_KEY、数据库密码、云存储密钥等只放在服务器环境配置中,不要提交到应用包。确认 Nginx 已配置 try_files $uri $uri/ /index.php?$query_string;,并且主系统路由中存在后台前端兜底入口。
确认应用的 route.php 已放在应用目录下,并且路由前缀与 manifest.json 中的 api_prefix 一致。
确认应用前端已经 build,入口文件和静态资源在 public/admin 内,且 Vite 的 base 与访问路径一致。
业务表应保存上传资源编号,由接口根据当前上传配置生成完整 URL。如果保存了旧域名完整路径,换域名后就需要手动迁移历史数据。