OsharpNS框架简明入门教程--适合小白和第一次接触
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