项目/代码规范与Apifox介绍使用

news/2024/9/11 3:43:33/ 标签: 代码规范

目录

目录

一、项目规范:

(一)项目结构:

(二)传送的数据对象体

二、代码规范

(一)数据库命名规范:

(二)注释规范:

(三)命名规范:

(四)前后端规范:

(五)其他规范:

三、Apifox使用:

(一)下载与安装:

(二)新建项目与邀请你的队友:

(三)接口文档的书写规范

四、Debug功能(后端必须要会)

五、测试类

六、注意事项:

(一个人是打不了江山的!!!)


一、项目规范:

(一)项目结构:

其中具体的:

(1)Entity层:实体层,就是存放具体的对象实体,与数据库中的对象相对应。

(2)DAO层:(可以细分两层(dao的接口层与dao的实现层))就是与数据库进行交互的层,涉及到一些数据库的增删改查操作。

(3)Service层(可以细分两层(service的接口层与service的实现层)):主要负责业务模块的逻辑应用设计。

(4)Controller层:Controller层负责具体的业务模块流程的控制,controller层负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端。

(5)Util层:工具层,放置常用的工具类,比如可以把一些通用的方法写成一个util的函数,然后可以简化整体的代码。

(6)Exception层:可以写一下统一的返回异常层。

(7)Filter层:过滤层,比如统一过滤一下身份验证,如果没有过滤通过,则只是游客模式。

(二)传送的数据对象体

DTO就是前端发送请求传来的数据结构体。

VO就是后端针对前端发送的请求进行返回的响应。

PO就是对象实体和数据库对象这个表的实际对应关系。

BO就是在业务处理过程中的对象实体。

二、代码规范

要英文命名,不要汉语拼音。

要通俗易懂,不要花里胡哨。

要驼峰命名,不要平平范范。

要间隔换行,不要大段书写。

要注释注解,不要个人主义。

Java语言编码规范 - Java语言编码规范(中文版) - 在线文档 - JAVA 编程资料牛鼻站 (javanb.com)icon-default.png?t=N7T8http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/index.html#312

不要用关键字、保留字等在java本身有特殊含义的 命名!!!

(一)数据库命名规范:

(1)表名是唯一的,不能多个表命名使用同一个名称。

(2)表名采用小写字母和下划线的组合形式,尽量避免使用大写字母或特殊字符,含义清晰,使用“user_info”类似这种,或者“tbl_user”,"tbl_user_info"这种。 

(3)不要与关键字冲突,禁用保留字,如 like、desc、range、match、delayed 等,请参考 MySQL 官方保留字。 

(4)数据库字段名:采用26个英文字母(区分大小写)加上下划线'_'组成,例如“user_id","user_name","user_password","user_register_time","user_login_time".

(5)主外键规范:

主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明: pk_即 primary key;uk_即 unique key;idx_即 index 的简称。

主键:pk_+表名
例如:pk_main
外键:fk_+从表名+_+主表名
例如:fk_sub_main

(6)小数类型为 decimal,禁止使用 float 和 double。
(7)表必备三字段:id,create_time,update_time。

(二)注释规范:

(1)类注释:

   类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息:

/**
 * @version: V1.0
 * @author: fendo
 * @className: user
 * @packageName: user
 * @description: 这是用户类
 * @data: 2024-07-01 12:20
 **/

(2)方法注释(Constructor):

      方法内部单行注释,在被注释语句上方另起一行,使用 // 注释。方法内部多行注释使用 /* */
注释,注意与代码对齐。所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数异常说明 外,还必须指出该方法做什么事情,实现什么功能。 方法注释(Constructor)还可以用来声明该类的参数、返回等信息:

/**
* @author:  fendo
* @methodsName: addUser
* @description: 添加一个用户
* @param:  xxxx
* @return: String
* @throws: 
*/

(3)代码块注释:解释你某一部分代码的用途

/**
 * 实例化一个用户
 * xxxxxxx
 */
User user=new User();

(4)单句注释:注释你单独的代码

User user=new User(); //实例化一个用户

(三)命名规范:

命名要让别人能看懂,驼峰命名,区分大小写。

