nop-entropy可逆计算入门(1)

第1步:从大佬的gitee:https://gitee.com/canonical-entropy/nop-entropy下载源码,进行本地编译,具体编译看项目下的readme,想偷懒的可以下载我编译后的jar,放到自己的maven仓库

https://pan.baidu.com/s/15qANnrCh5RV-T1CYCDvMdw?pwd=kq0q
我把代码上传到gitee,地址:https://gitee.com/a-crud-boy/nop-simple-demonn

第2步:创建一个maven项目,然后添加依赖

    <parent><groupId>io.github.entropy-cloud</groupId><artifactId>nop-entropy</artifactId><version>2.0.0-SNAPSHOT</version></parent><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>io.github.entropy-cloud</groupId><artifactId>nop-spring-web-starter</artifactId></dependency><!--h2数据库--><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!--h2数据库--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>

第3步 ,添加springboot入口

@SpringBootApplication
public class NopSpringSimpleApplication {public static void main(String[] args) {SpringApplication.run(NopSpringSimpleApplication.class, args);}
}

第4步 ,添加application.yaml文件,注意是yaml,不是yml

 nop:debug: trueorm:init-database-schema: truedatasource:driver-class-name: org.h2.Driverjdbc-url: jdbc:h2:./db/demousername: sapassword:

第5步 ,创建类


import com.nop.biz.DemoRequest;
import com.nop.biz.DemoResponse;
import io.nop.api.core.annotations.biz.BizModel;
import io.nop.api.core.annotations.biz.BizMutation;
import io.nop.api.core.annotations.biz.BizQuery;
import io.nop.api.core.annotations.biz.RequestBean;
import io.nop.api.core.annotations.core.Name;
import io.nop.api.core.exceptions.NopException;import static com.nop.biz.DemoErrors.ARG_NAME;
import static com.nop.biz.DemoErrors.ERR_DEMO_NOT_FOUND;@BizModel("Demo")
public class DemoBizModel {@BizQuerypublic String hello(@Name("message") String message) {return "Hi," + message;}@BizMutationpublic DemoResponse testOk(@RequestBean DemoRequest request) {DemoResponse ret = new DemoResponse();ret.setName(request.getName());ret.setResult("ok");return ret;}@BizMutationpublic DemoResponse testError(@RequestBean DemoRequest request) {throw new NopException(ERR_DEMO_NOT_FOUND).param(ARG_NAME, request.getName());}
}

package com.nop.biz.demo;import io.nop.api.core.annotations.biz.BizModel;
import io.nop.api.core.annotations.biz.BizMutation;
import io.nop.api.core.annotations.biz.BizQuery;
import io.nop.api.core.annotations.core.Name;
import io.nop.api.core.annotations.graphql.GraphQLReturn;
import io.nop.api.core.beans.FilterBeans;
import io.nop.api.core.beans.query.QueryBean;
import io.nop.core.reflect.bean.BeanTool;
import io.nop.dao.api.IDaoProvider;
import io.nop.dao.api.IEntityDao;
import io.nop.orm.IOrmEntity;
import jakarta.inject.Inject;import java.util.List;
import java.util.Map;/*** <strong>   </strong> <br>* <p>* <strong> </strong> <br>* </p>* <br>** @author :* @date 2024年01月31日* 修改人 修改日期 修改描述<br>* -------------------------------------------<br>* <br>* <br>*/
@BizModel("DemoEntity")
public class DemoEntityBizModel {@InjectIDaoProvider daoProvider;@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity getEntity(@Name("id") String id) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");return dao.getEntityById(id);}@BizMutation@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity saveEntity(@Name("data") Map<String, Object> data) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");IOrmEntity entity = dao.newEntity();BeanTool.instance().setProperties(entity, data);dao.saveEntity(entity);return entity;}@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public List<IOrmEntity> findByName(@Name("name") String name) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");QueryBean query = new QueryBean();query.addFilter(FilterBeans.contains("name", name));// <contains name="name" value="a" />  name like '%a%'return dao.findAllByQuery(query);}// 注意,字段不能声明为private。NopIoC无法注入私有成员变量@InjectDemoMapper demoMapper;@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity findBySql(@Name("name") String name) {return demoMapper.findFirstByName(name);}}

