4.3 Oinone的分布式体验

在oinone的体系中分布式比较独特,boot工程中启动模块中包含就走本地,不包含就走远程,本文带您体验下分布式部署以及分布式部署需要注意点。

看下面例子之前先把话术统一下:启动或请求SecondModule代表启动或请求pamirs-second-boot工程,启动或请求DemoModule代表启动或请求pamirs-demo-boot工程,并没有严格意义上启动哪个模块之说,只有启动工程包含哪个模块。

一、构建SecondModule模块

Step1 构建模块工程

参考3.2.1【构建第一个Module】一文,利用脚手架工具构建一个SecondModule,记住需要修改脚本。

脚本修改如下:

#!/bin/bash

# 项目生成脚手架
# 用于新项目的构建

# 脚手架使用目录
# 本地 local
# 本地脚手架信息存储路径 ~/.m2/repository/archetype-catalog.xml
archetypeCatalog=local

# 以下参数以pamirs-second为例

# 新项目的groupId
groupId=pro.shushi.pamirs.second

# 新项目的artifactId
artifactId=pamirs-second

# 新项目的version
version=1.0.0-SNAPSHOT

# Java包名前缀
packagePrefix=pro.shushi

# Java包名后缀
packageSuffix=pamirs.second

# 新项目的pamirs platform version
pamirsVersion=4.6.0

# Java类名称前缀
javaClassNamePrefix=Second

# 项目名称 module.displayName
projectName=OinoneSecond

# 模块 MODULE_MODULE 常量
moduleModule=second_core

# 模块 MODULE_NAME 常量
moduleName=SecondCore

# spring.application.name
applicationName=pamirs-second

# tomcat server address
serverAddress=0.0.0.0

# tomcat server port
serverPort=8090

# redis host
redisHost=127.0.0.1

# redis port
redisPort=6379

# 数据库名
db=demo

# zookeeper connect string
zkConnectString=127.0.0.1:2181

# zookeeper rootPath
zkRootPath=/second

mvn archetype:generate \
  -DinteractiveMode=false \
  -DarchetypeCatalog=${archetypeCatalog} \
  -DarchetypeGroupId=pro.shushi.pamirs.archetype \
  -DarchetypeArtifactId=pamirs-project-archetype \
  -DarchetypeVersion=4.6.0 \
  -DgroupId=${groupId} \
  -DartifactId=${artifactId} \
  -Dversion=${version} \
  -DpamirsVersion=${pamirsVersion} \
  -Dpackage=${packagePrefix}.${packageSuffix} \
  -DpackagePrefix=${packagePrefix} \
  -DpackageSuffix=${packageSuffix} \
  -DjavaClassNamePrefix=${javaClassNamePrefix} \
  -DprojectName="${projectName}" \
  -DmoduleModule=${moduleModule} \
  -DmoduleName=${moduleName} \
  -DapplicationName=${applicationName} \
  -DserverAddress=${serverAddress} \
  -DserverPort=${serverPort} \
  -DredisHost=${redisHost} \
  -DredisPort=${redisPort} \
  -Ddb=${db} \
  -DzkConnectString=${zkConnectString} \
  -DzkRootPath=${zkRootPath}

图4-3-1 构建一个名为SecondModule的模块

脚步执行生成工程如下:

image.png

图4-3-2 SecondModule的工程结构

Step2 调整配置

修改application-dev.yml文件

修改SecondModule的application-dev.yml的内容

  1. base库换成与DemoModule一样的配置,配置项为:pamirs.datasource.base
pamirs:
  datasource:   
        base:
      driverClassName: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://127.0.0.1:3306/demo_base?useSSL=false&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
      username: root # 数据库用户
      password: oinone # 数据库用户对应的密码
      initialSize: 5
      maxActive: 200
      minIdle: 5
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      asyncInit: true

图4-3-3 base库换成与DemoModule一样的配置

  1. 修改后端Server的启动端口号为9091
server:
  address: 0.0.0.0
  port: 9091
  sessionTimeout: 3600

图4-3-4 修改后端Server的启动端口号为9091

修改bootstrap.yml文件

  1. 设置dubbo序列化方式为pamirs,记得DemoModule也要改。
spring:
  profiles:
    active: dev
  application:
    name: pamirs-second

pamirs:
  default:
    environment-check: true
    tenant-check: true

