SpringBoot笔记:SpringBoot 集成 Dataway

news2024/11/23 13:49:26

文章目录

  • 1、什么是 Dataway?
  • 2、主打场景
  • 3、技术架构
  • 4、整合SpringBoot
    • 4.1、maven 依赖
    • 4.2、初始化脚本
    • 4.3、整合 SpringBoot
  • 5、Dataway 接口管理
  • 6、Mybatis 语法支持
  • 7、小结

1、什么是 Dataway?

官网地址:https://www.hasor.net/docs/guides/quickstart
    Dataway 是依托 DataQL 服务聚合能力,为应用提供一个 UI 界面。并以 jar 包的方式集成到应用中。 通过 Dataway 可以直接在界面上配置和发布接口。
    这种模式的革新使得开发一个接口不必在编写任何形式的代码,只需要配置一条 DataQL 查询即可完成满足前端对接口的需求。 从而避免了从数据库到前端之间一系列的开发配置任务,例如:Mapper、DO、DAO、Service、Controller 统统不在需要。
    Dataway 特意采用了 jar 包集成的方式发布,这使得任意的老项目都可以无侵入的集成 Dataway。 直接改进老项目的迭代效率,大大减少企业项目研发成本。

效果图
Dataway 工具化的提供 DataQL 配置能力。这种研发模式的变革使得,相当多的需求开发场景只需要配置即可完成交付。从而避免了从数据存取到前端接口之间的一系列开发任务,例如:Mapper、BO、VO、DO、DAO、Service、Controller 统统不在需要。

如上图所示 Dataway 在开发模式上提供了巨大的便捷。虽然工作流程中标识了由后端开发来配置 DataQL 接口,但这主要是出于考虑接口责任人。但在实际工作中根据实际情况需要,配置接口的人员可以是产品研发生命周期中任意一名角色。

2、主打场景

主打场景并不是说 Dataway 适用范围仅限于此,而是经过多次项目实践。我们认为下面这些场景会有非常好的预期效果。

比如说 取数据 在一些报表、看板项目中即便是取数据逻辑在复杂。我们依然做到了真正的 零 开发,所有取数逻辑全部通过 DataQL + SQL 的方式满足。

对比往期项目对于后端技术人员的需求从 3~5 人的苦逼通宵加班,直接缩减为 1 人配置化搞定。

再比如,某个内部类 ERP 项目,20 多个表单页面,后端部分仅有 1000 行左右的核心代码。其它数据存取逻辑全部配置化完成。

  • 取数据

如果你只想从数据库或者服务中获取某类数据,不需要:VO、BO、Convert、DO、Mapper 这类东西。

  • 存数据

如果是从页面表单递交数据到数据库或者服务,免去 BO、FormBean、DO、Mapper 这类东西。

  • 数据聚合

基于服务调用结果经过结构转换并响应给前端。将数据库和服务等多个结果进行汇聚然后返回给前端。

3、技术架构

技术架构

4、整合SpringBoot

4.1、maven 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-learning-parents</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>springboot-demo</groupId>
    <artifactId>springboot-dataway</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>springboot-dataway</name>
    <description>springboot 集成 dataway</description>
    <packaging>jar</packaging>

    <url>https://gitee.com/leo825/springboot-learning-parents.git</url>

    <properties>
        <start-class>com.demo.SpringbootDataWayApplication</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <mybatis.version>1.3.2</mybatis.version>
        <mysql.version>8.0.28</mysql.version>
        <dataway.version>4.2.5</dataway.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 集成 mybatis -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>${mybatis.version}</version>-->
