摘要: [MAUI]实现动态拖拽排序网格 @目录创建页面元素创建可绑定对象创建绑定服务类拖拽(Drag)拖拽悬停,经过(DragOver)释放(Drop)限流(Throttle)和防抖(Debounce)项目地址 上一章我们使用拖放(drag-drop)手势识别实现了可拖拽排序列表,对于列表中的条目,完整的拖拽排序过程是: 手指触碰条目 - 阅读全文
posted @ 2023-09-18 17:57 林晓lx 阅读(1342) 评论(4) 推荐(10) 编辑
摘要: [MAUI]在.NET MAUI中实现可拖拽排序列表 [toc] .NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件。在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表。在本例中,列表中显示不同大小的磁贴(Tile)并且可以拖拽排序。 ![在这里插入图片描述](https://img2023 阅读全文
posted @ 2023-08-15 14:33 林晓lx 阅读(1912) 评论(3) 推荐(22) 编辑
摘要: 假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能 ## 创建SignalR服务 在项目中引用 ``` abp add-package Volo.Abp.AspNetCore.SignalR ``` 在Module文件中添加对模块依赖 ``` [DependsOn( ... type 阅读全文
posted @ 2023-08-03 17:48 林晓lx 阅读(202) 评论(0) 推荐(1) 编辑
摘要: [toc] 使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。 ## 实现 定义按创建日期范围查询(IDateSpanOriented 阅读全文
posted @ 2023-07-22 22:02 林晓lx 阅读(555) 评论(0) 推荐(2) 编辑
摘要: @[toc] ## 原理 回收站是当用户删除一条记录时,不是直接从数据库中删除,而是将其放入“回收站”,以便用户可以在需要时恢复数据。 在Abp框架中,若实体实现了ISoftDelete,则将实体标记为删除时不是物理删除,而是“软删除” ``` public interface ISoftDelet 阅读全文
posted @ 2023-07-20 08:58 林晓lx 阅读(340) 评论(0) 推荐(2) 编辑
摘要: @[toc] 用户关系(Relation)是描述业务系统中人员与人员之间的关系,如:签约、关注,或者朋友关系。 之前我们在扩展身份管理模块的时候,已经实现了用户关系管理,可以查看本系列博文之前的内容。[怎样优雅地增删查改(二):扩展身份管理模块](https://www.cnblogs.com/je 阅读全文
posted @ 2023-07-19 09:12 林晓lx 阅读(392) 评论(0) 推荐(1) 编辑
摘要: @[toc] ## 实现 定义按用户查询(IUserOrientedFilter)接口 ``` public interface IUserOrientedFilter { public string EntityUserIdIdiom { get; } Guid? UserId { get; se 阅读全文
posted @ 2023-07-18 11:30 林晓lx 阅读(432) 评论(0) 推荐(0) 编辑
摘要: @[toc] ## 实现 定义按任意字段关键字查询过滤器(IKeywordOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定的目标字段(TargetFields)包含指定的关键字(Keyword)的实体。 ``` public interface IKeywordOrie 阅读全文
posted @ 2023-07-14 08:54 林晓lx 阅读(591) 评论(2) 推荐(4) 编辑
摘要: @[toc] 之前我们实现了Employee,Alarm管理模块以及通用查询应用层。 Employee的集合查询业务,是通过重写CreateFilteredQueryAsync方法,来实现按组织架构查询的过滤条件。 我们将这段逻辑代码提取到通用查询应用层中,便可实现在任何业务的按组织架构查询。 ## 阅读全文
posted @ 2023-07-13 19:43 林晓lx 阅读(264) 评论(0) 推荐(0) 编辑
摘要: @[toc] 上一章我们实现了Employee管理模块,Employee的增删改查是通过其应用服务类,继承自Abp.Application.Services.CrudAppService实现的。 我们将封装通用的应用层,接口以及控制器基类。 ## 创建通用查询抽象层 创建接口ICurdAppServ 阅读全文
posted @ 2023-07-13 10:46 林晓lx 阅读(463) 评论(0) 推荐(3) 编辑
摘要: @[toc] ## 创建业务用户 区别于身份管理模块(Identity模块)的鉴权用户IdentityUser,业务用户(BusinessUser)是围绕业务系统中“用户”这一定义的领域模型。如:在一个医院系统中,业务用户可以是医生、护士、患者;在一个OA系统中,业务用户可以是员工、管理员、客户等。 阅读全文
posted @ 2023-07-12 19:23 林晓lx 阅读(349) 评论(0) 推荐(0) 编辑
摘要: @[toc] 身份管理模块(Identity模块)为通用查询接口的按组织架构查询和按户关系查询提供查询依据。 身份管理模块的领域层依赖Volo.Abp.Identity.Domain ![在这里插入图片描述](https://img2023.cnblogs.com/blog/644861/20230 阅读全文
posted @ 2023-07-08 20:11 林晓lx 阅读(260) 评论(0) 推荐(1) 编辑
摘要: @[toc] 软件系统中数据库或者持久层的基本操作功能可以用Curd描述,Curd即 增加(Create)、更新(Update)、读取查询(Retrieve)和删除(Delete), 这4个单词的首字母。 在常见的业务系统中,对数据的大部分操作都是Curd,在实践的过程中对数据的筛选、排序、分页、关 阅读全文
posted @ 2023-07-07 19:04 林晓lx 阅读(438) 评论(6) 推荐(6) 编辑
摘要: Vue + Volo.Abp 实现OAuth2.0客户端授权模式认证 @[toc] Volo.Abp的[身份服务器模块](https://docs.abp.io/zh-Hans/abp/latest/Modules/IdentityServer)默认使用 [IdentityServer4](https://identityserver4.readthedocs.io/ 阅读全文
posted @ 2023-07-07 11:32 林晓lx 阅读(407) 评论(1) 推荐(3) 编辑
摘要: [MAUI]用纯C#代码写两个漂亮的时钟 @[toc] 谷歌在2021年5月份推出的Android 12给我们带来了新的UI设计规范Material You,你是否已经体验到了Material You设计的魅力了呢? 在原生主屏幕启动器中,有一个时钟小部件。这个小部件可以选择表盘风格。 > ![在这里插入图片描述](https://img2 阅读全文
posted @ 2023-07-01 19:35 林晓lx 阅读(3359) 评论(7) 推荐(15) 编辑
摘要: [MAUI]弧形进度条与弧形滑块的交互实现 @[toc] 进度条(ProgressBar)用于展示任务的进度,告知用户当前状态和预期; 滑块(Slider)通过拖动滑块在一个固定区间内进行选择数值范围。 进度条和滑块都是进度值在UI界面的映射,其中滑块可以抽象成为带控制柄(Thumb)的进度条,是界面元素和进度值的双向绑定。 在某些场景下,我 阅读全文
posted @ 2023-06-18 15:03 林晓lx 阅读(1865) 评论(19) 推荐(18) 编辑
摘要: [MAUI]写一个跨平台富文本编辑器 @[toc] 富文本编辑器是一种所见即所得(what you see is what you get 简称 WYSIWYG)文本编辑器,用户在编辑器中输入内容和所做的样式修改,都会直接反映在编辑器中。 在Web端常见的有[Quill](https://github.com/quilljs/quill 阅读全文
posted @ 2023-06-11 23:15 林晓lx 阅读(2941) 评论(8) 推荐(25) 编辑
摘要: Volo.Abp升级小记(二)创建全新微服务模块 @[toc] 假设有一个按照[官方sample](https://docs.abp.io/zh-Hans/abp/latest/Samples/Microservice-Demo)搭建的微服务项目,并安装好了abp-cli。 需要创建一个名为GDMK.CAH.Common的模块,并在模块中创建标签管 阅读全文
posted @ 2023-06-09 14:45 林晓lx 阅读(259) 评论(1) 推荐(0) 编辑
摘要: [MAUI程序设计] 用Handler实现自定义跨平台控件 @[toc] 今天来谈一谈MAUI跨平台技术的核心概念——跨平台控件。 无论是MAUI,Xamarin.Forms还是其它的跨平台技术,他们是多个不同平台功能的抽象层,利用通用的方法实现所谓“一次开发,处处运行”。 跨平台框架需要考虑通用方法在各平台的兼容,但由于各原生平台(官方将原生称为本机)功能 阅读全文
posted @ 2023-06-04 18:37 林晓lx 阅读(1830) 评论(6) 推荐(22) 编辑
摘要: [MAUI]模仿Chrome下拉标签页的交互实现 今天来说说怎样在.NET MAUI 中制作一个灵动的类标签页控件,这类控件常用于页面中多个子页面的导航功能。比如在手机版的Chrome中,当用户在网页中下拉时将出现“新建标签页”,“刷新”,“关闭标签页”三个选项,通过不间断的横向手势滑动,可以在这三个选项之间切换。浏览网页常用选项融入到了原“下拉刷新”交互中,对比传统交互方式它更显便捷和流畅,根据Steve Krug之《Don't Make Me Think》的核心思想,用户无需思考点击次序,只需要使用基础动作就能完成交互。 阅读全文
posted @ 2023-05-28 18:00 林晓lx 阅读(1748) 评论(20) 推荐(35) 编辑
摘要: [MAUI]在.NET MAUI中复刻苹果Cover Flow Cover Flow是iTunes和Finder中的一个视图选项,允许用户使用水平滚动的图像查看他们的音乐库或文件。Cover Flow的交互设计非常优秀:通过指尖滑动从堆叠的专辑库中翻动和挑选一张专辑的交互方式不仅有趣,而且在有限的屏幕空间内,展现了更多的专辑封面。那个是乔布斯时代的苹果——使事情变得简单和有趣。最近我很怀念这个功能,但由于我手头上已经没有任何一台设备能访问这个功能了。于是在.NET MAUI中复刻了Cover Flow。 阅读全文
posted @ 2023-05-21 23:24 林晓lx 阅读(3049) 评论(27) 推荐(58) 编辑
摘要: 今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录。 问题 使用ef执行Insert对象到某表时报错,此对象的Address为空: 不能将值 NULL 插入列 'Address',表 'dbo.xxx';列不允许有 Null 值。INSERT 失败。 检查数据库和迁移文件时发现Address 阅读全文
posted @ 2023-05-18 19:06 林晓lx 阅读(447) 评论(1) 推荐(8) 编辑
摘要: [MAUI程序设计]界面多态与实现 .NET MAUI 实现界面多态有很多种方式,今天主要来说说在日常开发中常见的需求该如何应对。 需求一:在不同设备上使用不同 UI 外观 .NET MAUI是一个跨平台的UI框架,可在一个项目中开发Android、iOS、Windows、MacOS等多个平台的应用。在不同设备上我们希望应用的界面或交 阅读全文
posted @ 2023-05-14 17:47 林晓lx 阅读(2878) 评论(7) 推荐(19) 编辑
摘要: [MAUI]模仿iOS多任务切换卡片滑动的交互实现 @ 看了上一篇博文的评论,大家对MAUI还是比较感兴趣的,非常感谢大家的关注,这个专栏我争取周更😉。 App之间的多任务切换相信你们都很熟悉。苹果设备从iOS9开始使用水平排列的叠层卡片来展现多任务 动图来自iPhone 使用手册 - 在 iPhone 上的应用之间切换 这个设计利用屏幕深度(z方 阅读全文
posted @ 2023-05-02 21:48 林晓lx 阅读(3350) 评论(11) 推荐(60) 编辑
摘要: [MAUI]模仿网易云音乐黑胶唱片的交互实现 @ 用过网易云音乐App的同学应该都比较熟悉它播放界面。 这是一个良好的交互设计,留声机的界面隐喻准确地向人们传达产品概念和使用方法:当手指左右滑动时,便模拟了更换唱盘从而导向切换歌曲的交互功能。 今天在 .NET MAUI 中我们来实现这个交互效果,先来看看效果: 使用.NET MAU实现跨平台支 阅读全文
posted @ 2023-04-25 08:55 林晓lx 阅读(4094) 评论(31) 推荐(68) 编辑
摘要: 本文将从GB/T 22239《信息安全技术 网络安全等级保护基本要求》规定的安全计算环境中解读、摘要若干安全要求,结合Abp框架,对站点进行安全升级。 【身份鉴别】应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。 解决方案 设置密码最小长度 密码由数字、字 阅读全文
posted @ 2023-04-18 13:48 林晓lx 阅读(646) 评论(1) 推荐(9) 编辑
摘要: [MAUI]模仿微信“按住-说话”的交互实现 @ .NET MAUI 跨平台框架包含了识别平移手势的功能,在之前的博文[MAUI 项目实战] 手势控制音乐播放器(二): 手势交互中利用此功能实现了pan-pit拖拽系统。 简单来说就是拖拽物(pan)体到坑(pit)中,手势容器控件PanContainer描述了pan运动和pit位置的关系,并在 阅读全文
posted @ 2023-04-15 20:31 林晓lx 阅读(1025) 评论(5) 推荐(19) 编辑
摘要: 漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Web脚本代码(html、javascript、css等),当用户浏览该页面时, 阅读全文
posted @ 2023-04-14 18:40 林晓lx 阅读(299) 评论(1) 推荐(2) 编辑
摘要: @ 用户找回密码,确切地说是重置密码,为了保证用户账号安全,原始密码将不再以明文的方式找回,而是通过短信或者邮件的方式发送一个随机的重置校验码(带校验码的页面连接),用户点击该链接,跳转到重置密码页面,输入新的密码。这个重置校验码是一次性的,用户重置密码后立即失效。 用户找回密码是在用户没有登录时进 阅读全文
posted @ 2023-04-14 11:59 林晓lx 阅读(358) 评论(0) 推荐(4) 编辑
摘要: 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证 @ 免登录验证是用户在首次两步验证通过后,在常用的设备(浏览器)中,在一定时间内不需要再次输入验证码直接登录。 常见的网页上提示“7天免登录验证”或“信任此设备,7天内无需两步验证”等内容。 这样可以提高用户的体验。但同时也会带来一定的安全风险,因此需要用户自己决定是否开启。 原理 常用的实现方式是 阅读全文
posted @ 2023-04-12 21:25 林晓lx 阅读(261) 评论(0) 推荐(3) 编辑
摘要: 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发 @ 前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读。 首先添加全局对象: loginForm: 登录表单对象 twoFactorData: 两步验证数据, showTwoFactorSuccess: 是否显示两步验证成功提示 l 阅读全文
posted @ 2023-04-12 13:55 林晓lx 阅读(265) 评论(1) 推荐(5) 编辑
摘要: [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构 这是一篇系列博文。请关注我,学习更多.NET MAUI开发知识! [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构 [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互 [MAUI 项目实战] 手势控制音乐播放器(三): 动画 [MAUI 项目实战] 手势控制音乐播放器(四): 阅读全文
posted @ 2023-04-09 18:13 林晓lx 阅读(270) 评论(0) 推荐(2) 编辑
摘要: [MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条 @ 我们将绘制一个圆形的音乐播放控件,它包含一个圆形的进度条、专辑页面和播放按钮。 关于图形绘制 使用MAUI的绘制功能,需要Microsoft.Maui.Graphics库。 Microsoft.Maui.Graphics 是一个实验性的跨平台图形库,它可以在 .NET MAUI 中使用。它提供了 阅读全文
posted @ 2023-04-09 10:33 林晓lx 阅读(225) 评论(0) 推荐(3) 编辑
摘要: [MAUI 项目实战] 手势控制音乐播放器(三): 动画 @ 上一章节我们创建了手势容器控件PanContainer,它对拖拽物进行包装并响应了平移手势和点击手势。 拖拽物现在虽然可以响应手势操作,但视觉效果较生硬,一个优秀的设计要求UI界面交互流畅,页面元素显得灵动,则少不了动画(Animation)。 本章节我们对拖拽物加入过渡动画 吸附动画 还记的上 阅读全文
posted @ 2023-04-09 00:19 林晓lx 阅读(169) 评论(0) 推荐(1) 编辑
摘要: [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互 @ 原理 定义一个拖拽物,和它拖拽的目标,拖拽物可以理解为一个平底锅(pan),拖拽目标是一个坑(pit),当拖拽物进入坑时,拖拽物就会被吸附在坑里。可以脑补一下下图: 你问我为什么是平底锅和坑,当然了在微软官方的写法里pan是平移的意思,而不是指代平底锅。只是通过同义词来方便理解 坑就是正好是平底 阅读全文
posted @ 2023-04-08 18:00 林晓lx 阅读(200) 评论(1) 推荐(4) 编辑
摘要: 用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块 @ 在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系统支持双因素认证(Two-Factor Authentication)功能。 两步验证,又称双重验证或双因素认证(Two-Factor Authenticat 阅读全文
posted @ 2023-04-07 22:02 林晓lx 阅读(367) 评论(0) 推荐(4) 编辑
摘要: 假设有User表 public class User : Entity<int> { public int Id { get; set; } public string UserName { get; set; } public string Name { get; set; } public st 阅读全文
posted @ 2023-04-05 08:30 林晓lx 阅读(365) 评论(2) 推荐(3) 编辑
摘要: @ 现象 默认地,Abp的语言提供程序将返回的CultureInfo为En,在一些默认实现的接口(比如/api/TokenAuth/Authenticate)返回的错误信息是英文 目标是改成简体中文显示,但是即便我们在AbpSettings表中加入了DefaultLanguage为"zh-Hans" 阅读全文
posted @ 2023-04-04 20:57 林晓lx 阅读(174) 评论(0) 推荐(0) 编辑
摘要: [Volo.Abp升级笔记]使用旧版Api规则替换RESTful Api以兼容老程序 @ Volo.Abp 配置应用层自动生成Controller,增删查改服务(CrudAppService)将会以RESTful Api的方式生成对应的接口 (官方文档),这与旧版本的Abp区别很大。RESTful固然好,虽然项目里新的Api会逐步使用RESTful Api代替旧的,但在前后端分离的项 阅读全文
posted @ 2023-03-29 11:22 林晓lx 阅读(198) 评论(0) 推荐(3) 编辑
摘要: 本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类? 比如由 { 'userId': 100, 'id': 1, 'title': 'hello world', 'completed': false } 生成 dynamic obj = new { userId = 1 阅读全文
posted @ 2023-03-19 09:01 林晓lx 阅读(138) 评论(0) 推荐(1) 编辑