package com.nop.biz.demo;import io.nop.api.core.annotations.core.Name;
import io.nop.api.core.annotations.orm.SqlLibMapper;
import io.nop.orm.IOrmEntity;/*** <strong>   </strong> <br>* <p>* <strong> </strong> <br>* </p>* <br>** @author :* @date 2024年01月31日* 修改人 修改日期 修改描述<br>* -------------------------------------------<br>* <br>* <br>*/
@SqlLibMapper("/test/demo/sql/demo.sql-lib.xml")
public interface DemoMapper {IOrmEntity findFirstByName(@Name("name") String name);}
package com.nop.biz;import io.nop.api.core.annotations.core.Locale;
import io.nop.api.core.exceptions.ErrorCode;import static io.nop.api.core.exceptions.ErrorCode.define;/*** <strong>   </strong> <br>* <p>* <strong> </strong> <br>* </p>* <br>** @author :* @date 2024年01月31日* 修改人 修改日期 修改描述<br>* -------------------------------------------<br>* <br>* <br>*/
@Locale("zh-CN")
public interface DemoErrors {String ARG_NAME = "name";ErrorCode ERR_DEMO_NOT_FOUND =define("nop.err.demo.not-found", "指定数据不存在: {name}", ARG_NAME);
}package com.nop.biz;import lombok.Data;/*** <strong>   </strong> <br>* <p>* <strong> </strong> <br>* </p>* <br>** @author :* @date 2024年01月30日* 修改人 修改日期 修改描述<br>* -------------------------------------------<br>* <br>* <br>*/
@Data
public class DemoRequest {private String name;private String email;}
package com.nop.biz;import lombok.Data;/*** <strong>   </strong> <br>* <p>* <strong> </strong> <br>* </p>* <br>** @author :* @date 2024年01月30日* 修改人 修改日期 修改描述<br>* -------------------------------------------<br>* <br>* <br>*/
@Data
public class DemoResponse {private String name;private String result;}

其中@BizModel @BizMutation @BizQuery @RequestBean @Name,@SqlLibMapper 是nop中规定的一些注解,BizModel 类似spring中的Controlller,RequestBean 类似于spring中的RequestBody,SqlLibMapper类似于Mapper,代表存放sql的地址文件,后面会有请求案例,

第6步 ,创建资源文件

资源目录结构
关于目录结构后面有介绍,需要按照nop规定好的结构,千万别忘了_module,这是规定一个目录为一个模块的文件,就是一个空文件

app-demo.beans.xml

<?xml version="1.0" encoding="UTF-8" ?><beans x:schema="/nop/schema/beans.xdef" xmlns:x="/nop/schema/xdsl.xdef"><bean id="DemoBizModel" class="com.nop.biz.demo.DemoBizModel"/><bean id="DemoEntityBizModel" class="com.nop.biz.demo.DemoEntityBizModel"/><bean id="com.nop.biz.demo.DemoMapper" class="io.nop.orm.sql_lib.proxy.SqlLibProxyFactoryBean"ioc:type="@bean:id" ioc:bean-method="build"><property name="mapperClass" value="@bean:type"/></bean>
</beans>

DemoEntity.xmeta

<meta x:schema="/nop/schema/xmeta.xdef" xmlns:x="/nop/schema/xdsl.xdef"><props><prop name="sid" displayName="SID" queryable="true"><schema type="String"/></prop><prop name="name" displayName="名称" queryable="true" insertable="true" updatable="true"><schema type="String"/></prop><prop name="status" displayName="状态" queryable="true" insertable="true" updatable="true"><schema type="Integer"/></prop><prop name="status_label" displayName="状态文本"><schema type="String"/><getter><c:script><![CDATA[if(entity.status == 1)return "ACTIVE";return "INACTIVE";]]></c:script></getter></prop></props>
</meta>

app.orm.xml

<orm x:schema="/nop/schema/orm/orm.xdef" xmlns:x="/nop/schema/xdsl.xdef"><entities><entity name="app.demo.DemoEntity" tableName="demo_entity"className="io.nop.orm.support.DynamicOrmEntity" registerShortName="true"><columns><column name="sid" code="SID" propId="1" stdSqlType="VARCHAR" precision="32" tagSet="seq"mandatory="true" primary="true"/><column name="name" code="NAME" propId="2" stdSqlType="VARCHAR" precision="100" mandatory="true"/><column name="status" code="STATUS" propId="3" stdSqlType="INTEGER"/></columns></entity></entities>
</orm>

demo.sql-lib.xml

<sql-lib x:schema="/nop/schema/orm/sql-lib.xdef" xmlns:x="/nop/schema/xdsl.xdef"><sqls><eql name="findFirstByName" sqlMethod="findFirst"><source>select o from DemoEntity o where o.name like ${'%' + name + '%'}</source></eql></sqls>
</sql-lib>