(1)类名使用 UpperCamelCase 风格:
例如:UserController,FileController,BookService
(2)方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
例如:getUserName(),userLogin(),getMessage();
(3)常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
例如:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
(4)抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾,测试类命名以它要 测试的类的名称开始,以 Test 结尾。
(5)包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数
式,但是类名如果有复数含义,类名可以使用复数形式。
(6)Service / DAO 层方法命名规约:
1)获取单个对象的方法用 get 做前缀。
2)获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects
3)获取统计值的方法用 count 做前缀。
4)插入的方法用 save / insert 做前缀。
5)删除的方法用 remove / delete 做前缀。
6)修改的方法用 update 做前缀。
(7)领域模型命名规约:
1)数据对象:xxxDO,xxx 即为数据表名。
2)数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3)展示对象:xxxVO,xxx 一般为网页名称。
(8)所有整型包装类对象之间 值的比较 ,全部使用 equals 方法比较。
说明: 对于 Integer var = ? 在 -128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复
用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
(9)浮点数之间的等值判断,基本数据类型不能使用 == 进行比较,包装数据类型不能使用 equals 进行判断。 BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法
正例:
(1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。
float a = 1.0F - 0.9F ;
float b = 0.9F - 0.8F ;
float diff = 1e-6F ;
if ( Math . abs ( a - b ) < diff ) {
System . out . println ( "true" );
}
(2)使用 BigDecimal 来定义值,再进行浮点数的运算操作。
BigDecimal a = new BigDecimal ( "1.0" );
BigDecimal b = new BigDecimal ( "0.9" );
BigDecimal c = new BigDecimal ( "0.8" );
BigDecimal x = a . subtract ( b );
BigDecimal y = b . subtract ( c );
if ( x . compareTo ( y ) == 0) {
System . out . println ( "true" );
}
标识符类型命名规则例子
包(Packages)一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department),项目(project),机器(machine),或注册名(login names)。com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
类(Classes)命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像URL,HTML)class Raster;
class ImageSprite;
接口(Interfaces)命名规则:大小写规则与类名相似interface RasterDelegate;
interface Storing;
方法(Methods)方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。驼峰命名run();
runFast();
getBackground();
变量(Variables)除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。
变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。

List <User> userList;

String userName;

常量(Constants)类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。(尽量避免ANSI常量,容易引起错误)static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;

(四)前后端规范:

(1)请求方法:对具体操作的定义,常见的请求方法如下:
a)GET:从服务器取出资源。           (可以看作select操作)
b)POST:在服务器新建一个资源。 (可以看作insert操作)
c)PUT:在服务器更新资源。           (可以看作update操作)
d)DELETE:从服务器删除资源。    (可以看作delete操作)
(2)请求的返回信息:
  • code:http的status code
    • 如果有自己定义的额外的错误,那么也可以考虑用自己定义的错误码
  • message:对应的文字描述信息
    • 如果是出错,则显示具体的错误信息
    • 否则操作成功,一般简化处理都是返回OK
  • data
    • 对应数据的json字符串
      • 如果是数组,则对应最外层是[]list
      • 如果是对象,则对应最外层是{}dict
{"code": 200,"message": "new user has created","data": {"id": "user-4d51faba-97ff-4adf-b256-40d7c9c68103","firstName": "crifan","lastName": "Li","password": "654321","phone": "13511112222","createdAt": "2016-10-24T20:39:46","updatedAt": "2016-10-24T20:39:46"......}
}

(3)响应的状态码

出错问题:

  • 1xx(信息性状态码):表示接收的请求正在处理。
  • 2xx(成功状态码):表示请求正常处理完毕。  200就是请求返回成功。
  • 3xx(重定向状态码):需要后续操作才能完成这一请求。
  • 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。 400 404 401 403 都是前端发送请求时候出的错误,前端先要查看问题,也有可能是后端写的出了错误。
  • 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。 后端问题,有可能抛出异常,服务器错误等等。

2XX 成功


200 ok(请求成功)
204 no content (请求成功,但是没有结果返回)
206 partial content (客户端请求一部分资源,服务端成功响应,返回一范围资源)


3XX 重定向


301 move permanently (永久性重定向)
302 found (临时性重定向)
303 see other (示由于请求对应的资源存在着另一个 URI,应使用 GET
方法定向获取请求的资源)
304 not modified (表示在客户端采用带条件的访问某资源时,服务端找到了资源,但是这个请求的条件不符合。跟重定向无关)
307 temporary redirect (跟302一个意思)


4XX 客户端错误


400 bad request (请求报文存在语法错误)
401 unauthorized (需要认证(第一次返回)或者认证失败(第二次返回))
403 forbidden (请求被服务器拒绝了)
404 not found (服务器上无法找到请求的资源)


5XX 服务器错误


500 internal server error (服务端执行请求时发生了错误)
503 service unavailable (服务器正在超负载或者停机维护,无法处理请求)

(五)其他规范:

