摘要:
最开始的解析命令行参数是使用的标准库里面的flag包,后来想增加新的参数的时候比较复杂和困难,因此使用cobra更加简单一些 比如执行go-fly server port 8081是运行项目 执行go-fly install是导入数据库 目录结构: 增加cmd目录,作为cmd包,代码中直接定义全局变 阅读全文
摘要:
实现gofly客服的过程中遇到的问题 gorm在插入完成数据后,想要获取插入的自增id ,可以使用Create()方法执行插入,在结构体里直接就能获取到ID 例如下面这个User type User struct { Model Name string `json:"name"` Password 阅读全文
摘要:
整体的流程图如下: 访客首次访问是通过websocket ,注册成一个新的用户 ,websocket的连接存储在全局变量clientList这个map里面 , key就是访客id ,value是连接 客服登陆也是通过websocket,把连接存储在全局变量kefuList这个map里 , key是客 阅读全文
摘要:
在做gofly客服的上传图片部分时,需要在gin框架中实现上传图片,并且限制文件的后缀 上传文件在gin中比较简单,就是在http处理函数里面调用c.SaveUploadedFile()就可以了 需要实现限制文件后缀,自动创建按照月份的上传目录,生成新的文件名字避免冲突被覆盖 完整代码如下 ,上传目 阅读全文
摘要:
简单原理: 选择一个值作为最小值,在后面的元素中找比它还小的值进行交换 //选择一个最小值,再寻找比它还小的进行交换 func SelectionSort(arr *[]int){ for i:=0;i<len(*arr);i++{ minIndex:=i for j:=i+1;j<len(*arr 阅读全文
摘要:
下面代码放在models包下的users.go中 表结构和struct字段是一致的,把表字段的下划线变成首字母大写的驼峰命名 创建,查找,删除,更新用户,见下面的具体方法 package models import ( _ "github.com/jinzhu/gorm/dialects/mysql 阅读全文
摘要:
登录界面如果要实现响应式 , 需要注意宽度的设置和media query的使用 宽度一般都是按百分比设置,当页面中百分比也满足不了的时候,可以使用media query区分出当前屏幕的宽度 根据不同的屏幕宽度设置不同的css 例如下面gofly的这个登录页 , 访问地址 : https://gofl 阅读全文
摘要:
核心思路: 将数组分成已排序和待排序两部分,将一个元素从待排序插入到有序数组的适当位置,直到所有待排序都插入完成 把第一个元素作为已排序数组,将后面的元素依次与已排序元素从后往前进行比较,如果当前元素小于有序数组元素,有序数组元素往后挪1位,直到大于了就插入到有序数组元素后面 //插入排序 func 阅读全文
摘要:
核心原理: 比较相邻的两个元素,较大的一个交换移动到右边 优化: 已经排好序的元素不再进行比较,减少比较次数 下面函数的变量flag 用于判断后续元素有无发生交换,没有发生交换的直接停止遍历 变量lastSwapIndex ,记录最后一次发生交换的位置,后续元素不再进行比较 //冒泡排序 func 阅读全文
摘要:
原理很简单,就是用php输出一个header头,可以直接让浏览器下载文件 单元格内容用英文逗号分隔, 其中为了防止乱码,汉字部分会进行一个转码操作,从utf8转为gbk 为了使单元格看起来直观一点,会增加个\t ,这样就不会看的时候出现######### 比如下面这个把moveusers数组作为cs 阅读全文
摘要:
快速排序思路: 1. 第一个数作为基准数,找到所有比基准数小的放在左边 ,找所有比基准数大的放右边 2.两个指针 ,一个从前往后 i,一个从后往前 j,i找到比基准数大的停下 , j找到比基准数小的停下 , 两个数调换位置,直到两数相遇 3.调换基准数与i/j位置 4.递归 , 从0到基准数位置 , 阅读全文
摘要:
在使用长连接的过程中,如果有的长连接一直连着,想要杀掉这条连接可以使用tcpkill命令 安装tcpkill , tcpkill使用dsniff的一个小工具 apt install dsniff 使用过程: 比如连接服务端8082端口的这条连接 杀掉连接, 过滤规则类似tcpdump tcpkill 阅读全文
摘要:
结论:count(*)>count(1)>count(主键id)>count(字段) 原因:count(*)单独做过优化,只扫描普通索引树,并且不会取值,按行累加count(1)遍历表放一个数字“1”进去,判断是不可能为空的,按行累加count(主键id)遍历表,解析数据把id值取出来,按行累加co 阅读全文
摘要:
在执行go test命令的时候,如果是测试同一个包中的函数,需要把所涉及的文件都写在参数部分 例如: 涉及的文件不多,可以把文件都写上一同编译 如果涉及的文件太多,直接在包下执行go test 阅读全文
摘要:
快速排序首先选一个基准(你也可以认为是要放到排序后数组正确位置的元素)pivot,然后将数组按照选取的基准 pivot 进行划分。而选取 pivot 的方式又有很多种,所以快速排序具有很多版本。 总是选择第一个元素作为基准 pivot;总是选择最后一个元素作为基准;(本文后续的实现就是依次为例)随机 阅读全文
摘要:
gofly最近准备完善对外的js引用功能,类似很多知名客服系统那样直接引入js就可以使用,现在只是简单的实现了下 代码在github,可以在页面上看到, gofly地址在这里 https://gofly.sopans.com/ , 开发和部署方式在github的readme.md 首先要申请js权限 阅读全文
摘要:
当需要实现守护进程 , 以及自己开发的命令自动崩溃重启时,可以使用go版本的supervisord , 比python版本依赖少一些 git clone https://github.com/ochinchina/supervisord.gitenv GOOS=linux GOARCH=amd64 阅读全文
摘要:
在实现客服系统的过程中,需要有新消息的时候标题栏闪烁提示 因为聊天框是被iframe框进去的页面,所以在聊天框中收到websocket消息以后要把消息发送给父集页面,在父页面中闪烁标题 测试页面地址: https://gofly.sopans.com/ 子页面发送到父页面的实现是,在父页面增加消息监 阅读全文
摘要:
当我们使用了websocket技术实现了实时的推送访客来到消息,但是我们只能随时看着页面不离开才能知道有访客来到 现在增加浏览器的通知消息,就可以只要打开着界面,不用一直盯着,干别的事去就可以了,有新消息会从右下角弹出来 测试地址如下,当有访客点击咨询按钮时,客服后台会弹出提示: https://g 阅读全文
摘要:
我的域名是在阿里云万网上购买的,服务器是部署在腾讯云上,可以按照下面的步骤配置https 首先登陆阿里云网站控制台,申请免费证书,免费证书只能单一域名。测试地址如:https://gofly.sopans.com/ 申请稍等几分钟就能通过 把证书下载到本地,然后上传到腾讯云的服务器上,配置nginx 阅读全文
摘要:
如果项目中需要有多语言的展示,类似网站中英文切换,可以使用下面这个方法来实现 主要思路就是,页面html内容展示的时候,不能固定写死在页面上,需要从控制器部分分配过来变量,展示输出这个变量 这个变量的内容来自一个结构体的成员,该结构体在创建实例的时候,可以根据传递参数的不同,实例的成员内容不同 实际 阅读全文
摘要:
各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换。 进程是由内核管理和调度的,所以进程的切换只能发生在内核态。所以,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了 阅读全文
摘要:
update语句是如何执行 , 如何将执行后的新数据持久化在磁盘中 可以假设两种情境: 1. 假设MySQL在更新之后只更新内存中的数据就返回,然后再某一时刻进行IO将数据页持久化。这样所有操作都是在内存中,可以想象此时的MySQL性能是特别高的。但是,如果在更新完内存又还没有进行持久化的这段时间, 阅读全文
摘要:
转载自鸟哥博客 , 原文地址: https://www.laruence.com/2020/06/27/5963.html PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样? 首先,我们来看一张图: 左图是PHP8之前的Opcac 阅读全文
摘要:
memcache作为key-value的内存缓存数据库 , 使用简单 , 运行稳定 , 在redis之前一直大量使用 , 新浪企邮webmail中也大量使用 共享session 在有多台后端负载服务器的情况下,php默认的文件存储session就不适用了,因为用户在访问的时候会访问到后端不同机器 , 阅读全文
摘要:
基于GO语言实现的web客服即时通讯与客服管理系统。 1.使用gin http框架实现restful风格的API 2.使用jwt-go配合gin中间件实现无状态的jwt登陆认证 3.使用casbin配合gin中间件实现权限控制 4.使用gin以及template包的模板语法进行展示界面 5.使用go 阅读全文
摘要:
php8的jit需要在编译opcache扩展的时候进行手动开启 比如我php8源码目录在此: /home/ubuntu/myphp/php-8.0.0alpha1/ext/opcache 执行 ./configure --enable-opcache-jit --with-php-config=/u 阅读全文
摘要:
上次编译完php8 , 发现opcache扩展没有安装,那么就进入到源码目录下的ext目录执行phpize 比如我解压缩后的源码目录是 /home/ubuntu/myphp/php-8.0.0alpha1/ 进入 /home/ubuntu/myphp/php-8.0.0alpha1/ext/opca 阅读全文
摘要:
在配置php的过程中经常遇到不知道php.ini文件在哪,以及不知道哪一个php.ini在起作用,改动了配置后依然不生效 可以有下面的方法去查找 php -i|grep php.ini strace -e open php -m 在这个命令里去查看php命令打开了哪个php.ini文件,非常的精确 阅读全文
摘要:
nginx配置http块中增加 client_max_body_size 200m; php-fpm的php.ini配置文件中增加: upload_max_filesize = 200M 如果不知道fpm下的php.ini在哪,可以直接grep upload_max_filesize -R /etc 阅读全文
摘要:
(麻烦各位转载请注明出处和地址:陶士涵的菜地 , 谢谢 --2020年6月28日) 所有操作需要在root用户下本机测试案例系统信息:ubuntu安装路径:/usr/local/php8 解压缩: wget https://downloads.php.net/~pollita/php-8.0.0al 阅读全文
摘要:
编译安装php时,如果--enable-mbstring , 开启了mbstring扩展,需要这个正则处理库 centos yum install http://rpms.remirepo.net/enterprise/7/remi/x86_64//oniguruma5-6.9.4-1.el7.re 阅读全文
摘要:
据PHP官网的消息: PHP 8.0.0 Alpha 1可用于测试 2020年6月25日 PHP团队很高兴宣布PHP 8.0.0的第一个测试版本Alpha1。这将启动PHP 8.0的发布周期,其粗略概述在PHP Wiki中进行了指定。 有关PHP 8.0.0 Alpha 1的源代码下载,请访问下载页 阅读全文
摘要:
默认的wireshark是不能监听到127.0.0.1的网络通信的 , 需要安装一个软件就可以了 先安装这个npcap , 他会卸载本地原来的wincap等 , 不需要管. https://nmap.org/npcap/#download 然后重新打开wireshark , 就可以看到下面这个 这个 阅读全文
摘要:
滑动窗口短信发送限流算法 1.有两条规则 基于IP的限制和基于手机号的限制 IP规则: 1分钟限制5 10分钟限制30 1小时限制50 手机号规则: 1分钟限制1 10分钟限制5 1小时限制10 2.滑动窗口就是随着时间的流动 , 进行动态的删减区间内的数据 , 限制时获取区间内的数据 最主要的是用 阅读全文
摘要:
代码的包结构是在GOPATH环境变量目录中新建了bin src pkg三个目录 如果代码放在了github里 , 那么就在src目录下新建的 github.com/用户名/仓库名 这个目录下进行开发工作 gin框架现在已经更新到了1.6.0 , 对于后端开发打造restfull 的API接口 ,非常 阅读全文
摘要:
在文档里有直接渲染一个html的文件 , 但是我的需求是渲染html的字符串 , 因为我的html要打包进二进制 , 不能只是外部文件的形式 engine := gin.Default() //登陆界面 engine.GET("/login",controller.PageLogin) engine 阅读全文
摘要:
当使用golang开发一个网站时 , 一般是需要部署下静态文件的资源 ,go只是提供接口 , 打包完的go二进制文件不包含静态文件资源 但是当做一个小型的应用时还要再部署静态资源显得比较麻烦 , 这个时候可以使用packr这个包来把静态资源直接打包进二进制里 包的github地址是 https:// 阅读全文
摘要:
js中进行测试捕获正则小括号中的子表达式,可以用下面这个捕获组来实现 捕获组的定义:捕获组简单来说就是把正则表达式中用括号匹配的内容,保存到内存中,方便调用。js中每一个括号匹配的内容可以被RegExp对象捕获到(最多匹配九个,可以通过返回一个数组索引来取得所有的括号匹配项.),存储在RegExp. 阅读全文
摘要:
在查看一篇滑动窗口实现的限流算法时 , 代码中使用的redis , 就使用到了这个命令 目的是删除集合中范围以外的元素 但是在看文档的时候,文档中的实例令人不能理解 这里的alpha和omega是啥意思 , 完全看不懂 ,也没有地方解释 ,如果是按名称范围删除 从alpha开始删 ,omega不存在 阅读全文