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

news2024/11/17 7:51:10

第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: true
  orm:
    init-database-schema: true

  datasource:
    driver-class-name: org.h2.Driver
    jdbc-url: jdbc:h2:./db/demo
    username: sa
    password:

第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 {
    @BizQuery
    public String hello(@Name("message") String message) {
        return "Hi," + message;
    }

    @BizMutation
    public DemoResponse testOk(@RequestBean DemoRequest request) {
        DemoResponse ret = new DemoResponse();
        ret.setName(request.getName());
        ret.setResult("ok");
        return ret;
    }

    @BizMutation
    public 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 {

    @Inject
    IDaoProvider 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无法注入私有成员变量
    @Inject
    DemoMapper 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/services
           io.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文件来标记它是模块。
        /beans
           app-{xxx}.beans.xml NopIoC启动时会自动扫描每个模块的beans目录下以`app-`为前缀的beans.xml文件
        /model
           {bizObjName}.xbiz 所有的服务对象原则上都是要在beans.xml中注册,然后再通过对象名查找到对应的xbiz和xmeta文件
           {bizObjName}.xmeta  NopDynEntity对象采用了简化注册流程,直接向BizObjectManager注册,没有在beans.xml中定义服务对象 
        /orm
           app.orm.xml NopOrm引擎初始化的时候会加载所有模块的orm目录下的app.orm.xml模型文件
        /pages
           /{bizObjName}
              {pageId}.page.yaml   可以配置页面文件在系统初始化的情况下加载,它引用的view模型因此被连带加载
              {bizObjName}.view.xml  View模型不会被自动加载,但是一般会放置在这个位置                    

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

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

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

相关文章

这都2024年了 你还要多久才能领悟 ArrayBlockingQueue 源码

这都2024年了 你还要多久才能领悟 ArrayBlockingQueue 源码 文章目录 这都2024年了 你还要多久才能领悟 ArrayBlockingQueue 源码阻塞队列简介阻塞队列的历史阻塞队列的思想 ArrayBlockingQueue 常见方法及测试ArrayBlockingQueue 源码分析整体设计初始化阻塞式获取和新增元素非…

python数据类型-列表

1 python中列表的定义 python中列表是一种有序和可更改的集合&#xff0c;允许重复的成员&#xff0c;列表中的元素之间数据类型可以不同&#xff08;元素之间数据类型可以不相同&#xff0c;这一点和其它的面向对象的开发语言有很大的不同&#xff0c;如C#、Java&#xff09;…

大创项目推荐 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

Unity_Visual Effect Graph

Unity_Visual Effect Graph Unity可视化特效渲染虽不及Unreal Engine,然也还是吊打一众其他引擎的,粗浅整理一波吧,需要深入研究的点实在是太多了。 按照常规包管理方式安装Visual Effect Graph插件: 安装之后,示例文件夹中自带资源,拖入场景即可: 场景只是资源的显…

如何搭建一个成功的家装预约咨询小程序

微信小程序是一种在微信平台上运行的应用程序&#xff0c;为企业提供了一个快速、便捷的方式与用户进行交互和服务。开通微信家装预约咨询小程序店铺&#xff0c;可以帮助家装企业更好地与用户进行沟通和服务&#xff0c;提升用户体验和便捷度。下面我们就来详细介绍一下开通微…

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

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

R高级绘图 | P1 | 带边缘分布散点图 | 代码注释 + 结果解读

新系列 —— R高级绘图&#xff0c;准备整理所有曾经绘制过的图图和未来需要的图图们的代码&#xff01;预计这个系列会囊括所有常见图形&#xff0c;只提供高级绘图代码&#xff0c;基础绘图主要在 R语言绘图 系列中进行介绍&#xff0c;这个系列咱们主打&#xff1a;需要XX图…

[Java 并发基础]多线程编程

文章参考&#xff1a; https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html https://juejin.cn/post/6970558076642394142 文章目录 线程的创建方式继承 Thread实现 Runnable 接口实现 Callable 接口使用 Lambda使用线程池 线程创建相关的 jdk源码Thr…

阿赵UE学习笔记——13、贴花

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次介绍一种特殊的材质类型&#xff0c;贴花。 一、获取贴花资源 在没有分析贴花的原理之前&#xff0c;可以先去获得一些免费的贴花资源来使用&#xff0c;比如在Quixel上面就有专门的一个资源…

Git - 在公司中,使用 git 的流程是什么?遇到冲突怎么办?

目录 一、公司中 git 的使用流程 1.1、设置用户签名 1.2、创建分支&#xff0c;提交代码到远程仓库 1.3、创建 pr&#xff0c;code review 1.4、意外情况&#xff1a;分支冲突 一、公司中 git 的使用流程 1.1、设置用户签名 刚进公司&#xff0c;肯定是先初始化个人的用户…

教师社会地位最直观的表现是什么

教师社会地位最直观的表现是什么&#xff1f;当我们谈及教师社会地位时&#xff0c;不能仅仅从薪资、荣誉等角度去理解&#xff0c;而应从教师的工作环境、待遇、以及社会对教师的认知和尊重程度等方面进行全面考察。 教师的工作环境是他们社会地位的直观体现之一。一个良好的…

备战蓝桥杯---数据结构与STL应用(优先队列的小细节)

很显然&#xff0c;我们先二分求X,对于验证&#xff0c;一开始我先想的是直接求每个的不足电量再除充电量后向上取整&#xff0c;然后判断与k的大小关系。事实上&#xff0c;如果让k很大&#xff0c;若有两只手机在下一刻多没电&#xff0c;显然上述方法得出的结论是错误的&…

虹科干货 | 如何使用nProbe Cento构建100 Gbit NetFlow 传感器

本文是一份全面的指南&#xff0c;解释了如何使用nProbe Cento构建一个高效的100 Gbit NetFlow传感器。旨在帮助大家充分利用NetFlow技术&#xff0c;以监控和分析高速网络流量。 当需要监控分布式网络&#xff0c;了解流经上行链路或关键网段的网络流量时&#xff0c;NetFlow…

【JVM】类加载流程

目录 1.加载 2.链接 &#xff08;1&#xff09;校验 &#xff08;2&#xff09;准备 &#xff08;3&#xff09;解析 3.初始化 4.使用 5.卸载 1.加载 加载阶段&#xff0c;简言之&#xff0c;查找并加载类的二进制数据&#xff0c;生成 Class 的实例 在加载类时&#x…

SpringCloud_学习笔记_1

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

Trinamic推出嵌入式运动控制模块,用于驱动大功率工业电机,大幅降低功耗

集成的实时、无传感器控制与驱动技术将功率损耗降低50%&#xff0c;可驱动功率高出三倍的电机(高达7A) TRINAMIC推出两款新型插槽式运动控制嵌入式模块及其开发工具&#xff0c;采用独特的实时无传感器控制技术。这些完备的控制/驱动模块通过在其板上实时处理关键功能&#xff…

JDBC 结构优化2

JDBC 结构优化2 文章目录 JDBC 结构优化2结构优化2 - ATM系统(存,取,转,查)1 Service2 事务3 ThreadLocal4 事务的封装 结构优化2 - ATM系统(存,取,转,查) 1 Service 什么是业务? 代表用户完成的一个业务功能&#xff0c;可以由一个或多个DAO的调用组成。软件所提供的一个功…

阿里云 DMS 执行sql变更

数据库开发-数据变更-无锁变更 选择数据库&#xff1a;比如要更新生产库&#xff0c;搜索生产库名字。 填入变更sql。

【计算机图形】几何(Geometry)和拓扑(Topology)

目录 参考文献三维实体建模内核CSG/BREPParasolid简介Parasolid接口函数Parasolid类的结构 Parasolid数据分类&#xff1a;几何(Geometry)和拓扑(Topology)拓扑(Topology)什么是“拓扑”呢&#xff1f;Principle Geometry- Topology - Construction Geometry案例&#xff1a;拓…

最新多功能PHP图床源码 /兰空图床Lsky Pro开源版v2.1/ 单纯的图床程序源码

源码介绍&#xff1a; Lsky Pro 是一个用于在线上传、管理图片的图床程序&#xff0c;中文名&#xff1a;兰空图床&#xff0c;你可以将它作为自己的云上相册&#xff0c;亦可以当作你的写作贴图库。 该程序的最初版本诞生于2017年10月&#xff0c;由ThinkPHP 5框架精心打造而…