1、前言
生成代碼NuGet包:XmSoft.CodeGenerator
該包将會自動生成代碼,如:實體,倉儲,服務,控制器及校驗等檔案。
控制器包含CRUD接口:建立,修改,删除,詳情,清單。
參考:ORM架構采用SqlSugar架構生成
2、示例
//建立控制台應用 輸出項目名稱自定義
dotnet new console -o XmSoft.AutoCode
//引入NuGet
dotnet add package XmSoft.CodeGenerator
//appsettings.json 配置代碼命名空間及輸出位置
//比如:
{
"CodeHelperOptions": {
"ConnectConnectionString": "Server=127.0.0.1;Uid=sa;Pwd=xxxxxxx;Database=test;Port=3306;Charset=utf8;",
"ProviderName": "MySql.Data.MySqlClient",
"NameSpace": {
"ModelsNamespace": "XmSoft.Domain.Models",
"DomainName": "XmSoft.Domain",
"DtoNamespace":"XmSoft.ViewModels.Dto",
"ApiControllerNamespace": "XmSoft.Api.Application",
"InterfaceName": "XmSoft",
"ServicesNamespace": "XmSoft.Service",
"RepositoriesNamespace": "XmSoft.Repository",
"ValidatorNamespace": "XmSoft.Validation"
},
"CodePath": {
"ModelsPath": "XmSoft.Domain/Models/",
"DtoPath": "XmSoft.ViewModels/Dto/",
"IRepositoriesPath": "XmSoft.IRepository/",
"IServicesPath": "XmSoft.IService/",
"RepositoriesPath": "XmSoft.Repository/",
"ServicesPath": "XmSoft.Service/",
"ControllerPath": "XmSoft.Api/Application/",
"ValidatorPath": "XmSoft.Validation/"
}
}
}
//Utility.cs 輸入表名,多個用逗号隔開
public static class Utility
{
public static string[] WriteTables()
{
Console.WriteLine("------------請輸入資料表名稱,多個用逗号隔開------------");
var strRead = Console.ReadLine();
var tables = strRead?.Split(',');
if (string.IsNullOrEmpty(strRead) || tables == null || tables.Length == 0)
{
WriteTables();
}
return tables ?? Array.Empty<string>();
}
}
//Program.cs
Console.WriteLine("自動生成代碼");
var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();
var options = configuration.GetSection(nameof(CodeHelperOptions)).Get<CodeHelperOptions>();
var path = Directory.GetCurrentDirectory();
var filterA= @"\XmSoft.AutoCode\bin\Debug\net6.0"; //XmSoft.AutoCode 修改建立的項目名
var filterB = @"\XmSoft.AutoCode\bin\Release\net6.0";
path = path.Replace(filterA, "");
path = path.Replace(filterB, "");
Console.WriteLine(#34;{path}");
options.CodePath.ValidatorPath = Path.Combine(path, @options.CodePath.ValidatorPath);
options.CodePath.ControllerPath = Path.Combine(path, @options.CodePath.ControllerPath);
options.CodePath.ModelsPath = Path.Combine(path, @options.CodePath.ModelsPath);
options.CodePath.IRepositoriesPath = Path.Combine(path, @options.CodePath.IRepositoriesPath);
options.CodePath.IServicesPath = Path.Combine(path, @options.CodePath.IServicesPath);
options.CodePath.RepositoriesPath = Path.Combine(path, @options.CodePath.RepositoriesPath);
options.CodePath.ServicesPath = Path.Combine(path, @options.CodePath.ServicesPath);
options.CodePath.DtoPath = Path.Combine(path, @options.CodePath.DtoPath);
var tables = Utility.WriteTables();
options.Tables = tables;
Console.WriteLine("------------是否确定執行(Y/N)------------");
var command = Console.ReadLine();
if (!string.IsNullOrEmpty(command) && command.ToLower() == "y")
{
var helper = new CodeGeneratorHelper(options);
helper.Run();
Console.WriteLine("------------完成------------");
}
Console.ReadKey();
3、執行
z_test表sql語句
DROP TABLE IF EXISTS `z_test`;
CREATE TABLE `z_test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`business_id` bigint(20) NULL DEFAULT NULL COMMENT '業務id',
`title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标題',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容',
`picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '圖檔',
`status` int(11) NULL DEFAULT NULL COMMENT '狀态 0 正常 1 關閉',
`remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '備注說明',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '建立Id',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新Id',
`delFlag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '是否删除 1 是,0 否',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '測試表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
補充說明:表必須有個主鍵key
執行
//生成實體
/// <summary>
/// 測試表
/// </summary>
[SugarTable("z_test")]
public partial class Test : BaseBusinessEntity<int?>
{
/// <summary>
/// 标題
/// </summary>
[SugarColumn(ColumnName = "title")]
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
[SugarColumn(ColumnName = "content")]
public string Content { get; set; }
/// <summary>
/// 圖檔
/// </summary>
[SugarColumn(ColumnName = "picture")]
public string Picture { get; set; }
/// <summary>
/// 狀态 0 正常 1 關閉
/// </summary>
[SugarColumn(ColumnName = "status")]
public int? Status { get; set; }
/// <summary>
/// 備注說明
/// </summary>
[SugarColumn(ColumnName = "remark")]
public string Remark { get; set; }
/// <summary>
/// 排序
/// </summary>
[SugarColumn(ColumnName = "sort")]
public int? Sort { get; set; }
}
說明:自定義 BaseBusinessEntity或BaseEntity 自定義,這裡的主鍵名id ,業務id
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseBusinessEntity<T> : BaseEntity<T>
{
/// <summary>
/// 業務Id
/// </summary>
[SugarColumn(ColumnName = "business_id")]
public long? BusinessId { get; set; }
}
public abstract class BaseEntity<T>
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]
public T Id { get; set; }
/// <summary>
/// 0未删除 1資源回收筒 2已删除
/// </summary>
[SugarColumn(ColumnName = "delFlag")]
[JsonIgnore]
public string DelFlag { get; set; }
/// <summary>
/// 建立時間
/// </summary>
[SugarColumn(ColumnName = "create_time")]
// [Column("create_time")]
//[JsonIgnore]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 建立Id
/// </summary>
[SugarColumn(ColumnName = "create_by")]
//[Column("create_id")]
[JsonIgnore]
public string Create_By { get; set; }
/// <summary>
/// 修改時間
/// </summary>
[SugarColumn(ColumnName = "update_time")]
//[Column("update_time")]
[JsonIgnore]
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 修改者ID
/// </summary>
[SugarColumn(ColumnName = "update_by")]
//[Column("update_id")]
[JsonIgnore]
public string Update_By { get; set; }
public void Create()
{
//Create_By = (userId?.ToString()) ?? Create_By;
//BusinessId = businessId ?? BusinessId;
CreateTime = DateTime.Now;
DelFlag = "0";
}
public void Update()
{
UpdateTime = DateTime.Now;
}
}
//生成倉儲 EFRepository<Test> 引用XmSoft.Core.SqlSugar.Repository
public sealed class TestRepository :EFRepository<Test>,ITestRepository
{
public readonly ISqlSugarClient Context;
public TestRepository(ISqlSugarClient context) : base(context)
{
Context = context;
}
public ISugarQueryable<Test> SugarQueryable()
{
return Context.Queryable<Test>();
}
}
//生成服務 引用XmSoft.Core.SqlSugar.Service
public class TestService : BaseService<Test>,ITestService
{
public TestService(ITestRepository _repository):base(_repository)
{
}
public async override Task<IResult<bool>> Create(Test entity, dynamic user)
{
var validation = new AddTestValidator().Validation(entity);
if (!validation.Succeeded) return validation.Fail<bool>();
entity.Create();
entity.Create_By = user?.UserName;
entity.BusinessId = user?.BusinessId;
return await base.Create(entity);
}
public async override Task<IResult<int>> Update(Test entity, dynamic user)
{
var validation = new UpdateTestValidator().Validation(entity);
if (!validation.Succeeded) return validation.Fail<int>();
entity.Update();
entity.Update_By = user?.UserName;
return await base.Update(entity);
}
public async Task<IResult<Page<Test>>> List(Test model,PageInfo pager,dynamic user)
{
long? businessId = user?.BusinessId;
var predicate = Expressionable.Create<Test>();
predicate.And(q => q.BusinessId == businessId);
var result = await Page(pager.PageIndex, pager.PageSize, predicate.ToExpression(), q => q.CreateTime, false);
return result;
}
}
//生成Dto
/// <summary>
/// 測試表
/// </summary>
public partial class TestDto
{
/// <summary>
/// id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 業務id
/// </summary>
public long? BusinessId { get; set; }
/// <summary>
/// 标題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 圖檔
/// </summary>
public string Picture { get; set; }
/// <summary>
/// 狀态 0 正常 1 關閉
/// </summary>
public int? Status { get; set; }
/// <summary>
/// 備注說明
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 排序
/// </summary>
public int? Sort { get; set; }
}
//生成控制器 BaseAppService 可自定義可繼承 ControllerBase等
/// <summary>
/// 測試表
/// </summary>
[Route("test")]
[Tags("測試表")]
public class TestAppService :BaseAppService
{
private readonly ITestService service;
public TestAppService(ITestService _service)
{
service = _service;
}
/// <summary>
/// 建立測試表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
[SwaggerResponse(200, Type = typeof(IResult<bool>))]
[Log(Title = "測試表", BusinessType = BusinessType.INSERT)]
public IActionResult Create(TestDto model) => service.Create(model.Adapt<Test>(),User).ApiResult();
/// <summary>
/// 修改測試表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPut]
[SwaggerResponse(200, Type = typeof(IResult<int>))]
[Log(Title = "測試表", BusinessType = BusinessType.UPDATE)]
public IActionResult Update(TestDto model) => service.Update(model.Adapt<Test>(),User).ApiResult();
/// <summary>
/// 删除測試表
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
[SwaggerResponse(200, Type = typeof(IResult<int>))]
[Log(Title = "測試表", BusinessType = BusinessType.DELETE)]
public IActionResult Delete(int id) => service.Delete(q=>q.Id == id).ApiResult();
/// <summary>
/// 擷取測試表資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[SwaggerResponse(200, Type = typeof(IResult<Test>))]
public IActionResult Info(int id) => service.Info(q => q.Id == id).ApiResult();
/// <summary>
/// 測試表清單
/// </summary>
/// <param name="model"></param>
/// <param name="pager"></param>
/// <returns></returns>
[HttpGet("list")]
[SwaggerResponse(200, Type = typeof(IResult<Page<Test>>))]
public IActionResult List(TestDto model,PageInfo pager) => service.List(model.Adapt<Test>(), pager, User).ApiResult();
}
Swagger顯示效果
注:需要Demo請私信發郵箱