首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

jQuery 3.6.3 发布,快速选择器修复

jQuery 3.6.2刚于上周发布,该版本包含了几个变化,其中最重要的是解决了在大多数浏览器中引入的一些新选择器的问题,如 :has()。现如今,jQuery 3.6.3 也已发布;原因在于有一个问题被报告,揭示了原来的修复问题。新版本亮点更新内容如下: 正确使用CSS.supports 在jQuery 3.6.2修复了:has的问题后,开发团队开始使用CSS.supports( "selector(SELECTOR)") 来确定一个选择器如果直接传递给querySelectorAll是否有效。当CSS.supports返回false时,jQuery就会退回到它自己的选择器引擎(Sizzle)。但显然,该实现有一个错误。在CSS.supports( "selector(SELECTOR)")中,SELECTOR需要是一个<complex-selector>而不是一个<complex-selector-list>。比如说: CSS.supports("selector(div)"); // true CSS.supports("selector(div, span)"); // false 这意味着所有复杂的选择器列表都通过Sizzle而不是querySelectorAll来传递。这在大多数情况下不一定是个问题,但它确实意味着一些在浏览器中支持但在Sizzle中不支持的 level 4 选择器,如:valid,如果它是选择器列表的一部分(例如 "input:valid, div"),则不再起作用。需要注意的是,目前这只影响到Firefox;但随着他们推出对 CSS.support 的更改后,它将影响所有的浏览器。 这个问题现在已经在jQuery 3.6.3中被修复,它也是这个版本中唯一的功能变化。 下载 https://code.jquery.com/jquery-3.6.3.js https://code.jquery.com/jquery-3.6.3.min.js 从 npm 获取此版本: npm install jquery@3.6.3 更多详情可查看发布公告。

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

Jmix 1.3 发布 - 少代码快速开发平台

Jmix 框架和 Studio 1.3 版本发布,这次发布带来了不少新功能以及框架和 Studio 的 Bug 修复: 主要新功能: Java 兼容版本提升至 Java 11,不再支持 Java 8. FlowUI 预览,该版本提供了基于 Vaadin 23 的 FlowUI 预览版。 一键云部署预览,该版本提供了 AWS 一键部署预览版。 主要解决的 Bug 有: 解决了 Liquibase 脚本在 MySQL 运行出错的问题。 多租户场景时,租户信息未保存的问题。 集合属性的懒加载出错问题。 详细内容请参考中文官网发布的最新更新:https://docs.jmix.cn/jmix/whats-new/index.html Jmix 是一款全栈 Java/Kotlin 少代码企业级应用开发框架,适合以数据为中心的应用程序开发。框架发展已有超过 10 年的历史,全球使用的企业超过 1000 家,开发者已经超过 25000 人。通过 Jmix实现您的数字化愿景,无低代码平台限制,无供应商依赖,无需按用户付费。 请访问中国官网,地址:https://www.jmix.cn 中文论坛:https://forum.jmix.cn

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

Solon v1.9.1,让 Java 快速启动

相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 ~ 10 倍。(更快) qps 高 2~ 3 倍。(更高) 运行时内存节省 1/3 ~ 1/2。(更少) 打包可以缩小到 1/2 ~ 1/10;比如,90Mb 的变成了 9Mb。(更小) 基于 app.name 进行注册发现 与 k8s svc 相互对应 支持 Service Mesh 架构部署方案 本次更新: 新增 dubbo3-solon-plugin 插件 简化 dubbo-solon-plugin 插件的适配 增加 solon.app.namespace 配置支持 增加 solon.data.tran 手动控制能力 插件 activerecord-solon-plugin 升级 activerecord 为 5.0.0 插件 solon.view.enjoy 升级 enjoy 为 5.0.0 插件 beetlsql-solon-plugin 升级 beetlsql 为 3.14.5-RELEASE 插件 dbvisitor-solon-plugin 升级 dbvisitor 为 5.0.1 插件 sqltoy-solon-plugin 升级 sqltoy 为 5.2.2 插件 solon.boot.smarthttp 升级 smart-http 为 1.1.5 插件 nacos2-solon-plugin 升级 nacos-client 为 2.1.0 插件 water-solon-plugin 升级 water 为 2.8.0 进一步了解 Solon: 《想法与架构笔记》 《生态预览》 《与 Spring Boot 的区别?》 《与 Spring Cloud 的区别?》

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

