# 创建模块
使用 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3. 启动项目
dotnet run
1
访问:http://localhost:6220 (opens new window)
# 🚀 创建模块流程
# 步骤 1:创建项目
- 登录系统(admin/******)
- 进入 代码生成器 → 项目管理
- 点击 添加 按钮
- 填写项目信息
| 字段 | 说明 | 示例 |
|---|---|---|
| 项目名称 | 模块的显示名称 | 请假管理模块 |
| 项目编码 | 模块的唯一标识(用于 NuGet 包名) | Vacation |
| 项目名称(小写) | 用于前端包名 | vacation |
| 图标 | 菜单显示图标 | el-icon-time |
| 备注 | 模块说明 | 员工请假审批管理 |
# 步骤 2:添加实体
- 点击项目的 实体管理 按钮
- 点击 添加 按钮
- 填写实体信息
| 字段 | 说明 | 示例 |
|---|---|---|
| 类名 | 实体类名称 | Vacation |
| 表名 | 数据库表名 | T_Vacation |
| 基类类型 | 继承的基类 | EntityBase |
| 备注 | 实体说明 | 请假申请实体 |
# 基类类型说明
| 基类 | 包含属性 | 适用场景 |
|---|---|---|
IEntity | 无 | 纯接口,不常用 |
Entity | Id | 简单关联表 |
EntityBase | Id + 创建人/时间 + 修改人/时间 | 最常用,业务表 |
EntityWithSoftDelete | Id + 删除标记/时间/人 | 需要软删除的表 |
EntityBaseWithSoftDelete | EntityBase + 软删除 | 推荐,业务表 |
EntityBaseWithSoftDeleteWithValidity | 以上 + 有效期 | 有有效期限制的数据 |
# 步骤 3:添加属性
- 点击实体名称进入属性配置
- 点击 添加 按钮
- 填写属性信息
| 字段 | 说明 | 示例 |
|---|---|---|
| 属性名 | C# 属性名称 | EmployeeName |
| 列名 | 数据库列名 | EmployeeName |
| 数据类型 | C# 类型 | string/int/DateTime/enum |
| 长度 | 字符串最大长度 | 50 |
| 可空 | 是否允许 NULL | ✓/✗ |
| 显示名称 | 前端显示标签 | 员工姓名 |
| 控件类型 | 前端输入控件 | 文本框/下拉框/日期选择器 |
| 字典编码 | 关联数据字典 | sex(性别字典) |
# 枚举类型属性
如果属性是枚举类型,需要先添加枚举:
- 进入 枚举管理
- 添加枚举(如:VacationType)
- 添加枚举项(年假、调休假、病假等)
- 返回实体属性,类型选择枚举
# 步骤 4:配置模型
模型用于生成前端页面的表单和查询条件。
- 返回实体列表
- 点击实体的 模型 按钮
- 配置三种模型
# 查询模型(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
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
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
2
3
4
5
6
7
8
9
# 步骤 5:生成代码
- 返回项目列表
- 点击 生成代码 按钮
- 等待生成完成(自动下载 NuGet 包,可能需要 1-2 分钟)
- 下载生成的 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
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
# 🎯 运行生成的模块
# 方式一:独立运行(推荐新手)
- 解压 ZIP 文件
- 进入
src/WebHost目录 - 修改
appsettings.json数据库配置 - 运行
dotnet run - 访问 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
2
3
4
5
# 一对多关系
// DepartmentEntity.cs
public virtual ICollection<EmployeeEntity> Employees { get; set; }
1
2
2
# 2. 数据字典集成
// 属性配置时选择字典
[Dict("vacation_type")] // 请假类型字典
public int Type { get; set; }
public string TypeName => Type.ToDescription(); // 扩展属性
1
2
3
4
5
2
3
4
5
# 3. 工作流集成
如果需要审批流程,在生成时勾选 集成工作流 选项:
- 自动生成流程定义
- 自动配置审批节点
- 自动生成待办任务
# 📝 最佳实践
# 1. 命名规范
| 类型 | 规范 | 示例 |
|---|---|---|
| 实体类 | *Entity | VacationEntity |
| 服务接口 | I*Service | IVacationService |
| 服务实现 | *Service | VacationService |
| 控制器 | *Controller | VacationController |
| 查询模型 | *QueryModel | VacationQueryModel |
| 添加模型 | *AddModel | VacationAddModel |
| 修改模型 | *UpdateModel | VacationUpdateModel |
# 2. 字段设计
- ✅ 使用
Guid作为主键(分布式友好) - ✅ 添加
CreateTime和UpdateTime字段 - ✅ 使用
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
2
3
4
5
6
7
8
9
10
# 🔗 相关文档
最后更新: 2022-08-07