首页 文章 精选 留言 我的

精选列表

搜索[V模型],共10000篇文章
优秀的个人博客,低调大师

🍋 运维工单系统 WGCAT v1.1 正式发布

WGCAT是WGCLOUD团队近期新推出的一款运维工单系统,设计一如既往的的简单实用,具有部署方便,上手容易,性能优秀,界面友好等特点。 WGCAT 工单系统中,每个人都可以新建工单,每个账号都具有新建工单的权限,而且还有对外提供的工单提交接口,当工单在流转过程中,你也可以评论工单,工单每次流转都会给经办人,也就是受理人发送通知,这个通知方式可以是邮件,也可以是微信或者钉钉等其他方式。 官网:http://www.wgstart.com

优秀的个人博客,低调大师

开放签开源工具 V1.2 版增加骑缝签功能

最近在开放签社区遇到很多关于骑缝签电子签章功能的需求,开放签近期在开源工具版增加了骑缝签功能并开放了源代码。如果有朋友在需要此类功能的支持,现在可以通过获取开放签的开源代码来自行部署实施。 如果有关于如何使用或集成骑缝签功能的具体问题,欢迎加入我们的QQ社区,我们会尽量提供帮助。 一、骑缝签功能介绍: 骑缝签是一种传统的印章使用方式,尤其适用于多页文档的完整性验证,确保文档在装订前后内容没有被篡改。电子骑缝签功能则是这一传统方式在数字化时代的延伸应用,它通过对签章图片的分割和电子签名技术在电子文档的每一页边缘或交叉处生成连续的签章图像和数字签名,从而达到同样的防伪、防篡改和保真的效果。简而言之,骑缝章只是为了还原线下物理用印的直观上样式 ,电子文件只要任意加盖一处电子签章即可起到加密防篡改的作用。 二、代码结构如下: (1)骑缝签测试类代码路径: kaifangqian-demo-api/src/test/java/org/resrun/TestChopStampSign.java (2)骑缝签功能实现相关类: 骑缝签位置计算类:kaifangqian-sdk/src/main/java/org/resrun/sdk/service/CalculatePositionService.java 骑缝签签署类:kaifangqian-sdk/src/main/java/org/resrun/sdk/service/SDKService.java 三、如需获取完整代码,请访问开放签开源社区: https://gitee.com/kaifangqian/kaifangqian-base

优秀的个人博客,低调大师

NioDB v0.1.1 发布 - 高性能本地 JSON 数据库

NioDB 是一个超级简单的高性能本地 JSON 数据库。 安装 $ npm i niodb --save 例子 以下代码在一个空的example_data.json文件中创建了 Nio 数据库,并添加了一些键值对到数据库中。 import { Nio } from 'niodb' // 或 const { Nio } = require('niodb') const db = await new Nio('example_data.json') db.name = 'NioDB' db.message = 'Hello NioDB!' db.users = { count: 100 } db.users.count++ example_data.json文件在代码运行之后将会变成: { "name": "NioDB", "message": "Hello NioDB!", "users": { "count": 101 } } 开始 设置 / 获取值 在数据库中设置值的方式和给 JavaScript 的对象设置值的方式一样: import { Nio } from 'niodb' const db = await new Nio() db.key = 'value' 如果filepath是一个字符串,数据库中的数据将异步且原子地存储到指定的文件中。 获取一个键的值也非常简单: console.log(db.key) 🌟 只需将 Nio 对象视作一个普通的 JavaScript 对象。 封装函数 或者,你可以使用封装函数$set和$get来做同样的事。 db.$set(key, value) db.$get(key) 删除 / 检查一个键是否存在 就像在 JavaScript 对象中使用 delete 删除键和使用 in 关键字检查键是否存在一样: delete db.key console.log(key in db) 封装函数 db.$delete(key) db.$exists(key) API Nio new Nio(filepath, config): 每个 Nio 对象都是一个绑定到一个 json 文件的数据库: const database = await new Nio(filepath, config); Filepath - json 文件路径 如果filepath是一个字符串,new Nio(filepath)返回一个 Promise 对象,这个对象将会返回一个 Nio 实例,所以你需要使用await关键字来获取这个 Nio 对象。 如果filepath是 undefined,它将会直接返回一个 Nio 对象,所以不需要使用await关键字。然而,为了保证代码的一致性,你总是应该在实例化 Nio 数据库时使用await,无论是否定义了 filepath。 Config - 配置对象 config是可选的,它应该是一个 JavaScript 对象。 所有的配置如下: await new Nio(filepath, { // 本地的 json 文件被更新时调用 transactionUpdated: () => {} }) 封装函数 以下是所有的封装函数: $set(key, value): 设置一个键的值。将值设置为undefined将会导致TypeError。 $get(key): 获取一个键的值。 $delete(key): 删除键。 $exists(key): 如果键存在,返回 true。 $randomKey(): 返回一个随机的键。 $rename(key, newKey): 将键设置为一个新名称,如果新名称已被占用则替换。 $type(key): 返回键中存储的值的数据类型。所有可能的返回值:array,object,null,number,string,boolean, 和undefined。 链式调用 你可以链式调用封装函数: const db = await new Nio() db.content = { content1: 'hello', content2: 'this is NioDB', content3: 'you will like it' } db.content.$delete('content1').$rename('content2', 'introduction').$set('content3', true) console.log(db) 数据库中的数据将会是: { content: { content3: true, introduction: 'this is NioDB' } } 错误处理 import { DatabaseError } from 'niodb' Github 仓库:https://github.com/billdong9/niodb