---
spring:
  profiles: dev
  cloud:
    config:
      enabled: false
      uri: http://127.0.0.1:7001
      label: master
      profile: dev
    nacos:
      server-addr: http://127.0.0.1:8848
      discovery:
        enabled: false
        namespace:
        prefix: application
        file-extension: yml
      config:
        enabled: false
        namespace:
        prefix: application
        file-extension: yml

dubbo:
  application:
    name: pamirs-second
    version: 1.0.0
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: -1
    serialization: pamirs
  scan:
    base-packages: pro.shushi
  cloud:
    subscribed-services:

---
spring:
  profiles: test
  cloud:
    config:
      enabled: false
      uri: http://127.0.0.1:7001
      label: master
      profile: test
    nacos:
      server-addr: http://127.0.0.1:8848
      discovery:
        enabled: false
        namespace:
        prefix: application
        file-extension: yml
      config:
        enabled: false
        namespace:
        prefix: application
        file-extension: yml

dubbo:
  application:
    name: pamirs-second
    version: 1.0.0
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: -1
    serialization: pamirs
  scan:
    base-packages: pro.shushi
  cloud:
    subscribed-services:

图4-3-5 修改bootstrap.yml文件

Step3 构建一个RemoteTestModel

package pro.shushi.pamirs.second.api.model;

import pro.shushi.pamirs.meta.annotation.Field;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.base.common.CodeModel;

@Model.model(RemoteTestModel.MODEL_MODEL)
@Model(displayName = "远程测试模型",labelFields = "name")
public class RemoteTestModel extends CodeModel {

    public static final String MODEL_MODEL="second.RemoteTestModel";

    @Field(displayName = "name")
    private String name;

}

新建RemoteTestModel模型,用于远程调用体验:

图4-3-6 构建一个RemoteTestMode

Step4 新增SecondSessionHook

@Hook(module= SecondModule.MODULE_MODULE), 规定只有增对SecondModule模块访问的请求该拦截器才会生效,不然其他模块的请求都会被SecondSessionHook拦截。

package pro.shushi.pamirs.second.core.hook;

import org.springframework.stereotype.Component;
import pro.shushi.pamirs.meta.annotation.Hook;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;
import pro.shushi.pamirs.meta.api.core.faas.HookBefore;
import pro.shushi.pamirs.meta.api.dto.fun.Function;
import pro.shushi.pamirs.second.api.SecondModule;

@Component
@Slf4j
public class SecondSessionHook implements HookBefore {
    @Override
    @Hook(priority = 1,module= SecondModule.MODULE_MODULE)
    public Object run(Function function, Object... args) {
        log.info("second hook");
        return function;
    }
}

图4-3-7 新增SecondSessionHook

Step5 新建RemoteTestModelAction

在SecondModule中新建RemoteTestModelAction,自定义RemoteTestModel模型的queryPage函数。方便debug,看看效果

package pro.shushi.pamirs.second.core.action;

import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.api.dto.condition.Pagination;
import pro.shushi.pamirs.meta.api.dto.wrapper.IWrapper;
import pro.shushi.pamirs.meta.constant.FunctionConstants;
import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum;
import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum;
import pro.shushi.pamirs.second.api.model.RemoteTestModel;

@Model.model(RemoteTestModel.MODEL_MODEL)
public class RemoteTestModelAction {

    @Function.Advanced(type= FunctionTypeEnum.QUERY)
    @Function.fun(FunctionConstants.queryPage)
    @Function(openLevel = {FunctionOpenEnum.API})
    public Pagination<RemoteTestModel> queryPage(Pagination<RemoteTestModel> page, IWrapper<RemoteTestModel> queryWrapper){
        return new RemoteTestModel().queryPage(page,queryWrapper);
    }

}

图4-3-8 新建RemoteTestModelAction

Step6 boot工程需要引入Oinone的RPC包

  1. 父pom的依赖管理中先加入pamirs-distribution-faas的依赖
<dependency>
  <groupId>pro.shushi.pamirs.distribution</groupId>
  <artifactId>pamirs-distribution-faas</artifactId>
  <version>${pamirs.boot.version}</version>
</dependency>

图4-3-9 父pom的依赖管理中先加入pamirs-distribution-faas的依赖

  1. 在pamirs-second-boot中增加入pamirs-distribution-faas的依赖