第7步 ,运行项目,项目启动以后,会在项目目录下生成一个_dump 的目录,里面可以供开发者调试

生成的目录

Nop平台调试模式启动Nop平台的调试模式,只需设置nop.debug=true。在调试模式下,可以通过以下链接获取所有服务定义:

  • /p/DevDoc__graphql
  • /p/DevDoc__beans

例:

  • 127.0.0.1:8080/p/DevDoc__graphql 可以看到对外暴露的所有服务定义。
    例如: type DemoEntity{ "SID" sid : String "名称" name : String "状态" status : Int "状态文本" status_label : String }

  • 127.0.0.1:8080/p/DevDoc__beans 可以查看所有对象定义。
    例如:<bean class="com.nop.biz.demo.DemoBizModel" id="DemoBizModel" ioc:aop="false"/>

注意事项

  1. 前端的REST链接根据对象名和方法名自动推定,无需手工指定,固定格式为: /r/{bizObjName}__{bizMethod}。 注意是两个下划线。
  2. @BizQuery允许通过GET和POST两种HTTP方法调用,而@BizMutation只允许通过POST方法调用。
  3. 通过GET方式调用时,可以通过URL链接来传递参数,例如/r/Demo__hello?message=abc。通过POST方式调用时可以通过URL来传参,也可以通过Http的body使用JSON格式传递。
  4. 可以通过@Name来一个个的指定前台参数,也可以通过@RequestBean将前台传递过来的所有参数包装为指定的JavaBean类型。
  5. 服务函数总是返回POJO对象,并指定按照JSON格式进行编码。

示例API访问

REST

例1,带响应状态:

  • 访问127.0.0.1:8080/r/Demo__hello?message=abc
  • 响应:

{
“data”: “Hi,abc”,
“status”: 0
}

例2,不带响应状态:

  • 访问127.0.0.1:8080/p/Demo__hello?message=abc
  • 响应: Hi,abc

其他类似:

  • 127.0.0.1:8080/r/DemoEntity__findByName?name=abc

  • 127.0.0.1:8080/r/Demo2Entity__findByName?name=abc

GraphQL

例1(查询),关键字query:

  • 访问POST 127.0.0.1:8080/graphql

  • 请求体:

    query{
    Demo__hello(message:“2343”)
    }

  • 响应

    {
    “data”: {
    “Demo__hello”: “Hi,abc”
    }
    }

例2(更新),关键字mutation:

  • 访问POST 127.0.0.1:8080/graphql

  • 请求体:

    mutation {
    Demo__testOk( name: “zhagnsan”, email: “123@qq.com” ) {
    name
    result
    }
    }

  • 响应

    {
    “data”: {
    “Demo__hello”: “Hi,abc”
    }
    }

例3(保存),关键字mutation:

  • 访问POST 127.0.0.1:8080/graphql
  • 请求体:
    mutation {
    DemoEntity__saveEntity(data: {name: “zhagnsan”, status: 1}) {
    sid
    name
    status
    }
    }
  • 响应
    {
    “data”: {
    “DemoEntity__saveEntity”: {
    “sid”: “23410bb4cdd74fc7bd2c1795059ff8a1”,
    “name”: “zhagnsan”,
    “status”: 1
    }
    }
    }

例2跟例3有点类似于spring中的加RequestBody跟不加RequestBody的区别, 用 @RequestBean注解就直接写属性字段,@Name需要把方法中的对象参数名写在前面

文件命名规范

平台内所有会被自动识别并处理的文件模式已在此文档中列举:

Nop平台内部约定了一定的资源路径模式,会自动查找满足模式的文件进行加载。

