JeecgBoot

参与开源 — JEECG低代码开发平台 - 官方网站

1
2
3
4
5
邮件格式:
A. 自我介绍(简单明了,包括个人基本信息、从业领域、所在公司及职位、工作年限等)
B. 擅长技能(以技术为主,爱好为辅)
C. 个人期待(希望在团队中做什么,对JEECG的发展的建议和期待)
D. 提出JEECG发展的不足,以及对jeecg发展的建设性意见(重要)

技术栈

前端

Html+Js+Css

https://www.w3school.com.cn/

ES6

https://es6.ruanyifeng.com/

Web API

Web API 接口参考 | MDN (mozilla.org)

工具

Vue、Vuex、Vue-router

https://cn.vuejs.org/index.html

https://learning.dcloud.io/#/

Ant-design-vue

https://1x.antdv.com/docs/vue/introduce-cn/

uniapp

uni-app官网 (dcloud.net.cn)

微信小程序

https://developers.weixin.qq.com/miniprogram/dev/framework

Vant 移动端组件

Vant 2 - 轻量、可靠的移动端组件库 (gitee.io)

地图

  • Leaflet

图表

  • echarts、highcharts、dataV

3D 可视化

WebGL、Three.js

包管理器

  • npm、cnpm、yarn

打包工具:Webpack

https://www.webpackjs.com/guides/

https://www.bilibili.com/video/av90152963?p=2

开发工具:VSCode、IDEA、HBuilderX

调试技巧

  • 调试技巧
    • 输出日志
    • 断点、条件断点
    • 网络请求
    • 应用缓存
    • Css 样式调试
  • 禁止Web调试工具 disable-devtool

android【已过时不再使用】

原生 + H5 页面「app 本地页面 + 互联网页面」

5+App【已过时不再使用】

MUI + H5Plus + Native.js

后端

  • Java基础
  • 多线程、注解、泛型、枚举、反射、定时、排序、集合等
  • Java8 引入的 Lambda、Stream
  • Java 开发规范:《Java开发手册.pdf》
  • 编程时遵循设计原则和最佳实践,按需引入设计模式
  • SpringBoot、Shiro、JWT
  • SpringCloud

ORM框架

DB连接池

日志框架

SLF4J-日志门面、Logback-日志框架

SwaggerUI

  • Swagger UI是一个流行的开源API文档和测试工具

HttpClient 工具

Excel处理

Word模板引擎

定时调度

  • Spring scheduled
  • Quartz
  • xxl-job

编程工具包

模板引擎

数据库

全文检索

消息队列

  • RabbitMQ
  • Kafka

文件服务

  • Minio
  • Oss
  • FastDFS

工作流

  • Activiti
  • Flowable

运维平台

  • Docker

  • K8s

工具

  • Postman

  • IDEA:常用插件「IDEA-plugins」、调试技巧、远程调试、书签、ToDo、Database

Web容器

Servlet 容器

  • Tomcat
    • HTTP服务器和Servlet引擎
  • Jetty
    • Jetty是一个开源的HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运行时环境。相对于Tomcat,jetty更加轻量、更加简易、更加灵活
    • jetty是异步的,支持更高的并发量
    • Jetty 默认采用的 NIO 模型,jetty能很好支持长链接
  • Undertow https://segmentfault.com/a/1190000020668553
    • 高并发能力
  • Weblogic

项目管理

禅道

Java

HashMap 的 merge(k, v, function) 函数

  • 该函数作用与 put(k, v) 一致,但当 Key 重复的时候,可以自定义处理元素值

  • 示例

    1
    2
    3
    4
    HashMap<String, Integer> map = new HashMap<String, Integer>() {{
    put("key", 1);
    }};
    map.merge("key", 2, (oldVal, newVal) -> oldVal + newVal);

Comparator

  • Java Comparator 是一个函数式接口,用于比较两个对象。

  • Comparator 接口定义了一个 compare() 方法,该方法接受两个参数,返回一个整数,表示第一个参数是否小于、等于或大于第二个参数。如果第一个参数排序字段值大于第二个参数的且返回 1,则为升序。返回 -1 则为降序

