跳到主要内容
开发者中心

开发者中心

四套自研系统的文档、本系统的整站开源源码、以及可下载的扩展与主题应用市场 —— 都在这一个入口。再往下是「从零到把扩展交出去」的作者指南与上架通道。

4
自研系统
9
可下载扩展与主题
128
接口
1.0.0
引擎版本

能做什么:三类扩展的边界

这套系统是源码交付的:你可以改核心,也可以做成**不碰核心**的扩展。 三者的边界是刻意划清的 —— 如果它们都能做同样的事,社区贡献的扩展最后一定会互相打架。 一个共同前提:扩展只能「另加」,不能「覆盖」(核心优先是有意设计)。

主题 theme

engines/themes/<id>/

能做
整套前端展示:布局、页面、样式;只有组件、没有布局与页面的就是「区块」
不做
不建表、不加服务端接口(那是模块的事)
适合
最容易被社区贡献:会写 Vue 就能做一个区块,也能换掉整套外观
模块 module

engines/modules/<id>/

能做
组件 / 页面 / 接口 / 组合式函数 / 数据表片段 / 自带权限点
不做
不修改核心文件
适合
一套完整业务能力,装上就能用
插件 plugin

engines/plugins/<id>/

能做
在扩展点上插入行为(一个 hooks.ts 即可)
不做
不起路由、不建表、不占页面
适合
轻量增强:同步外部系统、埋点、通知

「我这个需求能不能用扩展做、代价是什么」—— 有 10 个常见场景的对照表,见 扩展能做到什么深度。 做不到的六件事也写在那儿(不能改核心、带表的模块要停服重建、运行时页面不认 definePageMeta、没有沙箱…)✓ —— 先看那两条再动手,比写完才发现便宜 ✓。

四套系统的文档

四套自研业务系统各自有一篇文档页(内容由后台「页面内容」维护 ✓,改文档不用改代码 ✓)。 每套系统在这里给出三个入口:文档、系统详情(能力范围与交付方式)、版本日志(更新了什么)。

三角洲游戏租号平台私有化部署游戏行业

游戏账号租赁全链路管控

私域直播系统私有化部署私域营销

私域直播、商品挂载、用户运营一体化

企业建站平台标准化交付 / 私有化部署建站内容平台

产品型企业官网快速搭建,本站即为实例

房屋租赁管理系统在线 SaaS(可免费试用)· 私有化部署 · 源码交付房产租赁

面向房东与物业的租赁经营系统:批量抄表自动出账、AI 合同识别、押金与代收单列的利润核算。

整站开源源代码

本站整站源码可以一键下载(`.tar.gz` ✓,包内顶层目录就是 www.hejun1.com/ ✓)。 「包里没有什么」和「包里有什么」一样重要 —— 下面是实时生成的清单: 尺寸、摘要、按目录的分布、以及完整排除清单与理由。先看清单再决定下不下 ✓。

文件数
898 个
源码体积 / 下载体积
29.1 MB / 23.7 MB
打包时间
2026/11/4 20:38:27
解压后顶层目录
www.hejun1.com/
sha256
7aeb059f171abf3f4bef89d796ee02f11f50c1eaebd9ff658f58e0ea1f13f8fa
下载整站源码(23.7 MB)包含清单(JSON)限流 5 次/分钟/IP ✓;清单体量小、不限流 ✓

下完可自己核对: certutil -hashfile 文件名 SHA256(Windows)或 sha256sum 文件名(Linux/macOS),与上面的 sha256 比对 ✓。 响应头也有 x-sha256 ✓。

包内容(按顶层目录,按体积排序)

engines/36424.2 MB
server/2541.1 MB
public/9758 KB
pages/47729 KB
(根目录文件)18607 KB
scripts/32497 KB
tests/60333 KB
docs/17298 KB
components/46275 KB
composables/19115 KB
prisma/1379 KB
layouts/345 KB
assets/231 KB
plugins/527 KB
modules/125 KB
deploy/12 KB
_bt_default/31 KB
middleware/11 KB
types/11 KB
.well-known/21 KB

这里只列到目录一级;逐个文件的完整列表在「包含清单(JSON)」里 ✓

