首页 文章 精选 留言 我的

精选列表

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

ShopXO 免费开源商城系统 v5.0 版本已发布,精益求精

更新日志 1.【优化】后台UI全新优化、极致体验 2.【优化】上传附件组件增加组合和预览 3.【优化】发票支持专用电子发票 4.【优化】进销存商城同步到进销存支持多仓库对应同步、客户和供应商增加直接查看 5.【优化】门店业务流程优化、小程序端支持门店购物车 6.【优化】小程序适配百度和头条底部tab 7.【优化】搜索页面商品分类层级读取下级 8.【优化】所有插件管理导航统一组件 9.【新增】手机端支持APP(IOS+Android) 10.【新增】手机端支持多语言(中文、繁体、英文、西班牙) 11.【新增】手机端我的中支持门店订单查看和下单自动进入门店订单 12.【新增】手机端购物车支持优惠明显查看及选择 13.【新增】短信对接多平台(腾讯、百度、云片、loginsms) 14.【新增】第三方登录APP支持(微信、QQ、苹果、谷歌、本机号码) 15.【新增】扫码收款和消息通知支持语音播报 16.【新增】订单商品表单细节优化,新增类型(整数、邮箱、手机)、并支持手机端 17.【新增】订单再次购买支持回购和加购物车选择 18.【新增】头条支付支付企业担保 19.【新增】插件支持自动批量更新 20.【新增】后台新增常用功能 21.【新增】新增商品评论管理 22.【新增】新增下单备注预选择 23.【新增】手机端商品分类页面带排序 24.【新增】下单积分自定义 25.【新增】优惠券支持默认选择(最优惠、快过期) 手机端效果图片展示 PC 效果图片展示 后台管理 效果图片展示

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

.NET 全能 Cron 表达式解析库 TimeCrontab v3.3.6

