首页
统计
留言
Search
1
PHP中使用反射
996 阅读
2
phpstorm配置SFTP
940 阅读
3
Go语言——结构体
792 阅读
4
PhpStorm 使用 AI 代码生成工具 Codeium
787 阅读
5
关于PHP的垃圾回收机制
763 阅读
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
登录
Search
标签搜索
Laravel
Mysql
RPC
Redis
Liunx
PHP
CSS
ES
算法
开发工具
断点续传
反射
phpstorm
工具
防盗链
CURL
设计模式
面试
Nginx
搜索引擎
quhe.net
首页
栏目
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
页面
统计
留言
搜索到
57
篇与
quhe.net
的结果
2021-10-05
git commit 使用及规范
git commit 使用说明1 概述git提交推荐使用命令行工具,请严格遵循提交格式。2 提交格式在您git add后,推荐执行git commit进行提交,如无特殊描述信息要添加,也可以git commit -m <mess>进行提交。要求提交格式如下:<type>(<scope>): <subject> <BLANK LINE> <body> <BLANK LINE> <footer> type表示提交类别,scope表示修改范围,subject表示标题行, body表示主体描述内容。2.1 type说明type在commit -m 里也必须存在type:xxx。feat: 添加新功能fix: 修复bugdocs: 仅仅修改了文档style: 仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑refactor: 代码重构,没有加新功能或者修复bugperf: 优化相关,比如提升性能、体验test: 增加测试用例chore: 改变构建流程、或者增加依赖库、工具等revert: 回滚到上一个版本2.2 scope说明非必填(建议填写),scope用于说明 commit 影响的范围,建议填写影响的功能模块。如果你的修改影响了不止一个scope,你可以使用*代替。2.3 subject说明必填, commit 目的的简短描述,不超过50个字符。以动词开头,使用第一人称现在时,比如change,而不是changed或changes第一个字母小写结尾不加句号2.4 body说明非必填(建议填写),可描述当前修改的行为详细信息或修改的目的。2.5 footer说明非必填,一般用于描述BREAKING CHANGE,在项目开发中一般不需要填写,组件研发的工程需要填写。格式:以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。3 提交方式如上2所示格式,本质上是改变文件 .git COMMIT_EDITMSG 中的文本,实际提交过程如下(推荐命令行提交):3.2 cmd(notepad)window系统下默认git编辑工具是vim,如无相关基础,建议使用window默认的文本编辑器(这里不赘述vim相关编辑方法)。修改git默认文本编辑器: git config core.editor notepad修改后执行git commit,会弹出文本编辑器。我们要按照规定的格式在注释前加入要提交的commit信息:feat(人员新增): 增加人员批量导入 - 增加批量报盘功能 - 增加人员报盘后结果查询功能 - 修改人员新增布局 然后保存并关闭,会提示如下信息:[master 756c07e] feat(人员新增): 增加人员批量导入 1 file changed, 2 insertions(+)在push完成后,gitlab的commit列表中会有如下信息:3.2 shell(GNU nano)提交方式在您执行git commit后,命令行会有如下显示:projectRoot/.git/COMMIT_EDITMSG # 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交 # 说明将会终止提交。 # # 位于分支 master # 您的分支与上游分支 'origin/master' 一致。 # # 要提交的变更: # 修改: CHANGELOG.md # # 未跟踪的文件: # .idea/ # [ 已读取 13 行 ] ^G 求助 ^O 写入 ^W 搜索 ^K 剪切文字 ^J 对齐 ^C 游标位置 ^X 离开 ^R 读档 ^\ 替换 ^U 还原剪切 ^T 拼写检查 ^_ 跳行如上所示,我们要按照规定的格式在注释前加入要提交的commit信息:feat(人员新增): 增加人员批量导入 - 增加批量报盘功能 - 增加人员报盘后结果查询功能 - 修改人员新增布局 输入完成后,根据快捷键提示,按ctrl + O,然后出现要修改的MSG文件名,按回车键。此时提示如下:[ 已写入 19 行 ]最后按ctrl + X提交完成,提示如下:[master 756c07e] feat(人员新增): 增加人员批量导入 1 file changed, 2 insertions(+)在push完成后,gitlab的commit列表中会有如下信息:
2021年10月05日
94 阅读
0 评论
2 点赞
2021-08-09
go build、go install、go get的区别
1.作用go build:用于 测试编译包有无错误 ,在项目目录下 生成可执行文件 ( 有main包 )。go install:主要用来生成库和工具。一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)。go get:相当于 git clone + go install2. 相同点都能生成可执行文件3. 不同点go build 不能生成包文件(.a), go install 可以生成包文件(.a,但是在mod模式下只会在编译中间缓存生成,不会生成到pkg目录下)go build 生成可执行文件在 当前目录下 , go install 生成可执行文件在 bin目录 下( $GOPATH/bin )
2021年08月09日
79 阅读
0 评论
1 点赞
2021-06-18
PHP实现无限级分类生成树结构
方法封装/** * @param $current_key string 当前编号 * @param $parent_key string 父级编号 * @param $array array 数据 * @return array */ public function getTreeList($current_key,$parent_key,$array){ //第一步 构造数据 $items = array(); foreach($array as $value){ $items[$value[$current_key]] = $value; } //第二部 遍历数据 生成树状结构 $tree = array(); foreach($items as $key => $value){ if(isset($items[$value[$parent_key]])){ $items[$value[$parent_key]]['children'][] = &$items[$key]; }else{ $tree[] = &$items[$key]; } } return $tree; }使用例子$arrayData=array( array('name'=>'小明','wbs_no'=>1,'p_wbs_no'=>0), array('name'=>'小王','wbs_no'=>2,'p_wbs_no'=>1), array('name'=>'小李','wbs_no'=>3,'p_wbs_no'=>2), ); $result=$this->getTreeList('wbs_no','p_wbs_no',$arrayData); 输出
2021年06月18日
50 阅读
0 评论
2 点赞
2021-06-09
Go的三种包管理方式(gopath,govendor,gomodule)
前言go语言的发展极其迅速,短短几年便已经历了高速变迁和进化,可能仅仅是几年前的项目,在现在的开发者眼中看起来都像是“上古时代”的产物。其中go的包管理方式就是其中一种,因为各种历史遗留原因导致目前go module、go path和go vendor三种包管理方式在各种项目中都有混杂使用,这篇文章主要来介绍下三种方式的区别和优缺点,现在的go项目该选择哪一种。先说结论,以目前的情况来说,更推荐选择go module。go path和go vendor都是在发展的过程中因为不适应需求逐渐被更好的包管理方式替代,所以也不能说目前的go module就一定是最佳选择,只能说是目前的最佳实践。两个命令go install xxx(安装xxx第三方二进制可执行文件 )go get xxx(下载xxx第三方依赖包并安装)简单说go install类似go build, 将生成的可执行文件放到【$GOPATH/bin】目录中。go get是下载并安装,即git clone+go install,将clone的源码放到【$GOPATH/src】中。需注意,go get从go 1.17开始官方不建议(deprecated)用于安装二进制可执行文件,并且从go 1.18开始不再支持。选项-d未来将成为默认参数,仅执行下载,不进行安装,这么做是为了更符合get的语义。所以安装二进制可执行文件推荐使用go install参见Deprecation of 'go get' for installing executables两个路径GOROOT:go的安装目录,类似java的jdk,存放一些内置的开发包和工具。GOPATH:go指定的工作空间,用于保存go项目的代码和第三方依赖包。可以通过go env查看go相关的环境变量三个包管理工具**go path【不推荐使用】go path是最早的依赖包管理方式(Go1.0),启用GOPATH模式(注意区分GOPATH模式和GOPATH路径,这是两个语境),要求将所有工程代码要求放在GOPATH/src目录下。在工程经过go build、go install或 go get等指令后,会将拉取的第三方xxx依赖包放在GOPATH/src目录下,产生的二进制可执行文件放在GOPATH/bin 目录下,生成的中间缓存文件会被保存在 GOPATH/pkg下。go path有什么问题呢?GOPATH模式下没有版本控制的概念,在执行 go get 的时候,获取的永远是最新的依赖包,下载到GOPATH/src,如果你有两个工程依赖一个包的v1和v2版本,则会发生冲突,因为 GOPATH 模式下两个工程内依赖的导入路径都是一样的,因此两个工程获取的都是v2版本。所以这个模式已经不推荐使用了。govendor【不推荐使用】在Go 1.5版本之后,Go 提供了 GO15VENDOREXPERIMENT 环境变量(Go 1.6版本默认开启该环境变量)和 Go vendor包管理工具,用于将 go build 时的应用路径搜索调整成为当前工程路径/vendor目录的方式,有效的解决了不同工程使用自己独立的依赖包问题。编译 Go 代码会优先从工程目录下的vendor目录先寻找依赖包,如果没有找到,然后GOPATH 中查找,都没找到最后在 GOROOT中查找。优势:因为将第三方依赖完全和工程整合,完全本地化,使得项目构建速度快,且可以工作在无法连接外网的CI/CD流程中。问题:放弃了依赖重用,使得冗余度上升。同一个依赖包如果不同工程想重用,都必须各自复制一份在自己的vendor目录下。而且有趣的是,在go vendor库的官方README文件已经推荐改用go module了。go module从Go1.11开始,官方推出Go module作为包管理工具,且从Go1.13开始为默认选择启用。GOMODULE模式下所有依赖的包存放在GOPATH/pkg/mod目录下,所有第三方二进制可执行文件放在GOPATH/bin目录下,且工程项目可以放在GOPATH路径之外,但要求项目中需要有go.mod文件(该文件通过go mod init命令初始化可以生成)。GOMODULE模式和GOPATH模式一样都指定了依赖包存放的位置,而不是如vendor模式放入工程内,区别在于GOMODULE的go.mod文件中记录了所依赖包的具体版本,既实现了工程之间重用依赖包,且解决了GOPATH模式下不同工程无法依赖同一个包的不同版本的问题。使用GO MODULE模式,需要先开启配置。在Go1.13之后,可以通过如下命令设置GO MODULE启用状态。export GO111MODULE=on GO111MODULE有三个可选值: on、off 和auto ,go 1.16之前默认auto,go 1.16之后默认onGO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。关于GO111MODULE有兴趣的可以参考这篇文章 【Why is GO111MODULE everywhere, and everything about Go Modules (updated with Go 1.17)】go mod命令go help mod查看相关帮助命令(govendor是第三方可执行文件,但是go mod命令是go自带的,不用额外go install)命令功能go mod init初始化当前文件夹,创建go.mod文件,事实上,如果你的环境中GO111MODULE=on,使用类似goland的工具创建工程会自动生成go.modgo mod tidy包整理(多的删去、少的拉取),使用之前自然是import了需要的库了go mod download下载依赖到本地(默认为 GOPATH/pkg/mod 目录)go mod vendor将依赖包复制到工程文件的vendor目录下在GO111MODULE=on且项目中包含go.mod文件时,执行go get xxx 或 go install xxx下载的包或者二进制可执行文件将放入GOPATH/pkg/mod目录和GOPATH/bin目录下。总结import后面的是目录包名和目录名没有关系,但是包名最好等于目录名同一个目录下只能有一种包名。import 后面的目录,如果不加./,直接xxx/xxx这种就是从goroot的src下面找下找,或者从gopath/pkg/mod(go mod模式时)、GOPATH/src(gopath)、或当前项目(gomod模式时其实就是以gomod里定义的当前项目名开头)。如果加了./(只能在非go.mod模式下使用),就是从当前文件目录查找go.mod 里的module就是当前项目的包名(目录名)Go mod模式下,第三方包在gopath/pkg/mod ;gopath模式下,第三方包在gopath/src下。
2021年06月09日
78 阅读
0 评论
1 点赞
2021-04-09
PHP下载文件的三种方式
1、直接添加文件链接<button> <a href = "http://localhost/demo.zip">下载文件</a> </button>点击该按钮下载:2、传递参数查找并跳转到下载链接传递参数:<button> <a href = "http://localhost?f='down'">下载文件</a> </button>查找文件并挑战到下载链接:<?php $down = $_GET['f']; //获取文件参数 $filename = $down.'.zip'; //获取文件名称 $dir ="demo/"; //相对于网站根目录的下载目录路径 $down_host = $_SERVER['HTTP_HOST'].'/'; //当前域名 //判断如果文件存在,则跳转到下载路径 if(file_exists(__DIR__.'/'.$dir.$filename)){ header('location:http://'.$down_host.$dir.$filename); }else{ header('HTTP/1.1 404 Not Found'); }文件存在文件不存在3、head() 和 fread()函数把文件直接输出到浏览器<?php $file_name = "down"; $file_name = "down.zip"; //下载文件名 $file_dir = "./down/"; //下载文件存放目录 //检查文件是否存在 if (! file_exists ( $file_dir . $file_name )) { header('HTTP/1.1 404 NOT FOUND'); } else { //以只读和二进制模式打开文件 $file = fopen ( $file_dir . $file_name, "rb" ); //告诉浏览器这是一个文件流格式的文件 Header ( "Content-type: application/octet-stream" ); //请求范围的度量单位 Header ( "Accept-Ranges: bytes" ); //Content-Length是指定包含于请求或响应中数据的字节长度 Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) ); //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。 Header ( "Content-Disposition: attachment; filename=" . $file_name ); //读取文件内容并直接输出到浏览器 echo fread ( $file, filesize ( $file_dir . $file_name ) ); //可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。 fclose ( $file ); exit(); }总结:第一个和第二个操作比较简单,但是容易暴露文件的真实地址,安全性不高,第三种能够较好的把文件的真实地址隐藏起来
2021年04月09日
25 阅读
0 评论
0 点赞
1
...
5
6
7
...
12