文章类型

原创在VS Code中使用Snippet Craft扩展提高编码效率

在VS Code中使用Snippet Craft扩展提高编码效率
扩展初始化时,插入了三个常用的自定义映射,你可以自由更改或添加自定义映射。示例:代码片段内容value of 'AUTHOR' is: 林晓lx与自定义映射一样,当默认映射值未设置或者不可用时,将直接显示变量占位符。

原创[学习笔记]在不同项目中切换Node.js版本

[学习笔记]在不同项目中切换Node.js版本
在开发中,可能会遇到不同的Vue项目需要不同的Node.js,在开发机上如何快速切换Node的版本呢?总结:最好是通过第一种方式,因为手动配置环境变量的方式会产生依赖,需要在同事的电脑上手动配置。cross-env 是一个用于在不同操作系统上设置和使用环境变量的工具,可以用它来切换。环境变量,以确保在不同的操作系统上都能正确设置和使用 Node.js 的路径。下载 Node.js,并在不同目录下安装多个版本。环境变量的路径,实现切换Node.js 的版本。可以在系统的环境变量配置中手动设置。

原创[VS Code扩展]写一个代码片段管理插件(二):功能实现

[VS Code扩展]写一个代码片段管理插件(二):功能实现
映射是插入代码片段时,自动替换的变量,他们通过Key-Value形式存储于globalState中。代码片段中通过设置占位符(如${AUTHOR}),在插入代码片段时,将自动替换为全局变量中的值。当自定义映射值未设置或者不可用时,将直接显示变量占位符扩展初始化时,插入了三个常用的自定义映射,你可以自由更改或添加自定义映射。${AUTHOR}: 作者姓名${COMPANY}: 公司名称${MAIL}: 邮箱地址扩展中所有的自定义映射,呈现于“映射表”树视图中。示例:代码片段内容。

