Nop平台与SpringCloud的功能对比

Nop平台是根据可逆计算原理从零开始设计并实现的新一代的低代码平台,它的目标并不是针对少数固化的场景提供预置的开发脚手架和可视化设计工具,
而是打破描述式编程和传统命令式编程之间人为制造的藩篱,建立两者无缝相容的一种新的编程范式。不断扩大描述式编程所覆盖的语义空间。为了以最低的技术成本达到这一目标,
Nop平台没有采用目前业内主流的基础开源框架,而是选择了基于可逆计算原理重塑整个技术体系。本文将简单列举一下Nop平台所造的轮子,并与SpringCloud技术体系中现有的轮子做个对比。

轮子Nop体系Spring体系
Web框架NopGraphQLSpringMVC
表达式引擎XLang XScriptSpringEL
模板引擎XLang XplVelocity/Freemarker
ORM引擎NopORMJPA/Mybatis
IoC容器NopIoCSpringIoC
动态配置NopConfigSpringConfig
分布式事务NopTccAlibaba Seata
自动化测试NopAutoTestSpringBootTest
分布式RPCNopRPCFeign RPC
报表引擎NopReportJasperReport
规则引擎NopRuleDrools
批处理引擎NopBatchSpringBatch
工作流引擎NopWorkflowFlowable/BPM
任务调度NopJobQuartz
XML/JSON解析NopCoreJaxb/Jackson
资源抽象NopResourceSpring Resource
代码生成器NopCodeGen各类自制生成器
IDE插件NopIdeaPluginMybatis插件/Spring插件等

Nop平台可以直接作为类似SpringCloud的基础开发框架来使用,在ProCode层面也可以极大简化软件开发过程,并明显提升软件的可扩展性。

一. IoC容器

声明式的IoC容器是Spring发家时的基本技能。但是自从Spring2.0版本之后,SpringIoC就逐渐失去了它的声明式特性,导致现在它的执行掺杂了大量命令式逻辑,典型的体现就是:改变Spring中包扫描的顺序会以微妙的方式改变bean装配的结果

NopIoC是在Spring1.0的装配语法的基础上补充了类似SpringBoot的条件装配逻辑,最终运行时完全归约为Spring1.0的语法来执行。beans文件的装载顺序以及bean的声明顺序不会影响到最终装配的结果

@ConditionOnMissingBean
@ConditionOnProperty("test.my-bean.enabled")
@Component
public class MyBean{@InjectOtherBean other;
}

对应于NopIoC的如下配置

<bean id="myBean" ioc:default="true" class="test.MyBean"><ioc:condition><if-property name="test.my-bean.enabled" /></ioc:condition>
</bean>

NopIoC支持@Inject,@PostConstruct, @PreDestroy等规范化注解,也兼容Spring特有的@Autowired注解。但是它不使用包扫描来发现bean的定义,而是要求在beans.xml文件中声明bean。

因为Nop平台大量使用模型驱动来动态生成代码,所以大量bean的定义会自动被生成到配置文件中,需要手工编写的配置内容其实很少。另外自己也可以写一个扩展扫描函数,利用NopIoC的元编程机制来动态生成bean的定义。例如

<beans><x:gen-extends><ioc-gen:scan packages="test.my,test.other" /></x:gen-extends>
</beans>

Bean的定制

NopIoC的独特之处在于可以通过标准的Delta定制来实现对装配逻辑的定制,例如可以通过如下代码删除已有的bean的定义

<beans x:extends="super"><bean id="dataSource" x:override="remove" />
</beans>

动态配置

NopIoC的设计中包含了与NopConfig配置中心的一体化设计。在beans.xml配置中可以通过特殊的前缀表示动态配置项:

<bean id="xx"><property name="poolSize" value="@r-cfg:my.pool-size|5" /> 
</bean>

@r-cfg:前缀表示是动态配置项,当配置中心更改配置时会自动更新bean的属性。