静态内部类

  • 静态内部类是指在一个非静态类中定义的静态成员类

  • 静态内部类中可以访问外部类中的静态成员变量和静态方法,无法访问非静态成员和方法

  • 静态内部类实例化对象必须通过「外部类.内部类」方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class OuterClass {
// 外部类静态成员变量
private static String outerField = "外部类静态成员变量";

// 外部类静态方法
public static void outerMethod() {
System.out.println("调用外部类静态方法");
}

// 静态内部类
public static class StaticInnerClass {
private String innerField = "内部类字段";

public void printFields() {
System.out.println("外部类静态成员变量: " + outerField);
System.out.println("内部类字段: " + innerField);

outerMethod();
}
}

public static void main(String[] args) {
// 创建静态内部类的实例
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.printFields();
}
}

Java8

Lambda 是什么?

  • Lambda 表达式是Java 8中引入的一种新的特性,可以简化代码的书写,提高代码的可读性和可维护性

  • Lambda 表达式表达的是一个匿名接口函数的实现

  • Lambda表达式的语法由三个部分组成:函数参数、箭头符号(->)和函数体。函数的参数类型和返回值类型都可以省略,程序会根据接口定义的上下文自动确定数据类型

Stream 是什么?

  • Stream 是Java 8中引入的一种新的特性,它可以将数组、集合、文本文件数据转换成管道数据流的形式,进行各种操作,例如过滤、映射、排序等
  • Stream API 可以极大地提高Java程序员的编程效率,使代码更加简洁、易读和易于维护

管道操作

  • filter、map、peek、sorted、distinct、skip、limit、parallel

元素收集

  • toList、toSet、toArray、toMap、GroupBy
  • anyMatch,allMatch,noneMatch
  • count、min、max、average、sum

线程池

  • 核心线程数:当前线程数小于核心线程数,则创建线程执行任务

  • 任务队列:当前线程数大于等于核心线程数,则将任务放入任务队列,等待执行

  • 最大线程数:任务队列已满,当前线程数小于最大线程数,则创建线程执行任务。如果已经达到最大线程数,则拒绝任务并调用饱和策略

  • 最大线程数设置多少合适?

    • CPU密集型【计算密集型】

      • 最大线程数=CPU核心数+1。另外一个当备份线程

      • 如果线程数远超过CPU核心数,会导致频繁的切换线程从而耗费较多时间

    • IO密集型

      • 最大线程数=CPU核心数*2

      • IO操作并不占用CPU,不要让所有CPU闲下来,IO 的速度比起 CPU 是很慢的

Spring

注解

  • 类注解:@Controller@Service@Repository@Component@Configuration
  • 方法注解:@Bean 在类注解中有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Controller
public class Users {
@Bean
public User user1(){
User user = new User();
return user;
}

// 可通过设置 name 属性给 Bean 对象进⾏重命名操作
@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
return user;
}
}
public class Test {
public static void main(String[] args) {
//获取spring上下文
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
//获取指定的Bean对象名称+类型进行获取
User user = (User) applicationContext.getBean("user1");
user.sayHi("zcx");
}
}

SpringBoot

@EnableAsync

  • 启用异步方法执行

  • 在 Spring Boot 应用程序的主类上添加 @EnableAsync 注解

  • 它会自动配置一个 TaskExecutor 来处理异步任务的执行,并支持使用 @Async 注解来标记异步方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;

    @Service
    public class MyService {
    @Async // 标记该方法为异步方法
    public void doSomething() {
    // 执行一些耗时的操作
    }
    }
  • 当调用该方法时,它将在一个单独的线程中执行,并且不会阻塞主线程

  • 需要注意的是,异步方法必须返回 voidFuture 类型的结果

@EnableScheduling

  • 开启定时调度功能

    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableScheduling
    public class Application {
    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
    }
  • 使用@Scheduled注解来声明一个定时任务,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    @Component
    public class MyTask {
    //@Scheduled(cron = "0 0 1 * * ?") //每天凌晨1点执行一次
    @Scheduled(cron = "0/10 * * * * ?") // 每10秒执行一次
    public void execute() {
    System.out.println("Hello World!");
    }
    }

@Transactional

  • 使用 @Transactional 注解来开启事务。默认发生运行时异常 RuntimeException 或错误 Error 时会回滚
1
2
3
4
5
@Transactional(rollbackFor = Exception.class) // 开启事务支持,并在发生异常时回滚事务
public void createUser(User user) throws Exception {
userRepository.save(user); // 保存用户信息到数据库中
// 如果发生异常,则回滚事务,否则提交事务(由 Spring 的事务管理器处理)
}