TimeCrontab .NET 全能 Cron 表达式解析库,支持 Cron 所有特性。 特性 支持 Cron 所有特性 超高性能 易拓展 很小,仅4KB 无第三方依赖 跨平台 高质量代码和良好单元测试 支持.NET Framework 3.5+及后续版本 安装 Package Manager Install-Package TimeCrontab .NET CLI dotnet add package TimeCrontab 快速入门 我们在主页上有不少例子,这是让您入门的第一个: 常规格式:分 时 天 月 周 var crontab = Crontab.Parse("* * * * *"); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now); 支持年份:分 时 天 月 周 年 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now); 支持秒数:秒 分 时 天 月 周 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now); 支持秒和年:秒 分 时 天 月 周 年 var crontab = Crontab.Parse("* * * * * * *", CronStringFormat.WithSecondsAndYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now); 获取休眠差实现简单定时任务 // 阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); while(true) { Thread.Sleep(crontab.GetSleepMilliseconds(DateTime.Now)); Console.WriteLine(DateTime.Now.ToString("G")); } // 无阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); Task.Factory.StartNew(async () => { while (true) { await Task.Delay(crontab.GetSleepMilliseconds(DateTime.Now)); Console.WriteLine(DateTime.Now.ToString("G")); } }, TaskCreationOptions.LongRunning); BackgroundService实现简单定时任务 using TimeCrontab; namespace WorkerService; public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly Crontab _crontab; public Worker(ILogger<Worker> logger) { _logger = logger; _crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var taskFactory = new TaskFactory(System.Threading.Tasks.TaskScheduler.Current); await taskFactory.StartNew(async () => { // 你的业务代码写到这里面 _logger.LogInformation("Worker running at: {time}", DateTime.Now); await Task.CompletedTask; }, stoppingToken); await Task.Delay(_crontab.GetSleepMilliseconds(DateTime.Now), stoppingToken); } } } Macro 标识符 // macro 字符串 var secondly = Crontab.Parse("@secondly"); // 每秒 var minutely = Crontab.Parse("@minutely"); // 每分钟 var hourly = Crontab.Parse("@hourly"); // 每小时 var daily = Crontab.Parse("@daily"); // 每天 00:00:00 var monthly = Crontab.Parse("@monthly"); // 每月 1 号 00:00:00 var weekly = Crontab.Parse("@weekly"); // 每周日 00:00:00 var yearly = Crontab.Parse("@yearly"); // 每年 1 月 1 号 00:00:00 var workday = Crontab.Parse("@workday"); // 每周一至周五 00:00:00 // 静态属性 var secondly = Crontab.Secondly; // 每秒 var minutely = Crontab.Minutely; // 每分钟 var hourly = Crontab.Hourly; // 每小时 var daily = Crontab.Daily; // 每天 00:00:00 var monthly = Crontab.Monthly; // 每月 1 号 00:00:00 var weekly = Crontab.Weekly; // 每周日 00:00:00 var yearly = Crontab.Yearly; // 每年 1 月 1 号 00:00:00 var workday = Crontab.Workday; // 每周一至周五 00:00:00 Macro At 标识符 // 每第 3 秒 var crontab = Crontab.SecondlyAt(3); // 每第 3,5,6 秒 var crontab = Crontab.SecondlyAt(3, 5, 6); // 每分钟第 3 秒 var crontab = Crontab.MinutelyAt(3); // 每分钟第 3,5,6 秒 var crontab = Crontab.MinutelyAt(3, 5, 6); // 每小时第 3 分钟 var crontab = Crontab.HourlyAt(3); // 每小时第 3,5,6 分钟 var crontab = Crontab.HourlyAt(3, 5, 6); // 每天第 3 小时正(点) var crontab = Crontab.DailyAt(3); // 每天第 3,5,6 小时正(点) var crontab = Crontab.DailyAt(3, 5, 6); // 每月第 3 天零点正 var crontab = Crontab.MonthlyAt(3); // 每月第 3,5,6 天零点正 var crontab = Crontab.MonthlyAt(3, 5, 6); // 每周星期 3 零点正 var crontab = Crontab.WeeklyAt(3); var crontab = Crontab.WeeklyAt("WED"); // SUN(星期天),MON,TUE,WED,THU,FRI,SAT // 每周星期 3,5,6 零点正 var crontab = Crontab.WeeklyAt(3, 5, 6); var crontab = Crontab.WeeklyAt("WED", "FRI", "SAT"); // 还支持混合 var crontab = Crontab.WeeklyAt(3, "FRI", 6); // 每年第 3 月 1 日零点正 var crontab = Crontab.YearlyAt(3); var crontab = Crontab.YearlyAt("MAR"); // JAN(一月),FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC // 每年第 3,5,6 月 1 日零点正 var crontab = Crontab.YearlyAt(3); var crontab = Crontab.YearlyAt(3, 5, 6); var crontab = Crontab.YearlyAt("MAR", "MAY", "JUN"); // 还支持混合 var crontab = Crontab.YearlyAt(3, "MAY", 6); 更多文档 文档 您可以在主页找到 TimeCrontab 文档。 测试 public class TimeCrontabUnitTests { [Theory] [InlineData("* * * * *", "* * * * *", CronStringFormat.Default)] [InlineData("0 0 31W * *", "0 0 31W * *", CronStringFormat.Default)] [InlineData("0 23 ? * MON-FRI", "0 23 ? * 1-5", CronStringFormat.Default)] [InlineData("*/5 * * * *", "*/5 * * * *", CronStringFormat.Default)] [InlineData("30 11 * * 1-5", "30 11 * * 1-5", CronStringFormat.Default)] [InlineData("23 12 * JAN *", "23 12 * 1 *", CronStringFormat.Default)] [InlineData("* * * * MON#3", "* * * * 1#3", CronStringFormat.Default)] [InlineData("*/5 * L JAN *", "*/5 * L 1 *", CronStringFormat.Default)] [InlineData("0 0 ? 1 MON#1", "0 0 ? 1 1#1", CronStringFormat.Default)] [InlineData("0 0 LW * *", "0 0 LW * *", CronStringFormat.Default)] [InlineData("0 30 10-13 ? * WED,FRI", "0 30 10-13 ? * 3,5", CronStringFormat.WithSeconds)] [InlineData("0 */5 * * * *", "0 */5 * * * *", CronStringFormat.WithSeconds)] [InlineData("0 0/1 * * * ?", "0 */1 * * * ?", CronStringFormat.WithSeconds)] [InlineData("5-10 30-35 10-12 * * *", "5-10 30-35 10-12 * * *", CronStringFormat.WithSeconds)] public void TestParse(string expression, string outputString, CronStringFormat format) { var output = Crontab.Parse(expression, format).ToString(); Assert.Equal(outputString, output); } [Theory] [InlineData("* * * * *", "2022-01-01 00:01:00", CronStringFormat.Default)] [InlineData("0 0 31W * *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 23 ? * MON-FRI", "2022-01-03 23:00:00", CronStringFormat.Default)] [InlineData("*/5 * * * *", "2022-01-01 00:05:00", CronStringFormat.Default)] [InlineData("30 11 * * 1-5", "2022-01-03 11:30:00", CronStringFormat.Default)] [InlineData("23 12 * JAN *", "2022-01-01 12:23:00", CronStringFormat.Default)] [InlineData("* * * * MON#3", "2022-01-17 00:00:00", CronStringFormat.Default)] [InlineData("*/5 * L JAN *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 0 ? 1 MON#1", "2022-01-03 00:00:00", CronStringFormat.Default)] [InlineData("0 0 LW * *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 30 10-13 ? * WED,FRI", "2022-01-05 10:30:00", CronStringFormat.WithSeconds)] [InlineData("0 */5 * * * *", "2022-01-01 00:05:00", CronStringFormat.WithSeconds)] [InlineData("0 0/1 * * * ?", "2022-01-01 00:01:00", CronStringFormat.WithSeconds)] [InlineData("5-10 30-35 10-12 * * *", "2022-01-01 10:30:05", CronStringFormat.WithSeconds)] public void TestGetNextOccurence(string expression, string nextOccurenceString, CronStringFormat format) { var beginTime = new DateTime(2022, 1, 1, 0, 0, 0); var crontab = Crontab.Parse(expression, format); var nextOccurence = crontab.GetNextOccurrence(beginTime); Assert.Equal(nextOccurenceString, nextOccurence.ToString("yyyy-MM-dd HH🇲🇲ss")); } } 贡献 该存储库的主要目的是继续发展 TimeCrontab 核心,使其更快、更易于使用。TimeCrontab 的开发在Gitee上公开进行,我们感谢社区贡献错误修复和改进。 许可证 TimeCrontab 采用MIT开源许可证。 本期更新 新特性 [新增]Crontab.IsValid(...)静态方法,判断Cron表达式是否有效4.8.7.17⏱️2023.03.20#I6OHO4 [新增]crontab.GetSleepTimeSpan(baseTime)实例方法4.8.4.10⏱️2023.01.09#I69HM4 [新增]Crontab.ParseAt(..)静态方法4.8.2.6⏱️2022.11.30035cc23 [新增]Crontab所有Macro At静态方法4.8.2.6⏱️2022.11.30a15b69d [新增]Crontab.Workday表示周一至周五的Macro静态属性4.8.2.6⏱️2022.11.30a15b69d 问题修复 [修复]Cron表达式步长解析器错误4.8.8.25⏱️2023.06.14#I7D9XU [修复]Cron表达式*符号解析器不够严谨,如:*1111aaaaa也被解析为*4.8.7.17⏱️2023.03.20#I6OHO4

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

