首页
关于
Search
1
2022最新WPS政府/教育版合集
3,283 阅读
2
欢迎使用 Typecho
3,100 阅读
3
thinkphp 做301重定向跳转
2,550 阅读
4
IDE 注册教程
2,383 阅读
5
nginx反向代理设置泛目录解析
2,372 阅读
源码
教程
HTML
JAVASCRIPT
PHP
MYSQL
系统
LINUX
WINDOWS
填坑
工具
登录
/
注册
Search
标签搜索
系统工具
内网穿透
PHPDesktop
TaurusCoders
累计撰写
52
篇文章
累计收到
1
条评论
首页
栏目
源码
教程
HTML
JAVASCRIPT
PHP
MYSQL
系统
LINUX
WINDOWS
填坑
工具
页面
关于
搜索到
52
篇与
iprub
的结果
2020-07-12
mysql 存储过程批量操作表字段详解
水平分表后需要批量操作表字段,一个一个去修改太笨太慢,因此研究了下面的运用存储过程来平凉操作。不多说直接上代码:DROP PROCEDURE IF EXISTS proc_tempPro;#首先判断是否声明了此名称的存储过程 CREATE PROCEDURE proc_tempPro();#声明存储过程 BEGIN DECLARE i INT;#定义变量 SET i=1;#变量赋值 SET @mtotal=0;#定义用户变量并赋值 SELECT COUNT(*) INTO @mtotal FROM `user` WHERE 1;#查询用户表的用户数并赋值给自定义的变量 SELECT @mtotal;#输出变量 ##循环操作水平分表 WHILE i<=@mtotal DO SET @tm = CONCAT('log',i);#拼接表名 ##判断字段是否存在 IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.`COLUMNS` WHERE table_schema= DATABASE() AND table_name=@tm AND column_name='guestlog_user_agent') THEN #拼接操作字段语句 SET @atd = CONCAT('ALTER TABLE ',@tm,' DROP `user_agent`;'); SELECT @atd; PREPARE catd FROM @atd;#预处理语句 EXECUTE catd;#执行语句 end if; SET i = i+1; END WHILE; END
2020年07月12日
830 阅读
0 评论
0 点赞
2020-07-05
thinkphp 做301重定向跳转
ThinkPHP怎么配置url的301跳转,永久转移很简单,只需要在目录下的.htaccess文件里面添加 第一种情况,是将整个网站所有地址都做301跳转RewriteCond %{http_host} ^luowebs.com [NC]RewriteRule ^(.*)$ http://www.luowebs.com/$1 [L,R=301]第二种情况,是网站特定的几个链接做301跳转#以前的页面链接是:A http://www.wolfcode.cn/newsWeb/newsDetail/1246.html#现在的页面链接是:B http://www.wolfcode.cn/article/index/id/526#我们要由A重定向到B;那么我们的规则就是:RewriteRule (.*)/article/index/id/526 http://www.wolfcode.cn/newsWeb/newsDetail/1246.html [L,R=301]301官方解释:(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。注意:不要在控制器用header去跳转if($_SERVER['SERVER_NAME']=='luowebs.com'){ header('Location: http://www.luowebs.com'.$_SERVER['REQUEST_URI']); exit(); }上面代码使用header做的跳转,这里同学们需要注意以下了,这代码这么写虽然能跳转,但是你去检测会发现这是302跳转不是301跳转哦,大家千万要注意啦!在tp5.0中可以直接使用redirect来做301跳转://重定向到指定的URL地址 并且使用301$this->redirect('http://www.luowebs.cn',301);//重定向到指定的URL地址 并且使用302$this->redirect('http://www.luowebs.com',302);手册地址:https://www.kancloud.cn/manual/thinkphp5/118051
2020年07月05日
2,550 阅读
0 评论
0 点赞
2020-07-01
用好这 43 款 Chrome 插件,让你开发学习一下子好轻松!
整这个用好几个小时才整理完,没点体力还真不行?,后面发现新的好玩的插件再补充进来,希望对你们有用。前言相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多强大好用的扩展程序(Extensions)。最近为了更好的利用谷歌浏览器,博主整理了一些常用的谷歌插件,分享给大家。PS:下面的很多插件都是工具,在日常的工作开发中可以经常使用,用好了可以极大的提高工作效率,在别人熬夜加班的时候,你可以尽情的玩耍了?。正文闲话不多说,直接上精品。通用类插件1、OneTab:将无数 Tab 合并在一个页面很多时候我们在一个窗口打开太多的 tab,每一个 tab 太小不容易管理,这时候使用 OneTab 能够把所有 tab 收起放在一个页面,点击就可打开该 tab,非常方便。2、Momentum:美到爆表的新标签页受够了新建页面时候的空白页的话可以试试,Momentum 每天都会提供一张高清大图,都很好看。3、markdown here超好用的一款插件,强烈推荐!!有个它再也不用担心编辑器不支持 markdown 语法了,写好以后直接一键转换。而且也是一个跨平台神器,比如我们可以把简书写好的文章(带 md 语法)直接复制到微信公众号,然后一键转换,格式几乎无变化!4、Adblock Plus:免除广告困扰只要是使用 Chrome 的人都应该安装的一款扩展应用,可以帮助你屏蔽几乎大部分网页广告,如果存在漏网之鱼,还可以手动添加到屏蔽列。5、LastPass:密码管理软件LastPass,全球知名在线密码管理工具之一,采用军事级加密算法,支持自动填充网站用户名和密码,与朋友分享登录信息等实用功能,且在全平台同步免费,无需订阅 Premium,即可在手机、网页、电脑端同步你的所有 LastPass 信息。6、关灯看视频有时候网速太差,全屏以后分辨率很低,可以试试这个,可以让周围页面变暗从而达到最好的视觉效果。7、二维码 (QR 码) 生成器在线的二维码生成器。可以把当前的网页直接生成二维码,进行编辑。还可以把文字生成二维码,这个很重要!8、下载 +Chrome 的下载管理在二级菜单里,进去很不方便。装了这个插件就可以直接看和管理,很好用。9、一键管理所有扩展Chrome 其实很占内存,尤其当插件装多了以后会卡顿。不过有个这个就不用担心,用不到的时候把插件关掉就行了,随时开随时关。10、购物党在线的比价工具,网购的时候可以看价格历史记录,以及各大网站的价格对比,也有查快递的快捷方式。经常剁手的童鞋要注意了~~11、右键搜Chrome 默认的搜索是谷歌搜索,没有翻墙的童鞋可能用起来不方便,但有这个这个就不用担心了。12、印象笔记剪藏大象官方的一个插件,可以直接把当前网页直接保存的 evernote,非常方便。13、AlloyDesignerAlloyDesigner 是来自 Tencent AlloyTeam 的前端开发工具,其只出现开发阶段的一定时期,可以在制作时期,也可以在开发测试期,旨在提高前端开发的效率,获得更加便捷的开发体验。AlloyDesigner 的主要功能是加载 Web 页面的视觉稿,结合开发者工具 (F12) 进行页面的开发和调整。使用 AlloyDesigner 进行页面开发,基本上可以舍弃 Photoshop 进行页面的测量,以视觉稿做为背景蓝本进行开发,可以使开发体验更加便捷、高效,其结果页面也更高。AlloyDesigner 也可以做为页面开发完成后,对页面进行细微调整,达到更加贴近视觉稿的目的。14、新浪微博图床简单好用的新浪微博图床,支持选择 / 拖拽 / 粘贴上传图片,并生成图片地址,HTML,UBB 和 Markdown 等格式,支持浏览和删除历史记录。15、Cloudbleed Bookmark Checker:检测书签是否有死链对于书签收藏的狂魔同志,收藏夹里的网页肯定有很多都无法访问了吧!这款扩展就是来检测书签是否有死链的。因为不怎么常用,所以才三颗星。16、Infinity:功能强大的新建标签页扩展功能强大的新建标签页扩展!做的界面很美,每日壁纸质量也很高!有同步笔记、代办事项等,同时,喜欢它的网页图标,提供了很多常用网站的图标,自定义书签时很好看~唯一的缺点,就是感觉启动比较慢~17、crxMouse Chrome Gestures对于国产浏览器自带鼠标手势的功能,真觉得很方便!这款扩展也是必装啊!18、Imagus图片放大镜的功能!在体验了 360 浏览器、猎豹浏览器之后,特地去找的扩展!微博党的利器!这个不管能鼠标悬停放大图片,同时,对链接等也有预览。提供很多功能选项进行设置。19、Save to Pocket看到感兴趣的先收藏着,然后走哪儿都能看,因为它提供了全平台的 APP,方便管理。Pocket 也是手机端我必装的 APP 之一。20、网页截图:注释 & 批注在安装了一堆截图扩展之后,最后剩下了它,满足了截图所有的需求,截取可见网页,选择区域,整个网页,另外,还有对截图的标记21、眼不见心不烦(新浪微博)Chrome 就是满分评价,可见这扩展真是良心扩展啊!微博党的福音!在浏览器端,自己通过这个插件进行设置,可以将热门微博、会员推广等等内容窗口都给屏蔽了!还我们一个干净、舒服的微博环境!推荐!22、Image Downloader Chrome下载页面图片的工具,很棒23、WhatRunsWhatRuns 是一款用于了解网站技术的 chrome 网站技术分析工具,主要能通过分析网站页面所使用的框架、代码等技术以及页面所使用的样式等方面,让使用者能直观的了解网站的整体技术信息。在安装了这款插件后,使用者可以通过点击 WhatRuns 图标来打开插件窗口,通过该窗口使用者可以轻松了解网站的技术信息。24、Google 翻译Google 翻译是一款由谷歌公司提供的网页划词翻译插件,是 Google Chrome 的翻译扩展工具,由 Google 官方发布。安装后,会在 Chrome 浏览器菜单栏中添加一个按钮,可以方便的在任何时候点击翻译你当前正在访问的页面。25、FireShot 任意方式截取网页的截图插件捕捉网页截图,编辑并将它们保存为 PDF,JPEG,GIF,PNG 或 BMP;上传,打印,在 Photoshop 中打开,复制到剪贴板或电子邮件26、Lucidchart Diagrams - Desktop:在线绘制多种图表这个扩展程序是一款多功能绘制程序,支持绘制流程图,思维导图,版面设计等,并且有在线和离线两种模式,可谓功能强大。27、Trackr:追踪你的上网习惯这个扩展程序做的事情就是记录你使用 Chrome 上网的习惯,包括上了哪些网站、每个网站呆多长时间,并且还用图表的形式反馈出来,总之装了这个扩展程序就不要上奇奇怪怪的网站了。28、Reader View:Chrome 也有 Safari 的阅读模式将网页转换成 Safari 阅读模式的样式,让你更方便舒适的阅读网页文字,当你访问文章网页的时候,扩展程序的按钮会显示在地址栏末端,点击就能轻松享受更好的阅读模式。29、DrumUp:个性化的浏览推荐当你打开一个网页的时候,为您推荐与现在浏览的网页内容相似或者相关的内容,对于英文的支持比较好,每天阅读很多的人能找到很多关联的感兴趣内容。30、Mainichi:学习日语,每页一词学习日语的新方式,每当你打开一个新标签页会显示一个日文单词,并且配有一张简洁的图片、假名及其读音,不知道有多少朋友在学习日语呢?31、New Tab Startup Quotes:学习成功人士的格言想学习成功人士的精神和智慧,这个扩展程序可以帮到你,每当你打开一个标签页,它都会显示一位成功人士的格言,不得不说熬得一锅好鸡汤。32、Unsplash Instant每次打开一个新标签页都会显示一张来自 Unsplash 的摄影作品,全高清的分辨率和专业的摄影元素,Unsplash 的作品都是满满的文艺范儿,非常适合文艺青年。33、Search by Image:强大的以图搜图Chrome 又一神器,结合 Google 以图搜图,可以快速让你找到一张图片的来源、其他尺寸、或者寻找到相似的图片,毕竟在搜索方面,还是 Google 做的最好。34、Instapaper:稍后阅读神器全球两大稍后阅读神器之一 (另外一款为 Pocket),自从被 Pinterest 收购后,Instapaper 所有高级订阅功能完全免费,令人称道!当你对某个网页内容感兴趣,却没时间马上阅读,点击 Instapaper 图标或使用快捷键 (Cmd+Shift+S),一键保存至 Instapaper,方便你随时随地进行查看。35、为什么你们就是不能加个空格呢每次看到文章中的英文、数字、中文写在一起,你知道我的内心是什么样吗?你们能不能在它们之间加个空格呢?!不过自从装上了「为什么你们就是不能加个空格呢?」,插件会自动把网页中所有中文、英文、数字、符号之间插入一个空格,从此告别此痛苦,又能和大家好好玩耍啦。36、Clear Cache点击图标即可清除缓存、cookie 等,开发必备!开发类插件37、JSON ViewerJSONView 是一个方便查看 Json 结构的插件,展开,折叠,可以非常方便的查看接口返回数据。38、Postman相信开发者朋友一定知道这款插件,这是一款强大的 API & HTTP 请求调试工具。它不仅可以调试简单的 HTML、CSS 以及脚本等简单的网页基本信息,这款 Chrome 插件甚至还能发送几乎所有的 HTTP 请求,可谓是 Web 开发者的一大利器。39、OctotreeGitHub 上查看代码的时候总是一层层进入再出来,有点麻烦,没关系,有 Octotree。安装 Octotree 之后,浏览托管在 GitHub 上的项目,可看到左侧的树形结构,更方便查看代码。40、VimiumVimium 这个名字其实是 Vim 和 Chromium 的合体。可能很多童鞋已经猜到她是干嘛的了,她继承了 Vim 的常用操作,完全脱离鼠标来控制浏览器,是一款黑客级别的 Chrome 插件。对熟悉 linux 的同学来说,简直是神器。41、Tampermonkey俗称 ‘油猴子’,是一款功能非常强大的插件,它包含:方便的脚本管理、脚本概览、设置多样性、脚本自动更新、安全、兼容性、Chrome 同步、CodeMirror 编辑器、JSHint 语法检查、快速开发、卸载等功能。其官方描述只一句 The world’s most popular userscript manager。足见其优秀。42、Code ColaCode Cola 是一个可视化编辑在线页面 css 样式的 chrome 插件。43、WEB 前端助手FE 助手:包括字符串编解码、图片 base64 编码、代码压缩、美化、JSON 格式化、正则表达式、时间转换工具、二维码生成器、编码规范检测、页面性能检测、栅格检测、JS 运行效率分析等。总结整这个真是体力活,好几个小时才整理完,后面发现新的好玩的插件再补充进来,希望对你们有用。作者:卖姑娘的小火柴链接:https://juejin.im/post/5d80431df265da03e168aaef来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2020年07月01日
877 阅读
0 评论
0 点赞
2020-07-01
IDE 注册教程
编程工具神器集合Jetbrains全家桶注册教程如果你下载的jetbrains-agent.jar小于2M,肯定是没有下载完全(可对照sha1sum.txt)。 请保留压缩包内的important.txt和jetbrains-agent.jar放在同一个目录,且不要改动内容! 传统的vmoptions配置同样可用,但我还是推荐你按照本文档的方式配置! 使用方法: 0. 先下载压缩包解压后得到jetbrains-agent.jar。 1. 启动你的IDE,如果上来就需要注册,选择:试用(Evaluate for free)进入IDE。 如果你的IDE试用已过期可以使用reset_eval文件夹内的脚本重置一下。 2. 将 jetbrains-agent.jar 拖进IDE窗口(或者当作IDE插件安装),点 "Restart" 按钮重启IDE。(事实上你拖 jetbrains-agent-latest.zip 进去IDE窗口也没问题)或者点击help>Edit custom vm options 然后在文件末尾添加一行-javaagent:C:\Users\Public\.jetbrains\jetbrains-agent-v3.1.3.0cd4.033=offline新加代码中的C:\Users\Public\.jetbrains\ 是jetbrains-agent.jar所在目录,jetbrains-agent-v3.1.3.0cd4.033=offline这个也可以是jetbrains-agent.jar 3. 在弹出的JetbrainsAgent Helper对话框中,选择激活方式,点击安装按钮。 如果你是无外网环境,在对话框中勾选:我无法访问外网 选项(如银行、公安内网)。 4. 重启IDE,搞定。 x. 支持两种注册方式:License server 和 Activation code: 1). 选择License server方式,地址填入:https://fls.jetbrains-agent.com (HTTP也可用,网络不佳用第2种方式) 2). 选择Activation code方式离线激活,请使用:ACTIVATION_CODE.txt 内的注册码激活 如果激活窗口一直弹出(error 1653219),请去hosts文件里“移除”jetbrains相关的项目 License key is in legacy format == Key invalid,表示agent配置未生效。 3). 现在你可以使用jetbrains-agent + activation code/license server激活jetbrains平台的付费插件了! 本项目在最新2020.1.1版本上测试通过。 IDE升级会从旧版本导入以上设置,导入配置后可能提示未注册(因为刚导入的vmoptions未生效),直接重启IDE即可,无需其他操作。 本项目只做学习研究之用,不得用于商业用途! 若资金允许,请点击 [https://www.jetbrains.com/idea/buy/] 购买正版,谢谢合作! 学生凭学生证可免费申请 [https://sales.jetbrains.com/hc/zh-cn/articles/207154369-学生授权申请方式] 正版授权! 创业公司可5折购买 [https://www.jetbrains.com/shop/eform/startup] 正版授权!jetbrains-agent-latest.zip
2020年07月01日
2,383 阅读
0 评论
0 点赞
2020-06-24
mysql存储过程详细教程
记录MYSQL存储过程中的关键语法:DELIMITER //声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int)声明存储过程BEGIN .... END 存储过程开始和结束符号SET @p_in=1变量赋值DECLARE l_int int unsigned default 4000000;变量定义什么是mysql存储例程?存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。为什么要使用mysql存储过程?我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两 种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不易维 护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。存储过程(stored procedure)、存储例程(store routine)、存储函数区别Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一个结果。创建mysql存储过程、存储函数create procedure 存储过程名(参数)存储过程体create function 存储函数名(参数)下面是存储过程的例子:DELIMITER // CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END // DELIMITER ;注:(1)这里需要注意的是DELIMITER//和DELIMITER;两句, DELIMITER是分割符的意思,因为MySQL默认以";"为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。(3)过程体的开始与结束使用BEGIN与END进行标识。这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。(2). 声明分割符其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQL的Administrator管理工具时,可以直接创建,不再需要声明。(3). 参数MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT 输出参数:该值可在存储过程内部被改变,并可返回INOUT 输入输出参数:调用时指定,并且可被改变和返回Ⅰ. IN参数例子创建:DELIMITER // CREATE PROCEDURE demo_in_parameter(IN p_in int) BEGIN SELECT p_in; SET p_in=2; SELECT p_in; END// DELIMITER ;执行结果:1. mysql > SET @p_in=1; 2. mysql > CALL demo_in_parameter(@p_in); 3. +------+ 4. | p_in | 5. +------+ 6. | 1 | 7. +------+ 8. 9. +------+ 10.| p_in | 11.+------+ 12.| 2 | 13.+------+ 14. 15.mysql> SELECT @p_in; 16.+-------+ 17.| @p_in | 18.+-------+ 19.| 1 | 20.+-------+以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值Ⅱ.OUT参数例子创建:DELIMITER // CREATE PROCEDURE demo_out_parameter(OUT p_out int) BEGIN SELECT p_out; SET p_out= SELECT p_out; END // DELIMITER ;执行结果:1. mysql > SET @p_out=1; 2. mysql > CALL sp_demo_out_parameter(@p_out); 3. +-------+ 4. | p_out | 5. +-------+ 6. | NULL | 7. +-------+ 8. 9. +-------+ 10.| p_out | 11.+-------+ 12.| 2 | 13.+-------+ 14. 15.mysql> SELECT @p_out; 16.+-------+ 17.| p_out | 18.+-------+ 19.| 2 | 20.+-------+Ⅲ. INOUT参数例子创建:DELIMITER // CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END // DELIMITER ;执行结果:1. mysql > SET @p_inout=1; 2. mysql > CALL demo_inout_parameter(@p_inout) ; 3. +---------+ 4. | p_inout | 5. +---------+ 6. | 1 | 7. +---------+ 8. 9. +---------+ 10.| p_inout | 11.+---------+ 12.| 2 | 13.+---------+ 14. 15.mysql > SELECT @p_inout; 16.+----------+ 17.| @p_inout | 18.+----------+ 19.| 2 | 20.+----------+(4). 变量Ⅰ. 变量定义局部变量声明一定要放在存储过程体的开始DECLAREvariable_name [,variable_name...] datatype [DEFAULT value];其中,datatype为MySQL的数据类型,如:int, float, date,varchar(length)例如:1. DECLARE l_int int unsigned default 4000000; 2. DECLARE l_numeric number(8,2) DEFAULT 9.95; 3. DECLARE l_date date DEFAULT '1999-12-31'; 4. DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59'; 5. DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';Ⅱ. 变量赋值SET 变量名 = 表达式值 [,variable_name = expression ...]Ⅲ. 用户变量ⅰ. 在MySQL客户端使用用户变量 1. mysql > SELECT 'Hello World' into @x; 2. mysql > SELECT @x; 3. +-------------+ 4. | @x | 5. +-------------+ 6. | Hello World | 7. +-------------+ 8. mysql > SET @y='Goodbye Cruel World'; 9. mysql > SELECT @y; 10.+---------------------+ 11.| @y | 12.+---------------------+ 13.| Goodbye Cruel World | 14.+---------------------+ 15. 16.mysql > SET @z=1+2+3; 17.mysql > SELECT @z; 18.+------+ 19.| @z | 20.+------+ 21.| 6 | 22.+------+ⅱ. 在存储过程中使用用户变量1. mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); 2. mysql > SET @greeting='Hello'; 3. mysql > CALL GreetWorld( ); 4. +----------------------------+ 5. | CONCAT(@greeting,' World') | 6. +----------------------------+ 7. | Hello World | 8. +----------------------------+ⅲ. 在存储过程间传递全局范围的用户变量1. mysql> CREATE PROCEDURE p1() SET @last_procedure='p1'; 2. mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure); 3. mysql> CALL p1( ); 4. mysql> CALL p2( ); 5. +-----------------------------------------------+ 6. | CONCAT('Last procedure was ',@last_proc | 7. +-----------------------------------------------+ 8. | Last procedure was p1 | 9. +-----------------------------------------------+注意:①用户变量名一般以@开头②滥用用户变量会导致程序难以理解及管理(5). 注释MySQL存储过程可使用两种风格的注释双模杠:--该风格一般用于单行注释c风格: 一般用于多行注释例如:DELIMITER // CREATE PROCEDURE proc1 (IN parameter1 INTEGER) BEGIN DECLARE variable1 CHAR(10); IF parameter1 = 17 THEN SET variable1 = 'birds'; ELSE SET variable1 = 'beasts'; END IF; INSERT INTO table1 VALUES (variable1); END // DELIMITER ;4. MySQL存储过程的调用用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。5. MySQL存储过程的查询我们像知道一个数据库下面有那些表,我们一般采用show tables进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。我们可以用selectname from mysql.proc where db=’数据库名’;或者selectroutine_name from information_schema.routines where routine_schema='数据库名';或者showprocedure status where db='数据库名';进行查询。如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?答案是:我们可以查看存储过程的详细,但是需要用另一种方法:SHOWCREATE PROCEDURE 数据库.存储过程名;就可以查看当前存储过程的详细。6. MySQL存储过程的修改ALTER PROCEDURE更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。7. MySQL存储过程的删除删除一个存储过程比较简单,和删除表一样:DROPPROCEDURE从MySQL的表格中删除一个或多个存储过程。8. MySQL存储过程的控制语句(1). 变量作用域内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派给会话变量来保存其值。DELIMITER // CREATE PROCEDURE proc3() begin declare x1 varchar(5) default 'outer'; begin declare x1 varchar(5) default 'inner'; select x end; select x end // DELIMITER ;** (2). 条件语句**Ⅰ. if-then -else语句DELIMITER // CREATE PROCEDURE proc2(IN parameter int) begin declare var int; set var=parameter+ if var=0 then insert into t values(17); end if; if parameter=0 then update t set s1=s1+ else update t set s1=s1+ end if; end // DELIMITER ;Ⅱ. case语句:DELIMITER // CREATE PROCEDURE proc3 (in parameter int) begin declare var int; set var=parameter+1; case var when 0 then insert into t values(17); when 1 then insert into t values(18); else insert into t values(19); end case; end // DELIMITER ;case when var=0 then insert into t values(30); when var>0 then when var<0 then else end case(3). 循环语句Ⅰ. while ···· end while:1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc4() 3. -> begin 4. -> declare var int; 5. -> set var=0; 6. -> while var<6 do 7. -> insert into t values(var); 8. -> set var=var+1; 9. -> end while; 10. -> end; 11. -> // 12.mysql > DELIMITER ; while条件 do --循环体 endwhileⅡ. repeat···· end repeat:它在执行操作后检查结果,而while则是执行前进行检查。1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc5 () 3. -> begin 4. -> declare v int; 5. -> set v=0; 6. -> repeat 7. -> insert into t values(v); 8. -> set v=v+1; 9. -> until v>=5 10. -> end repeat; 11. -> end; 12. -> // 13.mysql > DELIMITER ; repeat --循环体 until循环条件 endrepeat;Ⅲ. loop ·····endloop:loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc6 () 3. -> begin 4. -> declare v int; 5. -> set v=0; 6. -> LOOP_LABLE:loop 7. -> insert into t values(v); 8. -> set v=v+1; 9. -> if v >=5 then 10. -> leave LOOP_LABLE; 11. -> end if; 12. -> end loop; 13. -> end; 14. -> // 15.mysql > DELIMITER ;Ⅳ. LABLES 标号:标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。(4). ITERATE迭代Ⅰ. ITERATE:1. 通过引用复合语句的标号,来从新开始复合语句 2. mysql > DELIMITER // 3. mysql > CREATE PROCEDURE proc10 () 4. -> begin 5. -> declare v int; 6. -> set v=0; 7. -> LOOP_LABLE:loop 8. -> if v=3 then 9. -> set v=v+1; 10. -> ITERATE LOOP_LABLE; 11. -> end if; 12. -> insert into t values(v); 13. -> set v=v+1; 14. -> if v>=5 then 15. -> leave LOOP_LABLE; 16. -> end if; 17. -> end loop; 18. -> end; 19. -> // 20.mysql > DELIMITER ;9. MySQL存储过程的基本函数(1).字符串类CHARSET(str)返回字串字符集CONCAT (string2 [,... ])连接字串INSTR (string ,substring )返回substring首次在string中出现的位置,不存在返回0LCASE (string2 )转换成小写LEFT (string2 ,length )从string2中的左边起取length个字符LENGTH (string )string长度LOAD_FILE (file_name )从文件读取内容LOCATE (substring , string [,start_position ] )同INSTR,但可指定开始位置LPAD (string2 ,length ,pad )重复用pad加在string开头,直到字串长度为lengthLTRIM (string2 )去除前端空格REPEAT (string2 ,count )重复count次REPLACE (str ,search_str ,replace_str )在str中用replace_str替换search_strRPAD (string2 ,length ,pad)在str后用pad补充,直到长度为lengthRTRIM (string2 )去除后端空格STRCMP (string1 ,string2 )逐字符比较两字串大小,SUBSTRING (str , position [,length ])从str的position开始,取length个字符,注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于11. mysql> select substring('abcd',0,2); 2. +-----------------------+ 3. | substring('abcd',0,2) | 4. +-----------------------+ 5. | | 6. +-----------------------+ 7. 1 row in set (0.00 sec) 8. 9. mysql> select substring('abcd',1,2); 10.+-----------------------+ 11.| substring('abcd',1,2) | 12.+-----------------------+ 13.| ab | 14.+-----------------------+ 15.1 row in set (0.02 sec)TRIM([[BOTH|LEADING|TRAILING][padding] FROM]string2)去除指定位置的指定字符UCASE (string2 )转换成大写RIGHT(string2,length)取string2最后length个字符SPACE(count)生成count个空格(2).数学类ABS (number2 )绝对值BIN (decimal_number )十进制转二进制CEILING (number2 )向上取整CONV(number2,from_base,to_base)进制转换FLOOR (number2 )向下取整FORMAT (number,decimal_places )保留小数位数HEX (DecimalNumber )转十六进制注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19LEAST (number , number2 [,..])求最小值MOD (numerator ,denominator )求余POWER (number ,power )求指数RAND([seed])随机数ROUND (number [,decimals ])四舍五入,decimals为小数位数]注:返回类型并非均为整数,如:(1)默认变为整形值1. mysql> select round(1.23); 2. +-------------+ 3. | round(1.23) | 4. +-------------+ 5. | 1 | 6. +-------------+ 7. 1 row in set (0.00 sec) 8. 9. mysql> select round(1.56); 10.+-------------+ 11.| round(1.56) | 12.+-------------+ 13.| 2 | 14.+-------------+ 15.1 row in set (0.00 sec)(2)可以设定小数位数,返回浮点型数据1. mysql> select round(1.567,2); 2. +----------------+ 3. | round(1.567,2) | 4. +----------------+ 5. | 1.57 | 6. +----------------+ 7. 1 row in set (0.00 sec) SIGN (number2 ) //(3).日期时间类ADDTIME (date2 ,time_interval )将time_interval加到date2CONVERT_TZ (datetime2 ,fromTZ ,toTZ )转换时区CURRENT_DATE ( )当前日期CURRENT_TIME ( )当前时间CURRENT_TIMESTAMP ( )当前时间戳DATE (datetime )返回datetime的日期部分DATE_ADD (date2 , INTERVAL d_value d_type )在date2中加上日期或时间DATE_FORMAT (datetime ,FormatCodes )使用formatcodes格式显示datetimeDATE_SUB (date2 , INTERVAL d_value d_type )在date2上减去一个时间DATEDIFF (date1 ,date2 )两个日期差DAY (date )返回日期的天DAYNAME (date )英文星期DAYOFWEEK (date )星期(1-7) ,1为星期天DAYOFYEAR (date )一年中的第几天EXTRACT (interval_name FROM date )从date中提取日期的指定部分MAKEDATE (year ,day )给出年及年中的第几天,生成日期串MAKETIME (hour ,minute ,second )生成时间串MONTHNAME (date )英文月份名NOW ( )当前时间SEC_TO_TIME (seconds )秒数转成时间STR_TO_DATE (string ,format )字串转成时间,以format格式显示TIMEDIFF (datetime1 ,datetime2 )两个时间差TIME_TO_SEC (time )时间转秒数]WEEK (date_time [,start_of_week ])第几周YEAR (datetime )年份DAYOFMONTH(datetime)月的第几天HOUR(datetime)小时LAST_DAY(date)date的月的最后日期MICROSECOND(datetime)微秒MONTH(datetime)月MINUTE(datetime)分返回符号,正负或0SQRT(number2)开平方
2020年06月24日
1,022 阅读
0 评论
0 点赞
2020-06-17
nginx反向代理设置泛目录解析
二级目录出租,用nginx反向代理设置实例:打开站点的nginx配置文件加入下面代码location /二级目录名称(英文)/ { proxy_pass http://47.105.130.185/二级目录名称(同上)/; proxy_set_header Host $host;#向代理目标主机目录发送主机名称 proxy_set_header X-Real-IP $remote_addr;#向代理目标主机发送客户端真实ip proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }需要注意的是如果出租目录站点没备案,而代理目标主机是备案主机,那么proxy_set_header Host $host;这句话必须去掉,否则会被备案页面拦截。
2020年06月17日
2,372 阅读
0 评论
0 点赞
2020-06-16
搜索引擎智能提示API
各大搜索引擎智能提示API(jsonp实现跨域自动补全建议)更新时间为2019年2月28日,亲测可用,去除不可用的接口,新增一些接口。谷歌(Google)谷歌API接口地址1:http://clients1.google.com/complete/search?hl=zh&output=toolbar&q=前端谷歌API接口地址2:http://suggestqueries.google.com/complete/search?output=toolbar&hl=zh&q=前端谷歌API接口地址2:http://suggestqueries.google.com/complete/search?client=youtube&q=前端&jsonp=window.google.ac.h 会直接下载。返回结果:百度(Baidu)百度API接口地址1:http://suggestion.baidu.com/su?wd=前端也有人会这样写:http://suggestion.baidu.com/su?wd=前端&p=3&cb=window.bdsug.sug返回结果:window.bdsug.sug({q:"前端",p:false,s:["前端工程师","前端学习路线","前端开发","前端框架","前端面试题","前端面试","前端面试题及答案","前端开发工具","前端ui框架","前端性能优化"]});搜狗(Sougou)搜狗API接口地址1:http://w.sugg.sogou.com/sugg/ajaj_json.jsp?key=前端&type=web返回结果:window.sogou.sug(["前端",["前端开发","前端框架","前端面试题","前端工程师","前端培训","前端和后端","前端招聘","前端开发培训","前端开发工具","前端和后端的区别"],["0;0;0;0","1;0;0;0","2;0;0;0","3;0;0;0","4;0;0;0","5;0;0;0","6;0;0;0","7;0;0;0","8;0;0;0","9;0;0;0"],["","","","","","","","","",""],["0"],"","suglabId_1"],-1);360搜索(so)360搜索API接口地址:https://sug.so.360.cn/suggest?callback=suggest_so&word=qianduan 测试只支持英文,不过可以支持拼音。360搜索API接口地址:https://sug.so.360.cn/suggest?encodein=utf-8&encodeout=utf-8&format=json&word=前端&callback=window.so.sug 测试支持汉字。返回结果:suggest_so({q:"qianduan",p:true,s:["前端","前端培训机构","前端开发需要学什么","前段","钱端","前端开发","前端工程师","前端框架","嵌段","前端面试题"]});必应(Bing)必应搜索API接口地址:https://api.bing.com/qsonhs.aspx?type=cb&q=前端 返回的是 json 格式。必应搜索API接口地址:https://api.bing.com/qsonhs.aspx?type=cb&q=前端&cb=window.bing.sug返回结果:if(typeof window.bing.sug == 'function') window.bing.sug({"AS":{"Query":"前端","FullResults":1,"Results":[{"Type":"AS","Suggests":[{"Txt":"前端切版","Type":"AS","Sk":"","HCS":0.0355},{"Txt":"前端工程師","Type":"AS","Sk":"AS1"},{"Txt":"前端工程師 薪水","Type":"AS","Sk":"AS2"},{"Txt":"前端科技股份有限公司","Type":"AS","Sk":"AS3"},{"Txt":"前端 英文","Type":"AS","Sk":"AS4"},{"Txt":"前端 框架","Type":"AS","Sk":"AS5"},{"Txt":"前端工程師 ptt","Type":"AS","Sk":"AS6"},{"Txt":"前端開發 windows","Type":"AS","Sk":"AS7"}]}]}}/* pageview_candidate */);淘宝(Taobao)淘宝搜索API接口地址:https://suggest.taobao.com/sug?code=utf-8&q=前端&callback=window.taobao.sug返回结果:KISSY.Suggest.callback({"result":[["前端播放器","10122"],["前端视频教程 2018","3080"],["前端开发","18144"],["前端开发书籍","13391"],["前端净水器","63525"],["前端开发视频","8932"],["前端过滤器","69083"],["前端耳机","40712"],["前端视频","3535"],["前端教程","22974"]]})一淘(etao)一淘搜索API接口地址:https://suggest.taobao.com/sug?area=etao&code=utf-8&callback=KISSY.Suggest.callback&q=前端返回结果:KISSY.Suggest.callback({"result":[["前端播放器","10122"],["前端视频教程 2018","3080"],["前端开发","18144"],["前端开发书籍","13391"],["前端净水器","63525"],["前端开发视频","8932"],["前端过滤器","69083"],["前端耳机","40712"],["前端视频","3535"],["前端教程","22974"]]})京东(JD)京东查价接口:http://p.3.cn/prices/mgets?skuIds=J_100002308919&type=1 红色部分为商品ID返回结果:[{"id":"J_100002308919","m":"6000.00","op":"3299.00","p":"3299.00"}]搜索建议使用方式:以百度为例,API返回的是JSONP数据,JSONP是跨域访问的一种方式。由于服务器返回的JavaScript代码可以直接引用,通过回调函数的方式就可以间接的获取服务器的数据。下面是一个回调搜索建议的例子,window.baidu.sug 返回的是一个json对象<script type="text/javascript"> window.onload = function() { //组装查询地址 var sugurl = "http://suggestion.baidu.com/su?wd=#content#&cb=window.baidu.sug"; var content = "关键字"; sugurl = sugurl.replace("#content#", content); //定义回调函数 window.baidu = { sug: function(json) { console.log(json) } } //动态添加JS脚本 var script = document.createElement("script"); script.src = sugurl; document.getElementsByTagName("head")[0].appendChild(script); }</script>控制台打印的结果:如果要将结果保存在一个字符串数组中,只需要 var arr = json.s 即可。
2020年06月16日
1,878 阅读
0 评论
0 点赞
2020-05-10
内网穿透工具
最近没什么事情,看了一些关于内网穿透的文章,因我本身已是做微信开发相关的工作,对这部分关注的比较多,现分享给大家。首先说下内网穿透的原理。NAPT原理在NAT网关上会有一张映射表,表上记录了内网向公网哪个IP和端口发起了请求,然后如果内网有主机向公网设备发起了请求,内网主机的请求数据包传输到了NAT网关上,那么NAT网关会修改该数据包的源IP地址和源端口为NAT网关自身的IP地址和任意一个不冲突的自身未使用的端口,并且把这个修改记录到那张映射表上。最后把修改之后的数据包发送到请求的目标主机,等目标主机发回了响应包之后,再根据响应包里面的目的IP地址和目的端口去映射表里面找到该转发给哪个内网主机。这样就实现了内网主机在没有公网IP的情况下,通过NAPT技术借助路由器唯一的一个公网IP来访问公网设备。 具体原理参照下图:更加具体的原理性介绍可以看下这篇文档:内网穿透工具的原理与开发实战我了解的内网穿透工具NgrokNatapp小米球Sunny-NgrokechositeSsh、autosshLanproxySpikefrpfcn花生壳前5个都是基于国外的ngrok来进行二次开发的。1、Ngrokngrok 是一个反向代理,通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放,所以ngrok可以很方便地协助服务端程序测试。参考博客:10分钟教你搭建自己的ngrok服务器2、Natappnatapp是 基于ngrok的国内收费内网穿透工具,类似花生壳,有免费版本,比花生壳好。免费版本:提供http,https,tcp全隧道穿透,随机域名/TCP端口,不定时强制更换域名/端口,自定义本地端口参考文章:NATAPP1分钟快速新手图文教程3、小米球小米球是基于ngrok二次开发的内网穿透工具,支持多协议、多隧道、多端口同时映射(http、https、tcp等等...),同时支持多种系统win、linux、linux_arm、mac等。具体的使用直接参考官网。4、Sunny-NgrokSunny-Ngrok同样是ngrok二次开发的内网穿透工具,支持http,https协议,同时支持更丰富的系统和语言:linux、win、mac、openwrt、 python、php等。教程:Sunny-Ngrok使用教程5、echositeechosite同样ngrok二次开发的内网穿透工具,支持多种协议,以前是全部免费的,现在推出了收费版和免费版,可根据自己的需要去选择。参考教程:EchoSite---让内网穿透变得简单6、Ssh、autosshssh 配合autossh工具使用,因为autossh会容错,自动重新启动SSH会话和隧道。autossh是一个程序,用于启动ssh的副本并进行监控,在死亡或停止传输流量时根据需要重新启动它。 这个想法来自rstunnel(Reliable SSH Tunnel),但是在C中实现。作者的观点是,它不像匆匆忙忙的工作那么容易。使用端口转发环路或远程回显服务进行连接监视。在遇到连接拒绝等快速故障时,关闭连接尝试的速度。在OpenBSD,Linux,Solaris,Mac OS X,Cygwin和AIX上编译和测试; 应该在其他BSD上工作。免费软件。使用教程:SSH内网穿透7、Lanproxylanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,目前仅支持tcp流量转发,可支持任何tcp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面...)。目前市面上提供类似服务的有花生壳、TeamView、GoToMyCloud等等,但要使用第三方的公网服务器就必须为第三方付费,并且这些服务都有各种各样的限制,此外,由于数据包会流经第三方,因此对数据安全也是一大隐患。参考教程:业余草推荐一款局域网(内网)穿透工具lanproxy8、SpikeSpike是一个可以用来将你的内网服务暴露在公网的快速的反向代理,基于ReactPHP,采用IO多路复用模型。采用Php实现。参考教程:使用 PHP 实现的的内网穿透工具 “Spike”9、Frpfrp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。教程:一款很好用的内网穿透工具--FRP、使用frp实现内网穿透10、FcnFCN[free connect]是一款傻瓜式的一键接入私有网络的工具, fcn利用公共服务器以及数据加密技术实现:在免公网IP环境下,在任意联网机器上透明接入服务端所在局域网网段。支持多种系统,有免费版和付费版。教程:内网穿透工具FCN介绍上面便是我所知道的内网穿透工具,其中ngrok相关的我基本都用过还有frp,都差不多。大部分都可以免费去使用,但是我不建议大家把这些免费的穿透工具去放到比较重要的云服务器中去使用,容易被攻击。我的小伙伴,开始你的穿透之旅吧。
2020年05月10日
867 阅读
0 评论
0 点赞
2020-05-10
搭建自己的内网穿透ngrok服务器
内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。偶然,正在测试微信的某些功能,但是正在使用的ittun-ngrok连接失败了。导致测试无法进行,最终萌生出自己搭建一个ngrok服务器的想法。原文链接:https://blog.csdn.net/yjc_1111/java/article/details/79353718
2020年05月10日
1,316 阅读
0 评论
0 点赞
2020-05-10
内网穿透
一,官网注册natapp.cn/ 这个我不用说了,进官网注册就行二,购买隧道(免费/收费都有)我们这里可以选择免费隧道,免费的需要实名认证,我这里是用了9元一个月的隧道(个人建议买这个)配置信息先和我保持一致即可。三,下载客户端natapp.cn/#download 下载对应的即可下载后,解压,然后把解压出来的文件放到一个目录里。然后命令行里:cd /Users/qcl/packages/natapp 进入到你放置natapp文件的目录里。 再输入ls,查看natapp软件是否存在。mac运行下面两步进入到目录后输入下面命令行 chmod a+x natapp 是为所有用户开启执行命令 (如果不加这一步 也可以直接用sudo+第二步运行软件)然后输入 ./natapp 这一步是运行命令win用户直接双击.exe文件即可这里提示我们认证错误,错误是因为authtoker没有配置,所以我们需要在命令行里运行下面命令./natapp -authtoken=你的authtoken值 复制代码而这个authtoken值,我们可以到管理后台去找如箭头所指,就是我们想要的authtoken 然后命令行里运行运行上面命令行时会出现下面结果这就代表我们成功把外网 http://a11*********98.natapp.cc -> 127.0.0.1:8080 映射到我们本地的服务器了,这时候我们通过外网网址,就可以访问我们本地服务器了。 但是。。。。。。natapp提供给我们的网址,不能直接访问,这时我们就要去做另外一个配置了。绑定本站二级域名或自主域名后进行访问之所以这么做,也是为了安全。 下面我们就继续来讲怎么绑定本站二级域名或自主域名。如果你有自己的备案域名,可以参考官方文档 natapp.cn/article/bei…如果你没有自己的备案域名,就需要再去注册一个二级域名了。我这里拿自己的微信号,注册一个二级域名。 注册完二级域名后,再去修改隧道配置点击配置选中二级域名修改成功后,我们的域名就会变成我们的二级域名然后再次在命令行里运行可以看到我们的域名已经变了到这里我们就配置成功了,去验证下手机微信访问这时候我们就可以愉快的实现内网穿透了这样外网就能轻松的访问到我们本地电脑的服务器了。 做微信开发时,就可以愉快的在我们本地做调试了。作者:编程小石头链接:https://juejin.im/post/5cad5e675188251b1b2f5517来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2020年05月10日
1,394 阅读
0 评论
0 点赞
2020-05-02
Composer 国内加速,修改镜像源
为什么慢由于默认情况下执行 composer 各种命令是去国外的 composer 官方镜像源获取需要安装的具体软件信息,所以在不使用代理、不翻墙的情况下,从国内访问国外服务器的速度相对比较慢如何修改镜像源可以使用阿里巴巴提供的 Composer 全量镜像 https://mirrors.aliyun.com/composer/a). 配置只在当前项目生效composer config repo.packagist composer https://mirrors.aliyun.com/composer/# 取消当前项目配置composer config --unset repos.packagistb). 配置全局生效composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 取消全局配置composer config -g --unset repos.packagistc). 使用第三方软件快速修改、切换 composer 镜像源crm composer registry manager安装 crmcomposer global require slince/composer-registry-manager列出可用的所有镜像源,前面带 * 代表当前使用的镜像composer repo:ls -- --------------- ------------------------------------------------ composer https://packagist.org phpcomposer https://packagist.phpcomposer.com aliyun https://mirrors.aliyun.com/composer tencent https://mirrors.cloud.tencent.com/composer huawei https://mirrors.huaweicloud.com/repository/php laravel-china https://packagist.laravel-china.org cnpkg https://php.cnpkg.org sjtug https://packagist.mirrors.sjtug.sjtu.edu.cn -- --------------- ------------------------------------------------使用 aliyun 镜像源composer repo:use aliyun# 执行成功之后会输出类似以下信息[OK] Use the repository [aliyun] success再次执行 composer repo:ls 命令,看到前面带 * 的就是当前使用的镜像composer repo:ls# 可以看到 aliyun 前面有一个 * 号,代表当前使用的是 aliyun 的源--- --------------- ------------------------------------------------ composer https://packagist.org phpcomposer https://packagist.phpcomposer.com * aliyun https://mirrors.aliyun.com/composer tencent https://mirrors.cloud.tencent.com/composer huawei https://mirrors.huaweicloud.com/repository/php laravel-china https://packagist.laravel-china.org cnpkg https://php.cnpkg.org sjtug https://packagist.mirrors.sjtug.sjtu.edu.cn --- --------------- ------------------------------------------------更多用法查看 crm GitHub
2020年05月02日
1,232 阅读
0 评论
0 点赞
2020-04-12
软件开发语义化版本 2.0.0
摘要版本格式:主版本号.次版本号.修订号,版本号递增规则如下:主版本号:当你做了不兼容的 API 修改,次版本号:当你做了向下兼容的功能性新增,修订号:当你做了向下兼容的问题修正。先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。简介在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷,系统规模越大,加入的包越多,你就越有可能在未来的某一天发现自己已深陷绝望之中。在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高,可能面临版本控制被锁死的风险(必须对每一个依赖包改版才能完成某次升级)。而如果依赖关系过于松散,又将无法避免版本的混乱(假设兼容于未来的多个版本已超出了合理数量)。当你专案的进展因为版本依赖被锁死或版本混乱变得不够简便和可靠,就意味着你正处于依赖地狱之中。作为这个问题的解决方案之一,我提议用一组简单的规则及条件来约束版本号的配置和增长。这些规则是根据(但不局限于)已经被各种封闭、开放源码软件所广泛使用的惯例所设计。为了让这套理论运作,你必须先有定义好的公共 API 。这可以透过文件定义或代码强制要求来实现。无论如何,这套 API 的清楚明了是十分重要的。一旦你定义了公共 API,你就可以透过修改相应的版本号来向大家说明你的修改。考虑使用这样的版本号格式:X.Y.Z (主版本号.次版本号.修订号)修复问题但不影响API 时,递增修订号;API 保持向下兼容的新增及修改时,递增次版本号;进行不向下兼容的修改时,递增主版本号。我称这套系统为“语义化的版本控制”,在这套约定下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。语义化版本控制规范(SemVer)以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 RFC 2119 的叙述解读。(译注:为了保持语句顺畅, 以下文件遇到的关键词将依照整句语义进行翻译,在此先不进行个别翻译。)使用语义化版本控制的软件必须(MUST)定义公共 API。该 API 可以在代码中被定义或出现于严谨的文件内。无论何种形式都应该力求精确且完整。标准的版本号必须(MUST)采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止(MUST NOT)在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须(MUST)以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。标记版本号的软件发行后,禁止(MUST NOT)改变该版本软件的内容。任何修改都必须(MUST)以新版本发行。主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共 API 不应该被视为稳定版。1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容。修订号 Z(x.y.Z | x > 0)必须(MUST)在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。次版本号 Y(x.Y.z | x > 0)必须(MUST)在有向下兼容的新功能出现时递增。在任何公共 API 的功能被标记为弃用时也必须(MUST)递增。也可以(MAY)在内部程序有大量新功能或改进被加入时递增,其中可以(MAY)包括修订级别的改变。每当次版本号递增时,修订号必须(MUST)归零。主版本号 X(X.y.z | X > 0)必须(MUST)在有任何不兼容的修改被加入公共 API 时递增。其中可以(MAY)包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号必须(MUST)归零。先行版本号可以(MAY)被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符来修饰。标识符必须(MUST)由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,且禁止(MUST NOT)留白。数字型的标识符禁止(MUST NOT)在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法满足预期的兼容性需求。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。版本编译元数据可以(MAY)被标注在修订版或先行版本号之后,先加上一个加号再加上一连串以句点分隔的标识符来修饰。标识符必须(MUST)由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,且禁止(MUST NOT)留白。当判断版本的优先层级时,版本编译元数据可(SHOULD)被忽略。因此当两个版本只有在版本编译元数据有差别时,属于相同的优先层级。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,必须(MUST)把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译元数据不在这份比较的列表中)。由左到右依序比较每个标识符,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级必须(MUST)透过由左到右的每个被句点分隔的标识符来比较,直到找到一个差异值后决定:只有数字的标识符以数值高低比较,有字母或连接号时则逐字以 ASCII 的排序来比较。数字的标识符比非数字的标识符优先层级低。若开头的标识符都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。为什么要使用语义化的版本控制?这并不是一个新的或者革命性的想法。实际上,你可能已经在做一些近似的事情了。问题在于只是“近似”还不够。如果没有某个正式的规范可循,版本号对于依赖的管理并无实质意义。将上述的想法命名并给予清楚的定义,让你对软件使用者传达意向变得容易。一旦这些意向变得清楚,弹性(但又不会太弹性)的依赖规范就能达成。举个简单的例子就可以展示语义化的版本控制如何让依赖地狱成为过去。假设有个名为“救火车”的函式库,它需要另一个名为“梯子”并已经有使用语义化版本控制的包。当救火车创建时,梯子的版本号为 3.1.0。因为救火车使用了一些版本 3.1.0 所新增的功能, 你可以放心地指定依赖于梯子的版本号大等于 3.1.0 但小于 4.0.0。这样,当梯子版本 3.1.1 和 3.2.0 发布时,你可以将直接它们纳入你的包管理系统,因为它们能与原有依赖的软件兼容。作为一位负责任的开发者,你理当确保每次包升级的运作与版本号的表述一致。现实世界是复杂的,我们除了提高警觉外能做的不多。你所能做的就是让语义化的版本控制为你提供一个健全的方式来发行以及升级包,而无需推出新的依赖包,节省你的时间及烦恼。如果你对此认同,希望立即开始使用语义化版本控制,你只需声明你的函式库正在使用它并遵循这些规则就可以了。请在你的 README 文件中保留此页连结,让别人也知道这些规则并从中受益。FAQ在 0.y.z 初始开发阶段,我该如何进行版本控制?最简单的做法是以 0.1.0 作为你的初始化开发版本,并在后续的每次发行时递增次版本号。如何判断发布 1.0.0 版本的时机?当你的软件被用于正式环境,它应该已经达到了 1.0.0 版。如果你已经有个稳定的 API 被使用者依赖,也会是 1.0.0 版。如果你很担心向下兼容的问题,也应该算是 1.0.0 版了。这不会阻碍快速开发和迭代吗?主版本号为零的时候就是为了做快速开发。如果你每天都在改变 API,那么你应该仍在主版本号为零的阶段(0.y.z),或是正在下个主版本的独立开发分支中。对于公共 API,若即使是最小但不向下兼容的改变都需要产生新的主版本号,岂不是很快就达到 42.0.0 版?这是开发的责任感和前瞻性的问题。不兼容的改变不应该轻易被加入到有许多依赖代码的软件中。升级所付出的代价可能是巨大的。要递增主版本号来发行不兼容的改版,意味着你必须为这些改变所带来的影响深思熟虑,并且评估所涉及的成本及效益比。为整个公共 API 写文件太费事了!为供他人使用的软件编写适当的文件,是你作为一名专业开发者应尽的职责。保持专案高效一个非常重要的部份是掌控软件的复杂度,如果没有人知道如何使用你的软件或不知道哪些函数的调用是可靠的,要掌控复杂度会是困难的。长远来看,使用语义化版本控制以及对于公共 API 有良好规范的坚持,可以让每个人及每件事都运行顺畅。万一不小心把一个不兼容的改版当成了次版本号发行了该怎么办?一旦发现自己破坏了语义化版本控制的规范,就要修正这个问题,并发行一个新的次版本号来更正这个问题并且恢复向下兼容。即使是这种情况,也不能去修改已发行的版本。可以的话,将有问题的版本号记录到文件中,告诉使用者问题所在,让他们能够意识到这是有问题的版本。如果我更新了自己的依赖但没有改变公共 API 该怎么办?由于没有影响到公共 API,这可以被认定是兼容的。若某个软件和你的包有共同依赖,则它会有自己的依赖规范,作者也会告知可能的冲突。要判断改版是属于修订等级或是次版等级,是依据你更新的依赖关系是为了修复问题或是加入新功能。对于后者,我经常会预期伴随着更多的代码,这显然会是一个次版本号级别的递增。如果我变更了公共 API 但无意中未遵循版本号的改动怎么办呢?(意即在修订等级的发布中,误将重大且不兼容的改变加到代码之中)自行做最佳的判断。如果你有庞大的使用者群在依照公共 API 的意图而变更行为后会大受影响,那么最好做一次主版本的发布,即使严格来说这个修复仅是修订等级的发布。记住, 语义化的版本控制就是透过版本号的改变来传达意义。若这些改变对你的使用者是重要的,那就透过版本号来向他们说明。我该如何处理即将弃用的功能?弃用现存的功能是软件开发中的家常便饭,也通常是向前发展所必须的。当你弃用部份公共 API 时,你应该做两件事:(1)更新你的文件让使用者知道这个改变,(2)在适当的时机将弃用的功能透过新的次版本号发布。在新的主版本完全移除弃用功能前,至少要有一个次版本包含这个弃用信息,这样使用者才能平顺地转移到新版 API。语义化版本对于版本的字串长度是否有限制呢?没有,请自行做适当的判断。举例来说,长到 255 个字元的版本已过度夸张。再者,特定的系统对于字串长度可能会有他们自己的限制。
2020年04月12日
1,099 阅读
0 评论
0 点赞
2020-04-10
使用PHP和PHP Desktop创建第一个桌面应用程序
嗨,欢迎来到这个特别的教程。在这里,我将向您展示如何在PHP Desktop的帮助下使用PHP,CSS,HTML和JavaScript创建基于Web的桌面应用程序 。实际上,PHP Desktop是一个简单易用的解决方案,可用于创建功能强大且复杂的桌面应用程序。什么是PHP桌面?根据官方定义,PHP Desktop是Czarek Tomczak在2012年创建的一个开源项目,旨在提供一种使用Web技术(例如PHP,HTML5,JavaScript和SQLite)开发本机桌面GUI应用程序的方法。-来源:PHP桌面官方页面提醒您,创建Web应用程序时惯用的开发工作流程保持不变。将现有网站转换为桌面应用程序的步骤基本上是复制和粘贴的问题。PHPDesktop是一个通用容器,只会吞噬您的项目。这样,您可以轻松地将现有网站转换为桌面应用程序,而无需进行任何修改。当您下载 PHP Desktop时,将具有一些文件和文件夹集。其中,您将有一个名为的文件夹,您将www在其中粘贴整个应用程序。对于那些使用过WampServer,Xamp或EasyPhp的用户来说,理解这一概念将不是问题。使用这些本地服务器时,通常将项目创建到名为www,htdocs或 的特定文件夹中localweb。它从一台服务器到另一台服务器有所不同,但是概念保持不变。该特定文件夹可帮助您的网络服务器知道从何处运行您的应用程序(网站)。PHP Desktop的工作方式相同。不同之处在于,PHP桌面不需要任何特定的安装。它是所有这些本地服务器具有的多合一便携式集合,它可以完成WampServer或Xamp以及同一家族中的其他服务器所能做的一切。PHP Desktop附带了一个.exe文件。每当您运行时.exe,它将进入该www文件夹并运行您的索引文件。我将在本教程的后面部分解释这个过程。一些故事回顾2005年,我记得曾经有人要求我提供商店管理应用程序。原理很简单,经理应该能够添加新库存和所有销售记录。最后,所有者应能够获得每天的干净报告,并在可能的情况下可以选择日期或期限。我告诉客户我可以做到,但是它将基于Web,因此它将使用他们的浏览器来工作。即使我知道他们不了解有什么不同,这也使我有必要尝试向他们明确说明。幸运的是,客户以这种方式接受了它。我使用EasyPhp制作了该应用程序。因此,要运行该应用程序,我必须在客户端的PC上安装EasyPhp。你可以告诉我oh yeah there is no problem in that??。确实,似乎没有问题,但是这样的系统/方法遇到很多问题,例如:在应用程序运行之前,EasyPhp必须打开,否则它们将收到404错误。我只需要安装几个EasyPhp及其所有模块。每当EasyPhp拒绝启动时,他们都必须给我打电话如果有人错误地卸载EasyPhp并认为它是一个奇怪的软件,则整个应用程序将保留所有记录。Pffff。我的数据库可以轻松访问。任何使用我的URL的人都可以入侵我的应用程序,因为它们是可见的。如果他们在另一个商店中需要相同的应用程序,那么我将不得不自己在那个商店中进行相同的处理,因为他们无法自己安装它。等等。绝对不是完美的解决方案。即使我没有任何问题,我也不能认为这是一个好的解决方案。我真幸运。在那之后,我以另外两种方式做过同样的事情,但是直到遇到PHP桌面我才对我的工作感到不满意。我想您可以理解我们在使用PHP的桌面应用程序时可能遇到的真正问题。我知道他们一定是个办法。否则,我在PHP中的技能只会用于网站。PHP Desktop可以减少(如果不能解决)所有这些问题,并提供了软件开发经验的新视野:无需再次将所有模块全部嵌入,仅需将其嵌入。无需安装任何Web服务器,一切都已嵌入无需担心浏览器兼容性,因为PHP Desktop带有嵌入式浏览器该浏览器非常轻巧,没有所有无聊的工具,例如地址栏,收藏夹栏,历史记录栏等。毕竟,我们将不需要它们。您可以将整个应用程序制作为.exe文件并将其发送给客户,以便他们自己安装PHP Desktop也可以充当纯HTML5 / JS应用程序的打包程序没有内存泄漏您可以将其用于Perl,Ruby和Python等等。不妙吗?我们想要什么?基本上,任何PHP程序员都希望创建任何桌面应用程序。创建一个可执行的(.exe)应用程序,他可以轻松共享或发送给他的客户。任何客户端都可以简单地按照安装向导安装应用程序,而无需程序员的任何努力或需求。不幸的是,如果您真的很喜欢PHP编程,那么现在应该知道这实际上是不可能的。由于PHP是一种解释型编程语言,因此您无法将项目文件编译为单个可执行文件(.exe),这就是最大的问题所在。大多数专门用于桌面应用程序的编程语言(例如Java)都有一些库,这些库提供了一些元素集(按钮,菜单,颜色,形状等)来帮助创建软件界面。实际上,PHP没有这种东西,PHP完全是一种脚本语言。人们试图创建一些扩展(例如PHP-GTK)来为语言提供这种功能,但是问题仍然没有完全解决。此外,PHP可以与HTML和JavaScript结合使用。而且我们知道可以使用CSS设置HTML标记的样式……越来越好。我们无法想象CSS在设计方面的局限性。因此,这就是PHP桌面发挥其力量的地方。它是如何工作的?PHP Desktop利用大多数Web技术来帮助PHP实现我们的目标。PHP Desktop本身是一种可以将您自己嵌入其中的软件。因此,当您安装PHP Desktop时,现在将自己的应用程序放入PHP Desktop的文件夹中。当您启动PHP Desktop时,它将去读取/解析您的应用程序以显示/运行它。PHP Desktop嵌入了应用程序在运行之前可能需要的所有服务。主要元素是Web服务器(猫鼬),PHP服务器和数据库引擎(Sqlite)。为了提供通用接口,它嵌入了浏览器(实际上是Chrome或Internet Explorer)。现在,浏览器可以帮助我们解释JavaScript,HTML和CSS。因此,在使用前无需安装任何其他服务器或解析器。使用PHP创建您的第一个桌面应用程序使用PHP创建桌面应用程序非常简单。下载PHP桌面(使用Chrome或Internet Explorer)创建一个新文件夹并命名 MyApp解压缩PHP Desktop Inside的内容您的文件夹中应该有以下内容MyApp:我下载了一个嵌入式Chome。无论您下载了哪个文件,最重要的是突出显示的文件,它是一个可执行文件(.exe)。双击该文件以运行它您应该得到这样的内容:- 发生了什么?PHP Desktop非常聪明。当您单击启动器时,它会进入一个特殊文件夹以查找任何可用的应用程序,并且该特殊文件夹不过是www文件夹。继续打开www文件夹,您应该会看到以下内容:惊讶!这些文件是我们单击启动器时列出的PHP桌面。注意:这些文件是.php文件。单击任何一个。您应该看到其内容。这些文件是示例文件,可以帮助您了解PHP Desktop可以执行这些文件正在执行的所有操作。其中,您具有Cookie,环境变量,表单,iframe,javascript等功能。这意味着您的PHP应用程序几乎可以执行所有操作。-为什么会提示两个窗口,它们分别是什么?默认情况下,PHP Desktop会提示两个窗口。第一个(更大)是chrome / explorer。这是您的应用程序所在的位置。用户将通过该窗口与之交互。您可以根据需要进行更改。第二个窗口(黑色和黑色的控制台)是调试界面(日志控制台)。它可以帮助您查看在运行应用程序时是否发生任何错误,这在开发阶段非常有用。-另一件事您应该知道,在生产中我们将不需要该黑色控制台,并且可能还需要调整主窗口的大小等。这些是设置。PHP Desktop带有一个名为的特殊文件settings.json。此文件将帮助我们配置PHP Desktop的某些行为。因此,例如,如果我们不希望PHP Desktop提示日志控制台,则可以settings.json使用任何文本编辑器打开文件并找到以下文件:"debugging": {"show_console": true,"subprocess_show_console": false,"log_level": "DEBUG4","log_file": "debug.log"}然后show_console像这样将false 的值更改为false:"debugging": {"show_console": false,"subprocess_show_console": false,"log_level": "DEBUG4","log_file": "debug.log"}然后再次运行PHP Desktop。pfff走了!-现在,让我们添加自己的应用程序进入www文件夹中的MyApp文件夹,然后删除其中的所有文件。创建一个简单的文件,并index.php用以下内容命名:<html><head> <title>MyApp</title></head><body> <h1>PHP Desktop is awesome</h1> <div style="background-color:blue; color:white; padding:2em; font-size:3em"> <?= "And PHP agrees!" ?> </div></body></html>现在将index.php文件移到www(如果未在其中创建www)文件夹中,然后启动PHP Desktop。您应该得到这样的内容:您会看到PHP桌面已将您识别index.php为第一个启动文件。那是Mongoose服务器(嵌入式Web服务器)的工作。另外,我们的HTML和CSS代码已解析,PHP代码也已解析。因此,您很高兴开始尝试其他代码。注意:将 Mongoose视为Apache服务器注意:我们的标题标签中的标题未显示。我们的应用程序窗口的标题应在以下对象的settings.json中设置: "main_window": { "title": "PHP Desktop Chrome", "icon": "", "default_size": [1024, 768], "minimum_size": [800, 600], "maximum_size": [0, 0], "disable_maximize_button": false, "center_on_screen": true, "start_maximized": false, "start_fullscreen": false }您可以看到该对象可以帮助您影响应用程序的窗口。所以现在怎么办?是的,您已经准备好应用程序了吗?您可以将文件夹MyApp放在计算机中的任何位置。每当您要启动它时,只需单击启动器,或为其创建快捷方式。Bahh,那不是我们想要的。我们需要一个可执行文件,可以发送给客户端,然后他可以自己安装应用程序。当然是。我忘记了大声笑。为了做到这一点,我们将需要另一个名为Inno Steup的特殊小软件。那又做什么?我们仅要求Inno Setup提取文件夹中的内容MyApp并将其转换为自安装包。最后,我们将获得一个简单的setup.exe文件,可以将其发送到客户端进行安装。为此,请按照以下步骤操作:下载Inno设置安装它如果出现这样的情况,请选择“创建一个新的空脚本文件”现在去 File > New该向导将出现:不要检查“创建新的空脚本文件”点击 Next该向导将出现:在这里,我们需要为您的应用程序进行一些设置:应用名称: MyApp应用版本: 0.0.1应用程序发布者:(iT Tutors Age Ltd您的公司或您的名字)申请网站:(www.phpocean.com或您的网站)现在Next再次点击该向导将出现:在这里,我们需要精确确定将文件夹安装在用户计算机中后将包含我们的应用程序的名称。当您安装应用程序时,它通常位于C:\Program Files或中C:\Program Files (x86)。因此,默认情况下,我们将保留“应用程序目标”文件夹。现在让我们将Application文件夹名称更改为 MyApp点击 Next该向导将出现:这是发生严重事情的地方。第一个应用程序的主要可执行文件名称。在向导上,我们有MyProg.exe(圈出的区域)。这是Inno Setup中的默认测试文件。我们需要更改它,否则当我们启动应用程序时,它将启动Inno Setup的测试应用程序。因此,单击Browse,将您的文件夹浏览到我们的MyApp文件夹,然后双击phpdesktop-chrome.exe。接下来是带有其他应用程序文件标签的白色小区域。这部分也非常重要,而且管理起来也非常微妙。首先,它意味着:如果除了顶部添加的可执行文件之外,还有其他组成应用程序的文件,请在此处全部添加。因此,通常您必须将文件MyApp夹中的所有phpdesktop-chrome.exe文件一一带到这里,这是一件困难而又缓慢的事情。我个人通常会进入我的文件夹并突出显示所有文件,但phpdesktop-chrome.exe随后将所有文件 拖放到小区域中。简单快捷。因此,最后,您应该具有以下内容:然后Next再次点击该向导将出现:这是不言自明的。单击Windows start菜单后,将单击该名称以启动应用程序。您还可以激活其他选项。Next再点击一次该向导将出现:这些是您的应用程序的文档文件:许可证文件,安装之前的说明文件和安装结束时的说明文件。虽然这不是必须的,但是如果您想要一个严肃的软件,则可以添加它。要建立三种不同的文本文件(license.txt,before-install.txt,和end-install.txt您的计算机)的地方。然后浏览每个并将其添加到相应的字段。无论您在其中放置什么内容,用户在安装软件时都会看到它-试试看。然后点击 next该向导将出现:这些是您为软件安装向导提供的客户端语言。因此,当他们要安装它时,他们可以选择安装向导应该显示说明的语言。您可以选择法语和英语或更多。Next再点击一次该向导将出现:自定义编译器输出文件夹是您希望Inno Setup在其末尾放置Finale Executable文件的位置。因此,浏览并在您的计算机中选择一个文件夹(我选择了我的桌面文件夹)。编译器输出基本文件名是您希望最终压缩可执行文件具有的名称。您可以保留 setup或将其更改为MyAppSetup与我一样。自定义安装图标是您的可执行文件的图标。该文件必须是.ico文件。现在,就离开它。并留下密码领域也然后click on next再next again然后finish之后,Inno安装程序将提示以下内容:只需点击 Yes它将再次询问您是否要将生成的代码保存在某处以备将来使用。说,Yes如果要保留它,请选择将其保存在计算机上的位置并保存。如果您不想要,只需单击no。然后,Inno Setup将开始将我们的文件编译成可执行文件。确保在到达此处之前关闭PHP桌面,否则会提示错误,指出在其他地方使用了元素。如果一切顺利,您应该得到以下信息:现在进入您要求Inno Setup保存可执行文件的文件夹。就我而言,我选择了我的台式机。所以,这就是我到达的地方:我有一个可执行文件MyAppSetup,当我将鼠标悬停在它上时,我有这个文件:考虑所有细节。凉!要安装它,只需双击它,然后按照安装向导的说明进行操作。样本[ 编辑 ]人们要求我为他们提供一些使用PHP Desktop完成的实际应用案例。 在此处下载可执行文件的示例[38.9 MB]。安装完成以访问应用程序后,请使用:用户名:admin-密码:admin贝娄是我做过的一些应用程序的屏幕截图:结论希望您喜欢这个冗长的教程。我不想错过任何东西,因为这很棘手。但是,它们仍然可能是您无法摆脱的。只需在评论部分此处询问即可。本教程是一个非常简单的过程。使用PHP桌面时,您需要考虑很多方面,例如窗口设置,环境设置,框架的使用,访问计算机文件和硬件等。
2020年04月10日
2,319 阅读
0 评论
0 点赞
2020-03-18
七牛云空间批量删除文件
由于业务转行之前存储在七牛云其中一个bucket的资源文件都不需要了,需要批量删除。但是文件管理中批量删除最多50个,这个bucket里有好几百万的文件,50个50个删除太笨了!!!!!因此请教了大神之后总结下面的方法做个记录供以后使用。首先安装七牛云的qshell命令行工具,源码地址:https://github.com/qiniu/qshell/。下载对应系统的安装文件按教程安装。安装完成后使用以下命令先导出文件列表:$ qshell listbucket2 --max-retry -1 yourBucketName --readable -o dfileList.txt大概10分钟导出完成后使用以下命令删除:$ qshell batchdelete yourBucketName -i qiniufile.txt --success-list success.txt --failure-list failure.txt好了大功告成,收工
2020年03月18日
1,271 阅读
0 评论
0 点赞
2020-03-07
Spacevim-php-init.toml
安装spacevim请自行去官网查看# 这是一个基础的 SpaceVim 配置示例 # 所有的 SpaceVim 选项都列在 [options] 之下 [options] # 设置 SpaceVim 主题及背景,默认的主题是 gruvbox,如果你需要使用更 # 多的主题,你可以载入 colorscheme 模块 colorscheme = "molokai" # 背景可以取值 "dark" 或 "light" colorscheme_bg = "dark" # 启用/禁用终端真色,在目前大多数终端下都是支持真色的,当然也有 # 一小部分终端不支持真色,如果你的 SpaceVim 颜色看上去比较怪异 # 可以禁用终端真色,将下面的值设为 false enable_guicolors = true # 设置状态栏上分割符号形状,如果字体安装失败,可以将值设为 "nil" 以 # 禁用分割符号,默认为箭头 "arrow" statusline_separator = "arrow" statusline_inactive_separator = "bar" # 设置顶部标签列表序号类型,有以下五种类型,分别是 0 - 4 # 0: 1 ➛ ➊ # 1: 1 ➛ ➀ # 2: 1 ➛ ⓵ # 3: 1 ➛ ¹ # 4: 1 ➛ 1 buffer_index_type = 0 # 显示/隐藏顶部标签栏上的文件类型图标,这一图标需要安装 nerd fonts, # 如果未能成功安装这一字体,可以隐藏图标 enable_tabline_filetype_icon = true # 是否在状态栏上显示当前模式,默认情况下,不显示 Normal/Insert 等 # 字样,只以颜色区分当前模式 enable_statusline_mode = true # 状态栏左端部分的构成 statusline_left_sections = ['winnr', 'major mode', 'filename', 'fileformat', 'minor mode lighters', 'version control info', 'search status'] # 状态栏右端部分的构成 statusline_right_sections = ['cursorpos', 'percentage', 'input method', 'date', 'time'] # 列表可以由以下一项或多项组成 # 'winnr' 当前窗口编号 # 'syntax checking' # 'filename' 文件名 # 'fileformat' 文件格式 # 'major mode' # 'minor mode lighters' # 'cursorpos' 光标位置 # 'percentage' 百分比 # 'date' 日期 # 'time' 时间 # 'whitespace' 打开或者保存文件时,如果第 n 行的行尾有空格则显示 trailing[n],并不能实时显示出行尾有空格的行号。 # 'battery status' 电池状态 # 'input method' 输入法 # 'search status' 搜索状态 # 文件树插件可选值包括: # - vimfiler (默认) # - nerdtree # - defx # filemanager = "nerdtree" # 中文支持 vim_help_language = "cn" # 语法检查如果需要使用 syntastic,将两者都设置为 false。 enable_neomake = false enable_ale = true # SpaceVim 模块设置,主要包括启用/禁用模块 # 启用 autocomplete 模块,启用模块时,可以列出一些模块选项,并赋值, # 关于模块的选项,请阅读各个模块的文档 [[layers]] name = "autocomplete" auto-completion-return-key-behavior = "complete" auto-completion-tab-key-behavior = "cycle" # 禁用 shell 模块,禁用模块时,需要加入 enable = false [[layers]] name = "shell" enable = false # 添加自定义插件 [[custom_plugins]] name = "lilydjwg/colorizer" merged = false # 主题模块 [[layers]] name = "colorscheme" random_theme = false # shell模块 [[layers]] name = "shell" default_position = "top" default_height = 30 # 中文帮助文档 [[layers]] name = "chinese" # 版本控制 [[layers]] name = "VersionControl" # 标签管理 [[layers]] name = "tools" # 代码自动补全 [[layers]] name = "lsp" # PHP语言模块 [[layers]] name = "lang#php" [[layers]] name = "lsp" filetypes = [ "php" ] [layers.override_cmd] php = ['php', '~/.cache/vimfiles/repos/github.com/felixfbecker/php-language-server/bin/php-language-server.php'] # 代码格式化 [[layers]] name = "format" # 自动语法检查 [[layers]] name = "checkers" show_cursor_error = true # 在文件树内显示隐藏的文件,默认是 false [[layers]] name = 'core' filetree_show_hidden = true # 搜索文件、函数列表、 命令历史等等特性 [[layers]] name = "fzf" # Git 支持 [[layers]] name = "git" # 项目 tags 管理工具 [[layers]] name = "gtags" gtagslabel = "ctags" # 额外的语言支持 [[layers]] name = "lang#extra" # HTML CSS 开发提供支持 [[layers]] name = "lang#html" # JavaScript 开发支持 [[layers]] name = "lang#javascript" auto_fix = true enable_flow_syntax = true [[layers]] name = "lsp" filetypes = [ "javascript" ] [layers.override_cmd] javascript = ['javascript-typescript-stdio'] # lua 开发支持 [[layers]] name = "lang#lua" # shell 语言支持 [[layers]] name = "lang#sh" [[layers]] name = "lsp" filetypes = [ "sh" ] [layers.override_cmd] sh = ['bash-language-server', 'start'] # vim 开发支持 [[layers]] name = "lang#vim" # vue 开发支持 [[layers]] name = "lang#vue" [[layers]] name = "lsp" filetypes = [ "vue" ] [layers.override_cmd] rust = ["vls"] # 提供了搜索文件、函数列表、 命令历史 [[layers]] name = "leaderf" # 管理员身份读写文件 [[layers]] name = "sudo" # 查找单词 [[layers]] name = "tools#dash" # 工具集插件 [[layers]] name = "tools" # IDE-like 界面 [[layers]] name = "ui" # css自动补全 [[layers]] name = "lsp" filetypes = [ "css" ] [layers.override_cmd] css = ['css-languageserver', '--stdio'] # 聊天框架 #[[layers]] # name = "chat"
2020年03月07日
1,924 阅读
0 评论
0 点赞
1
2
3
4