diff --git a/admin-generate-ef-seed-data/GenerateSeeds/Program.cs b/admin-generate-ef-seed-data/GenerateSeeds/Program.cs index 801bb20..689874f 100644 --- a/admin-generate-ef-seed-data/GenerateSeeds/Program.cs +++ b/admin-generate-ef-seed-data/GenerateSeeds/Program.cs @@ -31,7 +31,7 @@ foreach (var table in tables) useStringBuilder.Append(className + ".Seed(modelBuilder);"); sb.Append($@" -namespace HZY.Repository.EntityFramework.Admin.Migrations.SeedsDatas.Datas; +namespace MiaoYu.Repository.EntityFramework.Admin.Migrations.SeedsDatas.Datas; public static class {className} {{ diff --git a/admin-server/MiaoYu.Admin.sln b/admin-server/MiaoYu.Admin.sln index 350d5be..45957f8 100644 --- a/admin-server/MiaoYu.Admin.sln +++ b/admin-server/MiaoYu.Admin.sln @@ -43,7 +43,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiaoYu.Core.Swagger", "Miao EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiaoYu.WinFormDemo", "MiaoYu.WinFormDemo\MiaoYu.WinFormDemo.csproj", "{75959B17-A901-49E1-A5E7-667349DC4203}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiaoYu.Shared.Admin", "MiaoYu.Shared.Admin\MiaoYu.Shared.Admin.csproj", "{925EF035-4A41-42E4-A3A4-B8E9AE52F6B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiaoYu.Shared.Admin", "MiaoYu.Shared.Admin\MiaoYu.Shared.Admin.csproj", "{925EF035-4A41-42E4-A3A4-B8E9AE52F6B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiaoYu.Repository.ChatAI.Admin", "MiaoYu.Repository.ChatAI.Admin\MiaoYu.Repository.ChatAI.Admin.csproj", "{39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -115,6 +117,10 @@ Global {925EF035-4A41-42E4-A3A4-B8E9AE52F6B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {925EF035-4A41-42E4-A3A4-B8E9AE52F6B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {925EF035-4A41-42E4-A3A4-B8E9AE52F6B7}.Release|Any CPU.Build.0 = Release|Any CPU + {39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -136,6 +142,7 @@ Global {452F4EDD-E92B-4673-B5FB-863595996614} = {DB46F54A-9F53-44EC-80F8-9E53F0B871CF} {75959B17-A901-49E1-A5E7-667349DC4203} = {DC7A7E4A-B4DC-4958-BAA5-2BBB1A153B5F} {925EF035-4A41-42E4-A3A4-B8E9AE52F6B7} = {ACA91C4A-33F0-4ECA-90D2-BEC0811764EE} + {39C765DB-41E7-4BC6-B75E-2A90CFF3A8EF} = {451BE0BB-26ED-47ED-ABC7-23001D21410C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E3C61955-46C1-4D06-994F-C86A72B2B0E2} diff --git a/admin-server/MiaoYu.Api.Admin/appsettings.Development.json b/admin-server/MiaoYu.Api.Admin/appsettings.Development.json index f1c80fd..2490b35 100644 --- a/admin-server/MiaoYu.Api.Admin/appsettings.Development.json +++ b/admin-server/MiaoYu.Api.Admin/appsettings.Development.json @@ -9,7 +9,7 @@ //默认数据库类型 SqlServer 、MySql 、PostgreSql、Oracle "DefaultDatabaseType": "SqlServer", //是否监控EFCore程序 - "IsMonitorEFCore": false, + "IsMonitorEFCore": true, // 连接字符串 - mysql //"ConnectionString": "Server=localhost; port=3306; Database=hzy_admin_mysql_20230227; uid=root; pwd=123456; Convert Zero Datetime=False" //// 连接字符串 - sqlserver @@ -19,5 +19,9 @@ //"ConnectionString": "User ID=postgres;Password=123456;Host=localhost;Port=5432;Database=hzy_microservices_pgsql_20230227;Pooling=true;TimeZone=Asia/Shanghai", //// 连接字符串 - oracle //"ConnectionString": "user id=hzy_admin_oracle_20221213;password=123456; data source=//127.0.0.1:1521/orcl;Pooling=true;Min Pool Size=1" + }, + "ChatAdminRepositoryOptions": { + "ConnectionString": "Server=192.168.195.2;Database=MiaoYu;User ID=zpc;Password=zpc;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;" + } } \ No newline at end of file diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminDbContext.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminDbContext.cs new file mode 100644 index 0000000..3b82218 --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminDbContext.cs @@ -0,0 +1,39 @@ + + +namespace MiaoYu.Repository.ChatAI.Admin +{ + /// + /// 后台管理系统数据库上下文 + /// + [DbContextConfig($"Repository.*.Entities.*")] + public class ChatAdminDbContext : DbContext, IBaseDbContext + { + /// + /// 工作单元 + /// + public IUnitOfWork UnitOfWork { get; } + + public ChatAdminDbContext(DbContextOptions dbContextOptions) : base(dbContextOptions) + { + UnitOfWork = new UnitOfWorkImpl(this); + } + + /// + /// 模型创建 + /// + /// + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + var dbContextConfigAttribute = GetType().GetCustomAttribute()!; + dbContextConfigAttribute!.OnModelCreating(modelBuilder, dbContextConfigAttribute.GetModelTypes(GetType())); + + #region 自动迁移种子数据 + + //ModelBuilderExtensions.Seed(modelBuilder); + + #endregion + } + + + } +} diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminRepositoryStartup.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminRepositoryStartup.cs new file mode 100644 index 0000000..d04815a --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/ChatAdminRepositoryStartup.cs @@ -0,0 +1,139 @@ + +using MiaoYu.Repository.ChatAI.Admin.Models; + +namespace MiaoYu.Repository.ChatAI.Admin +{ + /// + /// 程序启动器 + /// + [ImportStartupModule] + public class ChatAdminRepositoryStartup : StartupModule + { + /// + /// 程序启动器 + /// + /// + public override void ConfigureServices(WebApplicationBuilder webApplicationBuilder) + { + var configuration = webApplicationBuilder.Configuration; + var services = webApplicationBuilder.Services; + var webHostEnvironment = webApplicationBuilder.Environment; + + var repositoriesOptions = configuration + .GetSection(nameof(ChatAdminRepositoryOptions)) + .Get() ?? throw new Exception("配置对象 空 异常!"); + + var connectionString = repositoriesOptions?.ConnectionString; + + connectionString = string.IsNullOrWhiteSpace(connectionString) ? + configuration["ConnectionStrings:" + repositoriesOptions!.DefaultDatabaseType.ToString()] : + connectionString; + + services.AddDbContextFactory(optionsBuilder => + { + switch (repositoriesOptions.DefaultDatabaseType) + { + case DefaultDatabaseType.SqlServer: + optionsBuilder + .UseSqlServer(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) + ; + break; + case DefaultDatabaseType.MySql: + optionsBuilder + .UseMySql(connectionString, MySqlServerVersion.LatestSupportedServerVersion, w => w.MinBatchSize(1).MaxBatchSize(1000)) + ; + break; + case DefaultDatabaseType.PostgreSql: + //EnableLegacyTimestampBehavior 启动旧行为,避免时区问题,存储时间报错 + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); + optionsBuilder + .UseNpgsql(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) + ; + break; + case DefaultDatabaseType.Oracle: + optionsBuilder + .UseOracle(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) + ; + break; + default: + break; + } + + if (webHostEnvironment.IsDevelopment()) + { + var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); + // sql 日志写入控制台 + optionsBuilder.UseLoggerFactory(loggerFactory); + } + + // 懒加载代理 + //options.UseLazyLoadingProxies(); + //添加 EFCore 监控 和 动态表名 + optionsBuilder.AddEntityFrameworkMonitor(repositoriesOptions.IsMonitorEFCore); + optionsBuilder.AddInterceptors(new AuditInterceptor()); + }); + + services.AddEntityFrameworkRepositories(repositoriesOptions, (auditOptions) => + { + // 你的自定义审计字段 ... + //auditOptions.Add(new AuditOptions() + //{ + // CreationTimeFieldName = nameof(ICreateEntityV2.CreateTime), + // CreatorUserIdFieldName = "", + // LastModificationTimeFieldName = nameof(IUpdateEntityV2.UpdateTime), + // LastModifierUserIdFieldName = "", + // DeletionTimeFieldName = "UpdateTime", + // DeleterUserIdFieldName = "UpdateBy", + // IsDeletedFieldName = "DelFlag", + //}); + }, (freesqlOptions) => + { + freesqlOptions.FreeSqlAuditAopList?.Add(new FreeSqlAuditAop()); + freesqlOptions.FreeSqlAction = (freeSql) => + { + freeSql.Aop.CurdAfter += (object? sender, FreeSql.Aop.CurdAfterEventArgs curdAfter) => + { + var stringBuilder = new StringBuilder(); + stringBuilder.Append($"\r\n====[FreeSql 开始 耗时: {curdAfter.ElapsedMilliseconds} ms]========="); + stringBuilder.Append($"\r\n{curdAfter.Sql}"); + stringBuilder.Append($"\r\n====[FreeSql 结束 线程Id:{Environment.CurrentManagedThreadId}]========="); + LogUtil.Log.Warning(stringBuilder.ToString()); + }; + }; + }); + } + + /// + /// Configure + /// + /// + public override void Configure(WebApplication webApplication) + { + // 使用 DbContext + #region 开发环境检测是否需要数据库迁移 + + //if (webApplication.Environment.IsDevelopment()) + //{ + // // 自动迁移 (如果迁移文件有变动) + // using var scope = webApplication.Services.CreateScope(); + // using var adminDbContext = scope.ServiceProvider.GetService(); + // if (adminDbContext!.Database.GetPendingMigrations().Count() > 0) + // { + // try + // { + // adminDbContext.Database.Migrate(); + // } + // catch (Exception ex) + // { + // LogUtil.Log.Error(ex.Message, ex); + // } + // } + //} + + #endregion + + } + + + } +} diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xml b/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xml new file mode 100644 index 0000000..a6a2edf --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xsd b/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xsd new file mode 100644 index 0000000..f35a69b --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/FodyWeavers.xsd @@ -0,0 +1,26 @@ + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.csproj b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.csproj new file mode 100644 index 0000000..c0d37d9 --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/Models/ChatAdminRepositoryOptions.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/Models/ChatAdminRepositoryOptions.cs new file mode 100644 index 0000000..795bb19 --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/Models/ChatAdminRepositoryOptions.cs @@ -0,0 +1,8 @@ +namespace MiaoYu.Repository.ChatAI.Admin.Models; + +public class ChatAdminRepositoryOptions : RepositoryOptions +{ + +} + + diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/Usings.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/Usings.cs new file mode 100644 index 0000000..043d34e --- /dev/null +++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/Usings.cs @@ -0,0 +1,26 @@ +global using MiaoYu.Core.EntityFramework; +global using MiaoYu.Core.EntityFramework.Interceptors; +global using MiaoYu.Core.Quartz.Models; +global using HZY.Framework.Core.AspNetCore; +global using HZY.Framework.Core.Quartz; +global using HZY.Framework.Repository.EntityFramework; +global using HZY.Framework.Repository.EntityFramework.Attributes; +global using HZY.Framework.Repository.EntityFramework.Models; +global using HZY.Framework.Repository.EntityFramework.Models.Enums; +global using HZY.Framework.Repository.EntityFramework.Models.Standard; +global using HZY.Framework.Repository.EntityFramework.Repositories; +global using HZY.Framework.Repository.EntityFramework.Repositories.Impl; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; +global using Microsoft.EntityFrameworkCore; +global using Microsoft.EntityFrameworkCore.Infrastructure; +global using Microsoft.Extensions.Caching.Memory; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Logging; +global using System.ComponentModel.DataAnnotations; +global using System.ComponentModel.DataAnnotations.Schema; +global using System.Reflection; +global using MiaoYu.Core.Logs; +global using System.Text; \ No newline at end of file