META-INF/servicesio.nop.core.initialize.ICoreInitializer 使用Java内置的ServiceLoader机制注册分级初始化函数CoreInitialization会读取所有CoreInitializer,按照优先级顺序执行
bootstrap.yaml 静态全局配置文件,其中的内容优先级最高,不会被外部配置所覆盖
application.yaml 全局的配置文件
application-{profile}.yaml 全局的配置文件,profile是通过nop.profile指定的部署环境名称_vfs//_delta/{deltaDir}   这里是delta层的名称,缺省会加载default层这里的文件会覆盖标准路径的同名文件/dict{dictName}.dict.yaml  字典文件不会被自动加载,但是通过dictName加载指定字典文件     /i18n/{locale}{moduleName}.i18n.yaml I18nManager初始化的时候会自动加载所有i18n文件     /nop/aop{xxx}.annotations Nop的AOP代码生成器生成包装类时会读取所有的annotations文件,并为每个标注了指定注解的类生成AOP包装类/autoconfig{xxx}.beans  NopIoC会自动扫描解析所有后缀名为beans的文件,加载其中的beans.xml文件/core/reigstry{xxx}.register-model.xml 初始化时会自动扫描所有registry-model.xml文件,并注册对应的DSL模型解析器,将它们和特定的文件类型关联起来/dao/dialect/selector{xxx}.selector.xml   初始化时会自动扫描所有selector.xml文件,加载数据库方言的匹配规则{dialectName}.dialect.xml  数据库方言定义文件,按照dialectName来加载/main/auth/main.action-auth.xml 全局的操作权限和菜单定义文件,在其中通过x:extends来引用其他权限文件/main.data-auth.xml 全局的数据权限定义文件,在其中通过x:extends来引用其他数据权限文件       /{moduleId}  Nop模块的moduleId必须是nop/auth这种两级目录结构_module  每个Nop模块下都有一个_module文件来标记它是模块。/beansapp-{xxx}.beans.xml NopIoC启动时会自动扫描每个模块的beans目录下以`app-`为前缀的beans.xml文件/model{bizObjName}.xbiz 所有的服务对象原则上都是要在beans.xml中注册,然后再通过对象名查找到对应的xbiz和xmeta文件{bizObjName}.xmeta  NopDynEntity对象采用了简化注册流程,直接向BizObjectManager注册,没有在beans.xml中定义服务对象 /ormapp.orm.xml NopOrm引擎初始化的时候会加载所有模块的orm目录下的app.orm.xml模型文件/pages/{bizObjName}{pageId}.page.yaml   可以配置页面文件在系统初始化的情况下加载,它引用的view模型因此被连带加载{bizObjName}.view.xml  View模型不会被自动加载,但是一般会放置在这个位置                    

第1篇就先写这么多,后面再慢慢完善

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

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

相关文章

Node.js的学习1

Node.js简介 浏览器是JavaScript的前端运行环境Node.js是JavaScript的后端运行环境Node.js中无法调用DOM和BOM等浏览器内置API 终端中的快捷键 使用向上箭头&#xff0c;可以快速定位到上一次执行的命令使用tab键&#xff0c;可以快速补全路径使用esc键&#xff0c;可以快速清…

Sentinel 知识总结

Sentinel 知识总结 Sentinel 是阿里巴巴开源的一个轻量级流量控制框架&#xff0c;主要用于保护系统稳定性和流畅性。它提供了多种流量控制策略&#xff0c;包括QPS限流、并发数限流、线程池限流等&#xff0c;并且支持集群限流。此外&#xff0c;Sentinel还提供了熔断降级、系…

学习使用vite+vue3的所遇问题总结

组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来&#xff0c;导致使用不了&#xff0c;出现以下报错 这是因为&#xff0c;如果不用setup&#xff0c;就得使用 export default …… setup 是后者的语法糖 在Vue.js中&#xff0c;你可以通过route对象…

USTC ICS(2023Fall) Lab5 Password Verification

LC-3汇编语言 .orig x3000 LOOP1 AND R1,R1,#0ADD R1,R1,#3LEA R0, string1PUTS ;打印string1AND R0,R0,#0ADD R0, R0, #10 OUT ;打印换行符GETCOUT;检查输入的字符是否为W(ASCII码为87)ADD R0,R0,#-16ADD R0,R0,#-16ADD R0,R0,#-16ADD R…

H5网站在线客服小程序源码系统,完全开源可二开 带完整的安装代码包以及搭建教程

互联网的快速发展&#xff0c;H5网站已成为企业与客户沟通的重要渠道。然而&#xff0c;许多H5网站在客户服务方面存在不足&#xff0c;无法及时响应客户的问题和需求。小编给大家分享了一款H5网站在线客服小程序源码系统&#xff0c;旨在为企业提供完善的客户服务解决方案。 …

(自用)learnOpenGL学习总结-高级OpenGL-几何着色器

在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点&#xff0c;在几何着色器中进行任意变换之后再给片段着色器&#xff0c;可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…

案例四:误Ghost分区恢复

1、案例 小王电脑最近有点问题&#xff0c;于是打算将电脑系统重装系统&#xff0c;原本5个分区&#xff0c;第一个区是操作系统区&#xff0c;后4个用户数据区&#xff0c;在一次GHOST时失误&#xff0c;做完发现硬盘只有一个系统区&#xff0c;两个数据区消失了&#xff0c;…