(1)HTTP 请求通过 body 传递内容时,必须控制长度,超出最大长度后,后端解析会出错。
说明: nginx 默认限制是 1MB,tomcat 默认限制为 2MB,当确实有业务需要传较大内容时,可以调大服务器端的限制。
(2) 不要在 finally 块中使用 return
说明: try 块中的 return 语句执行成功后,并不马上返回,而是继续执行 finally 块中的语句,如果此处存在 return 语句, 则会在此直接返回,无情丢弃掉 try 块中的返回点。
(3)事务场景中 抛出异常被 catch 后 如果需要回滚 一定要注意手动回滚事务。
(4)可以使用日志进行记录信息, 使用日志框架 (SLF4J、 JCL—Jakarta Commons Logging) 中的 API.

三、Apifox使用:

(一)下载与安装:

链接:点击链接,直接下载apifox(下载最新版就行)。Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。icon-default.png?t=N7T8https://apifox.com/

(二)新建项目与邀请你的队友:

1.新建你的团队与新建项目:

邀请你的队友

2.新建接口与新建数据模型:

(1)确定好是什么请求(POST,GET,PUT,DELETE):

(2)测试环境一定统一好,不同的环境url不一样:

(3)请求参数配置好:

有什么参数配置什么参数,给出参数示例,中文名,参数说明要有。

(4)响应要配置好:

比如不同的状态下返回什么样子的信息要规定好,成功示例,异常示例要有(方便前端)。

{"code": 200,"message": "登入成功","data": {"user_id": 27,"user_name": "孟霞","user_password": "123456","user_age": "15","user_photo": "http://dummyimage.com/400x400","user_last_time": "1996-12-11 09:03:49","user_indentity": "messager","user_birthday": "2024-02-23"}
}

(5)可以创建数据模型:

可以创建几个数据模型,在返回响应字段的适合很方便,也方便前端查看你的数据域东西。

(三)接口文档的书写规范

apifox的书写规范、与具体细节。

Apifox 快速入门 | Apifox 帮助文档icon-default.png?t=N7T8https://apifox.com/help/

(1)在 API 接口文档的开头,应该有一部分介绍。这部分可以包括以下内容:

  • API 接口的名称和版本号
  • API 接口的功能和用途
  • API 接口的设计目的和原则
  • API 接口的适用范围和限制

这部分的目的是为了让读者了解该 API 接口的基本情况和背景信息。

(2)接口列表

接着,在 API 接口文档中,我们需要列出所有的接口。每个接口应该包含以下信息:

  • 接口名称和描述
  • 请求方法(GET、POST、PUT、DELETE 等)
  • 请求路径(URL)
  • 请求参数(包括 Query 参数和 Body 参数)
  • 请求示例(可以包含请求头和请求体的完整示例)
  • 响应状态码和描述
  • 响应参数(包括 Header 参数和 Body 参数)
  • 响应示例(可以包含响应头和响应体的完整示例)

这部分的目的是为了让读者能够快速了解每个接口的基本信息,并且能够根据文档中的示例来正确地使用接口。

(3) 请求参数和响应参数说明

在接口列表之后,我们需要详细说明每个接口的请求参数和响应参数。这部分应该包括以下信息:

  • 参数名称和描述
  • 参数类型和格式
  • 是否必填和默认值
  • 参数示例

对于参数类型和格式,可以使用标准的数据类型和格式,也可以根据具体情况定义自己的数据类型和格式。对于是否必填和默认值,需要根据实际情况来确定。

(4) 错误码说明

在使用 API 接口时,有时候会发生错误,此时需要返回一个错误码来说明错误的类型和原因。因此,在 API 接口文档中,我们需要详细说明所有可能的错误码。这部分应该包括以下信息:

  • 错误码和描述
  • 错误类型和原因
  • 接口返回的错误码示例

这部分的目的是为了让读者了解所有可能的错误类型和原因,并且能够根据文档中的示例来正确地处理错误。

四、Debug功能(后端必须要会)

2分钟教会你如何Java中DeBug【IDEA中Java】_java工程中没有案例如何debug-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43436117/article/details/113859737

五、测试类

(1)具体的操作:

定义一个测试类

建议:

测试类名:被测试的类名Test CalculatorTest
包名:xx.xx.xx.test cn.itcast.test
定义测试方法:可以独立运行

建议:

方法名:test测试的方法名 testAdd()
返回值:void
参数列表:空参
给方法加 @Test

导入Junit依赖环境

判定结果:

红色:失败
绿色:成功
我们一般使用Assert类下的静态方法assertEquals(expected, actual)去处理我们的期望结果和输出结果

