openxiangda-skill-kit 2.0.0-alpha.39 → 2.0.0-alpha.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -6
- package/dist/bin.js +0 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +74 -43
- package/dist/index.js.map +1 -1
- package/dist/internal/skill-installer.d.ts +9 -0
- package/dist/internal/skill-installer.d.ts.map +1 -0
- package/dist/internal/skill-installer.js +53 -0
- package/dist/internal/skill-installer.js.map +1 -0
- package/package.json +2 -6
- package/skills/manifest.json +2 -32
- package/skills/openxiangda-v2/SKILL.md +11 -42
- package/skills/openxiangda-v2/references/architecture.md +5 -0
- package/skills/openxiangda-v2/references/backend.md +5 -0
- package/skills/openxiangda-v2/references/data-authz.md +5 -0
- package/skills/openxiangda-v2/references/delivery.md +11 -0
- package/skills/openxiangda-v2/references/frontend.md +5 -0
- package/docs/architecture/admin-shell-v2.md +0 -1030
- package/docs/architecture/ant-design-pro-v6-admin-foundation.md +0 -343
- package/docs/architecture/app-api-user-delegation-v2.md +0 -40
- package/docs/architecture/authorization-consistency-v2.md +0 -419
- package/docs/architecture/best-practice-template-rebuild-v2.md +0 -206
- package/docs/architecture/environment-configuration-kernel-v2.md +0 -290
- package/docs/architecture/field-component-migration-matrix-v1-to-v2.md +0 -76
- package/docs/architecture/field-value-contract-boundary.md +0 -92
- package/docs/architecture/frontend-runtime-mount-v2.md +0 -82
- package/docs/architecture/implementation-roadmap.md +0 -79
- package/docs/architecture/local-development-v2.md +0 -136
- package/docs/architecture/mobile-user-standard-pages-v2.md +0 -88
- package/docs/architecture/native-configuration-projection-v2.md +0 -488
- package/docs/architecture/native-kernel-inventory-v2.md +0 -196
- package/docs/architecture/native-managed-files-v2.md +0 -18
- package/docs/architecture/on-demand-production-environment-v2.md +0 -102
- package/docs/architecture/proven-field-components-and-standard-surfaces-v2.md +0 -133
- package/docs/architecture/release-verification-receipt-v2.md +0 -72
- package/docs/architecture/repository-and-release.md +0 -65
- package/docs/architecture/school-contact-default-access-v2.md +0 -13
- package/docs/architecture/stable-field-protocol-adoption.md +0 -174
- package/docs/architecture/standard-surface-runtime-corrections-v2.md +0 -108
- package/docs/architecture/tenant-public-origin-implementation-blueprint.md +0 -484
- package/docs/architecture/tenant-public-origin-v2.md +0 -236
- package/docs/architecture/verification-orchestration-v2.md +0 -24
- package/docs/backend.md +0 -102
- package/docs/concepts.md +0 -34
- package/docs/data-authz.md +0 -127
- package/docs/delivery.md +0 -77
- package/docs/design/admin/README.md +0 -124
- package/docs/design/admin/data-management-v1.png +0 -0
- package/docs/design/admin/workbench-v1.png +0 -0
- package/docs/design/admin/workflow-detail-v1.png +0 -0
- package/docs/design/admin-pro-v6/README.md +0 -26
- package/docs/design/admin-pro-v6/data-management.png +0 -0
- package/docs/design/admin-pro-v6/workbench.png +0 -0
- package/docs/design/admin-pro-v6/workflow-submit-modal.png +0 -0
- package/docs/design/admin-shell-dashboard-v2.png +0 -0
- package/docs/design/admin-standard-pages-v2.png +0 -0
- package/docs/design/admin-v2/README.md +0 -60
- package/docs/design/admin-v2/data-management.png +0 -0
- package/docs/design/admin-v2/form-detail.png +0 -0
- package/docs/design/admin-v2/form-submit.png +0 -0
- package/docs/design/admin-v2/workbench.png +0 -0
- package/docs/design/admin-v2/workflow-detail.png +0 -0
- package/docs/design/admin-v2/workflow-submit.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/README.md +0 -293
- package/docs/design/openxiangda-2.0-high-fidelity/admin-component-acceptance.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/admin-data-form.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/admin-workbench.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-approval-preview.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-data-list.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-form.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-request-form.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-request-list.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-submit-workflow-preflight.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-workbench.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/mobile-workflow-detail.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/user-pc-data-list.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/user-pc-form-workflow-preview.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/user-pc-request-form-approval.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/user-pc-request-list.png +0 -0
- package/docs/design/openxiangda-2.0-high-fidelity/user-pc-workbench.png +0 -0
- package/docs/field-components.md +0 -93
- package/docs/frontend.md +0 -78
- package/docs/getting-started.md +0 -148
- package/docs/index.md +0 -27
- package/docs/llms.txt +0 -20
- package/docs/reference/cli.md +0 -69
- package/docs/reference/mcp.md +0 -31
- package/docs/school-contact-relations.md +0 -136
- package/docs/workflow-events.md +0 -86
- package/skills/openxiangda-v2-architecture/SKILL.md +0 -30
- package/skills/openxiangda-v2-architecture/agents/openai.yaml +0 -4
- package/skills/openxiangda-v2-backend/SKILL.md +0 -48
- package/skills/openxiangda-v2-backend/agents/openai.yaml +0 -4
- package/skills/openxiangda-v2-data-authz/SKILL.md +0 -58
- package/skills/openxiangda-v2-data-authz/agents/openai.yaml +0 -4
- package/skills/openxiangda-v2-delivery/SKILL.md +0 -88
- package/skills/openxiangda-v2-delivery/agents/openai.yaml +0 -4
- package/skills/openxiangda-v2-frontend/SKILL.md +0 -50
- package/skills/openxiangda-v2-frontend/agents/openai.yaml +0 -4
- package/skills/openxiangda-v2-workflow-events/SKILL.md +0 -56
- package/skills/openxiangda-v2-workflow-events/agents/openai.yaml +0 -4
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/docs/field-components.md
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# 平台字段组件使用指南
|
|
2
|
-
|
|
3
|
-
OpenXiangda 2.0 应用的持久化表单字段统一使用 `openxiangda-field-kit`。桌面端从
|
|
4
|
-
`openxiangda-field-kit/desktop` 导入,移动端从 `openxiangda-field-kit/mobile` 导入;列表、
|
|
5
|
-
详情和只读状态使用对应的 `FieldValue`。应用可以自由组合页面,但不要在业务页面重新实现字段值、
|
|
6
|
-
文件上传、人员部门目录、地址、定位或签名协议。
|
|
7
|
-
|
|
8
|
-
## 基本用法
|
|
9
|
-
|
|
10
|
-
```tsx
|
|
11
|
-
import { DesktopFieldControl, DesktopFieldValue } from 'openxiangda-field-kit/desktop';
|
|
12
|
-
|
|
13
|
-
<DesktopFieldControl
|
|
14
|
-
definition={{ code: 'amount', label: '预算金额', kind: 'money', precision: 2 }}
|
|
15
|
-
value={values.amount}
|
|
16
|
-
onChange={amount => setValues(current => ({ ...current, amount }))}
|
|
17
|
-
/>
|
|
18
|
-
|
|
19
|
-
<DesktopFieldValue
|
|
20
|
-
definition={{ code: 'amount', label: '预算金额', kind: 'money', precision: 2 }}
|
|
21
|
-
value={values.amount}
|
|
22
|
-
/>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
移动端替换为 `MobileFieldControl` 与 `MobileFieldValue`。平台目录、地址、定位和文件字段还需要传入
|
|
26
|
-
当前应用的 `FieldPlatformContext`;标准 Admin/User 页面已经自动提供。
|
|
27
|
-
|
|
28
|
-
常用体验配置继续沿用 1.0 的语义:文本支持 `maxLength`、`showCount`、前后缀和清空;数值支持
|
|
29
|
-
`min`、`max`、`step`、`precision`、单位位置和千分位;日期支持今天之前、今天之后或自定义区间;
|
|
30
|
-
多选支持 `maxCount`,子表支持 `minRows` / `maxRows`。这些都是页面行为,不改变 2.0 稳定值协议。
|
|
31
|
-
标准模板锁定 Ant Design 的尺寸、圆角和密度,不开放会造成三端样式分裂的任意 `variant` / `size` 覆盖。
|
|
32
|
-
|
|
33
|
-
## 什么时候使用哪个组件
|
|
34
|
-
|
|
35
|
-
| 需求 | 使用 | 不应使用 |
|
|
36
|
-
| --- | --- | --- |
|
|
37
|
-
| 标题、名称、编号 | `text` | 不用富文本 |
|
|
38
|
-
| 多行纯文本说明 | `textarea` | 不需要格式时不用 `richtext` |
|
|
39
|
-
| 表格、链接、图片和带格式正文 | `richtext` | 简单备注不用它 |
|
|
40
|
-
| 数量、金额、比例 | `number` / `money` / `percent` | 不用文本保存可计算数值 |
|
|
41
|
-
| 少量互斥选项 | `radio` | 选项很多时用 `option` |
|
|
42
|
-
| 少量并列多选 | `checkbox` | 选项很多时用 `options` |
|
|
43
|
-
| 平台成员与组织 | `user(s)` / `department(s)` | 不用自由文本或复制组织树 |
|
|
44
|
-
| 邮寄或行政区地址 | `address` | 需要经纬度时用 `location` |
|
|
45
|
-
| 现场打点、签到 | `location` | 普通地址填写不用定位 |
|
|
46
|
-
| 任意类型文件 | `attachments` | 只收图片时使用 `images` |
|
|
47
|
-
| 照片、截图、凭证 | `images` | 不要直接使用 Ant Upload |
|
|
48
|
-
| 同一表单的多行明细 | `subtable` | 独立生命周期的大量记录应建资源页面 |
|
|
49
|
-
| 现场手写确认 | `signature` | 法律电子签章接专业签署服务 |
|
|
50
|
-
| 流程状态展示 | `workflowStatus` | 不允许页面直接编辑流程状态 |
|
|
51
|
-
|
|
52
|
-
完整机器可读清单由 `fieldCatalog` 导出,包含每个 `FieldKind` 的值协议、适用和不适用场景。
|
|
53
|
-
|
|
54
|
-
关联表单组件已经弃用。普通关联选择使用 `option`、`radio` 或文本;需要分页检索、复杂权限和业务
|
|
55
|
-
联动时,由应用通过 NestJS App API 实现独立页面,不把业务查询重新塞进通用字段组件。
|
|
56
|
-
|
|
57
|
-
## 附件和图片
|
|
58
|
-
|
|
59
|
-
DataResource 中对应字段必须声明为 `type: 'file'`。组件保留 1.0 已验证的上传、进度、取消、失败
|
|
60
|
-
重试、预览、下载和删除交互;底层由一个 `fileService` 调用 2.0 Native Files API。应用不接触
|
|
61
|
-
`initiate → PUT → complete → delete-unbound` 细节,也不要拼接对象存储地址。
|
|
62
|
-
|
|
63
|
-
```ts
|
|
64
|
-
{ code: 'attachments', type: 'file', nullable: true,
|
|
65
|
-
file: { multiple: true, maxCount: 10, maxSizeMb: 50 } }
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
同名文件不会合并;只按平台 `fileId` 或稳定 URL 去重。图片字段可以配置 `imageCompression`,但页面
|
|
69
|
-
不能放宽 DataResource 已声明的数量、类型和大小限制。
|
|
70
|
-
|
|
71
|
-
## 富文本图片
|
|
72
|
-
|
|
73
|
-
富文本本身仍保存清洗后的 HTML 字符串。需要上传内嵌图片时,把 `richTextImageFieldCode` 指向同一
|
|
74
|
-
资源中真实的 `file` 字段;标准表单会把上传结果追加到该文件字段,确保记录保存时完成文件绑定。
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
{
|
|
78
|
-
code: 'description',
|
|
79
|
-
label: '详细说明',
|
|
80
|
-
kind: 'richtext',
|
|
81
|
-
richTextToolbar: 'full',
|
|
82
|
-
richTextImageFieldCode: 'images',
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
没有配置伴随文件字段时,桌面编辑器仍支持图片 URL,但不会开放本地图片上传。
|
|
87
|
-
|
|
88
|
-
## 验收要求
|
|
89
|
-
|
|
90
|
-
- 编辑、禁用、只读和空值均可用。
|
|
91
|
-
- 必填标识紧邻标签;提交失败定位到第一个错误字段。
|
|
92
|
-
- Desktop 与 Mobile 使用独立 renderer,移动入口不加载桌面 Ant Design 录入控件。
|
|
93
|
-
- 附件、图片、富文本、人员、部门、地址、定位和签名必须在标准模板真实保存后回显。
|
package/docs/frontend.md
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# 前端架构
|
|
2
|
-
|
|
3
|
-
状态:2026-08-16 桌面 Admin 已发布;独立移动用户端标准页面包和生成模板双入口已经实现,移动 Chromium 已覆盖身份、数据与流程提交主链路。旧自研 Shell 与 Vite 模板已经删除,企业采购参考应用已通过类型检查、测试、Umi production build 与桌面/移动 Chromium 验收。完整决策见[Ant Design Pro v6 Admin 全量切换](/architecture/ant-design-pro-v6-admin-foundation)、[移动用户端标准页面](/architecture/mobile-user-standard-pages-v2),状态证据见[实施路线图](/architecture/implementation-roadmap)。
|
|
4
|
-
|
|
5
|
-
## 默认技术栈
|
|
6
|
-
|
|
7
|
-
OpenXiangda 2.0 桌面管理端采用 React 19、Ant Design 6、Umi Max 4、ProComponents 3 与 utoopack。`openxiangda-admin` 是平台集成层,不重复实现一套后台组件库:
|
|
8
|
-
|
|
9
|
-
- ProLayout:应用壳、菜单、页头与桌面导航;
|
|
10
|
-
- PageContainer:统一页面层级和主操作;
|
|
11
|
-
- ProTable:服务端搜索、排序、分页和列配置;
|
|
12
|
-
- ProForm:数据表单和流程业务表单;
|
|
13
|
-
- Descriptions / ProCard:详情、审计与流程摘要;
|
|
14
|
-
- ECharts:当前角色权限内的聚合指标与趋势。
|
|
15
|
-
|
|
16
|
-
应用不得建立第二套身份存储、权限判断、查询 DSL 或业务数据缓存。前端 capability 只负责界面裁剪,Data API、App API 与 Workflow API 始终在服务端授权。
|
|
17
|
-
|
|
18
|
-
## 路由、菜单与标签
|
|
19
|
-
|
|
20
|
-
应用页面路径、组件、标题、菜单、capability 与标签属性来自一份 `applicationRoutes`。Umi route 与 ProLayout metadata 从它派生;重复路径和 fallback 漂移在 check/build 阶段失败。未来由 `openxiangda generate` 生成时也只能替换这个单一事实源。
|
|
21
|
-
|
|
22
|
-
`AdminLayout` 提供最多 12 个会话标签。标签只保存路径、标题和打开顺序,并按平台 `identityScope` 隔离;不保存 Token、授权结论、表单草稿或业务响应。切换稳定角色会更新 identity epoch 并重新建立页面上下文。当前版本没有伪装成缓存的隐藏 keep-alive 实例池;需要真实保活时必须另行设计资源上限和失效协议。
|
|
23
|
-
|
|
24
|
-
## 身份与平台访问
|
|
25
|
-
|
|
26
|
-
- `OpenXiangdaAdminProvider` 从平台读取 Principal、RoleSession、角色绑定和 capability。
|
|
27
|
-
- 多角色用户每次只使用一个稳定角色,不隐式合并权限。
|
|
28
|
-
- 应用管理员由平台授予最高能力,前端不按角色名称硬编码绕过。
|
|
29
|
-
- `useOpenXiangdaAdmin().appApi()` 通过平台同源网关调用当前环境 NestJS 后端;浏览器不保存集群 Service 地址和 Token。
|
|
30
|
-
- Data API 客户端始终携带当前 RoleSession,并使用服务端分页、筛选、排序与 revision/CAS。
|
|
31
|
-
|
|
32
|
-
## 标准页面
|
|
33
|
-
|
|
34
|
-
### 工作台
|
|
35
|
-
|
|
36
|
-
`WorkbenchPage` 按“关键指标、趋势、快捷入口”组织中低密度首页。生产指标必须来自当前 RoleSession 下的服务端受限聚合;参考应用的本地种子统计仅用于开发验收。
|
|
37
|
-
|
|
38
|
-
### 数据管理
|
|
39
|
-
|
|
40
|
-
`ResourceTablePage` 使用 ProTable 提供页面标题、新建主操作、显式搜索、服务端列表、分页、排序、列设置和权限化操作。`ResourcePageDefinition` 只描述页面字段与交互;DataResource 继续只描述数据库字段、类型、索引、文件约束与 Data API 能力。
|
|
41
|
-
|
|
42
|
-
`ResourceFormPage` 提供独立新建/编辑页面,使用 revision/CAS 保存。`ResourceDetailPage` 展示平台字段渲染、附件和审计时间线。列表也可默认使用轻量 Modal/Drawer;业务拥有独立流程入口时可以关闭通用 create/update/delete,避免绕过业务后端。
|
|
43
|
-
|
|
44
|
-
### 流程提交
|
|
45
|
-
|
|
46
|
-
`WorkflowSubmissionPage` 默认只展示业务表单和“提交”。点击后先经 Data API/App API 保存业务记录,再调用 Kernel prepare,并在 Modal 中显示真实审批路径和必要的主部门/审批人选择。用户确认后才消费 preparation token 发起流程;审批预览不常驻页面,Workflow Kernel 不保存业务字段。
|
|
47
|
-
|
|
48
|
-
### 工作中心、任务与实例
|
|
49
|
-
|
|
50
|
-
`WorkflowWorkCenterPage` 显示当前稳定角色的待办、已处理与我发起。`WorkflowTaskPage` / `WorkflowInstancePage` 解释后端 Surface 的流程信息、业务数据、审计时间线与允许操作;同意、拒绝、退回、转交、代理和加签仍由 Kernel 做并发与权限判定。
|
|
51
|
-
|
|
52
|
-
应用领域动作使用 `loadAppActions` 加载 `app_action`,使用 `executeAppAction` 调用 NestJS App API。自定义动作不能覆盖 Kernel 同名操作;加载失败只关闭业务动作,不阻断标准审批。
|
|
53
|
-
|
|
54
|
-
## Field Kit 与移动用户端
|
|
55
|
-
|
|
56
|
-
所有平台字段使用 `openxiangda-field-kit` 的稳定值协议。人员、部门、单选、多选、单选框、复选框、日期、日期区间、地址、图片、附件、富文本和数值等都由统一定义驱动存储与显示。组件选型见[平台字段组件使用指南](./field-components.md)。
|
|
57
|
-
|
|
58
|
-
- 桌面 Admin 从 `openxiangda-field-kit/desktop` 使用 Ant Design 控件。
|
|
59
|
-
- 移动用户端由 `openxiangda-user/mobile` 提供工作台、数据列表/表单/详情和流程提交/任务/实例页面,并从 `openxiangda-field-kit/mobile` 使用 Ant Design Mobile 的独立字段交互;不把桌面 Select、DatePicker 或 Cascader 缩小后复用。
|
|
60
|
-
- 人员、部门、行政区、上传、下载和预览都通过平台 API;应用不自行复制平台目录或文件协议。关联表单平台组件已弃用,复杂关联查询由应用页面和 App API 实现。
|
|
61
|
-
- UI 必填、默认值、显隐、布局和帮助文本属于页面层;后端业务不应假设自定义页面一定执行了前端校验。
|
|
62
|
-
|
|
63
|
-
生成模板将桌面 Admin 与移动用户端放在同一个 AppPackage 的两个独立懒加载路由树中;`/admin` 只加载 Pro 页面,`/m` 只加载 `openxiangda-user/mobile`,根入口按设备能力一次性选择。移动 Chromium 已验证两棵树不混用 DOM,并覆盖稳定角色切换、列表/详情、流程发起与平台特殊字段。
|
|
64
|
-
|
|
65
|
-
## 本地开发与门禁
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
openxiangda dev
|
|
69
|
-
openxiangda generate
|
|
70
|
-
openxiangda check
|
|
71
|
-
openxiangda test
|
|
72
|
-
pnpm --filter @app/web test:e2e
|
|
73
|
-
pnpm --filter @app/web build
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
CLI 同时监督 Umi、NestJS、本地平台与工作区 PostgreSQL。UI-only 只用于非持久化界面预览。桌面 Chromium 链路覆盖工作台、菜单、标签、角色切换、数据列表/详情、供应商标准表单、流程工作中心、单按钮流程提交与个人中心;移动 Chromium 链路覆盖自动入口、独立 UI 树、角色切换、数据列表/详情、流程发起和平台字段。两条链路都断言没有浏览器运行时错误。
|
|
77
|
-
|
|
78
|
-
生产构建分别约束首屏脚本、异步 chunk 的 gzip/原始体积与开发标记;不得包含模板假用户、Umi Mock、开发 Secret、Vite 或旧 AdminShell。
|
package/docs/getting-started.md
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# 开始开发
|
|
2
|
-
|
|
3
|
-
## 创建应用
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
openxiangda app create my-app --app-code my-app --name "My App" --install
|
|
7
|
-
cd my-app
|
|
8
|
-
openxiangda skill install
|
|
9
|
-
openxiangda auth login --base-url https://platform.example.com
|
|
10
|
-
openxiangda app link --base-url https://platform.example.com
|
|
11
|
-
openxiangda app provision
|
|
12
|
-
openxiangda app info
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
开发 2.0 工具链本身时,不需要先发布 alpha 包。创建一个独立验收应用并把依赖链接到本地源码:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
openxiangda app create ../my-local-validation \
|
|
19
|
-
--app-code my-local-validation \
|
|
20
|
-
--name "Local Validation" \
|
|
21
|
-
--local-sdk /absolute/path/to/openxiangda-v2 \
|
|
22
|
-
--install
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
带 `--install` 时,创建器先写依赖映射并安装,再执行确定性契约生成;新应用第一次执行 `generate --check` 就应通过。省略 `--install` 时结果会标记 `generationDeferred: true`,需要先运行 `pnpm install`,再运行 `openxiangda generate`。`--local-sdk` 会先把本地 2.0 SDK 构建为 `.openxiangda/local-sdk-artifacts/` 下的 npm tarball,再写入机器相关的 pnpm `file:` overrides;它只用于可丢弃的本地验收应用。tarball 与正式发包采用同一依赖归一化规则,避免源码符号链接把第二份 React/NestJS 运行时带入应用进程。
|
|
26
|
-
|
|
27
|
-
应用始终调用工作区本地 `openxiangda-cli`;本地依赖未安装时直接失败,不存在 1.x 回退。`skill install` 会同时安装领域 Skills 与其引用的 2.0 参考文档。
|
|
28
|
-
|
|
29
|
-
创建结果是普通 pnpm workspace:
|
|
30
|
-
|
|
31
|
-
```text
|
|
32
|
-
apps/web React + Ant Design
|
|
33
|
-
apps/server NestJS
|
|
34
|
-
packages/domain 业务类型与规则
|
|
35
|
-
packages/contracts 平台生成契约
|
|
36
|
-
openxiangda.config.ts 应用级平台声明
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## 日常循环
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
openxiangda dev
|
|
43
|
-
openxiangda dev status
|
|
44
|
-
openxiangda generate
|
|
45
|
-
openxiangda check
|
|
46
|
-
openxiangda test
|
|
47
|
-
pnpm test:e2e
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
需要使用钉钉家校监护关系的应用,应先阅读[家校通讯录关系](./school-contact-relations.md)。2.0 尚未正式投产,当前生产应用继续使用 1.0 SDK;2.0 应用必须通过 NestJS App API 和当前 RoleSession 读取,不能复制 1.0 页面 SDK 代码。
|
|
51
|
-
|
|
52
|
-
`openxiangda dev` 是唯一受监督的日常入口:它启动完整 Ant Design Pro Admin、相互隔离的 React/Umi Max 与 NestJS 进程、独立 loopback 本地平台,以及工作区隔离的 PostgreSQL。开发者**不需要安装 PostgreSQL**,只需要 Docker Desktop 或兼容容器运行时;CLI 自动下载摘要固定的镜像、创建数据库、选择端口并限制容器资源。2.0 模板已经删除 Vite/旧自研 Shell,不保留兼容档位。关闭前台命令或执行 `openxiangda dev stop` 时只停止进程和容器并保留项目专属 volume,因此数据在重启后仍存在;受管进程组带工作区身份记录,监督进程意外中断后也可由下一次启动或 stop 安全回收。`openxiangda dev status` 查看当前/上次会话;只有显式执行 `openxiangda dev reset --data` 才会在校验工作区、容器、数据卷和凭据归属后删除本地数据库与凭据。`openxiangda dev --reset` 是“安全重置后立即启动”的快捷形式。工作区内部 `pnpm dev` 只供 CLI 编排,不负责平台进程、数据库、会话锁和清理,不作为公开开发命令。local 不是远程环境,不要求 provision 或远程 OAuth/Secret。`generate` 根据配置生成 Data、AuthZ、Event 与 Workflow 类型。`check` 必须是确定性的:同一提交、同一依赖锁、同一配置产生同一结果。完整本地模型见 [本地开发内核](./architecture/local-development-v2.md)。
|
|
53
|
-
|
|
54
|
-
默认 `pnpm test:e2e` 会自行启动隔离的 UI-only 快速回归。需要把同一套 Chromium 场景作为完整本地集成证据时,先保持 `openxiangda dev --no-open` 运行,再执行 `OPENXIANGDA_E2E_BASE_URL=http://127.0.0.1:<web-port> pnpm test:e2e`。此时 Playwright 不创建第二个服务器,而是验证浏览器、独立本地平台、NestJS 与项目专属 PostgreSQL 的同一受监督会话;`<web-port>` 以 `openxiangda dev status` 为准。外部会话模式不会隐式重置开发数据,针对确定性种子数据的整套回归只能指向一次性验收应用,或由开发者先明确停止并执行 `openxiangda dev --reset`;不得在测试配置中绕过 CLI 所有权校验直接清理容器或 volume。
|
|
55
|
-
|
|
56
|
-
完整模式下,浏览器对 App API 的请求先进入本地平台网关:网关验证当前稳定 RoleSession,丢弃浏览器自带的 Authorization,再用仅限 loopback 的短期平台身份转发给 NestJS。CLI 另外创建一个 workspace runtime OAuth client,只把原始 Secret 注入 `dev:server`,供 Worker/Scheduler/后台业务调用 Data API;前端开发进程拿不到该 Secret。数据库连接、OAuth 凭据和其他本地状态位于 Git 忽略的 `.openxiangda/local/state/`,权限为仅当前用户可读写,并且不会进入 AppPackage。
|
|
57
|
-
|
|
58
|
-
开发 2.0 工具链本身时,每一轮可用一个命令完成发布前同等级的本地验收:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
pnpm verify:local
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
它会用本地 tarball 创建并销毁一个独立新应用,覆盖脚手架、安装、生成、单测、生产构建、Skill 和文档;Chromium 只运行一次,并在该临时应用经过显式安全重置后的完整受监督会话中同时验证 React、独立本地平台、NestJS 与真实 PostgreSQL。相同生命周期还验证工作区隔离、资源限制、重启持久化、事务幂等回放和显式重置。它不会执行 npm 发布、Git 提交或平台部署。
|
|
65
|
-
|
|
66
|
-
准备发包时,先从干净且已同步远端的 `master` 物化已经评审的 Changesets,
|
|
67
|
-
检查生成的包版本、内部依赖与模板 BOM,提交并推送该版本提交,然后查看机器生成的影响计划:
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
pnpm release:version
|
|
71
|
-
# review, commit and push the generated version diff
|
|
72
|
-
pnpm release:plan
|
|
73
|
-
pnpm verify:release
|
|
74
|
-
pnpm release:publish
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
`release:version` 不提交、不发包,只把 Changesets 确定的候选版本写入 Git 工作树;未完成这一步时,后续所有发布命令会在构建前失败。`release:plan` 会完成 npm 不可变性检查并比较候选包与上一发布版本的真实 tarball。`verify:release` 冻结一批带摘要的候选 tarball,只针对这批工件执行一次正式增量门禁,并留下不可变验证凭据;`release:publish` 必须消费该凭据,只复查并发与摘要后发布同一批字节,不会重复测试。真实 PostgreSQL 生命周期门禁也只在本地平台、开发生命周期或相关模板发生变化时运行。无法分类的新包或变化自动升级为全量验证,周期审计使用配对的 `pnpm verify:release:full` 和 `pnpm release:publish:full`。发布后需要更新独立 reference 仓库时,再显式执行 `pnpm release:sync-reference`。
|
|
78
|
-
|
|
79
|
-
## OAuth2 应用身份
|
|
80
|
-
|
|
81
|
-
外部系统或后台任务通过平台托管的 OAuth2 client credentials 获取短期 token,不使用用户 RoleSession。客户端 Secret 只在创建或轮换时返回一次:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
openxiangda oauth client create --name erp-sync \
|
|
85
|
-
--environment preproduction \
|
|
86
|
-
--scope app:invoke \
|
|
87
|
-
--scope data:read
|
|
88
|
-
openxiangda oauth client list
|
|
89
|
-
openxiangda oauth client rotate <client-id> --grace-period-seconds 600
|
|
90
|
-
openxiangda oauth audit list --limit 100
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
NestJS App API 使用 `@RequireCapability` 验证服务身份 scope;Workflow 操作仍强制用户 RoleSession,不允许服务身份代替审批人。
|
|
94
|
-
|
|
95
|
-
应用后端自己的 workload client 由平台托管,不向开发者显示 Secret。查询状态或主动轮换时使用专门命令:
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
openxiangda oauth runtime status --environment preproduction
|
|
99
|
-
openxiangda oauth runtime rotate --environment preproduction \
|
|
100
|
-
--grace-period-seconds 600 \
|
|
101
|
-
--idempotency-key runtime-rotation-20260812
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
`runtime rotate` 先以当前 credential version 做 CAS 暂存,再对该环境当前激活的同一个 AppVersion 创建滚动 DeploymentRun。新 Secret 只在平台内部写入 Kubernetes Secret;新 Pod 就绪后使用新凭据,旧 Pod 在宽限期内仍可换 token。命令重试必须复用同一个幂等键,不重建或篡改应用版本。
|
|
105
|
-
|
|
106
|
-
## 环境 Secret 与运行维护
|
|
107
|
-
|
|
108
|
-
`openxiangda.config.ts` 只声明后端需要的 Secret 名称和注入环境变量,值不会进入源码或 AppPackage。可先在本地/测试环境配置,再部署应用:
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
APP_SECRET='preproduction-only-value' \
|
|
112
|
-
openxiangda secret create dingtalk-client-secret \
|
|
113
|
-
--environment preproduction \
|
|
114
|
-
--from-env APP_SECRET
|
|
115
|
-
|
|
116
|
-
openxiangda event subscription list
|
|
117
|
-
openxiangda event delivery list
|
|
118
|
-
openxiangda workflow provider list --environment preproduction
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
事件死信通过 `event delivery replay` 显式重放;Workflow Provider 密钥轮换要在下一次成功部署后才激活。
|
|
122
|
-
|
|
123
|
-
## 构建与发布
|
|
124
|
-
|
|
125
|
-
应用 CI 先构建并推送后端镜像,再将不可变镜像摘要交给 CLI:
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
openxiangda build --backend-image registry.example.com/apps/my-app@sha256:...
|
|
129
|
-
openxiangda deploy preproduction --backend-image registry.example.com/apps/my-app@sha256:...
|
|
130
|
-
openxiangda status <deployment-id>
|
|
131
|
-
openxiangda environment status
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
CLI 上传应用包并创建 DeploymentRun;部署、重试、健康检查和激活都由平台执行。CLI 退出不影响发布继续进行。生产只晋级预发已验证的同一不可变 AppVersion,不重新构建。
|
|
135
|
-
|
|
136
|
-
`app provision` 只用于首次创建平台中的稳定 2.0 应用身份和默认 `preproduction` 环境;命令可安全重试,且需要平台管理员身份。首次执行 `openxiangda promote <preproduction-deployment-id> production` 时,平台才惰性创建唯一的 `production` 环境并发布相同 AppVersion。
|
|
137
|
-
|
|
138
|
-
测试应用不使用时可执行 `openxiangda environment stop preproduction` 把当前工作负载缩容为零;环境、业务数据、Secret 元数据、Head 和发布历史都会保留。需要继续测试时执行 `openxiangda environment start preproduction`。正式环境使用相同命令,但不会由平台自动停止。
|
|
139
|
-
|
|
140
|
-
## AI 入口
|
|
141
|
-
|
|
142
|
-
AI 先读取 `openxiangda://workspace/context` 和 `openxiangda://environments`,再使用 MCP 的 `check_app`、`run_tests`、`build_app` 等结构化工具。`start_environment`、`stop_environment` 等会改变环境的工具必须在用户明确授权后调用。
|
|
143
|
-
CI 或非交互环境不写用户会话文件,必须成对提供短期凭据:
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
OPENXIANGDA_BASE_URL=https://platform.example.com/service \
|
|
147
|
-
OPENXIANGDA_TOKEN="$TOKEN" openxiangda check
|
|
148
|
-
```
|
package/docs/index.md
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
layout: home
|
|
3
|
-
hero:
|
|
4
|
-
name: OpenXiangda 2.0
|
|
5
|
-
text: 把平台应用当作真正的软件工程
|
|
6
|
-
tagline: 标准 React 前端、NestJS 后端、统一 Data API、上下文权限、Workflow Kernel v2、事件订阅与应用级交付
|
|
7
|
-
actions:
|
|
8
|
-
- theme: brand
|
|
9
|
-
text: 开始开发
|
|
10
|
-
link: /getting-started
|
|
11
|
-
- theme: alt
|
|
12
|
-
text: 阅读架构
|
|
13
|
-
link: /concepts
|
|
14
|
-
features:
|
|
15
|
-
- title: 一个应用,一个版本
|
|
16
|
-
details: 前端、后端、配置契约和生成类型共同构成不可变 AppVersion。
|
|
17
|
-
- title: 平台托管后端
|
|
18
|
-
details: 每应用独立容器,共享 Kubernetes 集群资源,由平台完成部署与身份注入。
|
|
19
|
-
- title: AI 可用但不依赖 AI 发布
|
|
20
|
-
details: CLI、MCP 和 Skills 共用确定性服务;平台持久化执行部署,不让会话承担状态机。
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
OpenXiangda 2.0 保留平台统一数据与治理能力,同时把应用开发恢复成成熟的前后端工程。本工具链只面向 2.0 应用;旧应用由独立的 1.x 产品线维护。
|
|
24
|
-
|
|
25
|
-
当前能力的完成证据、真实缺口和实施顺序见[实施路线图与证据矩阵](/architecture/implementation-roadmap)。Admin 已确认[全量切换到 Ant Design Pro v6](/architecture/ant-design-pro-v6-admin-foundation),不再维护自研 Shell/Vite 双轨。实现前先阅读[环境配置内核](/architecture/environment-configuration-kernel-v2)、[Alpha 退役与 Native 切换前置审计](/architecture/native-kernel-inventory-v2)、[原生配置投影蓝图](/architecture/native-configuration-projection-v2)与[授权一致性内核](/architecture/authorization-consistency-v2),Admin 页面协议建立在这些可验证的运行时事实之上。
|
|
26
|
-
|
|
27
|
-
开发表单、列表或详情前阅读[平台字段组件使用指南](/field-components),按场景选择桌面、移动和只读组件。
|
package/docs/llms.txt
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# OpenXiangda 2.0 documentation
|
|
2
|
-
|
|
3
|
-
- /getting-started.md: standard workspace and development loop
|
|
4
|
-
- /concepts.md: application, platform, data, runtime, and version boundaries
|
|
5
|
-
- /frontend.md: React admin shell, role session, CRUD, workflow UI
|
|
6
|
-
- /field-components.md: platform field catalog, usage, selection rules, file and rich-text examples
|
|
7
|
-
- /backend.md: NestJS modules, identity, Data API, health, secrets
|
|
8
|
-
- /data-authz.md: RBAC plus contextual data and field authorization
|
|
9
|
-
- /workflow-events.md: Workflow Kernel v2, providers, actions, durable events
|
|
10
|
-
- /delivery.md: immutable AppPackage and platform-owned DeploymentRun
|
|
11
|
-
- /architecture/implementation-roadmap.md: evidence-backed capability status, dependencies, and delivery order
|
|
12
|
-
- /architecture/environment-configuration-kernel-v2.md: native environment registry, immutable projections, Head activation, gateway delegation, and runtime gates
|
|
13
|
-
- /architecture/native-kernel-inventory-v2.md: read-only database, data-volume, and Kubernetes evidence; redaction, ambiguity classification, deterministic digests, and migration-plan validation
|
|
14
|
-
- /architecture/authorization-consistency-v2.md: environment-native RBAC, role subjects, contextual scope, concurrency, cache, and cutover invariants
|
|
15
|
-
- /architecture/admin-shell-v2.md: complete Admin framework contracts and staged implementation gates
|
|
16
|
-
- /architecture/repository-and-release.md: standalone 2.0 repository and release boundaries
|
|
17
|
-
- /architecture/tenant-public-origin-v2.md: canonical tenant origin registry, migration, cookie boundary, and gateway contract
|
|
18
|
-
- /architecture/tenant-public-origin-implementation-blueprint.md: file-level B0-O schema, API, CLI, deployment, and verification contract
|
|
19
|
-
- /reference/cli.md: generated CLI commands
|
|
20
|
-
- /reference/mcp.md: generated MCP resources and tools
|
package/docs/reference/cli.md
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# CLI Reference
|
|
2
|
-
|
|
3
|
-
> Generated from `DEVKIT_COMMANDS`. Do not edit manually.
|
|
4
|
-
|
|
5
|
-
| Command | Risk | Purpose |
|
|
6
|
-
| --- | --- | --- |
|
|
7
|
-
| `auth login` | write-local | 通过平台浏览器授权登录 2.0 |
|
|
8
|
-
| `auth status` | read | 查看当前登录会话 |
|
|
9
|
-
| `auth logout` | write-local | 删除当前登录会话 |
|
|
10
|
-
| `app create` | write-local | 从官方模板创建 2.0 应用 |
|
|
11
|
-
| `app link` | write-local | 绑定平台地址和应用环境 |
|
|
12
|
-
| `app provision` | deploy | 在平台幂等创建 2.0 应用身份和默认预发环境 |
|
|
13
|
-
| `app info` | read | 读取应用工作区上下文 |
|
|
14
|
-
| `authz membership list` | read | 查询 Native 应用角色成员 |
|
|
15
|
-
| `authz membership grant` | deploy | 授予 Native 应用业务角色 |
|
|
16
|
-
| `authz membership update` | deploy | 更新 Native 角色成员范围 |
|
|
17
|
-
| `authz membership revoke` | deploy | 撤销 Native 应用角色成员 |
|
|
18
|
-
| `authz relationship list` | read | 查询 Native 资源关系授权 |
|
|
19
|
-
| `authz relationship grant` | deploy | 创建 Native 资源关系授权 |
|
|
20
|
-
| `authz relationship update` | deploy | 更新 Native 资源关系授权 |
|
|
21
|
-
| `authz relationship revoke` | deploy | 撤销 Native 资源关系授权 |
|
|
22
|
-
| `authz super-admin list` | read | 查询 Native 应用超级管理员 |
|
|
23
|
-
| `authz super-admin grant` | deploy | 授予 Native 应用超级管理员 |
|
|
24
|
-
| `authz super-admin revoke` | deploy | 撤销 Native 应用超级管理员 |
|
|
25
|
-
| `oauth client list` | read | 查询应用 OAuth2 客户端 |
|
|
26
|
-
| `oauth client create` | deploy | 创建环境绑定的 OAuth2 客户端 |
|
|
27
|
-
| `oauth client update` | deploy | 更新 OAuth2 客户端 |
|
|
28
|
-
| `oauth client rotate` | deploy | 双密钥轮换 OAuth2 客户端 |
|
|
29
|
-
| `oauth client revoke` | deploy | 吊销 OAuth2 客户端 |
|
|
30
|
-
| `oauth runtime status` | read | 查询平台托管运行凭据状态 |
|
|
31
|
-
| `oauth runtime rotate` | deploy | 暂存运行凭据并创建同版本滚动部署 |
|
|
32
|
-
| `oauth audit list` | read | 查询 OAuth2 审计事件 |
|
|
33
|
-
| `secret list` | read | 查询环境隔离的应用 Secret 元数据 |
|
|
34
|
-
| `secret create` | deploy | 从本机安全来源创建应用 Secret |
|
|
35
|
-
| `secret update` | deploy | 更新应用 Secret 元数据和状态 |
|
|
36
|
-
| `secret rotate` | deploy | 追加不可变版本并轮换应用 Secret |
|
|
37
|
-
| `secret delete` | deploy | 删除未被当前配置引用的应用 Secret |
|
|
38
|
-
| `secret audit list` | read | 查询应用 Secret 审计事件 |
|
|
39
|
-
| `event subscription list` | read | 查询应用事件订阅 |
|
|
40
|
-
| `event subscription status` | deploy | 暂停或恢复事件订阅 |
|
|
41
|
-
| `event subscription rotate-secret` | deploy | 暂存下一版本事件签名密钥并随下次部署激活 |
|
|
42
|
-
| `event delivery list` | read | 查询事件投递与死信 |
|
|
43
|
-
| `event delivery replay` | deploy | 幂等回放历史事件投递 |
|
|
44
|
-
| `event timer list` | read | 查询定时事件 |
|
|
45
|
-
| `event timer status` | deploy | 暂停或恢复定时事件 |
|
|
46
|
-
| `event timer fire` | write-local | 在完整本地开发会话中触发下一次定时事件 |
|
|
47
|
-
| `workflow provider list` | read | 查询 Workflow Assignee Provider |
|
|
48
|
-
| `workflow provider rotate` | deploy | 轮换 Workflow Provider 签名密钥 |
|
|
49
|
-
| `skill install` | write-local | 安装 OpenXiangda 2.0 AI Skills |
|
|
50
|
-
| `skill validate` | read | 验证 OpenXiangda 2.0 AI Skills |
|
|
51
|
-
| `dev` | write-local | 启动受监督的完整本地应用 |
|
|
52
|
-
| `dev status` | read | 查看当前工作区本地开发会话 |
|
|
53
|
-
| `dev stop` | write-local | 停止当前工作区本地开发会话并保留数据 |
|
|
54
|
-
| `dev reset` | write-local | 删除当前工作区本地数据库和开发状态 |
|
|
55
|
-
| `generate` | write-local | 生成 Data/App/Workflow/Event 类型契约 |
|
|
56
|
-
| `check` | read | 确定性检查完整应用 |
|
|
57
|
-
| `test` | read | 运行应用测试 |
|
|
58
|
-
| `build` | write-local | 构建并密封一个 AppPackage |
|
|
59
|
-
| `deploy` | deploy | 创建平台持久执行的 DeploymentRun |
|
|
60
|
-
| `promote` | deploy | 以同一 AppVersion 晋级目标环境 |
|
|
61
|
-
| `environment status` | read | 查询应用环境、运行状态和活动版本 |
|
|
62
|
-
| `environment start` | deploy | 从活动版本启动应用环境 |
|
|
63
|
-
| `environment stop` | deploy | 停止应用环境并保留数据与配置 |
|
|
64
|
-
| `status` | read | 查询 DeploymentRun 状态 |
|
|
65
|
-
| `logs` | read | 查询部署检查点和关联日志 |
|
|
66
|
-
| `retry` | deploy | 重试可恢复的 DeploymentRun |
|
|
67
|
-
| `cancel` | deploy | 幂等取消 DeploymentRun |
|
|
68
|
-
| `rollback` | deploy | 以历史 AppVersion 创建回滚部署 |
|
|
69
|
-
| `doctor` | read | 诊断本地工具链和平台兼容性 |
|
package/docs/reference/mcp.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# MCP Reference
|
|
2
|
-
|
|
3
|
-
> Generated from the MCP server registry. Do not edit manually.
|
|
4
|
-
|
|
5
|
-
## Resources
|
|
6
|
-
|
|
7
|
-
- `openxiangda://workspace/context`
|
|
8
|
-
- `openxiangda://workspace/contracts`
|
|
9
|
-
- `openxiangda://platform/capabilities`
|
|
10
|
-
- `openxiangda://deployments/latest`
|
|
11
|
-
- `openxiangda://environments`
|
|
12
|
-
- `openxiangda://docs/index`
|
|
13
|
-
|
|
14
|
-
## Tools
|
|
15
|
-
|
|
16
|
-
- `workspace_context`
|
|
17
|
-
- `contract_describe`
|
|
18
|
-
- `generate_contracts`
|
|
19
|
-
- `check_app`
|
|
20
|
-
- `run_tests`
|
|
21
|
-
- `fire_local_timer`
|
|
22
|
-
- `build_app`
|
|
23
|
-
- `deployment_plan`
|
|
24
|
-
- `environment_status`
|
|
25
|
-
- `start_environment`
|
|
26
|
-
- `stop_environment`
|
|
27
|
-
- `deploy_app`
|
|
28
|
-
- `deployment_status`
|
|
29
|
-
- `deployment_logs`
|
|
30
|
-
- `retry_deployment`
|
|
31
|
-
- `rollback_app`
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# 家校通讯录关系
|
|
2
|
-
|
|
3
|
-
状态:2.0 尚未正式投产。本页定义已经实现的后端读取合同和应用接入方式;当前生产应用仍按 1.0 文档接入,不能混用两代 SDK。
|
|
4
|
-
|
|
5
|
-
## 数据合同
|
|
6
|
-
|
|
7
|
-
### 平台内置身份角色
|
|
8
|
-
|
|
9
|
-
成功的家校全量同步会维护平台层身份角色(不属于应用 `RoleSession` 的可切换角色):
|
|
10
|
-
|
|
11
|
-
| 展示名 | 稳定编码 | 来源 |
|
|
12
|
-
| --- | --- | --- |
|
|
13
|
-
| 家长 | `SCHOOL_GUARDIAN` | 家校成员 `guardian` |
|
|
14
|
-
| 学生 | `SCHOOL_STUDENT` | 家校成员 `student` |
|
|
15
|
-
| 老师 | `SCHOOL_TEACHER` | 家校成员 `teacher` |
|
|
16
|
-
|
|
17
|
-
身份可组合,同一用户可以同时拥有多个编码。2.0 的 `NativePrincipal` / `Principal` 和 `RoleSessionContext` 以可选的 `platformRoleCodes` 暴露这些编码;它们只用于业务身份判断,不能替代当前应用角色、不能参与 `roleCodes` 的切换,也不能由浏览器提交。权限默认不限制,应用若需要按身份限制页面或 App API,应在服务端使用这些可信编码显式校验。
|
|
18
|
-
|
|
19
|
-
```ts
|
|
20
|
-
const isTeacher =
|
|
21
|
-
request.openxiangda?.principal.platformRoleCodes?.includes('SCHOOL_TEACHER')
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
应用开发者不直接写 `roles` 绑定,也不在本地复制同步结果;下一次完整同步会自动增删平台身份绑定。
|
|
25
|
-
|
|
26
|
-
平台同步钉钉家校通讯录后,以只读关系返回监护人、学生和班级。关系两端都包含:
|
|
27
|
-
|
|
28
|
-
- `userId`:平台用户 ID,业务数据应保存这个稳定标识;
|
|
29
|
-
- `dingtalkUserId`:钉钉 `userid`,用于钉钉侧联动和排查;
|
|
30
|
-
- `name`:平台用户姓名;
|
|
31
|
-
- `mobile`:平台已有手机号,可能为 `null`。
|
|
32
|
-
|
|
33
|
-
关系还包含 `relationCode`、`relationName`、班级信息、同步时间和同步状态。未能安全绑定到平台用户、或角色方向不一致的数据不会出现在应用查询结果中。
|
|
34
|
-
|
|
35
|
-
## 权限与默认范围
|
|
36
|
-
|
|
37
|
-
通过既有认证和 `RoleSession` 校验的非游客用户,在没有声明任何 `school-contact:*` 范围能力时,平台默认使用 `all`,可以查看当前租户全部已同步关系。应用自己的 App API 仍按正常方式声明业务操作能力,例如:
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
authz: {
|
|
41
|
-
capabilities: [
|
|
42
|
-
{
|
|
43
|
-
code: 'app:school-service:family:read',
|
|
44
|
-
kind: 'backend',
|
|
45
|
-
name: '使用家庭关系功能',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
code: 'app:school-service:school-contact:self:read',
|
|
49
|
-
kind: 'backend',
|
|
50
|
-
name: '读取本人家校关系',
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
code: 'app:school-service:school-contact:class:read',
|
|
54
|
-
kind: 'backend',
|
|
55
|
-
name: '读取任教班级家校关系',
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
roles: [
|
|
59
|
-
{
|
|
60
|
-
code: 'user',
|
|
61
|
-
name: '普通用户',
|
|
62
|
-
capabilities: ['app:school-service:family:read'],
|
|
63
|
-
},
|
|
64
|
-
],
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
应用自己的查询接口进入不可变 App API 合同并使用业务操作能力:
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
backend: {
|
|
72
|
-
operations: [
|
|
73
|
-
{
|
|
74
|
-
code: 'family.mine',
|
|
75
|
-
method: 'GET',
|
|
76
|
-
path: '/api/family/mine',
|
|
77
|
-
capability: 'app:school-service:family:read',
|
|
78
|
-
requestSchema: { type: 'object', additionalProperties: false },
|
|
79
|
-
responseSchema: { type: 'object' },
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
未给活动角色授予任何 `school-contact:*` 范围能力时,数据范围就是 `all`,不限制,可以查看全部已同步关系。只有业务明确需要最小化可见范围时,才给角色增加 `self:read` 或 `class:read`;可选的 `school-contact:read` 表示显式保持 `all`。同一角色同时获得多个范围能力时按 `all > class > self` 取最宽范围,避免前后端对范围产生不同解释。无有效 Principal/RoleSession、游客和跨租户请求仍然拒绝。
|
|
86
|
-
|
|
87
|
-
## NestJS App API
|
|
88
|
-
|
|
89
|
-
浏览器不能直接调用平台关系接口。应用后端使用 `OpenXiangdaPlatformClient`,透传 SDK 已验证的 authorization 和当前 RoleSession,再通过应用自己的 App API 返回业务需要的字段:
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
import {
|
|
93
|
-
OpenXiangdaHttpRequest,
|
|
94
|
-
OpenXiangdaOperation,
|
|
95
|
-
OpenXiangdaPlatformClient,
|
|
96
|
-
} from 'openxiangda-nest';
|
|
97
|
-
import { Controller, Get, Req } from '@nestjs/common';
|
|
98
|
-
import { appOperations } from '@app/contracts';
|
|
99
|
-
|
|
100
|
-
@Controller('/api/family')
|
|
101
|
-
export class FamilyController {
|
|
102
|
-
constructor(private readonly platform: OpenXiangdaPlatformClient) {}
|
|
103
|
-
|
|
104
|
-
@Get('/mine')
|
|
105
|
-
@OpenXiangdaOperation(appOperations.familyMine)
|
|
106
|
-
async mine(@Req() request: OpenXiangdaHttpRequest) {
|
|
107
|
-
const context = request.openxiangda!;
|
|
108
|
-
return await this.platform.mySchoolContactFamily(
|
|
109
|
-
context.authorization,
|
|
110
|
-
context.roleSessionId!,
|
|
111
|
-
{ page: 1, pageSize: 50 }
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
可用方法:
|
|
118
|
-
|
|
119
|
-
- `querySchoolContactRelations(authorization, roleSessionId, query)`:按平台用户 ID、手机号、钉钉 userid、姓名、班级或关系类型分页检索;
|
|
120
|
-
- `schoolContactChildren(..., userId, query)`:查询指定监护人的学生;
|
|
121
|
-
- `schoolContactGuardians(..., userId, query)`:查询指定学生的监护人;
|
|
122
|
-
- `mySchoolContactFamily(...)`:同时查询当前用户作为监护人和学生的两个方向。
|
|
123
|
-
|
|
124
|
-
应用前端用 `useOpenXiangdaAdmin().appApi()` 调用上面的 App API。不要把登录 token、RoleSession ID、平台 URL 或完整关系快照放入浏览器缓存;手机号只展示给确有业务需要的页面,日志不得记录手机号和完整返回体。
|
|
125
|
-
|
|
126
|
-
## 失效与降级
|
|
127
|
-
|
|
128
|
-
- `sync.state = disabled`:租户未开启后续同步,历史关系仍可能存在;
|
|
129
|
-
- `sync.state = not_synced`:已开启但尚无成功快照;
|
|
130
|
-
- `sync.state = current`:至少有一次成功快照,`lastSuccessfulSyncAt` 给出时间。
|
|
131
|
-
|
|
132
|
-
应用应显示同步状态,不要把“查不到关系”等同于“该用户没有家校关系”。平台只有在完整快照成功后才替换关系;钉钉分页失败时保留上次成功数据。
|
|
133
|
-
|
|
134
|
-
## 验证
|
|
135
|
-
|
|
136
|
-
至少覆盖:默认 `all`、`self`、任教班级 `class`、无权限 403、RoleSession 切换、手机号为空、同步关闭和空关系。完成后运行 `openxiangda generate --check`、`openxiangda check` 和 `openxiangda test`。
|