feat: 引入 CloudSync 核心能力并新增 Avalonia 桌面端与发布脚本
- 后端:新增 CloudSync 认证/权限/端点/服务与 DTO - 数据:新增用户/会话/安全策略实体与 EF Core migrations - 前端:新增云同步设置 UI、客户端与本地存储;Vite 支持 maui 构建输出到 wwwroot - 桌面端:新增 Avalonia 项目、内置 WebServer、托盘与 Windows 全局热键 - 发布/构建:新增 Windows/Linux 发布脚本与统一入口;调整 MAUI 资源与安装包配置 - 文档:同步更新 README/docs 与协作规则
This commit is contained in:
@@ -21,13 +21,102 @@
|
||||
|
||||
## 接口契约(需要在实现前先写清楚)
|
||||
|
||||
建议输出一份“云同步 API 契约”并固化到 docs(便于客户端对接)。至少包含:
|
||||
- 登录:`POST /auth/login`(或等效)
|
||||
- 获取用户任务:`GET /tasks`(或等效,支持增量/版本号是加分项,但 v1.2.0 可先全量)
|
||||
- 上传/同步:`POST /sync`(或按任务粒度的增删改接口)
|
||||
- 获取安全配置:`GET /security/policy`
|
||||
- 返回字段至少包含:`allowPersist`(是否允许落盘)
|
||||
- 可扩展:`deviceTrust`、`sessionTtl`、`requireSecondFactorFor` 等
|
||||
v1.2.0 已实现一套最小可用契约(用于 05/06 客户端对接时冻结字段名/错误码)。
|
||||
|
||||
### 通用约定
|
||||
|
||||
- Base URL:由客户端配置(例如 `https://{host}:{port}`)
|
||||
- 认证:`Authorization: Bearer {accessToken}`
|
||||
- 错误响应(统一结构):
|
||||
|
||||
```json
|
||||
{ "code": "ERROR_CODE", "message": "Human readable message." }
|
||||
```
|
||||
|
||||
### 错误码
|
||||
|
||||
- `UNAUTHORIZED`:未登录或会话失效
|
||||
- `FORBIDDEN`:权限不足(RBAC / 策略拒绝)
|
||||
- `SECOND_FACTOR_REQUIRED`:需要二次认证(step-up)
|
||||
- `BAD_REQUEST`:请求参数不合法
|
||||
- `NOT_FOUND`:资源不存在
|
||||
|
||||
### Auth
|
||||
|
||||
- 初始化管理员(仅当系统尚无云用户时允许一次):
|
||||
- `POST /auth/bootstrap`
|
||||
- Body:`{ "userName": "admin", "password": "..." }`
|
||||
- 200:成功;403:已初始化或不允许
|
||||
|
||||
- 登录:
|
||||
- `POST /auth/login`
|
||||
- Body:`{ "userName": "admin", "password": "..." }`
|
||||
- 200:`{ accessToken, expiresAtUtc, userId, role, permissions[] }`
|
||||
|
||||
- 二次认证(step-up,v1.2.0 最小实现为“复用登录口令进行再认证”):
|
||||
- `POST /auth/step-up`
|
||||
- Header:`Authorization: Bearer ...`
|
||||
- Body:`{ "password": "..." }`
|
||||
- 200:`{ stepUpExpiresAtUtc }`
|
||||
|
||||
### Tasks
|
||||
|
||||
- 获取当前用户任务全量:
|
||||
- `GET /tasks`
|
||||
- Header:`Authorization: Bearer ...`
|
||||
- 权限:`tasks:read`
|
||||
- 200:`CloudTaskItem[]`
|
||||
|
||||
### Sync
|
||||
|
||||
- 上传/同步(增删改后返回最新全量):
|
||||
- `POST /sync`
|
||||
- Header:`Authorization: Bearer ...`
|
||||
- 权限:`sync:write`
|
||||
- 二次认证:必需(否则返回 `SECOND_FACTOR_REQUIRED`)
|
||||
- Body:
|
||||
|
||||
```json
|
||||
{
|
||||
"upserts": [
|
||||
{ "id": 1, "title": "A", "priority": 1, "isCompleted": false, "parentTaskId": null },
|
||||
{ "id": null, "title": "New", "priority": 1, "isCompleted": false, "parentTaskId": null }
|
||||
],
|
||||
"deletes": [2, 3]
|
||||
}
|
||||
```
|
||||
|
||||
- 200:
|
||||
|
||||
```json
|
||||
{
|
||||
"serverTimeUtc": "2026-04-06T17:39:30.0281279Z",
|
||||
"tasks": [ /* CloudTaskItem[] */ ]
|
||||
}
|
||||
```
|
||||
|
||||
### Security Policy
|
||||
|
||||
- 获取安全策略(服务端下发):
|
||||
- `GET /security/policy`
|
||||
- Header:`Authorization: Bearer ...`
|
||||
- 权限:`policy:read`
|
||||
- 200:
|
||||
|
||||
```json
|
||||
{
|
||||
"allowPersist": true,
|
||||
"allowSync": true,
|
||||
"requireSecondFactorFor": ["sync:write", "policy:write"]
|
||||
}
|
||||
```
|
||||
|
||||
- 更新安全策略(高风险操作):
|
||||
- `PUT /security/policy`
|
||||
- Header:`Authorization: Bearer ...`
|
||||
- 权限:`policy:write`
|
||||
- 二次认证:必需(否则返回 `SECOND_FACTOR_REQUIRED`)
|
||||
- Body:`{ "allowPersist": false, "allowSync": false }`
|
||||
|
||||
## 关键实现点(建议)
|
||||
|
||||
@@ -49,3 +138,8 @@
|
||||
- 未授权角色/权限访问受限接口会被拒绝(错误响应可被客户端识别)
|
||||
- 能返回安全策略配置(至少包含 `allowPersist`),并可通过配置切换行为
|
||||
|
||||
## 当前实现说明(v1.2.0)
|
||||
|
||||
- 数据隔离:`Tasks` 表新增 `UserId` 外键,云端 API 的所有读写按当前会话用户隔离;本地模式使用固定的 `local` 用户 ID(不影响既有 Dynamic API)。
|
||||
- RBAC:内置 `admin / user / readonly / nosync` 角色与权限映射;并叠加 `SecurityPolicies.AllowSync` 作为“是否允许同步写入”的策略开关。
|
||||
- 二次认证:通过 `POST /auth/step-up` 将会话提升到 step-up 状态;`POST /sync` 与 `PUT /security/policy` 会强制要求 step-up。
|
||||
|
||||
Reference in New Issue
Block a user