4.1.1 模块之yml文件结构详解

本节是对demo的boot工程的application-*.yml文件关于oinone相关配置的扩充讲解,大家可以先通读留个影响,以备不时之需

在基础入门的模块一章中大家构建,并通过启动前后应用,直观地感受到我们自己建的demo模块。在上述过程中想必大家都了解到我们oinone的boot工程是专门用来做应用启动管理,它完全没有任何业务逻辑,它只决定启动哪些模块、启动方式、以及相关配置。它跟Spring Boot的一个普通工程没有什么差异。所有我们只要看application-*.yml文件,oinone提供了哪些特殊配置就能窥探一二。

这里主要介绍pamirs路径下的核心以及常用的配置项

一、pamirs.boot

  1. pamirs.boot.init

    1. 描述:启动加载程序,是否启动元数据、业务数据和基础设施的加载与更新程序,在应用启动时同时对模块进行生命周期管理

    2. true ##标准版,只支持true

  2. pamirs.boot.sync

    1. 描述:同步执行加载程序,启动时对模块进行生命周期管理采用同步方式

    2. true ##标准版,只支持true

  3. 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的通用能力】的章节去展开

  4. 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
printDDL 打印重建表结构DDL false false false false true
publishService 发布服务,是否发布远程服务 true true true false false
updateModule 分布式模块管理 false true false true false
updateMeta 初始化与更新元数据,是否将元数据的变更写入数据库 false true false true false
updateData 初始化与更新内置业务数据,是否将内置业务数据的变更写入数据库 true true false true false
params 扩展参数 可自定义 可自定义 可自定义 可自定义 可自定义

表4-1-1-1 pamirs.boot.options列表

可以在启动日志中可查看当前服务启动可选项。

image.png

图4-1-1-2 在启动日志中查看当前服务启动可选项

三、pamirs.meta

  1. pamirs.meta.metaPackages

    1. 描述:自定义元模型的所在包路径。标准版只能是pro.shushi.pamirs.trigger.model
  2. 配置举例

pamirs: 
    meta:
    metaPackages:
      - pro.shushi.pamirs.trigger.model

图4-1-1-3 pamirs.meta配置举例

四、pamirs.framework

  1. pamirs.framework.gateway #graphql的可选项配置

apamirs.framework.gateway.show-doc #是否对外提供gql的scheme文档查询能力,在3.2.1【构建第一个Module】一文中“DemoMoudel的启动”的部分之所以可以用Insomnia开查看后端的文档,就是这里要配置为true

bpamirs.framework.gateway.statistics #用于收集DataLoader执行过程中的状态,比如缓存命中多少次,已经load了多少个对象,有多少次error等

  1. pamirs.framework.hook

    1. pamirs.framework.hook.ignoreAll #默认为false,为true忽略掉所有hook函数

    2. pamirs.framework.hook.excludes #排除掉部分hook函数

  2. pamirs.framework.data #这个经常会使用到,大家一定要了解

    1. pamirs.framework.data.default-ds-key #模块的默认数据库key,对应pamirs.datasource配置

    2. pamirs.framework.data.ds-map #为模块指定数据库key,对应pamirs.datasource配置。在demo中我们如果要为demo_core这个模块配置独立数据库就可以在这里配置如 demo_core: demo,并在pamirs.datasource配置key为demo的数据源

  3. pamirs.framework.system

    1. pamirs.framework.system.system-ds-key #元数据系统对应的数据源,对应pamirs.datasource配置

    2. pamirs.framework.system.system-models #视为元数据模型,一起放到system-ds-key库

  4. 配置举例

pamirs:
  framework:
    system:
      system-ds-key: base
      system-models:
        - base.WorkerNode
    data:
      default-ds-key: pamirs
      ds-map:
        base: base
    gateway:
      statistics: true
      show-doc: true
    #hook 如下配置
    #hook:
      #excludes:
        #- pro.shushi.pamirs.core.common.hook.QueryPageHook4TreeAfter
        #- pro.shushi.pamirs.user.api.hook.UserQueryPageHookAfter
        #- pro.shushi.pamirs.user.api.hook.UserQueryOneHookAfter

