ThinkAdmin/docs/architecture/soft-delete-standard.md
Anyon 6f4056f64d docs(architecture): 完善 v8 架构与迁移说明
补充 v8 重构后的架构文档、组件说明和迁移记录,方便后续维护者理解插件边界。

主要内容:

- 更新根 README,说明 v8 插件分层、系统模块、交付命令和验证流程。

- 新增组件明细、插件边界、路由分发、软删除和稳定性文档。

- 记录 Storage 合并到 System、旧 View 移除和 Helper 并入 System 的决策。

- 补充文档注释报告和后续重构计划,便于持续演进。
2026-05-08 15:31:22 +08:00

55 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Soft Delete Standard
## 当前结论
- ORM 软删除字段统一为 `delete_time`
- `delete_time` 是唯一允许继续新增到数据库脚本里的软删除物理字段
- `deleted``deleted_time``deleted_at` 不再作为物理字段或兼容迁移保留
- 不需要软删除的模型,不应再通过 `deleteTime = false` 反向关闭,而应直接使用不带 `SoftDelete` 的普通基类
## 当前实现
### 1. 模型默认时间字段
- 基类 `think\admin\Model` 默认使用 `create_time``update_time`
- 软删除模型统一使用 `SoftDelete` trait并把目标字段固定为 `delete_time`
### 2. 删除执行路径
- 使用 `DeleteHelper` 删除模型时:
- 模型启用了 `SoftDelete`,则写入 `delete_time`
- 模型未启用 `SoftDelete`,则执行物理删除
### 3. 基类约束
- 软删除模型应继承带 `SoftDelete` 的业务基类
- 非软删除模型应继承普通业务基类
- 不再推荐在同一个基类体系里通过 `deleteTime = false` 做例外开关
## 禁止事项
以下写法不再允许继续引入:
- `deleted`
- `deleted_time`
- `deleted_at`
- `whereRaw('deleted=0')`
- `field(...deleted...)`
- `withoutField('deleted')`
这些写法都会把代码重新绑回旧字段语义。
## 新代码规范
1. 新表需要软删除时,只能使用 `delete_time datetime null`
2. 新模型需要软删除时,使用统一软删除基类或显式 `SoftDelete`
3. 新模型不需要软删除时,直接使用普通基类,不再写 `deleteTime = false`
4. 业务状态和软删除必须分开设计,不能混用“作废/取消/失效”字段代替软删除
5. 数据库脚本、模型注释、测试断言都必须统一使用 `delete_time`
## 清理结果
- 历史兼容软删除迁移已经退化为空迁移占位,不再执行任何字段兼容逻辑
- 软删除与物理删除模型已经按基类分流
- 后续如果再出现旧字段名或 `deleteTime = false`,应视为回归