"ConnId": "WMBLOG_MSSQL_1",
"DBType": 1,
"Enabled": true,
"HitRate": 40,
"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_1;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
"ProviderName": "System.Data.SqlClient"
},
{
"ConnId": "WMBLOG_MSSQL_2",
"DBType": 1,
"Enabled": true,
"HitRate": 30,
"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
"ProviderName": "System.Data.SqlClient"
},
{
"ConnId": "WMBLOG_MYSQL",
"DBType": 0,
"Enabled": true,
"HitRate": 20,
"Connection": "Server=localhost; Port=3306;Stmt=; Database=wmblogdb; Uid=root; Pwd=456;"
},
{
"ConnId": "WMBLOG_ORACLE",
"DBType": 3,
"Enabled": false,
"HitRate": 10,
"Connection": "Provider=OraOLEDB.Oracle; Data Source=WMBlogDB; User Id=sss; Password=789;",
"OracleConnection_other1": "User ID=sss;Password=789;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.8.65)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = orcl)))"
}
],
"Audience": {
"Secret": "sdfsdfsrty45634kkhllghtdgdfss345t678fs", //不要太短,16位+
"SecretFile": "C:\\my-file\\blog.core.audience.secret.txt", //安全。内容就是Secret
"Issuer": "Blog.Core",
"Audience": "wr"
},
"Startup": {
"Cors": {
"IPs": "http://127.0.0.1:2364,http://localhost:2364,http://localhost:8080,http://localhost:8021,http://localhost:1818"
},
"AppConfigAlert": {
"Enabled": true
},
"ApiName": "Blog.Core",
"IdentityServer4": {
"Enabled": false, // 这里默认是false,表示使用jwt,如果设置为true,则表示系统使用Ids4模式
"AuthorizationUrl": "https://ids.neters.club", // 认证中心域名
"ApiName": "blog.core.api" // 资源服务器
}
},
"Middleware": {
"RequestResponseLog": {
"Enabled": false
},
"IPLog": {
"Enabled": true
},
"RecordAllLogs": {
"Enabled": false
},
"SignalR": {
"Enabled": false
},
"QuartzNetJob": {
"Enabled": true
},
"Consul": {
"Enabled": false
},
"IpRateLimit": {
"Enabled": true
}
},
"IpRateLimiting": {
"EnableEndpointRateLimiting": true, //False: globally executed, true: executed for each
"StackBlockedRequests": false, //False: Number of rejections should be recorded on another counter
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"IpWhitelist": [], //白名单
"EndpointWhitelist": [ "get:/api/xxx", "*:/api/yyy" ],
"ClientWhitelist": [ "dev-client-1", "dev-client-2" ],
"HttpStatusCode": 429, //返回状态码
"GeneralRules": [ //api规则,结尾一定要带*
{
"Endpoint": "*:/api/blog*",
"Period": "1m",
"Limit": 20
},
{
"Endpoint": "*/api/*",
"Period": "1s",
"Limit": 3
},
{
"Endpoint": "*/api/*",
"Period": "1m",
"Limit": 30
},
{
"Endpoint": "*/api/*",
"Period": "12h",
"Limit": 500
}
]
},
"ConsulSetting": {
"ServiceName": "BlogCoreService",
"ServiceIP": "localhost",
"ServicePort": "8081",
"ServiceHealthCheck": "/healthcheck",
"ConsulAddress": "http://localhost:8500"
}
}
在这里配置好自己的数据库连接字符串即可。
5、注册SqlSugar服务,导入种子数据
先来注册服务:
services.AddBCVPSqlsugarExtensions();
然后配置中间件,导入种子数据:
app.UseBCVPSeedDataMildd(myContext, env.WebRootPath);
这里的参数,都是需要注入的:
public void Configure (IApplicationBuilder app, IWebHostEnvironment env, MyContext myContext)

接下来,把种子数据拷贝到wwwroot文件夹(没有的话自己创建)下:

编译没问题,直接F5运行,用控制台方式打开,你就可以看到数据库已经生成成功了:

现在仅仅是创建好了数据库,那如何获取对应的service和repository呢?
6、注册Autofac服务集合
很简单,还是Autofac容器的创建过程:
StartUp.cs文件
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new BCVPAutofacModuleRegister());
}
Program.cs文件
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
到这里权限部分的service和repository已经创建好了,接下来就是配置权限和api接口了。
7、注册权限服务
这个操作也是很简单,直接添加注册权限服务:
services.AddBCVPAuthorizationSetup();
当然你也可以自己添加权限服务,我这里已经封装好了JWT和Ids4两种模式,并且可以切换,还是稍微方便些,认证和权限中间件自己看着处理即可。
现在我们有了服务和仓储,也有了权限,那如何使用接口呢,毕竟是要登录吧,毕竟是要获取对应的接口数据、菜单数据等等。
8、引入权限模块api接口
这个操作也是很简单,我把这些controller也封装了一层,你直接引用这个类库就行。
添加api接口controller控制的nuget包:
Install-Package BCVP.Sample.Controller -Version 1.0.6.34

(一个是服务,一个是接口)
这里万事俱备了(
还是要强调下,要用最新的版本
),来看看效果吧,只需要一个Swagger即可了。
9、注册Swagger服务
这里你可以自己写,也可以使用我封装好的,毕竟已经有权限、自定义展示页、自定义返回策略了:
注册服务:
services.AddBCVPSwaggerSetup();
配置中间件:
app.UseBCVPSwaggerMildd();
10、查看效果
直接来个动图更直观:

到这里,我们已经使用BCVP创建好了基础项目,也用到了其中的权限认证模块、Swagger文档模块、Autofac容器模块、自动生成种子数据和CodeFirst模块。
但是这里有一个问题,那如果我开发到中期,需要创建自己的实体类和服务仓储层,怎么写呢?别着急已经考虑到了。
3、从基建项目到生产
这里我就简单的列举两个重要功能吧,一个是根据实体类程序集CodeFirst到数据库,另一个是DbFirst生成四层服务文件。
1、根据你的Model生成到数据库
刚刚我们在生成种子数据后,在sqlite中,生成了权限部分的7个表+2个其他表:

然后在项目中,新建一个model层,创建一个NetersClub表,添加SqlSugarCore的nuget包引用:

在web层添加model层的引用,编译项目,一切正常。
然后直接执行接口即可,已经封装到了BCVP.Sample.Controller:直接执行这个接口,然后配置这两个参数,第一个是实体model层的程序集名称,注意要带后缀.dll,第二个是控制某特定命名空间下的实体才会被CodeFirst:

2、DdFirst获取四层文件
和上边的一样,还是直接调取接口就行,参数就是你新项目的名称,也是命名空间名。

然后就在c盘下生成了我们指定的文件:

点开来,可以看到所以的实体对应的服务都有,而且刚刚我们创建的实体NetersClub.cs也生成了:

总体来说,通过引用相应的Nuget包,然后大概十行配置代码,就可以快速的开发一个基于BCVP的项目,是不是还可以,试试吧。虽然有很多瑕疵,但是已经开始向前走了,不是么。
