用十行代码快速创建权限管理系统

(坚持做自己)

为了防止说是标题党,我先展示下真是就需要十行代码:

当然还有appsettings.json配置文件,和种子数据文件,这个不算代码之内。

1、项目背景介绍

Blog.Core项目开源也两年了,经过了很多许许多多的小伙伴检查、检测、测试、意见,然后前前后后提交了很多版本,Github上也提交了600+次记录,去年的时候为了方便很多小伙伴使用,我还简单的设计了一个项目模板,通过一键操作,就可以生成自己的项目,如果使用过的可能都知道:

CreateYourProject.bat 
Blog.Core.Webapi.Template.2.1.0.nupkg 

但是这个模板只能是只能创建项目的,却不能像一个ABP那样,可以直接在新建的项目上,通过nuget引用来使用。后来就一直想着做这样的事,也一直在优化整体结构,特别是我把那些比较重要且基础的扩展服务单提出来一层后,封装起来就更简单了,内容详见:

《【Blog.Core重要升级】:封装服务扩展层》

这几天终于抽出来所剩不多的时间封装了nuget组件,可以很方便的直接在自己新建的空项目中,基于Blog.Core项目快速搭建初始化权限管理项目,今天这篇文章就是一个操作文档,仅仅需要十行代码就能创建好这个基建项目。

(BCVP.Sample.OP nuget包)

PS:这里说明下,自己新建的项目尽量还是要和Blog.Core整体一致哟,当然,不一致也可以,等你使用了就知道了,前提是Blog.Core项目真的看懂了

2、从空项目到成品

接下来我只说步骤,里边涉及的操作和封装原理,就不说了,感兴趣的可以F12查看源码,或者去Github上下载查看。

1、新建空项目

这里我们还是新建一个空的ASP.NETCore的webapi项目,当然你也可以尝试使用MVC项目,其实都是一样的:

2、引用nuget包

直接在刚刚创建的项目里,安装nuget包,你可以使用控制台,也可以使用包管理器:

Install-Package BCVP.Sample.OP -Version 1.0.6.34

注意截至发稿使用最新版本是1.0.6.34(如果有最新的,请直接用更新的)。

.OP其实是一个控制台项目,主要包含仓储+服务+接口的那些操作,以及下文要说到的数据迁移的内容。

除了引用service层,它还引用了BCVP.Sample.Extensions,组件.Extensions是一个类库,封装了整个项目中的扩展服务。

3、配置基础的启动服务

既然要使用BCVP的内容,肯定基础服务要配置的:

services.AddBCVPServiceInit(Configuration, Env); 

注意这里需要用到两个参数,你自己在startup构造函数中注入就行。

F6编译,没有问题,这里我们已经把BCVP给继承上了,最基础版本,接下来就是要导入数据和创建数据库了。

4、appsettings.json 配置参数

如果要使用数据库和种子数据,肯定就需要配置,我们直接把Blog.Core中的appsettings.json文件直接copy过去就行了。