图4-1-1-4 pamirs.framework 配置举例

五、pamirs.dialect.ds

  1. 描述:pamirs.datasource中数据源的方言信息,以key为对应。

  2. 子参数有:type(默认:MySQL),version(默认:8.0),majorVersion(默认:8)

  3. 配置举例

pamirs: 
    dialect: #MySQL8.0可不配置
    ds: 
        base: # pamirs.datasource中数据源的方言信息,以key为对应
        type: MySQL
        version: 8.0
        majorVersion: 8
      pamirs: # pamirs.datasource中数据源的方言信息,以key为对应
        type: MySQL
        version: 8.0
        majorVersion: 8

图4-1-1-5 pamirs.dialect.ds配置举例

六、pamirs.datasource

  1. 描述:安装模块所需要的数据源配置

  2. 配置举例

pamirs: 
  datasource:
    pamirs:
      driverClassName: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://127.0.0.1:3306/demo?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
    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-1-1-6 pamirs.datasource配置举例

七、pamirs.sharding

  1. 描述oinone的分库分表配置,当使用pamirs-trigger-bridge-tbschedule工程开启内置schedule功能时必须配置。

  2. 配置举例 - 参考4.1.24【框架之分库分表】一文。

pamirs: 
  sharding:
    define:
      data-sources:
        ds: pamirs
        pamirsSharding: pamirs #申明pamirsSharding库对应的pamirs数据源
        testShardingDs:        #申明testShardingDs库对应的testShardingDs_0\1数据源
          - testShardingDs_0
          - testShardingDs_1
      models:
        "[trigger.PamirsSchedule]":
          tables: 0..13
        "[demo.ShardingModel]":
          tables: 0..7
          table-separator: _
        "[demo.ShardingModel2]":
          ds-nodes: 0..1       #申明testShardingDs库对应的建库规则
          ds-separator: _
          tables: 0..7
          table-separator: _
    rule:
      pamirsSharding: #配置pamirsSharding库的分库分表规则
        actual-ds:
          - pamirs #申明pamirsSharding库对应的pamirs数据源
        sharding-rules:
          # Configure sharding rule,以下配置跟sharding-jdbc配置一致
          - tables:
              demo_core_sharding_model:
                actualDataNodes: pamirs.demo_core_sharding_model_${0..7}
                tableStrategy:
                  standard:
                    shardingColumn: user_id
                    shardingAlgorithmName: table_inline
            shardingAlgorithms:
              table_inline:
                type: INLINE
                props:
                  algorithm-expression: demo_core_sharding_model_${(Long.valueOf(user_id) % 8)}
        props:
          sql.show: true
      testShardingDs: #配置testShardingDs库的分库分表规则
        actual-ds: #申明testShardingDs库对应的pamirs数据源
          - testShardingDs_0
          - testShardingDs_1
        sharding-rules:
          # Configure sharding rule,以下配置跟sharding-jdbc配置一致
          - tables:
              demo_core_sharding_model2:
                actualDataNodes: testShardingDs_${0..1}.demo_core_sharding_model2_${0..7}
                databaseStrategy:
                  standard:
                    shardingColumn: user_id
                    shardingAlgorithmName: ds_inline
                tableStrategy:
                  standard:
                    shardingColumn: user_id
                    shardingAlgorithmName: table_inline
            shardingAlgorithms:
              table_inline:
                type: INLINE
                props:
                  algorithm-expression: demo_core_sharding_model2_${(Long.valueOf(user_id) % 8)}
              ds_inline:
                type: INLINE
                props:
                  algorithm-expression: testShardingDs_${(Long.valueOf(user_id) % 2)}
        props:
          sql.show: true

图4-1-1-7 pamirs.sharding配置举例

八、pamirs.mapper

  1. 库配置:可以通过YAML的“pamirs.mapper.<global或者ds>”配置项进行库配置。如果未配置,系统会采用默认值