<dependency>
  <groupId>pro.shushi.pamirs.distribution</groupId>
  <artifactId>pamirs-distribution-faas</artifactId>
</dependency>

图4-3-10 在pamirs-second-boot中增加入pamirs-distribution-faas的依赖

  1. 为SecondApplication类增加类注解@EnableDubbo
@EnableDubbo
public class SecondApplication {
}

图4-3-11 为SecondApplication类增加类注解@EnableDubbo

Step7 启动SecondModule

别忘了启动指令要为INSTALL,参考DemoModule的启动说明

Step8 Second工程本地mvn install,方便DemoModule包依赖

二、DemoModule模块准备

Step1 DemoModule引入Oinone的RPC包和Second的API包

  1. 父pom的依赖管理中先加入pamirs-second-api和pamirs-distribution-faas的依赖
<dependency>
  <groupId>pro.shushi.pamirs.second</groupId>
  <artifactId>pamirs-second-api</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</dependency>

<dependency>
  <groupId>pro.shushi.pamirs.distribution</groupId>
  <artifactId>pamirs-distribution-faas</artifactId>
  <version>${pamirs.boot.version}</version>
</dependency>

图4-3-12 依赖管理增加对应依赖包配置

  1. 在pamirs-demo-api中增加入pamirs-second-api的依赖
<dependency>
  <groupId>pro.shushi.pamirs.second</groupId>
  <artifactId>pamirs-second-api</artifactId>
</dependency>

图4-3-13 增加pamirs-second-api的依赖配置

  1. 在pamirs-demo-boot中增加入pamirs-distribution-faas的依赖
<dependency>
  <groupId>pro.shushi.pamirs.distribution</groupId>
  <artifactId>pamirs-distribution-faas</artifactId>
</dependency>

图4-3-14 增加pamirs-distribution-faas的依赖配置

  1. 为DemoApplication类增加类注解@EnableDubbo
@EnableDubbo
public class DemoApplication {
}

图4-3-15 为DemoApplication类增加类注解@EnableDubbo

Step2 修改DemoModule定义

修改DemoModule的依赖注解,增加SecondModule.MODULE_MODULE

@Module(dependencies = {SecondModule.MODULE_MODULE})

图4-3-16 注解方式申明DemoModule对SecondModule的依赖

Step3 修改pamirs-demo-boot的bootstrap.yml文件

参考SecondModule修改dubbo的序列化方式为pamirs

Step4 修改pamirs-demo-boot的DemoApplication

为依赖模块配置扫描包路径,修改DemoApplication增加second的扫描包,在日常开发中小伙伴的应用肯定不是以pamirs开头,所以大家别忘了SpringBoot的基本配置。在3.2.1【构建第一个Module】一文也提到我们在启动工程中需要配置启动模块和依赖模块的扫描路径。

image.png

图4-3-17 修改DemoApplication中关于SpringBoot的扫描包路径

三、分布式部署体验

以上工作准备好以后,我们就可以通过DemoModule来远程调用SecondModule。

第一个Case(前端把请求分别打到DemoModule、SecondModule)

在日常研发中,不同模块的菜单整合也是非常常见的,比如把B模块的菜单挂在A模块中。这个Case就是在讲解如何做到跨模块的菜单整合

Step1 修改前端工程的vue.config.js

利用node的proxy,分别把DemoCore转发到8090端口,把SecondCore转发到8091端口,把默认其他模块转发到8090端口。localhost还是127.0.0.1跟浏览器地址框输入保持一致

const WidgetLoaderPlugin = require('@kunlun/widget-loader/dist/plugin.js').default;
const Dotenv = require('dotenv-webpack');

module.exports = {
  lintOnSave: false,
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.widget$/,
          loader: '@kunlun/widget-loader',
        },
      ],
    },
    plugins: [new WidgetLoaderPlugin(), new Dotenv()],
    resolveLoader: {
      alias: {
        '@kunlun/widget-loader': require.resolve('@kunlun/widget-loader'),
      },
    },
  },
  devServer: {
    port: 8080,
    disableHostCheck: true,
    progress: false,
    proxy: {
      'pamirs/DemoCore': {
        // 支持跨域
        changeOrigin: true,
        target: 'http://localhost:8090',
      },
      'pamirs/SecondCore': {
          // 支持跨域
        changeOrigin: true,
        target: 'http://localhost:8091',
      },
      pamirs: {
          // 支持跨域
        changeOrigin: true,
        target: 'http://localhost:8090',
      },
    },
  },
};