<!--        </dependency>-->

        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--     dataway 相关   -->
        <dependency>
            <groupId>net.hasor</groupId>
            <artifactId>hasor-spring</artifactId>
            <version>${dataway.version}</version>
        </dependency>
        <dependency>
            <groupId>net.hasor</groupId>
            <artifactId>hasor-dataway</artifactId>
            <version>${dataway.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.2、初始化脚本

打开数据库,创建两个新的表,用于维护 Dataway 的API,建表建议参考官方网站的,因为不同版本的 Hasor 依赖的表的字段可能是不同的。
建表语句如下(如果出现表问题,可以参照官方网站修改)

-- Dataway 中的API
CREATE TABLE interface_info (
    api_id          varchar(64)  NOT NULL COMMENT 'ID',
    api_method      varchar(12)  NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
    api_path        varchar(512) NOT NULL COMMENT '拦截路径',
    api_status      varchar(4)   NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',
    api_comment     varchar(255) NOT NULL COMMENT '注释',
    api_type        varchar(24)  NOT NULL COMMENT '脚本类型:SQL、DataQL',
    api_script      mediumtext   NOT NULL COMMENT '查询脚本:xxxxxxx',
    api_schema      mediumtext   NOT NULL COMMENT '接口的请求/响应数据结构',
    api_sample      mediumtext   NOT NULL COMMENT '请求/响应/请求头样本数据',
    api_option      mediumtext   NOT NULL COMMENT '扩展配置信息',
    api_create_time varchar(32)  NOT NULL COMMENT '创建时间',
    api_gmt_time    varchar(32)  NOT NULL COMMENT '修改时间',
    PRIMARY KEY (api_id),
    UNIQUE KEY uk_interface_info (api_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway 中的API';

-- Dataway API 发布历史
CREATE TABLE interface_release (
  pub_id           varchar(64)  NOT NULL COMMENT 'Publish ID',
  pub_api_id       varchar(64)  NOT NULL COMMENT '所属API ID',
  pub_method       varchar(12)  NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
  pub_path         varchar(512) NOT NULL COMMENT '拦截路径',
  pub_status       varchar(4)   NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',
  pub_comment      varchar(255) NOT NULL COMMENT '注释',
  pub_type         varchar(24)  NOT NULL COMMENT '脚本类型:SQL、DataQL',
  pub_script       mediumtext   NOT NULL COMMENT '查询脚本:xxxxxxx',
  pub_script_ori   mediumtext   NOT NULL COMMENT '原始查询脚本,仅当类型为SQL时不同',
  pub_schema       mediumtext   NOT NULL COMMENT '接口的请求/响应数据结构',
  pub_sample       mediumtext   NOT NULL COMMENT '请求/响应/请求头样本数据',
  pub_option       mediumtext   NOT NULL COMMENT '扩展配置信息',
  pub_release_time varchar(32)  NOT NULL COMMENT '发布时间(下线不更新)',
  PRIMARY KEY (pub_id),
  KEY idx_interface_release_api  (pub_api_id),
  KEY idx_interface_release_path (pub_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 发布历史。';

创建测试表,以供测试

-- 人员表,测试用
CREATE TABLE `person` (
  `p_id` int DEFAULT NULL,
  `p_name` varchar(100) DEFAULT NULL,
  `p_phone` varchar(11) DEFAULT NULL,
  `p_score` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='人员表';

-- 插入测试数据
INSERT INTO dataway.person (p_id,p_name,p_phone,p_score) VALUES
	 (1,'李阳','123456','7890'),
	 (2,'张骞','123456','7890'),
	 (3,'马康敬','123456','7890'),
	 (4,'尚世宇','123456','7890'),
	 (5,'赵题','123456','7890'),
	 (6,'王澳','123456','7890'),
	 (7,'张三','13611112222','100'),
	 (7,'张三','13611112222','100'),
	 (7,'张三','13611112222','100');

测试数据:

4.3、整合 SpringBoot

SpringBoot 整合 Hasor 中的 Dataway 主要是将数据也配置到 Hasor 中,同时在启动入口开启 Hasor 和 Hasor-web。整合起来也是十分的简单。

package com.demo.config;

import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;


/**
 * @Classname DatawayModule
 * @Description 将Hasor模块注入spring,并注入数据源
 * @Date 2023/7/28 11:43
 * @Created by Leo825
 */
@DimModule  // Hasor 中的标签,表明是一个Hasor的model
@Component  // Spring 中的标签,表明是一个组件
public class DatawayModule implements SpringModule {
    @Autowired
    private DataSource dataSource;

    @Override
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        // .DataSource form Spring boot into Hasor
        apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
    }
}

启动类配置如下:

package com.demo;

import net.hasor.spring.boot.EnableHasor;
import net.hasor.spring.boot.EnableHasorWeb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableHasor // 在Spring 中启用 Hasor
@EnableHasorWeb //将 hasor-web 配置到 Spring 环境中,Dataway 的 UI 是通过 hasor-web 提供服务
@SpringBootApplication(scanBasePackages = { "com.demo"})
public class SpringbootDataWayApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootDataWayApplication.class, args);
	}
}

application.yml 文件配置如下:

# springboot多环境配置
#端口,项目上下文
server:
  port: 8080
  servlet:
    context-path: /springboot-dataway
    # 全局服务编码设置
    encoding:
      charset: utf-8
      enabled: true
      force: true

# mysql 连接信息配置
spring:
  # mysql 数据库连接信息,本地使用 mysql 服务版本为:8.0.28
  datasource:
    username: root
    password: 6tojyh*A3eQ6
    url: jdbc:mysql://localhost:3306/dataway?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    # druid 数据连接池配置
    druid:
      initial-size: 3
      min-idle: 3
      max-active: 10
      max-wait: 6000
      # 配置druid监控页
      aop-patterns: com.demo.* #监控springBean
      stat-view-servlet: # 配置监控页功能
        enabled: true # 默认开启,这里显示说明
        login-username: admin # 登录名
        login-password: 6tojyh*A3eQ6 # 登录密码
        reset-enable: false # 禁用重置按钮
      web-stat-filter: # 监控 web
        enabled: true
        url-pattern: /* # 监控所有
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'  #放行
      filter:
        stat: # 对上面 filters 里的 stat 的详细配置
          slow-sql-millis: 1000 # 慢 sql 时间是毫秒单位的,执行时间 1 秒以上的为慢 SQL
          log-slow-sql: true # 日志记录
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false # 禁用删除表的 sql

# mdataway 配置
# 是否启用 Dataway 功能(必选:默认false)
HASOR_DATAQL_DATAWAY: true
# 开启 ui 管理功能(注意生产环境必须要设置为 false,否则会造成严重的生产安全事故)
HASOR_DATAQL_DATAWAY_ADMIN: true
# dataway  API工作路径(可选,默认:/api/)
HASOR_DATAQL_DATAWAY_API_URL: /api/
# dataway-ui 的工作路径(可选,默认:/interface-ui/)
HASOR_DATAQL_DATAWAY_UI_URL: /interface-ui/
# SQL执行器方言设置(可选,建议设置)
HASOR_DATAQL_FX_PAGE_DIALECT: mysql

# 日志输出配置
logging:
  level:
    root: INFO
    org:
      springframework:
        security: WARN
        web: ERROR
    # 设置自己的 com.demo.mapper 目录 输出sql日志
    com.demo.mapper: debug
  file:
    path: ./logs
    name: './logs/springboot-dataway.log'
  pattern:
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'

5、Dataway 接口管理

    首先介绍一些 Dataway的基本知识,Dataway 可以通过 UI 页面定义数据接口,然后通过自测和冒烟以后才能发布这个接口,当接口发布成功以后,就可以通过我们定义的接口路径来访问获取数据了,这些接口数据都是保存在我们上面创建的 interface_info 表中的,当然接口发布以后也可以修改,也即接口可以有历史版本,这些信息保存在 interface_release 表中,这也就是为什么我们什么要在上面定义这两个表;(Ps:当然 Dataway 也可以通过编写代码来实现)在Dataway的数据访问中使用的是一种名字叫做 DataQL 的脚本语言,类似 JavaScript 先来一段官网的说明定义:
    DataQL(Data Query Language)DataQL 是一种查询语言。旨在通过提供直观、灵活的语法来描述客户端应用程序的数据需求和交互。
    数据的存储根据其业务形式通常是较为简单的,并不适合直接在页面上进行展示。因此开发页面的前端工程师需要为此做大量的工作,这就是 DataQL 极力解决的问题。另外还支持使用SQL来,但是 SQL 在 Dataway 中最终也都是转换成 DataQL。
DataQL
Dataway页面说明:
1、功能按钮:可以查看所有已经发布的接口
2、功能按钮:可以创建新的接口
3、链接:打开 DataQL 接口说明
4、请求方式:Http 请求方式定义,默认是 POST 方法
5、接口路径:定义接口的请求路径,/interface/ 为配置文件中 HASOR_DATAQL_DATAWAY_API_URL 属性事先定义的值,后面补充路径,当接口路径发布后,后面定义的接口请求路径不能重名
6、接口说明:可以为接口添加中文说明
7、使用DataQL编写接口,默认选择为 DataQL
8、使用 SQl 编写接口
9、接口编写代码部分
10、功能按钮:保存9部分编写的代码,注意只有先保存才能进行冒烟测试
11、功能按钮:测试按钮,当编写接口代码时,使用此按钮进行接口测试
12、功能按钮:冒烟测试按钮,通过了冒烟测试以后才能发布
13、功能按钮:发布接口,发布接口以后以后就可以通过发布的接口获取数据
14、功能按钮:接口编辑历史记录,可以通过历史记录回滚9区域的代码
15、功能按钮:删除按钮,点击删除后删除已经发布的接口(数据库中也会清除这条记录)
16、18功能区域:这个区域可以设置接口的请求参数例如通过 POST 方法传输一个请求报文,在此区域定义
17、功能按钮:设置接口的请求头参数
19、功能区域:测试接口区域,点击11测试按钮或者12冒烟以后在此区域显示测试结果

DataQL 语言写法:

var dataSetFun = @@sql(name) <%
    select * from person where p_name = #{name} limit 10;
%>
// 执行这个 SQL,并返回结果
return dataSetFun(${name});

示例
将 API 接口发布,然后就可以测试 /springboot-dataway/api/queryByName 了
在这里插入图片描述

6、Mybatis 语法支持

// SQL 执行器切换为分页模式及首页页面设置
hint FRAGMENT_SQL_QUERY_BY_PAGE = true
hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1
hint FRAGMENT_SQL_PAGE_DIALECT = "mysql"

// 统一转驼峰
// 问题及说明2:通过下边的查询SQL测试得出结论,转驼峰的规则是,全部字母小写下划线后的字母大写,特别要注意的是【这里的驼峰只针对数据查询的字段,分页字段默认是驼峰的,下面附上测试】。
// default、upper、lower、hump
hint FRAGMENT_SQL_COLUMN_CASE = "hump" 

// 定义查询SQL
// 问题及说明3:对mybatis的支持并不完善,支持的标签有<select> <insert> <delete> <update> <if> 和<foreach>相关,<where>标签测试是不支持的。
// 问题及说明4:Date类型数据的查询,需要使用 TO_CHAR 函数,否则是毫秒值。
var dataSetFun = @@mybatis(keyword) <%
    <select>
        SELECT
	        p_id,
	        p_name
        FROM
	        person
        WHERE p_name is not null
        <if test="keyword != null and keyword != ''">
           AND p_name like concat('%','${keyword}','%') 
        </if>
        ORDER BY p_id
    </select>
%>

// 创建分页查询对象
// 问题及说明5:参数的传递规则,顺序很重要,从左到右是SQL内的参数顺序。
var pageQuery =  dataSetFun(${keyword},${pageSize},${pageNumber});
// 设置分页信息
run pageQuery.setPageInfo({
    "pageSize"    : #{pageSize}, 
    "currentPage" : #{pageNumber}
});
// 执行分页查询
var pageData = pageQuery.data();
// 查询分页信息
var pageInfo = pageQuery.pageInfo();
// 返回结果封装
// 问题及说明6:结果会封装到之前的value内。
return {
  "pageData" : pageData,
  "pageInfo" : pageInfo
};

测试结果:
测试结果

7、小结

总结一下,个人觉得Hasor还是有很多优点的,例如可以和方便的与SpringBoot结合,可以不用写Controller、service、dao、mapper这一套东西,可以动态修改配置API等等;但是缺点也是有的,个人觉得这东西还很年轻,有一定的学习成本(例如要学习DataQL)等等这些。
DataQL 语言:https://www.dataql.net/docs/dataql/overview

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

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

相关文章

连通块是什么

刷题的时候遇到一个名词概念&#xff0c;连通块是什么&#xff1f; 在图论中&#xff0c;无向图中的连通块&#xff08;也叫作连通分量&#xff09;是指原图的一个子图&#xff08;即该子图只包含原图中的部分或全部顶点及边&#xff09;&#xff0c;该子图任意两个顶点都能通…

Swift 环境搭建

Swift是一门开源的编程语言&#xff0c;该语言用于开发OS X和iOS应用程序。 在正式开发应用程序前&#xff0c;我们需要搭建Swift开发环境&#xff0c;以便更好友好的使用各种开发工具和语言进行快速应用开发。由于Swift开发环境需要在OS X系统中运行&#xff0c;因此其环境的…

智能指针shared_ptr:自定义删除器

重点&#xff1a; 1.普通指针转化成智能指针。 2.智能指针创建的时候&#xff0c;第二个参数是自定义删除器&#xff0c;默认情况下&#xff0c;shared_ptr调用delete()函数。 class A { public:void Get() { cout << b << endl; }; private:int b{ 10 }; };clas…

Java 与其他编程语言:比较分析

Java 擅长可移植性和可靠性&#xff0c;Python 擅长通用性和简单性&#xff0c;JavaScript 擅长 Web 开发&#xff0c;C 擅长性能&#xff0c;Go 擅长效率。 在广阔的软件开发世界中&#xff0c;选择正确的编程语言对于任何项目的成功都至关重要。Java 是一种以其多功能性和可移…

交换机Vlan实验

介绍 Vlan表示虚拟局域网。 常见的网络安全技术 VlanACL Vlan的作用 Vlan隔离了广播域&#xff0c;增加了网络的安全性。 知识点 默认vlan vlan1 是默认vlan&#xff0c;主要机器开机了&#xff0c;默认所有的接口都属于Vlan1 交换机的接口模式 Access : 这个模式用来…

RK3588平台开发系列讲解(文件系统篇)什么是 VFS

文章目录 一、什么是 VFS二、VFS 数据结构2.1、超级块结构2.2、目录结构2.3、文件索引结点2.4、打开的文件2.5、四大对象结构的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 今天我们一起来瞧一瞧 Linux 是如何管理文件,也验证一下 Linux 那句口号:一切皆为文…

卡尔曼滤波 | Matlab实现无迹kalman滤波仿真

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 卡尔曼滤波 | Matlab实现无迹kalman滤波仿真 研究内容 无迹kalman滤波(UKF)不是采用的将非线性函数线性化的做法。无迹kalman仍然采用的是线性kalman滤波的架构,对于一步预测方程,使用无迹变换(UT)来…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…

【技能实训】DMS数据挖掘项目(完整程序)

文章目录 1. 系统需求分析1.1 需求概述1.2 需求说明 2. 系统总体设计2.1 编写目的2.2 总体设计2.2.1 功能划分2.2.2 数据库及表2.2.3 主要业务流程 3. 详细设计与实现3.1 表设计3.2 数据库访问工具类设计3.3 配置文件3.4 实体类及设计3.5 业务类及设计3.6 异常处理3.7 界面设计…

优雅记录与保留:探秘Spring Boot与Logback的高级日志输出与存储

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 优雅记录与保留&#xff1a;探秘Spring Boot与Logback的高级日志输出与…

Java中运算符要注意的一些点

目录 1. 算术运算符 1. 1 基本四则运算符&#xff1a;加减乘除模( - * / %) 1.2. 增量运算符 - * % 2. 关系运算符 3. 逻辑运算符 3.1. 逻辑与 && 3.2. 逻辑 || 3.3. 逻辑非 ! 3.4. 短路求值 4. 位运算符 4.1. 按位与 &: 如果两个二进制位都是 …

WebGL: 几个入门小例子

本文罗列几个WebGL入门例子&#xff0c;用于帮助WebGL学习。 一、概述 WebGL (Web Graphics Library)是一组基于Open ES、在Web内渲染3D图形的Javascript APIs。 Ref. from Khronos Group: WebGL WebGL™ is a cross-platform, royalty-free open web standard for a low-lev…

代码随想录算法训练营之JAVA|第二十一天| 77. 组合

今天是第21天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 77. 组合https://leetcode.cn/problems/combinations/description/ 第一想法 需要从N个数中选取K个数&#xff0c;那么第一想法肯定是k个for循环&#xff0c;每个for循环选取一个数&#x…

K8S系列文章之 kubeasz部署K8S环境

自动化安装方式&#xff08;kubeasz&#xff09;* 生产环境推荐&#xff08;首次安装下载相关配置和安装包&#xff09;是基于Ansible实现的部署工具 简单介绍 每一具体k8s集群的详细配置参数文件 Ansible 任务配置文件 镜像安装包 安装部署步骤 前提 &#xff1a; 保证Ansib…

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布&#xff0c;人们很容易感到不知所措。因此&#xff0c;让我们放慢脚步&#xff0c;看看4个主流的支持消费级硬件的NeRF 平台。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP&#xff08;Instant-NeRF&#xff09; 2022 年…

使用nativephp开发桌面应用测试

2023年7月21日10:29:03 官网&#xff1a;https://nativephp.com/ 源码&#xff1a;https://github.com/NativePHP/laravel 看起像laravel团队的作品 安装&#xff1a;注意需要php8.1以上&#xff0c;laravel10以上 composer create-project laravel/laravel example-app或者&am…

SpringBoot集成Redisson实现延迟队列

一、场景 1、下单未支付&#xff0c;超过10分钟取消订单 2、货到后7天未评价&#xff0c;自动好评 二、实现方案 1、使用xxl-job 定时任务按时检测&#xff0c;实时性不高 2、使用RabitMQ的插件rabbitmq_delayed_message_exchange插件 3、 redis的过期检测 redis.conf 中…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Vue如何定义router-link的颜色样式

今天在使用Vue的时候碰到了想改样式却改不了的情况 <ul> <li>xxxxx</li> <li><router-link to"/wisdom" active-class"ative">xxxxx</router-link></li> <li><router-link to"/MyLogin" act…

【福建事业单位-推理判断】06翻译推理、组合排列

【福建事业单位-推理判断】06翻译推理、组合排列 一、翻译推理1.1 前推后&#xff08;如果&#xff0c;那么&#xff09;1.1.2逆否命题1.3 传递关系1.4后推前&#xff08;只有才&#xff09;后推前&#xff1a;不....不............&#xff0c;除非....否则不..........1.4.2后…