From 92abb7e2de2b2ac45373fb68e4321591e0167fda Mon Sep 17 00:00:00 2001 From: falcon <9504402@qq.com> Date: Mon, 31 May 2021 15:11:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E3=80=82=E6=8A=A5=E8=A1=A8=E5=8F=AF=E4=BB=A5=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E4=BD=BF=E7=94=A8=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8myjs.GetDAta=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/api/ReportApiController.cs | 26 +++++--- ReportService/Database/DbContextFactory.cs | 61 +++++++++++++++++++ .../DbContextFactoryServiceCollectionEx.cs | 27 ++++++++ ReportService/Database/RSDbContext.cs | 14 ----- ReportService/Models/ReportApi/GetDataData.cs | 17 ++++++ ReportService/ReportService.csproj | 3 - ReportService/Startup.cs | 7 +-- ReportService/appsettings.json | 3 +- ReportService/wwwroot/js/site.js | 22 +++++++ 9 files changed, 149 insertions(+), 31 deletions(-) create mode 100644 ReportService/Database/DbContextFactory.cs create mode 100644 ReportService/Database/DbContextFactoryServiceCollectionEx.cs delete mode 100644 ReportService/Database/RSDbContext.cs create mode 100644 ReportService/Models/ReportApi/GetDataData.cs diff --git a/ReportService/Controllers/api/ReportApiController.cs b/ReportService/Controllers/api/ReportApiController.cs index 1caa90b..cafee85 100644 --- a/ReportService/Controllers/api/ReportApiController.cs +++ b/ReportService/Controllers/api/ReportApiController.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Generic; using System.IO; -using Falcon.StoredProcedureRunner; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore.Internal; using Microsoft.Extensions.Logging; using ReportService.Database; using ReportService.Models; +using ReportService.Models.ReportApi; namespace ReportService.Controllers.api { @@ -16,9 +15,8 @@ namespace ReportService.Controllers.api public class ReportApiController:Controller { public IWebHostEnvironment Env { get; private set; } - public RSDbContext Db { get; set; } public ILogger Logger { get; set; } - public IRunner DbRunner { get; set; } + public DbContextFactory DbFactory { get; set; } /// /// 报表存放位置 @@ -29,11 +27,10 @@ namespace ReportService.Controllers.api } } - public ReportApiController(ILogger logger,IWebHostEnvironment env,RSDbContext db,IRunner r) { + public ReportApiController(ILogger logger,IWebHostEnvironment env,DbContextFactory dbFactory) { this.Logger = logger; this.Env = env; - this.Db = db; - this.DbRunner = r; + this.DbFactory = dbFactory; } /// @@ -123,8 +120,19 @@ namespace ReportService.Controllers.api /// 要执行的sql语句 /// json对象 public object GetResult(string sql) { - var result = this.DbRunner.RunRaw(this.Db,sql); - this.Logger.LogInformation($"GetResult:\n{sql}\n{result}"); + return GetData(new GetDataData { + DbName = "ReportService", + Sql = sql, + }); + } + /// + /// 从数据请求数据。 + /// + /// 请求数据模型 + /// 返回json格式数据 + public object GetData([FromBody]GetDataData data) { + var result = this.DbFactory.RunRawSql(data.DbName,data.Sql); + this.Logger.LogInformation($"GetData:\n{data.Sql}\n{result}"); return Content(result,"application/json; charset=utf-8"); } diff --git a/ReportService/Database/DbContextFactory.cs b/ReportService/Database/DbContextFactory.cs new file mode 100644 index 0000000..a797648 --- /dev/null +++ b/ReportService/Database/DbContextFactory.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using Falcon.StoredProcedureRunner; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; + +namespace ReportService.Database +{ + /// + /// 数据库上下文工厂 + /// + public class DbContextFactory + { + /// + /// 数据库上下文集合 + /// + public Dictionary List { get; set; } = new(); + /// + /// 数据库执行器 + /// + public IRunner DbRunner { get; set; } + + /// + /// 通过提供配置节点实例化数据库上下文工厂 + /// + /// 配置节点 + /// 数据库语句执行器 + public DbContextFactory(IConfigurationSection config,IRunner runner) { + foreach(var item in config.GetChildren()) { + DbContextOptionsBuilder builder = new(); + builder.UseSqlServer(item.Value); + this.List.Add(item.Key,builder.Options); + } + this.DbRunner = runner; + } + /// + /// 获取数据库上下文 + /// + /// 节点定义的数据库名称 + /// 数据上下文 + public DbContext GetContext(string name) { + if(List.TryGetValue(name,out var option)) { + return new DbContext(option); + } + throw new Exception("使用的数据库名称错误!"); + } + + /// + /// 在指定数据库上执行原始sql语句并返回json格式数据。注意防止sql注入攻击 + /// + /// 数据库名称 + /// 要执行的sql语句 + /// json格式的数据库返回数据 + public string RunRawSql(string dbName,string sql) { + if(this.DbRunner == null) { + throw new Exception("执行器注册错误,没有实例化IRunner执行器"); + } + return this.DbRunner.RunRaw(GetContext(dbName),sql); + } + } +} diff --git a/ReportService/Database/DbContextFactoryServiceCollectionEx.cs b/ReportService/Database/DbContextFactoryServiceCollectionEx.cs new file mode 100644 index 0000000..da3476f --- /dev/null +++ b/ReportService/Database/DbContextFactoryServiceCollectionEx.cs @@ -0,0 +1,27 @@ +using Falcon.StoredProcedureRunner; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace ReportService.Database +{ + /// + /// 数据上下文工厂服务集合扩展 + /// + public static class DbContextFactoryServiceCollectionEx + { + /// + /// 注册数据库工厂 + /// + /// 服务集合 + /// 配置文件节点 + /// 服务集合 + public static IServiceCollection AddDbContextFactory(this IServiceCollection services,string sectionKey) { + services.AddSingleton(sp => { + var section = sp.GetService().GetSection(sectionKey); + var runner = sp.GetService(); + return new DbContextFactory(section,runner); + }); + return services; + } + } +} diff --git a/ReportService/Database/RSDbContext.cs b/ReportService/Database/RSDbContext.cs deleted file mode 100644 index 61c49c3..0000000 --- a/ReportService/Database/RSDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace ReportService.Database -{ - /// - /// 报表服务数据库 - /// - public partial class RSDbContext:DbContext - { - public RSDbContext(DbContextOptions options) : base(options) { - } - - } -} diff --git a/ReportService/Models/ReportApi/GetDataData.cs b/ReportService/Models/ReportApi/GetDataData.cs new file mode 100644 index 0000000..7fe2109 --- /dev/null +++ b/ReportService/Models/ReportApi/GetDataData.cs @@ -0,0 +1,17 @@ +namespace ReportService.Models.ReportApi +{ + /// + /// 请求数据模型 + /// + public class GetDataData + { + /// + /// 要请求数据的数据库 + /// + public string DbName { get; set; } + /// + /// 要执行的查询语句 + /// + public string Sql { get; set; } + } +} diff --git a/ReportService/ReportService.csproj b/ReportService/ReportService.csproj index 01c15a8..d24279a 100644 --- a/ReportService/ReportService.csproj +++ b/ReportService/ReportService.csproj @@ -33,7 +33,4 @@ Never - - - \ No newline at end of file diff --git a/ReportService/Startup.cs b/ReportService/Startup.cs index 4b19706..a413b2b 100644 --- a/ReportService/Startup.cs +++ b/ReportService/Startup.cs @@ -21,10 +21,9 @@ namespace ReportService // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - var connStr = this.Configuration.GetValue("Database:ReportService"); - services.AddDbContext(b => { - b.UseSqlServer(connStr); - }); + //עĹ + services.AddDbContextFactory("Database"); + //洢ִ services.AddFalconSPRunner(); diff --git a/ReportService/appsettings.json b/ReportService/appsettings.json index 34ba3dd..d2822cb 100644 --- a/ReportService/appsettings.json +++ b/ReportService/appsettings.json @@ -8,7 +8,8 @@ }, "AllowedHosts": "*", "Database": { - "ReportService": "Server=.\\SQLSERVER2008R2;Database=EASY_HEALTHRECORDS;User ID=sa;Password=111" + "ReportService": "Server=.\\SQLSERVER2008R2;Database=EASY_HEALTHRECORDS;User ID=sa;Password=111", + "test": "Server=.\\SQLSERVER2008R2;Database=EASY_HEALTHRECORDS;User ID=sa;Password=111" }, "urls": "http://*:9000;https://*:9001" } diff --git a/ReportService/wwwroot/js/site.js b/ReportService/wwwroot/js/site.js index d4640f8..0fb6f1f 100644 --- a/ReportService/wwwroot/js/site.js +++ b/ReportService/wwwroot/js/site.js @@ -6,6 +6,7 @@ var myjs = { fileContentUrl: "/api/ReportApi/GetHtml", reportUrl: "/api/ReportApi/GetPrint", getresult: "/api/ReportApi/GetResult", + getData: "/api/ReportApi/GetData", GetServerTime: "/api/ReportApi/GetServerTime", }, //定义从对象获取请求参数的方法 @@ -56,6 +57,27 @@ var myjs = { .then(sc) .catch(ec); }, + //从数据库获取数据。 + getData(dbName, sql, sc, ec) { + if (!ec) { + ec = function (e) { + console.log(e); + alert(e); + }; + } + if (!sc) { + sc = function (d) { console.log(d); }; + } + var url = this.urls.getData; + var rd = { DbName: dbName, Sql: sql, }; + fetch(url, { + method: 'POST', + body: JSON.stringify(rd), + headers: new Headers({ + 'Content-Type': 'application/json' + }) + }).then(res => res.json()).catch(ec).then(sc); + }, //提示消息并记录 showmsg(msg) { console.log(msg);