另外在beans语法中还定义专门的ioc:config节点

  <ioc:config id="nopOrmGlobalCacheConfig" class="io.nop.commons.cache.CacheConfig" ioc:config-prefix="nop.orm.global-cache"  ioc:default="true"/>

NopIoC容器会自动跟踪所有对于ioc:config的引用,一旦配置发生变化,会自动触发那些使用config的bean上所定义的refresh-config方法。

ioc:config-prefix的作用类似于Spring中@ConfigurationProperties,用于指定配置项在配置文件中所对应的前缀。

与SpringIoC的互操作

NopIoC与Spring容器可以同时使用,一般情况下NopIoC会在SpringIoC初始化之后再启动,它可以通过parentContainer拿到Spring容器所管理的bean。所以在NopIoC中可以通过@Inject直接注入Spring所管理的bean,而在Spring所管理的bean中,可以使用beanContainer来按照名称或者类型获取NopIoC所管理的bean。

BeanContainer.intance().getBean(beanName)
BeanContainer.intance().getBeanByType(beanType)

NopIoC的设计目标是成为一个更好的SpringIoC,它坚持了严格的声明式设计,可以集成到Spring生态中使用,全部代码不超过5000行。更详细的设计可以参见文章: 如果重写SpringBoot,我们会做哪些不同的选择?

二. Web框架

在SpringCloud的技术体系中,我们一般是在Controller中调用Service来完成具体业务逻辑,而在Controller中会处理一些对象结构转换或者组合的工作,例如将实体对象转换为DTO对象等。为了实现GraphQL服务接口,我们需要使用graphql-java包重新编写接口层代码,并不能直接复用Controller对外提供服务。

NopGraphQL引擎极大简化了服务接口层的设计,一般情况下我们可以直接把领域模型对象暴露为对外服务接口,通过元数据层实现权限管控和结构适配,而无需通过Controller层实现适配转换

例如,即使对于最简单的Web服务,我们也需要指定url模式,指定参数传递方式(是通过param传递,还是通过path传递,或者是通过body传递)。很多时候还会在无意中引入对HttpServlet接口的依赖,导致整个服务与具体的Web运行时环境绑定。

@RestController
public class MyController{@PostMapping(value = "/echo/{id}")public String echo(@QueryParam("msg") String msg,@PathParam("id") String id, HttpServletRequest request) {return "Hello Nacos Discovery " + msg + ",id=" + id;}
}

在Nop平台中,我们只需要在领域模型对象上增加@BizModel注解,然后标记服务方法及服务参数的名称即可。

@BizModel("MyObject")
public class MyObjectBizModel{@BizQuerypublic PageBean<MyEntity> findPage(@Name("id") id, FieldSelection selection, IServiceContext ctx){return ....}
}
  1. NopGraphQL可以提供REST服务,但是它约定了固定的url模式:/r/{bizObjName}__{bizAction},无需为每个请求单独设计链接模式。

  2. 标记了@BizQuery注解的函数可以通过POST和GET方式来访问,而标记了@BizMutation的方法只支持POST方式访问。这种自动推导也避免了误用。

  3. 对于参数只需要通过@Name注解来标记参数名,无需指定参数传递方式

  4. 标记为@BizMutation的函数会自动启用事务管理,无需额外标记@Transactional

GraphQL作为通用分解组合方案

NopGraphQL引擎不仅仅可以同时提供GraphQL和REST两种服务模式,它在Nop平台中的作用是作为一个通用的分解组合方案。在Nop平台中,所有的消息服务、批处理服务、RPC服务等,在接收到请求消息之后,都是把它们投递到GraphQLEngine中去处理

一般的Web框架的服务方法都不支持直接返回实体对象,因为一般实体对象上包含过多的信息,并不适合直接序列化到前台。但是在GraphQL引擎的协调下,服务方法的返回值并不会直接作为结果数据返回给前台,而是要经过selection和Data Loader的增强处理。基于这种情况,NopGraphQL将结果转换和适配工作完全交给GraphQL引擎(根据XMeta提供的元数据)去处理。也就是说可以通过配置的方式实现适配层,而无需单独设计的Controller适配层。