🎉 Socket.D v2.3 发布(打通前端与后端)

基于事件和语义消息流的网络应用层协议。 有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,来回相关的消息会串成一个流 语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台 断线重连,自动连接恢复 多路复用,一个连接便可允许多个请求和响应消息同时运行 双向通讯,单链接双向互听互发 自动分片,数据超出 16Mb(大小可配置),会自动分片、自动重组(udp 除外) 接口简单,是响应式但用回调接口 Java 适配更新(兼容 server 与 android): 新增 SendStream,RequestStream,SubscribeStream 三个流接口。强化流接口体验 添加 基于流接口,实现数据上传与下载的进度通知机制 添加 基于流接口,实现异常通知机制 调整 send 接口体验,基于流接口改造 smartsocket 升为 1.5.41 接口变化 描述 旧:session.send(event, entity) 新:session.send(event, entity) -> SendStream 发送 旧:session.sendAndRequest(event, entity, timeout?, callback) 新:session.sendAndRequest(event, entity, timeout?) -> RequestStream 发送并请求(要求1个答复) 旧:session.sendAndSubscribe(event, entity, timeout?, callback) 新:session.sendAndSubscribe(event, entity, timeout?) -> SubscribeStream 发送并订阅(可接收多个答复) Javascript 适配更新(兼容 h5, uniapp, node.js): 新增 SendStream,RequestStream,SubscribeStream 三个流接口。强化流接口体验 添加 基于流接口,实现数据上传与下载的进度通知机制 添加 基于流接口,实现异常通知机制 调整 send 接口体验,基于流接口改造 //发送 session.send("/demo/hello", SocketD.newEntity("hi")); //发送,且获取发送进度(如果有大数据发送,又需要显示进度) session.send("/demo/upload", SocketD.newEntity(file)).thenProgress((isSend, val, max)=>{ if(isSend){ //获取发送进度 } }); //发送并请求,且同步等待 let reply = session.sendAndRequest("/demo/hello", SocketD.newEntity()).await(); //发送并请求,且取接收进度(如果有大数据获取,又需要显示进度) session.sendAndRequest("/demo/download", SocketD.newEntity()).thenProgress((isSend, val, max)=>{ if(!isSend){ //获取接收进度 } }).thenReply(reply=>{ //异步获取答复 }).thenError(err=>{ //如果有出错? }); //发送并订阅 let entity = SocketD.newEntity().metaPut("videoId","1").meatPut("start","5").meatPut("size","5"); session.sendAndSubscribe("/demo/stream", entity).thenReply(reply=>{ //异步获取答复(会多次回调) }) 视频效果: for H5 https://www.bilibili.com/video/BV1ck4y197BV/ for UniAPP https://www.bilibili.com/video/BV1T94y1T7sp/ 代码仓库: https://gitee.com/noear/socketd https://github.com/noear/socketd 官网: https://socketd.noear.org

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