Assert.assertEquals(3, result);

两个参数分别是:期望值 程序结果值

为什么要使用Assert.assertEquals(expected, actual)去处理测试结果呢?

因为我们规定红色代表失败,绿色代表正确。当我们使用一个测试方法去测试一个计算机的加法方法时,最后只是输出这个结果(假如没有异常的发生)。如果我们输入1和3,我们期望得到结果4,但是我们输出的是2,我们期望得到的是4,这个时候得到的结果不符合我们的预期,但是运行结果仍然是绿色的(代表正确),是不是就不太正确,这个时候我们可以在最后使用Assert的assertEquals方法比较预期值和程序输出的结果值,如果相等,就会使绿色的,不相等就是红色的。这个时候是不是就符合我们对绿色和红色的定义了。

package cn.itcast.test;import cn.itcast.junit.Calculator;
import org.junit.Assert;
import org.junit.Test;public class CalculatorTest {/*** 测试add方法*/@Testpublic void testAdd(){Calculator  c = new Calculator();int a = 1, b = 2;int result = c.add(1, 2);Assert.assertEquals(3, result);}/*** 测试sub方法*/@Testpublic void testSub(){Calculator  c = new Calculator();int a = 1, b = 2;int result = c.sub(1, 2);Assert.assertEquals(-1, 2);}
}

@Before
在一个测试方法之前加上@Before它就成为了初始化方法,在所有测试方法执行之前都会自动先执行该方法,一般用于资源的申请

@After
在一个测试方法之前加上@After它就成为了释放资源方法,在所有测试方法执行之后都会自动执行该方法。

被@Before修饰的方法会在测试方法执行之前先被执行

被@After修饰的方法会在测试方法执行之后被执行

被@Before或被@After修饰的方法无论测试方法是否出一场都会执行

(2)自动生成Test类插件

Java 项目自动生成单元测试插件推荐-腾讯云开发者社区-腾讯云 (tencent.com)icon-default.png?t=N7T8https://cloud.tencent.com/developer/article/1910893

六、注意事项:

(1)接口文档后端书写,要写的清晰明确,能让你的前端看明白,规范书写,不要写了就自己能看明白,改写的名称默认值接口响应要写好。

(2)除了教的东西,可以自行学一些其他的东西,比如邮箱验证注册,验证码登入,c3p0,MD5加密,log日志,Result风格等等等。

(3)代码书写也要规范,逻辑要严谨;(cookie,session)该设置的设置;需要判空的地方要判空,可以增加安全性的地方可以学学,

(4)前后端要配合好,不要后端只做自己的,一句话也不跟前端说。前后端的交互响应,同样也是考核的一部分,占很大一部分,你们写的接口,仅仅在apifox跑通是不可以的,呈现在具体的前端页面上有没有出错,有没有逻辑问题等等这都可能需要考虑。

(一个人是打不了江山的!!!)

(5)在需求分析的时候,就规定好你们自己要做的功能和接口,如果你做了什么功能,前端没有做,你可以push她,如果她做了的东西需要你后端的接口/数据,你没有写,那就好好反思反思,多沟通多交流。

可以对标一下真正可以运行的项目或者相似的东西,比如购物网站。那你就对标淘宝,这个网站可能有的后端接口,可能有的功能模块,具体的细节。

(6)不要一味的追求多,要逻辑合理,能够简化的部分要学会简化。但是基本的接口数量和代码量也是要保证的。(我们当初写的接口基本都是40多)


http://www.ppmy.cn/news/1475434.html

相关文章

JavaSE 面向对象程序设计进阶 IO流练习 字节缓冲流 字符缓冲流 底层原理

目录 字节缓冲流 字节缓冲流底层原理 字符缓冲流 字节缓冲流 刚刚学习的四个流是基本流 对四个基本流进行封装&#xff0c;添加了新的功能&#xff0c;叫做缓冲流 底层自带长度为8192的缓冲区 import java.io.*;public class Main {public static void main(String[] args) …

xcode中对项目或者文件文件夹重命名操作

提起揭秘答案&#xff1a;选中文件后&#xff0c;按下回车键就可以了 如果在项目中对新建的文件夹或者文件名称不满意或者输入错误了&#xff0c;想要修改一下名称该怎么办&#xff1f;如果是在文件或文件夹上右键是没有rename选项的&#xff1a; 其实想要重命名&#xff0c;很…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图&#xff1a; 页面布局&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:la…

AirPods Pro新功能前瞻:iOS 18的五大创新亮点

