基础设施
本章记录一些配置笔记,不是 step by step 教程
安装 JAVA
# 免登陆下载java
https://xiandan.io/posts/jdk-download.html
# 高速镜像
https://github.com/LilithBristol/javajdkforwinx64
Linux 环境变量 PATH
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
Windows 环境变量
# JAVA_HOME
C:\Program Files\Java\jdk1.8.0_212
# CLASSPATH
.;%JAVA_HOME%\bin;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
VSCode 开发环境
基础插件
安装 Extension Pack for Java
即可,会把用到的开发插件都安装。不需要安装 Java Language Support 会和 Extension Pack for Java 中的 Language Support for Java by Red Hat 冲突。目前使用过程中也没有遇到必须使用 Java Language Support 的情况。
基本使用
使用 CTRL+SHIFT+P 输入 Java: create Project,输入项目名,在 src 文件夹中,选择 Run 运行 Java 代码。
常用快捷键
# 导包
shift + alt + o
IDEA 开发环境
下载安装 IDEA
Java 集成开发环境 IntelliJ IDEA 2022.3 Ultimate 永久激活版 - 风软资源站
配置 MAVEN,IDEA 中下载速度慢
# IDEA中编辑区右键--maven--create xml
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>uk</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://uk.maven.org/maven2/</url>
</mirror>
<mirror>
<id>CN</id>
<name>OSChina Central</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>nexus</id>
<name>internal nexus repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
安装 MYSQL
sudo apt install mysql
sudo mysql -u root -p
source /home/user/oa_system/VBlog/blogserver/src/main/resources/vueblog.sql
常用命令
# 创建数据库
CREATE DATABASE ryvue;
# 切换当前数据库
use ryvue;
set character set utf8;
# 执行sql脚本
source /home/user/oa_system/RuoYi-Vue/sql/ry_20220822.sql
source /home/user/oa_system/RuoYi-Vue/sql/quartz.sql
# 删除数据库
drop database 数据库名;
# 显示所有数据库
show databases;
# 创建数据库
create database 数据库名;
# 显示数据库编码格式
SHOW VARIABLES LIKE 'character_set_%';
# 删除 mysql 密码
SET PASSWORD FOR root@localhost=PASSWORD('');
# 重建数据库
drop database ryvue;
create database ryvue;
use ryvue;
安装数据库可视化工具
mysql-workbench
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt-get update
sudo apt-get install libssl1.1
wget https://downloads.mysql.com/archives/get/p/8/file/mysql-workbench-community_8.0.12-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql*.deb
sudo apt-get install -f
sudo dpkg -i mysql*.deb
VSCode 插件-MySQL by weijan Chen
安装 NPM
sudo apt install npm -y
npm set progress=false
npm config set registry http://registry.npmjs.org/
npm install --legacy-peer-deps
reify:abbrev: sill audit bulk request
删除 package-lock.json 文件
安装 nvm
打开终端并输入以下命令以在 Ubuntu 上下载 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
该命令将从 nvm GitHub 存储库下载安装脚本,并使用 bash 在您的 Ubuntu 系统上运行它。运行此命令后,nvm 将被安装在您的家目录中。
安装完成后,在终端中运行以下命令,以使 nvm 生效:
source ~/.bashrc
确认 nvm 是否正确安装:
nvm --version
如果一切顺利,您将看到 nvm 的版本号。
安装 node.js 和 npm
使用 nvm 安装特定版本的 Node.js:
nvm install <node-version>
例如:
nvm install 14.17.6
这将安装 Node.js 版本 14.17.6。
安装完成后,使用以下命令将已安装的 Node.js 版本设置为默认版本:
nvm alias default <node-version>
例如:
nvm alias default 14.17.6
这将设置 Node.js 版本 14.17.6 为默认版本。
确认 Node.js 和 npm 是否正确安装:
node -v
npm -v
如果一切顺利,您将看到 Node.js 和 npm 的版本号。
使用 nvm 切换 Node.js 版本:
使用以下命令查看可用的 Node.js 版本:
nvm ls-remote
该命令将显示可用的 Node.js 版本列表。
使用以下命令安装特定版本的 Node.js:
nvm install <node-version>
例如:
nvm install 12.22.6
这将安装 Node.js 版本 12.22.6。
使用以下命令切换到特定版本的 Node.js:
nvm use <node-version>
例如:
nvm use 12.22.6
这将切换到 Node.js 版本 12.22.6。
确认当前使用的 Node.js 版本:
node -v
如果一切顺利,您将看到当前使用的 Node.js 版本号。
ERROR 合集
Java
Error: Could not find or load main class org.apache.maven.wrapper.MavenWrapperMain
maven 相关依赖还没下载完
JSON parse error: Cannot construct instance of
确认请求方式是 get 还是 post,如果是 post 是不是前端发了一个空串。空串要用{}包裹
Error: JAVA_HOME is not defined correctly
# 缺少.mavenrc 配置文件
vim ~/.mavenrc
# 将 JAVA 配置放进去
export JAVA_HOME=/usr/lib/jvm/jdk1dot8
配置数据表中不存在的字段
@TableField(exist = false)
Error creating bean with name ‘minioController’ endpoint must not be null
检查配置文件是否配置了 endpoint
解决 MyBatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
1、检查 xml 文件的 namespace 是否对应接口,要是全路径。
2、xml 中的函数 id 和接口中的函数名是否对得上,参数类型、返回值类型是否对得上
3、去看输出目录中有没有 xml 映射文件,maven 项目默认把资源文件放在 src/main/resources 下,默认只识别 src/main/resources 下的资源文件。
Unable to obtain LocalDateTime from TemporalAccessor
You can’t parse a date string into LocalDateTime without a time.
LocalDateTime.parse(“2019-10-25”, DateTimeFormatter.ofPattern(“yyyy-MM-dd”))
You should parse the string into LocalDate
and call LocalDate.atStartOfDay()
to return LocalDateTime
with time 00:00:00
.
LocalDate.parse(“2019-10-25”, DateTimeFormatter.ofPattern(“yyyy-MM-dd”)).atStartOfDay()
// 传入的时间格式要和解析的时间格式保持一致,如以下解析方式,传入参数 2023-03-08 11:11:11
LocalDateTime startDateTime = LocalDateTime.parse(startTime,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime endDateTime = LocalDateTime.parse(endTime,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
DateTimeFormatter localDateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter localDateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
if (!"".equals(startTime) && !"".equals(endTime)) {
LocalDate startDate = LocalDate.parse(startTime, localDateFmt);
LocalDate endDate = LocalDate.parse(endTime, localDateFmt);
LocalDateTime startDateTime = LocalDateTime.of(startDate, LocalTime.MIN);
LocalDateTime endDateTime = LocalDateTime.of(endDate, LocalTime.MAX);
log.debug("startDateTime: " + startDateTime);
log.debug("endDateTime: " + endDateTime);
queryWrapper.between("create_time", startDateTime, endDateTime);
}
mybatisplus 提交数据后无法立即被查询到
提升事务隔离级别
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
One record is expected, but the query result is multiple records
解决方案:如果想取一条并不想报错时使用 getOne(queryWrapper,false)
注意 mybatisplus 的 sql 返回值
java.lang.NumberFormatException: null
检查使用 Integer.parseInt 转换时,是否转换的数可能为 null
Unexpected error occurred in scheduled taskjava.lang.NullPointerException: null
服务类没有正确注入,每一个需要注入类都需要添加 Autowire 注解
Unhandled exception type
原因:被强制异常处理的代码块,必须进行异常处理,否则编译器会提示“Unhandled exception type Exception”错误警告。
需要将代码写到 try catch 里!
MySQL
数据库乱码,前端乱码
sudo vim /etc/mysql/my.cnf
# 填写如下配置
[client]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
[mysql]
default-character-set = utf8mb4
nested exception is java.lang.NullPointerException] with root cause
Error attempting to get column ‘motion_id’ from result set
数据库字段类型与后端类型不一致
前端
digital envelope routines::unsupported
export NODE_OPTIONS=--openssl-legacy-provider
禁止跨域策略 (CORS policy)
node: –openssl-legacy-provider is not allowed in NODE_OPTIONS
unset NODE_OPTIONS
Unexpected character (’}’
请求的时候最后一个字段后面不要加逗号
The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard ‘*’ when the request’s credentials mode is ‘include’. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute
这个错误通常是因为在使用 XMLHttpRequest 对象进行跨域请求时,服务器返回的响应头中的 Access-Control-Allow-Origin 的值为*,但请求的 withCredentials 属性被设置为 true,这两者之间是相互冲突的。
XMLHttpRequest 对象具有 withCredentials 属性,如果设置为 true,它将在请求中包括来自其他域的 cookie 等凭据信息。但是,如果服务器在响应头中将 Access-Control-Allow-Origin 设置为*,浏览器会禁止访问这些凭据信息。这是一项安全保护措施,防止敏感信息泄露。
解决这个问题的方法是,在服务器端,将 Access-Control-Allow-Origin 设置为请求来源的域名,而不是使用通配符*。这可以让浏览器安全地发送凭据信息。
在前端,需要将 withCredentials 属性设置为 true,以便在请求中包含凭据信息。同时,需要确保请求的来源域名与服务器端设置的 Access-Control-Allow-Origin 一致。
如果你无法更改服务器端的设置,可以考虑使用代理或者 JSONP 等跨域解决方案。
VUE 项目端口不固定
Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘communityInfoController’
检查target/classes/mapper/DepartmentMapper.xml中的格式是否正确,检查引号是否多了,少了
<select id="findIdByOrgId" resultType="resultType="java.lang.Integer">
SELECT CAST(id AS UNSIGNED) AS id FROM department WHERE organization_id = #{orgId}
</select>
错误码
- 400-前后端参数对不上
{POST/GET} there is already xx bean method
NPM 启动:digital envelope routines::unsupported
export NODE_OPTIONS=--openssl-legacy-provider
npm run serve
The field file exceeds its maximum permitted size of 1048576 bytes
spring boot 上传文件时接口报错 The field file exceeds its maximum permitted size of 1048576 bytes.经排查官方设置每个文件的配置最大为 1Mb,单次请求的文件的总数不能大于 10Mb,上传大于 1Mb 的文件需要修改配置文件(application.properties) 1.Spring Boot 1.3.x 或者之前
multipart.maxFileSize=100Mb
multipart.maxRequestSize=1000Mb
2.Spring Boot 1.4.x 以后
spring.http.multipart.maxFileSize=100Mb
spring.http.multipart.maxRequestSize=1000Mb
3.Spring Boot 2.0 之后
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB
字段不存在
请求的时候字段名字和 java 中命名保持一直,而不是和数据库名字保持一样
数据库 communications link failure
配置请求超时时间
src/utils/request.js
Request method GET not supported
前端请求事件没有设置请求方式 post 还是 get
Invalid cros request
跨域
处理未来数据
https://www.bilibili.com/video/BV1U44y1W77D?t=1655.5&p=23
TIPS
前端保存代码需要等待一段时间生效
获取用户 IP
String userIp = request.getRemoteAddr();
解决方案:Java 实体类字段 不返回给前端
@JsonIgnore
@ApiModelProperty(value = "不重要")
@TableField(exist = false)
private String unimportant;
Dateutil 包
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
获取请求参数
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求参数
String queryString = request.getQueryString();
log.info("请求参数:{}", queryString);
}
后端设置 header 前端获取不到
# 必须要加这条字段控制能够获取的 header
response.addHeader("Access-Control-Expose-Headers","test");
response.addHeader("test", "sdfdsfdsf");
axios 请求
axios.get('http://opm.eswincomputing.com:9090/user/page')
.then(function (response) {
console.log(response.headers);
})
.catch(function (error) {
console.log(error.headers);
});
查询端口占用
lsof -i
lsof -i:8080:查看 8080 端口占用
打印输出
# Application.yml
logging:
level:
com.eswincomputing.springboot: debug
# 使用
@Slf4j
@RestController
@RequestMapping("/patch-record")
public class PatchRecordController {
@Resource
private IPatchRecordService patchRecordServic
log.info(version);
}
校验字符串是否为空
StrUtil.isBlank()
查询主键
SELECT id FROM department WHERE organization_id = #{orgId}
字符整型互转
Integer.parseInt(user.getDelFlag())
解析 json 字符串
<!-- json 解析 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.21</version>
</dependency>
JSONObject object = JSONObject.parseObject(patchRecord.getAttachmentList());
String fileUID = object.getString("file_uid");
String fileName = object.getString("file_name");
逗号分割字符串
String string = "张三,李四,王五,马六,小气";
String substring = string.substring(0, string.length() - 1);
System.out.println(substring);
String[] split = substring.split(",");//以逗号分割
for (String string2 : split) {
System.out.println("数据-->>>" + string2);
}