NopGraphQL引擎可以脱离Web环境,在任何需要工作分解和结果选择、适配的场景下使用。它提供了与运行时无关的IServiceContext上下文对象(基本等价于一个Map),可以利用它缓存在多个服务调用之间共享的数据,优化批处理的性能。

分布式RPC

在SpringCloud的技术体系中,服务端启动时自动注册到服务注册中心,然后在客户端增加Feign接口,就可以实现负载均衡调用,灰度发布、AB测试等都可以利用这里的服务路由机制来实现。

在NopGraphQL中,我们也是增加服务调用接口,

    public interface RuleService{CompletionStage<ApiResponse<RuleResultBean>> executeRuleAsync(ApiRequest<RuleRequestBean> request);default ApiResponse<RuleResultBean> executeRule(ApiRequest<RuleRequestBean> request){return FutureHelper.syncGet(executeRuleAsync(request));}}
  1. 服务接口支持异步调用和同步调用模式,异步调用约定返回类型为CompletionStage,而且方法名增加后缀Async。

  2. 约定请求参数为ApiRequest类型,而返回结果为ApiResponse类型,这样可以在消息对象层面直接设置和读取headers扩展数据,而无需依赖底层的运行时接口。

  3. 在服务接口上无需增加额外注解,比如不用增加@Path等REST路径声明等

在beans.xml中通过如下配置创建分布式RPC客户端

    <bean id="testGraphQLRpc" parent="AbstractRpcProxyFactoryBean"ioc:type="io.nop.rpc.client.TestRpc"><property name="serviceName" value="rpc-demo-consumer"/></bean>

通过设置nop.rpc.service-mesh.enabled=true,可以启用服务网格模式,跳过客户端负载均衡代理。

详细介绍可以参见文章:

  1. 低代码平台中的GraphQL引擎

  2. 低代码平台中的分布式RPC框架(约3000行代码)

三. 存储层

NopORM引擎包含了SpringData, JPA以及MyBatis的大部分功能,同时补充了大量业务开发中的常用功能,例如字段加密、逻辑删除、修改历史跟踪、扩展字段、多租户等。

在使用接口层面,NopORM的使用模式与Spring中非常类似,只是它总是使用XML模型文件而不是JPA注解。

IEntityDao<NopAuthUser> dao = daoProvider.daoFor(NopAuthUser.class);MyEntity example = dao.newEntity();
example.setMyField("a");
// 查找满足条件的第一个
MyEntity entity = dao.findFirstByExample(example);QueryBean query = new QueryBean();
query.setFilter(and(eq(MyEntity.PROP_NAME_myField,"a"), gt(MyEntity.PROP_NAME_myStatus,3)));
query.setLimit(5);List<MyEntity> list = dao.findPageByQuery(query);

一般情况下内置的IEntityDao上提供的方法已经足够的丰富,可以通过它支持非常复杂的查询条件,因此没有必要单独为每个实体生成独立的Dao接口,一般都是通过DaoProvider获取到对应的IEntityDao接口来使用。

对于复杂查询语句,可以直接使用类似MyBatis的sql-lib机制,通过XML模型来管理复杂动态SQL。

@SqlLibMapper("/app/mall/sql/LitemallGoods.sql-lib.xml")
public interface LitemallGoodsMapper {void syncCartProduct(@Name("product") LitemallGoodsProduct product);
}

在Mapper接口上增加@SqlLibMapper注解来定义sql-lib模型与Java接口的映射关系。

在sql-lib模型中,可以通过Xpl模板语言来生成SQL语句

        <eql name="syncCartProduct" sqlMethod="execute"><arg name="product"/><source>update LitemallCart oset o.price = ${product.price},o.goodsName = ${product.goods.name},o.picUrl = ${product.url},o.goodsSn = ${product.goods.goodsSn}where o.productId = ${product.id}</source></eql>