原创[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建

[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
功能,但是创建自定义代码片段时,需要写JSON格式的配置,这些JSON文件在用户文件夹下,没有统一的界面管理,而且对于我来说,制表符补全这样的高级功能并不是必需的。VS Code扩展是一个基础功能,通过扩展可以满足软件的所有功能增强,包括内置的核心功能,如文件管理,搜索,Git,调试器,这些都是通过扩展实现的。VS Code这些框架的部分,官方称之为“容器”,整个VS Code由6个容器组成,分别是:活动栏,主边栏,编辑器,辅边栏,面板,状态栏。常用的项目有侧边栏,编辑器,状态栏,面板上的工具栏区域。

原创[MAUI 项目实战] 笔记App(二):数据库设计

[MAUI 项目实战] 笔记App(二):数据库设计
从场景到笔记,或者说从模板到实例,我们需要映射,例如从笔记片段菜单中选择一个片段添加,那么需要从笔记片段仓库实体(NoteSegmentStore)映射到笔记片段实体(NoteSegment)或者,在编辑场景中,映射到笔记片段模板实体(NoteSegmentTemplate)。在该项目MatoProductivityEntityFrameworkCoreModule.cs 中,将注册上下文对象,并在程序初始化运行迁移,此时将在设备上生成。可在程序启动时,访问数据库,并初始化种子数据。

原创[MAUI 项目实战] 笔记App(一):介绍与程序设计

[MAUI 项目实战] 笔记App(一):介绍与程序设计
有人说现在记事类app这么多,市场这么卷,为什么还想做一个笔记类App?一来,去年小孩刚出生,需要一个可以记录喂奶时间的app,发现市面上没有一款app能够在两步内简单记录一个时间,可能iOS可以通过备忘录配合捷径做到快速记录,但是安卓上就没有类似的app。二是,自去年做的音乐播放器以来,很长一段时间我在博客上的XF,MAUI都是在介绍局部的功能,[MAUI 项目实战]专题也很长没更新了,这次通过笔记类App做一次完整项目,包括如何上架MAUI应用等内容一并更新了。

原创[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目
其它的工具插件可以单独获取。在OnAfterRenderAsync中调用初始化函数,并订阅OnSubmitting和OnInited事件,以便在提交事件触发时保存,以及文本状态变更时重新渲染。在wwwroot创建editorjs_index.html文件,并在body中引入editorjs.umd.js和各插件js文件。我们先要获取web应用的资源文件(js,css等),以便MAUI的视图呈现标准的Web UI。在script代码段中,创建LoadContent函数,用于加载EditorJs的初始内容。

原创[MAUI]模仿哔哩哔哩的一键三连

[MAUI]模仿哔哩哔哩的一键三连
的CodeBehind中,创建OnCanvasViewPaintSurface,通过给定起始角度为正上方,扫描角度为360对于100%进度,通过插值计算出当前进度对应的扫描角度,绘制出进度条。“三连按钮”是一组按钮,轻击时当做普通状态按钮使用,当长按 2 秒钟后,转为三连模式,可以控制并显示进度,并在进度完成时弹出一些泡泡。在本项目中,需要监听长按动作,当“三连按钮”长按2秒后,转为三连模式,此时需要监听手指释放情况,当时长不足时取消三连。当按钮被点击时此Timer会开。这些按钮用svg格式在html中。

原创[MAUI]集成高德地图组件至.NET MAUI Blazor项目

[MAUI]集成高德地图组件至.NET MAUI Blazor项目
地图组件在手机App中常用地理相关业务,如查看线下门店,设置导航,或选取地址等。是一个较为常见的组件。在.NET MAUI 中,有两种方案可以集成高德地图,一种是使用原生库绑定。但这种方案需要大量平台原生开发的知识,而且需要对每一个平台进行适配。在这里我介绍第二种方案:.NET MAUI Blazor + 高德地图JS API 2.0 库的实现。JS API 2.0 是高德开放平台基于WebGL的地图组件,可以将高德地图模块集成到.NET MAUI Blazor中的BlazorWebView控件。

原创[.NET项目实战] Elsa开源工作流组件应用(三):实战演练

[.NET项目实战] Elsa开源工作流组件应用(三):实战演练
之前的文章简单介绍了工作流和Elsa工作流库,这里再补充说明两点工作流的使用场景非常广泛,几乎涵盖了所有需要进行业务流程自动化管理的领域。学习一个开源库,最简单的方法就是看源码,Elsa的工作流引擎源码非常简单易懂,并且提供了非常丰富的示例代码,举一个例子:审批工作流示例这个审批流是这样的:作者发来一个文章,有两个审批人需要全部审批通过,文章才算通过,否则退回。

原创[.NET项目实战] Elsa开源工作流组件应用(二):内核解读

[.NET项目实战] Elsa开源工作流组件应用(二):内核解读
Elsa工作原理可以抽象理解为管道中间件 + 异步模型Elsa中,活动的变量的获取和设置都是异步的。Elsa定义了Variable类型作为异步操作的结果或者说是异步操作的占位符,这个变量在运行的时候才会填充数值。这与我们熟悉C#中的Task,或者js里的promise对象作用相同。输入Input,OutPut都属于 Variable。Elsa模拟了内存寄存器(MemoryRegister)以及Set和Get访问器实现异步模型。

原创深度观察2024中国系统架构师大会(SACC)

深度观察2024中国系统架构师大会(SACC)
今年的中国系统架构师大会(SACC)在我所在的城市广州举办,很荣幸受邀参加。这次能接触到国内最优秀的架构师,学习他们的架构思想和行业经验。对我而言非常有意义。大会分为上下午共4场,我参加了上午的多云多活架构设计专场和下午的AIGC专场。本篇文章就多云多活架构设计专场,我选取几位老师的观点进行分享。(我并不是架构师,只是对架构感兴趣,如有错误,还请指正)

原创[.NET项目实战] Elsa开源工作流组件应用(一): Elsa工作流简介

[.NET项目实战] Elsa开源工作流组件应用(一): Elsa工作流简介
工作流定义描述了一个工作流的结构,比如:名称,变量,包含的活动等,可以理解为一个工作流的模板。工作流定义在Elsa初始化时会“注册” 到资源池中,每个工作流定义都有一个唯一的ID。使用设计器生成的工作流,通过序列化成JSON字符串,并持久化到数据库。使用硬编码创建的工作流,在Elsa初始化时将工作流注册到工作流定义并持久化到数据库。实例化是根据定义创建一个工作流的实例,工作流实例包含工作流状态(WorkflowState)以及活动实例(ActivityState)。

原创在macOS中搭建.NET MAUI开发环境

在macOS中搭建.NET MAUI开发环境
在 Visual Studio Code 中,按 F5 键或单击“运行”>“启动调试”以调试 .NET MAUI 应用。在 macOS 上,建议的 Android SDK 目录值为 $HOME/Library/Android/sdk。此时已可以真机调试 Android 应用,如果真机调试不方便,我们需要安装 Android 模拟器。另外可以通过切换调试目标中的菜单,查看可用的镜像,选择一个镜像,或创建一个新的镜像。在 Visual Studio Code 的资源管理器中,打开项目sln文件,

原创将Abp默认事件总线改造为分布式事件总线

将Abp默认事件总线改造为分布式事件总线
定义NotificationEventData,用于传递自定义事件。set;set;set;set;在消费者端,定义一个事件处理器,用于处理自定义事件。在生产者端,触发自定义事件。运行程序,可以看到消费者端打印出了自定义事件。

原创[学习笔记]批量迁移数据库文件

[学习笔记]批量迁移数据库文件
更多移动用户数据库内容请查看官方文档 https://learn.microsoft.com/zh-cn/sql/relational-databases/databases/move-user-databases。注意,从 SQL Server 2008 R2 (10.50.x) 开始,全文目录已集成到数据库中,而不是存储在文件系统中。因此如果你的数据库是SQL Server 2008 R2(10.50.x) 之前的版本,你需要分别迁移数据库文件和日志文件。首先复制数据库文件到新的磁盘位置,比如。

原创[学习笔记]在CentOS7中用Docker方式安装Jenkins

[学习笔记]在CentOS7中用Docker方式安装Jenkins
Docker in Docker (以下简称 DinD)可以在 Container 中直接运行一个 Docker Daemon ,然后使用 Container 中的 Docker CLI 工具操作容器。容器内的Docker Daemon对外提供服务,每个运行中的容器,都是一个进程,这个进程都托管在Docker Daemon中,镜像和容器都在一个隔离的环境。Jenkins在构建时,需要一个独立的Docker环境用于打包镜像。网桥允许连接到同一网桥网络的容器进行通信,创建一个名为jenkins的网桥网络。

原创将ECharts图表插入到Word文档中

将ECharts图表插入到Word文档中
首先指定一个option,在官方示例 https://echarts.apache.org/examples/zh/index.html 中,随意找一个柱状图的sample,复制option对象内容到新创建的option.json文件中。echarts-convert在github上有众多版本,echarts-convert的代码来源于这里:https://github.com/wadezhan/billfeller.github.io/issues/85。将下载好的可执行文件解压放置在项目根目录下的。

原创DocTemplateTool - 可根据模板生成word或pdf文件的工具

DocTemplateTool - 可根据模板生成word或pdf文件的工具
你是否经常遇到这样的场景:产品运营有着大量的报告需求,或者给客户领导展现每周的运营报告?这些文档类的任务可以交给运营同事,他们负责文档排版和样式,你作为开发人员你只需要提供数据源,和一个映射表,告诉制作文档的人哪些字段可供使用。这样一来分工明确,减少了很多不必要的沟通成本。

原创[学习笔记]TypeScript查缺补漏(一):类

[学习笔记]TypeScript查缺补漏(一):类
private在编译后JavaScript中没有影响,仅对TypeScript编译器有影响,而使用#符号声明的私有属性在JavaScript中会被编译为常规的私有属性。Getter/Setter可以在不改变属性的访问权限的情况下,对属性的值进行更精细的控制。装饰器是使用 @ 符号来标识的特殊类型的函数,可以用来扩展类或方法的行为。尽管箭头函数是在对象的方法中定义的,但是它不会捕获到调用该方法的对象作为自己的this上下文。在箭头函数中,this不指向调用该函数的对象,而是指向定义该箭头函数时的上下文。

原创[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发

[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发
每个BlazorWebView控件包含根组件(RootComponent)定义,ComponentType是在应用程序启动时加载页面时的类型,该类型需要继承自Microsoft.AspNetCore.Components.IComponent,由于我们的导航是由MAUI处理的,因此我们不需要使用Blazor路由,直接使用Razor组件。开发应用需要一个独立的host项目。中引入,还有一种是使用并置的js文件,这种方式是所谓的"CodeBehind",因为更利于组织代码,这里我们使用并置的js文件。

原创[MAUI]实现动态拖拽排序网格

[MAUI]实现动态拖拽排序网格
拖拽控件悬停在当前控件上方时,将IsBeingDraggedOver设置为true,通知当前控件正在有拖拽控件悬停在其上方,同时在服务列表中寻找当前正在被拖拽的服务,将DropPlaceHolderItem设置为当前控件。当以比较快的速度,拖拽Tile经过较多的位置时,后面的Tile会短暂地替代原先的位置,导致拖拽中的Tile不在期望的Tile上方,而拖拽中的Tile与错误的Tile产生了交叠从而触发DraggedOver事件,导致错乱。其是在松开手指之后才向列表提交条目位置变更的命令。

原创[MAUI]在.NET MAUI中实现可拖拽排序列表

[MAUI]在.NET MAUI中实现可拖拽排序列表
NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件。在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表。在本例中,列表中显示不同大小的磁贴(Tile)并且可以拖拽排序。使用.NET MAU实现跨平台支持,本项目可运行于Android、iOS平台。

原创利用Abp过滤器实现业务数据“回收站”功能

利用Abp过滤器实现业务数据“回收站”功能
利用这个原理,可以将“软删除”行为认为是放入了“回收站”,而将“恢复”行为认为是从“回收站”中取出。将记录硬删除的行为认为是“永久删除”, 将全部已“软删除”的记录硬删除,则是“清空回收站”在DbContext中,重写CreateFilterExpression方法,当启用了“仅查看软删除”过滤器时,自动过滤软删除的实体。在删除记录时,通过调用仓储的Delete()方法,将记录放入“回收站”中。回收站是当用户删除一条记录时,不是直接从数据库中删除,而是将其放入“回收站”,以便用户可以在需要时恢复数据。

原创怎样优雅地增删查改(八):按用户关系查询

怎样优雅地增删查改(八):按用户关系查询
查询目标业务对象HealthAlarm关联了业务用户HealthClient,因业务用户与鉴权用户IdentityUser共享同一个Id,因此可以通过查询用户关系关联的User,查询到业务对象。对于Relation服务,其依赖关系在应用层,查找指定用户的关系用户将在CurdAppServiceBase的子类实现。对于Relation服务,其依赖关系在应用层,查找指定用户的关系用户将在CurdAppServiceBase的子类实现。人员之间的关系是单项的,也就是说可以A是B的好友,但B不一定是A的好友。

原创怎样优雅地增删查改(七):按用户查询

怎样优雅地增删查改(七):按用户查询
若指定 UserId 为 Guid.Empty,则使用当前登录用户的 UserId。查询实体列表Dto若实现该接口,将筛选指定 UserId 下的关联的实体。ICurrentUser是Abp的一个服务,用于获取当前登录用户的信息。打开客户详情页面,点击“告警”标签页,可以看到该客户下的告警列表。告警创建完成后,进入客户管理,在右侧客户列表中点击“查看详情”在告警管理页面中,创建一些告警,并将这些告警分配给不同的客户。在不同“群组”下创建一些客户(Client)创建一些组织架构,命名“群组”

原创怎样优雅地增删查改(六):按任意字段关键字查询

怎样优雅地增删查改(六):按任意字段关键字查询
定义按任意字段关键字查询过滤器(IKeywordOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定的目标字段(TargetFields)包含指定的关键字(Keyword)的实体。对于每一个TargetField,需要在实体中找到对应字段(属性)。若找到,则为此实体字段创建条件筛选的表达式,然后将这些表达式通过Or连接起来,最终返回一个包含多段关键字筛选的Lambda表达式。可以看到将筛选出标题包含关键字“3”的告警。在筛选中输入关键字“3”,点击查询。无需在应用层中更改代码,

原创怎样优雅地增删查改(五):按组织架构查询

怎样优雅地增删查改(五):按组织架构查询
要想在任意实体实现Where的过滤条件,我们使用动态拼接语言集成查询 (LINQ) 的方式实现通用查询接口,有关LINQ表达式,请阅读。定义按组织架构查询过滤器(IOrganizationOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定 OrganizationUnitId 下的用户关联的实体。Employee的集合查询业务,是通过重写CreateFilteredQueryAsync方法,来实现按组织架构查询的过滤条件。创建一些组织架构,命名“群组”

原创怎样优雅地增删查改(四):创建通用查询基类

怎样优雅地增删查改(四):创建通用查询基类
上一章我们实现了Employee管理模块,Employee的增删改查是通过其应用服务类,继承自Abp.Application.Services.CrudAppService实现的。在开发业务模块时,我们可以先使用简单的方式提供Curd服务,随着UI复杂度增加,逐步的使用更加复杂的Curd服务。为了更好的代码重用,我们对泛型参数进行扩展,使用CurdAppServiceBase的类可根据实际业务需求选择泛型参数。Brief是一种简化的查询实体集合的方法,其返回的Dto不包含导航属性,以减少数据传输量。

原创怎样优雅地增删查改(三):业务用户的增删查改

怎样优雅地增删查改(三):业务用户的增删查改
区别于身份管理模块(Identity模块)的鉴权用户IdentityUser,业务用户(BusinessUser)是围绕业务系统中“用户”这一定义的领域模型。这些业务用户继承自HealthUser,HealthUser是业务用户的基类,包含了业务用户的基本信息,如姓名,性别,出生日期,身份证号等。以Client为例,ClientLookupService是业务用户的查询服务,其基类UserLookupService定义了关联用户的查询接口,包括按ID查询,按用户名查询,按组织架构查询,按户关系查询等。

原创怎样优雅地增删查改(二):扩展身份管理模块

怎样优雅地增删查改(二):扩展身份管理模块
人员之间的关系是单项的,也就是说可以A是B的好友,但B不一定是A的好友。组织(OrganizationUnit)是身份管理模块的核心概念,组织是树形结构,组织之间存在父子关系。Abp为我们实现了一套身份管理模块,此模块包含用户管理、角色管理、组织管理、权限管理等功能。增加人员与组织架构管理接口,如添加/删除人员到组织架构,查询组织架构下的人员,查询未分配组织的人员等;身份管理模块(Identity模块)为通用查询接口的按组织架构查询和按户关系查询提供查询依据。

原创怎样优雅地增删查改(一):从0开始搭建Volo.Abp项目

怎样优雅地增删查改(一):从0开始搭建Volo.Abp项目
软件系统中数据库或者持久层的基本操作功能可以用Curd描述,Curd即 增加(Create)、更新(Update)、读取查询(Retrieve)和删除(Delete), 这4个单词的首字母。在常见的业务系统中,对数据的大部分操作都是Curd,在实践的过程中对数据的筛选、排序、分页、关联查询等功能抽象和封装。本系列博文将从0开始,逐步搭建一个基于Volo.Abp + Vue 的前后端分离的,具有Curd通用查询功能的项目。项目介绍本项目是基于一个简单的用户健康数据管理系统,我们将对业务常用的查询功能进

原创Vue + Volo.Abp 实现OAuth2.0客户端授权模式认证

Vue + Volo.Abp 实现OAuth2.0客户端授权模式认证
只需要清除vuex或Cookies中的token即可,可以调用vue-oidc-client的signOut,但只是跳转到配置的登出地址,不会清除token(前提是redirectAfterSignout为true,并设置了post_logout_redirect_uri)创建continue/index.vue,简单的显示登录成功的提示,常用的提示有“登录成功,正在为您继续”,“登录成功,正在为您跳转”等友好提示。(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。

原创[MAUI]用纯C#代码写两个漂亮的时钟

[MAUI]用纯C#代码写两个漂亮的时钟
谷歌在2021年5月份推出的Android 12给我们带来了新的UI设计规范Material You,你是否已经体验到了Material You设计的魅力了呢?在原生主屏幕启动器中,有一个时钟小部件。这个小部件可以选择表盘风格。图:Android 12的时钟小部件今天挑战在中实现这个Material You风格时钟。

原创[MAUI]弧形进度条与弧形滑块的交互实现

[MAUI]弧形进度条与弧形滑块的交互实现
Maxiumum:最大值Minimum:最小值Progress:当前进度AnimationLength:动画时长BorderWidth:描边宽度LabelContent:标签内容ContainerColor:容器颜色,即进度条的背景色ProgressColor:进度条颜色set;set;set;set;set;set;set;set;以及ValueChange事件,此事件用于在进度值改变时触发。

原创[MAUI]写一个跨平台富文本编辑器

[MAUI]写一个跨平台富文本编辑器
富文本编辑器是一种所见即所得(what you see is what you get 简称 WYSIWYG)文本样式编辑器,用户在编辑器中输入内容和所做的样式修改,都会直接反映在编辑器中。在Web端常见的有Quill、TinyMCE这些开源免费的富文本编辑器,而目前.NET MAUI方面没有类似的富文本编辑器可以免费使用。使用.NET MAUI实现一个富文本编辑器并不难,今天就来写一个

原创[MAUI程序设计] 用Handler实现自定义跨平台控件

[MAUI程序设计] 用Handler实现自定义跨平台控件
定义可以监听的手势类别,分别是按下、移动、抬起、取消、进入、退出Entered,Pressed,Moved,Released,Exited,Cancelled添加手势监听器TouchRecognizer,它将提供一个事件OnTouchActionInvoked,用触发手势动作。EventArg类TouchActionEventArgs,用于传递手势动作的参数get;get;get;get;

原创[MAUI]模仿Chrome下拉标签页的交互实现

[MAUI]模仿Chrome下拉标签页的交互实现
-> 今天来说说怎样在.NET MAUI 中制作一个灵动的类标签页控件,这类控件常用于页面中多个子页面的导航功能。比如在手机版的Chrome中,当用户在网页中下拉时将出现“新建标签页”,“刷新”,“关闭标签页”三个选项,通过不间断的横向手势滑动,可以在这三个选项之间切换。浏览网页常用选项融入到了原“下拉刷新”交互中,对比传统交互方式它更显便捷和流畅,根据Steve Krug之《Don't Make Me Think》的核心思想,用户无需思考点击次序,只需要使用基础动作就能完成交互。

原创[MAUI]在.NET MAUI中复刻苹果Cover Flow

[MAUI]在.NET MAUI中复刻苹果Cover Flow
Cover Flow是iTunes和Finder中的一个视图选项,允许用户使用水平滚动的图像查看他们的音乐库或文件。Cover Flow的交互设计非常优秀:通过指尖滑动从堆叠的专辑库中翻动和挑选一张专辑的交互方式不仅有趣,而且在有限的屏幕空间内,展现了更多的专辑封面。那个是乔布斯时代的苹果——使事情变得简单和有趣。最近我很怀念这个功能,但由于我手头上已经没有任何一台设备能访问这个功能了。于是在.NET MAUI中复刻了Cover flow

原创[MAUI程序设计]界面多态与实现

[MAUI程序设计]界面多态与实现
首先用控件模板定义博客条目的外观,“博客条目”是包含博客标题,内容,以及发布时间等信息的卡片,视觉上呈现圆角矩形的白色不透明卡片效果。博客条目控件是一个基于ContentView控件在页面的资源中,添加如下两个ControlTemplate模板,分别用于手机设备和桌面设备。BlogCardViewPhone用于博客条目在手机设备中的呈现,条目菜单侧滑栏方式展开,我们配置SwipeView控件,作为卡片,用一个Frame框架包裹其内容。

原创[MAUI]模仿iOS多任务切换卡片滑动的交互实现

[MAUI]模仿iOS多任务切换卡片滑动的交互实现
App之间的多任务切换相信你们都很熟悉。苹果设备从iOS9开始使用水平排列的叠层卡片来展现多任务,这个设计利用屏幕深度(z方向)和水平空间(x轴方向)的平顺结合,在有限的屏幕空间内,展现了更多的卡片,滑动屏幕时,每一个卡片在屏幕中央的时候也能得到大面积的展示。今天我们在.NET MAUI 中实现这个优秀交互效果。

原创[MAUI]模仿网易云音乐黑胶唱片的交互实现

[MAUI]模仿网易云音乐黑胶唱片的交互实现
由此可以无限的拨动唱盘实现连续切歌的效果。用当前唱盘的“瞬移”,看起来像唱盘被影子唱盘替换掉了,但是在屏幕中心活动的拖拽物,一直是真正的那个控件。结合上一小节写的三个PitGrid,此时拖拽唱盘,并且在拖拽开始,进入pit,离开pit,释放时,分别触发Start,In,Out,Over四个状态事件。此时已经实现了拖拽唱盘的基本功能,但是在释放唱盘时,影子唱盘并没有如预期那样移动到MiddlePit的中心点。注意,当音乐暂停后,停止旋转动画,当音乐恢复播放时,转盘应从之前停止的角度开始启动旋转动画。

原创[MAUI]模仿微信“按住-说话”的交互实现

[MAUI]模仿微信“按住-说话”的交互实现
在进入功能区域时,TalkBox的颜色,偏移量和宽度都会发生变化,创建一个复合动画TalkBoxAnimations,用于触发TalkBox的动画效果。此时应该是可以拖动,并且在拖拽开始,进入pit,离开pit,释放时,分别触发Start,In,Out,Over四个状态。Codebeind代码中,配置Active和DeActive方法,用于激活和取消激活功能区域按钮的样式。创建一个用于显示功能区域和TalkBox的渐变动画,用于在拖拽开始和结束时,显示和隐藏这两个控件。是一个带有按住说话的按钮。

原创[Asp.Net Core] 网站中的XSS跨站脚本攻击和防范

[Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Web脚本代码(html、javascript、css等),当用户浏览该页面时,嵌入其中的Web脚本代码会被执行,从而达到恶意攻击用户的特殊目的。源代码出自:https://www.cnblogs.com/OleRookie/p/5970167.html。重新访问,成功触发了XSS弹窗。

原创用Abp实现找回密码和密码强制过期策略

用Abp实现找回密码和密码强制过期策略
用户找回密码,确切地说是,为了保证用户账号安全,原始密码将不再以明文的方式找回,而是通过短信或者邮件的方式发送一个随机的重置校验码(带校验码的页面连接),用户点击该链接,跳转到重置密码页面,输入新的密码。这个重置校验码是一次性的,用户重置密码后立即失效。用户找回密码是在用户没有登录时进行的,因此需要先校验身份(除用户名+密码外的第二种身份验证方式)。第二种身份验证的前提是绑定了手机号或者邮箱,如果没有绑定,那么只能通过管理员进行原始密码重置。

原创用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证
常用的实现方式是在用户登录成功后,生成一个随机的字符串Token,将此Token保存在用户浏览器的 cookie 中,同时将这个字符串保存在用户的数据库中。当用户再次访问时,如果 cookie 中的字符串和数据库中的字符串相同,则免登录验证通过。rememberClientToken是存储于cookie中的,当用户登出时不需要清空cookie中的rememberClientToken,以便下次登录跳过两步验证。为了安全,Token采用对称加密传输存储,同时参与校验的还有用户Id,以进一步验证数据一致性。

原创[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构

[MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
这是一篇系列博文。请关注我,学习更多.NET MAUI开发知识!在之前的博文中提到这个项目,它是为音乐播放器专门开发的基于手势控制的UI界面。此UI界面可以让用户在不看屏幕的情况下,通过手势来控制音乐播放器的各种操作,如播放、暂停、下一首、上一首。手势来控制的交互方式适合不方便看手机屏幕时简单的音乐播放需求,在驾车、运动等场景下有较好的用户体验。

原创[MAUI 项目实战] 手势控制音乐播放器(二): 手势交互

[MAUI 项目实战] 手势控制音乐播放器(二): 手势交互
pit很简单,是一个包含了名称属性的控件,这个名称属性是用来标识pit的。定义一个拖拽物,和它拖拽的目标,拖拽物可以理解为一个平底锅(pan),拖拽目标是一个坑(pit),当拖拽物进入坑时,拖拽物就会被吸附在坑里。这里用Grid作为pit控件基类型,因为Grid可以包含子控件,我们可以在pit控件中添加子控件,比如一个图片,一个文字,这样就可以让pit控件更加丰富。,这个AbsoluteLayout类型的容器控件,内包含一系列控件作为pit,这些pit集合将作为平移手势容器的判断依据。

原创用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块
创建方法IsTwoFactorAuthRequiredAsync,返回登录用户是否需要双因素认证,若未开启TwoFactorLogin.IsEnabled、用户未开启双因素认证,或没有添加验证提供者,则跳过双因素认证。双因素认证(Two-Factor Authentication,简称 2FA)是使用两个或多个因素的任意组合来验证用户身份,例如用户提供密码后,还要提供短消息发送的验证码,以证明用户确实拥有该手机。至此,双因素认证的后端逻辑已经完成,接下来我们将补充“记住”功能,实现一段时间内免验证。

原创在EF Core中为数据表按列加密存储

在EF Core中为数据表按列加密存储
转换器将实体中属性类型,通过AES加密算法,转换为Base64编码字符串类型,存储到数据库中。当从数据库中读取数据时,再通过AES解密算法,将Base64编码字符串类型转换为实体中属性类型。在转换器中,将这些参数设置为静态属性,方便在使用时,进行修改。,则不需要转换为Base64编码字符串类型,直接对二进制数据进行加密和解密。其中有身份证号码IdentificationNumber列,需要加密存储,该如何实现?方法,为User表的IdentificationNumber列,添加值转换器。

原创解决Abp设置DefaultLanguage默认语言不生效的问题

解决Abp设置DefaultLanguage默认语言不生效的问题
默认地,Abp的语言提供程序将返回的CultureInfo为En,在一些默认实现的接口(比如/api/TokenAuth/Authenticate)返回的错误信息是英文。当请求到来时,会按照顺序依次调用这些语言提供程序,直到有语言提供程序的规则命中并返回了CultureInfo,这个CultureInfo就会被用于当前请求的语言设置。因此我们需要把AbpSettings中获取默认语言设置的优先级提高,即将AbpDefaultRequestCultureProvider排在默认的提供程序之前。

原创[Volo.Abp升级笔记]使用旧版Api规则替换RESTful Api以兼容老程序

[Volo.Abp升级笔记]使用旧版Api规则替换RESTful Api以兼容老程序
Volo.Abp 配置应用层自动生成Controller,增删查改服务(CrudAppService)将会以RESTful Api的方式生成对应的接口),这与旧版本的Abp区别很大。RESTful固然好,虽然项目里新的Api会逐步使用RESTful Api代替旧的,但在前后端分离的项目中已经定好的接口,往往需要兼容之前的方式。

原创[Python]语音识别媒体中的音频到文本

[Python]语音识别媒体中的音频到文本
Azure提供了快捷转换语音到文本的工具 https://speech.microsoft.com/portal。这里需要注意的是,需要上传的音频格式为16kHz 或 8kHz、16 位和单声道 PCM。编写代码,将视频文件test.mp4中的音频提取到test2.wav。文件以16kHz 采样率和单声道 PCM 编码方式,保存至。中的音频识别,并转换成文本写入。上传完成后将自动转换成文本。编写代码,将视频文件。

原创集成RocketChat至现有的.Net项目中,为ChatGPT铺路

集成RocketChat至现有的.Net项目中,为ChatGPT铺路
今天我们来聊一聊一个Paas的方案,如何集成到一个既有的项目中。以其中一个需求为例子:在产品项目中,加入IM(即时通信)功能,开始徒手撸代码,会发现工作量很大,去github找开源项目,结果也可能事与愿违:功能不够强大,或者用不同的语言编写的,编译出来程序集无法集成到项目中。可能当下最好的方案是利用独立的聊天功能组件,作为项目的中间件(Paas方案)。组件是独立部署,独立运行的,功能的稳定性,搭建速度快,作为基础设施服务,可以用在其他项目中,并且项目中的对接作为抽象层,可随时替换现有组件。

原创[MAUI 项目实战] 音乐播放器(三):界面交互

[MAUI 项目实战] 音乐播放器(三):界面交互
UI设计的本质是对于产品的理解在界面中多种形式的映射,当需求和定位不同时,对相同的功能表达出了不同的界面和交互方式。作为播放器,界面可以是千差万别的。《番茄播放器》的iOS平台上我开发了传统版本,和基于手势播放的版本。它们界面不同,但用的同一个播放内核。作为播放内核项目,在MatoMusic.Core的工作已经结束。本系列博文重点还是在播放器思路的解读,关于MAUI动画交互,我打算有时间另外写博客(这里给自己挖个坑)。

原创[MAUI 项目实战] 音乐播放器(二):播放内核

[MAUI 项目实战] 音乐播放器(二):播放内核
曲目排序,原理是通过交换位置实现的,iOS和Android平台都有自己的可排序列表控件,在对选中的条目进行排序(往往是提起条目-拖拽-释放)的过程中,触发事件往往提供当前条目。在传统播放器随机播放时,如果下一曲不是我想听的,我仍然想听上一曲,由于上一曲按钮是随机触发的时机,你可能找不到它了,不得不再音乐列表再搜索它。播放控制类,用于当前平台播放器对象的操作,对当前所播放曲目的暂停/播放,下一首/上一首,快进快退(寻迹),随机、单曲模式等功能的控制。同样,用到了排序逻辑,再将他的排序(

原创[MAUI 项目实战] 音乐播放器(一):概述与架构

[MAUI 项目实战] 音乐播放器(一):概述与架构
为什么想起来这个项目了呢?这是一个Windows Phone 8的老项目,2014年用作为兴趣写了个叫“番茄播放器”的App,顺便提高编程技能。这个项目的架构历经多次迁移,从WP8到UWP再到Xamarin.Forms。去年底随着MAUI的正式发布,又尝试把它迁移到MAUI上来。

原创Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块

Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块
这是一篇系列博文,我将使用Abp.Zero搭建一套集成手机号免密登录验证与号码绑定功能的用户系统:第三方身份验证在Abp中称之为, 区别于Abp的,这里Auth的全称应为Authorization,即授权。首先来厘清这两个不同的业务在Abp中的实现,我之前写的这篇系列文章中描述的业务,即使用的Abp外部身份授权(ExternalAuth)的相关扩展而实现的。还记得我们实现的WeChatAuthProvider吗?它继承于ExternalAuthProviderApi这个抽象类,实现的微信授权功能。

原创使用PdfSharp从模板生成Pdf文件

使用PdfSharp从模板生成Pdf文件
最近在做一个生成文档的需求。通过先制作一个包含各字段占位符的文档模板,导入这个模板并填写内容替换掉占位符,再输出成最终文件。由于版式固定,安全性更好,业务上常用Pdf作为最终标准化的格式, 在.Net平台下,可以使用PdfSharp导入,编辑,导出Pdf文档。

原创[学习笔记]Linux + Nginx环境下部署 Web 站点

[学习笔记]Linux + Nginx环境下部署 Web 站点
首先更改server区域内容,root为你的站点根目录,注意不要指定任何index入口,因为这是目录。出现“blockedbyCORSpolicy”,未将网站域名添加至允许跨域访问设置。拷贝dist.zip到目标服务器的文件夹下,这里以~/下载为目标。若出现无法访问,网站报403或者404,请查看nginx日志。等待打包结束,成功后将在根目录下生成dist文件夹。部分错误可参照Troubleshooting解决。将站点文件移动至/var/www/{站点名称}/.........

原创使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发

使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发
微信小程序主要为用户授权行为提供交互功能,用户在扫码之后,提供一个交互UI,如下在中介绍了服务端已经搭建的接口,这次我们将调用Access和Authenticate,分别调用来完成已扫码和已授权状态的更新。......

原创使用 Abp.Zero 搭建第三方登录模块(三):网页端开发

使用 Abp.Zero 搭建第三方登录模块(三):网页端开发
在此之前我们需写一个参数传递对象,为了保留一定的扩展能力,data中我们定义loginExternalForms,已经实现的微信小程序登录,则对应的authProvider值为“WeChatAuthProvider”,providerAccessCode则为生成的Token值。上一章,我们介绍了服务端的开发,这次我们需要调用GetACode,GetToken,分别获取小程序码,和获取当前状态。afterLoginSuccess函数用于登录成功后的逻辑,停止计时器,并跳转页面,本实例仅做弹窗提示。......

原创使用 Abp.Zero 搭建第三方登录模块(一):原理篇

使用 Abp.Zero 搭建第三方登录模块(一):原理篇
第三方登录是基于用户在第三方平台上(如微信,QQ, 百度)已有的账号来快速完成系统的登录、注册-登录等功能。以微信的鉴权为例:假如你的网站有一个扫码登录的功能,会弹出一个由微信提供的二维码页面,你需要用手机上的微信扫码,操作一下,就可以完成登录。如这个链接:微信登录 (qq.com) 嗯。从研发和使用上来说这是最快捷,也是目前大部分站点用的扫码登录方式。但这个是依赖于微信开放平台的功能,微信作为鉴权服务的提供方,有义务监管第三方的网站(你的网站相对于微信就是第三方),因此你需要有企业或组织的营业执照,经过

原创使用 Abp.Zero 搭建第三方登录模块(二):服务端开发

使用 Abp.Zero 搭建第三方登录模块(二):服务端开发
微信SDK库是针对微信相关 API 进行封装的模块 ,目前开源社区中微信SDK库数量真是太多了,我选了一个比较好用的EasyAbp WeChat库。EasyAbp/Abp.WeChat: Abp 微信 SDK 模块,包含对微信小程序、公众号、企业微信、开放平台、第三方平台等相关接口封装。 (github.com)当然这个库是ABP vNext 框架的,需要稍微改写一下。封装好后我们需要以下几个接口小程序码生成接口: 获取用户OpenId与SessionKey的接口我们先来回顾一下第三方登录在Ab

原创[学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

[学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用
使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题:1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像2. 需要一套自动化发布方案,实现代码到应用部署的自动化流程大致流程如下在java世界中有很多文章介绍了Docker+Jenkin的自动化部署方式,这次来看看如何用这一套工具实现.Net 应用的发布。以Soa项目为例MatoApps/Soa: 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间

原创将Abp移植进.NET MAUI项目(二):配置与基类编写

将Abp移植进.NET MAUI项目(二):配置与基类编写
因为我们要做一个数据持久化型的小应用,所以在完成Abp功能的集成后,我们需要做数据库相关的配置工作配置数据库在MauiBoilerplate.Core项目中,添加两个实体类:我们简单的写一个歌曲(song)的实体类其中包含了歌曲标题(MusicTitle),艺术家(Artist),专辑(Album),时长(Duration)以及发售日期(ReleaseDate) public class Song : FullAuditedEntity { .

原创将Abp移植进.NET MAUI项目(一):搭建项目

将Abp移植进.NET MAUI项目(一):搭建项目
去年12月份做了MAUI混合开发框架的调研,想起来文章里给自己挖了个坑,要教大家如何把Abp移植进Maui项目,今天来填坑。熟悉Abp的同学都知道,Abp 是一套强大的应用程序设计时框架(俗称脚手架),新版本的Abp vNext为微服务和网络优化的更多,然而本地开发经典Abp已经够用,而且官方没有停止维护,因此使用这个框架MAUI则是跨平台的应用程序抽象层,强大的运行时框架 + 强大的设计时框架 , 我说这是宇宙最强大跨平台开发框架,不为过吧?😁搭建MAUI项目请注意:本文发布时,MAUI处

原创[.Net 6]写一个简单的文件上传控件后端

[.Net 6]写一个简单的文件上传控件后端
此项目是配合上一篇文章[Vue]写一个简单的文件上传控件_林 小的博客-CSDN博客这个后端是一个FakeApi,目标是调用文件上传获得File对象。的后端程序,使用.Net 6项目框架搭建,开发前请安装Visual Studio 2022Visual Studio 2022 版本 17.1 发行说明 | Microsoft Docs搭建项目框架新建一个.Net 6 项目,选择Asp.Net Core Web Api 模板首先定义文件模型: [Serializable] .

原创[Vue]写一个简单的文件上传控件

[Vue]写一个简单的文件上传控件
这篇将介绍如何写一个简单的基于Vue+Element的文件上传控件。控件将具有1. 上传队列的列表,显示文件名称,大小等信息,可以显示上传进度实时刷新2. 取消上传使用Element的uploader控件,上传文件的行为和样式不用自己全部实现,使代码简化。且有足够的扩展性,文件传输请求的代码可以基于axios完全自己重写。我们只用关心核心代码。搭建项目框架首先建立一个空白的项目,引入Element控件库,具体的操作和使用Element控件库请看官方文档:组件 | ..

原创用Vue编写一个简单的仿Explorer文件管理器

用Vue编写一个简单的仿Explorer文件管理器
大家一定很熟悉你桌面左上角那个小电脑吧,学名Windows资源管理器,几乎所有的工作都从这里开始,文件云端化是一种趋势。怎样用浏览器实现一个Web版本的Windows资源管理器呢?今天来用Vue好好盘一盘它。一、导航原理首先操作和仔细观察导航栏,我们有几个操作途径:点击“向上”按钮回到上一个目录,点击地址栏的文件夹名称返回任意一个目录 双击文件夹进入新目录 点击“前进”,“后退”按钮操作导航其中前进,后退操作,可以点击小三角查看一个列表,点击进入文件夹,列表会记录导航历史,哪怕反复进入同一

原创[学习笔记] Rocket.Chat 安装与设置启动项

[学习笔记] Rocket.Chat 安装与设置启动项
安装Rocket.Chat下载对应的Release版本,这里以2.4.14为例https://codeload.github.com/RocketChat/Rocket.Chat/tar.gz/refs/tags/2.4.14根据文档安装和配置Linux - Rocket.Chat Developer配置Service在/etc/systemd/system/目录下新建名称为rocketchat.service的文件,填写如下内容[Unit]Description=The .

原创[学习笔记].Net5项目打包到Linux系统服务时遇到的坑

[学习笔记].Net5项目打包到Linux系统服务时遇到的坑
如果按照官方文档的步骤手动安装.Net5 会有一个坑:在 Linux 上手动安装 .NET - .NET | Microsoft Docshttps://docs.microsoft.com/zh-cn/dotnet/core/install/linux-scripted-manual在使用systemd打包.Net5服务的时候,无法运行,报错如下图:查询系统日志发现对dotnet访问没有权限,dotnet已设置权限755并且service的配置文件中User已配置为本人用户奇怪的是作.

原创[学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务

[学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务
数字证书管理服务/SSL 证书之前为了方便同事测试微信小程序,搭建了基于CentOS的预发布环境,.Net5 程序也已经部署好在上面,在公网上可以通过http协议的临时域名(jevonsflash.xxx.net)访问到后台Api。然而小程序的正式线上版本,只可以跟指定的域名进行网络通信,且域名只支持 https,wss通信协议,因此需要配置预发布环境的域名解析,Ngnix,以及证书。首先公司的域名已经备案(例如: www.matoapp.net),目标是通过这个备案的域名用https方式访问后台

原创[MAUI] 在.NET MAUI中结合Vue实现混合开发

[MAUI] 在.NET MAUI中结合Vue实现混合开发
在MAUI微软的官方方案是使用Blazor开发,但是当前市场大多数的Web项目使用Vue,React等技术构建,如果我们没法绕过已经积累的技术,用Blazor重写整个项目并不现实。Vue是当前流行的web框架, 简单来说是一套模板引擎,利用“模板”和“绑定”两大特性实现web页面mvvm模式开发。利用.NET MAUI框架可以将Vue应用嵌入到Web容器中。可以实现跨平台的混合开发。例如我在某医疗行业项目中,已经用这个混合开发的方式生成应用,Vue代码不需要做什么改动,就能跨平台运行:如果你

原创[MAUI] 混合开发概念

[MAUI] 混合开发概念
混合开发的概念是相对与原生开发来说的:App不直接运行原生程序,而是在原生程序中运行一个Web程序,原生程序中包含Web运行时,用于承载Web页面。暂且将原生应用称之为Web容器,Web容器应该能让JavaScript代码与原生平台的代码交互,互相调用,同时为上层提供交互逻辑,例如导航,事件,Cookie,刷新等内容。之前使用Xamarin可以利用WebView控件做混合开发,但是到目前为止WebView功能还是比较孱弱。用WebView实现混合开发主要是通过重写各个平台的自定义呈现器(Renderer

原创[.Net]使用Soa库+Abp搭建微服务项目框架(三):项目改造

[.Net]使用Soa库+Abp搭建微服务项目框架(三):项目改造
为什么要独立成服务?以一个健康医疗系统为例, 这个系统包含了用户模块,问卷的发放与填写,图表显示,报表生成与查看,患者管理等功能,传统的架构如下:随着项目规模的增长,在开发过程中会发现如下问题:各模块之间耦合严重,比如:报表模块引用了问卷,用户,随访,患者管理等几乎所有模块,难以维护 间接引用的情况过多,导致项目分层不明确,容易产生引用分歧,难以维护目前做的就是解耦各个模块之间的强关联状态,通过上一章提到的上下文边界划分方式,我们大致可以将系统的架构改造如下:通过调用者和实现者共

原创[.Net]使用Soa库+Abp搭建微服务项目框架(四):动态代理和RPC

[.Net]使用Soa库+Abp搭建微服务项目框架(四):动态代理和RPC
上一章我们完成了小项目的面向服务体系改造,你或许一直在思考一个问题。为什么要将业务独立成微服务?以一个健康医疗系统为例, 这个系统包含了用户模块,问卷的发放与填写,图表显示,报表生成与查看,患者管理等功能,传统的架构如下:随着项目规模的增长,在开发过程中会发现如下问题:各模块之间耦合严重,比如:报表模块引用了问卷,用户,随访,患者管理等几乎所有模块,难以维护 间接引用的情况过多,导致项目分层不明确,容易产生引用分歧,难以维护目前做的就是解耦各个模块之间的强关联状态,通过第一章提到的上下文

原创[.Net]使用Soa库+Abp搭建微服务项目框架(二):面向服务体系的介绍

[.Net]使用Soa库+Abp搭建微服务项目框架(二):面向服务体系的介绍
上一章我们建立了一个典型的面向领域设计的Abp小项目,如果按照常规的开发方式,会遇到什么问题呢?先来完善一下这个小项目,在定义好各实体类后,运行Miguration并向数据库里写入一些初始数据。现在整个项目的依赖引用图如下,每一个都有独立的引用路线,互不干涉。简略图如下假设现在有一个需求,MainService业务需要用到Service1和Service2 中的数据,如何操作?在使用Abp框架时,传统开发方式是先建立领域层服务,应用层中调用领域层服务(Manager)并返回给UI

原创[.Net]使用Soa库+Abp搭建微服务项目框架(一):Abp与DDD相关知识回顾

[.Net]使用Soa库+Abp搭建微服务项目框架(一):Abp与DDD相关知识回顾
在企业中大型项目中,随着业务的不断拓展,项目发展到一定程度,需要寻求项目的各模块解耦,独立成为微服务。如何实现呢?首先我们先来简单回顾一下Abp框架怎样实现(DDD)领域驱动设计的,Abp框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目),我们知道在领域驱动设计中,我们可以将整个系统分为四个大的层次,每一个层次都有其特定的功能,所以整个项目整体结构是非常清楚的。Eric Evans在《领域驱动设计-软件核心复杂性应对之道》这本书中提出了传统的四层架构

原创[.Net]使用ABP 数据库迁移migration遇到的坑及解决方案

[.Net]使用ABP 数据库迁移migration遇到的坑及解决方案
-> 问题:在使用Update-Database时,突然出现“数据库中已存在名为 'XXX' 的对象”。检查发现__EFMigrationsHistory表中的MigrationId与项目中的EntityFrameworkCore项目中的Migrations内容有不同的地方。ABP的更新机制是对比数据库的id与Migrations各文件Id,如果数据库缺少则往下继续执行,但如果有id冲突,则会认为产生分支,从第一个开始执行了。结果造成读到的全部是CREATE TABLE 的操作,从而产生冲突。解决

原创用PyInstaller打包PyQt程序

用PyInstaller打包PyQt程序
在工程根目录下新建一个打包脚本 pyinstall-singlefile.py 在工程根目录下创建icon图标,mainIcon.ico打开pyinstall-singlefile.py