(堅持做自己)
為了防止說是標題黨,我先展示下真是就需要十行代碼:
當然還有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的項目,是不是還可以,試試吧。雖然有很多瑕疵,但是已經開始向前走了,不是么。
總結
以上是生活随笔為你收集整理的用十行代码快速创建权限管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。