「包里没有」清单(完整规则与理由)

  • node_modules/ · .output/ · .nuxt/ · dist/ · .engine-build/ · coverage/ · storage/

    依赖与构建产物(体积是源码的数倍,且随机器而异);storage/ 是运行期数据(2026-10-07 起放站点备份 —— 全站数据 ✗,绝不外发)

  • .playwright-cli/ · .codebuddy/ · .task/ · .vscode/ · .github/

    工具缓存与项目协作数据,跑站点不需要

  • *.old / *.bak / *.orig · .output*(部署回滚位与产物目录)

    实测生产站点根有 .output.old(759 个文件 / 10.1MB)与 engines.old(352 个文件 / 24MB)——它们是上一次部署的回滚备份,既让公开包凭空多出一倍体积,又含过时代码

  • .env

    密钥与连接串 —— 绝不外发

  • .env.* (保留 .env.example)

    各环境密钥;模板 .env.example 会随包提供

  • *.log / *.log.*

    运行日志(会泄露路径与内部数据)

  • docs/site-audit-report.json|.md

    巡检报告:描述站点当前内部状况,不适合公开

  • deploy/*.conf

    实测 nginx 配置里含证书私钥路径(服务器布局)

  • 根目录的 *.png / *.jpg / *.jpeg

    实测根目录有 4 张开发对比截图;public/ 内的图片不受影响

  • login.yaml

    实测是 Playwright 把后台登录页 dump 出来的调试快照

  • $null

    PowerShell 重定向写错产生的垃圾文件

  • *.pem / *.key / *.crt / *.p12

    兜底:任何私钥/证书文件一律不进包

拿到之后怎么跑起来:解压 → npm ci → 复制 .env.example 为 .env 并填写 → npx prisma db push → npm run db:seed → npm run dev(需要 Node ≥ 20、PostgreSQL、Redis ✓)。 使用条款见包内 LICENSE —— 默认是保守措辞(允许学习与在你已获授权的站点上二次开发;整体再分发与竞品服务需书面许可 ✓)。

应用市场

随源码交付的官方扩展与主题,可以在这里浏览源码或下载。 下载下来的是 `.tar.gz`,与 npm run engine:pack 的产物同格式(包内顶层目录就是包 id),改完可以装回去。

四条如实说明: ① 只有本仓库登记为可公开的官方示例包会出现在这里(付费包、第三方签名的包一律不公开源码 ✓); ② 这些包没有签名 —— 站主的信任白名单非空时,未签名包会被拒绝安装 ✓; ③ 单包体积上限 20MB(与安装器的上传上限同源),超限的包会在卡片上标出来 ✓; ④ 安装动作只在后台由站主执行 —— 扩展的服务端代码与核心同进程、同数据库权限, 这里不提供"一键安装"是**有意的边界**,不是没做 ✓(理由见 docs/marketplace-selfserve.md)。
共 9 个
顶部公告条

announcement-bar · v1.0.0

模块

站点顶部可关闭的公告条:后台维护公告内容与生效时间,前台自动取「当前生效」的一条展示。包含自己的数据表、后台页面、公开接口与权限点,是模块引擎的完整示例。

9 文件源码 19 KB下载 9 KB>=1.0.0

sha256 17e2f8317130…

版本日志已启用

changelog-center · v1.0.0

模块

按产品分组的版本日志:后台维护(新增 / 编辑 / 删除),公开接口 GET /api/products/{slug}/changelogs 供前台的产品更新记录页消费。表通过外键挂在…

9 文件源码 9 KB下载 4 KB>=1.0.0

sha256 8d1ede6230f2…

演示账号已启用

demo-accounts · v1.0.0

模块

给客户开的限时只读演示账号:后台按产品开通(写入 Redis 里的限时会话,到期自动失效),访客用临时口令换一个只读 Cookie 再进演示站。表通过外键挂在产品表上,所以依赖「系统产…

9 文件源码 12 KB下载 6 KB>=1.0.0

sha256 12880f6f2a79…

FAQ 管理已启用

faq-manager · v1.0.0

模块

常见问题:后台维护(新增 / 编辑 / 排序 / 隐藏 / 回收站),公开接口 GET /api/faqs 供前台 FAQ 页与任意页面消费。自带数据表、后台页面与权限点,是「业务模块…

10 文件源码 19 KB下载 8 KB>=1.0.0

sha256 8509e01182e9…

客户线索已启用

lead-inbox · v1.0.0

模块

访客留言的统一收件箱:前台表单写入(手机号 / 微信校验 + 通知 + lead:created 扩展点),后台可搜索、改状态、写跟进备注、进回收站、按状态导出 CSV。自带数据表、后…

10 文件源码 24 KB下载 10 KB>=1.0.0

sha256 e85c5da75045…

系统产品已启用

product-catalog · v1.0.0

模块

自研业务系统的产品目录:后台维护产品(图集、卖点、交付方式、SEO)与分类标签,公开接口 GET /api/products 供前台系统页与留言表单消费。自带 products / t…

17 文件源码 40 KB下载 14 KB>=1.0.0

sha256 9a75164c1b42…

线索重复提示

lead-dup-guard · v1.0.0

插件

监听 lead:created,用同一联系方式在近 30 天内是否提交过需求,把「重复线索」写进操作日志,方便销售判断是不是同一波需求反复来问。

2 文件源码 3 KB下载 2 KB>=1.0.0

sha256 57fdb3012b73…

监听:lead:created

禾君默认主题已启用

hejun-default · v1.0.0

主题

本站现有的整套前台外观:首页、产品系统(列表/详情/版本日志)、FAQ、联系我们、二次开发、文档与隐私页,以及页头页脚与页面区块。作为可切换的主题包交付 —— 换主题即换整套外观。

26 文件源码 286 KB下载 91 KB>=1.0.0

sha256 810bdf08d66d…

Modern Commerce已启用超限

moderncommerce · v1.0.0

主题

第二套主题:由 HTML 模板 Moderncommerce 转换而来,含首页与 服务 / 案例 / 博客 / 团队 / 联系 / FAQ 共 13 个页面,自带完整样式与动效(jQu…

268 文件源码 23.8 MB下载 21.7 MB>=1.0.0

sha256 542ffd93ba5d…

23.8 MB 超过上传上限 20MB ⇒ 走不了「上传安装」,请解压到 engines/themes/moderncommerce 后点「重新扫描」✓

下载下来的包怎么装回去?两条路:① 后台「扩展市场 → 上传安装」(需要它在上传上限内;未签名的包在信任白名单非空时会被拒绝 —— 那就用你自己 engine:keygen 生成的密钥签一次); ② 手工解压到站点 engines/<类型>/ 下,再点一次「重新扫描」。 想接自己的扩展源(`ENGINE_INDEX_URL` 指向一份静态索引 JSON),见 完整文档的「打包、分发与安装」。

作者指南:11 篇,按顺序走

按顺序走完 00→10 就相当于"从零到把扩展发出去"的完整路径。每一节的「照抄验证」都是**可执行、可观察**的判据 —— 没有它,这一步就等于没写 ✓。字段表、扩展点清单、清单全字段这些会随代码变化的内容不在这里重复,它们在完整开发文档里由源码生成 ✓。

00开始之前:需要准备什么

把"只写扩展"和"要看到它跑起来"这两种工作方式的最少依赖分清楚 —— 前者只需要 Node。

  1. 1node -v

    要 Node ≥ 20。写包、校验清单、打包这三件事**只需要 Node**(引擎 CLI 是纯 Node 脚本 ✓),不需要数据库。

    照抄验证:打印 v20 或更高。低于 20 时 CLI 会因语法/API 不兼容直接报错。

  2. 2npm ci

    装整站依赖。要"看到扩展真的在站点里跑起来"时才需要这一步(引擎的运行时编译依赖 esbuild 与 @vue/compiler-sfc ✓)。

    照抄验证:无 ERROR;node_modules 出现。

  3. 3npm run engine:list

    列出仓库里的全部扩展包与清单校验结果。这是**不需要数据库**就能跑的 ✓。

    照抄验证:打印每个包的类型 / id / 版本 / 说明,末尾一行「共 N 个包,其中 0 个清单有问题 ✓」。

  4. 4npm run dev(另开一个终端)

    要看到界面效果就得起整站,而起整站需要 PostgreSQL 与 Redis(见仓库 .env.example ✓)。

    照抄验证:打开 http://localhost:3000 能访问;终端里出现「Nitro built」。

  5. 5npm run engine:validate

    每次改完包都先跑它。它同时校验规范快照与源码是否一致 ⇒ 也能挡住「文档过期」✓。

    照抄验证:「0 个清单有问题、0 处区域契约错误、0 处主题契约错误」——**有告警也要处理**,它是零告警口径。

深入参考:快速开始与命令速查目录结构

01五分钟做出第一个插件plugin

走通"生成骨架 → 写逻辑 → 启用 → 看到它生效"这一整条路。插件是最容易上手的类型。

  1. 1npm run engine:new -- --type plugin --id my-plugin --name "我的插件"

    生成 engines/plugins/my-plugin/(manifest.json + hooks.ts + README.md ✓)。生成的骨架**本身是干净的**:零错误零告警。

    照抄验证:提示「生成」且 engine:validate 立刻通过。

  2. 2编辑 manifest.json,把 "hooks": ["lead:created"] 填上

    声明与实现**必须一致**:声明了没实现会被拒绝;实现了没声明则不会被注册(最坑的一种,因为它不报错但什么都不发生 ✓)。

    照抄验证:engine:validate 仍通过;清单里 hooks 不再是空数组。

  3. 3编辑 hooks.ts:on('lead:created', async ({ lead }) => { log('收到新线索 ' + lead.id) })

    log 会自动加 [engine:my-plugin] 前缀 ✓,这是后面"确认它真的跑了"的抓手。

    照抄验证:engine:validate 通过(它会检查 on() 用到的扩展点都在清单里声明过 ✓)。

  4. 4后台 →「引擎与扩展」→ 重新扫描 → 启用

    新装的包**默认停用** ✓。插件与钩子是运行时加载的:改完源码只需再点一次「重新扫描」,不用重新构建、也不用重启。

    照抄验证:列表里出现我的插件,状态为已启用;重新扫描的返回里 uiErrors 为空。

  5. 5前台打开 /contact,提交一条需求

    这一步才是真正的验收:**扩展点被触发**。

    照抄验证:服务端控制台出现 [engine:my-plugin] 开头的一行日志,里面带你刚才那条线索的 id ✓。

深入参考:hooks.ts 的接口与生命周期扩展点清单

02做一个可配置的展示区块(只有组件的主题)theme

做出"能在页面里放一块、参数后台可调、样式自己写的展示单元"。这是社区最容易被贡献的一类。

  1. 1先读一个真实的:engines/themes/hejun-default/components/FeatureSteps.vue

    它就是"三步走"区块。要点只有两条:① 清单 settings 里的 key 与组件的 props **同名**就自动拿到值 ✓;② 只有 public: true 的设置项才会下发到前台 ✓。

    照抄验证:在后台「引擎与扩展 → 禾君默认主题」能看到它的设置项并改值,前台刷新后跟着变。

  2. 2npm run engine:new -- --type theme --id my-block --name "我的区块"

    区块就是"只有组件、没有布局与页面的 theme"✓ —— 类型名仍是 theme ✓(历史上叫过 template,那个名字已经不用了 ✓)。

    照抄验证:engine:validate 通过,输出里出现 my-block。

  3. 3在 manifest.json 里声明 regions,例如 ["home.after-systems"]

    区域是"页面留给扩展的位置"✓。站点里可用的区域清单在 engine:validate 输出的末尾 ✓;**声明了站点不存在的区域,校验会直接失败** ✓(宁可报错,也不让你做出一个永远不显示的区块 ✗)。

    照抄验证:engine:validate 通过;若故意写一个不存在的区域,它会报错并列出可用清单 ✓ —— 这一条建议你真试一次。

  4. 4在站点页面里放 <TemplateSlots region="home.after-systems" />(或由主题自动注入)

    页面只留位置,谁声明了该区域谁就出现在那里 ✓;没有扩展声明时它渲染为空 ✓(不会留下空洞 ✓)。

    照抄验证:启用后前台对应位置出现你的区块;停用后立刻消失。

深入参考:包内部布局(名字是硬约束)在页面里使用扩展区块

03做一个模块(后台页 + 接口 + 权限点,可选建表)module

一整套业务能力:后台能管、接口能用、权限可分配、数据可存。

  1. 1npm run engine:new -- --type module --id my-module --name "我的模块"

    模块骨架比插件多几个位置:pages/admin/、server/api/、schema.example.prisma ✓。

    照抄验证:engine:validate 通过。

  2. 2照 faq-manager 写后台页:engines/modules/faq-manager/pages/admin/faqs.vue

    这是"随源码交付"的真实模块 ✓(你也可以在开发者中心的「源码拉取」里直接下载它的源码 ✓)。后台页要完整语义(admin 布局 + 鉴权)就得随源码构建一次 ✓。

    照抄验证:重新扫描后后台侧边栏出现你的菜单项,能进页面。

  3. 3在清单里声明 permissions,接口放进包内 server/api/admin/

    **不必改核心的 route-perms.ts** ✓:声明的权限点会自动出现在后台「角色权限」里等分配 ✓;包内 server/ 路径原样映射为 /api/… ✓。

    照抄验证:后台「角色权限」里能看到你声明的权限点;未分配时调接口返回 403,分配后通过 ✓。

  4. 4要建表时:写 schema.prisma(只写自己的 model)→ npm run engine:schema → npx prisma db push → 停服 npx prisma generate → 重启

    这是**唯一绕不开重启**的部分 ✓:Prisma Client 由构建期生成,运行时加不了 model ✓。Windows 上 dev server 占着查询引擎 dll,不停服 generate 会 EPERM ✓。

    照抄验证:重启后接口里 prisma.你的模型 可用;后台「扩展详情」显示它带了数据表。

  5. 5卸载时:npm run engine:remove -- --type module --id my-module

    它会先跑扩展自己的 onUninstall 清理数据,再删目录与状态记录 ✓。数据表要不要手动清,写在 README 里 ✓(审核表也查这一条 ✓)。

    照抄验证:提示卸载完成;engine:list 里不再出现它。

深入参考:模块自带后台接口与权限点数据模型

04做一个主题(接管整套前端)theme

整套外观可切换:布局 + 样式(+ 新页面)。

  1. 1读两份真实主题:engines/themes/hejun-default(禾君默认)、engines/themes/moderncommerce(Modern Commerce)

    两份都可以在开发者中心的「源码拉取」里浏览或下载 ✓(Modern Commerce 压缩后 21.68MB,超过后台上传上限 20MB ⇒ 它那条要**手工解压**到 engines/themes/ 下 ✓,页面会明确标出来 ✓)。

    照抄验证:后台「主题」页能看到它们,且**同时只能激活一个** ✓。

  2. 2npm run engine:new -- --type theme --id my-theme --name "我的主题"

    主题可含 layouts/(引擎会用它接管站点布局 ✓)与 assets/*.css(构建期注入站点样式表 ✓)。

    照抄验证:engine:validate 通过;后台主题页出现你的主题。

  3. 3在后台「主题」页切换激活

    切换是**可逆**的:未激活主题的页面与样式一律 404 ✓(有巡检闸门守着 ✓)。

    照抄验证:前台外观立刻改变;切回默认主题后完全恢复。

  4. 4注意一条天花板:**扩展页面不能覆盖核心页面**

    核心页面是构建期注册的具体路由,扩展页面撞上它永远不会被渲染 ✓(这是"核心优先"的有意设计 ✓)。要改核心页面就改核心源码,而不是硬写扩展 ✓。

    照抄验证:试图用同名路径覆盖核心页面时,重新扫描的返回里会有告警 ✓。

深入参考:扩展能做到什么深度主题设计(离线文档)

05本地调试:怎么知道它为什么没生效

把"改了没反应"变成"知道是哪一类没生效"。

  1. 1看「重新扫描」的返回值(后台「引擎与扩展」页)

    接口、组件、页面的编译失败都会出现在 uiErrors 里 ✓。**编译失败的组件不会覆盖构建期那份** ⇒ 表现为"还是旧内容"✗ —— 这是最容易被误判成"热更新坏了"的一种 ✓。

    照抄验证:故意在组件模板里写一处语法错 → 重新扫描 → uiErrors 里出现该文件与错误行 ✓。

  2. 2看服务端日志里 [engine:<包 id>] 开头的行

    钩子里的异常会被引擎吞掉并记日志("顺带做的事"不该让主流程失败 ✓),所以**必须看日志**才知道钩子有没有跑、有没有报错 ✓。

    照抄验证:启用插件后提交一条线索,日志里出现对应的 [engine:...] 行。

  3. 3看运行时产物目录 .engine-build/<包 id>@<版本>/

    引擎把包内 .vue 就地编译成 ESM 后放在这里 ✓。怀疑"编译出来的东西不对"时直接看它 ✓。

    照抄验证:该目录随包版本变化;engine:gc 会清掉旧版本(每包保留最近 2 个 ✓)。

  4. 4改了什么之后要做什么(照这张表来)

    hooks.ts / 包内 server/api / 包内 components 与 pages / manifest.json ⇒ 点一次「重新扫描」✓;已有页面的模板(构建期注册的那份)⇒ 重新构建 + 重启 ✓;包内 schema.prisma ⇒ schema → db push → 停服 generate → 重启 ✓。

    照抄验证:按表操作后现象与预期一致;不一致时先怀疑"是不是改错了表里的那一格" ✓。

深入参考:改了什么之后要做什么(完整表)常见报错对照

06打包、签名与授权码

把包交给别人装;付费包还能"装得上、看得见,但没授权就不跑"。

  1. 1npm run engine:keygen

    生成一对 ed25519 密钥:私钥(ENGINE_PRIVATE_KEY)只留在你机器上 ✓,公钥交给站主加进「信任白名单」✓。**私钥绝不入库、绝不提交** ✓。

    照抄验证:打印出新生成的密钥标识(keyId);再次执行会提示已有密钥。

  2. 2npm run engine:pack -- --type module --id my-module --sign

    产出两个文件:包本体 .tar.gz(包内路径是 <id>/…✓)与同名描述文件 .json(含 sha256、作者、引擎兼容范围、签名与 keyId ✓)。

    照抄验证:打印 sha256;描述文件里有 signature 与 keyId 字段。

  3. 3npx sha256sum dist/engines/<...>.tar.gz(或 certutil -hashfile ... SHA256)

    自己核对一遍摘要与描述文件是否一致 ✓ —— 站主装不上时的第一件事就是比对这两个数 ✓。

    照抄验证:算出来的摘要与描述文件里的 sha256 完全相同。

  4. 4付费包:npm run engine:license -- issue --type module --id <id> --to "客户名" --per-major --days 365 --domain client-a.com

    三个收费选择都是签发参数、不用改代码 ✓(绑不绑域名、买断大版本还是永久、有效期 ✓)。签发完用 --verify 自查,--list 看台账 ✓。

    照抄验证:verify 输出"有效";站主贴进后台时会**先校验再保存**,读不出来/不是给这个包的/签名对不上都会当场说明原因 ✓。

  5. 5注意:它不是 DRM

    校验跑在站主自己的服务器上,他拥有代码与数据库 ⇒ 有能力改掉 ✓。它给的是"明确的契约状态 + 防误用" ✓,真正的约束力来自合同与交付关系 ✓。

    照抄验证:这一点值得写进你的交付说明里 ✓(免得客户以为它防得住有心人)。

深入参考:打包、分发与安装命令行速查

07上架:自助通道与人工收录

知道你的包走哪条路进来,以及要交什么。

  1. 1纯前端型(主题 / 区块)→ 开发者中心的「上架」自助通道

    这是**唯一一条自助通道** ✓:只接受主题包(含只有组件的区块 ✓),且要求"签名者公钥已登记" ✓ —— 即站主的信任白名单里得有你的公钥 ✓(否则你会看到"信任表里还没有任何作者公钥"这句话 ✓,那就是原因本身 ✓)。

    照抄验证:先点「预检(不写入)」:它会解包、跑闸门,把"将写到哪里、覆盖什么、为什么不行"全摆出来 ✓;确认后才「发布」✓。

  2. 2含服务端能力的(模块 / 插件)→ 把 .tar.gz + 描述文件 + 公钥交给站主,人工收录

    原因不是"我们不爱做工具"✗,而是隔离:扩展的服务端代码跑在与核心同一个进程里、拿到同一份 prisma ✓ ⇒ 装陌生人的服务端代码 = 把自己的数据库交给它 ✓。这条边界写在 docs/marketplace-selfserve.md ✓。

    照抄验证:站主侧会看到这包是谁签的(keyId)与从哪条通道进来的(installedFrom)✓ —— 出事时查得出"这个包是谁给的" ✓。

  3. 3《上架清单》——作者要交什么

    ① 清单合法(engine:validate 通过)且 compat.engine 明确声明 ✓;② 语义化版本,破坏性变更必须升大版本 ✓;③ 包内必须有 README.md(后台扩展详情页直接显示它 ✓)✓;④ 声明清楚:自带几张表、用哪些权限点、注入哪些区域、是否联网、是否含定时任务 ✓;⑤ 签名与公钥随包提交 ✓。

    照抄验证:逐条对照一遍;缺 README 或声明不清的包,收录时会被退回 ✓。

  4. 4《审核表》——站主收录时逐条过(你提前自查一遍)

    解包规则(无符号链接 / 无绝对路径 / 无 .. / 单顶层目录 = 包 id)✓;**不在运行时下载代码**(fetch 后 eval / 动态 import 远程 JS —— 这是绕过签名与审核的唯一路径 ✗)✓;不改核心表结构、不写别的模块的表 ✓;权限点粒度合理(不搞一个权限管全部 ✓)✓;联网地址白名单化写进 README ✓;有 README + 卸载说明(数据表要不要手动清 ✓)✓。

    照抄验证:把"联网地址"与"要动哪些表"写进 README 再交付 ✓ —— 这两条是站主最先问的 ✓。

深入参考:开发者上传入口(本页下方)接口变更记录

08版本与兼容:什么时候算破坏性变更

让你的扩展在引擎升级后不会突然不可用。

  1. 1在清单里如实写 compat.engine 与 compat.nuxt

    引擎会**真的比对**这两个区间 ✓(nuxt 以前是死字段,现在会参与判断 ✓)。写宽了会在升级后炸、写窄了会白白不可用 ✓。

    照抄验证:engine:validate 不再给出"要求引擎 X,当前 Y"这类告警。

  2. 2破坏性变更 = 老调用方或老扩展会坏

    删接口、删字段、可选字段变必填、字段类型变化、权限点变化、访问要求变严、删页面、扩展点或清单字段被移除 ✓;其余算兼容变更 ✓。**对扩展作者而言**:你的扩展如果依赖了某个扩展点或某个核心接口,那些东西被标记为破坏性时就要跟着改 ✓。

    照抄验证:升级前先跑一次 API 变更记录(下一节),只看 since 之后的部分 ✓。

  3. 3GET /api/dev-docs?since=<你上次适配的引擎版本>

    只返回那之后的变化 ✓(返回里带 changelogSince ✓)。这是给扩展作者准备的机器可读入口 ✓。

    照抄验证:返回的 changelog 列表里能一眼看出有没有 breaking 项 ✓。

深入参考:接口变更记录(网页版)

09排查手册:症状 → 先看哪里

把"没反应"拆成可检查的几类。

  1. 1症状:后台启用了扩展,但前台没有任何变化

    按顺序查:① 扩展是否真的启用 ✓;② 它声明的扩展点是否"可用"(未实现的扩展点声明会被拒绝 ✓);③ 设置项里是不是把功能关了 ✓。

    照抄验证:三步各有一条可观察的证据(列表状态 / 校验输出 / 设置值),别凭印象 ✓。

  2. 2症状:组件在页面上没出现,或者还是旧内容

    先点一次「重新扫描」✓。返回里有 uiErrors ⇒ 编译失败 ⇒ 失败的组件**不会覆盖构建期那份** ⇒ 现象就是"还是旧的" ✓。另外用 <component :is="名字"> 渲染时,名字要和文件名一致 ✓。

    照抄验证:重新扫描的返回里 uiErrors 为空,且页面显示的是新内容。

  3. 3症状:扩展接口 404 或报 xxx is not a function

    404 ⇒ 依次确认:文件在包内 server/api/ 下 ✓、做过一次重新扫描 ✓、没与核心接口重名(重名会被跳过并在服务端日志告警 ✓)。is not a function ⇒ 用了"可直接使用的名字"清单以外的标识符 ✓(用清单里的名字,或显式 import ✓)。

    照抄验证:日志里没有"跳过扩展接口"的告警;调用返回 200 而不是 404。

  4. 4症状:我改了包内 server/ 下的新接口文件,但前台还是 404(实测踩过 ✓)

    **新加的服务端路由需要重启 dev server** ✓ —— 改动已有文件会热更新,但**新增**的路由文件在当前开发环境里要重启一次才注册 ✓。这一条是本站在做「源码拉取」时自己踩到的 ✓,写下来免得你也白查一轮 ✓。

    照抄验证:重启后同一个 URL 从 404 变成 200。

  5. 5症状:包下载下来改完,后台上传被 413 挡住

    安装器有**自己的**体积上限(`LIMITS.maxTotalBytes`,当前 20MB ✓)。超过它的包(例如 Modern Commerce 主题,压缩后 21.68MB ✓)走不了上传通道 ✓ ⇒ 改成**手工解压**:把 tar.gz 解到你站点的 engines/<类型>/ 下(包内顶层目录就是包 id ✓),再点一次「重新扫描」✓。

    照抄验证:engine:list 里能看到它、后台能启用 ✓(这条不受上传上限约束 ✓)。

深入参考:常见报错对照(13 条)扩展的边界与生效时机

10规范与接口的变更记录

知道"引擎/接口/规范改了什么",以及怎么只看自己关心的那一段。

  1. 1网页版:/docs#changelog

    由脚本从**代码差异生成**(不是手写的 ✓),所以它不会过期 ✓。破坏性变更被单独标出来 ✓。

    照抄验证:能看到每次变更的日期、引擎版本、逐条变更与是否破坏性 ✓。

  2. 2机器可读版:GET /api/dev-docs?since=<引擎版本>

    同上,但按 since 过滤 ✓,适合放进你的 CI 或适配清单 ✓。

    照抄验证:返回里 changelogSince 与请求的 since 一致。

  3. 3维护者侧:npm run api:changelog -- --note "说明"

    改动核心接口/模型/页面/扩展规范后跑一次,把变化落账 ✓。有静态闸门守着接口快照与代码一致 ✓ —— 破坏性变更不走这一步会被拦下 ✓。

    照抄验证:报告里不再出现 api-drift 这类失败。

深入参考:接口变更记录门禁与巡检

上架与审核

纯前端型(主题 / 区块)走下面的自助通道(唯一的自助通道); 含服务端能力的模块与插件走人工收录 —— 原因不是"工具没做", 而是隔离:扩展的服务端代码跑在与核心同一个进程里、拿到同一份数据库权限, 装陌生人的服务端代码等于把自己的数据库交给它。这条边界写在 docs/marketplace-selfserve.md。

《上架清单》—— 作者要交什么

  • 清单合法:npm run engine:validate 通过,且 compat.engine 明确声明
  • 语义化版本:破坏性变更必须升大版本
  • 包内必须有 README.md(后台扩展详情页直接显示它)
  • 声明清楚:自带几张表、用哪些权限点、注入哪些区域、是否联网、是否含定时任务
  • 签名与公钥随包提交(站主按作者公钥准入)

《审核表》—— 收录时逐条过(建议你自查)

  • 解包规则:无符号链接 / 无绝对路径 / 无 .. / 单顶层目录 = 包 id
  • 不在运行时下载代码(fetch 后 eval、动态 import 远程 JS)—— 这是绕过签名与审核的唯一路径
  • 不改核心表结构、不写别的模块的表
  • 权限点粒度合理(不搞「一个权限管全部」)
  • 联网地址白名单化,写进 README
  • 有 README + 卸载说明(数据表要不要手动清)

自助上架(纯前端型主题 / 区块)

请先登录后再上传。上传者身份与签名公钥绑定:站主的信任白名单里有你的公钥,包才进得来。

开发文档与规范

开发文档已经并进这里 ✓ —— 顶部导航只保留「开发者中心」一条 ✓, 完整文档仍是独立一页(`/docs` ✓:1700 行、含生成型数据与锚点,塞进本页只会变成怪物 ✗), 下面按文档本身的章节给出直达入口 ✓。接口、模型、页面与组件清单全部由源码扫描生成, 改代码后它自己就更新 ✓ —— 所以这里不抄第二份。

离线交付也能拿到全部材料:docs/engine-spec.md(权威规范 §0–§14)、 docs/engine-capabilities.md(能力与天花板)、 docs/theme-design.md(主题设计)、 docs/official-modules.md(官方包规格), 以及本页指南的离线版 docs/dev-guide.md —— 它们都在整站源码包里 ✓。 机器可读的接口与模型清单:dev-docs.json。