随着科技的不断进步&#xff0c;苹果公司一直在探索如何通过创新提升用户体验。iOS 18的推出&#xff0c;不仅仅是iPhone的一次系统更新&#xff0c;更是苹果生态链中重要一环——AirPods Pro的一次重大升级。 据悉&#xff0c;iOS 18将为AirPods Pro带来五项新功能&#xff0…

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App 定制化

iOS 开发中不常见的专业术语

乐此不疲地把简单的问题复杂化&#xff0c;并把这种XX行为叫作专业 APM 在 iOS 开发中&#xff0c;APM 代表 Application Performance Management&#xff08;应用性能管理&#xff09;。APM 是一套监控和管理应用程序性能的工具和技术&#xff0c;旨在确保应用程序运行平稳、…

Django 新增数据 save()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

常见的网络安全设备

一、防火墙 防火墙的核心任务&#xff1a;防护和控制&#xff0c;防火墙通过安全策略识别流量并做出相应的动作。 防火墙的安全策略在进行匹配时&#xff0c;自上而下逐一匹配&#xff0c;匹配成功则不向下进行匹配&#xff0c;末尾隐含拒绝所有规则。 1.包过滤防火墙 工作范围…

【C++深度探索】全面解析多态性机制(二)

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 我…

Elasticsearch 理解相关性评分(TF-IDF、BM25等)

在Elasticsearch中&#xff0c;相关性评分是搜索功能的核心&#xff0c;它决定了搜索结果的质量和排序。了解Elasticsearch是如何计算相关性评分的&#xff0c;特别是TF-IDF和BM25算法&#xff0c;对于优化搜索性能和结果至关重要。本文将深入探讨这两种算法及其在Elasticsearc…

vue3 ts 报错:无法找到模块“../views/index/Home.vue”的声明文件

解决办法&#xff1a; env.d.ts 新增代码片段&#xff1a; declare module "*.vue" {import type { DefineComponent } from "vue";// eslint-disable-next-line typescript-eslint/no-explicit-any, typescript-eslint/ban-typesconst component: Define…

C#面:阐述控制反转是什么?

控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是⾯向对象编程中的⼀种设计原则&#xff0c;可以⽤来减低计算机代码之间的耦合度。其中最常⻅的⽅式叫做依赖注⼊&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&am…

深入解析C#中的Stopwatch类:精准计时的艺术

目录 引言 了解Stopwatch类 创建与使用Stopwatch 使用多个Stopwatch实例 性能分析与优化 结论 后记 引言 在软件开发中&#xff0c;性能分析是不可或缺的一环&#xff0c;它帮助我们识别瓶颈、优化代码&#xff0c;确保应用程序的高效运行。C#中的Stopwatch类便是开发者…

数据湖仓一体(六)安装flink

上传安装包到/opt/software目录并解压 [bigdatanode106 software]$ tar -zxvf flink-1.17.2-bin-scala_2.12.tgz -C /opt/services/ 重命名文件 [bigdatanode106 services]$ mv flink-1.17.2-bin-scala_2.12 flink-1.17.2 配置环境变量 [bigdatanode106 ~]$ sudo vim /etc…

Elasticsearch:Node.js ECS 日志记录 - Morgan

这是之前系列文章&#xff1a; Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino Elasticsearch&#xff1a;Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中&#xff0c;我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…

threejs

1.场景清空&#xff0c;释放内容 // 假设你已经有一个Three.js的场景对象scene// 函数&#xff1a;清空场景中的所有对象 function clearScene(scene) {while(scene.children.length > 0){const object scene.children[0];if(object.isMesh) {// 如果有几何体和材质&#…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(2)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;2&#xff09; 第21题&#xff1a;在一个大型信息系统项目中&#xff0c;项目经理发现尽管已经建立了沟通机制&#xff0c;但团队间的沟通依然不畅&#xff0c;项目风险…

免费开源工具—— Clarity Al:一键图像放大/增强,Magnific平替!

今天给大家推荐一款图像增强工具——Clarity AI &#xff0c;免费且开源&#xff0c;快来看看吧&#xff01; 1、效果展示 MagnificAl是一款基于人工智能技术的图像处理工具,主要功能包括图像放大、像素级AI重绘、灵活的设置调整以及多种优化场景。它能够支持最高放大至16倍,甚…

电脑 DNS 缓存是什么?如何清除?

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c;负责将人类易记的域名转换为机器可读的 IP 地址&#xff0c;从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制&#xff0c;通过临时存储已解析的域名信息&#xf…