图4-3-18 修改前端工程的vue.config.js

Step2 修改DemoMenus

增加一个RemoteTestModel的管理入口,这里需要指定菜单的module为DemoModule,不然应用会切换到SecondModule

@UxMenu("远程模型")@UxRoute(model = RemoteTestModel.MODEL_MODEL,module= DemoModule.MODULE_MODULE) class RemoteTestModelMenu{}

图4-3-19 修改DemoMenus

Step3 重启前端应用看效果

  1. 点击远程模型菜单,可以正常进行增、删、改、查操作。

image.png

图4-3-20 示例效果

  1. SecondSessionHook起作用

“second hook”并打印出来,前端请求没有再进过DemoModule再远程调用SecondModule,而是直接打到了SecondModule上。

image.png

图4-3-21 SecondSessionHook对应日志

第二个Case(跨模块代理,自动走远程)

Step1 新建RemoteTestModelProxy

在DemoModule中新建RemoteTestModelProxy代理继承RemoteTestModel

package pro.shushi.pamirs.demo.api.proxy;

import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.enmu.ModelTypeEnum;
import pro.shushi.pamirs.second.api.model.RemoteTestModel;

@Model.model(RemoteTestModelProxy.MODEL_MODEL)
@Model.Advanced(type = ModelTypeEnum.PROXY)
@Model(displayName = "远程模型的代理",summary="远程模型的代理")
public class RemoteTestModelProxy extends RemoteTestModel {

    public static final String MODEL_MODEL="demo.RemoteTestModelProxy";

}

图4-3-22 新建RemoteTestModelProxy

Step2 修改DemoMenus

增加一个RemoteTestModelProxy的管理入口

@UxMenu("远程代理")@UxMenu.route(RemoteTestModelProxy.MODEL_MODEL) class RemoteTestModelProxyMenu{}

图4-3-23 增加一个RemoteTestModelProxy的管理入口

Step3 重启看效果

  1. 点击菜单【远程代理】

image.png

图4-3-24 示例效果

  1. 在SecondModule的RemoteTestModelAction中debug,会发现DemoModule会自动调用RemoteTestModel模型的queryPage。

image.png

图4-3-25 DemoModule远程调用RemoteTestModel模型的queryPage

  1. 但不走SecondSessionHook

“second hook”并没有打印出来,为什么?在3.4.3.2【面向切面-拦截器】一文中介绍到“不是前端直接发起的请求不会生效”,可能小伙伴有疑问,我不是前端点击的吗?是的,但经过DemoModule再调用SecondModule,系统会判定为后端调用。

第三个Case(远程调用自定义函数)

Step1 新增函数RemoteTestModelService和RemoteTestModelServiceImpl

SecondModule定义RemoteTestModelService,用于DemoModule的调用。SecondModule记得再次mvn install

package pro.shushi.pamirs.second.api.service;

import pro.shushi.pamirs.meta.annotation.Fun;
import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.api.dto.condition.Pagination;
import pro.shushi.pamirs.meta.api.dto.wrapper.IWrapper;
import pro.shushi.pamirs.second.api.model.RemoteTestModel;

@Fun(RemoteTestModelService.FUN_NAMESPACE)
public interface RemoteTestModelService {

    String FUN_NAMESPACE ="second.RemoteTestModelService";
    @Function
    Pagination<RemoteTestModel> queryPage(Pagination<RemoteTestModel> page, IWrapper<RemoteTestModel> queryWrapper);
    @Function
    String hello(String name);
    @Function
    String remoteTest(RemoteTestModel remoteTest);
}

图4-3-26 新增RemoteTestModelService接口类

package pro.shushi.pamirs.second.core.service;

import org.springframework.stereotype.Component;
import pro.shushi.pamirs.meta.annotation.Fun;
import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.api.dto.condition.Pagination;
import pro.shushi.pamirs.meta.api.dto.wrapper.IWrapper;
import pro.shushi.pamirs.second.api.model.RemoteTestModel;
import pro.shushi.pamirs.second.api.service.RemoteTestModelService;

@Fun(RemoteTestModelService.FUN_NAMESPACE)
@Component
public class RemoteTestModelServiceImpl implements RemoteTestModelService {