优秀的个人博客,低调大师

🦉 谋士以身入局,.NET 框架 Furion v4.9.2 发布

谋士以身入局,破局以力行实践。 谋士以身入局,破局以力行实践。世间之事,如同棋局,纷繁复杂,难以一眼洞穿。唯有亲身涉入其中,方能体悟其微妙变化,洞悉其深藏之规律。 人生亦是如此,奇妙无穷,福祸相依。有时,我们会在逆境中遇到转机,峰回路转;有时,又会在顺境中遭遇波折,跌宕起伏。但正是这些起起伏伏,构成了我们丰富多彩的人生画卷。 2024.03.31 百小僧 时间总是在不经意间从每日充实且忙碌的生活中悄悄溜走。距离上一次发版已经过去了整整十天。 随着 Furion 的声誉日益提升,其用户数量也呈现出迅猛的增长态势。作为 .NET 领域的热门流行框架,Furion 在 Gitee 平台上收获了超过 11K 的星星,NuGet 下载量更是突破了 1500 万大关。同时,我们的文档注册用户数量已经达到了 4.8万+,每日浏览量高达 60万+,独立访客数量也超过了 4 万。更令人振奋的是,已经有超过 4100 家企业选择使用 Furion,这充分证明了其在业界的广泛认可与卓越价值。 开源需躬身入局 只要你的开源项目足够风靡,且你对其倾注的心血如同养育子女般深厚,那么在寻求商业化的道路上,难免会遇到一些毫无底线、唯利是图的企业和个人开发者。正因如此,像Elasticsearch、Kibana、MongoDB和Redis这样的知名开源项目,都不得不选择修改其开源协议,以应对这种局面。传统的OSI定义显然已经无法准确概括现代开源运动的复杂性和多样性,因此,越来越多的项目开始倾向于采用更加灵活和适应性强的SSPL协议。 然而,反观国内的开源圈,不少所谓的导师、布道师,甚至是开源平台的创始人,他们中的大多数人都没有亲自经历过从零到一打造一款成功的开源项目,更谈不上实现商业化的蜕变。但即便如此,他们却热衷于以导师的身份来指导我们如何进行开源工作。这不禁让人想起那句评论“文章写尽太平事,不肯俯首见苍生。”,他们或许擅长纸上谈兵,但对于真正的开源世界和其中的艰辛与挑战,却缺乏深入的了解和体验。 项目信息 Gitee:https://gitee.com/dotnetchina/Furion Github:https://github.com/MonkSoul/Furion 文档:https://furion.net 本期亮点 1.控制器/动态 WebAPI 方法添加 [DisplayName] 特性生成 Swagger 文档注释 问题分析 在默认情况下,当控制器中的Action方法需要在Swagger中附带注释时,开发者通常会使用///注释语法。例如: +/// <summary> +/// 我是一段注释 +/// </summary> public void SomeAction() { } 在实际的项目开发中,为了提高代码的可读性和便于后续的审计日志记录,我们更倾向于使用[DisplayName]特性来为每一个Action方法命名。这会导致代码中存在冗余的注释信息,如下所示: /// <summary> +/// 新增用户 /// </summary> +[DisplayName("新增用户")] public void SomeAction() { } 解决方案 为了简化这一流程,减少不必要的重复工作,我们提供了一个功能:使[DisplayName]特性也能自动生成注释。这样,开发者就无需再额外添加///注释语法,也能在Swagger中看到相应的注释信息。 具体实现如下: -/// <summary> -/// 新增用户 -/// </summary> +[DisplayName("新增用户")] public void SomeAction() { } 通过上述改进,开发者可以更加高效地为Action方法添加描述信息,同时保持代码的整洁和可读性。 最终效果 优先级 如果同时提供了///注释和[DisplayName]特性,那么后者将覆盖前者。 2.定时任务持久化 IJobPersistence 接口方法为异步方法 为了避免定时任务持久化存在死锁风险,故将所有方法调整为异步方法(破坏性): /// <summary> /// 作业调度持久化器 /// </summary> public interface IJobPersistence { /// <summary> /// 作业调度器预加载服务 /// </summary> /// <param name="stoppingToken">取消任务 Token</param> /// <returns><see cref="Task"/></returns> - IEnumerable<SchedulerBuilder> Preload(); + Task<IEnumerable<SchedulerBuilder>> PreloadAsync(CancellationToken stoppingToken); /// <summary> /// 作业计划初始化通知 /// </summary> /// <param name="builder">作业计划构建器</param> /// <param name="stoppingToken">取消任务 Token</param> /// <returns><see cref="Task"/></returns> - SchedulerBuilder OnLoading(SchedulerBuilder builder); + Task<SchedulerBuilder> OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken); /// <summary> /// 作业信息更改通知 /// </summary> /// <param name="context">作业信息持久化上下文</param> /// <returns><see cref="Task"/></returns> - void OnChanged(PersistenceContext context); + Task OnChangedAsync(PersistenceContext context); /// <summary> /// 作业触发器更改通知 /// </summary> /// <param name="context">作业触发器持久化上下文</param> /// <returns><see cref="Task"/></returns> - void OnTriggerChanged(PersistenceTriggerContext context); + Task OnTriggerChangedAsync(PersistenceTriggerContext context); /// <summary> /// 作业触发记录通知 /// </summary> /// <param name="timeline">作业触发器运行记录</param> /// <returns><see cref="Task"/></returns> - void OnExecutionRecord(TriggerTimeline timeline); + Task OnExecutionRecordAsync(TriggerTimeline timeline); } 最新IJobPersistence接口声明: namespace Furion.Schedule; /// <summary> /// 作业调度持久化器 /// </summary> public interface IJobPersistence { /// <summary> /// 作业调度器预加载服务 /// </summary> /// <param name="stoppingToken">取消任务 Token</param> /// <returns><see cref="Task"/></returns> Task<IEnumerable<SchedulerBuilder>> PreloadAsync(CancellationToken stoppingToken); /// <summary> /// 作业计划初始化通知 /// </summary> /// <param name="builder">作业计划构建器</param> /// <param name="stoppingToken">取消任务 Token</param> /// <returns><see cref="Task"/></returns> Task<SchedulerBuilder> OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken); /// <summary> /// 作业信息更改通知 /// </summary> /// <param name="context">作业信息持久化上下文</param> /// <returns><see cref="Task"/></returns> Task OnChangedAsync(PersistenceContext context); /// <summary> /// 作业触发器更改通知 /// </summary> /// <param name="context">作业触发器持久化上下文</param> /// <returns><see cref="Task"/></returns> Task OnTriggerChangedAsync(PersistenceTriggerContext context); /// <summary> /// 作业触发记录通知 /// </summary> /// <param name="timeline">作业触发器运行记录</param> /// <returns><see cref="Task"/></returns> Task OnExecutionRecordAsync(TriggerTimeline timeline); } 3.动态 WebAPI 自定义 [Route] 模板中包含路由约束并且含有大小写字母导致生成错误路由问题 问题分析 在特定情况下,当控制器及其内部的Action方法均采用自定义的[Route]特性,并且Action层面的[Route]定义中包含了含有大小写字母的路由参数约束时,系统默认的行为会导致此类参数中的大小写字母被统一转换为小写,从而引发路由匹配失效的问题。比如: +[Route("api/[controller]/[action]")] public class ShareController : IDynamicApiController { + [Route("/api/share/position/position/{positionID:int}")] public void Position(int positionID) { // ... } } 上述代码片段中,Position方法的路由约束{positionID:int}显然包含一个大小写混合的参数名,其中ID部分采用了大写字母。然而,在实际运行时,该参数会被错误地格式化成全小写形式: /api/share/position/position/{positionid} 这种格式化行为导致原本期望匹配的positionID变为了positionid,进而使得按照原始定义的大小写格式发送请求时,路由无法正确匹配。 修正效果 针对这一问题,在当前的版本更新中已实施了相应的修复措施,具体做法是:保持路由约束内{}包含的参数名称的原始大小写不变。因此,在修复后的场景下,正确的路由格式应该是: /api/share/position/position/{positionID} 这样一来,路由参数的大小写得以保留,确保了路由匹配逻辑的正确性和一致性。 4.数据库日志写入接口 IDatabaseLoggingWriter 方法为异步 WriteAsync 问题背景 解决方案 IDatabaseLoggingWriter接口方法调整(破坏性更改): - public void Write(LogMessage logMsg, bool flush) + public Task WriteAsync(LogMessage logMsg, bool flush) // 改为异步方法,提升日志写入吞吐量 调整为异步方法之后,可以大大提升数据库日志写入的吞吐量,同时还能实现速率的控制,如: public async Task WriteAsync(LogMessage logMsg, bool flush) { // 数据库写入~ + await Task.Delay(50); // 延迟 0.05 秒写入数据库,有效减少高频写入数据库导致死锁问题 } 在增强日志提供器的队列容量后,成功缓解了高频日志引发的长时间队列积压和阻塞问题,并显著提升了文件写入的吞吐量。这一改进遵循了“以空间换取时间”的设计理念,即通过适度牺牲部分即时内存来换取更为出色的系统处理效率,从而实现了整体性能的优化。 测试实图 内存情况 文件大小 20万行写入 本期更新 更新日志:https://furion.net/docs/category/upgrade 新特性 [新增] 控制器/动态 WebAPI 方法添加 [DisplayName] 特性生成 Swagger 文档注释 4.9.2.3 ⏱️2024.03.30 0f24c66 [新增] 远程请求且出现异常时输出重试日志 4.9.2.1 ⏱️2024.03.29 e4549eb [新增] 定时任务启动时检查不合法的作业触发器配置并打印警告日志 4.9.2 ⏱️2024.03.28 3190f4c 突破性变化 [调整] 定时任务持久化 IJobPersistence 接口方法为异步方法 4.9.1.59 ⏱️2024.03.25 c6af42d [调整] 数据库日志写入接口 IDatabaseLoggingWriter 方法为异步 WriteAsync 4.9.1.58 ⏱️2024.03.24 98584b2 问题修复 [修复] 在 .NET8 之后修改 System.Text.Json 默认序列化选项引发 This JsonSerializerOptions instance is read-only or has already been used in serialization or deserialization. 异常问题 4.9.2.2 ⏱️2024.03.29 9f44653 [修复] 远程请求 IHttpDispatchProxy 模式配置重试策略无效 4.9.2.1 ⏱️2024.03.29 #I9CK7X [修复] 动态 WebAPI 自定义 [Route] 模板中包含路由约束并且含有大小写字母导致生成错误路由问题 4.9.1.61 ⏱️2024.03.27 cc1a7ec [修复] 定时任务持久化单个作业触发器订阅执行器出现异常导致持久化服务宕机问题 4.9.1.60 ⏱️2024.03.26 a1014db [修复] EntityFramework Core 反向工程脚本 cli.ps1 正则表达式匹配错误 4.9.1.59 ⏱️2024.03.26 !872 @cnbdas 其他更改 [调整] 默认 System.Text.Json 序列化提供器选项为不区分大小写匹配 4.9.2.1 ⏱️2024.03.29 b58e7be [调整] 任务队列 concurrent 类型定义,由 object 调整为 bool? 4.9.1.57 ⏱️2024.03.22 cebb48d 文档 [更新] 事件总线文档、定时任务文档、规范化接口文档、远程请求文档

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册