OsharpNS框架簡明入門教程--適合小白和第一次接觸

来源:https://www.cnblogs.com/candoo/archive/2019/04/20/10743282.html
-Advertisement-
Play Games

OsharpNS框架入門教程 1. OsharpNS所需的基礎環境 ok 2. 使用OsharpNS項目模板創建項目 ok 3. 配置資料庫連接串並啟動項目 ok 4. OsharpNS.Swagger使用實例(登錄和授權) ok 5. Angular6的前端項目啟動 ok 6. 使用MySql作為 ...


OsharpNS框架入門教程

  1. OsharpNS所需的基礎環境 ok
  2. 使用OsharpNS項目模板創建項目 ok
  3. 配置資料庫連接串並啟動項目 ok
  4. OsharpNS.Swagger使用實例(登錄和授權) ok
  5. Angular6的前端項目啟動 ok
  6. 使用MySql作為資料庫實例 ok
  7. 多上下文配置實例 ok
  8. OsharpNS.Hangfire使用實例
  9. OsharpNS.Redis啟用實例
  10. OSharp.Permissions強制註入角色實例

OsharpNS官方資源

  1. 項目地址:https://github.com/i66soft/osharp-ns20
  2. 演示地址:https://www.osharp.org/
  3. 發佈博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html
  4. VS插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp

OsharpNS所需的基礎環境

  1. OSharpNS始終緊隨微軟的步伐,使用最新版本的 dotnetcore,請前往[Download .NET (Linux, macOS, and Windows)](https://dotnet.microsoft.com/download,"Download .NET (Linux, macOS, and Windows")點擊Download .NET Core SDK下載並安裝最新版本的dotnetcore
  2. 下載並安裝.net core開發環境(本人使用VS2017/VS2019作為作為OsharpNS的開發環境,歡迎高手提供VS Code開發和調試.net core程式的方法,這環境太龐大)
  3. 下載並安裝Angular6的前端開發環境(本人使用VS Code)

使用OsharpNS項目模板創建項目

  1. 在任意空白目錄,打開cmd或者powershell命令行視窗
    打開powershell
  2. 執行命令dotnet new -i OSharpNS.Template.Mvc_Angular
    獲取命令
  3. 執行命令dotnet new osharp_cmd獲取Osharp安裝腳本,執行完成後,目錄中出現cmd_build.bat文件
    獲取安裝腳本
  4. 雙擊cmd_build.bat,並根據要求命名項目名稱(也可以根據喜好對項目進行命名,本示例使用CanDoo.Test作為項目名稱),完成項目創建
    項目創建完成

配置資料庫連接串並啟動項目

  1. 打開解決方案CanDoo.Test.sln後,各個工程之間的引用關係已配置好,osharp框架的類庫已引用 nuget.org 上的相應版本,並將自動還原好
    自動生成的項目結構
  2. 在解決方案上,右擊,點擊還原Nuget包,完成相關引用的還原
    還原Nuget包
  3. 在解決方案上,右擊,點擊屬性,更改啟動項目為CanDoo.Test.Web
    更改啟動項
  4. 打開appsettings.Development.json,對資料庫連接串根據實際進行修改(appsettings.json為正式發佈時使用的配置文件,調試時使用的是appsettings.Development.json,請註意區分)
    修改連接串
  5. 運行項目CanDoo.Test.Web,如果能看到Swagger說明運行成功(首次啟動系統自動創建資料庫,初始化相關參數,時間較久)
    運行成功
    補充說明:OsharpNS正在大力完善中,更新比較快,如果需要更新OsharpNS的引用,請點擊在解決方案上,右擊,點擊管理解決方案的Nuget程式包...,切換到更新標簽,勾選包括預發行版(因為OsharpNS處於預發行狀態,只更新Osharp相關的即可,其他的預發行的包別去用)
    更新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"
}

登錄成功,獲得Token
-. 回到Swagger最頂部,找到綠色的文字Authorize,點擊後在彈出視窗的Value中輸入Bearer加登錄是反饋的Data

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJhZG1pbiIsIm5iZiI6MTU1NTY3NDQyNywiZXhwIjoxNTU1NzYwODI3LCJpYXQiOjE1NTU2NzQ0MjcsImlzcyI6Im9zaGFycCBpZGVudGl0eSIsImF1ZCI6Im9zaGFycCBhbmd1bGFyIGRlbW8ifQ.gJ7QjyoO7VFCuvAW5iVDY2fm9Lt3OWCu4WdXwiUqMKE

準備輸入Token
輸入Token

-. 至此訪問其他介面的時候 不會再提示未登錄