    @Override
    @Function
    public Pagination<RemoteTestModel> queryPage(Pagination<RemoteTestModel> page, IWrapper<RemoteTestModel> queryWrapper) {
        return new RemoteTestModel().queryPage(page,queryWrapper);
    }
    @Override
    @Function
    public String hello(String name) {
        return "hello" + name ;
    }

    @Override
    @Function
    public String remoteTest(RemoteTestModel remoteTest) {
        return "remoteTest" + remoteTest.getName() ;
    }
}

图4-3-27 新增RemoteTestModelServiceImpl实现类

Step2 新增RemoteTestModelProxyAction

  1. 新增RemoteTestModelProxyAction,并定义queryPage、hello、remoteTest等Action,方便前端点击测试

  2. 引入RemoteTestModelService,分别调用queryPage、hello、remoteTest方法

package pro.shushi.pamirs.demo.core.action;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pro.shushi.pamirs.demo.api.proxy.RemoteTestModelProxy;
import pro.shushi.pamirs.framework.faas.utils.ArgUtils;
import pro.shushi.pamirs.meta.annotation.Action;
import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;–
import pro.shushi.pamirs.meta.api.dto.condition.Pagination;
import pro.shushi.pamirs.meta.api.dto.wrapper.IWrapper;
import pro.shushi.pamirs.meta.constant.FunctionConstants;
import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum;
import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum;
import pro.shushi.pamirs.second.api.model.RemoteTestModel;
import pro.shushi.pamirs.second.api.service.RemoteTestModelService;

@Model.model(RemoteTestModelProxy.MODEL_MODEL)
@Component
@Slf4j
public class RemoteTestModelProxyAction {
    @Autowired
    private RemoteTestModelService remoteTestModelService;

    @Function.Advanced(type= FunctionTypeEnum.QUERY)
    @Function.fun(FunctionConstants.queryPage)
    @Function(openLevel = {FunctionOpenEnum.API})
    public Pagination<RemoteTestModelProxy> queryPage(Pagination<RemoteTestModelProxy> page, IWrapper<RemoteTestModelProxy> queryWrapper){

        Pagination<RemoteTestModel> pageConvert = ArgUtils.convert(RemoteTestModelProxy.MODEL_MODEL,RemoteTestModel.MODEL_MODEL,page);
        IWrapper<RemoteTestModel> queryWrapperConvert = ArgUtils.convert(RemoteTestModelProxy.MODEL_MODEL,RemoteTestModel.MODEL_MODEL,queryWrapper);
        Pagination<RemoteTestModel> resultTmp=  remoteTestModelService.queryPage(pageConvert,queryWrapperConvert);
        Pagination<RemoteTestModelProxy> result = ArgUtils.convert(RemoteTestModel.MODEL_MODEL,RemoteTestModelProxy.MODEL_MODEL,resultTmp);
        return result;
    }

    @Action(displayName = "hello")
    public RemoteTestModelProxy hello(RemoteTestModelProxy data){
        String hello = remoteTestModelService.hello(data.getName());
        log.info(hello);
        return data;
    }
    @Action(displayName = "remoteTest")
    public RemoteTestModelProxy remoteTest(RemoteTestModelProxy data){
        RemoteTestModel s = ArgUtils.convert(RemoteTestModelProxy.MODEL_MODEL,RemoteTestModel.MODEL_MODEL,data);
        String testRemote = remoteTestModelService.remoteTest(s);
        log.info(testRemote);
        return data;
    }
}

图4-3-28 新增RemoteTestModelProxyAction

Step3 重启看效果

点击remoteTest按钮看看效果

image.png

图4-3-29 示例效果

总结一、二 、三 Case

把SecondModule模块停掉,则上面一、二 、三 Case都会报错。如果DemoModule的pamirs-demo-boot中依赖加上pamirs-second-core,同时application-dev.yml文件中pamirs.boot.modules加上second_core的配置,则DemoModule和SecondModule部署在一起,再把前端node请求代理都转发到DemoModule模块上。则只需要启动pamirs-demo-boot就可以了。这个留给小伙伴们自己实验。

分布式不分布式只是部署方式的差异,代码层面没有差异,有了体感以后再去看2.4.1【Oinone独特性之单体与分布式的灵活切换】一文可能会有更深的体会。