右手螺旋线定则

通电螺线管中的安培定则&#xff08;安培定则二&#xff09;&#xff1a;用右手握住通电螺线管&#xff0c;让四指指向电流的方向&#xff0c;那么大拇指所指的那一端是通电螺线管的N极。

Redis核心技术与实战【学习笔记】 - 9.如何避免单线程模型的阻塞

概述 Redis 被广泛应用的原因是因为它支持高性能访问。所以&#xff0c;我们要重视所有可能影响 Redis 性能的因素&#xff08;如命令操作、系统配置、关键机制、硬件配置等&#xff09;。 影响 Redis 性能的 5 大方面的潜在因素分别是&#xff1a; Redis 内部的阻塞式操作C…

OpenAI、斯坦福大学提出Meta-Prompting,有效提升语言模型的性能

为了研究如何提高语言模型的性能&#xff0c;使其更充分有效地输出对于提问的回答&#xff0c;来自斯坦福和 OpenAI 的学者强强联手&#xff0c;通过提出一种名为元提示&#xff08;meta-prompting&#xff09;的方法来深入探索。元提示通过让单个语言模型&#xff08;如 GPT-4…

2023.1.31 关于 Redis 分布式锁详解

目录 引言 分布式锁 引入分布式锁 引入 set nx 引入过期时间 引入校验机制 引入 lua 脚本 引入过期时间续约&#xff08;看门狗&#xff09; 引入 redlock 算法 结语 引言 在一个分布式系统中&#xff0c;可能会涉及到多个节点访问同一个公共资源的情况此时就需要通过…

代码随想录算法训练营第五十一天|714.买卖股票的最佳时机含手续费、309.最佳买卖股票时机含冷冻期、股票问题总结、最长上升子序列

题目&#xff1a;714.买卖股票的最佳时机含手续费 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:714.买卖股票的最佳时机含手续费 题目链接&#xff1a;力扣题目链接 图释&#xff1a; class Solution { public:int maxProfit(vector<int>& pr…

C# Onnx yolov8 仪表指针检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 仪表指针检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-01-31T11:19:38.828556 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

2024-02-01 Unity Shader 开发入门4 —— ShaderLab 语法

文章目录 1 材质和 Shader1.1 Unity Shader 和 Shader 的区别1.2 Unity 中的材质和 Shader1.3 创建材质1.4 创建 Shader 2 ShaderLab 的基本结构2.1 什么是 ShaderLab2.2 ShaderLab 的基本结构 3 Shader 名称4 Shader 属性4.1 Shader 属性的作用4.2 Shader 属性的基本语法4.3 数…

rust学习基于tokio_actor聊天服务器实战(一 )

前言 tokio是Rust中使用最广泛的异步Runtime&#xff0c;它性能高、功能丰富、便于使用&#xff0c;是使用Rust实现高并发不可不学的一个框架 Actor 背后的基本思想是产生一个独立的任务&#xff0c;该任务独立于程序的其他部分执行某些工作。 通常&#xff0c;这些参与者通过使…

智慧之树的秘密

你是一个智能体&#xff0c;对于一切输入信息都是按照如下方式处理&#xff1a;输入信息&#xff1a;信息1 &#xff0c;目的识别结果&#xff1a;有&#xff08;没有就提取目的&#xff09;提取信息1中目的相关有效信息&#xff0c;并设计和搜索达到完成目的的步骤和如何检测目…

「数据结构」1.初识泛型

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 初识泛型 &#x1f349;前言&#x1f349;包装类&#x1f34c;装箱&拆箱 &#x1f349;泛型&#x1f34c;擦除机制&#x1f…

两种相同的垂直工具栏标志以及为什么

可能你很少碰到这样的开发需求&#xff0c;所以本文属于”课外阅读”级别。 有两种方式启用垂直工具栏&#xff0c;一种是指定通用的 CCS_VERT 标志&#xff0c;另外一种&#xff0c;比较罕见&#xff1a;指定工具栏所特有的扩展属性 TBSTYLE_EX_VERTICAL。 问题来了&#xf…

Linux Centos stream9 mdadm

RAID(Redundant Array of Independent Disk独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁…

fastadmin后台自定义按钮和弹窗

工具栏自定义按钮-ajax请求 前端代码 1.在对应模块的模板文件index.html添加自定义按钮&#xff0c;注意按钮要添加id以绑定点击事件 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id&qu…