带你快速上手

管理并发写入操作目录: 事务隔离说明 写入和读写操作 并发写入事务的潜在锁死情况 并发写入实例 一、事务隔离说明 openGauss基于MVCC(多版本并发控制)并结合两阶段锁的方式进行事务管理,其特点是读写之间不阻塞。SELECT是纯读操作,UPDATE和DELETE是读写操作。 读写操作和纯读操作之间并不会发生冲突,读写操作之间也不会发生冲突。每个并发事务在事务开始时创建事务快照,并发事务之间不能检测到对方的更改。 读已提交隔离级别中,如果事务T1提交后,事务T2就可以看到事务T1更改的结果。 可重复读级别中,如果事务T1提交事务前事务T2开始执行,则事务T1提交后,事务T2依旧看不到事务T1更改的结果,保证了一个事务开始后,查询的结果前后一致,不受其他事务的影响。 读写操作,支持的是行级锁,不同的事务可以并发更新同一个表,只有更新同一行时才需等待,后发生的事务会等待先发生的事务提交后,再执行更新操作。 READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。 REPEATABLE READ: 事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改。 二、写入和读写操作 关于写入和读写操作的命令: INSERT,可向表中插入一行或多行数据。 UPDATE,可修改表中现有数据。 DELETE,可删除表中现有数据。 COPY,导入数据。 INSERT和COPY是纯写入的操作。并发写入操作,需要等待,对同一个表的操作,当事务T1的INSERT或COPY未解除锁定时,事务T2的INSERT或COPY需等待,事务T1解除锁定时,事务T2正常继续。 UPDATE和DELETE是读写操作(先查询出要操作的行)。UPDATE和DELETE执行前需要先查询数据,由于并发事务彼此不可见,所以UPDATE和DELETE操作是读取事务发生前提交的数据的快照。写入操作,是行级锁,当事务T1和事务T2并发更新同一行时,后发生的事务T2会等待,根据设置的等待时长,若超时事务T1未提交则事务T2执行失败;当事务T1和事务T2并发更新的行不同时,事务T1和事务2都会执行成功。 三、并发写入事务的潜在死锁情况 只要事务涉及多个表的或者同一个表相同行的更新时,同时运行的事务就可能在同时尝试写入时变为死锁状态。事务会在提交或回滚时一次性解除其所有锁定,而不会逐一放弃锁定。例如,假设事务T1和T2在大致相同的时间开始: 如果T1开始对表A进行写入且T2开始对表B进行写入,则两个事务均可继续而不会发生冲突;但是,如果T1完成了对表A的写入操作并需要开始对表B进行写入,此时操作的行数正好与T2一致,它将无法继续,因为T2仍保持对表B对应行的锁定,此时T2开始更新表A中与T1相同的行数,此时也将无法继续,产生死锁,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事务退出。 如果T1,T2都对表A进行写入,此时T1更新1-5行的数据,T2更新6-10行的数据,两个事务不会发生冲突,但是,如果T1完成后开始对表A的6-10行数据进行更新,T2完成后开始更新1-5行的数据,此时两个事务无法继续,在锁等待超时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事务退出。 四、并发写入示例 相同表的INSERT和DELETE并发 相同表的并发INSERT 相同表的并发UPDATE 数据导入和查询的并发 本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。 CREATE TABLE test(id int, name char(50), address varchar(255)); ①相同表的INSERT和DELETE并发 事务T1: START TRANSACTION; INSERT INTO test VALUES(1,'test1','test123'); COMMIT; 事务T2: START TRANSACTION; DELETE test WHERE NAME='test1'; COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的DELETE,此时显示DELETE 0,由于事务T1未提交,事务2看不到事务插入的数据; 场景2: READ COMMITTED级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,提交事务T1,事务T2再执行DELETE语句时,此时显示DELETE 1,事务T1提交完成后,事务T2可以看到此条数据,可以删除成功。 REPEATABLE READ级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,提交事务T1,事务T2再执行DELETE语句时,此时显示DELETE 0,事务T1提交完成后,事务T2依旧看不到事务T1的数据,一个事务中前后查询到的数据是一致的。 ②相同表的并发INSERT 事务T1: START TRANSACTION; INSERT INTO test VALUES(2,'test2','test123'); COMMIT; 事务T2: START TRANSACTION; INSERT INTO test VALUES(3,'test3','test123'); COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的INSERT语句,可以执行成功,读已提交和可重复读隔离级别下,此时在事务T1中执行SELECT语句,看不到事务T2中插入的数据,事务T2中执行查询语句看不到事务T1中插入的数据。 场景2: READ COMMITTED级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,可以看到事务T1中插入的数据。 REPEATABLE READ级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,看不到事务T1中插入的数据。 ③相同表的并发UPDATE 事务T1: START TRANSACTION; UPDATE test SET address='test1234' WHERE name='test1'; COMMIT; 事务T2: START TRANSACTION; UPDATE test SET address='test1234' WHERE name='test2'; COMMIT; 事务T3: START TRANSACTION; UPDATE test SET address='test1234' WHERE name='test1'; COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1开始执行UPDATE,事务T2开始执行UPDATE,事务T1和事务T2都执行成功。更新不同行时,更新操作拿的是行级锁,不会发生冲突,两个事务都可以执行成功。 场景2: 开启事务T1,不提交的同时开启事务T3,事务T1开始执行UPDATE,事务T3开始执行UPDATE,事务T1执行成功,事务T3等待超时后会出错。更新相同行时,事务T1未提交时,未释放锁,导致事务T3执行不成功。 ④数据导入和查询的并发 事务T1: START TRANSACTION; COPY test FROM '...'; COMMIT; 事务T2: START TRANSACTION; SELECT * FROM test; COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,事务T2开始执行SELECT,事务T1和事务T2都执行成功。事务T2中查询看不到事务T1新COPY进来的数据。 场景2: READ COMMITTED级别 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2查询,可以看到事务T1中COPY的数据。 REPEATABLE READ级别 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2 查询,看不到事务T1中COPY的数据。

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