Excel模型驱动

Nop平台提供了非常强大的模型驱动开发模式,可以解析Excel数据模型文件自动生成实体定义、Mapper接口定义、元数据定义,后台GraphQL服务,甚至包括前台增加改查页面等。

详细设计可以参见文章

  1. 低代码平台需要什么样的ORM引擎?(2)

  2. 数据驱动的差量化代码生成器

  3. 基于可逆计算理论的开源低代码平台:Nop Platform

  4. 低代码平台如何在不改表的情况下为实体增加扩展字段

四. 底层语言

Nop平台提供了专为DSL开发而设计的XLang语言,它包含了XScript脚本语言,Xpl模板语言,XTransform结构转换语言,XDef元模型定义语言等多个子语言。其中

  1. XScript脚本语言的语法类似于JavaScript语法,并支持类似Java的类型系统,可以作为一般性的表达式语言来使用。

  2. Xpl模板语言是类似于FreeMarker的模板语言,支持自定义标签库,支持编译期宏处理。

  3. XDef元模型定义语言类似于XML Schema模式定义语言,是一种非常简单直观的元模型定义语言。

  4. XTransform是类似于XSLT的通用Tree结构转换语言。

Nop平台底层对于XML语言进行了很多改造,它只是使用基本的XML语法形式,并没有使用JAXB标准,也没有使用Java中常用的XML解析器,而是完全从零编写了XML解析器和JSON解析器。相比于常用的XML解析器和DOM模型,Nop平台的XNode结构要更加简单、直观,并且它内置SourceLocation跟踪机制,可以直接作为通用的AST语法树节点来使用。

XNode node = XNodeParser.instance().parseFromText(loc, text);node.getTagName() // 读取标签名
node.getAttr(name) // 读取属性
node.setAttr(name,value) // 设置属性node.attrText(name) // 得到文本属性,如果文本值为空,则返回null而不是空串
node.attrTextOrEmpty(name) // 如果属性值为空,则返回null。属性值不存在时返回null
node.attrInt(name) //  得到属性值并转换为Integer类型
node.attrInt(name, defaultValue) // 如果属性值为空,则返回缺省值
node.attrBoolean(name) // 读取属性值并转换为Boolean类型
node.attrLong(name) // 读取属性值并转换为Long类型
node.attrCsvSet(name) // 读取属性值,如果是字符串,则按照逗号分隔转换字符串集合node.getAttrs() // 得到属性集合
node.getChildren() // 得到子节点集合
node.childByTag(tagName) // 根据子节点名查找得到对应子节点
node.childByAttr(attrName, attrValue) // 根据属性值查找得到子节点
node.getContentValue() // 读取节点值node.hasChild() // 是否有子节点
node.hasAttr() // 是否有属性
node.hasContent() // 直接内容是否不为空
node.hasBody()  // 是否有子节点或者直接内容node.getParent() // 得到父节点node.cloneInstance() // 复制节点list = node.cloneChildren() // 复制所有子节点node.detach() // 解除父子关系node.remove() // 从父节点中删除node.replaceBy(newNode) // 在父节点的children集合中将本节点替换为newNodenode.xml() // 得到节点的XML文本
node.innerXml() // 得到节点内部对应的XML文本node.toTreeBean() // 转换为TreeBean对象XNode.fromTreeBean(treeBean) // 从TreeBean转换为XNode

与Spring生态的表达式语言和模板语言相比,Nop平台XLang语言的设计一致性更强,

  1. 多个子语言共用大量的语法特性

  2. 多个子语言共用全局函数库

  3. 可以将一般的Java函数注册为全局函数

  4. 语法类似于JavaScript,支持对象函数调用

  5. 提供了一个很容易定制的表达式解析器SimpleExprParser。在报表引擎中使用ReportExprParser以及在规则引擎中使用的RuleExprParser都是基于这个表达式引擎定制而来。

  6. 系统化的支持编译期元编程机制,例如支持宏函数、宏标签等

