OsharpNS框架入門教程 1. OsharpNS所需的基礎環境 ok 2. 使用OsharpNS項目模板創建項目 ok 3. 配置資料庫連接串並啟動項目 ok 4. OsharpNS.Swagger使用實例(登錄和授權) ok 5. Angular6的前端項目啟動 ok 6. 使用MySql作為 ...
OsharpNS框架入門教程
- OsharpNS所需的基礎環境 ok
- 使用OsharpNS項目模板創建項目 ok
- 配置資料庫連接串並啟動項目 ok
- OsharpNS.Swagger使用實例(登錄和授權) ok
- Angular6的前端項目啟動 ok
- 使用MySql作為資料庫實例 ok
- 多上下文配置實例 ok
- OsharpNS.Hangfire使用實例
- OsharpNS.Redis啟用實例
- OSharp.Permissions強制註入角色實例
OsharpNS官方資源
- 項目地址:https://github.com/i66soft/osharp-ns20
- 演示地址:https://www.osharp.org/
- 發佈博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html
- VS插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
OsharpNS所需的基礎環境
- OSharpNS始終緊隨微軟的步伐,使用最新版本的 dotnetcore,請前往[Download .NET (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download,"Download .NET (Linux, macOS, and Windows")點擊
Download .NET Core SDK
下載並安裝最新版本的dotnetcore - 下載並安裝.net core開發環境(本人使用VS2017/VS2019作為作為OsharpNS的開發環境,歡迎高手提供VS Code開發和調試.net core程式的方法,這環境太龐大)
- 下載並安裝Angular6的前端開發環境(本人使用VS Code)
使用OsharpNS項目模板創建項目
- 在任意空白目錄,打開
cmd
或者powershell
命令行視窗
- 執行命令
dotnet new -i OSharpNS.Template.Mvc_Angular
- 執行命令
dotnet new osharp_cmd
獲取Osharp安裝腳本,執行完成後,目錄中出現cmd_build.bat
文件
- 雙擊
cmd_build.bat
,並根據要求命名項目名稱(也可以根據喜好對項目進行命名,本示例使用CanDoo.Test作為項目名稱),完成項目創建
配置資料庫連接串並啟動項目
- 打開解決方案
CanDoo.Test.sln
後,各個工程之間的引用關係已配置好,osharp框架的類庫已引用 nuget.org 上的相應版本,並將自動還原好
- 在解決方案上,右擊,點擊
還原Nuget包
,完成相關引用的還原
- 在解決方案上,右擊,點擊
屬性
,更改啟動項目為CanDoo.Test.Web
- 打開
appsettings.Development.json
,對資料庫連接串根據實際進行修改(appsettings.json
為正式發佈時使用的配置文件,調試時使用的是appsettings.Development.json
,請註意區分)
- 運行項目
CanDoo.Test.Web
,如果能看到Swagger
說明運行成功(首次啟動系統自動創建資料庫,初始化相關參數,時間較久)
補充說明:OsharpNS正在大力完善中,更新比較快,如果需要更新OsharpNS的引用,請點擊在解決方案上,右擊,點擊管理解決方案的Nuget程式包...
,切換到更新
標簽,勾選包括預發行版
(因為OsharpNS處於預發行狀態,只更新Osharp相關的即可,其他的預發行的包別去用)
OsharpNS.Swagger使用實例(登錄和授權)
-. 將系統運行起來後,看到Swagger界面,找到/api/Test/Test01
,點擊後展開查看介面信息
-. 點擊Try it out
,再點擊Excute
調用介面
-. Response body
中顯示用戶註冊成功
,系統自動註冊2個用戶,其中用戶名:admin 密碼gmf31529019
為超級管理員用戶
-. 找到介面/api/Identity/JwtokenJwt
,點擊後查看介面信息
-. 點擊Try it out
,輸入用戶名和密碼,再點擊Excute
調用介面
{
"Account": "admin",
"Password": "gmf31529019",
}
-. 查看Response body
中反饋信息中Data的數據比較關鍵
{
"Type": 200,
"Content": "登錄成功",
"Data": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJhZG1pbiIsIm5iZiI6MTU1NTY3NDQyNywiZXhwIjoxNTU1NzYwODI3LCJpYXQiOjE1NTU2NzQ0MjcsImlzcyI6Im9zaGFycCBpZGVudGl0eSIsImF1ZCI6Im9zaGFycCBhbmd1bGFyIGRlbW8ifQ.gJ7QjyoO7VFCuvAW5iVDY2fm9Lt3OWCu4WdXwiUqMKE"
}
-. 回到Swagger最頂部,找到綠色的文字Authorize
,點擊後在彈出視窗的Value
中輸入Bearer
加登錄是反饋的Data
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJhZG1pbiIsIm5iZiI6MTU1NTY3NDQyNywiZXhwIjoxNTU1NzYwODI3LCJpYXQiOjE1NTU2NzQ0MjcsImlzcyI6Im9zaGFycCBpZGVudGl0eSIsImF1ZCI6Im9zaGFycCBhbmd1bGFyIGRlbW8ifQ.gJ7QjyoO7VFCuvAW5iVDY2fm9Lt3OWCu4WdXwiUqMKE
-. 至此訪問其他介面的時候 不會再提示未登錄
Angular6的前端項目啟動
- 下載並安裝node.js,下載地址:https://nodejs.org/en/ ,建議下載LTS版本
- 進入前端目錄
CanDoo.Test\src\ui\ng-alain
,以管理員身份打開PowerShell
- 設置npm的淘寶鏡像倉庫:由於npm的國外倉儲會很慢,所以最好把npm倉庫地址指定國內鏡像,推薦淘寶鏡像
npm config set registry https://registry.npm.taobao.org
- 安裝全局Angular/Cli:如果Angular/Cli沒有安裝,執行如下命令全局安裝Angular
npm install -g @angular/cli
,Angular的快速啟動,請參考Angular官方文檔:https://angular.cn/guide/quickstart - 執行NodeJS包安裝命令
npm install
- 包安裝完成後,輸入項目啟動命令
npm start
,如果運行成功,在瀏覽器中輸入http://localhost:4201/
就能看到界面了 - 重新安裝Angular的方法:https://blog.csdn.net/qq_37692642/article/details/79372105
- 執行
npm install
時候出現錯誤,註意看下Python的Path路徑是否配置了(我本地是裝好Python並且配置好Path的),但是安裝時候還是出錯了,解決時參考的文檔:https://blog.csdn.net/ztz87/article/details/81734916 ,查看錯誤信息是node-sass
安裝失敗,我執行了設置淘寶鏡像npm set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/
,再次運行npm install node-sass
,安裝成功
- 直接使用
用戶名:admin 密碼:gmf31529019
就能進入後臺了 - 非官方的VUE界面,後期會跟隨作者的腳步更新
使用MySql作為資料庫實例
- 刪除
CanDoo.Test.Web
項目Migrations
目錄下的所有文件(這裡的文件是之前按照SqlServer來生成的)
- 刪除
CanDoo.Test.Web
項目Startups
目錄下的SqlServer開頭的2個文件(去掉SqlServer-DefaultDbContext遷移模塊)
- 引用
CanDoo.Test.Web
項目Startups
目錄下的MySql開頭的2個文件(引入MySql-DefaultDbContext遷移模塊)
- 修改
appsettings.Development.json
文件中的連接串
- 打開
程式包管理器控制台
,位於工具
-Nuget包管理器
-程式包管理器控制台
- 在
程式包管理器控制台
執行add-migration init
,生成資料庫遷移腳本
- 在
程式包管理器控制台
執行update-database
,執行資料庫遷移的腳本
- 運行項目
CanDoo.Test.Web
,如果能看到Swagger
說明運行成功,自己再到MySql看看對應的資料庫是否生成
補充說明:當實體欄位調整之後,如果要修改資料庫,重覆執行6,7的操作,可以完成資料庫的更新
多上下文配置實例
-. 項目CanDoo.Test.Core
通過Nuget添加對包OsharpNS
的引用
-. 配置文件appsettings.Development.json
中添加OSharp:DbContexts:MySqlAudit
連接參數
"MySqlAudit": {
"DbContextTypeName": "CanDoo.Test.Core.Entity.MySqlAuditDbContext,OSharp.EntityFrameworkCore",//這裡要註意下
"ConnectionString": "Server=localhost;Port=3306;UserId=root;Password=******;Database=CanDoo.Test.Audit;charset='utf8';Allow User Variables=True",
"DatabaseType": "MySql",
"LazyLoadingProxiesEnabled": true,
"AuditEntityEnabled": true,
"AutoMigrationEnabled": true
}
-. 新建CanDoo.Test.Core.Entity.MySqlAuditDbContext
上下文
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using OSharp.Entity;
namespace CanDoo.Test.Core.Entity
{
public class MySqlAuditDbContext : DbContextBase
{
public MySqlAuditDbContext(DbContextOptions options, IEntityManager entityManager, IServiceProvider serviceProvider) : base(options, entityManager, serviceProvider)
{
}
}
}
-. 創建CanDoo.Test.Web.Startups.MySqlAuditMigrationPack
遷移模塊
using System;
using OSharp.Entity;
using OSharp.Entity.MySql;
using CanDoo.Test.Core.Entity;
using CanDoo.Test.Web.Startups;
namespace CanDoo.Test.Web.Startups
{
/// <summary>
/// MySqlAudit遷移模塊
/// </summary>
public class MySqlAuditMigrationPack : MigrationPackBase<MySqlAuditDbContext>
{
/// <summary>
/// 獲取 模塊啟動順序,模塊啟動的順序先按級別啟動,級別內部再按此順序啟動,
/// 級別預設為0,表示無依賴,需要在同級別有依賴順序的時候,再重寫為>0的順序值
/// </summary>
public override int Order => 2;
protected override DatabaseType DatabaseType { get; } = DatabaseType.MySql;
protected override MySqlAuditDbContext CreateDbContext(IServiceProvider scopedProvider)
{
return new MySqlAuditDesignTimeDbContextFactory(scopedProvider).CreateDbContext(new string[0]);
}
//針對多庫連接的,需要在EntityConfiguration部分增加以下代碼,指定DbContext
//public override Type DbContextType { get; } = typeof(MySqlAuditDbContext);
}
}
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OSharp.Core.Options;
using OSharp.Data;
using OSharp.Entity;
using OSharp.Exceptions;
using OSharp.Extensions;
using OSharp.Reflection;
using CanDoo.Test.Core.Entity;
namespace CanDoo.Test.Web.Startups
{
public class MySqlAuditDesignTimeDbContextFactory : DesignTimeDbContextFactoryBase<MySqlAuditDbContext>
{
private readonly IServiceProvider _serviceProvider;
public MySqlAuditDesignTimeDbContextFactory()
{ }
public MySqlAuditDesignTimeDbContextFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public override string GetConnectionString()
{
if (_serviceProvider == null)
{
IConfiguration configuration = Singleton<IConfiguration>.Instance;
string str = configuration["OSharp:DbContexts:MySqlAudit:ConnectionString"]; //這裡是配置節點的信息 記得修改
return str;
}
OsharpOptions options = _serviceProvider.GetOSharpOptions();
OsharpDbContextOptions contextOptions = options.GetDbContextOptions(typeof(DefaultDbContext));
if (contextOptions == null)
{
throw new OsharpException($"上下文“{typeof(MySqlAuditDbContext)}”的配置信息不存在");
}
return contextOptions.ConnectionString;
}
public override IEntityManager GetEntityManager()
{
if (_serviceProvider != null)
{
return _serviceProvider.GetService<IEntityManager>();
}
IEntityConfigurationTypeFinder typeFinder = new EntityConfigurationTypeFinder(new AppDomainAllAssemblyFinder());
IEntityManager entityManager = new EntityManager(typeFinder);
entityManager.Initialize();
return entityManager;
}
public override bool LazyLoadingProxiesEnabled()
{
if (_serviceProvider == null)
{
IConfiguration configuration = Singleton<IConfiguration>.Instance;
return configuration["OSharp:DbContexts:MySqlAudit:LazyLoadingProxiesEnabled"].CastTo(false); //這裡是配置節點的信息 記得修改
}
OsharpOptions options = _serviceProvider.GetOSharpOptions();
OsharpDbContextOptions contextOptions = options.GetDbContextOptions(typeof(DefaultDbContext));
if (contextOptions == null)
{
throw new OsharpException($"上下文“{typeof(MySqlAuditDbContext)}”的配置信息不存在");
}
return contextOptions.LazyLoadingProxiesEnabled;
}
public override DbContextOptionsBuilder UseSql(DbContextOptionsBuilder builder, string connString)
{
string entryAssemblyName = Assembly.GetExecutingAssembly().GetName().Name;
Console.WriteLine($"entryAssemblyName: {entryAssemblyName}");
return builder.UseMySql(connString, b => b.MigrationsAssembly(entryAssemblyName));
}
}
}
-. 審計功能相關的表使用新的上下文,CanDoo.Test.EntityConfiguration.Systems
中Audit開頭的3個文件都增加以下配置代碼,指定使用MySqlAuditDbContext
public override Type DbContextType { get; } = typeof(MySqlAuditDbContext); //新增此行代碼 指定使用MySqlAuditDbContext 未指定的還是使用DefaultDbContext
using System;
using System.Collections.Generic;
using System.Text;
using CanDoo.Test.Core.Entity;
using CanDoo.Test.Systems.Entities;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using OSharp.Entity;
namespace CanDoo.Test.EntityConfiguration.Systems
{
public class AuditPropertyConfiguration : EntityTypeConfigurationBase<AuditProperty, Guid>
{
public override Type DbContextType { get; } = typeof(MySqlAuditDbContext); //新增此行代碼 指定使用MySqlAuditDbContext 未指定的還是使用DefaultDbContext
/// <summary>
/// 重寫以實現實體類型各個屬性的資料庫配置
/// </summary>
/// <param name="builder">實體類型創建器</param>
public override void Configure(EntityTypeBuilder<AuditProperty> builder)
{
builder.HasIndex(m => m.AuditEntityId);
builder.HasOne(m => m.AuditEntity).WithMany(n => n.Properties).HasForeignKey(m => m.AuditEntityId);
}
}
}
-. 在程式包管理控制臺中執行Add-Migration -Context MySqlAuditDbContext newDbContext
,創建遷移腳本,因系統中存在2個DbContext,所以需要指定上下文-Context MySqlAuditDbContext
-. 在程式包管理控制臺中執行update-database -Context MySqlAuditDbContext