@EnableTransactionManagement

  • 用于启用事务管理器和事务通知的支持,并配置事务的传播行为、隔离级别等属性。但是,对于大多数应用程序而言,使用默认的事务管理器和传播行为已经足够了

  • 如果你需要自定义事务管理器或更改传播行为等高级配置,则可以添加 @EnableTransactionManagement 注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.transaction.annotation.TransactionManagementConfigurer;

    @Configuration
    @EnableTransactionManagement // 启用事务管理
    public class TransactionConfig implements TransactionManagementConfigurer {
    private final UserService userService;

    public TransactionConfig(UserService userService) {
    this.userService = userService;
    }

    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
    return new JpaTransactionManager(); // 返回自定义的事务管理器实例
    }

    @Override
    public void configure(TransactionDefinition definition) {
    definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); // 设置传播行为为 REQUIRED
    }
    }

@EnableAutoConfiguration 注解有什么用

  • @EnableAutoConfiguration 注解是Spring Boot 中的一个核心注解之一,它的作用是开启自动配置
  • 将所有符合条件的配置类进行实例化,并把这些 Bean 注入到 Spring 容器中

@ComponentScan 注解有什么用

  • @ComponentScan注解是Spring Boot中的一个核心注解之一,它的作用是开启组件扫描
  • 自动扫描符合条件的包下的类,进行实例化,并将这些 Bean 注入到 Spring 容器中
  • 支持 basePackages 指定基础包路径、excludeFilters 等

@Import

  • 静态注入

    1
    2
    @Import(DatabaseConfig.class)
    @Import({Student.class, Teacher.class})
  • 动态自动注入:实现 ImportSelector 接口的方法 selectImports 返回要注入类的名称的数组

  • 动态手动注入:实现 ImportBeanDefinitionRegistrar 接口的方法 registerBeanDefinitions。支持自定义Bean 的名称

@EnableFeignClients

网络

负载均衡策略

轮询、加权轮询、IP Hash、随机、最小连接

  • 轮询均衡(Round Robin)是每一次来自网络的请求轮流分配给内部中的服务器,从1至N然后重新开始。此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。

  • 权重轮循均衡(Weighted Round Robin)是根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

  • IP Hash均衡是根据客户端IP地址进行哈希运算,然后将哈希值与服务器列表大小取模得到一个整数值,用这个整数值来选择对应的服务器。此种均衡算法适合于服务器组中服务器处理能力不均衡的情况。

  • 随机均衡是随机选择一个服务器来处理请求。此种均衡算法适合于服务器组中处理能力不均衡且请求量比较大的情况下使用

  • 最小连接是选择连接数最少的服务器来处理请求

设计模式

《Java-设计模式.md》

  • 七大设计原则:单一职责原则、开闭原则、里氏替换原则【使用基类或父类指定子类对象】、依赖倒置原则【面向接口编程】、接口隔离原则【接口尽量单一专用】、迪米特法则【最少知道原则】、组合复用原则【先组合后继承】
  • 23种设计模式:单例模、工厂方法、抽象工厂、建造者、原型、观察者、策略、模板、责任链、适配器、代理。代理分为静态代理和动态代理,动态代理就是实现接口 InvocationHandler 的 invoke 方法来实现

缓存

Redis

场景一,一些不太重要的业务数据

示例:前端列表字段比较多时,支持用户自定义设置列显示或隐藏,设置列的显示排序

场景二,频繁变化的数据

示例:用户、车辆等最新轨迹数据,需要快速展示用户或车辆在地图上的最新分布情况。轨迹数据本身是存储到关系型数据库的。当然也可以使用时序数据库实现

场景三,查询接口优化

示例:接口响应慢且数据变更不频繁的情况,可以使用缓存提高响应速度。但注意在数据变更时要让缓存失效。如果数据变更频繁,就不要使用缓存了

业务

业务系统:门户、城管、执法、环卫、园林、市政、应急、车辆、供水、供气、垃圾分类

平台对接:对接第三方平台。例如海康/大华/萤石云视频监控,车辆平台/车联网平台,油烟平台,供热平台,

门户

内容管理:政策法规、新闻动态、行业动态、热点服务、知识平台、成果展示。基于 MySQL+ES 实现数据的存储和检索