目录
正则表达式
修饰符
修饰符 | 含义 |
---|---|
i | ignore - 不区分大小写 |
g | global - 全局匹配 |
基本字符匹配规则
字符 | 描述 |
---|---|
[ABC] | 匹配A或B或C |
[A-Z] | 匹配字符A或B或C或…或Z |
. | 匹配除换行符(\n、\r)之外的任何单个字符,要匹配. 使用转义字符\. |
\d | 匹配数字0-9 |
\s | 匹配所有空白符,包括换行 |
\S | 匹配所有非空白符,包括换行 |
\w | 匹配字母、数字、下划线,等价于 [A-Za-z0-9_ ] |
\t | 匹配制表符 |
\r | 匹配回车符 |
\n | 匹配换行符 |
特殊字符
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\ ( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用\ +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用\ . 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用\ [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用\ ?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用\^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
限定符
字符 | 描述 |
---|---|
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,不能匹配“Booob”,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
去除字符串中的所有空格
str.replace(/\s/g, '')
去除左右空格
str.replace(/(^\s*)|(\s*$)/g, '')
JavaScript
修改对象数组里的对象属性名
1)JSON.stringify()把json对象转成json字符串;
2)使用正则的replace()方法替换属性名;
3)JSON.parse()把json字符串又转成json对象。
修改多个属性:当要修改多个属性名时,多次调用replace方法,可以链式调用
Promise对象
Promise 执行了.then 又执行了.catch的原因
Promise会自动捕获内部异常,.then函数中如果有异常代码,Promise就会自动捕获,这样就会造成不仅执行了.then函数又执行了.catch函数的现象。
也就是说.catch不仅对Promise对象的异步操作内容本身的异常进行捕获,也会捕获resolve或rejected或.then回调函数中的错误。
常用数字操作
// 1.只保留整数部分(丢弃小数部分)
parseInt(5.1234);// 5
// 2.向下取整(<= 该数值的最大整数)和parseInt()一样
Math.floor(5.1234);// 5
// 3.向上取整(有小数,整数就+1)
Math.ceil(5.1234);
// 4.四舍五入(小数部分)
Math.round(5.1234);// 5
Math.round(5.6789);// 6
// 5.绝对值
Math.abs(-1);// 1
// 6.返回两者中的较大值
Math.max(1,2);// 2
// 7.返回两者中的较小值
Math.min(1,2);// 1
// 8.随机数(0-1)
Math.random();
// 9.进行四舍五入并设置要保留的小数位数,toFixed返回的是字符串,如果需要number,调用parseFloat
parseFloat( (1.01 + 0.1).toFixed(2) )// 1.01
常用数组操作
// 消息字符反转
this.message.split("").reverse().join("")
// 给数组添加数据
// 1.push方法,向数组的末尾添加数据
arr.push('a','b');
console.log(arr); // a,b
// 2.unshift方法,向数组的开头添加数据
arr.unshift('1');
console.log(arr); // 1,a,b
// 删除数组数据
// 1.pop方法,删除数组末尾的一个数据
arr.pop();
console.log(arr); // 1,a
// 2.shift方法,删除数组开头的一个数据
arr.shift();
console.log(arr); // a
// 更改数组数据
// splice方法的第一个参数是要删除或添加元素的位置,第二个参数是要删除元素的个数,第三个及以后的参数是要添加的元素。
// 该方法会改变原数组
arr.splice(0,1,'a','b','c');
console.log(arr); // a,b,c
// 数组的查询提取
// slice方法的第一个参数是提取元素的开头下标(包含),第二个参数是提取元素的结尾下标(不包含)
// 注意的是slice方法只是提取数据,并不会改变原数组。
var arr1 = arr.slice(0,2);
console.log(arr1); // a,b
console.log(arr); // a,b,c
Cookie、SessionStorage操作
/**
* 设置cookie
*
*----------Cookie属性项说明----------
* NAME=VALUE 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
* Expires 过期时间,在设置的某个时间点(ms)后该 Cookie 就会失效(不指定该属性值或者属性值
* 小于0时,cookie生命周期为会话周期;指定为0时,cookie无效,代表立即删除该cookie)
* Domain 生成该 Cookie 的域名,如 domain="www.baidu.com"
* Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/
* Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie
*
* @param cname 键名
* @param cvalue 键值
* @param exhours 过期时间(小时)
**/
function setCookie(cname, cvalue, exhours) {
let cookieStr = cname + "=" + cvalue
// 当hours>0时,该cookie存在指定时间;等于0时代表立即删除该cookie;小于0时该cookie会存在至会话结束
if (exhours === 0) {
cookieStr += "; expires=0"
} else if (exhours < 0) {
cookieStr += "; expires=-1"
} else {
// 设置过期时间
let expires = new Date()
expires.setTime(expires.getTime() + exhours * 60 * 60 * 1000)
cookieStr += "; expires=" + expires.toUTCString()
}
// 设置cookie
document.cookie = cookieStr
}
/**
* 获取指定名称的cookie的value值,失败返回null
*
* @param cname 键名
**/
function getCookie(cname) {
// 读取cookie时cookie的字符串结构为“name1=value1; name2=value2”
// (^| ) 匹配cookie字符串开头或者cname前的空格
// ([^;]*) 匹配=号到cookie字符串结束或者;之间的内容
// (;|$) 匹配cookie字符串结束或者;
let reg = new RegExp("(^| )" + cname + "=([^;]*)(;|$)")
let cookieStr = document.cookie
if (cookieStr !== "") {
let arr = cookieStr.match(reg)
if (arr === null) {
return null
}
if (arr[2] !== "") {
return arr[2]
}
}
return null
}
/**
* 将信息存入session(所给信息为json对象,存储格式也为键值对模式)
*
* @param jsonObj json对象
**/
function saveData2Ses(jsonObj) {
// 遍历json对象并进行存储
for (let key in jsonObj) {
// 验证jsonObj是否拥有此属性
if (jsonObj.hasOwnProperty(key)) {
let value = jsonObj[key]
if (value instanceof Object) {
// 要存储的是对象,将其转换为json字符串再进行存储
window.sessionStorage.setItem(key, JSON.stringify(value))
} else {
window.sessionStorage.setItem(key, value)
}
}
}
}
常用时间戳操作
/**
* 将时间戳转换为时间,格式为yyyy-MM-dd HH:mm:ss
* 时间戳为10位(s)需*1000,时间戳为13位(ms)的话不需乘1000,默认时间戳单位为ms
*
* @Param timestamp 时间戳
**/
function timestampToTime(timestamp) {
if (timestamp === undefined || timestamp === null || timestamp === '') {
return
}
let date = new Date(timestamp)
let yyyy = date.getFullYear() + '-'
let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
let dd = date.getDate() + ' '
let HH = date.getHours() + ':'
let mm = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':'
let ss = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds())
return yyyy + MM + dd + HH + mm + ss
}
Git
两种merge方式
gitlab网页上的merge操作如果出现冲突,则会要求手动修改冲突文件并向源分支提交的方式解决冲突,从而使源分支和目的分支互相合并
在本地执行的merge操作则会在目的分支出现冲突,可以通过修改目的分支并提交到目的分支解决冲突,不影响源分支
本地merge
首先将源分支和目标分支同步远程仓库:git fetch origin
切换到目的分支执行:git merge --no-ff 源分支名
如果没有冲突,则执行:git commit
并push
,合并完成
如果出现冲突,则执行:git status
查看冲突文件,解决冲突之后commit
并push
,合并完成
常用命令
//与远程仓库同步信息
git fetch
// 查看本地分支情况
git branch
// 查看所有分支
git branch -a
// 查看所有分支以及分支追踪情况
git branch -vv
// 创建本地分支
git branch 分支名
// 当远程分支不存在本地分支时,创建并检出远程分支对应的本地分支,会自动设置远程追踪分支
git checkout 远程分支名
// 创建并检出本地分支
git checkout -b 分支名
// 删除分支
git branch -D 分支名
//允许合并不相关历史
git pull origin dev --allow-unrelated-histories
//设置本地分支的远程追踪分支
git branch --set-upstream-to=origin/分支名
//设置追踪分支之后pull、push命令的origin默认都是当前分支的远程跟踪分支
注意事项
当配置了ssh key免密登录之后,从远程仓库克隆项目时依旧提示输入密码,则检查是否是clone地址格式有误ssh@host:username/**/projectName.git
Spring相关
测试
springboot项目测试类必须和项目启动类在同一module下
springboot项目可以配置多个启动时使用的配置文件application-[配置名].yml,
启动设置的active profiles参数配置[配置名]即代表以哪个配置文件启动容器
传参
发送ajax请求时params数据中的对象为undefined,则url中不会出现该参数
@RequestParam用于指定请求路径参数,对应前端发送请求的params参数,可以指定多个参数
@RequestBody用于指定整个RequestBody的数据对象类型,对应前端发送请求的data参数
关于日期时间格式的处理
使用fastjson
在打印日志或其他操作的时候,需要将某个对象转为jsonString,其中日期格式我们希望使用自定义的格式化后的格式,方便查看及后续处理
Test test = new Test();
test.setDate(new Date());
// fastjson
JSON.toJSONStringWithDateFormat(test, "yyyy-MM-dd", SerializerFeature.WriteDateUseDateFormat);
fastjson转换包含date类型属性的对象时报错com.alibaba.fastjson.JSONException: For input string: "2020:12:12 13:02:19"
或com.alibaba.fastjson.JSONException: For input string: "时间戳或其他格式"
- fastjson 1.1.26版本存在date类型转换的bug,换成新版本就好
- pojo里面的date属性上要加注解,比如:
@JSONField(format="yyyy:MM:dd HH:mm:ss")
private Date samplingTime;
使用springboot内置jackson
# application.properties 直接修改即可
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
# 第一个设置就是使用24小时的时间格式;第二个设置就是设置时区为东八区,避免时间由后端传至前端时迟了八个小时
# 在bean中 在你想要格式化的属性上面使用@JsonFormat注解。
@JsonFormat
private Date modifyDate;
如果使用了extends
WebMvcConfigurationSupport方式配置,如果想要使用上面的方式配置时间格式,需要将extends
WebMvcConfigurationSupport替换为implements WebMvcConfigurer。
注解
作为Controller的类必须注解@Controller或者@RestController才能被容器识别(即使他所实现的接口打了注解)
maven多模块springboot项目打成jar包
没有具体代码,只是用来管理maven依赖的module中的pom,修改打包方式pom
有具体代码实现的module的pom,修改打包方式为jar
在根pom中添加以下build内容
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定Main Class为程序指定启动类做为全局的唯一入口 -->
<mainClass>你的主启动类全路径</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<!--把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Mybatis
当组成sql语句的参数类型只有一个且为String类型时,需要在接口方法参数前添加@Param("参数名")
注解,mapper文件中使用${参数名}
引用,不然会报There is no getter for property named "xxx" in class java.lang.String
错误
Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
错误:在你传递多个参数的时候,Mapper中需要使用@Param注解,如List<User> select(@Param("uuid")String uuid, @Param("name")String name);
There is no getter for property named "xxx" in class "xxx"
错误一般是mapper.xml文件中的实体类属性名拼写错误,也有可能是String参数类型引用方式错误
PageHelper分页
只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页,并且只有从 由原始查询结果集转换而来的Page对象 中才能获取正确的总条目数total和总页数pages,即不能对查询回来的结果集进行处理之后再转换为Page对象提取分页信息,应该先提取分页信息,再对数据进行处理,或者将查询结果集的拷贝拿去做处理
Mysql
select * from `xxx`
表名或字段名加反引号,以防 表名 和 字段名为 mysql 关键词,例如:order
数据库连接url的zeroDateTimeBehavior=convertToNull
参数,指定接受的时间格式错误时的处理办法为把错误的日期转换为null,代替了异常处理java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column XX to TIMESTAMP
,例:
spring.datasource.url=jdbc:mysql://localhost:3306/bingo?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
Navicat执行sql快捷键
Ctrl + R
运行查询窗口的SQL语句
Ctrl + Shift + R
只运行选中的SQL语句
Maven
dependencies与dependencyManagement
一般在我们项目顶层的POM文件中,我们会看到dependencyManagement元素,通过它来管理jar包的版本,让子项目中引用一个依赖而不用显式的列出版本号,Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入并默认被所有的子项目继承。
参考:https://blog.csdn.net/liutengteng130/article/details/46991829
跳过测试
mvn clean compile package [install] -Dmaven.test.skip=true
或
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
设置jdk版本和项目编码
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Maven中模块显示灰色
使用idea搭建maven多模块项目时容易出现maven模块莫名其妙被忽略的问题(猜测可能是之前被删除过的模块重新创建之后就会被默认忽略),即在右侧的maven工程目录中某个工程变成了灰色,导致该模块中的依赖全部报红
解决办法
- 直接在灰色目录上右键unignore projects即可
- 打开maven设置,在ignored files中找到被忽略项目取消选中apply即可
NodeJS
快速删除node_modules文件夹
在全局安装rimraf模块,然后通过其命令来快速删除node_modules目录
npm install rimraf -g
rimraf node_modules
Vue
vue 实例对象中的异步回调函数参数必须使用箭头函数
箭头函数的this指向为创建时所在对象,即当前vue实例对象
使用function声明的函数this指向为函数运行时上层对象,因为是异步,所以当回调函数运行时处于独立运行环境,其上层对象为window对象,即此时this指向window对象
Element-ui
对集中分布的input元素排列布局,可以使用<el-row>
结合<el-col :span="11" :offset="1">
进行布局设置
分页问题
分页组件中的page-size属性是指每页显示条目个数,而不是实际查询到的某页条目个数,例:
:total="40"
:page-count="4"
:page-size="10"
如果使page-size=“1”,则page-count会变为40,页码会变为40页
input输入框长度统一
select默认不是100%宽度的,加个size-full的类,宽度写成100%,在需要用100%宽度的时候给select加上
编码注意事项
对象的判空要先判断是否是null然后是否为空
软件/工具版本问题
node.js 15.0.1
版本可能在特定环境下存在依赖安装失败的bug,推荐安装14版本
maven 3.6.3
与Idea 2018
有冲突,会报错不能正常运行
mysql-connector-java.jar 5.0.*
有bug,推荐使用5.1.*以上版本
springboot项目整合thymeleaf配置无误但是访问视图404,检查springboot版本和thymeleaf版本是否匹配
Idea
关于IDEA突然不识别yml文件解决方案
之前idea还能识别yml文件,突然不能识别了,在setting-file types-text中有了application.yml删除即可使用
Restful 接口规范
URL规范
1. 驼峰式命名
4. URL中的名词表示资源集合,使用复数形式
请求类型约定
GET:读取(Read)
POST:新建(Create)
PUT:更新(Update)
DELETE:删除(Delete)
常见错误状态码
404请求资源找不到(not found)
500服务器内部错误(Internal server error)
403错误原因:请求路径错误、跨域注解问题
400表示bad request,一般是请求参数有问题,如类型不匹配,json数据格式有误