Permission seed 文档

This commit is contained in:
Shen Wei
2026-04-30 12:47:35 +08:00
parent 91fc0b06d6
commit 1da12a27f0
6 changed files with 882 additions and 141 deletions

View File

@@ -1,218 +1,225 @@
# 项目进度交接报告 — Phase 4.0 收尾
# 项目进度交接报告 — Phase 4.0 + 4.1 收尾
> **作者**: Backend Engineer
> **日期**: 2026-04-29
> **状态**: 暂停,等待 PM 完成 DATA_MODEL 注释补全
> **续接者**: 明天继续工作的自己 / 其他工程师
> **创建日期**: 2026-04-29Phase 4.0
> **更新日期**: 2026-04-30Phase 4.1 完成)
> **状态**: ✅ Phase 4.1 完成,等待业务开发启动
> **续接者**: 进入正式开发的工程师 / 后续维护者
> **前序文档**: [`项目骨架搭建实施报告_v1.md`](./项目骨架搭建实施报告_v1.md)
---
## 一、今日完成事项
## 0. TL;DR最关键的 30 秒)
### 1.1 Phase 4.0:所有模型添加中文 Meta 名
- **Phase 4.0 + 4.1 全部完成**74 模型 Meta 中文名 + 781 字段 `verbose_name` + 关键字段 `help_text` 全部补齐
- **9 app 全部独立 commit每 commit `manage.py check` 0 issues**
- **`makemigrations` 未跑**(按用户指示保留生成权),但已 `--dry-run` 确认仅有 `Alter field` 元数据迁移待生成
- **本地领先 origin/main 14 个 commit未 push**
- **遗留**Dockerfile + docker-compose.yml 有未跟踪的代理配置改动(`--proxy http://host.docker.internal:10808`)— 由用户手动处理,不要 `git add`
---
## 一、已完成事项
### 1.1 Phase 4.0:所有模型添加中文 Meta 名2026-04-29
**git commit**: `79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0)`
**变更范围**
- 20 个 models 文件
- 8 个 0002/0003 迁移文件Meta options 变更)
- 1 个 tenant 0001_initial 迁移(之前漏生成)
- 共计 29 文件 / +594 行
**变更范围**20 models 文件 + 8 迁移文件 + 1 tenant initial 迁移29 文件 / +594 行
**具体内容**:为全部 74 个 Django 模型添加:
**具体内容**:为全部 74 个模型添加:
```python
class Meta:
verbose_name = "中文表名"
verbose_name_plural = "中文表名"
# ... 已有 db_table / indexes / constraints 保留
# 已有 db_table / indexes / constraints 保留
```
**消费方**
- Django Admin 列表页/表单页中文显示
- drf-spectacular 生成 OpenAPI 时映射为 `tag` / 模型名
- Django shell 报错信息使用中文
**验证**`manage.py check` 0 issues。
### 1.2 PM 规范文档交付
**文件**: `/mnt/d/Workspace/nexus/Project/fonrey/规范/DATA_MODEL_注释补全规范_v1.md`443 行12 章)
**核心内容**
- §四 技术元数据字段标准注释库id / created_at / deleted_at / version 等的统一中文注释)
- §五 业务字段三段式格式(中文名 + 示例 + 业务规则)
- §六 枚举字段中英对照规范
- §七 外键字段说明规范
- §九 PM 待办清单8 个 DATA_MODEL_*.md 文件、当前覆盖率、补全优先级)
- §十一 完整规范表的范例properties 表)
**PM 工作量估算**1-2 天
**关键决策(澄清)**
- 之前误判 REGION/TENANT/RELEASE/ACCOUNT 缺独立文件 — **实际上没缺**
- REGIONdistricts 表)已在 `DATA_MODEL_COMPLEX.md §3.1`
- ACCOUNT 已在 `DATA_MODEL_LOGIN.md §3.1`
- TENANT/RELEASE 已在 `DATA_MODEL_PUBLIC.md`(合并版)
- DATA_MODEL 现状业务字段覆盖率 ~70%,缺口集中在**技术元数据字段**
### 1.3 工作流决策(重要,避免明天踩坑)
- **方案 A 被否决**:模型类中文 docstring 因 hook 反复触发被放弃
- **方案 B 采纳**:只用 `Meta.verbose_name` + `verbose_name_plural`(字符串赋值,不触发 hook
- 模型类的"业务作用 / 关键业务规则"**改放在 DATA_MODEL_*.md 里**作为单一信息源,代码不重复
- Phase 4.1 的字段级 `verbose_name=``help_text=` 也是字符串赋值,预计同样不触发 hook
**消费方**Django Admin 列表/表单中文显示、drf-spectacular OpenAPI tag、shell 报错中文。
---
## 二、当前注释覆盖率(基线 vs 现在
### 1.2 Phase 4.1:所有字段补齐中文 verbose_name + help_text2026-04-30
| 维度 | 基线(任务前) | 今日完成后 | Phase 4.1 目标 |
**核心规则**
- 仅使用字段 kwarg`verbose_name="..."` / `help_text="..."`)— 字符串赋值hook 不拦截
- **不**新增模型 docstring / 行注释 — 业务说明留在 `DATA_MODEL_*.md` 里作为单一信息源
- 关键字段加 `help_text`业务规则、ENUM 中英对照、写入约束);纯技术字段(`created_at` 等)只加 `verbose_name`
- **每 app 一个独立 commit**commit 后 `manage.py check` 必须 0 issues
- 不动 MetaPhase 4.0 已完成)、不改字段类型/null/default、不增删字段
**9 个 commit 序列(领先 origin/main未 push**
| # | App | Commit | 文件数 | 备注 |
|---|---|---|---|---|
| 1/9 | property | `3638fc0` | 4 (core/follow_keys/listings/media) | 23 模型,含 PROPERTY 主表 + 分区 follow_logs/photos |
| 2/9 | client | `e67b07a` | 5 (core/contacts/folders/follow/viewing_match) | 11 模型,含分区 client_follow_logs |
| 3/9 | complex | `a3800bf` | 1 (complex.py) | 10 模型,含全文检索 search_vector |
| 4/9 | org | `f185127` | 3 (org_unit/staff/staff_logs) | 11 模型 |
| 5/9 | account | `b57070f` | 1 (account.py) | 4 模型UserAccount/LoginAttempt/PasswordResetToken/PasswordHistory|
| 6/9 | permission | `9ef6eb6` | 3 (permission_def/role/staff_perm) | 8 模型,含 PermissionChangeLogappend-only|
| 7/9 | setting | `289ec43` | 2 (lookup/setting) | 4 模型LookupGroup/Item, TenantSetting, FieldRequirementRule|
| 8/9 | region | `e3b26ce` | 1 (region.py) | 5 模型District/BusinessArea/MetroLine/Station/School|
| 9/9 | tenant | `8faa68b` | 1 (models.py) | 2 模型Tenant/Domaindjango-tenants Mixin |
**注**`apps/release/models/` 目录无内容文件,跳过;其内容在 `DATA_MODEL_PUBLIC.md §2.6 client_releases` 但当前未实例化为 Django 模型。
---
### 1.3 工作流决策(明确,避免后续踩坑)
- **方案 A 否决**:模型类中文 docstring 因 hook 反复阻拦
- **方案 B 采纳**:仅用 `Meta.verbose_name` + 字段级 `verbose_name=` / `help_text=`,纯字符串 kwarghook 放行
- 模型类的"业务作用 / 关键业务规则"放在 `DATA_MODEL_*.md` 作为单一信息源,代码不重复
- ENUM 字段 `help_text` 走中英对照(如 `"public=公立 / private=私立 / international=国际学校"`
- 已存在的 docstring 保留property/follow_keys.py FollowLog、property/media.py PropertyPhoto、client/follow.py ClientFollowLog、client/viewing_match.py ClientStatusLog 的 "Partitioned table…unmanaged" / "Audit log; record-level immutable" 等技术说明)
---
## 二、当前注释覆盖率(最终态)
| 维度 | 基线 | Phase 4.0 后 | Phase 4.1 后(当前) |
|---|---|---|---|
| `Meta.verbose_name`(模型中文名) | 0 / 74 | **74 / 74** ✅ | |
| `verbose_name_plural` | 0 / 74 | **74 / 74** ✅ | |
| 字段 `verbose_name=`(字段中文名) | 0 / 781 | 0 / 781 | 781 / 781 |
| 字段 `help_text=`(字段详细说明) | 14 / 781 | 14 / 781 | ~230 / 781关键字段 |
| 模型 docstring | 0 / 74 | 0 / 74 | **不做**(改放 DATA_MODEL |
| `Meta.verbose_name` | 0/74 | **74/74** ✅ | **74/74** |
| `Meta.verbose_name_plural` | 0/74 | **74/74** ✅ | **74/74** |
| 字段 `verbose_name=` | 0/781 | 0/781 | **781/781** |
| 字段 `help_text=` | 14/781 | 14/781 | **关键字段全覆盖**FK + ENUM + 业务规则字段)|
| 模型 docstring | 0/74 | 0/74 | 0/74按决策不做业务语义在 DATA_MODEL_*.md|
---
## 三、Git 状态快照
### 3.1 本地 commits领先 origin/main 5 个,未推送
### 3.1 本地 commits领先 origin/main **14 个**,未 push
```
79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0) ← 今日
8faa68b feat(tenant): add Chinese verbose_name/help_text to tenant models (Phase 4.1 part 9/9)
e3b26ce feat(region): add Chinese verbose_name/help_text to region models (Phase 4.1 part 8/9)
289ec43 feat(setting): add Chinese verbose_name/help_text to setting models (Phase 4.1 part 7/9)
9ef6eb6 feat(permission): add Chinese verbose_name/help_text to permission models (Phase 4.1 part 6/9)
b57070f feat(account): add Chinese verbose_name and help_text to all account fields (Phase 4.1 part 5/9)
f185127 feat(org): add Chinese verbose_name and help_text to all org fields (Phase 4.1 part 4/9)
a3800bf feat(complex): add Chinese verbose_name and help_text to all complex fields (Phase 4.1 part 3/9)
e67b07a feat(client): add Chinese verbose_name and help_text to all client fields (Phase 4.1 part 2/9)
3638fc0 feat(property): add Chinese verbose_name and help_text to all property fields (Phase 4.1)
79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0)
94d1602 feat: complete Phase 3 scaffolding (templates, static, Docker, per-app skeletons)
ed40de4 feat(client,setting): complete Phase 2 with partitioned client_follow_logs
5b55dda feat(property): add 23-table property module with partitioned follow_logs and property_photos
c57462f feat(complex): add apps.complex with 10 models and full-text search
9a7d06b feat: scaffold Django multi-tenant project with 5 of 9 apps
```
### 3.2 工作树状态
- **完全干净**`nothing to commit, working tree clean`
- 当前分支:`main`
- 未推送至远程
- 已跟踪文件clean
- **未跟踪改动(用户代理配置,不要 `git add`**
- `Dockerfile` — 添加 `--proxy http://host.docker.internal:10808 --timeout 120`
- `docker-compose.yml` — 同上代理类配置
- 这两个改动属于本机网络环境配置,由用户自行管理
---
## 四、明天的恢复点(按 PM 进度分支)
## 四、后续工作恢复点
### 4.1 PM 已完成 DATA_MODEL 补全 → 启动 Phase 4.1
### 4.1 立即可做(不阻塞)
**任务**:把 781 个字段的中文注释从 DATA_MODEL_*.md 同步到 Django 模型代码。
**做法**
1. 按 app 逐个处理property → client → complex → org → account → permission → setting → region → tenant
2. 每个 app 一个独立 commit`feat(<app>): sync field verbose_name + help_text from DATA_MODEL`
3. 字段格式:
```python
name = models.CharField(
max_length=100,
verbose_name="房源名称", # ← 来自 DATA_MODEL"业务说明"第一段
help_text="如'翠湖天地 3 号楼 1502 室',展示给客户", # ← 二/三段(关键字段才加)
)
```
4. 每个 commit 后 `manage.py check` 验证
5. 全部完成后 `makemigrations` 生成 Meta verbose 迁移
**估算工时**5-6 小时(机械工作,按 PM 文档抄写)
**起手命令**(明天直接复制):
```bash
cd /mnt/c/project/fonrey
.venv/bin/python manage.py check
git status
git log --oneline -3
# 确认状态干净后,从 property app 开始
ls /mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md
```
### 4.2 PM 还没完成 → 做 deferred 项目
可选清单(按 ROI 排序):
| 项目 | 描述 | 估时 | 是否阻塞他人 |
| 项目 | 描述 | 估时 | 优先级 |
|---|---|---|---|
| **PermissionDef 种子数据** | ~300 条权限定义 fixturePRD §8.2 导航对齐 | 2-3h | 阻塞权限测试 |
| **内置角色 + DataScope 种子** | Tenant Admin / 普通员工默认角色 | 1-2h | 阻塞登录测试 |
| **Setting LookupItem 默认值** | 字段必填规则 + 枚举默认 | 1h | 不阻塞 |
| **Celery partition_maintenance_task** | 月度分区自动创建任务 | 2h | 不阻塞(手动建分区可用) |
| **spectacular OpenAPI 实际生成** | `manage.py spectacular --file openapi.json` | 0.5h | 阻塞 schemathesis |
| **schemathesis 实跑** | 先要有真实端点 | 0.5h(前提:有端点) | API 契约验证 |
| **Heroicons SVG 库** | 模板里用到的图标 | 1h | 不阻塞(前端可用占位) |
| **static/vendor 第三方 JS** | HTMX / Alpine / Tailwind 决定 CDN vs 本地 | 0.5h | 影响生产部署 |
| **生成 Phase 4 verbose_name 迁移** | `manage.py makemigrations`,会为所有 app 生成 `Alter field` 迁移(仅 Meta不动 schema | 0.5h | 高 — 进 git 才能部署到 Admin |
| **Push 14 个本地 commit** | `git push origin main`(需用户授权) | 0.1h | 中 |
| **PermissionDef 种子数据** | ~300 条权限定义 fixturePRD §8.2 导航对齐 | 2-3h | 高 — 阻塞权限/登录测试 |
| **内置角色 + DataScope 种子** | Tenant Admin / 普通员工默认角色 | 1-2h | 高 — 阻塞登录测试 |
| **Setting LookupItem 默认值** | DATA_MODEL_SETTING.md §2.3 已列出种子数据 | 1h | 中 |
| **Celery partition_maintenance_task** | 月度分区自动创建 | 2h | 中(手动建分区可暂用) |
| **drf-spectacular OpenAPI 生成** | `manage.py spectacular --file openapi.json` | 0.5h | 中 — 阻塞 schemathesis |
| **release app 模型化(可选)** | DATA_MODEL_PUBLIC.md §2.6 client_releases当前 `apps/release/models/` 为空目录 | 1h | 低 — MVP 不需要 |
**推荐**:先做 **PermissionDef 种子数据**——是阻塞权限/登录测试的根,且不依赖 PM 的 DATA_MODEL 补全
**推荐顺序**makemigrations → PermissionDef 种子 → 内置角色种子 → push一次性同步给团队
### 4.3 远程同步(非紧急
### 4.2 进入业务开发阶段Phase 5+
5 个 commit 仍在本地。如果今晚要同步到团队
```bash
git push origin main
```
(之前用户没明确要求 push按需执行
骨架已就绪。业务开发可以按以下路径推进
1. **认证 + 登录流**apps/account + apps/permission— DATA_MODEL_LOGIN.md / DATA_MODEL_PERMISSION.md 已为权威源
2. **房源 CRUD**apps/property— DATA_MODEL_PROPERTY.md 完整覆盖 23 模型
3. **客源 CRUD + 跟进**apps/client— DATA_MODEL_CLIENT.md 11 模型
4. **楼盘维护**apps/complex + apps/region— DATA_MODEL_COMPLEX.md 10 模型
5. **组织/员工**apps/org— DATA_MODEL_ORG.md 11 模型
6. **系统配置**apps/setting— DATA_MODEL_SETTING.md 4 模型 + Service 层(`TenantSettingsService`
**API 契约要求**:每个端点必须满足 `TECH_STACK/API_CONTRACT.md` 的 7 项检查表。
---
## 五、关键文件索引(明天查找用)
## 五、关键文件索引
### 5.1 项目本体(`/mnt/c/project/fonrey/`
| 路径 | 作用 |
|---|---|
| `apps/*/models/*.py` | 74 模型,已有 Meta verbose_namePhase 4.0),待补字段级 verbose_namePhase 4.1 |
| `apps/*/models/*.py` | 74 模型,**Meta + 字段 verbose_name/help_text 全部补齐**Phase 4.0+4.1|
| `core/enums.py` | ENUMS.md v2.2 镜像 |
| `core/models/base.py` | TimeStampedModel / SoftDeleteModel / UUIDPrimaryKeyModel / AuditedModel |
| `core/encryption.py` | AES-256-GCM PhoneEncryption |
| `config/settings/development.py` | `DJANGO_SETTINGS_MODULE` 默认值 |
| `manage.py` | Django 入口(用 `.venv/bin/python manage.py ...` |
| `.env` | 本地 SECRET_KEY + PHONE_ENCRYPTION_KEYgitignored |
| `.env` | 本地 SECRET_KEY + PHONE_ENCRYPTION_KEYgitignored|
| `Dockerfile` / `docker-compose.yml` | **untracked 改动持续存在**,含本机代理配置 |
### 5.2 文档(`/mnt/d/Workspace/nexus/Project/fonrey/`
| 路径 | 作用 |
|---|---|
| `规范/DATA_MODEL_注释补全规范_v1.md` | **PM 待办清单**(今日新增) |
| `DATA_MODEL/DATA_MODEL_*.md` | 数据模型权威源(PM 待补全) |
| `规范/DATA_MODEL_注释补全规范_v1.md` | Phase 4.1 实施依据 |
| `DATA_MODEL/DATA_MODEL_*.md` | 数据模型权威源(9 个文件,全部已读且映射到代码)|
| `DATA_MODEL/ENUMS.md` | 枚举权威源 v2.2 |
| `prompt/提示词模板/创建项目骨架提示词_v2.3.md` | 项目骨架规范 |
| `TECH_STACK/API_CONTRACT.md` | API 契约 7 项检查表 |
| `实施报告/项目骨架搭建实施报告_v1.md` | Phase 1-3 报告 |
| `实施报告/项目进度交接报告_Phase4.0_收尾.md` | **本文件** |
| `实施报告/项目进度交接报告_Phase4.0_收尾.md` | **本文件**(已升级为 Phase 4.0+4.1 收尾报告)|
---
## 六、快速验证命令(明天 onboard 自检)
## 六、快速验证命令onboard 自检)
```bash
cd /mnt/c/project/fonrey
# 环境验证
.venv/bin/python --version # Python 3.13.x
.venv/bin/python manage.py check # 0 issues
.venv/bin/python --version # Python 3.13.x
.venv/bin/python manage.py check # 0 issues
# 当前注释覆盖核对
grep -rh "verbose_name = " apps/*/models/*.py | grep -v _plural | wc -l # 应 7574 模型 + 1 多余 ManyToMany 的 model = 75 大致)
grep -rh "verbose_name_plural" apps/*/models/*.py | wc -l # 应 75
# Phase 4.0 模型级覆盖核对
grep -rh "verbose_name = " apps/*/models/*.py apps/tenant/models.py | grep -v _plural | grep -v "^#" | wc -l
grep -rh "verbose_name_plural" apps/*/models/*.py apps/tenant/models.py | wc -l
# Phase 4.1 字段级覆盖核对
grep -rhc "verbose_name=" apps/*/models/*.py apps/tenant/models.py # 应远超 781含 verbose_name= 字段属性 + Meta verbose_name
grep -rhc "help_text=" apps/*/models/*.py apps/tenant/models.py # 关键字段已覆盖
# Git 状态
git status # 应 nothing to commit, working tree clean
git log --oneline -3 # HEAD 应是 79c3cf2 Phase 4.0
git status # 仅 Dockerfile / docker-compose.yml untracked
git log --oneline origin/main..HEAD # 应见 14 行Phase 4.0 + 4.1 + 历史 4 个 Phase 1-3
# 待生成迁移预览(不实际写盘)
.venv/bin/python manage.py makemigrations --dry-run | head -50
```
---
## 七、待澄清/记忆事项
## 七、待澄清/记忆事项(不变项)
1. **Hook 政策**:本仓库 hook 严格阻止新 docstring/注释。所有业务说明改写在 DATA_MODEL 里,代码层只用字段属性(`verbose_name=` / `help_text=`)承载语义
2. **5 个未推送 commit**:用户未授权 push。如团队需协作,需用户明确指示后再推。
1. **Hook 政策**:本仓库 hook 严格阻止新 docstring/注释。**字段属性(`verbose_name=` / `help_text=`)字符串赋值放行**。所有业务说明仍以 DATA_MODEL_*.md 为单一信息源
2. **14 个未推送 commit**:用户未授权 push。如团队需协作需用户明确指示后再推。
3. **AGENTS.md §4.4**:手机号必须 AES-256-GCM**禁止** Fernet
4. **partitioned tables**properties_follow_logs / property_photos / client_follow_logs — 用 `managed=False` + `unique_together=(('id','created_at'),)`。
4. **Partitioned tables**properties_follow_logs / property_photos / client_follow_logs — 用 `managed=False` + `unique_together=(('id','created_at'),)`。这些表的现有 docstring"Partitioned table…unmanaged")作为技术注解保留
5. **release app 不写 services/**spec §17.5 明确禁止。
6. **CSRF_COOKIE_HTTPONLY=False**HTMX 需要,故意如此,禁止"修复"
7. **DB hostname `db` 在 WSL 不可解析**`makemigrations` 会出 `RuntimeWarning`,无害,迁移文件正常生成
6. **release app 模型未实例化**DATA_MODEL_PUBLIC.md §2.6 `client_releases` 未生成 Django ModelMVP 不需要,进入客户端发布阶段时再补
7. **CSRF_COOKIE_HTTPONLY=False**HTMX 需要,故意如此,**禁止"修复"**
8. **DB hostname `db` 在 WSL 不可解析**`makemigrations` 会出 `RuntimeWarning`,无害,迁移文件正常生成。
9. **未跟踪文件保留**Dockerfile / docker-compose.yml 的代理配置是用户本机设置,**不要主动 `git add`**。
10. **ENUM 字段 help_text 中英对照**:示例 `"public=公立 / private=私立 / international=国际学校"`,沿用此风格。
---
@@ -223,10 +230,21 @@ git log --oneline -3 # HEAD 应是 79c3cf2 Phase 4.0
| **Phase 1** — 配置/核心 | ✅ | config/, core/, settings, .env |
| **Phase 2** — 9 个 app 模型 | ✅ | 74 模型 / 5 分区表 / 4 触发器 / 12 迁移 |
| **Phase 3** — 模板/静态/Docker | ✅ | templates/, static/, Dockerfile, docker-compose, Makefile, tests/ |
| **Phase 4.0** — 模型 Meta 中文名 | ✅(今日) | 74 模型全部 Meta.verbose_name |
| **Phase 4.1** — 字段中文名 | ⏸️ 等 PM | 781 字段 verbose_name + ~230 help_text |
| **Phase 5**(候选) — 种子数据 + Celery + OpenAPI | ⏸️ | PermissionDef / 内置角色 / partition task / openapi.json |
| **Phase 4.0** — 模型 Meta 中文名 | ✅ | 74 模型全部 `Meta.verbose_name` + `_plural` |
| **Phase 4.1** — 字段中文名 | ✅(**本次完成** | 781 字段 `verbose_name` + 关键字段 `help_text`9 app 各一 commit |
| **Phase 5**(候选) — 种子数据 + Celery + OpenAPI | ⏸️ 待启动 | PermissionDef / 内置角色 / partition task / openapi.json |
| **Phase 6+** — 业务开发 | ⏸️ 骨架就绪 | 按 DATA_MODEL_*.md 与 API_CONTRACT.md 推进 |
---
**祝明天工作顺利。状态干净,随时可以续接。**
## 九、给后续开发者的提醒
> 进入正式业务开发前,**强烈建议**先做以下 3 件事:
>
> 1. `manage.py makemigrations` 把 Phase 4.0+4.1 的 verbose_name 迁移落地,并 commit
> 2. 创建 PermissionDef + 内置角色 fixture阻塞登录/权限测试)
> 3. `git push origin main` 同步 14 个本地 commit 到远程
>
> 三步完成后骨架达到"业务开发就绪"状态。所有模型字段中文化已完成,新写 ViewSet/Service 时不需要再补任何字段元数据。
**Phase 4.0 + 4.1 收尾完成。骨架已就绪,可直接进入业务开发。**