• 系列教程
  • 开发文档
MySQL常见面试题
MySQL常见面试题
.NET Core基于abp vnext 开发个人网站【专题】
.NET Core基于abp vnext 开发个人网站【专题】
网站SEO优化专题,让搜索引擎对网站更有亲和力
网站SEO优化专题,让搜索引擎对网站更有亲和力
abp+vue-element-admin搭建个人网站
abp+vue-element-admin搭建个人网站
C# linq如何使用,无法识别方法等问题专场
C# linq如何使用,无法识别方法等问题专场
vs code 编辑器基础使用专题
vs code 编辑器基础使用专题
.NET/.NET Core面试题
.NET/.NET Core面试题
  • MySQL TRIM() 函数

    MySQLTRIM()函数从指定字符串的开头、结尾或者两端删除由指定字符组成的最长字符串。如果只想删除字符串的前导空格,请使用LTRIM()函数;如果只想删除字符串的尾随空格,请使用RTRIM()函数。TRIM()语法这里是MySQLTRIM()函数的几种不同的用法:TRIM(str)TRIM(re

  • .NET Core(C#) AngleSharp 解析百度和谷歌搜索结果html(链接、标题、描述)

    本文主要介绍.NETCore中,使用AngleSharp解析百度和谷歌的结果的html代码,提取出结果列表中的标题,文章的链接和描述的方法,以及相关的示例代码。

  • C#(.NET Core) 泛型中协变(covariant)和逆变(contravariant)的使用

    泛型很有用,可减少代码,更好得复用代码。本文主要介绍一下C#(.NETCore)泛型中使用协变(covariant)和逆变(contravariant)的方法,及使用的示例代码。

  • MySQL FLOOR() 函数

    MySQLFLOOR()函数返回小于或等于指定数字的最大整数值。如果您想要返回大于或等于指定数字的最小整数值,请使用CEIL()或者CEILING()函数。如果您想要将数字四舍五入到指定的小数位数,请使用ROUND()函数。如果您想要按位数截取小数位,请使用TRUNCATE()函数。FLOOR()语

  • 如何在微信H5页面链接跳转到第三方小程序的任意页面?

    在微信内的H5界面,跳转到第三方小程序的前提条件:佣有已认证的服务号,服务号添加“JS接口安全域名”,即访问H5界面的域名获得第三方小程序的原始ID这个只能手动获取,微信官方没有给出api接口动态调用,获取方法见图获得第三方小程序的页面路径如果页面路径获取不到,默认跳转的是第三方小程序的首页,获取页面路径官方也提供了手动获取方法,但是也有没有暴露的API方法,这里我实现了动态获取,见下图:先收藏要获取的页面,然后再切换到消息会话界面发送刚收藏的页面,稍等几秒就会自动

  • C# linq如何使用,无法识别方法等问题专场

    语言集成查询(LINQ)是将一系列的功能,集成到C#语言中的技术的统称 Linq 可以应用的场景: 数据库 XML 文档 ADO.net 数据集 IEnumerable 接口的任何对象集合 第三方的 web 服务 在写完Linq 语句以后,其本身只是存储查询变量。并不会真正的执行。只有当调用 ToList 和 ToArray 方法的时候,才会真正的执行,而且调试的话,也进不去 Linq 语句.

  • MySQL UUID() 函数

    MySQLUUID()函数根据RFC4122生成一个通用唯一标识符(UUID)并返回。UUID是一个全局唯一的值。任何两次对UUID()函数的调用都应该生成不同的值。UUID()语法这里是MySQLUUID()函数的语法:UUID()参数MySQLUUID()函数没有任何参数。返回值MySQLUUI

  • MySQL CHARSET() 函数

    MySQLCHARSET()函数返回指定的字符串的字符集。CHARSET()语法这里是MySQLCHARSET()函数的语法:CHARSET(str)参数str必需的。一个字符串。返回值CHARSET()函数返回指定的字符串的字符集。如果参数为NULL,CHARSET()函数将返回binary。CH

CSS|HTML   小程序开发   运维部署  开发技巧 推荐阅读

  • Spring Boot电商项目52:订单模块一:订单模块介绍;(模块介绍;效果演示;数据库设计;9个接口介绍;) Spring Boot电商项目52:订单模块一:订单模块介绍;(模块介绍;效果演示;数据库设计;9个接口介绍;) 说明:(1)一:【订单模块】模块介绍;(1)【订单模块】在前台和后台中,均有;(2)【订单模块】在前台中的内容;(3)【订单模块】在后台中的内容;... 文章阅读
  • MySQL JSON_STORAGE_FREE() 函数 MySQL JSON_STORAGE_FREE() 函数 MySQLJSON_STORAGE_FREE()函数返回一个JSON列在被JSON_SET()、JSON_REPLACE()或JSON_REMOVE()更新后所释放的空间。JSON_STORAGE_FREE()语法这里是MySQLJSON_STORAGE_FREE()的语法:JSON_STORAGE 文章阅读
  • MySQL NOT IN 使用说明 MySQL NOT IN 使用说明 NOT是一个逻辑运算符,用来用来否定一个操作。NOTIN是IN的否定操作符。MySQLNOTIN语法NOTIN和IN用法几乎一样,只是在IN前面添加一个NOT关键字,IN的否定操作符。NOTIN语法如下:expressionNOTIN(value1,value2,...)用法说明:NOT是一个否定逻 文章阅读

文章|阅读

  • 1.引言完成了简单的增删改查和分页功能,是不是觉得少了点什么?是的,少了权限管理。既然涉及到了权限,那我们就细化下任务清单的功能点:登录的用户才能查看任务清单用户可以无限创建任务并分配给自己,但只能对自己创建的任务进行查找、修改管理员可以创建任务并分配给他人管理员具有删除任务的权限从以上的信息中,我们可以提取出以下权限:任务分配权限任务删除权限那我们下面就来实现针对这两个权限的管理:2.ABP权限管理的实现2.1.先来看看权限定义相关类型权限定义及获取相关类型依赖图从该类型依赖图中我们可以看出:Permission:权限类,定义了权限的属性。PermissionDictionary:继承自Dictionary<string,Permission>类,存储permission对象的字典。IPermisssionDefinitionContext:定义了CreatePermission和GetPermissionOrNull方法,分别用来创建和获取权限。AuthorizationProvider:抽象类,在Module中实现该接口来定义权限。PermissionManager:权限管理类,继承自PermissionDefinitionContextBase主要提供了获取权限的系列方法。2.2.再来看看权限检查相关类型权限检查相关类型依赖图从该类型依赖图中简要梳理下核心类:IPermissionChecker:从接口命名就明白,这个是用来进行权限检查的。我们可以自己实现它,也可以使用module-zero中给出的实现。NullPermissionChecker:当未实现IPermissionChecker,系统会默认使用此类将权限赋予给每个用户。AbpAuthorizeAttribute:权限检查特性,在应用服务层标注需要的权限。AbpAllowAnonymousAttribute:匿名访问特性,忽略权限检查,用于应用服务层。在mvc和webapi中使用[AllowAnonymous]。AuthorizationInterceptor:授权拦截器,用来拦截定义了AbpAuthorizeAttribute特性的方法。核心的几个类就讲到这里,具体的实现,可以自行查看源码一探究竟。3.定义权限从上节中我们知道在不同的Module中通过继承AuthorizationProvider来定义权限。ABP模板项目中已经在领域层,也就是.Core结尾的项目中,定义了xxxxxxAuthorizationProvider类继承自AuthorizationProvider。3.1.权限包含哪些属性Name:系统中唯一的名字。最好为权限的名字定义一个const字符串而不是变量字符串。我们偏向使用“.”符号用于有层次的名字,但这不是强制的。你可以设置任何你喜欢的名字,唯一的一点是保证它必须是唯一的。DisplayName:用于以后在UI上显示权限的本地化字符串。Description:用于以后在UI上显示权限定义的本地化字符串。IsGrantedByDefault:表示该权限是否授予给所有登录的用户,除非该权限显式禁止未授予给用户。该值一般默认为false。MultiTenancySides:对于多租户应用,租户或者租主可以使用同一个权限。这是一个Flags枚举,因此一个权限可以用于租户和租主。featureDependency:可以用于声明一个功能的依赖。因此,只有功能依赖满足了,该权限才会被授予。3.2.定义任务分配和任务删除权限ABP模板项目默认已经在.Core/Authorization/目录下创建了AuthorizationProvider的派生类xxxxAuthorizationProvider.cs其中代码为:publicoverridevoidSetPermissions(IPermissionDefinitionContextcontext){//Commonpermissionsvarpages=context.GetPermissionOrNull(PermissionNames.Pages);if(pages==null)pages=context.CreatePermission(PermissionNames.Pages,L("Pages"));varusers=pages.CreateChildPermission(PermissionNames.Pages_Users,L("Users"));//Hostpermissionsvartenants=pages.CreateChildPermission(PermissionNames.Pages_Tenants,L("Tenants"),multiTenancySides:MultiTenancySides.Host);}可以看出主要添加了三个权限,Pages、Users、Tenants。依葫芦画瓢,咱们创建一个TaskAuthorizationProvider继承自AuthorizationProvider。代码如下:public>TaskAuthorizationProvider:AuthorizationProvider{publicoverridevoidSetPermissions(IPermissionDefinitionContextcontext){//Commonpermissionsvarpages=context.GetPermissionOrNull(PermissionNames.Pages);if(pages==null)pages=context.CreatePermission(PermissionNames.Pages,L("Pages"));//Tasksvartasks=pages.CreateChildPermission(PermissionNames.Pages_Tasks,L("Tasks"));tasks.CreateChildPermission(PermissionNames.Pages_Tasks_AssignPerson,L("AssignTaskToPerson"));tasks.CreateChildPermission(PermissionNames.Pages_Tasks_Delete,L("DeleteTask"));}privatestaticILocalizableStringL(stringname){returnnewLocalizableString(name,LearningMpaAbpConsts.LocalizationSourceName);}}并在常量PermissionNames类中维护唯一用户名。publicconststringPages_Tasks="Pages.Pages.Tasks";publicconststringPages_Tasks_AssignPerson="Pages.Pages.Tasks.AssignPerson";publicconststringPages_Tasks_Delete="Pages.Pages.Tasks.Delete";需要本地化显示的,则需要分别维护本地化xml文件,这里忽略此步。3.3.注册TaskAuthorizationProvider定位到.Core/xxxCoreModule.cs文件中发现Abp已经注册了默认实现的xxxxAuthorizationProvider.cs。Configuration.Authorization.Providers.Add<LearningMpaAbpAuthorizationProvider>();因为ABP是模块化的,当你需要为自己自定义的模块定义权限时,不要忘记在自己定义的Module中注册自己实现的AuthorizationProvider(授权提供器)。所以,还是依葫芦画瓢,注册TaskAuthorizationProvider:Configuration.Authorization.Providers.Add<TaskAuthorizationProvider>();4.权限检查4.1.使用[AbpAuthorize]特性在应用服务层中直接使用[AbpAuthorize]特性,但在MVC控制器中使用[AbpMvcAuthorize]特性,WebAPI控制器中使用[AbpApiAuthorize]。我们在应用服务层给删除操作定义权限检查:[AbpAuthorize(PermissionNames.Pages_Tasks_Delete)]publicvoidDeleteTask(inttaskId){vartask=_taskRepository.Get(taskId);if(task!=null)_taskRepository.Delete(task);}F5运行,去删除某一任务,将获得以下提示:未授权提示4.2.使用IPermissionChecker删除任务是一个独立的操作,所以我们可以直接使用上面特性声明的方式来进行权限检查。但是针对【任务分配】这个操作,它其实是任务创建、编辑中的一个子操作。所以我们不能直接使用特性声明的方式来进行权限检查。这一次我们使用IPermissionChecker来进行检查。4.2.1.应用服务层注入了PermissionChecker属性因为授权一般在应用服务层中进行,所以ABP默认在ApplicationService基类注入并定义了PermissionChecker属性。这样,在应用服务层就可以直接使用PermissionChecker属性进行权限检查。4.2.2.修改创建任务方法,加入权限检查publicintCreateTask(CreateTaskInputinput){//WecanuseLogger,it'sdefinedinApplicationService>.Info("Creatingataskforinput:"+input);//获取当前用户varcurrentUser=AsyncHelper.RunSync(this.GetCurrentUserAsync);//判断用户是否有权限if(input.AssignedPersonId.HasValue&&input.AssignedPersonId.Value!=currentUser.Id)PermissionChecker.Authorize(PermissionNames.Pages_Tasks_AssignPerson);vartask=Mapper.Map<Task>(input);intresult=_taskRepository.InsertAndGetId(task);//只有创建成功才发送邮件和通知if(result>0){task.CreationTime=Clock.Now;if(input.AssignedPersonId.HasValue){task.AssignedPerson=_userRepository.Load(input.AssignedPersonId.Value);varmessage="Youhavabeenassignedonetaskintoyourtodolist.";//TODO:需要重新配置QQ邮箱密码//SmtpEmailSenderemailSender=newSmtpEmailSender(_smtpEmialSenderConfig);//emailSender.Send("ysjshengjie@qq.com",task.AssignedPerson.EmailAddress,"NewTodoitem",message);_notificationPublisher.Publish("NewTask",newMessageNotificationData(message),null,NotificationSeverity.Info,new[]{task.AssignedPerson.ToUserIdentifier()});}}其中权限检查代码为:PermissionChecker.Authorize(PermissionNames.Pages_Tasks_AssignPerson);这种方式当没有权限时,将直接抛出异常。当启用<customErrorsmode="On"/>时,将跳转至Error视图并显示以下信息。授权提示4.2.3.修改编辑任务方法,加入权限检查publicvoidUpdateTask(UpdateTaskInputinput){//WecanuseLogger,it'sdefinedinApplicationServicebase>.Info("Updatingataskforinput:"+input);//获取当前用户varcurrentUser=AsyncHelper.RunSync(this.GetCurrentUserAsync);//获取是否有权限boolcanAssignTaskToOther=PermissionChecker.IsGranted(PermissionNames.Pages_Tasks_AssignPerson);//如果任务已经分配且未分配给自己,且不具有分配任务权限,则抛出异常if(input.AssignedPersonId.HasValue&&input.AssignedPersonId.Value!=currentUser.Id&&!canAssignTaskToOther){thrownewAbpAuthorizationException("没有分配任务给他人的权限!");}varupdateTask=Mapper.Map<Task>(input);_taskRepository.Update(updateTask);}其中权限检查代码为PermissionChecker.IsGranted(PermissionNames.Pages_Tasks_AssignPerson);,IsGranted()方法返回trueorfalse。权限提示4.2.4.Razor页面如何进行权限检查视图基类定义了IsGranted方法来检查当前用户是否具有权限。我们可以在_List.cshtml.cs中加入以下代码来控制是否显示删除按钮。@if(IsGranted(PermissionNames.Pages_Tasks_Delete)){<buttontype="button">="btnbtn-success"onclick="deleteTask(@task.Id);">Delete</button>}4.2.5js代码如何进行权限检查abp.auth命名空间下定义了权限相关的API,在js中我们可以直接使用。这里不再举例。5.将新增的权限赋予给Admin完成了权限的定义和检查,我们如何进行权限设置呢,如何为角色或用户赋予权限呢?在ABP模板项目中暂未提供用户角色权限管理功能,但在AbpZero中提供了该功能,支持按用户或角色赋予权限。那咋办呢?咱们退而求其次,在数据库初始化的时候,将权限赋给Admin。但是我们的数据库已经建立好了啊?反正是测试库,删掉重建呗。5.1.删除数据库怎么删数据库,自己应该知道吧。5.2.代码中为Admin赋予权限打开基础设施层,即以EntityFramework结尾的项目中,定位到Migrations\SeedData文件夹,分别在HostRoleAndUserCreator和TenantRoleAndUserBuilder两个类中添加以下代码:vartaskPermissions=PermissionFinder.GetAllPermissions(newTaskAuthorizationProvider()).ToList();permissions.AddRange(taskPermissions);5.3.重新编译整个项目,执行Update-Database查看数据库,发现已经将Permission赋予给了admin6.总结本节主要讲解了ABP权限管理的基本实现方式,以及如何定义、使用和添加权限。在ABP模板项目中暂未提供用户角色权限管理功能,但在AbpZero中提供了该功能,支持按用户或角色赋予权限。这一节先暂时不表,等我研究通彻了再和大家娓娓道来。遗留问题:在模态框上如何弹出异常信息

    .Net

  • 本文主要介绍.NETCore中操作ftp的库CoreFtp的使用方法,CoreFTP是一个完全用C#编写的简单开源.NETFTP库,它针对netstandard1.6,这意味着它将在.NETCore(也就是它的名称)和完整的.NET框架下运行。这个软件包的启发是由于缺少提供FTP功能的软件包,并且支持netstandardAPI。

    .Net

  • 千万级别的表分页查询非常慢,如何改进?

    在实际的软件系统开发过程中,随着使用的用户群体越来越多,表数据也会随着时间的推移,单表的数据量会越来越大。以订单表为例,假如每天的订单量在 4 万左右,那么一个月的订单量就是 120 多万,一年就是 1400 多万,随着年数的增加和单日下单量的增加,订单表的数据量会越来越庞大,订单数据的查询不会像最初那样简单快速,如果查询关键字段没有走索引,会直接影响到用户体验,甚至会影响到服务是否能正常运行!

    Database

  • 微信小程序中的wxs文件,大家或多或少都有见过,但怎么使用呢?在项目开发中又能给我们带来什么便捷和解决什么问题呢?借助一个案例为大家介绍具体用法。一、什么是wxs文件及wxs文件有什么作用wxs相当于一个独立模块,相当于一个独立出来的module对象,通过module.exports向外暴露,在文件中引入即可使用。解决了在微信小程序中{{method(a,b)}}方法传值不触发的问题,在vue这样传值是可以的。可以用来解决多次if判断,利于代码优化提高复用性。二、代码展示(.wx...

    小程序

  • 微信小程序实现将图片保存到手机相册

    前言图片保存到手机相册的功能相信大家一定都用过吧,今天教你用微信小程序实现这个好玩的小功能。实现效果如下:实现思路:首先我们需要调用wx.downloadFile方法下载文件资源到本地,然后利用wx.saveImageToPhotosAlbum方法保存图片到系统相册,需要注意的是这样写很可能会因为没有权限而导致下载不了图片,所以我们最后还需要给接口一个调用失败的回调函数,以此来获取权限,最后这个小功能就实现啦。源码如下:wxml文件<!--按钮触发事件--><bu

    小程序

  • 2021目标期望没达到预期,今天过后所有的期待与努力无最爱、无例外、往事清零,一起跨入2022,续上昨日的期

    Life

  • 1首先打开PS页面,选中左侧如图的快捷工具。2之后按如图操作,制作一个适当大小的三角形。3再做一个较小的一个,如图倾斜,复制图层,重复此操作即可。END

    开发技巧

  • 1打开ps软件在电脑里面将ps软件打开,并点击工具栏上面的窗口,选择动作。2选择动作在右下角的动作窗口里面选择新建动作。3操作图层新建了动作图层之后,点击下面的开始录制选项,在图层里面将需要操作的动作一步一步的正常操作。4停止录制操作完毕之后,点击停止录制。5点击文件点击工具栏上面的文件-自动-批处理选项。6选择批处理文件将批处理窗口打开了之后,在窗口里面的源文件中点击选择,在电脑中将需要批处理的文件打开。EN

    开发技巧

2024年 06月24日

周一