Files
huang 867e97af11 重构:统一 IoT 模型到 internal/model/ 目录
将所有 IoT 相关的数据模型从 internal/iot/model/ 迁移到 internal/model/,
实现全局统一的模型层架构,符合项目横向分层设计原则。

变更内容:
- 迁移 11 个 IoT 模型文件(carrier, iot_card, device, order, package 等)
- 删除 internal/iot/model/ 目录
- 更新文档中的模型路径引用(25 处)
- 创建重构总结文档
- 归档 OpenSpec 变更为 2026-01-12-refactor-iot-model-location
- 创建 model-organization 规格文档

验证结果:
- 编译通过(go build 成功)
- 静态分析通过(go vet 无错误)
- 代码格式通过(go fmt 无变更)
- 无 Go 代码引用旧路径

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-12 16:01:53 +08:00

8.1 KiB
Raw Permalink Blame History

IoT 模型位置重构 - 总结文档

📋 变更概述

变更 ID: refactor-iot-model-location

变更类型: 架构重构

实施日期: 2026-01-12

状态: 已完成

🎯 重构动机

问题背景

在实施 IoT SIM 管理模块时IoT 相关的数据模型被放置在 internal/iot/model/ 目录下这与项目的其他模型Shop、Account、Enterprise 等)不一致。其他模型都统一放在 internal/model/ 目录下。

存在的问题

  1. 目录结构不一致

    • IoT 模型使用 internal/iot/model/
    • 其他模型使用 internal/model/
    • 导致项目结构混乱,违反统一性原则
  2. 违反项目架构约定

    • 项目采用严格的横向四层架构Handler → Service → Store → Model
    • Model 层应该是全局统一的,不应该按业务模块分散
    • 当前的 internal/iot/model/ 违反了横向分层原则
  3. 导入路径冗余

    • 引用 IoT 模型时需要写 internal/iot/model
    • 引用其他模型只需要写 internal/model
    • 增加了开发者的认知负担
  4. 违反 Go 语言惯用设计

    • Go 推荐扁平化包结构,避免深层嵌套
    • 包应该按功能组织,不是按业务模块分散
    • internal/iot/model 是不必要的复杂性

🔧 实施过程

迁移文件清单

共迁移 11 个 IoT 模型文件:

序号 文件名 说明
1 carrier.go 运营商模型
2 commission.go 佣金模型
3 data_usage.go 流量使用记录模型
4 device.go 设备模型
5 financial.go 财务记录模型
6 iot_card.go IoT 卡模型
7 number_card.go 号卡模型
8 order.go 订单模型
9 package.go 套餐模型
10 polling.go 轮询配置模型
11 system.go 系统配置模型

实施步骤

  1. 准备工作

    • 确认 internal/model/ 目录存在且可写
    • 确认 internal/iot/model/ 包含 11 个模型文件
    • 搜索并确认无 Go 代码引用旧路径
  2. 迁移执行

    • 使用 git mv 命令移动所有 11 个文件到 internal/model/
    • Git 正确识别了所有文件的重命名(保留文件历史)
  3. 清理工作

    • 验证 internal/iot/model/ 目录为空
    • 删除空的 internal/iot/model/ 目录
    • 保留 internal/iot/ 目录(用于未来的 Handler/Service/Store 层)
  4. 验证工作

    • 确认项目中无 internal/iot/model 的 Go 代码引用
    • 验证所有模型文件包名统一为 package model
    • 运行 go fmt ./... 格式检查通过
    • 运行 go vet ./... 静态分析通过
    • 运行 go build 编译成功
  5. 文档更新

    • 更新 docs/iot-sim-management/表结构详细说明.md 中的 25 处引用
    • 更新 OpenSpec 变更文档tasks.md、proposal.md

📊 影响范围

代码影响

  • Go 代码: 零影响

    • 经过搜索,项目中没有任何 Go 代码引用 internal/iot/model
    • IoT 模块尚未完全实现业务逻辑层,因此无代码依赖
  • 文档影响: 25 处引用更新

    • docs/iot-sim-management/表结构详细说明.md 中的模型路径引用已全部更新
  • 数据库影响: 无影响

    • 模型位置变更不影响数据库表结构
    • 数据库迁移脚本不受影响
  • API 影响: 无影响

    • 模型位置变更不影响 API 接口定义

架构改进

重构前的目录结构:

internal/
├── model/                    # 大部分模型
│   ├── account.go
│   ├── shop.go
│   └── ...
└── iot/
    └── model/                # IoT 模型单独存放 ❌
        ├── carrier.go
        └── ...

重构后的目录结构:

internal/
├── model/                    # 统一的模型层 ✅
│   ├── account.go
│   ├── shop.go
│   ├── carrier.go           # IoT 模型已迁移
│   ├── iot_card.go          # IoT 模型已迁移
│   └── ...
└── iot/                      # 保留用于未来的业务逻辑层
    ├── handler.go            # 未来IoT Handler 层
    ├── service.go            # 未来IoT Service 层
    └── store.go              # 未来IoT Store 层

验证结果

验收标准验证

验收标准 状态 验证方法
所有 IoT 模型文件已迁移到 internal/model/ ls internal/model/ 包含全部 11 个文件
internal/iot/model/ 目录已删除 test ! -d internal/iot/model/ 返回成功
项目可以正常编译 go build ./cmd/api 编译成功
所有测试通过 项目暂无测试
项目中不存在 internal/iot/model 的引用 已更新文档中的引用

代码质量验证

验证项 状态 结果
Go 格式检查 go fmt ./... 通过
静态分析 go vet ./... 无错误
编译验证 go build 成功
包名一致性 所有文件包名统一为 package model

Git 历史保留

  • 使用 git mv 命令移动文件,保留了完整的 Git 历史
  • 可以使用 git log --follow <file> 追踪文件的完整历史

📈 收益总结

直接收益

  1. 架构一致性

    • 所有模型统一放在 internal/model/ 目录
    • 符合项目横向四层架构约定
    • 提高了代码组织的可预测性
  2. 简化导入路径

    • 所有模型统一使用 internal/model 导入
    • 减少了认知负担和开发成本
  3. 符合 Go 惯用设计

    • 扁平化包结构
    • 按功能组织,不是按业务模块分散
    • 提高了 Go 代码的地道性idiomatic Go
  4. 提高可维护性

    • 开发者只需要在一个地方查找所有数据模型
    • 降低了新开发者的上手难度
    • 避免了"模型应该放在哪里"的困惑

长期收益

  1. 可扩展性

    • 为未来的 IoT 业务逻辑层Handler/Service/Store预留了清晰的位置
    • 符合项目长期架构演进方向
  2. 代码质量

    • 统一的架构约定有助于保持代码质量
    • 减少了技术债务的累积
  3. 团队协作

    • 明确的架构约定减少了团队内部的讨论成本
    • 提高了代码审查的效率

📝 经验教训

做得好的地方

  1. 提前搜索引用

    • 在迁移前搜索了所有引用,确认无代码依赖
    • 降低了重构风险
  2. 使用 Git 工具

    • 使用 git mv 保留了文件历史
    • 便于未来追溯和回滚
  3. 完整的验证流程

    • 编译、静态分析、格式检查一个都没少
    • 确保了重构的安全性
  4. 文档同步更新

    • 及时更新了相关文档中的引用
    • 避免了文档与代码不一致的问题

可以改进的地方

  1. 更早发现问题

    • 如果在 IoT 模块设计初期就遵循统一的架构约定,就不需要这次重构
    • 建议:在代码审查时严格检查架构约定
  2. 自动化检查

    • 可以添加 CI 检查,防止模型被放在错误的位置
    • 建议:添加 linter 规则检查目录结构

🔗 相关文档

  • 变更提案: openspec/changes/refactor-iot-model-location/proposal.md
  • 设计文档: openspec/changes/refactor-iot-model-location/design.md
  • 任务清单: openspec/changes/refactor-iot-model-location/tasks.md
  • 项目架构规范: openspec/project.md
  • IoT SIM 管理规格: openspec/specs/iot-card/spec.md

🎉 总结

本次重构成功地将 11 个 IoT 模型文件从 internal/iot/model/ 迁移到 internal/model/,实现了项目架构的统一性和一致性。

重构特点:

  • 零代码影响(无 Go 代码依赖)
  • 完整的验证流程(编译、静态分析、格式检查)
  • 保留了完整的 Git 历史
  • 同步更新了相关文档

架构改进:

  • 符合横向四层架构约定
  • 符合 Go 语言惯用设计
  • 提高了代码可维护性和可扩展性

本次重构为项目的长期健康发展奠定了坚实的基础。