注意点:

  1. 【编码】远程调用服务时要确保入参和服务端定义的一样,可以用平台提供ArgUtils.convert进行转换

  2. 【部署】分布式情况下部署要用ng或其他方式进行转发,针对前端发起的请求,根据请求url中带的模块信息转发到对应有启动该模块的boot应用中

Oinone社区 作者:史, 昂原创文章,如若转载,请注明出处:https://doc.oinone.top/oio4/9310.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
史, 昂's avatar史, 昂数式管理员
Previous 2024年5月23日 am8:28
Next 2024年5月23日 am8:30

相关推荐

  • 合作伙伴中心

    合作伙伴中心包含“公司、个人、部门、岗位、员工”五个菜单。其中公司、个人为合作伙伴,是创建组织架构的前置条件;部门、岗位、员工为组织架构,是选择的公司下的内部架构。 合作伙伴 公司页面中包含常规的增删改查和查看详情。 公司的创建页面如下: 个人暂不支持创建。 组织架构 同样菜单中包含常规的增删改查和查看详情。 组织架构可以依次创建部门、岗位、员工。对应关系为,一个部门下有多个岗位,一个员工可以归属于多个部门和多个岗位。 部门创建页面如下: 岗位创建页面如下: 员工创建页面如下: 合作伙伴中心创建的员工会自动生成可登录的用户并进行绑定。 在用户中心创建的用户仅为可登录用户无法操作管理员工、关联部门。 流程设计器中可选到的操作人分类为“员工、部门、角色”。

    2024年6月20日
    1.4K00
  • 4.1.18 框架之网关协议-Variables变量

    我们在应用开发过程有一种特殊情况在后端逻辑编写的时候需要知道请求的发起入口,平台利用GQL协议中的Variables属性来传递信息,本文就介绍如何获取。 一、前端附带额外变量 属性名 类型 说明 scene String 菜单入口 表4-1-18-1 前端附带额外变量 图4-1-18-1 variables信息中的scene 二、后端如何接收variables信息 通过PamirsSession.getRequestVariables()可以得到PamirsRequestVariables对象。 三、第一个variable(举例) Step1 修改PetTalentAction,获取得到前端传递的Variables package pro.shushi.pamirs.demo.core.action; ……类引用 @Model.model(PetTalent.MODEL_MODEL) @Component public class PetTalentAction { ……其他代码 @Function.Advanced(type= FunctionTypeEnum.QUERY) @Function.fun(FunctionConstants.queryPage) @Function(openLevel = {FunctionOpenEnum.API}) public Pagination<PetTalent> queryPage(Pagination<PetTalent> page, IWrapper<PetTalent> queryWrapper){ String scene = (String)PamirsSession.getRequestVariables().getVariables().get("scene"); System.out.println("scene: "+ scene); ……其他代码 } ……其他代码 } 图4-1-18-2 修改PetTalentAction Step2 重启验证 点击宠物达人不同菜单入口,查看效果 图4-1-18-3 示例效果(一) 图4-1-18-4 示例效果(二)

    2024年5月23日
    1.9K00
  • 3.5.5.1 设计器数据导出

    简介 通过调用导出接口,将设计器的设计数据与运动数据打包导出到文件中。 提供了download/export两类接口。 export 导出到OSS。导出的文件会上传到文件服务,通过返回的url下载导出文件。 请求示例: mutation { uiDesignerExportReqMutation { export( data: { module: "gemini_core", fileName: "meta", moduleBasics: true } ) { jsonUrl } } } 响应示例: { "data": { "uiDesignerExportReqMutation": { "export": { "jsonUrl": "https://xxx/meta.json" } } }, "errors": [], "extensions": {} } download 直接返回导出数据。适用于通过浏览器直接下载文件。 请求示例: mutation { uiDesignerExportReqMutation { download( data: { module: "gemini_core", fileName: "meta", moduleBasics: true } ) { jsonUrl } } } 如何构造url protocol :// hostname[:port] / path ? query=URLEncode(GraphQL) 例: http://127.0.0.1:8080/pamirs/base?query=mutation%20%7B%0A%09uiDesignerExportReqMutation%20%7B%0A%09%09download(%0A%09%09%09data%3A%20%7B%20module%3A%20%22gemini_core%22%2C%20fileName%3A%20%22meta%22%2C%20moduleBasics%3A%20true%20%7D%0A%09%09)%20%7B%0A%09%09%09jsonUrl%0A%09%09%7D%0A%09%7D%0A%7D 在浏览器中访问构造后的url,可直接下载文件 接口列表 模型设计器 指定模块导出 query { modelMetaDataExporterQuery { export/download(query: { module: "模块编码" }) { module url } } } module参数:指定导出的模块编码 url返回结果:export方式导出的文件url 页面设计器 导出页面 指定模块导出 mmutation { uiDesignerExportReqMutation { download/export( data: { module: "gemini_core", fileName: "meta", moduleBasics: false } ) { jsonUrl } } } module参数:模块编码 fileName参数:指定生成的json文件名称 moduleBasics参数:指定是否只导出模块基础数据,如果为true,只导出内置布局、模块菜单、菜单关联的动作。 如果为false,还会导出模块内的所有页面,以及页面关联的动作元数据、页面设计数据 等等。 默认值为false。 指定菜单导出 mutation { uiDesignerExportReqMutation { download/export( data: { menu: { name: "uiMenu0000000000048001" } fileName: "meta" relationViews: true } ) { jsonUrl } } } menu参数:菜单对象,指定菜单的name。只会导出该菜单及其绑定页面,不会递归查询子菜单 fileName参数:指定生成的json文件名称 relationViews参数:指定是否导出关联页面,默认为false,只导出菜单关联的页面。如果为true,还会导出该页面通过跳转动作关联的自定义页面。 指定页面导出 mutation { uiDesignerExportReqMutation { download/export( data: { view: { name: "xx_TABLE_0000000000119001" model: "ui.designer.TestUiDesigner" } fileName: "meta" relationViews: true } ) { jsonUrl } } }…

    Oinone 7天入门到精通 2024年5月23日
    2.1K00
  • 【附件一】下载说明

    章节说明 下载内容 下载地址 备注 3.1.1环境准备>环境准备(Mac版) 安装 jdk 1.8 https://www.oracle.com/java/technologies/downloads/#java8 安装 mysql 8.0.26 https://dev.mysql.com/downloads/mysql/ 安装 idea社区版2020.2.4 https://www.jetbrains.com/idea/download/other.html 安装idea插件 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 根据各自Idea版本下载对应插件,下载文件后去除.txt后缀 安装 git 2.2.0 https://sourceforge.net/projects/git-osx-installer/files/git-2.15.0-intel-universal-mavericks.dmg/download?use_mirror=nchc 安装 GraphQL的客户端工具 Insomnia 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 下载文件后修改文件名去除.txt后缀 安装 maven https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/ 安装脚本zk https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz 安装脚本rocketmq https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip 安装脚本redis https://download.redis.io/releases/redis-5.0.2.tar.gz 安装nvm https://github.com/nvm-sh/nvm/blob/master/README.md 3.1.1环境搭建>环境准备(Windows版) 安装JDK 1.8 https://www.oracle.com/java/technologies/downloads/#java8 安装 Apache Maven 3.8+ https://maven.apache.org/download.cgi 下载settings-develop.xml 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 下载到 C:\Users\你的用户名.m2 目录中并重命名为settings.xml 安装 Jetbrains IDEA 2020.2.4 https://www.jetbrains.com/idea/download/other.html 安装 Jetbrains IDEA 2020.2.4需下载插件 https://pan.baidu.com/share/init?surl=HNzSxxH0KncvglkfITUrsA 提取密码: mdji 安装idea插件 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 根据各自Idea版本下载对应插件,下载文件后去除.txt后缀 安装MySQL 8 https://dev.mysql.com/downloads/mysql/ 安装Git https://git-scm.com/download/win 安装GraphQL测试工具Insomnia https://github.com/Kong/insomnia/releases 安装RocketMQ https://rocketmq.apache.org/download/ 安装ElasticSearch 版本 8.4.1 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-6-1 安装Redis https://download.redis.io/releases/ Zookeeper安装 https://dlcdn.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz 安装nodejs 版本12.12.0 https://nodejs.org/dist/v12.12.0/node-v12.12.0-win-x64.zip 安装cnpm https://www.npmjs.com/package/cnpm 3.2.1Oinone一模块为组织>构建第一个Module 安装archetype-project-generate.sh脚本 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 3.5.5Oinone以交互为外在>设计器的结合 安装Docker https://www.docker.com/get-started/ 下载结构包:Oinone-op-ds.zip 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 4.1.10后端高级特性>函数之触发与定时 下载canal中间件:pamirs-middleware-canal-deployer-3.0.1.zi 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 4.1.11后端高级特性>函数之异步执行 下载tbSchedule的控制台jar包:pamirs-middleware-schedule-console-3.0.1.jar.txt 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 下载schedule.json 请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服 下载以下文件放在pamirs-demo-boot的src/main/resources/init目录下 4.1.25后端高级特性>框架之搜索引擎 ES安装 方式一:官方下载安装包:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-4-1 下载后去除后缀.txt,然后解压文件 方式二:请移至Oinone官网https://www.oinone.top/对应页面下载或联系Oinone官方客服

    Oinone 7天入门到精通 2024年5月23日
    2.2K00
  • 4.1.1 模块之yml文件结构详解

    本节是对demo的boot工程的application-*.yml文件关于oinone相关配置的扩充讲解,大家可以先通读留个影响,以备不时之需 在基础入门的模块一章中大家构建,并通过启动前后应用,直观地感受到我们自己建的demo模块。在上述过程中想必大家都了解到我们oinone的boot工程是专门用来做应用启动管理,它完全没有任何业务逻辑,它只决定启动哪些模块、启动方式、以及相关配置。它跟Spring Boot的一个普通工程没有什么差异。所有我们只要看application-*.yml文件,oinone提供了哪些特殊配置就能窥探一二。 这里主要介绍pamirs路径下的核心以及常用的配置项 一、pamirs.boot pamirs.boot.init 描述:启动加载程序,是否启动元数据、业务数据和基础设施的加载与更新程序,在应用启动时同时对模块进行生命周期管理 true ##标准版,只支持true pamirs.boot.sync 描述:同步执行加载程序,启动时对模块进行生命周期管理采用同步方式 true ##标准版,只支持true pamirs.boot.modules a. 描述:启动模块列表。这里只有base模块是必须的。为了匹配我们的前端模版,在demo的例子中加入了其他几个通用业务模块。当然这些通用业务模块也是可以大大降低大家的开发难度以及提升业务系统的设计质量 b. – base #oinone的基础模块 c. – common #oinone的一些基础辅助功能 d. – sequence #序列的能力 e. – resource #基础资源如 f. – user #基础用户 g. – auth #权限 h. – message #消息 i. – international #国际化 j. – business #商业关系 k. – file #文件,demo里没有默认加入,如果要开发导入导出相关功能,可以对应引入改模块 l. – …… 还有很多通用业务模块以及这些模块的详细介绍,我们在介绍第六章【oinone的通用能力】的章节去展开 pamirs.boot.mode ⅰ. dev:不走缓存,可以直接修改元数据。特别是我们在说页面设计的时候,可以修改base_view表直接生效不需要重启系统 配置举例 pamirs: boot: init: true sync: true modules: – base – common – sequence – resource – user – auth – message – international – business – demo_core 图4-1-1-1 pamirs.boot.mode配置举例 二、pamirs.boot.profile与pamirs.boot.options pamirs.boot.option, 在pamirs.boot.options中可以自定义可选项,也可以根据pamirs.boot.profile属性来指定这些可选项,pamirs.boot.profile属性的默认值为CUSTOMIZE。只有pamirs.boot.profile=CUSTOMIZE时,才能在pamirs.boot.options中自定义可选项。 可选项 说明 默认值 AUTO READONLY PACKAGE DDL reloadModule 是否加载存储在数据库中的模块信息 false true true true true checkModule 校验依赖模块是否安装 false true true true true loadMeta 是否扫描包读取模块元数据 true true false true true reloadMeta 是否加载存储在数据库中元数据 false true true true true computeMeta 是否重算元数据 true true false true true editMeta 编辑元数据,是否支持编程式编辑元数据 true true false true true diffMeta 差量减计算元数据 false true false true false refreshSessionMeta 刷新元数据缓存 true true true true true rebuildHttpApi 刷新重建前后端协议 true true true false false diffTable 差量追踪表结构变更 false true false true false rebuildTable 更新重建表结构 true true false true false…

    2024年5月23日
    1.7K00

Leave a Reply

Please Login to Comment