我的学习(踩坑)记录

正则表达式

修饰符

修饰符含义
iignore - 不区分大小写
gglobal - 全局匹配

基本字符匹配规则

字符描述
[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 commitpush,合并完成
如果出现冲突,则执行:git status查看冲突文件,解决冲突之后commitpush,合并完成

常用命令

//与远程仓库同步信息
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: "时间戳或其他格式"

  1. fastjson 1.1.26版本存在date类型转换的bug,换成新版本就好
  2. 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>

参考:https://blog.csdn.net/baidu_41885330/article/details/81875395?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

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工程目录中某个工程变成了灰色,导致该模块中的依赖全部报红

解决办法

  1. 直接在灰色目录上右键unignore projects即可
  2. 打开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.3Idea 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数据格式有误

参考:https://www.restapitutorial.com/

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页