欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

OsharpNS框架简明入门教程--适合小白和第一次接触

程序员文章站 2022-09-10 14:57:17
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命令行窗口
    OsharpNS框架简明入门教程--适合小白和第一次接触
  2. 执行命令dotnet new -i osharpns.template.mvc_angular
    OsharpNS框架简明入门教程--适合小白和第一次接触
  3. 执行命令dotnet new osharp_cmd获取osharp安装脚本,执行完成后,目录中出现cmd_build.bat文件
    OsharpNS框架简明入门教程--适合小白和第一次接触
  4. 双击cmd_build.bat,并根据要求命名项目名称(也可以根据喜好对项目进行命名,本示例使用candoo.test作为项目名称),完成项目创建
    OsharpNS框架简明入门教程--适合小白和第一次接触

配置数据库连接串并启动项目

  1. 打开解决方案candoo.test.sln后,各个工程之间的引用关系已配置好,osharp框架的类库已引用 nuget.org 上的相应版本,并将自动还原好
    OsharpNS框架简明入门教程--适合小白和第一次接触
  2. 在解决方案上,右击,点击还原nuget包,完成相关引用的还原
    OsharpNS框架简明入门教程--适合小白和第一次接触
  3. 在解决方案上,右击,点击属性,更改启动项目为candoo.test.web
    OsharpNS框架简明入门教程--适合小白和第一次接触
  4. 打开appsettings.development.json,对数据库连接串根据实际进行修改(appsettings.json为正式发布时使用的配置文件,调试时使用的是appsettings.development.json,请注意区分)
    OsharpNS框架简明入门教程--适合小白和第一次接触
  5. 运行项目candoo.test.web,如果能看到swagger说明运行成功(首次启动系统自动创建数据库,初始化相关参数,时间较久)
    OsharpNS框架简明入门教程--适合小白和第一次接触
    补充说明:osharpns正在大力完善中,更新比较快,如果需要更新osharpns的引用,请点击在解决方案上,右击,点击管理解决方案的nuget程序包...,切换到更新标签,勾选包括预发行版(因为osharpns处于预发行状态,只更新osharp相关的即可,其他的预发行的包别去用)
    OsharpNS框架简明入门教程--适合小白和第一次接触

osharpns.swagger使用实例(登录和授权)

-. 将系统运行起来后,看到swagger界面,找到/api/test/test01,点击后展开查看接口信息
OsharpNS框架简明入门教程--适合小白和第一次接触
-. 点击try it out,再点击excute调用接口
-. response body中显示用户注册成功,系统自动注册2个用户,其中用户名:admin 密码gmf31529019为超级管理员用户
OsharpNS框架简明入门教程--适合小白和第一次接触
-. 找到接口/api/identity/jwtokenjwt,点击后查看接口信息
-. 点击try it out,输入用户名和密码,再点击excute调用接口

{
  "account": "admin",
  "password": "gmf31529019",
}

OsharpNS框架简明入门教程--适合小白和第一次接触
-. 查看response body中反馈信息中data的数据比较关键

{
  "type": 200,
  "content": "登录成功",
  "data": "eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjuyw1lawqioiixiiwidw5pcxvlx25hbwuioijhzg1pbiisim5izii6mtu1nty3ndqynywizxhwijoxntu1nzywodi3lcjpyxqioje1ntu2nzq0mjcsimlzcyi6im9zagfyccbpzgvudgl0esisimf1zci6im9zagfyccbhbmd1bgfyigrlbw8ifq.gj7qjyoo7vfcuvaw5ivdy2fm9lt3owcu4wdxwiuqmke"
}

OsharpNS框架简明入门教程--适合小白和第一次接触
-. 回到swagger最顶部,找到绿色的文字authorize,点击后在弹出窗口的value中输入bearer加登录是反馈的data

bearer eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjuyw1lawqioiixiiwidw5pcxvlx25hbwuioijhzg1pbiisim5izii6mtu1nty3ndqynywizxhwijoxntu1nzywodi3lcjpyxqioje1ntu2nzq0mjcsimlzcyi6im9zagfyccbpzgvudgl0esisimf1zci6im9zagfyccbhbmd1bgfyigrlbw8ifq.gj7qjyoo7vfcuvaw5ivdy2fm9lt3owcu4wdxwiuqmke

OsharpNS框架简明入门教程--适合小白和第一次接触
OsharpNS框架简明入门教程--适合小白和第一次接触

-. 至此访问其他接口的时候 不会再提示未登录

angular6的前端项目启动

  1. 下载并安装node.js,下载地址:https://nodejs.org/en/ ,建议下载lts版本
  2. 进入前端目录candoo.test\src\ui\ng-alain,以管理员身份打开powershell
    OsharpNS框架简明入门教程--适合小白和第一次接触
  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
    OsharpNS框架简明入门教程--适合小白和第一次接触
  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,安装成功
    OsharpNS框架简明入门教程--适合小白和第一次接触
    OsharpNS框架简明入门教程--适合小白和第一次接触
  9. 直接使用用户名:admin 密码:gmf31529019就能进入后台了
  10. 非官方的vue界面,后期会跟随作者的脚步更新

使用mysql作为数据库实例

  1. 删除candoo.test.web项目migrations目录下的所有文件(这里的文件是之前按照sqlserver来生成的)
    OsharpNS框架简明入门教程--适合小白和第一次接触
  2. 删除candoo.test.web项目startups目录下的sqlserver开头的2个文件(去掉sqlserver-defaultdbcontext迁移模块)
    OsharpNS框架简明入门教程--适合小白和第一次接触
  3. 引用candoo.test.web项目startups目录下的mysql开头的2个文件(引入mysql-defaultdbcontext迁移模块)
    OsharpNS框架简明入门教程--适合小白和第一次接触
    OsharpNS框架简明入门教程--适合小白和第一次接触
  4. 修改appsettings.development.json文件中的连接串
    OsharpNS框架简明入门教程--适合小白和第一次接触
  5. 打开程序包管理器控制台,位于工具-nuget包管理器-程序包管理器控制台
    OsharpNS框架简明入门教程--适合小白和第一次接触
  6. 程序包管理器控制台执行add-migration init,生成数据库迁移脚本
    OsharpNS框架简明入门教程--适合小白和第一次接触
  7. 程序包管理器控制台执行update-database,执行数据库迁移的脚本
    OsharpNS框架简明入门教程--适合小白和第一次接触
  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