2023最新版本Activiti7系列-Activiti7概述和入门案例

news2024/11/8 21:24:27

一、Activiti7概述

在这里插入图片描述

官网地址:https://www.activiti.org/

  Activiti由Alfresco软件开发,目前最高版本Activiti 7。是BPMN的一个基于java的软件实现,不过Activiti 不仅仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有自己的用户管理、微服务API等一系列功能,是一个服务平台。

在这里插入图片描述

二、Activiti7的入门案例

官方手册:http://jeecg.com/activiti5.21/

1.创建SpringBoot项目

  现在开发中或者我们自己学习写案例都是通过SpringBoot脚手架工具来快速构建项目的。那么我们也就直接通过创建SpringBoot项目来给大家讲解相关的案例。创建一个普通的SpringBoot项目。指定版本为2.4.2即可
在这里插入图片描述

  然后添加对应的依赖:Activiti7的依赖和MySQL的依赖

<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.4.2</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.0.0.GA</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.boge.act.PrepareDemo2Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

相关的Activiti依赖加载进来了

在这里插入图片描述

到这儿基本环境就OK了

2.获取ProcessEngine

2.1 默认的方式

  在工作流引擎框架中,ProcessEngine是一个非常核心的对象,我们需要首先解决这个对象的获取。获取方式很多。先来看最简单的一个基于activiti.cfg.xml的XML文件的配置方式。

@Test
public void test1(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    System.out.println(processEngine);
}

  通过getDefaultProcessEngine方法加载会默认的从classpath路径下加载activiti.cfg.xml配置文件。我们添加该文件。内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti7" />
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="123456" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="asyncExecutorActivate" value="false" />
        <property name="mailServerHost" value="mail.my-corp.com" />
        <property name="mailServerPort" value="5025" />
    </bean>

</beans>

然后我们就可以启动,但是出现了如下错误:
在这里插入图片描述

  出现这种情况只需要在mysql的连接字符串中添加上nullCatalogMeansCurrent=true,设置为只查当前连接的schema库即可。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti7?nullCatalogMeansCurrent=true" />
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="123456" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="asyncExecutorActivate" value="false" />
        <property name="mailServerHost" value="mail.my-corp.com" />
        <property name="mailServerPort" value="5025" />
    </bean>

</beans>

然后执行程序正确。搞定。同时在数据库中创建了相关的表结构

在这里插入图片描述

2.2 编程方式获取

  上面的配置文件的方式中的配置文件其实是一个Spring的配置文件,但是这并不意味着Activiti只能用于Spring环境。我们也可以通过编程的方式来使用配置文件,从而来构建ProcessEngineConfiguration对象,具体的实现如下:

@Test
public void test2(){
    ProcessEngine engine = ProcessEngineConfiguration
        	.createStandaloneInMemProcessEngineConfiguration()
            .setJdbcUrl("jdbc:mysql://localhost:3306/activiti7?nullCatalogMeansCurrent=true")
            .setJdbcDriver("com.mysql.cj.jdbc.Driver")
            .setJdbcPassword("123456")
            .setJdbcUsername("root")
            .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
            .buildProcessEngine();
    System.out.println(engine);
}

上面讲解中的相关属性说明:

databaseSchemaUpdate:用于设置流程引擎启动关闭时使用的数据库表结构控制策略

  • false (默认): 当引擎启动时,检查数据库表结构的版本是否匹配库文件版本。版本不匹配时抛出异常。
  • true: 构建引擎时,检查并在需要时更新表结构。表结构不存在则会创建。
  • create-drop: 引擎创建时创建表结构,并在引擎关闭时删除表结构。

2.3 表结构介绍

  在Activiti7中。我们启动服务会自动维护Activiti7需要使用到的相关的表结构。在这块我们需要有个大概的了解。首先是支持的数据库有:

