Files
core/examples/README.md
T
2026-11-03 03:32:07 +00:00

4.0 KiB
Raw Blame History

Dever 示例

入门项目见 随包示例。CMS 演示多租户内容管理,包括登录、权限、文章修订、上传和定时发布。

CMS 只维护一份 Dever 源码,领域说明存放在 README 和 doc 中:

module/
  platform/tenant/          平台租户
  user/account/             凭据、成员、会话、bootstrap CMD
  user/authorization/       核心角色授权的业务入口
  content/category/         分类
  content/revision/         文章编辑与修订快照
  media/asset/              上传、Storage Port/Adapter
  publishing/schedule/      定时发布与 Job
  audit/operation/          操作审计
  system/health/            健康 CMD
  news/article/
    app/editing.dever
    app/publication.dever
    api/admin/manage.dever
    api/front/browse.dever
    domain.dever
    model.dever
    model/publication.dever
test/
  content/category/lifecycle.dever
  news/article/publish.dever
  user/account/bootstrap.dever
  user/account/validation.dever
  user/account/lifecycle.dever

数据和权限

平台租户、账号、成员和会话使用 global type,保存在平台库。文章、分类、修订、媒体、排期和审计放在各租户自己的数据库。

账户、成员和会话同属账户领域,避免登录调用与 Model ID 引用形成循环依赖。租户文章的作者编号来自已验证身份,使用 Int 存储;物理外键只连接同一个数据库中的 Model,不能从租户库指向平台账户库。

verify 先核实身份数据,核心再按站点和角色检查接口权限,通过后才访问租户数据。

文章接口位于 /news/article/admin/manage/:create 创建,list/detail 查询,remove 删除草稿,publish 发布。

编辑使用 /content/revision/admin/manage/create,传入文章 ID、expected_version、标题正文和可空分类/媒体 ID。版本冲突返回 409,文章更新与修订快照一起提交。文章不用自动 REST 写接口,以免跳过这些规则;列表返回 app.ArticleView,不泄漏私有 Model。

定时发布使用 /publishing/schedule/admin/manage/schedule,传入文章 ID 和 publish_at。创建时检查作者和草稿状态;每个排期有独立任务,不会合并同时发布的文章。

执行任务前,核心再次核验身份和权限。发布、审计和排期状态一起提交或回滚,完成任务重复执行不重复写入。手动重复发布返回 409。

先检查,再运行

在仓库根目录执行:

dever check examples/cms/dever
dever test examples/cms/dever --filter news.article.publish
dever fmt examples/cms/dever --check

测试使用临时 SQLite,不连接部署数据库。去掉 --filter 可执行全部应用测试。

实际部署前先替换 JWT secret,并把两个站点的 origin 和 Host 改成真实 HTTPS 入口;origin 是用户访问的外部地址,不是内部监听地址。

用 bootstrap CMD 建立平台租户、Owner 成员和密码:

dever run examples/cms/dever -- user.account.bootstrap '{"tenant_key":"tenant-one","tenant_name":"Tenant One","email":"owner@example.com","display_name":"Owner","password":"change-me-now"}'

替换示例账号与密码,再用返回的真实 tenant_id 和 user_id 执行以下命令,不要猜测 ID 是 1:

dever tenant migrate examples/cms/dever <tenant_id>
dever tenant owner examples/cms/dever <tenant_id> admin <user_id>
dever tenant owner examples/cms/dever <tenant_id> front <user_id>

这会迁移租户数据库,并建立后台、前台的核心 Owner。之后各站点通过 user/authorization/<site>/manage 管理普通角色。运行配置在项目的 config/setting.json,数据在 data/;dever run examples/cms/dever 不带 CMD 参数时启动 HTTP 服务。

应用测试覆盖分类、发布规则、账号和会话。真实登录、HTTP、租户隔离及发布流程使用 CMS 验收入口。