c++十行代码小游戏_用十行代码快速创建权限管理系统

83b2e2c43792f0b1160063d0fbfa0f7c.png

(坚持做自己)

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

b3a0b5935e3f16f5d131ac0264ffa031.png

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

1、项目背景介绍

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

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

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

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

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

1e9cbc36f1c55330b553562b6e459bd9.png

(BCVP.Sample.OP nuget包)

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

2、从空项目到成品

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

1、新建空项目

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

05daa5f504e8aa0d2d702242b7a12462.png

2、引用nuget包

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

Install-Package BCVP.Sample.OP -Version 1.0.6.34

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

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

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

2f31012c4dc5c392bcfb119f070a4b04.png

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": [    /*      对应下边的 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服务,导入种子数据

先来注册服务:

services.AddBCVPSqlsugarExtensions();

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

app.UseBCVPSeedDataMildd(myContext, env.WebRootPath);

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

public void Configure (IApplicationBuilder app, IWebHostEnvironment env, MyContext myContext)

3ea2fb271243aeabd717a64bd65f02e3.png

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

98d8704cbe035b39749ed509702206de.png

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

ba9f6d41fba5a4bf006dbb423e182385.png

现在仅仅是创建好了数据库,那如何获取对应的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 

2c8e9da26cc8661c18e73f0513c87a31.png

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

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

9、注册Swagger服务

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

注册服务:

services.AddBCVPSwaggerSetup(); 

配置中间件:

 app.UseBCVPSwaggerMildd(); 

10、查看效果

直接来个动图更直观:

846d3f436c65b9be28dd2a7d447919d3.gif

到这里,我们已经使用BCVP创建好了基础项目,也用到了其中的权限认证模块、Swagger文档模块、Autofac容器模块、自动生成种子数据和CodeFirst模块。

但是这里有一个问题,那如果我开发到中期,需要创建自己的实体类和服务仓储层,怎么写呢?别着急已经考虑到了。

3、从基建项目到生产

这里我就简单的列举两个重要功能吧,一个是根据实体类程序集CodeFirst到数据库,另一个是DbFirst生成四层服务文件。

1、根据你的Model生成到数据库

刚刚我们在生成种子数据后,在sqlite中,生成了权限部分的7个表+2个其他表:

f26d2c19b134abd8270d2144fa55e037.png

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

438a57280323a49686a55795ee298418.png

在web层添加model层的引用,编译项目,一切正常。

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

d4e67c428caa99dc9119d144beb389d9.png

2、DdFirst获取四层文件

和上边的一样,还是直接调取接口就行,参数就是你新项目的名称,也是命名空间名。

4cd1e4b3da6212839a29e70001a88ef4.png

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

b493d2a243e2feaf9e6c26ae9728c8e3.png

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

f99c44f40da03fe95a8d67ca9e1dabc7.png

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

50580793dfc3c16507e4c4320e55076c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容: 1、mysql——原始 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848259 存在的问题: 1、新增用户时候id ,删除后再增加会出错,id有冲突; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 2、db_修改过(用户 角色 权限) 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848780 修改的问题: 1、新增用户时候id 改为最大id值加一,之前用的select查看出来的记录数加一,删除后再增加会出错; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 4、修改了用户的表字段信息,新增了认证方式的字段; 5、用户有三种认证方式,当选择口令认证的时候,syn_sn_有输入信息,当选择KEY认证的时候,dyn_pass_sn_字段有输入信息 3、userGroupUser_intfac 文件: 博客的网址:https://blog.csdn.net/weixin_42167759/article/details/80848991 整理的文档: 《Mysql 最后程序的总结—— Linux系统C语言编程连接MySql数据库实现的用户角色权限管理系统》 修改的问题: 1、新增 添加用户组模块; 2、新增 显示用户组模块; 3、修改 新增用户模块 选择 其所属用户组 并把用户id与用户组id 写入用户用户组关系表; 4、新增 修改用户以及删除用户组模块(有用户属于该用户组 用户组名字不允许更改 用户组不允许删除); 5、新增 增加用户、用户组时候,若要增加的用户名已存在(给出用户存在的提示信息); 6、修改了 显示的界面问题; 7、修改部分switch case 输入为字符; 8、修改部分 操作完成后 有两次回车 确认的问题; 遗留的问题: 1、switch case 输入为字符,应该改为case a:bresk; case b:break;…… 否则输入的1与10是一样的执行结果; 字符中只有数字0-9; 2、在remark字段中 scanf()函数是不允许输入空格的。 __________________________________________________________________________________________________ 4、user-role-authoritys-usergroup文件: 数据库的图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值