配置项 默认值 描述
databaseFormat %s 库名格式化
tableFormat %s 表名格式化
tablePattern %s 动态表名表达式

表4-1-1-2 库配置

  1. 表配置:可以通过YAML的“pamirs.mapper.<global或者ds>.table-info”配置项或者@Model.Persistence注解进行表配置。注解优先级大于YAML配置文件配置。如果未配置,系统会采用默认值
配置项 默认值 描述
databaseFormat %s 库名格式化
tableFormat %s 表名格式化
tablePattern %s 动态表名表达式

表4-1-1-3 表配置

  1. 配置举例
pamirs: 
    mapper:
    static-model-config-locations:
      - pro.shushi.pamirs
    batch: collectionCommit #batch方法的批量提交模式
    batch-config:
      "[base.Field]":
        write: 2000
      "[base.Function]":
        read: 500
        write: 2000
    global: 
      table-info:
        logic-delete: true
        logic-delete-column: is_deleted
        logic-delete-value: REPLACE(unix_timestamp(NOW(6)),'.','')
        logic-not-delete-value: 0
        optimistic-locker: false
        optimistic-locker-column: opt_version
        key-generator: DISTRIBUTION
      table-pattern: '${module}_%s'
    #可以为指定数据配置
    #ds: 
    #   pamirs:
    #   table-info:
    #      logic-delete: true
    #      logic-delete-column: is_deleted
    #      logic-delete-value: REPLACE(unix_timestamp(NOW(6)),'.','')
    #      logic-not-delete-value: 0
    #      optimistic-locker: false
    #      optimistic-locker-column: opt_version
    #      key-generator: DISTRIBUTION
    #   table-pattern: '${module}_%s'

图4-1-1-8 pamirs.mapper配置举例

九、pamirs.persistence

  1. 描述:自动建库,建表

  2. 配置举例

pamirs: 
  persistence:
    global:
      auto-create-database: true
      auto-create-table: true

图4-1-1-9 pamirs.persistence配置举例

十、pamirs.plus

a. 描述mybatisplus的代理配置

b. 配置举例

pamirs: 
    plus:
    configuration:
      map-underscore-to-camel-case: false
      cache-enabled: false

图4-1-1-10 pamirs.plus配置举例

十一、pamirs.event

a. pamirs.event.enabled:启用RocketMQ功能,不启用的情况下无法使用任何功能,使用详见4.1.21【框架之分布式消息】一文。

b. pamirs.event.rocket-mq.namesrv-addr:RocketMQ连接地址字符串

c. pamirs.event.rocket-mq.aliyun : 阿里云版本适配

d. pamirs.event.schedule.enabled:启动异步任务工,不启用的情况下无法使用任何功能

e. 配置举例

pamirs: 
    event:
    enabled: false
    schedule:
      enabled: false
      ownSign: base
      auto-init: true
      auto-create-config-file: true
    rocket-mq:
      namesrv-addr: 127.0.0.1:9876
      # 标识发送消息和消费消息的机器的IP地址,默认为RemotingUtil.getLocalAddress()
      client-ip:
      # 标识发送消息和消费消息的机器的实例名称地址,默认为DEFAULT
      instance-name:
      # 标识发送消息和消费消息的机器的实例ID,无默认值
      namespace:
      # 为每一个topic添加一个固定前缀
      topic-prefix:
      # 是否启用vip netty通道以发送消息
      vip-channel-enabled: false
      # 是否启用消息轨迹追踪(该属性对于阿里云MQ无效)
      enable-trace: false
      # 消息轨迹追踪的topic名称
      trace-topic-name:
      # Pamirs Event工厂
      event-factory: pro.shushi.pamirs.framework.connectors.event.rocketmq.DefaultRocketMQEventFactory
      # acl配置
      accounts:
        - accessKey: RocketMQ
          secretKey: 12345678
      # 阿里云MQ 相关配置
      aliyun:
        # 使用阿里云MQ
        enabled: false
        # 阿里云MQ AccessKey
        access-key:
        # 阿里云MQ SecretKey
        secret-key:
        # 阿里云MQ InstanceId
        instance-id:
        # 阿里云MQ GroupId
        group-id:

图4-1-1-11 pamirs.event配置举例

十二、pamirs.auth

  1. pamirs.auth.modelFilter:配置模型所有的query方法不需要过权限控制 #下个版本作废,不建议使用

  2. pamirs.auth.funFilter:配置模型的特定query方法不需要过权限控制

  3. 配置举例

pamirs: 
    auth:
    model-filter:
      - user.PamirsUserTransient
      - auth.ResourcePermission
      - auth.AuthGroup
      - auth.AuthRole
      - base.View
      - resource.ResourceCountry
      - pamirs.web.WebMenu
      - pamirs.web.WebRenderTransient
      - pamirs.message.MessageCenter
      - resource.major.ResourceMajorConfig
    fun-filter:
      - namespace: user.PamirsUserTransient
        fun: login #登录
      - namespace: user.PamirsUserTransient
        fun: loginByVerificationCode #手机号验证码登录
      - namespace: user.PamirsUserTransient
        fun: loginVerificationCode #手机号登录验证码
      - namespace: user.PamirsUserTransient
        fun: signUpVerificationCode #手机号注册验证码

图4-1-1-12 pamirs.auth配置举例

十三、pamirs.file

  1. 描述:导入导出相关配置,使用详见6.1【文件导入导出】一文

  2. 配置举例

pamirs:
    file:
    auto-upload-logo: false
    import-property:
      default-each-import: false # 默认逐行导入
      max-error-length: 100 # 默认最大收集错误行数
    export-property:
      default-clear-export-style: false # 默认使用csv导出
      csv-max-support-length: 1000000 # csv导出最大支持1000000行

#文件导入导出还依赖CDN相关配置
cdn:
  oss:
    name: 阿里云
    type: OSS
    bucket: pamirs
    uploadUrl: oss-cn-hangzhou.aliyuncs.com
    downloadUrl: oss-cn-hangzhou.aliyuncs.com
    accessKeyId: #自行修改值
    accessKeySecret: #自行修改值
    mainDir: upload/demo/test/ 
    validTime: 3600000
    timeout: 600000
    active: true
    referer:
    localFolderUrl:

图4-1-1-13 pamirs.file配置举例

十四、pamirs.channel

  1. 描述:

  2. 配置举例

pamris: 
    channel:
    zkServers: 127.0.0.1:2181

图4-1-1-14 pamirs.channel配置举例

十五、pamirs.zookeeper

  1. 描述:zk配置的代理

  2. 配置举例

pamris:
    zookeeper:
    zkConnectString: 127.0.0.1:2181
    zkSessionTimeout: 60000
    rootPath: /demo

图4-1-1-15 pamirs.zookeeper配置举例

十六、pamirs.eip

  1. 描述:集成相关配置,使用详见集成平台一节

  2. 配置举例

pamirs: 
    eip:
    open-api:
      enabled: false
      standalone:
        host: 127.0.0.1
        port: 8081
        aes-key:
      routes:
        pamirs:
          host: 127.0.0.1
          port: 8081
          aes-key:

图4-1-1-16 pamirs.eip配置举例

高德地图接口的key配置

pamirs: 
    eip:
    map:
        gd:
        key: xxxxxx

图4-1-1-17高德地图接口的key配置

十七、pamirs.elastic

a. 描述:es搜索引擎地址 ,使用详见4.1.25【框架之搜索引擎】一节

b. 配置举例

pamirs: 
    elastic:
    url: 127.0.0.1:9200

图4-1-1-18 pamirs.elastic配置举例

十八、pamirs.load

oinone的默认模式下元数据都是以DB为准,当A模块依赖B模块,A与B模块不在没有部署在一起同时元数据的Base库也不是一个,那么A的元数据库怎么没有B模型,会导致系统出现模型定义找不到的错误。那么则需要A启动内存元数据模式,因为在A的元数据计算的时,因为A依赖B模块,同时有B的接口包,在内存中会扫描B的模型。所以我们要启动内存模式。应对分布式开发场景设计,更多请详见4.4【oinone的分布式体验进阶