进一步的详细信息可以参考文章:

  1. 低代码平台中的元编程(Meta Programming),

  2. 替代XSD的统一元模型定义语言:XDef,

  3. 从可逆计算看DSL的设计要点

五. 导入导出

NopReport是基于可逆计算理论从零开始独立实现的一套开源中国式报表引擎,它的核心代码很短,只有3000多行(参见nop-report-core模块),具有较高的性能(性能测试代码参见TestReportSpeed.java),以及其他报表引擎难以达到的灵活性和可扩展性。

NopReport在Nop平台中的定位是对表格形式数据结构的通用建模工具,所有需要生成表格形式数据的功能都可以转化为NopReport报表模型对象来实现。例如,NopCli命令行工具提供的数据库逆向工程命令会逆向分析数据库表结构,生成Excel模型文件,这个Excel模型文件就是通过将导入模板转化为报表输出模型来生成。

与其他报表引擎相比,NopReport具有如下非常鲜明的个性化特点:

  1. 采用Excel作为模板设计器

  2. 可以直接采用领域模型对象作为数据对象,而数据集(DataSet)仅仅是一种可选的数据对象形式。(一般的报表引擎只能使用表格数据)

  3. 在通用的表达式语法基础上扩展层次坐标概念,而不是使用专门设计的报表表达式语法

  4. 支持多Sheet和循环生成

NopReport除了用于导出数据之外,它还支持自定义数据结构的导入。无需编程,只需要少量配置即可实现Excel数据模型的导入。Nop平台中所有使用的Excel模型文件,例如ORM实体模型,API接口模型等都是使用这里的报表导入机制实现导入。

详细介绍可以参见:

  1. 采用Excel作为设计器的开源中国式报表引擎:NopReport

  2. 如何用800行代码实现类似poi-tl的可视化Word模板

  3. 导入导出Excel时如何支持动态列和动态样式

六. 逻辑编排

Nop平台提供了业务规则、工作流引擎、批处理引擎、任务调度引擎等逻辑编排相关的引擎实现,可以对一般的业务逻辑进行完整的描述。

具体介绍可以参见 采用Excel作为可视化设计器的规则引擎 NopRule

七. 自动化测试

SprintBootTest提供了Spring框架与JUnit等测试框架的集成。在Nop平台中,从JunitAutoTest基类继承即可使用依赖注入来得到需要测试的Bean。

@NopTestConfig(localDb = true,initDatabaseSchema = true)
public class TestGraphQLTransaction extends JunitAutoTestCase {@InjectIDaoProvider daoProvider;@InjectIGraphQLEngine graphQLEngine;@EnableSnapshot@Testpublic void testRollback() {GraphQLRequestBean request = new GraphQLRequestBean();request.setQuery("mutation { DemoAuth__testFlushError }");IGraphQLExecutionContext context = graphQLEngine.newGraphQLContext(request);GraphQLResponseBean response = graphQLEngine.executeGraphQL(context);output("response.json5", response);assertTrue(response.hasError());assertTrue(daoProvider.daoFor(NopAuthRole.class).getEntityById("test123") == null);}
}

通过@NopTestConfig注解可以很简单的控制自动化测试相关的一些配置开关。

NopAutoTest自动化测试框架的独特之处是它提供了模型驱动的自动化测试能力,可以通过录制、回放机制实现复杂业务功能的自动化测试,无需手工编写测试代码。

具体设计参见 低代码平台中的自动化测试

八. 外围工具

Nop平台提供了与Maven相集成的代码生成器,它可以在Nop平台之外独立使用,基于用户自定义的模型文件,应用用户自定义的代码模板,以增量化的方式生成指定代码。而一般的代码生成器,无论是模型还是代码模板都很难支持细粒度的定制。

