1、JAVA
1、使用Java
自带的jar
命令,压缩war
包
jar -cvf app.war *
# c是单词compress(压缩)的缩写
2、使用Java
自带的jar
命令,解压war
包
jar -xvf app.war
3、Java
判断是否都为数字
String str = "ac123";
System.out.println(Pattern.compile("[0-9]*").matcher(str).matches());
4、JVM
调优参数示例(对应IDEA/VM options
配置项)
-Xms128m -Xmx2048m -XX:MaxNewSize=512m -XX:MaxPermSize=1024m -Dfile.encoding=utf-8
5、Nashorn
引擎的使用
@Test
public void Nashorn() throws ScriptException, NoSuchMethodException {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
// NashornEngine(JavaScript)
ScriptEngine engine = scriptEngineManager.getEngineByName("Nashorn");
String path = "script/test.js";
ClassPathResource resource = new ClassPathResource(path);
FileReader reader = null;
try {
reader = new FileReader(resource.getFile());
engine.eval(reader);
} catch (Exception e) {
logger.error(e.getCause().getMessage());
e.printStackTrace();
} finally {
IOUtils.close(reader);
}
Invocable invocable = (Invocable) engine;
Map<String, String> map = new HashMap<>();
map.put("name", "Java");
Object mappingData = invocable.invokeFunction("getMappingData", map);
System.out.println(mappingData);
}
// 参数转换
public static Object toObject(Object scriptMirror) {
ScriptObjectMirror mirror = (ScriptObjectMirror) scriptMirror;
if (mirror.isEmpty()) {
return null;
}
if (mirror.isArray()) {
List<Object> list = new ArrayList<>();
for (Map.Entry<String, Object> entry : mirror.entrySet()) {
Object result = entry.getValue();
if (result instanceof ScriptObjectMirror) {
list.add(toObject(result));
} else {
list.add(result);
}
}
return list;
}
Map<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : mirror.entrySet()) {
Object result = entry.getValue();
if (result instanceof ScriptObjectMirror) {
map.put(entry.getKey(), toObject(result));
} else {
map.put(entry.getKey(), result);
}
}
return map;
}
6、some功能封装
private <T> Optional<T> some(Iterable<T> iterable, java.util.function.Predicate<? super T> predicate) {
if (iterable != null) {
for (T t : iterable) {
if (predicate.test(t)) {
return Optional.of(t);
}
}
}
return Optional.empty();
}
2、Linux
1、Linux
查看某文件夹占用空间大小,如logs
文件夹
du -h logs
2、Linux
查看当前目录下,各文件夹占用磁盘空间情况(查找当前目录下有那些大文件)
du -h --max-depth=1
3、Linux
查找当前目录下,文件大小超过指定阈值的文件
# 当前目录查找1G以上的文件
find . -type f -size +1024M -print0 | xargs -0 du -h
4、Linux
解压zip
文件
# 当前目录下解压
unzip tomcat.zip
# 解压到指定的文件夹中,文件夹不存在则创建
unzip tomcat.zip -d directory
5、修改文件的所有者
# 查看文件所有者
ls -ahl
# 修改文件所有者
chown [username]:[group] [file]
# 例如 chown -R app tomcat/
6、正确运行jar
包方式
# 以运行 cache-0.0.1-SNAPSHOT.jar 为例
nohup java -jar cache-0.0.1-SNAPSHOT.jar >app.log 2>&1 &
# 命令解释
nohup 子进程不受会话影响关闭当前会话也能继续执行(程序不被挂起)
>app.log 将控制台输出的数据重定向到app.log(缺省是nohup.log)
2>&1 将标准错误输出转变化标准输出 可以将错误信息也输出到日志文件中
& 在后台运行程序
# 查看运行日志
tail -f -n 500 app.log
# 如何结束进程
[app@suzhou-ydshp soft]$ ps -ef|grep java
app 45539 43669 6 10:45 pts/0 00:00:17 java -jar cache-0.0.1-SNAPSHOT.jar
app 45919 43669 0 10:50 pts/0 00:00:00 grep --color=auto java
[app@suzhou-ydshp soft]$ kill -9 45539
# jvm优化版
#!/bin/bash
nohup java -Xmx32g -Xms12g -Xmn12g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -jar app.jar --server.port=9020>> /dev/null 2>&1 &
7、查看系统版本号
cat /etc/redhat-release
# 如果操作系统是openEuler就用如下命令
cat /etc/os-release
3、PostgreSQL
1、看版本
SELECT VERSION();
# PostgreSQL 10.7, compiled by Visual C++ build 1800, 64-bit
2、LIMIT
用法
SELECT * FROM [TABLE_NAME] LIMIT A OFFSET B;
# 其中:B为其实索引 A为获取数据长度
3、当前信息查询
# role
SELECT * FROM CURRENT_ROLE
# user
SELECT * FROM CURRENT_USER
# 模式
SELECT * FROM CURRENT_SCHEMA
# 数据名称
SELECT * FROM CURRENT_CATALOG
# 时间日期
SELECT * FROM CURRENT_DATE
SELECT * FROM CURRENT_TIME
SELECT * FROM CURRENT_TIMESTAMP
4、删除模式
DROP SCHEMA [SCHEMA_NAME] CASCADE;
5、初始化
-- 初始化用户
create user huaian_ytgz
superuser
createdb
createrole
replication
bypassrls;
-- 修改稿密码
alter user huaian_ytgz with password 'huaian_ytgz';
-- 初始化数据库
create database huaian_ytgz
with owner huaian_ytgz;
4、ORACLE
1、GROUP BY
分组查询重复数据
SELECT P.FK_BUSINESS_ID FROM SW.TB_PROJECT P WHERE 1 = 1
GROUP BY P.FK_BUSINESS_ID HAVING COUNT(*) > 1;
2、查看ORACLE
版本信息
SELECT * FROM V$VERSION
3、ORACLE
查看sid_name
SELECT INSTANCE_NAME FROM V$INSTANCE;
4、把主键设置为自增,插入数据时就不用指定主键例如
ALTER TABLE TB_TEST MODIFY ID DEFAULT S_TB_TEST.NEXTVAL;
5、达梦
1、字段索引命名推荐(IDX1_字段名
)加上表名可避免索引名称重复
# ORACLE
CREATE INDEX LN.TB_USER ON LN.IDX1_USERNAME (USERNAME ASC);
CREATE INDEX LN.TB_USER ON LN.IDX2_PASSWORD (PASSWORD ASC);
CREATE INDEX LN.TB_USER ON LN.IDX3_AGE (AGE ASC);
# 达梦(加上表名避免索引名称重复)
CREATE INDEX TB_USER_IDX1_USERNAME ON LN.TB_USER(USERNAME) TABLESPACE LN;
CREATE INDEX TB_USER_IDX2_PASSWORD ON LN.TB_USER(PASSWORD) TABLESPACE LN;
2、开窗函数使用方式
# 达梦/ORACLE
SELECT
ROW_NUMBER() OVER(PARTITION BY PI.PID ORDER BY PI.ID DESC) AS RN,
PI.ID,
PI.ITEMID,
PI.ITEMNAME,
PI.UNITID,
PI.STATE
FROM LN.TB_PROJECTITEM PI
WHERE 1 = 1
AND PI.PID = 6978
# 可对 RN 灵活操作,例如一个集合中只取一条记录,去重等
6、VUE
1、lodash
工具库的使用
// 1.安装
npm install lodash@4.17.20 --save
// 2.main.js 引入
import _ from 'lodash';
Vue.prototype._ = _; // 挂载至原型属性
// 3.vc中使用
this._.filter(collection, item => item.id > 20);
2、eslint的使用(插件化的JavaScript代码检测工具)
# 安装eslint
pnpm install eslint -D
# 生成配置文件 .eslint.cjs
npx eslint --init
# 或者是
npm init @eslint/config
3、eslint下的vue3环境代码校验插件
pnpm install -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node @babel/eslint-parser
/*
+ @babel/eslint-parser 7.23.3 // 允许使用eslint校验所有babel code
+ eslint-config-prettier 9.0.0 // 让所有与perttier规则存在冲突的eslint rules失效 并使用prettier进行代码检查
+ eslint-plugin-import 2.29.0
+ eslint-plugin-node 11.1.0
+ eslint-plugin-prettier 5.0.1 // 允许更漂亮的eslint使prettier规则优先级更高 eslint优先级低
+ eslint-plugin-vue 9.19.2 // vue.js的eslint插件(查找vue语法错误发现错误指令,查找违规风格代码)
*/
.eslintrc.cjs
// @see https://eslint.bootcss.com/docs/rules/
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
jest: true,
},
/* 指定如何解析语法 */
parser: 'vue-eslint-parser',
/** 优先级低于 parse 的语法解析配置 */
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: '@typescript-eslint/parser',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true,
},
},
/* 继承已有的规则 */
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
plugins: ['vue', '@typescript-eslint'],
/*
* "off" 或 0 ==> 关闭规则
* "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行)
* "error" 或 2 ==> 规则作为一个错误(代码不能执行,界面报错)
*/
rules: {
// eslint(https://eslint.bootcss.com/docs/rules/)
'no-var': 'error', // 要求使用 let 或 const 而不是 var
'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unexpected-multiline': 'error', // 禁止空余的多行
'no-useless-escape': 'off', // 禁止不必要的转义字符
// typeScript (https://typescript-eslint.io/rules)
'@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量
'@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。
'@typescript-eslint/semi': 'off',
// eslint-plugin-vue (https://eslint.vuejs.org/rules/)
'vue/multi-word-component-names': 'off', // 要求组件名称始终为 “-” 链接的单词
'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的变量<template>被标记为未使用
'vue/no-mutating-props': 'off', // 不允许组件 prop的改变
'vue/attribute-hyphenation': 'off', // 对模板中的自定义组件强制执行属性命名样式
'prettier/prettier': 'off'
},
};
.eslintignore
dist
node_modules
4、SVG图标配置
使用SVG替换图片资源,可提示页面性能,因为SVG文件比img要小很多,放在项目上基本上不占用资源。
# 安装依赖
pnpm install vite-plugin-svg-icons --save
在vite.config.ts
中配置插件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
// process.cwd() 获取项目根路径(绝对路径)
const svgIconOption = {
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
symbolId: 'icon-[dir]-[name]'
}
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue(), createSvgIconsPlugin(svgIconOption)],
resolve: {
alias: {
"@": path.resolve("./src") // 相对路径别名配置使用@代替src 编译时需要将@转义回来,因此需要咋tsconfig.json新增转义配置
}
}
})
在main.ts
进行注册
import 'virtual:svg-icons-register'
在组件中使用
<svg>
<!--name为图标名称-->
<use xlink:href="#icon-name"></use>
</svg>
7、MediaType一览
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/avif avif;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/wasm wasm;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
8、maven
1、查看依赖树,当前pom.xml
文件层级执行以下命令
mvn dependency:tree>tree.txt
2、插件配置
<!--跳过Surefire插件执行单元测试文件(package/install)-->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
3、手动安装jar
包至本地仓库
mvn install:install-file -DgroupId=com.dist.product -DartifactId=dist-product-api -Dversion=5.0.8-SNAPSHOT -Dpackaging=jar -Dfile=dist-product-api-5.0.8-SNAPSHOT.jar
4、手动安装jar
包指定仓库
mvn install:install-file -Dmaven.repo.local=/Users/laizhenghua/soft/maven/repository -DgroupId=com.dist.flow.engine -DartifactId=dist-flow-awspaas -Dversion=5.0.8-SNAPSHOT -Dpackaging=jar -Dfile=/Users/laizhenghua/Downloads/dist-flow-awspaas-5.0.8-SNAPSHOT.jar
5、optional标签
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
<!-- 阻止依赖传递 -->
<optional>true</optional>
</dependency>
9、统一返回类封装
/**
* TODO
*
* @Description 统一返回类封装
* @Author laizhenghua
* @Date 2023/2/19 20:04
**/
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 563554414843661955L;
public R() {
put("code", 0);
put("msg", "success");
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R success(Object data, String msg) {
R r = new R();
r.put("code", 200);
r.put("data", data);
r.put("msg", msg);
r.put("success", true);
return r;
}
public static R success(Object data) {
return success(data, "success");
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
10、svn
1、查看修改文件状态
svn status | grep '^M'
2、查看当前svn
信息,如最后修改者、URL、工作副本根目录
svn info ./
11、常见索引失效场景
/*
1、使用 != 或 <>
2、最左前缀原则
3、字段类型不一致索引失效
4、函数导致索引失效
5、运算符导致索引失效(+,-,*,/,!)
6、OR 引起索引失效
7、模糊查询导致索引失效
8、NOT IN、NOT EXISTS 导致索引失效
9、IS NULL 不走索 IS NOT NULL 走索引
*/
12、git
1、提交基本命令
# 如果是第一次使用
# 1.进入文件目录初始化
git init
# 2.添加远程仓库地址
git remote add origin [git地址]
# 3.添加 .gitignore 文件
# 4.添加本地代码
git add .
# 5.提交本地代码
git commit -m "描述"
# 6.提交到远程库(推送到master分支)
git push origin master
# 1.更新本地仓库数据
git pull origin 分支名
add .
git commit -m "描述信息"
# 2.合并分支
# 如果当前分支的文件和远程仓库文件不统一(需要将远程仓库的文件同步到本地仓库后再merge)
git merge 要合并的分支名
# 3.提交合并后的数据
# 本地当前分支名与远程分支名一样
git push origin 远程分支名
# 本地当前分支名与远程分支名不一样
git push origin 本地分支名:远程分支名
# 4.1删除文件(跟踪列表+系统或本地)
git rm 文件路径及文件名
# 如果删除的文件在当前目录,输入文件名即可
# 4.2删除文件(跟踪列表)
git rm --cached 文件路径及文件名
# 5.查看git配置
cat .git/config
# 6.查看分支信息
# 本地
git branch -a
# 远程
git branch -r
2、GitLab配置SSH秘钥
# 1.查看全局配置(要确保信息正确)
git config --global --list
user.name=laizhenghua
user.email=laizhenghua@supermap.com
# 2.如果信息不正确时修改name和email
git config --global user.name "laizhenghua"
git config --global user.email "laizhenghua@supermap.com"
# 3.生成SSH key
ssh-keygen -t rsa
# 4.拷贝公钥
cat ~/.ssh/id_rsa.pub
13、Linux防火墙常用命令
# 开启防火墙
service firewalld start
# 关闭防火墙
service firewalld stop
# 查看防火墙状态
# systemctl status firewalld
firewall-cmd --state
# 查看防火墙开规则
firewall-cmd --list-all
# 查看防火墙控制规则
firewall-cmd --zone=public --list-rich-rules
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放8080端口 --permanent 代表永久
firewall-cmd --permanent --add-port=8080/tcp
# 移除开放的8080端口
firewall-cmd --permanent --remove-port=8080/tcp
# 开放所有ip
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" accept'
# 禁用 11.48.29.17 ip
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="11.48.29.17" reject'
# 移除 某个规则
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="11.48.29.17" port port="21" protocol="tcp" reject'
# 重启防火墙
firewall-cmd --reload
# service firewalld restart
firewall-cmd --permanent --add-port=21/tcp
14、常见的http状态码
/*
200 OK 表示从客户端发来的请求在服务器端被正常处理了。
204 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。
206 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET 请求。
301 该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。
302 该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
303 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
304 该状态码表示客户端发送附带条件的请求 时,服务器端允许请求访问资源,但未满足条件的情况。
400 该状态码表示请求报文中存在语法错误
401 该状态码表示发送的请求需要有通过 HTTP 认证的认证信息
403 该状态码表明对请求资源的访问被服务器拒绝了。
404 该状态码表明服务器上无法找到请求的资源。
500 该状态码表明服务器端在执行请求时发生了错误。
503 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
*/
15、SpringBoot
SpringBoot官网GA / SNAPSHOT / PRE
含义
/*
GA:General Availability 正式发布的版本,官方推荐使用此版本
SNAPSHOT:快照版,可以稳定使用且仍在继续改进版本
PRE:预览版,内部测试版,主要是给开发人员和测试人员测试和找BUG用的,不建议使用
*/