FolkMQ 消息中间件 v1.0.26(添加 ws 端口支持)

简介 采用 “多路复用” + "内存运行" + "快照持久化" + "Broker 集群模式"(可选) 基于Socket.D 网络应用协议开发。全新设计,自主架构! 角色 功能 生产端 发布消息(Qos0、Qos1)、发布定时消息(Qos0、Qos1)、发布重试 消费端 订阅、取消订阅 消费端 消费-ACK(自动、手动) 服务端 发布-Confirm、订阅-Confirm、取消订阅-Confirm、派发-Retry、派发-Delayed 服务端 内存运行、快照持久化(自动、停机、手动) 服务端 集群热扩展 特点 高吞吐量、低延迟 FolkMQ 纯内存运行,每秒能处理几十万条消息,最低延迟不到1毫秒。 可扩展性 FolkMQ Broker 集群支持 folkmq-server 节点热扩展。流量高时随时加,流量低时可减 持久性、可靠性 消息被快照持久化(类似于 redis)到本地磁盘,并且支持数据备份防止数据丢失 高可用 集群内任何节点坏掉只要还有“一个”同类节点,仍可提供服务 快(单机版,180K TPS)。有点像 Redis 之于 MySql。 本次更新 添加 folkmq-broker 对 ws 协议的支持 sokcet.d 升为 2.2.2 //server //docker run -p 18602:18602 -p 8602:8602 noearorg/folkmq-server:1.0.26 //client public class ClientDemo { public static void main(String[] args) throws Exception { //客户端 //MqClient client = FolkMQ.createClient("folkmq://127.0.0.1:18602").connect(); //tcp 端口 MqClient client = FolkMQ.createClient("folkmq:ws://127.0.0.1:18603").connect(); //ws 端口 //订阅 client.subscribe("demo", "demoapp", message -> { System.out.println(message); }); //发布 client.publishAsync("demo", new MqMessage("helloworld!")); } } 代码仓库 https://gitee.com/noear/folkmq https://github.com/noear/folkmq 官网 https://folkmq.noear.org

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

Socket.D 网络应用层协议,v2.1.15 发布

有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http” 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,有相关的消息会串成一个流 语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台 断线重连,自动连接恢复 多路复用,一个连接便可允许多个请求和响应消息同时运行 双向通讯,单链接双向互听互发 自动分片,数据超出 16Mb(大小可配置),会自动分片、自动重组(udp 除外) 接口简单,是响应式但用回调接口 与其它协议的简单对比 对比项目 socket.d http websocket rsocket socket.io 发消息(Qos0) 有 无 有 有 有 发送并请求(Qos1) 有 有 无 有 无 发送并订阅 有 无 无 有 无 答复或响应 有 有 无 有 无 单连接双向通讯 有 无 有(不便) 有 有(不便) 数据分片 有 / 无 有 有 断线自动重连 有 / 无 有 有 有元信息 有 有 无 有 无 有事件(或路径) 有 有 无 无 有 有流(或消息关联性) 有 无 无 有 无 Broker 模式集群 有 无 无 有 无 异步 异步 同步 异步 异步 异步 接口体验 经典 经典 经典 响应式(复杂) 经典 基础传输协议 tcp, udp, ws tcp http tcp, udp, ws ws 本次实现框架更新 开放 BrokerListener 的两私有函数级别 添加 分片处理临时方件方案实现(FragmentHandlerTempfile) 添加 ClusterClient 通道线程池复用 添加 Reply 接收到的答复实体(多了 isEnd 方法) 添加 异步发送时错误接收机制 添加 协议时 channel.onOpenFuture() 异常关闭通道处理 调整 原流接收器,更名为流(分流接口与流内部接口) 调整 Broker 转发时,增加会话有效性检测 修复 小文件上传时出现 MappedByteBuffer:array 异常 优化 RunUtils 线程数使用 优化 分片触发条件 优化 onOpen 监听改造为异步模式(可以在 onOpen 时执行发送并等待) 优化 BrokerListener 对无效会话的过滤 代码仓库 https://gitee.com/noear/socketd https://github.com/noear/socketd

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册