详细设计参见 数据驱动的差量化代码生成器

NopIdeaPlugin提供了一个通用的IDEA插件,它会自动识别XML根节点上x:schema属性所指定的元模型,然后根据元模型自动实现属性提示、链接跳转、格式校验等,对于代码段还提供了断点调试功能。

总结

Nop平台的实现与SpringCloud相比,主要有如下特点:

  1. 实现原理简单直接,代码量普遍比Spring框架中的组件小一个数量级以上,但是核心功能反而更加丰富

  2. 支持差量化定制,可以在Delta目录下增加Delta模型文件来定制所有已有功能(包括平台内置功能),例如所有的数据模型、所有的设计器页面都可以自由定制。

  3. 利用代码生成、元编程等机制实现自动推导,极大降低需要手工编写的代码量,保证系统内部信息结构的高度一致性。

  4. 统一使用XDSL规范来实现模型DSL,可以随时新增DSL模型,也可以在原有DSL模型中增加新的扩展属性。IDE插件自动识别并支持新的DSL模型,无需特殊编写支持插件。

  5. 模型驱动集成在DevOps开发流程中,在maven打包过程中实现代码生成、模型转换等,不需要单独部署模型管理平台。

Nop平台可以作为运行在SpringCloud之上的一种扩展组件,它与SpringCloud内置机制并不冲突,它内部的各种组件也可以被替换为SpringCloud的实现,只是会丢失很多高级特性、损失性能、损失扩展性,破坏程序结构的可推理性。

基于可逆计算理论设计的低代码平台NopPlatform已开源:

  • gitee: canonical-entropy/nop-entropy
  • github: entropy-cloud/nop-entropy
  • 开发示例:docs/tutorial/tutorial.md
  • 可逆计算原理和Nop平台介绍及答疑_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot云养鸡互动平台的设计与实现

前言 对于当今社会的人们来说&#xff0c;互联网技术是必不可少的&#xff0c;随着经济和技术的不断发展&#xff0c;计算机已经深入到各个领域。云养鸡互动平台将人们的时间需求与计算机技术结合起来&#xff0c;架起一座桥梁&#xff0c;使云养鸡互动更加方便快捷。云养鸡互…

使用Kubernetes管理容器化应用

使用Kubernetes管理容器化应用 Kubernetes简介 安装Kubernetes 安装Minikube 启动Minikube集群 创建一个简单的Web应用 创建项目目录 初始化项目 安装Node.js依赖 创建Docker镜像 编写Dockerfile 构建并推送Docker镜像 创建Kubernetes配置文件 创建Deployment 创建Service …

使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

自适应神经网络架构:原理解析与代码示例

个人主页&#xff1a;chian-ocean 文章专栏 自适应神经网络结构&#xff1a;深入探讨与代码实现 1. 引言 随着深度学习的不断发展&#xff0c;传统神经网络模型在处理复杂任务时的局限性逐渐显现。固定的网络结构和参数对于动态变化的环境和多样化的数据往往难以适应&#…

Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)

一、异常 在Python中&#xff0c;异常&#xff08;Exception&#xff09;是一种用于处理在程序运行时可能发生的错误情况的机制 异常允许程序在检测到错误时不是简单地崩溃&#xff0c;而是能够优雅地处理这些错误&#xff0c;可能包括记录错误信息、清理资源、或者向用户提…

A4-C四驱高防变电站巡检机器人

在电力行业数字化、智能化转型进程中&#xff0c;搭载多模态成像传感器的变电站巡检机器人、视频监控设备逐渐取代传统人工&#xff0c;成为变电设备状态监测的主要工具。变电站巡检机器人具有全天候、非接触式、多参量测量等特点&#xff0c;结合内置人工智能算法完成仪表识别…

MATLAB锂电概率分布模型

