# 创建模块

使用 DarkM 代码生成器,可以从设计到生成代码只需 10 分钟!


# 🎯 代码生成器特点

特点 说明
Web 界面 浏览器访问,无需安装客户端
实体优先 先设计实体,再生成数据库和代码
在线协作 团队可实时查看和修改设计
完整生成 前后端代码、数据库脚本一键生成
NuGet 集成 自动生成 NuGet 包并发布

示例仓库: DarkM.Demo (opens new window)(已安装代码生成器)


# 📋 前置准备

# 1. 安装代码生成器模块

# 后端 NuGet 包
Install-Package DarkM.Module.CodeGenerator.Web

# 前端 NPM 包
npm i -S darkm-module-codegenerator
1
2
3
4
5

# 2. 配置数据库

appsettings.json 中添加 CodeGenerator 模块配置:

{
  "Db": {
    "Modules": [
      {
        "Name": "Admin",
        "Database": "Nm_Admin"
      },
      {
        "Name": "CodeGenerator",
        "Database": "Nm_CodeGenerator"
      }
    ]
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3. 启动项目

dotnet run
1

访问:http://localhost:6220 (opens new window)


# 🚀 创建模块流程

# 步骤 1:创建项目

  1. 登录系统(admin/******)
  2. 进入 代码生成器 → 项目管理
  3. 点击 添加 按钮
  4. 填写项目信息
字段 说明 示例
项目名称 模块的显示名称 请假管理模块
项目编码 模块的唯一标识(用于 NuGet 包名) Vacation
项目名称(小写) 用于前端包名 vacation
图标 菜单显示图标 el-icon-time
备注 模块说明 员工请假审批管理

# 步骤 2:添加实体

  1. 点击项目的 实体管理 按钮
  2. 点击 添加 按钮
  3. 填写实体信息
字段 说明 示例
类名 实体类名称 Vacation
表名 数据库表名 T_Vacation
基类类型 继承的基类 EntityBase
备注 实体说明 请假申请实体

# 基类类型说明

基类 包含属性 适用场景
IEntity 纯接口,不常用
Entity Id 简单关联表
EntityBase Id + 创建人/时间 + 修改人/时间 最常用,业务表
EntityWithSoftDelete Id + 删除标记/时间/人 需要软删除的表
EntityBaseWithSoftDelete EntityBase + 软删除 推荐,业务表
EntityBaseWithSoftDeleteWithValidity 以上 + 有效期 有有效期限制的数据

# 步骤 3:添加属性

  1. 点击实体名称进入属性配置
  2. 点击 添加 按钮
  3. 填写属性信息
字段 说明 示例
属性名 C# 属性名称 EmployeeName
列名 数据库列名 EmployeeName
数据类型 C# 类型 string/int/DateTime/enum
长度 字符串最大长度 50
可空 是否允许 NULL ✓/✗
显示名称 前端显示标签 员工姓名
控件类型 前端输入控件 文本框/下拉框/日期选择器
字典编码 关联数据字典 sex(性别字典)

# 枚举类型属性

如果属性是枚举类型,需要先添加枚举:

  1. 进入 枚举管理
  2. 添加枚举(如:VacationType)
  3. 添加枚举项(年假、调休假、病假等)
  4. 返回实体属性,类型选择枚举

# 步骤 4:配置模型

模型用于生成前端页面的表单和查询条件。

  1. 返回实体列表
  2. 点击实体的 模型 按钮
  3. 配置三种模型

# 查询模型(QueryModel)

用于列表页面的查询条件

public class VacationQueryModel
{
    public string EmployeeName { get; set; }  // 员工姓名
    public DateTime? StartDate { get; set; }  // 开始日期
    public DateTime? EndDate { get; set; }    // 结束日期
    public int? Status { get; set; }          // 审批状态
}
1
2
3
4
5
6
7

# 添加模型(AddModel)

用于新增表单

public class VacationAddModel
{
    [Required(ErrorMessage = "请选择员工")]
    public Guid EmployeeId { get; set; }
    
    [Required(ErrorMessage = "请输入请假天数")]
    public decimal Days { get; set; }
    
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    
    [Required(ErrorMessage = "请选择请假类型")]
    public int Type { get; set; }
    
    public string Reason { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 修改模型(UpdateModel)

用于编辑表单(通常包含 Id)

public class VacationUpdateModel
{
    public Guid Id { get; set; }
    
    // 其他字段与 AddModel 类似
    public decimal Days { get; set; }
    public DateTime StartDate { get; set; }
    // ...
}
1
2
3
4
5
6
7
8
9

# 步骤 5:生成代码

  1. 返回项目列表
  2. 点击 生成代码 按钮
  3. 等待生成完成(自动下载 NuGet 包,可能需要 1-2 分钟)
  4. 下载生成的 ZIP 文件

# 生成的文件结构

Vacation.zip
├── src/
│   ├── Application/          # 应用服务层
│   │   ├── IVacationService.cs
│   │   ├── VacationService.cs
│   │   └── Models/
│   ├── Domain/               # 领域层
│   │   ├── Entities/
│   │   │   └── VacationEntity.cs
│   │   ├── Repositories/
│   │   │   └── IVacationRepository.cs
│   │   └── Models/
│   ├── Infrastructure/       # 基础设施层
│   │   └── Repositories/
│   │       └── VacationRepository.cs
│   ├── Web/                  # 应用层
│   │   ├── Controllers/
│   │   │   └── VacationController.cs
│   │   ├── Validators/
│   │   │   └── VacationValidator.cs
│   │   └── VacationModule.cs
│   └── WebHost/              # 启动器
│       ├── Program.cs
│       └── appsettings.json
├── UI/
│   └── module-vacation/      # 前端项目
│       ├── src/
│       │   ├── views/
│       │   ├── api/
│       │   └── index.js
│       └── package.json
└── sql/
    └── T_Vacation.sql        # 数据库脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 🎯 运行生成的模块

# 方式一:独立运行(推荐新手)

  1. 解压 ZIP 文件
  2. 进入 src/WebHost 目录
  3. 修改 appsettings.json 数据库配置
  4. 运行 dotnet run
  5. 访问 Swagger:http://localhost:6220/swagger

# 方式二:集成到现有项目

参考 安装模块 文档


# 🔧 高级功能

# 1. 实体关系配置

# 一对一关系

// VacationEntity.cs
public Guid EmployeeId { get; set; }

[ForeignKey(nameof(EmployeeId))]
public EmployeeEntity Employee { get; set; }
1
2
3
4
5

# 一对多关系

// DepartmentEntity.cs
public virtual ICollection<EmployeeEntity> Employees { get; set; }
1
2

# 2. 数据字典集成

// 属性配置时选择字典
[Dict("vacation_type")]  // 请假类型字典
public int Type { get; set; }

public string TypeName => Type.ToDescription();  // 扩展属性
1
2
3
4
5

# 3. 工作流集成

如果需要审批流程,在生成时勾选 集成工作流 选项:

  • 自动生成流程定义
  • 自动配置审批节点
  • 自动生成待办任务

# 📝 最佳实践

# 1. 命名规范

类型 规范 示例
实体类 *Entity VacationEntity
服务接口 I*Service IVacationService
服务实现 *Service VacationService
控制器 *Controller VacationController
查询模型 *QueryModel VacationQueryModel
添加模型 *AddModel VacationAddModel
修改模型 *UpdateModel VacationUpdateModel

# 2. 字段设计

  • ✅ 使用 Guid 作为主键(分布式友好)
  • ✅ 添加 CreateTimeUpdateTime 字段
  • ✅ 使用 int 表示状态/类型(配合字典)
  • ✅ 金额字段使用 decimal 类型
  • ✅ 日期字段使用 DateTime?(可空)

# 3. 模型验证

public class VacationValidator : AbstractValidator<VacationAddModel>
{
    public VacationValidator()
    {
        RuleFor(x => x.EmployeeId).NotEmpty().WithMessage("请选择员工");
        RuleFor(x => x.Days).GreaterThan(0).WithMessage("请假天数必须大于 0");
        RuleFor(x => x.StartDate).LessThan(x => x.EndDate).WithMessage("开始日期必须早于结束日期");
        RuleFor(x => x.Reason).MaximumLength(500).WithMessage("请假原因不能超过 500 字");
    }
}
1
2
3
4
5
6
7
8
9
10

# 🔗 相关文档


最后更新: 2022-08-07