Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用十行代码快速创建权限管理系统

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

作者头像
老张的哲学
发布于 2022-04-11 07:02:13
发布于 2022-04-11 07:02:13
57700
代码可运行
举报
文章被收录于专栏:NetCore 从壹开始NetCore 从壹开始
运行总次数:0
代码可运行

(坚持做自己)

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

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

1、项目背景介绍

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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包,你可以使用控制台,也可以使用包管理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Install-Package BCVP.Sample.OP -Version 1.0.6.34

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

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

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

3、配置基础的启动服务

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddBCVPServiceInit(Configuration, Env); 

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

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

4、appsettings.json 配置参数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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": [
    /*
      对应下边的 DBType
      MySql = 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服务,导入种子数据

先来注册服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddBCVPSqlsugarExtensions();

然后配置中间件,导入种子数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.UseBCVPSeedDataMildd(myContext, env.WebRootPath);

这里的参数,都是需要注入的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void Configure (IApplicationBuilder app, IWebHostEnvironment env, MyContext myContext)

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

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

现在仅仅是创建好了数据库,那如何获取对应的service和repository呢?

6、注册Autofac服务集合

很简单,还是Autofac容器的创建过程:

StartUp.cs文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void ConfigureContainer(ContainerBuilder builder)
 { 
     builder.RegisterModule(new BCVPAutofacModuleRegister());
 } 

Program.cs文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) 

到这里权限部分的service和repository已经创建好了,接下来就是配置权限和api接口了。

7、注册权限服务

这个操作也是很简单,直接添加注册权限服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddBCVPAuthorizationSetup(); 

当然你也可以自己添加权限服务,我这里已经封装好了JWT和Ids4两种模式,并且可以切换,还是稍微方便些,认证和权限中间件自己看着处理即可。

现在我们有了服务和仓储,也有了权限,那如何使用接口呢,毕竟是要登录吧,毕竟是要获取对应的接口数据、菜单数据等等。

8、引入权限模块api接口

这个操作也是很简单,我把这些controller也封装了一层,你直接引用这个类库就行。

添加api接口controller控制的nuget包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Install-Package BCVP.Sample.Controller -Version 1.0.6.34 

(一个是服务,一个是接口)

这里万事俱备了(还是要强调下,要用最新的版本),来看看效果吧,只需要一个Swagger即可了。

9、注册Swagger服务

这里你可以自己写,也可以使用我封装好的,毕竟已经有权限、自定义展示页、自定义返回策略了:

注册服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddBCVPSwaggerSetup(); 

配置中间件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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的项目,是不是还可以,试试吧。虽然有很多瑕疵,但是已经开始向前走了,不是么。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NetCore 从壹开始 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[BlogCore操作文档1] AppSettings:参数配置获取
很荣幸,也很感谢在过去的四年多的时间,大家对BCVP社区、对BlogCore项目的支持,我也一直没有太推广,也没有申请其他的组织的推广资源,都是靠各位精神股东的默默支持和口口相传,才一直坚持着✨,目前Github的Star数4.2k,Fork数1.2k,也算是国内NetCore项目中,坚持的比较长的了,虽然我在2022年维护不多。不过好在有开发组其他几位小伙伴的帮忙,也是提交了一些Commit的。
老张的哲学
2023/08/23
3110
[BlogCore操作文档1] AppSettings:参数配置获取
多库操作:多个数据库的动态切换(一)
其实说了那么多,就是想实现一个工作,就是多库操作,毕竟这是一个趋势,今天我们就简单说一下多库操作的第一弹 —— 动态切换数据库。过程很简单,这里就先说一下吧。
老张的哲学
2022/04/11
2.2K0
多库操作:多个数据库的动态切换(一)
【BlogBook书】5、Sqlsugar:数据库ORM
框架高度集成国产优秀ORM——Sqlsugar,支持常规企业级所有的数据库操作场景:
老张的哲学
2024/01/15
3640
【BlogBook书】5、Sqlsugar:数据库ORM
【项目升级】集成Quartz.Net Job实现(一)
这两天的新闻也是越来越多了,不仅Github接手了NPM,还有.NET 5也要新鲜出炉了(11月正式发布),当然还有MVP峰会也正在如火如荼的展开,会有哪些好的东西被碰撞出来,也是很期待的。这些天我也简单的开始了学习之路,网路一直不好,直播也就不好展开,但是肯定会有的,应该过不了多久,所以暂时通过文字来讲解吧。
老张的哲学
2022/04/11
6690
【项目升级】集成Quartz.Net Job实现(一)
【BCVP升级】泛型主键的使用
大家假期已经结束了吧,还有80天左右就要到2021年了,你准备好了么?BCVP(Blog.Core&Vue Project)项目已经开源2年多,从来没有停更过,网上出现了很多仿品,当然这是好事儿,我从一开始也是这么鼓励大家的,第一要学习知识点,第二如果学会了自己动手搭一搭,这样不仅自己有了一定的深入理解,从全局上巩固,另外也可以对他人有一个借鉴和参考的不同版本,不过还是建议可以稍微稍稍的说一下,灵感/思路/学习受老张的帮助、影响和借鉴,想必你也明白,一边开源,一边讲解,一边建立社区回答问题,是一个常人无非想象的毅力。最近打算成立一个基于BCVP的开发者社区,感兴趣的可以留言,一起来个Business版本,两三个人即可,是那种真的想设计的,看缘分吧。
老张的哲学
2022/04/11
6990
【BCVP升级】泛型主键的使用
【项目升级】单库、多库、读写分离 · 任你选
本期配套视频: https://www.bilibili.com/video/BV1BJ411B7mn?p=6 继上周增加【任务调度】以后,继续对项目进行2.0版本升级,其实改动的地方并不多,主要的功
老张的哲学
2022/04/11
7680
【项目升级】单库、多库、读写分离 · 任你选
多库操作2:终于实现多个数据库操作
那下面,我们就重新再来说说,【多库】操作到底是怎样的?具体的操作,可以点击【阅读原文】我写的wiki(https://github.com/anjoy8/Blog.Core/wiki/support-muti-db)。
老张的哲学
2022/04/11
2.3K0
多库操作2:终于实现多个数据库操作
【最强VSCode】之管理MySql数据库
你没有看错,就是用VSCode来管理MySql数据库,我也是第一次听说,感谢群管理@DX小伙伴,三人行必有我师焉。
老张的哲学
2022/04/11
4.8K0
【最强VSCode】之管理MySql数据库
【BlogBook书】6、Serilog:日志管理
框架高度集成Serilog,继承ASP.NETCore官方的ILogger<>接口,作为记录整个系统应用生命周期的日志工具,涵盖了平时企业应用的常见场景:
老张的哲学
2024/02/22
2920
【BlogBook书】6、Serilog:日志管理
.NET Core/.NET5/.NET6 开源项目汇总5:(权限)管理系统项目
企业管理系统一般包含后台管理UI、组织机构管理、权限管理、日志、数据访问、表单、工作流等常用必备功能。下面收集的几款优秀开源的管理系统,值得大家入门学习。如有新的优秀项目,我会不断补充。
张传宁IT讲堂
2021/06/29
4.5K0
01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明
将会输出codeFirst执行的脚本 将 assemblyNames 配置的所有实体执行结构移 db.CodeFirst.SyncStructure  1.创建临时表 2.插入历史数据,修改字段名称情况注意 3.删除旧表,重命名临时表为新表 生产上该自己执行脚本的还是自己执行
易墨
2023/08/24
2140
01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明
ABP微服务系列学习-搭建自己的微服务结构(四)
上篇我们实现了认证服务和网关服务,基本我们的基础服务已经完成了,接下来我们才需要做服务的数据迁移。 这里我们需要使用EF的CodeFirst模式。通过DotnetCli的命令去操作:
饭勺oO
2023/10/18
5560
ABP微服务系列学习-搭建自己的微服务结构(四)
【BlogBook书】1、AppSettings:自定义参数配置
本章节是第一种——通过单例模式,将appsettings.json文件中的所有配置,在项目启动的时候,统一添加到了AppSettings对象实例中。
老张的哲学
2024/01/15
2550
【BlogBook书】1、AppSettings:自定义参数配置
从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 前三部分弄完,我们已经可以对内存数据进行CRUD的基本操作,并且可以在asp.net core 2中集成Nlog了。 下面继续: Entity Framework Core 2.0 Entity Framework 是ORM(Object-Relational-Mapping)。ORM是一种让你可以使用面向
solenovex
2018/03/01
2.3K0
从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
Blog.Core 第四季度开源更新说明书
An open-source organization based on .NET/Core and Vue (React/NG) to quickly build MVC & SPA and microservice application.
老张的哲学
2023/01/09
3880
Blog.Core 第四季度开源更新说明书
用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目
上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978.html 如果您对ASP.NET Core很了解的话,可以不看本文, 本文基本都是官方文档的内容。 A
solenovex
2018/05/30
1.1K0
[项目更新] 集成RabbitMQ队列与EventBus总线
终于项目继续迭代更新了,在开源这两年多,也是感谢每一个支持Blog.Core项目的同学,同时也感谢每一个在生产环境中使用,并提出意见和建议的小伙伴,2,606个Star,是我们相互之间共同的努力和肯定,上边的这些都是我和各位使用者提出的需求,刚开始很快,越是到后边,开发起来越难,这里先说明几点问题:
老张的哲学
2022/04/11
1.1K0
[项目更新] 集成RabbitMQ队列与EventBus总线
5分钟快速创建52ABP .NET Core Angular模板
如果您已经购买了52ABP-PRO,那么它会提高您的开发体验和工作效率。本文档的目标是准备在5分钟内创建和运行一个52ABP-PRO项目。
角落的白板报
2019/07/31
1.7K0
5分钟快速创建52ABP .NET Core Angular模板
【Blog.Core简报】切换两种授权认证模式
经过几个月的Is4分支的在线测试,Blog.Core已经完成可以支持IdentityServer4的使用了,并且也已经迁移到了Admin(vuejs),Blog(vuejs),DDD(mvc)三个项目上,未发现问题,同时也是响应群友号召吧,两个分支切换比较麻烦,而且我维护起来也比较累,所以我这两天把两个分支合并到master主分支上了,并且修缮了代码,只需要一键配置,就可以切换两种授权认证模式,那is4分支也要告一段落了,三天后删除。
老张的哲学
2022/04/11
4530
【Blog.Core简报】切换两种授权认证模式
微服务模式下,实现前后端多资源服务调用
Micro Services 首先,我先解释下,文章标题的意思: 咋看起来特别像是一个标题党🙃,可能是我没想好怎么表达,其实白话文就是:在微服务场景下,肯定会有很多子服务API,那多个前端项目如何对接多个后端资源服务器项目呢? 也就是多个前端VUE如何对接多个后端的WebApi项目,这是问题,其实也不难,今天就简单的讨论讨论,我这里列举了三个场景的解决的方案,相信很多人都用过,都是比较主流的方案,文章的末端会有一个思考,就是如何实现第四种方案,这也就是我标题里为啥用微服务的原因了,本文主要是对微软微
老张的哲学
2022/04/11
6950
微服务模式下,实现前后端多资源服务调用
推荐阅读
相关推荐
[BlogCore操作文档1] AppSettings:参数配置获取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验