{"Logging": {"IncludeScopes": false,"Debug": {"LogLevel": {"Default": "Warning"}},"Console": {"LogLevel": {"Default": "Warning","Microsoft.Hosting.Lifetime": "Debug"}},"Log4Net": {"Name": "Blog.Core"}},//"urls": "http://localhost:8081",// IIS 部署,注释掉"AllowedHosts": "*","AppSettings": {"RedisCachingAOP": {"Enabled": false,"ConnectionString": "127.0.0.1:6319"},"MemoryCachingAOP": {"Enabled": true},"LogAOP": {"Enabled": false},"TranAOP": {"Enabled": false},"SqlAOP": {"Enabled": false},"Date": "2018-08-28","SeedDBEnabled": true, //只生成表结构"SeedDBDataEnabled": true, //生成表,并初始化数据"Author": "Blog.Core"},// 请配置MainDB为你想要的主库的ConnId值,并设置对应的Enabled为true;// *** 单库操作,把 MutiDBEnabled 设为false ***;// *** 多库操作,把 MutiDBEnabled 设为true,其他的从库Enabled也为true **;// 具体配置看视频:https://www.bilibili.com/video/BV1BJ411B7mn?p=6"MainDB": "WMBLOG_SQLITE", //当前项目的主库,所对应的连接字符串的Enabled必须为true"MutiDBEnabled": false, //是否开启多库模式"CQRSEnabled": false, //是否开启读写分离模式,必须是单库模式,且数据库类型一致,比如都是SqlServer"DBS": [/*对应下边的 DBTypeMySql = 0,SqlServer = 1,Sqlite = 2,Oracle = 3,PostgreSQL = 4*/{"ConnId": "WMBLOG_SQLITE","DBType": 2,"Enabled": true,"HitRate": 50, // 值越大,优先级越高"Connection": "WMBlog.db" //sqlite只写数据库名就行},{"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的项目,是不是还可以,试试吧。虽然有很多瑕疵,但是已经开始向前走了,不是么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ERP的配置管理实践

源宝导读:随着ERP系统的日益复杂,应用部署的方式越来越复杂,应用的配置也变得越来越庞杂,难以维护和管理。本文将介绍配置中心服务通过集中化、可离线的架构设计,解决ERP配置问题的实践经验。一、背景随着ERP业务的日益…

《LIO-SAM阅读笔记》1.IMU预积分模块

前言: LIO-SAM是一个多传感器融合的紧耦合SLAM框架,融合的传感器类型有雷达、IMU和GPS,其中雷达和IMU在LIO-SAM框架中必须使用的。LIO-SAM的优化策略采用了GTSAM库,GTSAM库采用了因子图的优化方法,其提供了一些列C的外…

EntityFramework Core 迁移忽略主外键关系

【导读】本文来源于一位公众号童鞋私信我的问题,在我稍加思索后给出了如下一种方案,在此之前我也思考过这个问题,借此机会我稍微看了下,目前能够想到的也只是本文所述方案。为何要忽略主外键关系我们不仅疑惑为何要忽略主外键关系…

你很可能需要知道这个调试小技巧

缘起 最近在调试的时候,需要观察第三方容器中每一个元素的值。默认情况下,vs 并不知道如何显示第三方容器的内容,只能手动观察容器中的每一个值,超级不方便。我找到一个非常给力的好办法,你还知道其它好办法吗&#xf…

全宇宙首本 VS Code 中文书,来了!

大家好!我是韩骏,VS Code 中文社区创始人,VS Code 的代码贡献者。2013 年,毕业于上海交通大学软件学院,现在是微软开发平台事业部的软件工程师。写过 20 多款 VS Code 插件,其中最热门的 Code Runner 插件有…

C# 从1到Core--委托与事件

委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。一、C#1.0 从委托开始1. 基本方式什么是委托,就不说概念了,用例子说话…

开源导入导出库Magicodes.IE 多sheet导入教程

多Sheet导入教程说明本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入。要点多个相同格式的Sheet数据导入多个不同格式的Sheet数据导入主要步骤1. 多个相同格式的Sheet数据导入1.1 创建导入Sheet的Dto主要代码如下所示&#xff1a;学生数据Dto/// <su…

解决 Azure AD 在 Azure Front Door 下登录失败的问题

点击上方关注“汪宇杰博客” ^_^导语最近我给博客系统加上了 Azure Front Door&#xff0c;集齐了12项 Azure 服务打算召唤神龙。没想到刚上线&#xff0c;Azure AD 的单点登录就爆了。OIDC 跳转错误当我尝试登录博客后台的时候&#xff0c;OIDC的跳转URL突然变成了 https://ed…

《Unit Testing》2.1 经典学派如何做测试隔离

经典学派如何解决隔离问题首先&#xff0c;再回顾一下单元测试的三个重要特性&#xff1a;验证一小段代码&#xff08;或者叫一个单元&#xff09;执行速度快使用隔离的方式进行针对第一个特性就会引出一个问题&#xff1a;多小的一段代码才足够小&#xff1f;如果你采用针对每…

Hacker News热文:请停止学习框架,学习领域驱动设计(DDD)(获500个点赞)

在 Hacker News 上获得接近 500 个点赞的一篇名为《停止学习框架》的文章称&#xff1a;我们是程序员&#xff0c;每天都在了解最新的技术&#xff0c;每天都在学习编程语言、框架和库&#xff0c;因为我们知道的现代编程工具越多越好&#xff0c;对吧&#xff1f;不停地追随 A…

C#跨平台开源项目实战(WPF/Android/IOS/Blazor)

个人介绍由于本人从业WPF开发, 考虑到国内的WPF开发环境并不是很好, 资源少、项目案例少, 所以导致很多初学者就已经断了念头。所以我作为WPF的从业者, 就在2019年,开始了发布自己的WPF相关的免费教学视频。发布开源的项目实践, WPF的基础视频、项目实践视频, 包括WPF UI设计视…

[开源] .Net 使用 ORM 访问 神舟通用数据库(神通)

前言天津神舟通用数据技术有限公司&#xff08;简称“神舟通用公司”&#xff09;&#xff0c;隶属于中国航天科技集团&#xff08;CASC&#xff09;。是国内从事数据库、大数据解决方案和数据挖掘分析产品研发的专业公司。公司获得了国家核高基科技重大专项重点支持&#xff0…

在 Xunit 中使用依赖注入

在 Xunit 中使用依赖注入Intro之前写过一篇 xunit 的依赖注入相关的文章&#xff0c;但是实际使用起来不是那么方便今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection, 来自大师的作品&#xff0c;让你在测试代码里使用依…

C#由转换二进制所引起的思考,了解下?

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

.Net Core In Docker 在容器内编译并发布

Docker可以说是现在微服务&#xff0c;DevOps的基础&#xff0c;咱们.Net Core自然也得上Docker。.Net Core发布到Docker容器的教程网上也有不少&#xff0c;但是今天还是想来写一写。你搜.Net core程序发布到Docker网上一般常见的有两种方案&#xff1a;1、在本地编译成Dll文件…

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年&#xff0c;以 docker、kubernetes 为代表的容器技术已发展为一项通用技术&#xff0c;BAT、滴滴、京东、头条等大厂&#xff0c;都争相把容器和 k8s 项目作为技术重心&#xff0c;试图“放长线钓大鱼”。就说腾讯吧&#xff0c;目前基本所有业务都跑在云上&#xff0…

C# 9.0 新特性之 Lambda 弃元参数

阅读本文大概需要不到 1 分钟。弃元&#xff08;Discards&#xff09; 是在 C# 7.0 的时候开始支持的&#xff0c;它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的&#xff0c;但它却不被分配存储空间&#xff0c;即没有值&#xff0c;所以不能从中读取值。弃元用…

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星&#xff0c;其本质是反向代理负载均衡类软件&#xff0c;领域上归于应用交付&#xff0c;那么作为应用交付领域的老兵如何看待 Envoy&#xff0c;Envoy 又引发了哪些关于传统应用交付领域的思考&#xff1f;关于作者林静&#xff0c;F5 软件方向解决方…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间&#xff0c;陆陆续续的把手里头项目都迁移到了k8s中&#xff0c;期间遇到很多的坑&#xff0c;并且也学到了许多k8s的知识&#xff08;从0-1&#xff09;&#xff0c;大家都知道k8s中的一大特性是自动扩容&#xff0c;对此结合自己的业务发现很是有“用武之地…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「149」篇原创敬上大家好&#xff0c;我是Z哥。不管是日常的工作中还是生活中&#xff0c;我们每天会用到很多软件系统。不知道你有没有过这样的感受&#xff0c;当…