feat: publish Dever core with project scaffolding and versioned AI skills
This commit is contained in:
1 parent
70fa73cdc2
commit
ac458ffa7f
960 files changed
+221319
-1163
No files matched your search
@@ -0,0 +1,28 @@
|
||||
# 后台分类接口
|
||||
|
||||
后台分类接口创建和停用分类。
|
||||
|
||||
- 包:`content.category.api.admin.manage`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 创建分类
|
||||
|
||||
创建分类委托给应用。
|
||||
|
||||
- 声明:`post create`
|
||||
|
||||
```dever
|
||||
post create = app.create
|
||||
```
|
||||
|
||||
## 停用分类
|
||||
|
||||
停用分类委托给应用。
|
||||
|
||||
- 声明:`delete disable`
|
||||
|
||||
```dever
|
||||
delete disable = app.disable
|
||||
```
|
||||
@@ -0,0 +1,105 @@
|
||||
# 内容分类应用
|
||||
|
||||
分类应用负责创建和停用分类。
|
||||
|
||||
- 包:`content.category.app`
|
||||
- 公开类型:
|
||||
- `CategoryView`
|
||||
- 公开方法:
|
||||
- `create`
|
||||
- `disable`
|
||||
- `require_active`
|
||||
- 使用:
|
||||
- `content.category.create(name)`
|
||||
- `content.category.disable(id)`
|
||||
- `content.category.require_active(id)`
|
||||
|
||||
## 分类视图
|
||||
|
||||
返回分类公开字段。
|
||||
|
||||
- 类型:`CategoryView`
|
||||
- 字段:
|
||||
- `id: model.id`:记录标识
|
||||
- `name: Text`:该声明的业务值
|
||||
- `slug: Text`:规范化标识
|
||||
- `status: Text`:业务状态
|
||||
|
||||
```dever
|
||||
type CategoryView {
|
||||
id: model.id
|
||||
name: Text
|
||||
slug: Text
|
||||
status: Text
|
||||
}
|
||||
```
|
||||
|
||||
## 创建分类
|
||||
|
||||
创建规范化分类。
|
||||
|
||||
- 函数:`create`
|
||||
- 输入:
|
||||
- `name: Text`:该声明的业务值
|
||||
- 输出:
|
||||
- `category: CategoryView`:该声明的业务值
|
||||
|
||||
```dever
|
||||
create(name: Text) (category: CategoryView) {
|
||||
normalized = domain.normalize_name(name)
|
||||
domain.require_name(normalized)
|
||||
stored = model.create(
|
||||
{
|
||||
name = normalized
|
||||
slug = domain.normalize_slug(normalized)
|
||||
}
|
||||
)
|
||||
category = CategoryView {
|
||||
id = stored.id
|
||||
name = stored.name
|
||||
slug = stored.slug
|
||||
status = "active"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 停用分类
|
||||
|
||||
停用已有分类。
|
||||
|
||||
- 函数:`disable`
|
||||
- 输入:
|
||||
- `id: content.category.model.id`:记录标识
|
||||
- 输出:
|
||||
- `ok: Bool`:该声明的业务值
|
||||
|
||||
```dever
|
||||
disable(id: model.id) (ok: Bool) {
|
||||
changed = model.update(
|
||||
id,
|
||||
{
|
||||
status = model.CategoryStatus.Disabled
|
||||
}
|
||||
)
|
||||
discarded = changed
|
||||
ok = true
|
||||
}
|
||||
```
|
||||
|
||||
## require_active
|
||||
|
||||
分类应用负责创建和停用分类。
|
||||
|
||||
- 函数:`require_active`
|
||||
- 输入:
|
||||
- `id: content.category.model.id?`:记录标识
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
require_active(id: model.id) () {
|
||||
stored = model.get(id)
|
||||
domain.require_active(stored.status == model.CategoryStatus.Active)
|
||||
}
|
||||
|
||||
require_active(id: null) () {}
|
||||
```
|
||||
@@ -0,0 +1,89 @@
|
||||
# 内容分类规则
|
||||
|
||||
分类名称和标识在领域规则中统一规范化。
|
||||
|
||||
- 包:`content.category.domain`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 规范名称
|
||||
|
||||
去除分类名称两端空白。
|
||||
|
||||
- 函数:`normalize_name`
|
||||
- 输入:
|
||||
- `value: Text`:该声明的业务值
|
||||
- 输出:
|
||||
- `name: Text`:该声明的业务值
|
||||
|
||||
```dever
|
||||
normalize_name(value: Text) (name: Text) pure {
|
||||
name = text.trim(value)
|
||||
}
|
||||
```
|
||||
|
||||
## 规范标识
|
||||
|
||||
统一分类标识大小写。
|
||||
|
||||
- 函数:`normalize_slug`
|
||||
- 输入:
|
||||
- `value: Text`:该声明的业务值
|
||||
- 输出:
|
||||
- `slug: Text`:规范化标识
|
||||
|
||||
```dever
|
||||
normalize_slug(value: Text) (slug: Text) pure {
|
||||
slug = text.lower(text.trim(value))
|
||||
}
|
||||
```
|
||||
|
||||
## 检查名称
|
||||
|
||||
拒绝空分类名称。
|
||||
|
||||
- 函数:`require_name`
|
||||
- 输入:
|
||||
- `value: Text`:该声明的业务值
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
require_name(value: Text) () pure {
|
||||
check_name(value != "")
|
||||
}
|
||||
```
|
||||
|
||||
## 检查名称结果
|
||||
|
||||
有效名称继续执行,无效名称返回标准错误。
|
||||
|
||||
- 函数:`check_name`
|
||||
- 输入:
|
||||
- `value: Bool`:该声明的业务值
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
check_name(value: true) () pure {}
|
||||
|
||||
check_name(value: false) () pure {
|
||||
fail(dever.api.Error.Invalid)
|
||||
}
|
||||
```
|
||||
|
||||
## require_active
|
||||
|
||||
分类名称和标识在领域规则中统一规范化。
|
||||
|
||||
- 函数:`require_active`
|
||||
- 输入:
|
||||
- `active: Bool`:该声明的业务值
|
||||
- 输出:无
|
||||
|
||||
```dever
|
||||
require_active(active: true) () pure {}
|
||||
|
||||
require_active(active: false) () pure {
|
||||
fail(dever.api.Error.Conflict)
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,44 @@
|
||||
# 内容分类模型
|
||||
|
||||
内容分类保存标题、标识和状态。
|
||||
|
||||
- 包:`content.category.model`
|
||||
- 公开类型:
|
||||
- `CategoryStatus`
|
||||
- `Category`
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 分类状态
|
||||
|
||||
状态枚举。
|
||||
|
||||
- 类型:`CategoryStatus`
|
||||
- 分支:
|
||||
- `Active`:启用
|
||||
- `Disabled`:禁用
|
||||
|
||||
```dever
|
||||
type CategoryStatus {
|
||||
Active = "启用"
|
||||
Disabled = "禁用"
|
||||
}
|
||||
```
|
||||
|
||||
## 分类
|
||||
|
||||
分类记录。
|
||||
|
||||
- 类型:`Category`
|
||||
- 字段:
|
||||
- `name: Text(1, 80)`:名称
|
||||
- `slug: Text(1, 100)`:标识
|
||||
- `status: CategoryStatus`:状态
|
||||
|
||||
```dever
|
||||
type Category {
|
||||
name: Text(1, 80)
|
||||
slug: Text(1, 100) unique
|
||||
status: CategoryStatus default CategoryStatus.Active index
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,18 @@
|
||||
# 后台修订接口
|
||||
|
||||
后台修订接口创建文章修订记录。
|
||||
|
||||
- 包:`content.revision.api.admin.manage`
|
||||
- 公开类型:无
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 创建修订
|
||||
|
||||
创建修订委托给应用。
|
||||
|
||||
- 声明:`post create`
|
||||
|
||||
```dever
|
||||
post create = app.create
|
||||
```
|
||||
@@ -0,0 +1,89 @@
|
||||
# 内容修订应用
|
||||
|
||||
修订应用创建文章历史版本并返回公开视图。
|
||||
|
||||
- 包:`content.revision.app`
|
||||
- 公开类型:
|
||||
- `RevisionView`
|
||||
- 公开方法:
|
||||
- `create`
|
||||
- 使用:
|
||||
- `content.revision.create(selected_article_id, expected_version, title, body, category_id, asset_id)`
|
||||
|
||||
## 修订视图
|
||||
|
||||
不暴露存储实现细节的修订结果。
|
||||
|
||||
- 类型:`RevisionView`
|
||||
- 字段:
|
||||
- `id: model.id`:记录标识
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- `version: Int`:当前编辑版本
|
||||
- `title: Text`:文章标题
|
||||
- `body: Text`:正文
|
||||
- `status: Text`:业务状态
|
||||
|
||||
```dever
|
||||
type RevisionView {
|
||||
id: model.id
|
||||
article_id: news.article.model.id
|
||||
version: Int
|
||||
title: Text
|
||||
body: Text
|
||||
status: Text
|
||||
}
|
||||
```
|
||||
|
||||
## 创建修订
|
||||
|
||||
按文章已有版本数生成下一个版本。
|
||||
|
||||
- 函数:`create`
|
||||
- 输入:
|
||||
- `selected_article_id: news.article.model.id`:待编辑文章标识
|
||||
- `expected_version: Int`:调用者读取的编辑版本
|
||||
- `title: Text`:文章标题
|
||||
- `body: Text`:正文
|
||||
- `category_id: content.category.model.id?`:可选分类引用
|
||||
- `asset_id: media.asset.model.id?`:可选媒体引用
|
||||
- 输出:
|
||||
- `revision: RevisionView`:该声明的业务值
|
||||
|
||||
```dever
|
||||
transaction create(
|
||||
selected_article_id: news.article.model.id,
|
||||
expected_version: Int,
|
||||
title: Text,
|
||||
body: Text,
|
||||
category_id: content.category.model.id?,
|
||||
asset_id: media.asset.model.id?
|
||||
) (revision: RevisionView) {
|
||||
edited = news.article.edit(
|
||||
selected_article_id,
|
||||
expected_version,
|
||||
title,
|
||||
body,
|
||||
category_id,
|
||||
asset_id
|
||||
)
|
||||
stored = model.create(
|
||||
{
|
||||
article_id = selected_article_id
|
||||
version = edited.version
|
||||
title = edited.title
|
||||
body = edited.body
|
||||
category_id = edited.category_id
|
||||
asset_id = edited.asset_id
|
||||
status = model.RevisionStatus.Draft
|
||||
}
|
||||
)
|
||||
revision = RevisionView {
|
||||
id = stored.id
|
||||
article_id = stored.article_id
|
||||
version = stored.version
|
||||
title = stored.title
|
||||
body = stored.body
|
||||
status = "draft"
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,62 @@
|
||||
# 内容修订模型
|
||||
|
||||
修订记录保存文章历史内容和版本。
|
||||
|
||||
- 包:`content.revision.model`
|
||||
- 公开类型:
|
||||
- `RevisionStatus`
|
||||
- `Revision`
|
||||
- 公开方法:无
|
||||
- 使用:无
|
||||
|
||||
## 修订状态
|
||||
|
||||
修订状态枚举。
|
||||
|
||||
- 类型:`RevisionStatus`
|
||||
- 分支:
|
||||
- `Draft`:该声明的业务值
|
||||
- `Published`:该声明的业务值
|
||||
|
||||
```dever
|
||||
type RevisionStatus {
|
||||
Draft = "草稿"
|
||||
Published = "已发布"
|
||||
}
|
||||
```
|
||||
|
||||
## 修订记录
|
||||
|
||||
文章的一个历史版本。
|
||||
|
||||
- 类型:`Revision`
|
||||
- 字段:
|
||||
- `article_id: news.article.model.id`:文章标识
|
||||
- `version: Int`:当前编辑版本
|
||||
- `title: Text(1, 160)`:文章标题
|
||||
- `body: Text`:正文
|
||||
- `category_id: content.category.model.id?`:可选分类引用
|
||||
- `asset_id: media.asset.model.id?`:可选媒体引用
|
||||
- `status: RevisionStatus`:业务状态
|
||||
|
||||
```dever
|
||||
type Revision {
|
||||
article_id: news.article.model.id index
|
||||
version: Int
|
||||
title: Text(1, 160)
|
||||
body: Text
|
||||
category_id: content.category.model.id?
|
||||
asset_id: media.asset.model.id?
|
||||
status: RevisionStatus default RevisionStatus.Draft index
|
||||
}
|
||||
```
|
||||
|
||||
## 版本唯一约束
|
||||
|
||||
同一文章的版本号唯一。
|
||||
|
||||
- 声明:`unique(article_id, version)`
|
||||
|
||||
```dever
|
||||
unique(article_id, version)
|
||||
```
|
||||
Reference in new issue
Block a user