&#x1f3af;要点 概率分布等效电路模型结合了路径相关速率能力及状态估计中滞后效应。纠正了充电状态中时间误差累积及避免开路电压中电压滞后现象。使用电流方向和电池容量相关函数描述开路电压&#xff0c;并使用微分方程描述电压滞后现象。模型结构基于一级相变的材料机制…

QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】

经过前面的铺垫&#xff0c;今天我们就开始我们图形化界面之旅了&#xff0c;我们的第一个窗体主要包括&#xff1a;菜单栏、状态栏、工具栏、铆接部件、还有Qt提供的一些主窗体的API。 第一部分&#xff1a;主界面(QMainWindow) 当创建好项目后&#xff0c;我们直接运行&…

Unity中的动画状态机(详解)

动画状态机的定义 Unity中的动画状态机&#xff08;Animator Controller&#xff09;是用于定义和管理角色或对象动画状态之间转换的工具。它允许动画师和开发者设计复杂的动画逻辑&#xff1b; 例如角色的行走、跑步、跳跃、攻击等动作&#xff0c;以及其他动作之间的平滑过渡…

Vue笔记-element ui中关于table的前端分页

对于 Element UI 表格的前端分页&#xff0c;可以在组件中使用 JavaScript 来实现数据的分页显示&#xff0c;而不必从后端获取已分页的数据。以下是一个简单的示例&#xff0c;演示如何在前端进行 Element UI 表格的分页&#xff1a; <template><div><el-tabl…

ShellCode 格式化代码注入工具

一款基于C/C开发的应用层汇编代码注入工具&#xff0c;可实现向特定进程内注入动态链接库模块或注入ShellCode汇编指令集&#xff0c;还可以实现第三方进程的汇编级Call调用&#xff0c;通常被用于协助渗透人员完成内存注入&#xff0c;同时也可用于对特定ShellCode汇编代码进行…

Ubuntu系统安装软件

在Linux系统中有四种软件安装方式&#xff1a;rpm、yum、apt、编译安装 编译安装 编译安装只有一个源码包&#xff0c;源码包是由一大堆源代码程序组成的&#xff0c;是由程序员按照特定格式和语法编写好了&#xff0c;现成的安装包 程序&#xff1a;未执行的代码 进程&#…

雷池社区版compose配置文件解析-mgt

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多个 Dock…

自动驾驶-传感器简述

自动驾驶车辆上的传感器类型包含激光雷达、毫米波雷达、相机、imu、rtk、超声波雷达等&#xff0c;这些传感器用来接收外部世界多姿多彩的信号&#xff0c;根据接收到的信号&#xff0c;车载大脑对信号进行处理&#xff0c;那信号的准确程度就尤为重要。 本文将各个传感器的特性…

Lucas带你手撕机器学习——岭回归

岭回归&#xff08;Ridge Regression&#xff09; 一、背景与引入 在进行线性回归分析时&#xff0c;我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关&#xff0c;这会导致回归系数的不稳定性&#xff0c;使得模型的预测能力降低。传统的线性回归通过最小…

模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元

模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案&#xff0c;通过主动控制技术消除振动干扰&#xff0c;提供稳定的环境。目前&#xff0c;随着微纳制造和精密测量技术的发展&#xff0c;对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…

STM32 第3章 如何用串口下载程序

时间:2024.10.28 一、学习内容 1、安装USB转串口驱动 1.1串口下载连接示意图 1、USB转串口模块在开发板上是一个独立的模块,可通过调帽与其他串口连接,USART1/2/3/4/5 2、只有USART1才具有串口下载的功能。 3、CH340是电平转换芯片,将电脑端输出的USB电平和单片机输…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

论文解析八: GAN:Generative Adversarial Nets(生成对抗网络)

目录 1.GAN&#xff1a;Generative Adversarial Nets&#xff08;生成对抗网络&#xff09;1、标题 作者2、摘要 Abstract3、导言 IntroductionGAN的介绍 4、相关工作 Related work5、模型 Adversarial nets总结 6.理论计算 Theoretical Results具体算法公式全局优化 Global O…