pamirs:
  load:
    sessionMode: true

图4-1-1-19 pamirs.load配置举例

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

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

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

相关推荐

  • 3.4.3.1 面向对象-继承与多态

    本节为小伙伴们介绍,Function的面向对象的特性:继承与多态; 一、继承 我们在3.4.1【构建第一个Function】一文中伴随模型新增函数和独立类新增函数绑定到模型部分都是在父模型PetShop新增了sayHello的Function,同样其子模型都具备sayHello的Function。因为我们是通过Function的namespace来做依据的,子模型在继承父模型的sayHello函数后会以子模型的编码为namespace,名称则同样为sayHello。 二、多态(举例) oinone的多态,我们只提供覆盖功能,不提供重载,因为oinone相同name和fun的情况下不会去识别参数个数和类型。 Step1 为PetShop新增hello函数 package pro.shushi.pamirs.demo.api.model; …… //import @Model.model(PetShop.MODEL_MODEL) @Model(displayName = "宠物店铺",summary="宠物店铺",labelFields ={"shopName"} ) @Model.Code(sequence = "DATE_ORDERLY_SEQ",prefix = "P",size=6,step=1,initial = 10000,format = "yyyyMMdd") public class PetShop extends AbstractDemoIdModel { public static final String MODEL_MODEL="demo.PetShop"; …… //省略其他代码 @Function(openLevel = FunctionOpenEnum.API) @Function.Advanced(type= FunctionTypeEnum.QUERY) public PetShop sayHello(PetShop shop){ PamirsSession.getMessageHub().info("Hello:"+shop.getShopName()); return shop; } @Function(name = "sayHello2",openLevel = FunctionOpenEnum.API) @Function.Advanced(type= FunctionTypeEnum.QUERY) @Function.fun("sayHello2") public PetShop sayHello(PetShop shop, String s) { PamirsSession.getMessageHub().info("Hello:"+shop.getShopName()+",s:"+s); return shop; } @Function(openLevel = FunctionOpenEnum.API) @Function.Advanced(type= FunctionTypeEnum.QUERY) public PetShop hello(PetShop shop){ PamirsSession.getMessageHub().info("Hello:"+shop.getShopName()); return shop; } } 图3-4-3-1 为PetShop新增hello函数 Step2 为PetShopProxyB新增对应的三个函数 其中PetShopProxyB新增的hello函数,在java中是重载了hello,在代码中new PetShopProxyB()是可以调用父类的sayHello单参方法,也可以调用本类的双参方法。但在oinone的体系中对于PetShopProxyB只有一个可识别的Function就是双参的sayHello package pro.shushi.pamirs.demo.api.proxy; import pro.shushi.pamirs.demo.api.model.PetCatItem; import pro.shushi.pamirs.demo.api.model.PetShop; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Function; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.api.session.PamirsSession; import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum; import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum; import pro.shushi.pamirs.meta.enmu.ModelTypeEnum; import java.util.List; @Model.model(PetShopProxyB.MODEL_MODEL) @Model.Advanced(type = ModelTypeEnum.PROXY,inherited ={PetShopProxy.MODEL_MODEL,PetShopProxyA.MODEL_MODEL} ) @Model(displayName = "宠物店铺代理模型B",summary="宠物店铺代理模型B") public class PetShopProxyB extends PetShop { public static final String MODEL_MODEL="demo.PetShopProxyB"; @Field.one2many @Field(displayName = "萌猫商品列表") @Field.Relation(relationFields = {"id"},referenceFields = {"shopId"}) private List<PetCatItem> catItems; @Function(openLevel = FunctionOpenEnum.API) @Function.Advanced(type= FunctionTypeEnum.QUERY) public PetShop sayHello(PetShop shop){ PamirsSession.getMessageHub().info("PetShopProxyB Hello:"+shop.getShopName()); return shop; } @Function(name = "sayHello2",openLevel = FunctionOpenEnum.API) @Function.Advanced(type= FunctionTypeEnum.QUERY) @Function.fun("sayHello2") public PetShop sayHello(PetShop shop,String hello){ PamirsSession.getMessageHub().info("PetShopProxyB say:"+hello+","+shop.getShopName()); return shop; } @Function(openLevel = FunctionOpenEnum.API)…

    2024年5月23日
    1.5K00
  • 3.3.7 字段之序列化方式

    本文核心是带大家全面了解oinone的序列方式,包括支持的序列化类型、注意点、如果新增客户化序列化方式以及字段默认值的反序列化。 一、数据存储的序列化 (举例) 使用@Field注解的serialize属性来配置非字符串类型属性的序列化与反序列化方式,最终会以序列化后的字符串持久化到存储中。 ### Step1 新建PetItemDetail模型、并为PetItem添加两个字段 PetItemDetail继承TransientModel,增加两个字段,分别为备注和备注人 package pro.shushi.pamirs.demo.api.tmodel; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.base.TransientModel; import pro.shushi.pamirs.user.api.model.PamirsUser; @Model.model(PetItemDetail.MODEL_MODEL) @Model(displayName = "商品详情",summary = "商品详情",labelFields = {"remark"}) public class PetItemDetail extends TransientModel { public static final String MODEL_MODEL="demo.PetItemDetail"; @Field.String(min = "2",max = "20") @Field(displayName = "备注",required = true) private String remark; @Field(displayName = "备注人",required = true) private PamirsUser user; } 图3-3-7-1 PetItemDetail继承TransientModel 修改PetItem,增加两个字段petItemDetails类型为List和tags类型为List,并设置为不同的序列化方式,petItemDetails为JSON(缺省就是JSON,可不配),tags为COMMA。同时设置 @Field.Advanced(columnDefinition = varchar(1024)),防止序列化后存储过长 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pamirs.demo.api.tmodel.PetItemDetail; import pro.shushi.pamirs.meta.annotation.Field; import pro.shushi.pamirs.meta.annotation.Model; import pro.shushi.pamirs.meta.enmu.NullableBoolEnum; import java.math.BigDecimal; import java.util.List; @Model.model(PetItem.MODEL_MODEL) @Model(displayName = "宠物商品",summary="宠物商品",labelFields = {"itemName"}) public class PetItem extends AbstractDemoCodeModel{ public static final String MODEL_MODEL="demo.PetItem"; @Field(displayName = "商品名称",required = true) private String itemName; @Field(displayName = "商品价格",required = true) private BigDecimal price; @Field(displayName = "店铺",required = true) @Field.Relation(relationFields = {"shopId"},referenceFields = {"id"}) private PetShop shop; @Field(displayName = "店铺Id",invisible = true) private Long shopId; @Field(displayName = "品种") @Field.many2one @Field.Relation(relationFields = {"typeId"},referenceFields = {"id"}) private PetType type; @Field(displayName = "品种类型",invisible = true) private Long typeId; @Field(displayName = "详情", serialize = Field.serialize.JSON, store = NullableBoolEnum.TRUE) @Field.Advanced(columnDefinition = "varchar(1024)") private List<PetItemDetail> petItemDetails; @Field(displayName = "商品标签",serialize = Field.serialize.COMMA,store = NullableBoolEnum.TRUE,multi = true) @Field.Advanced(columnDefinition = "varchar(1024)") private…

    2024年5月23日
    1.5K00
  • 6.6 消息

    在我们系统研发过程中经常需要发送短信、邮件、站内信等,笔者在本文给大家介绍下如何使用Oinone的消息模块。 准备工作 如果通过我们工程脚手架工具生成的则已经引入了无需做更多的配置,如果不是则需要按以下步骤先配置依赖和增加启动模块 pamirs-demo-boot的pom文件中引入pamirs-message-core包依赖 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-message-core</artifactId> </dependency> pamirs-demo-boot的application-dev.yml文件中增加配置pamirs.boot.modules增加message,即在启动应用中增加message模块 pamirs: boot: modules: – message 消息参数设置 发送邮件和短信需要设置对应的发送邮箱服务器和短信云,短信目前默认阿里云短信。我们通过代码示例来完成对应邮箱和短信的参数设置 Step1 增加pamirs-message-api依赖 pamirs-demo-core的pom文件中引入pamirs-message-api包依赖 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-message-api</artifactId> </dependency> Step2 消息参数设置 请自行替换邮箱服务器和短信通道的账号信息 package pro.shushi.pamirs.demo.core.init; import org.springframework.stereotype.Component; import pro.shushi.pamirs.boot.common.api.command.AppLifecycleCommand; import pro.shushi.pamirs.boot.common.api.init.InstallDataInit; import pro.shushi.pamirs.boot.common.api.init.UpgradeDataInit; import pro.shushi.pamirs.demo.api.DemoModule; import pro.shushi.pamirs.message.enmu.EmailSendSecurityEnum; import pro.shushi.pamirs.message.enmu.MessageEngineTypeEnum; import pro.shushi.pamirs.message.enmu.SMSChannelEnum; import pro.shushi.pamirs.message.model.EmailSenderSource; import pro.shushi.pamirs.message.model.SmsChannelConfig; import java.util.Collections; import java.util.List; @Component public class DemoMessageInit implements InstallDataInit, UpgradeDataInit { private void initEmail(){ EmailSenderSource emailSenderSource = new EmailSenderSource(); emailSenderSource.setName("邮件发送服务"); emailSenderSource.setType(MessageEngineTypeEnum.EMAIL_SEND); //优先级 emailSenderSource.setSequence(10); //发送账号 FIXME 自行替换 emailSenderSource.setSmtpUser(""); //发送密码 FIXME 自行替换 emailSenderSource.setSmtpPassword(""); //发送服务器地址和端口 emailSenderSource.setSmtpHost("smtp.exmail.qq.com"); emailSenderSource.setSmtpPort(465); //" None: SMTP 对话用明文完成。" + //" TLS (STARTTLS): SMTP对话的开始时要求TLS 加密 (建议)" + //" SSL/TLS: SMTP对话通过专用端口用 SSL/TLS 加密 (默认是: 465)") emailSenderSource.setSmtpSecurity(EmailSendSecurityEnum.SSL); emailSenderSource.createOrUpdate(); } private void initSms(){ SmsChannelConfig smsChannelConfig = new SmsChannelConfig(); smsChannelConfig.setType(MessageEngineTypeEnum.SMS_SEND); smsChannelConfig.setChannel(SMSChannelEnum.ALIYUN); //短信签名名称 smsChannelConfig.setSignName("oinone"); //阿里云账号信息 FIXME 自行替换 smsChannelConfig.setAccessKeyId(""); smsChannelConfig.setAccessKeySecret(""); smsChannelConfig.setEndpoint("https://dysmsapi.aliyuncs.com"); smsChannelConfig.setRegionId("cn-hangzhou"); smsChannelConfig.setTimeZone("GMT"); smsChannelConfig.setSignatureMethod("HMAC-SHA1"); smsChannelConfig.setSignatureVersion("1.0"); smsChannelConfig.setVersion("2017-05-25"); smsChannelConfig.createOrUpdate(); //初始化短信模版 //目前支持阿里云短信通道:获取短信模板,如没有短信模板,需要先创建模板,并审核通过 SmsTemplate smsTemplate = new SmsTemplate(); smsTemplate.setName("通知短信"); smsTemplate.setTemplateType(SMSTemplateTypeEnum.NOTIFY); smsTemplate.setTemplateCode("SMS_244595482");//从阿里云获取,自行提供 FIXME smsTemplate.setTemplateContent("尊敬的&{name},你的&{itemName}库存为&{quantity}"); smsTemplate.setChannel(SMSChannelEnum.ALIYUN); smsTemplate.setStatus(SMSTemplateStatusEnum.SUCCESS); smsTemplate.createOrUpdate(); } @Override public boolean init(AppLifecycleCommand command, String version) { initEmail(); initSms(); return Boolean.TRUE; } @Override public boolean upgrade(AppLifecycleCommand command, String version, String existVersion) { initEmail(); initSms(); return Boolean.TRUE; } @Override public List<String> modules() { return Collections.singletonList(DemoModule.MODULE_MODULE);…

    2024年5月23日
    2.1K00
  • 4.1.21 框架之分布式消息

    消息中间件是在分布式开发中常见的一种技术手段,用于模块间的解耦、异步处理、数据最终一致等场景。 一、介绍 oinone对开源的RocketMQ进行了封装,是平台提供的一种较为简单的使用方式,并非是对RocketMQ进行的功能扩展。同时也伴随着两个非常至关重要的目的: 适配不同企业对RocketMQ的不同版本选择,不至于改上层业务代码。目前已经适配RocketMQ的开源版本和阿里云版本。 下个版本会对API进行升级支持不同类型MQ,以适配不同企业对MQ的不同要求,应对一些企业客户已经对MQ进行技术选择 对协议头进行扩展:如多租户的封装,saas模式中为了共用MQ基础资源,需要在消息头中加入必要租户信息。 二、使用准备 demo工程默认已经依赖消息,这里只是做介绍无需大家额外操作,大家可以用maven依赖树命令查看引用关系。 依赖包 增加对pamirs-connectors-event的依赖 <dependency> <groupId>pro.shushi.pamirs.framework</groupId> <artifactId>pamirs-connectors-event</artifactId> </dependency> 图4-1-21-1 分布式消息的依赖包 相关功能引入 增加模型、触发器都依赖MQ <!– 增强模型 –> <!– 增强模型 –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-channel</artifactId> </dependency> <!– 触发器 api –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-trigger-api</artifactId> </dependency> <!– 触发器 core –> <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-trigger-core</artifactId> </dependency> 图4-1-21-2 增加模型、触发器都依赖MQ yml配置文件参考 详见4.1.1【模块之yml文件结构详解】的“pamirs.event”部分。 三、使用说明 发送消息(NotifyProducer) 概述 NotifyProducer是Pamirs Event中所有生产者的基本API,它仅仅定义了消息发送的基本行为,例如生产者自身的属性,启动和停止,当前状态,以及消息发送方法。它本身并不决定消息如何发送,而是根据具体的实现确定其功能。 目前仅实现了RocketMQProducer,你可以使用下面介绍的方法轻松使用这些功能。 使用方法 Notify注解方式 使用示例 @Component public class DemoProducer { @Notify(topic = "test", tags = "model") public DemoModel sendModel() { return new DemoModel(); } @Notify(topic = "test", tags = "dto") public DemoDTO sendDTO() { return new DemoDTO(); } } 图4-1-21-3 Notify注解方式使用示例 解释说明 使用Component注解方式注册Spring Bean。 Notify注解指定topic和tags。 topic和tags对应NotifyEvent中的topic和tags。 RocketMQProducer方法调用 使用示例 @Component public class SendRocketMQMessage { @Autowired private RocketMQProducer rocketMQProducer; /** * 发送普通消息 */ public void sendNormalMessage() { rocketMQProducer.send(new NotifyEvent("test", "model", new DemoModel())); rocketMQProducer.send(new NotifyEvent("test", "dto", new DemoDTO())); } /** * 发送有序消息 */ public void sendOrderlyMessage() { DemoModel data = new DemoModel(); data.setAge(10); rocketMQProducer.send(new NotifyEvent("test", "model", data) .setQueueSelector((queueSize, event) -> { DemoModel body = (DemoModel) event.getBody(); return body.getAge() % queueSize; })); } /** * 发送事务消息 */ public void sendTransactionMessage() { rocketMQProducer.send(new NotifyEvent("test", "model", new DemoModel()) .setIsTransaction(true) .setGroup("demoTransactionListener")); } } 图4-1-21-4 RocketMQProducer方法调用…

    2024年5月23日
    1.3K00

Leave a Reply

Please Login to Comment