Angular6的前端項目啟動

  1. 下載並安裝node.js,下載地址:https://nodejs.org/en/ ,建議下載LTS版本
  2. 進入前端目錄CanDoo.Test\src\ui\ng-alain,以管理員身份打開PowerShell
  3. 設置npm的淘寶鏡像倉庫:由於npm的國外倉儲會很慢,所以最好把npm倉庫地址指定國內鏡像,推薦淘寶鏡像npm config set registry https://registry.npm.taobao.org
  4. 安裝全局Angular/Cli:如果Angular/Cli沒有安裝,執行如下命令全局安裝Angularnpm install -g @angular/cli,Angular的快速啟動,請參考Angular官方文檔:https://angular.cn/guide/quickstart
  5. 執行NodeJS包安裝命令npm install
  6. 包安裝完成後,輸入項目啟動命令npm start,如果運行成功,在瀏覽器中輸入http://localhost:4201/就能看到界面了
  7. 重新安裝Angular的方法:https://blog.csdn.net/qq_37692642/article/details/79372105
  8. 執行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,安裝成功
    運行過程失敗
    最終成功
  9. 直接使用用戶名:admin 密碼:gmf31529019就能進入後臺了
  10. 非官方的VUE界面,後期會跟隨作者的腳步更新

使用MySql作為資料庫實例

  1. 刪除CanDoo.Test.Web項目Migrations目錄下的所有文件(這裡的文件是之前按照SqlServer來生成的)
    刪除SqlServer遷移代碼
  2. 刪除CanDoo.Test.Web項目Startups目錄下的SqlServer開頭的2個文件(去掉SqlServer-DefaultDbContext遷移模塊)
    刪除SqlServer遷移模塊
  3. 引用CanDoo.Test.Web項目Startups目錄下的MySql開頭的2個文件(引入MySql-DefaultDbContext遷移模塊)
    添加MySql遷移模塊
    添加MySql遷移模塊2
  4. 修改appsettings.Development.json文件中的連接串
    修改連接串
  5. 打開程式包管理器控制台,位於工具-Nuget包管理器-程式包管理器控制台
    打開程式包管理控制台
  6. 程式包管理器控制台執行add-migration init,生成資料庫遷移腳本
    生成資料庫遷移代碼
  7. 程式包管理器控制台執行update-database,執行資料庫遷移的腳本
    更新資料庫
  8. 運行項目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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.StackExchange.Redis StackExchange.Redis是由Stack Overflow開發的C#語言Redis客戶端,使用廣泛,本文針對 StackExchange.Redis 進一步擴展使之支持實體 二. 使用Demo 1. 安裝 2. Demo 移步我的項目https ...
  • 建造者模式簡介 建造者模式又稱生成器模式,它將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。這就要求,我們所要處理的對象必須要有非常強的結構化特征,對於開發人員而言,需要抽象出一般的結構化介面出來,方便進行構建工作。 作為一名碼農,最難得的應該就是找對象了,就算勉強找到了, ...
  • 又是一年金三銀四,應該不少小伙伴開始摩拳擦掌準備換個好工作了吧?想要在尋找工作中突出自我,穩穩在大浪淘沙的職場中立足,掌握一些專業工具是很有必要的,今天要給職場人分享投遞簡歷如何選擇安全、便捷的電子郵箱三大法則,作為能力不差、想要變成更好自己的你,值得花2分鐘瞭解一下。 電子郵件的安全性為何如此重要 ...
  • WPF窗體中建有一個DataGrid,運行後修改各行數據,通過Update方法更新後臺資料庫。發現在資料庫中,其中一列FAcctID(文本型)每次都會變為0,還有一列FDebit(貨幣型)不能更新,其他列則沒有問題。主要代碼如下: 排查了好幾個小時,對Xaml代碼綁定、Parameter參數進行修改 ...
  • 在平常得編程中,經常會用到觀察者模式,屬於使用場景很頻繁得設計模式之一。 學習設計模式得目的,知道在何種場景中使用合適得設計模式。 以下我將從現實得場景出發去講設計模式得運用,從比較中去看出優勢 1.觀察者模式得定義 目標狀態發生變化得時候把他得信息通知給註冊過得觀察者們。 當一個對象改變需要同時通 ...
  • 問題描述 在傳統的基於 .NET Framework 的 WPF 程式中,我們可以使用如下代碼段啟動相關的預設應用: 但是上述協議方式在 .NET Core 中不再適用,當我們使用上述方式進行操作,程式會給我們爆如下的錯誤: 經 "神樹桜乃" 大佬提醒,我特意看了一下 ProcessStartInf ...
  • 20190421asp.netajax與jquery和bootstrap的無刷新完美實現 設計代碼和後臺代碼中重要部分加粗和深色以及字型大小加大。 設計前臺代碼: <%@ Page Title="添加/修改商家" Language="C#" MasterPageFile="~/Site_cg007.Ma ...
  • 開場一些題外話,今天登陸這個"小菜"的博客園,感觸頗多。"小菜"是我以前在QQ群裡面的網名,同時也申請了這個博客園賬戶,五年前的"小菜"在NET和C++某兩個群裡面非常的活躍,也非常熱心的幫助網友盡能力所及解決技術上的問題。依稀記得當時NET群裡面的"青菊、Allen、酷酷",C++群裡面的"夏老師 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...