Activiti数据库类型示例JDBC URL备注
h2jdbc:h2:tcp://localhost/activiti默认配置的数据库
mysqljdbc:mysql://localhost:3306/activiti?autoReconnect=true已使用mysql-connector-java数据库驱动测试
oraclejdbc:oracle:thin:@localhost:1521:xe
postgresjdbc:postgresql://localhost:5432/activiti
db2jdbc:db2://localhost:50000/activiti
mssqljdbc:sqlserver://localhost:1433;databaseName=activiti (jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver) OR jdbc:jtds:sqlserver://localhost:1433/activiti (jdbc.driver=net.sourceforge.jtds.jdbc.Driver)已使用Microsoft JDBC Driver 4.0 (sqljdb

  Activiti的所有数据库表都以**ACT_**开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。

ACT_RE_*: RE代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

ACT_RU_*: RU代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Activiti只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

ACT_ID_*: ID代表identity。这些表包含身份信息,例如用户、组等。

ACT_HI_*: HI代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

ACT_GE_*: 通用数据。用于不同场景下

注意:MySQL数据库最好使用5.7及以上的版本

3.在线流程设计器

  接下来我们通过官方提供的流程设计器来实现一个简单流程的设计。然后完成相关的部署和流程整体操作。

官网下载地址:https://www.activiti.org/get-started 下载下来后解压缩

在这里插入图片描述

进入到wars中。提供的有Activiti-app.war

在这里插入图片描述

把这war包拷贝到Tomcat服务器中即可。注意Tomcat的版本不要高于8.5,然后Tomcat服务。访问 http://localhost:8080/activiti-app 即可。登录的账号密码是 admin test

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

点击create process 弹出窗口。录入相关的流程定义信息
在这里插入图片描述

绘制好流程图后。保存并下载对应的xml文件

在这里插入图片描述

得到的流程图的xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="test1" name="test1" isExecutable="true">
    <documentation>test1</documentation>
    <startEvent id="startEvent1"></startEvent>
    <userTask id="sid-470631FF-51BA-4954-96BB-346B99CA0A2C" name="人事审批" activiti:assignee="zhangsan">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-B53369E8-E698-4F53-AE40-97E7654BFA78" sourceRef="startEvent1" targetRef="sid-470631FF-51BA-4954-96BB-346B99CA0A2C"></sequenceFlow>
    <userTask id="sid-34454522-B109-41C9-8519-59D29B621099" name="经理审批" activiti:assignee="lisi">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-5AE88ADE-9FD3-48F2-81EF-528DA0C068CB" sourceRef="sid-470631FF-51BA-4954-96BB-346B99CA0A2C" targetRef="sid-34454522-B109-41C9-8519-59D29B621099"></sequenceFlow>
    <endEvent id="sid-EA0332FA-59B0-45C0-9D24-47C78051D52C"></endEvent>
    <sequenceFlow id="sid-F6C0657A-C92F-4DEA-AAB1-93750FFBD7E5" sourceRef="sid-34454522-B109-41C9-8519-59D29B621099" targetRef="sid-EA0332FA-59B0-45C0-9D24-47C78051D52C"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_test1">
    <bpmndi:BPMNPlane bpmnElement="test1" id="BPMNPlane_test1">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-470631FF-51BA-4954-96BB-346B99CA0A2C" id="BPMNShape_sid-470631FF-51BA-4954-96BB-346B99CA0A2C">
        <omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-34454522-B109-41C9-8519-59D29B621099" id="BPMNShape_sid-34454522-B109-41C9-8519-59D29B621099">
        <omgdc:Bounds height="80.0" width="100.0" x="320.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-EA0332FA-59B0-45C0-9D24-47C78051D52C" id="BPMNShape_sid-EA0332FA-59B0-45C0-9D24-47C78051D52C">
        <omgdc:Bounds height="28.0" width="28.0" x="465.0" y="164.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-5AE88ADE-9FD3-48F2-81EF-528DA0C068CB" id="BPMNEdge_sid-5AE88ADE-9FD3-48F2-81EF-528DA0C068CB">
        <omgdi:waypoint x="275.0" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="320.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-F6C0657A-C92F-4DEA-AAB1-93750FFBD7E5" id="BPMNEdge_sid-F6C0657A-C92F-4DEA-AAB1-93750FFBD7E5">
        <omgdi:waypoint x="420.0" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="465.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-B53369E8-E698-4F53-AE40-97E7654BFA78" id="BPMNEdge_sid-B53369E8-E698-4F53-AE40-97E7654BFA78">
        <omgdi:waypoint x="130.0" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="175.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