如何快速调度 PTS 的百万并发能力

作者:灵苒 在实际的业务场景中,压测是必不可少的一环,无论是对服务器、数据库、网络等性能瓶颈的评估,还是如浏览、下单、支付等重要流量节点的业务连续性保障,亦或是搬站上云整体业务稳定性的预估,这些都需要性能压测来帮助你建立对系统和业务的完整认知。根据 Google 的统计,如果网站打开慢每 500 毫秒,用户访问量将下降 20%。根据 Amazon 统计,每慢 100 毫秒,交易额下降 1%。这些事件和统计数据为大家敲响了警钟,也客观说明了性能压测对于企业应用的重要性。 压测是通过模拟用户行为对业务系统发起请求,测算出系统的承载能力,并对系统做一次全面的体检,压测后可根据压测表现优化系统瓶颈,防止出现线上故障。 业界常见的压测软件 JMeter 和 PTS 目前 JMeter 是性能压测领域应用最广泛的开源软件。 对于场景简单,要求测试并发量不高的情况下,JMeter 本地测试就能满足需求。但随着互联网用户的增加,对系统承载更大并发的需求日渐提升,而单台 JMeter 施压机的施压能力有一定上限,所以需要使用多台施压机,以提高 JMeter 的施压能力,这就要使用到 JMeter 的分布式施压功能。 但 JMeter 的分布式压测前置准备较多,需要注意以下几点: 施压机的防火墙已关闭或打开了正确的端口。为 RMI 设置了 SSL 或禁用了它。 所有施压机都在同一个子网上。如果使用 192.xxx或10.xxx IP 地址,则服务器位于同一子网中。 所有施压机上使用相同版本的 JMeter 和 Java。 所有施压机都已经拷贝了切分好的 CSV 数据文件、依赖 jar 包等。 已配置好监控数据的收集。 由此可见 JMeter 的分布式压测需要自己协调各资源,前置准备比较麻烦,对实施压测的人员来说压测效率低。 PTS 是阿里云研发的性能测试工具,最初主要为了模拟双十一流量洪峰,如今已走过十个年头,在场景编排、压测执行、压测监控分析、报告总结等各方面能力相对完善,可提供百万并发、千万 TPS 流量发起能力,并且还能完全兼容 JMeter,可天然弥补 JMeter 在性能压测中的劣势。对使用 JMerer 无法绕过集群问题的用户是一个很好的选择。 PTS 的 JMeter 压测极大的简化了 JMeter 分布式压测流程,同时也降低了压测过程中对施压机的维护成本。使用 PTS 的 JMeter 压测,用户只需要在控制台配置需要使用的机器数,无须用户提前准备多台已安装相同 Java 和 JMeter 版本的施压机。同时无须用户根据施压机数量去切分 CSV 参数文件;压测结束后,PTS 会将监控数据汇总产生一个详细的压测报告供用户查阅。 相比于直接在命令行执行 JMeter 脚本来说,PTS 使用更加方便,可按需提供海量的施压能力,并且能提供简洁直观的监控和报告。 如何发起 PTS的 JMeter 压测 和所有压测的核心步骤一样,使用 PTS 的 JMeter 压测,也主要集中在创建场景、压测场景和查看报告三个步骤中。 1、创建场景:PTS 的 JMeter 压测以场景为核心,压测对象为一个场景,场景中包括JMeter(原生)脚本、JMeter 依赖(一系列依赖 jar 包和一系列 properties 配置)、及一些压测配置(PTS 压测的配置,例如公网/VPC 压测、并发量、引擎数量、压测时长等)。 2、压测场景:对场景的操作分为两方面,一是对场景配置的增删改查,二是对场景的压测和调试。 3、生成报告:每次对场景压测都会生成一个压测任务,同时生成一个报告,其中包括压测的关键指标,如 TPS、RT、成功率等,可辅助用户排查系统性能瓶颈。此外,PTS 默认将报告保存 30 天,可以随时查看历史报告,并且提供导出 PDF 格式的报告。 在压测领域,随着压测需求日益多样化,更多用户希望将云上的压测能力继承到自己的系统,或者根据自己的业务系统,编排自定义的压测平台,从而实现自动化定制化压测需求。 所以,为了方便用户便捷调度 PTS 百万并发的能力,PTS 开通了 JMeter 的 OpenAPI,提供了如下几类压测的核心功能:编辑场景、调试场景、压测场景、查看运行时数据、查看报告。 通过集成 OpenAPI,客户可以更加方便的在自己的业务场景实现 PTS 百万级并发压测的能力,实现场景的增、删、改、查等各种操作,一键启动压测,并在压测过程中,随时停止压测。同时生成的压测报告中,除了JMeter 原生的日志外,还有 PTS 针对某个采样器的成功率、TPS、RT 指标的聚合数据。另外还可以对报告进行查看报告列表、JMeter 原生日志以及 PTS 对 JMeter 采样器压测指标的聚合数据等功能。 那么还等什么呢?来,试着用 PTS 中 JMeter 的 OpenAPI 写一个属于你的百万级并发压测能力的压测平台吧! 附录: 具体步骤如下 引入 pom 依赖 <!--创建PTS场景需要的实体类,如果只使用JMeter压测则不需要引入--> <dependency> <groupId>com.aliyun</groupId> <artifactId>pts-api-entity</artifactId> <version>1.0.1</version> </dependency> <!--PTS Java SDK依赖。--> <dependency> <groupId>com.aliyun</groupId> <artifactId>pts20201020</artifactId> <version>1.8.10</version> </dependency> <!--阿里云核心库。--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.2</version> </dependency> \ 复制下列代码 import com.aliyun.pts20201020.Client; import com.aliyun.pts20201020.models.*; import com.aliyun.teaopenapi.models.Config; import java.util.ArrayList; import java.util.List; import java.util.Map; public class StartingDemo { public static void main(String[] args) throws Exception { Client client = getClient(); // 创建场景 String sceneId = createScene(client); // 启动场景 String reportId = startTesting(client, sceneId); // 最多等待次数 int count = 0; // 查询是否已生成报告 while (!hasReport(client, reportId) && count++ < 20) { // 若报告还未生成,则等待(30s)一段时间再查询 // 根据压测时间酌情等待 Thread.sleep(30 * 1000); } // 查看报告 getJMeterReport(client, reportId); } private static boolean hasReport(Client client, String reportId) throws Exception { ListJMeterReportsRequest request = new ListJMeterReportsRequest(); // 分页设置 request.setPageNumber(1); request.setPageSize(1); // 查询条件设置 request.setReportId(reportId); ListJMeterReportsResponse response = client.listJMeterReports(request); return response.getBody().getReports().size() > 0; } private static void getJMeterReport(Client client, String reportId) throws Exception { // 查看机器日志 GetJMeterLogsResponse getJMeterLogsResponse = getJMeterLogs(client, reportId); List<Map<String, ?>> logs = getJMeterLogsResponse.getBody().getLogs(); // 查看采样器聚合数据 GetJMeterSampleMetricsResponse getJMeterSampleMetrics = getJMeterSampleMetrics(client, reportId); List<String> sampleMetricList = getJMeterSampleMetrics.getBody().getSampleMetricList(); // 查看采样日志 GetJMeterSamplingLogsResponse getJMeterSamplingLogs = getJMeterSamplingLogs(client, reportId); List<String> sampleResults = getJMeterSamplingLogs.getBody().getSampleResults(); } private static GetJMeterSamplingLogsResponse getJMeterSamplingLogs(Client client, String reportId) throws Exception { GetJMeterSamplingLogsRequest request = new GetJMeterSamplingLogsRequest(); // 分页设置 request.setPageNumber(1); request.setPageSize(10); // 条件设置 request.setReportId(reportId); GetJMeterSamplingLogsResponse response = client.getJMeterSamplingLogs(request); return response; } private static GetJMeterSampleMetricsResponse getJMeterSampleMetrics(Client client, String reportId) throws Exception { GetJMeterSampleMetricsRequest request = new GetJMeterSampleMetricsRequest(); // 设置报告id request.setReportId(reportId); GetJMeterSampleMetricsResponse response = client.getJMeterSampleMetrics(request); return response; } private static GetJMeterLogsResponse getJMeterLogs(Client client, String reportId) throws Exception { GetJMeterLogsRequest request = new GetJMeterLogsRequest(); // 分页设置 request.setPageNumber(1); request.setPageSize(10); // 查询的压测引擎索引 request.setReportId(reportId); GetJMeterLogsResponse response = client.getJMeterLogs(request); return response; } private static String startTesting(Client client, String sceneId) throws Exception { StartTestingJMeterSceneResponse startTestingSceneResponse = startTestingScene(client, sceneId); String reportId = startTestingSceneResponse.getBody().getReportId(); return reportId; } private static StartTestingJMeterSceneResponse startTestingScene(Client client, String sceneId) throws Exception { StartTestingJMeterSceneRequest request = new StartTestingJMeterSceneRequest(); request.setSceneId(sceneId); StartTestingJMeterSceneResponse response = client.startTestingJMeterScene(request); return response; } private static String createScene(Client client) throws Exception { SaveOpenJMeterSceneRequest request = new SaveOpenJMeterSceneRequest(); // 定义场景 SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene scene = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene(); // 设置场景名 scene.setSceneName("test"); // 设置文件列表,包括JMeter脚本、JMeter压测依赖jar包、配置额度数据文件等 List<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList> fileList = new ArrayList<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList>(); // 设置文件的属性 需要设置文件的名称和文件公网可访问的oss地址 SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList testFile = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList(); testFile.setFileName("baidu.jmx"); testFile.setFileOssAddress("https://pts-openapi-test.oss-cn-shanghai.aliyuncs.com/baidu.jmx"); fileList.add(testFile); scene.setFileList(fileList); // 设置场景并发,可设置为100万 scene.setConcurrency(1000000); // 设置引擎数量 说明:一台引擎最多能发500并发,最少1并发所以此处能设置的引擎数为[2,1000],另外引擎数量越多消耗vum越快 scene.setAgentCount(2000); // 设置压测持续时间 60s scene.setDuration(60); // 设置测试文件的名称,这个文件需包括在文件列表中 scene.setTestFile("baidu.jmx"); request.setOpenJMeterScene(scene); SaveOpenJMeterSceneResponse response = client.saveOpenJMeterScene(request); return response.getBody().getSceneId(); } private static Client getClient() throws Exception { // 填写自己的AK/SK String accessKeyId = "ak"; String accessKeySecret = "sk"; Config config = new Config(); config.setAccessKeyId(accessKeyId); config.setAccessKeySecret(accessKeySecret); Client client = new Client(config); return client; } } 填写自己的 ak/sk 在上述代码的 getClient 中填写正确的 ak/sk 点击启动 点击 main 方法启动 点击​​此处​​,前往 PTS 官网了解更多详情!

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

Bootstrap 4.6.1 版本发布,web 快速开发框架

Bootstrap 4.6.1 版本发布了,Bootstrap 是一款流行的 Web 开发框架,此版本带来以下更新: 用乘法和自定义函数替换 Sass 除法。#34571 将RFS 更新到 v8.1.0 。#34571 修复表单的输入组和验证图标。#32968 修复 Firefox 火狐浏览器中,moz-focusring带来的细微视觉错误。 删除SAFE_URL_PATTERN正则表达式的全局修饰符,以适应普通正则表达式的测试方法。#33153 在SAFE_URL_PATTERN中 加入sms。#35074 调整select.form-control反馈图标的位置和内间距。#33206 轮播:上下页切换使用按钮代替链接。#33165 v4:修复 Sass 文档默认变量不能被覆盖的问题。#33392 修复add()&subtract()计算复杂表达式容易出错的问题。#34047 改进了 add()&subtract()的计算逻辑。#34432 在下拉列表中移除aria-haspopup。#33624 下拉:现在可以在<li>标签里面放.dropdown-item。#33649 更新 JS 测试的 node 版本(删除 node 10,添加 node 16)。#33807 用 Libera IRC 服务器替换 Freenode 。#34050 修正了Navbar 文档描述的重复部分。#34208 启用0.x格式的负边距(之前 0.5 会被算成 0,现在正确算成 0.5)。#33593 删除thead规则 。#34426 修复了选择淡出类(fade class)后,show事件无法重新触发的问题。#34087 使用自定义文件输入进行输出组验证。#33239 添加eslint-plugin-qunit并收紧 JS 测试。#32270 将测试更新到Node 16 和 npm 8 。#35142 禁用链接清理。#34924 更新开发环境依赖模块。 更新公告:https://github.com/twbs/bootstrap/releases/tag/v4.6.1

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

JeeSite V4.3.0.2 快速开发平台发布

JeeSite Cloud v4.3.0.2 发布,具体更新内容如下: 升级内容 增加 Datagrid 的 options.gridMinMeight 最小高度设置 增加 web.securityMode 开关,控制一些风险功能的操作 优化 ztree 图标显示,可区分半选中状态 优化 oauth2 client 的超时时间,默认 30 秒 优化 Cloud 下或引入第三方插件的时候 Validator 可能会有冲突问题 优化 扩展 Lang 语言包时,如果没有定义的前端语言包,则不报错 优化 自定义登录页时,不在 adminPath 下的时候,地址不对问题 优化 uni-app h5 的流程图展示,可以拖拽 优化 Swagger Models 的扫描 修正 select2 禁用的时候,按空格可弹窗下拉框问题 修正 js.log 在 ie11 下报错兼容性问题 修正 Cloud 下消息内容可能会丢失问题 去掉 树表里的 parent 为空验证,因为无关紧要 字典 treeData 接口增加 cssClass 和 cssStyle 返回 菜单 获取菜单和权限接口增加 parentCode 参数返回 BPM 提交流程,自动完成相同处理人时,之前是读取的是全局表单,优化为如果有定义当前节点的流程选项,则读取当前节点的选项 BPM 增加根据流程 ids 和流程 keys 进行查询,支持 in 查询 BPM 修正 BpmTask 的 assigneeCode 显示不正确的问题 发布基于 Spring Authorization Server 的 OAuth2 服务端 升级 Shiro 1.8.0 CrudService 新增 updateStatusByIds 和 deleteByIds 批量方法 BPM 新增手机端风格的流程跟踪图和流程追踪界面 BPM 更正流程表单 URL 前面加///无效的问题 BPM 增加流程接口在线文档 对象存储:增加 baseDir 参数 字典接口:treeData 包含 status 为空的数据 文件管理:点击文件夹树刷新的时候,右侧列表显示根文件夹数据 模块管理:优化模块编码的验证,支持带减号,字母开头 layer.css 去掉top动画,不影响拖拽动作 form:checkbox 当 name 为空的时候不发送 !号开头的参数 国际化译文优化,访问日志国际化,感谢 SoleMan 分享 升级方法 修改pom.xml文件中的jeesite-parent版本号为4.3.0-SNAPSHOT 如果你导入了jeesite-common源码项目,请与git上的代码进行同步 如果你导入了jeesite-module-core源码项目,请与git上的代码进行同步 如果你是跨版本升级,请注意每一个版本的升级方法,业务上有调整的地方进行修改 执行root/package.bat(sh)打包脚本,强制更新依赖即可。

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

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

用户登录
用户注册