然后我们就可以做流程的部署操作了

4.流程操作

4.1 流程部署

  设计好了流程图我们就可以通过如下的代码完成流程的部署。

   /**
     * 流程部署操作
     */
    @Test
    public void test3(){
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2.完成流程的部署操作 需要通过RepositoryService来完成
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("flow/test1.bpmn20.xml")
                .name("第一个流程")
                .deploy();
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

流程部署的行为会涉及到数据库中的这两张表

在这里插入图片描述

然后我们可以通过Activiti提供的相关的API来获取流程部署和流程定义的相关信息

/**
 * 查询当前部署的流程有哪些
 */
@Test
public void test4(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = engine.getRepositoryService();
    // 查询有哪些部署的流程--》查询相关的流程定义信息
    // repositoryService.createDeploymentQuery() 查询流程部署的相关信息
    // repositoryService.createProcessDefinitionQuery() 查询部署的流程的相关的定义
    List<Deployment> list = repositoryService.createDeploymentQuery().list(); // 查询所有的部署信息
    for (Deployment deployment : list) {
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

    List<ProcessDefinition> list1 = repositoryService.createProcessDefinitionQuery().list();
    for (ProcessDefinition processDefinition : list1) {
        System.out.println(processDefinition.getId());
        System.out.println(processDefinition.getName());
        System.out.println(processDefinition.getDescription());
    }

}

4.2 发起流程

  部署流程成功后。我们就可以发起一个流程。发起流程需要通过RuntimeService来实现。

/**
 * 发起一个流程
 */
@Test
public void test5(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("test1:1:3");
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

发起流程成功后。在对应的act_ru_task中就有一条对应的待办记录。

在这里插入图片描述

对应的流程状态如下:

在这里插入图片描述

4.3 查询流程

  用户登录后要查看待办的任务信息。我们需要通过TaskService来实现查询操作。具体代码如下:

/**
     * 待办查询
     */
    @Test
    public void test6(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 待办查询 执行中的任务处理通过 TaskService来实现
        TaskService taskService = engine.getTaskService();
        // Task 对象对应的其实就是 act_ru_task 这张表的记录
        List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").list();
        if(list != null && list.size() > 0){
            for (Task task : list) {
                System.out.println(task.getId());
                System.out.println(task.getName());
                System.out.println(task.getAssignee());
            }
        }else{
            System.out.println("当前没有待办任务");
        }
    }

4.4 审批流程

  当前登录用户查看到相关的待办信息后。可以做流程的审批处理。

/**
 * 任务审批
 */
@Test
public void test7(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 做任务申请 也需要通过 TaskService 来实现
    TaskService taskService = engine.getTaskService();
    // 根据当前登录用户查询出对应的待办信息
    List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").list();
    if(list != null && list.size() > 0){
        for (Task task : list) {
            // 做对应的任务审批处理
            taskService.complete(task.getId());
        }
    }
    // 完成任务
    // taskService.complete("2505");
}

5.涉及表结构

  上面一个审批涉及到的表结构的介绍

表名说明
act_re_deployment部署流程的记录表:一次部署行为会产生一张表
act_re_procdef流程定义表:一张流程图对应的表
act_hi_procinst流程实例表:发起一个流程。就会创建对应的一张表
act_ru_task流程待办表:当前需要审批的记录表,节点审批后就会被删除
act_hi_actinst历史记录:流程审批节点的记录信息

在这里插入图片描述

6.流程设计器持久化

  流程设计器默认是通过H2来完成数据的存储的。而H2是基于内存来存储的。所以重启服务后数据就丢失了。这时我们可以设置流程设计器的存储方式为MySQL。这样就能持久化的实现存储了。具体步骤如下:

在这里插入图片描述

调整数据库的连接信息。记得同时需要创建对应的数据库
在这里插入图片描述

切换了数据的存储方案后。我们需要记得把对应的数据库的驱动拷贝进来

在这里插入图片描述

在这里插入图片描述

然后我们就可以重启服务测试了。如果出现下面的错误,降低MySQL驱动的版本到8.0.19

在这里插入图片描述

配置的时区不配支持。我们需要添加

在这里插入图片描述

启动成功后。在数据库中会维护相关的表结构

在这里插入图片描述

该操作中需要注意的点:

  1. 修改配置文件中的信息关键是连接地址的路径:jdbc:mysql://localhost:3306/activiti6ui?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true

  2. MySQL的驱动版本不要高于8.0.19,不然会出现LocalDataTime转换的问题

7.流程设计器汉化说明

  流程设计器的汉化操作

{
   "GENERAL": {
        "MAIN-TITLE": "Activiti",
        "ERROR": {
            "GENERIC": "抱歉,发生了一个错误。",
            "UNKNOWN": "抱歉,执行请求的操作时出错。",
            "BAD_REQUEST": "执行请求的操作时出错。",
            "NOT_FOUND": "您试图访问的资源不存在。",
            "UNAUTHORIZED": "您应该登录才能执行请求的操作。",
            "FORBIDDEN": "不允许您执行请求的操作。",
            "INTERNAL_SERVER_ERROR": "抱歉,执行请求的操作时发生意外错误。",
            "QUOTA-EXCEEDED-RUNTIME-APPS": "作为试用用户,您只能同时部署 {{quota}} 应用程序。",
            "QUOTA-EXCEEDED-LICENSE-APPS": "许可证只允许同时部署 {{quota}} 应用程序。"
        },
        "ACTION": {
            "LOGOUT": "退出",
            "HELP": "入门",
            "EDIT-PROFILE": "编辑配置文件",
            "SAVE": "保存",
            "CANCEL": "取消",
            "CLOSE": "关闭",
            "DEPLOY": "部署",
            "ABOUT": "关于Alfresco Activiti"
        }
    },
    "LOGIN": {
        "TITLE": "登录",
        "USERNAME": "用户名",
        "USERNAME-PLACEHOLDER": "输入您的用户名",
        "PASSWORD": "密码",
        "PASSWORD-PLACEHOLDER": "输入您的密码",
        "INVALID-CREDENTIALS": "域相关参数设置有误",
        "ACTION": {
            "CONFIRM": "登录"
        }
    },
    "ACCOUNT": {
        "ACTIVATE": {
          "TITLE": "激活帐户",
          "ACTIVATING-MESSAGE": "请稍候 {{userFullName}} 我们正在激活您的帐户。",
          "SUCCESS-MESSAGE": "您的帐户已激活。请在下面登录以开始设计和运行流程。",
          "FAILURE-MESSAGE": "无法激活您的帐户。它已被激活或激活链接已过期。"
        },
 
        "RESET-PASSWORD-REQUEST": {
          "MESSAGE": "忘记密码了?在下面输入您的电子邮件地址以接收电子邮件以重置密码。",
          "TITLE": "重置密码",
          "EMAIL": "电子邮件地址",
          "EMAIL-PLACEHOLDER": "输入您的电子邮件",
          "SECURITY-SECTION": "安全检查",
          "CONFIRM": "请求密码重置",
          "SUCCESS-MESSAGE": "您将很快收到一封邮件,其中包含重置密码的链接",
          "ERROR": {
              "UNEXISTING-USER": "具有给定电子邮件地址的用户不存在。"
          }
        },
 
        "RESET-PASSWORD": {
          "TITLE": "重置密码",
          "PASSWORD": "密码",
          "PASSWORD-CONFIRM": "确认密码",
          "PASSWORD-PLACEHOLDER": "输入新密码",
          "PASSWORD-CONFIRM-PLACEHOLDER": "确认新密码",
          "CONFIRM": "更改密码",
          "LOADING": "正在重置密码...",
          "SUCCESS-MESSAGE": "您的密码已更改。",
          "LOGIN": "马上登录",
          "FAILURE-MESSAGE": "您的密码无法重置。重置链接无效或已过期。"
        }
    },
    "APP": {
        "KICKSTART": {
            "TITLE": "启动程序",
            "DESCRIPTION": "创建流程模型、表单和应用程序定义,然后与其他人共享您的模型和定义。"
        },
        "TASKS": {
            "TITLE": "任务应用程序",
            "DESCRIPTION": "访问您的完整任务列表,并从任何流程应用程序处理分配给您的任何任务。同时,启动新的流程和任务。"
        },
        "IDENTITY-MANAGEMENT": {
            "TITLE": "身份管理",
            "TITLE-TENANT-ADMIN": "身份管理",
            "DESCRIPTION": "管理您的配置文件:更改图片、名称和其他设置。作为管理员用户,管理用户和组。",
            "DESCRIPTION-TENANT-ADMIN": "管理组织中的用户和组。"
        },
        "CUSTOM-APP" : {
            "TITLE-TASKS": "任务",
            "TITLE-PROCESSES": "流程"
        },
        "POPUP" : {
            "ADD-APP-TITLE": "将App添加到登录页",
            "ADD-APP-SUMMARY": "将App添加到登录页"
        },
        "ACTION": {
            "DELETE": "删除App"
        },
        "MESSAGE": {
            "DELETED": "已成功删除App"
        }
    }
}

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

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

相关文章

【前端 - HTML】第 1 课 - HTML 初体验

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 。 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、HTML 概念 2.1、HTML 定义 2.2、标签语法 3、HTML 基本骨架 4、标签的关系 5、注释 6、总结 1、缘起 最近在学习微信小程…

Apache Doris 冷热分层技术如何实现存储成本降低 70%?

在数据分析的实际场景中&#xff0c;冷热数据往往面临着不同的查询频次及响应速度要求。例如在电商订单场景中&#xff0c;用户经常访问近 6 个月的订单&#xff0c;时间较久远的订单访问次数非常少&#xff1b;在行为分析场景中&#xff0c;需支持近期流量数据的高频查询且时效…

C++ 使用一维数组和二维数组给 std::vector<cv::Point2d> 赋值的方法

文章目录 1. 一维数组给 vector 赋值的方法2. 一维 Point2d 数组给 vector<cv::Point2d> 赋值3. 二维 double 数组给 vector<cv::Point2d> 赋值 1. 一维数组给 vector 赋值的方法 &#xff08;1&#xff09;最简单的赋值方法是for循环遍历赋值&#xff0c;此处略过…

Python展开嵌套列表的五种方法

一、问题的提出 微信群中有人问&#xff0c;如何把以下内容转换成一个列表&#xff1a; 转换后&#xff1a; "[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C",&qu…

d2l学习_第二章预备知识

x.1 Data Manipulation 数据操作。在Pytorch中常用的数据操作如下&#xff1a; 对于张量&#xff0c;即torch.Tensor类型的数据&#xff0c;你的任何操作都要把他想象成一个指针&#xff0c;因为等于运算符ab&#xff0c;会将b的张量内存地址赋值给a。 torch.Tensor类型的基…

day02-JavaScript-Vue

1 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.5.1.3 JSON对象 自定义对象 在 JavaScript 中自…

linux(信号发送后)

目录&#xff1a; 1.引入什么是合适的时候 2.内核态和用户态 3.信号的处理 4.sigaction函数 -------------------------------------------------------------------------------------------------------------------------------- 1.引入什么是合适的时候 2.信号什么时候被处…

你真的会PPT配色吗?来看看这篇吧,瞬间让你的PPT高大上起来

本文档使用技巧如下截图 在色彩里使用其它填充颜色 选取这个“吸管” 用于吸别人的颜色 我曾经为了出一个“惊艳”的PPT,光吸管用了不下150次。 好的艺术家复制,伟大的艺术家偷窃!--毕加索 下面就给出几大常用配色 各位在使用时注意看这些“色卡”的规律,那就是反差色…

安卓系统浏览器开发

预置某个浏览器为系统默认的浏览器 描述: 当系统存在多个浏览器时&#xff0c;如何预置某个浏览器为系统默认的浏览器&#xff1f; 方法: 1.在PackageManagerService.java中的构造函数结尾添加&#xff1a;setDefaultBrowser(); 2.setDefaultBrowser()的具体实现&#xff…

TDengine 合作伙伴 +1,这次是「DaoCloud道客」

随着我国数字经济持续快速发展&#xff0c;各行各业都在积极拥抱云技术&#xff0c;上云成为企业加快数字化转型步伐的关键一步。在此过程中&#xff0c;越来越多的企业开始意识到云原生技术的重要性&#xff0c;利用云原生更快地开发和部署应用程序&#xff0c;提高应用程序的…

智慧信访大数据挖掘平台解决方案

TipDM数据挖掘建模平台由泰迪自主研发&#xff0c;面向大数据挖掘项目的工具。平台使用JAVA语言开发&#xff0c;采用B/S结构&#xff0c;用户不需要下载客户端&#xff0c;可通过浏览器进行访问。平台提供了基于Python、R以及Hadoop/Spark分布式引擎的大数据分析功能。平台支持…

人民大学加拿大女王大学金融硕士——为什么这么多人选金融行业呢

又是一年毕业季&#xff0c;越来越多的新人涌入职场&#xff0c;金融行业依然是择业人们的香饽饽。为什么大家会选金融行业呢&#xff1f;金融行业是一个充满挑战但也充满魅力的行业。在这个快节奏的行业中&#xff0c;人们不断地面对着机遇和挑战&#xff0c;而这个行业也为那…

TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL

编辑&#xff1a;ll TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL 型号&#xff1a;TLD5097EL 品牌&#xff1a;Infineon(英飞凌) 封装&#xff1a;SSOP-14-EP-150mil 类型&#xff1a;LED驱动、汽车芯片 TLD5097EL特性 输入电压范围宽&#xff0c;从4.5 V到45 V 极低关断…

【FATE联邦学习】FATE 自定义Trainer

背景 自己定义了模型后&#xff0c;需要自行定义训练方式。 这里文档给了方法&#xff0c;但是大部分还是需要自己看源码摸索。 https://fate.readthedocs.io/en/latest/tutorial/pipeline/nn_tutorial/Homo-NN-Customize-Trainer/https://fate.readthedocs.io/en/latest/tu…

如何按需下载和安装Win10补丁

如何按需下载和安装Win10补丁 一般我们都是通过系统自带的Windows更新来直接安装补丁&#xff0c;这种方式虽然方便&#xff0c;但是耗时久&#xff0c;而且更新体量也大&#xff0c;会占用很多空间&#xff0c;其实我们完全可以按需下载和安装&#xff0c;下面就给大家介绍方法…

FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命

1980年代现场可程式化逻辑门阵列(FPGA)的出现彻底改变了电子设计。大约40年后&#xff0c;现场可程式化量子位元阵列(FPQA)可望在量子运算电路设计中引发一场类似的革命。 1980年代现场可程式化逻辑闸阵列(FPGA)的出现彻底改变了电子设计。FPGA允许设计人员创建适合特定应用的…

3DCAT亮相糖酒会,为元宇宙展会提供实时云渲染支持

4月12日&#xff0c;第108届全国糖酒商品交易会&#xff08;下文简称“糖酒会”&#xff09;在成都正式开幕&#xff0c;吸引了众多酒类企业和行业人士的参与。 图片源自新华社 本次糖酒会上&#xff0c;某展会采用了“双线”模式&#xff0c;除了线下的实体展位&#xff0c;还…

burpsuite工具的使用(详细讲解)

一&#xff09;前言 我已经在之前详细的说明了burpsuite的安装过程&#xff0c;如果不了解的可以看 burpsuite安装教程 &#xff1a;http://t.csdn.cn/uVx9X 在这了补充说明一下&#xff0c;在安装完burpsuite并设置完代理后&#xff0c;会出现如果访问的url是使用http协议的…

变频器需要定期更换的器件有哪些

导语&#xff1a;​变频器是由许多电子零件构成&#xff0c;例如半导体元件等&#xff0c;在使用和维护当中就涉及到更换部件的问题&#xff0c;由于变频器组成或物理特性的原因&#xff0c;在一定的时期内会产生劣化&#xff0c;因而会降低变频器的特性&#xff0c;甚至会引起…

python---实现一个简化版本的人生模拟器

1.游戏开始的时候,设定初始属性—颜值 体质 智力 家境 2.开始游戏,随机生成性别和出生点 3.针对每一年,都生成人生经历(依靠一定的随机因素当前角色属性) 需要import random一下 一些函数 代码的部分运行情况,由于代码过长此处不予展示!这个部分只写了幼年时期发生的事件!