在开发项目的时候，会因为经常操作不断的提交，产生很多的分支，后期不利于回滚数据，下面的方式就可以将分支多个合并：1、查看提交历史，–oneline -20最近20次提交，每次提交显示一行摘要git log --oneline -20 该命令可以展示出最近20条的分支历史，具体根据实际情况修改。2、合并提交历史#合并前5个提交 git rebase -i HEAD~5 #合并到某个提交 git rebase -i 0b26a0f775 上面的命令可以2选1，根据实际情况选择3、编辑合并规则pick 0b064204 最终修改 s c1ad1218 修改文件2 s e4e4034f 创建文件1 s 6e492400 删除文件3 # Rebase be4a2d33..6e492400 onto 6e492400 (4 commands) 【将be4a2d33..6e492400重新设定为6e492400（4个命令）】 # Commands: # p, pick <commit> = use commit【使用commit】 # r, reword <commit> = use commit, but edit the commit message【使用commit，但编辑commit消息】 # e, edit <commit> = use commit, but stop for amending【使用commit，但停止修改】 # s, squash <commit> = use commit, but meld into previous commit【使用commit，但合并到上一个commit中】 # f, fixup <commit> = like "squash", but discard this commit's log message【和squash一样，只是丢弃commit的日志消息】 # x, exec <command> = run command (the rest of the line) using shell【run command（行的其余部分）using shell】 # b, break = stop here (continue rebase later with 'git rebase —continue')【在此处停止（稍后使用“git rebase --continue”继续重新base）】 # d, drop <commit> = remove commit【删除commit】 # l, label = label current HEAD with a name【用名称标记当前头部】 # t, reset = reset HEAD to a label【将头部重置为标签】 # m, merge [-C <commit> | -c <commit>] [# <oneline>] create a merge commit using the original merge commit's message (or the oneline, if no original merge commit was ). Use -c <commit> to reword the commit message.【使用原始合并提交的消息创建合并提交（如果没有原始合并提交，则为oneline）。使用-c<commit>重新编写commit消息。】 # These lines can be re-ordered; they are executed from top to bottom. # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # Note that empty commits are commented out #这些行可以重新排序；它们从上到下执行。如果在此处删除一行，则提交操作将丢失。但是，如果删除所有内容，则将中止重新平衡。注意，空提交被注释掉了 编辑合约规则，主要看最上面的分支，编辑前你会看到很多的pick xxx这样的数据，第一个就是最后合并的分支，不动，后面的分支都改成s（即表示需要合并的分支）。TIPS：编辑时先按c进入编辑模式，编辑完成之后，按ESC退出，输入:wq 保存并退出，保存并退出之后会进入下一个编辑界面，一样保存并退出即可4、强制提交git push -f 强制提交至远程即可5、可能遇到的问题如果意外退出这个合并，可以使用下面的命令清除合并，重新开始合并操作git rebase --abort
【框架简介】本框架主旨为API至上，顾名思义，一切以API为主，脱离原有MVC概念，正真的做为一个完全为服务器以及开发人员使用的PHP框架！框架开发由本站站长开发，框架之所有脱离原有MVC概念，是因为行业技术不断发展，M和V实际会造成开发人员繁琐的调整维护，目前前端环境多数由VUE主导，所以V的概念也就逐渐没落，而M的概念，本框架后续将会改变为额外拓展来加入到本框架，意在T概念（Tool工具），更好的维护以及更好的使用。本框架将会以C（控制器）概念来统筹API,所有的安全以及相关的功能模块都是围绕API来处理！【开发目的】开发目的如简介所言，脱离原有MVC概念，正真的做为一个完全为服务器以及开发人员使用的PHP框架！同时也为了更好的学习一些功能性的模块和更好的技术交流本框架目前还在开发中，后续会逐步开放文档以及文件下载，敬请期待！框架不作为商业用途！目前仅支持学习使用，开发人员以及本站站长有最终解释权！
sql 语句解析date(create_date): 将日期格式化为 2000-01-01这种格式curdate() :获取当前日期 2020-06-30 等同于 date(now())date_sub(curdate(), interval 7 day): 获取7天前的日期统计每年的订单量SELECT YEAR(create_date) as year,COUNT(1) as count FROM orders GROUP BY year; 统计今年每个月的订单量SELECT MONTH(create_date) as month,COUNT(1) as count FROM orders WHERE YEAR(create_date) = YEAR(NOW()) GROUP BY month ORDER BY month; 统计今年每周的订单量SELECT WEEK(create_date) as week,COUNT(1) as count FROM orders WHERE YEAR(create_date) = YEAR(NOW()) GROUP BY week ORDER BY week; 统计今年每日的订单量select DATE_FORMAT(createtime,'%Y-%m-%d') as days,count(*) count from ibt_shop_order group by days;
1. 初始化创建完成项目之后，找到 src 目录下的 main.js2. 在 main.js 最后将小程序的全局变量添加到 Vue 的原型上此例小程序的全局方法 getApp() 添加一个全局变量 globalData 赋值给 Vue 原型 Vue.prototype 添加的 globalData添加数据：此 main.js 页面添加：直接给 Vue 原型 Vue.prototype 赋值即可可以在生命周期中使用 this 添加在不同页面使用：
WebStorm2020.3，它是一款非常专业的JavaScript开发工具，同时也是WebStorm的最新版本，而在这次的全新版本中，界面和功能都有焕然一新的改变，让用户能够拥有更好的体验webstorm2020.3绿色版使用教程：1. 打开解压后的压缩包2. 双击文件3.首先选择上方的“Evaluate for free”，然后点击“Evaluate”即可；WebStorm换成中文1. 入程序之后页面是为英文，新版本可以直接点击“Plugins”，在界面框中输入“Chinese”回车搜索，可见会出现一个中文插件，点击“Install”安装插件；2.在出现的弹框中选择“Accept”；3.等待插件成功下载后点击右边的“RESTART IDEA”；4.在弹出的弹框中点击“RESTART”；5.然后软件就会自动重启，重新启动之后打开就可以显示中文语言了
Linux服务器是如果存在恶意请求，可以使用Linux的防火墙机制去禁止这个IP查看当前服务器IP请求量netstat -tun|awk '{print $5}'|cut -d : -f1|sort|uniq -c|sort -n 语法iptables(选项)(参数)选项-t<表>：指定要操纵的表； -A：向规则链中添加条目； -D：从规则链中删除条目； -i：向规则链中插入条目； -R：替换规则链中的条目； -L：显示规则链中已有的条目； -F：清楚规则链中已有的条目； -Z：清空规则链中的数据包计算器和字节计数器； -N：创建新的用户自定义规则链； -P：定义规则链中的默认目标； -h：显示帮助信息； -p：指定要匹配的数据包协议类型； -s：指定要匹配的数据包源ip地址； -j<目标>：指定要跳转的目标； -i<网络接口>：指定数据包进入本机的网络接口； -o<网络接口>：指定数据包要离开本机所使用的网络接口。 iptables命令选项输入顺序：iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> –sport 源端口 <-d 目标IP/目标子网> –dport 目标端口 -j 动作 表名包括：raw：高级功能，如：网址过滤。 mangle：数据包修改（QOS），用于实现服务质量。 net：地址转换，用于网关路由器。 filter：包过滤，用于防火墙规则。 规则链名包括：INPUT链：处理输入数据包。 OUTPUT链：处理输出数据包。 PORWARD链：处理转发数据包。 PREROUTING链：用于目标地址转换（DNAT）。 POSTOUTING链：用于源地址转换（SNAT）。 动作包括：accept：接收数据包。 DROP：丢弃数据包。 REDIRECT：重定向、映射、透明代理。 SNAT：源地址转换。 DNAT：目标地址转换。 MASQUERADE：IP伪装（NAT），用于ADSL。 LOG：日志记录。 实例清除已有iptables规则iptables -F iptables -X iptables -Z 开放指定的端口iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 iptables -A INPUT -p tcp –dport 22 -j ACCEPT #允许访问22端口 iptables -A INPUT -p tcp –dport 80 -j ACCEPT #允许访问80端口 iptables -A INPUT -p tcp –dport 21 -j ACCEPT #允许ftp服务的21端口 iptables -A INPUT -p tcp –dport 20 -j ACCEPT #允许FTP服务的20端口 iptables -A INPUT -j reject #禁止其他未允许的规则访问 iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问 屏蔽IPiptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令 查看已添加的iptables规则iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all – lo * 0.0.0.0/0 0.0.0.0/0 191K 90M ACCEPT tcp – * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp – * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all – * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6256 327K ACCEPT icmp – * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all – * lo 0.0.0.0/0 0.0.0.0/0 删除已添加的iptables规则将所有iptables以序号标记显示，执行：iptables -L -n –line-numbers 比如要删除INPUT里序号为8的规则，执行：iptables -D INPUT 8
使用mod_limitipconn模块限制IP并发连接数安装：wget http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2 tar jxvf mod_limitipconn-0.24.tar.bz2 cd mod_limitipconn-0.24 /usr/local/apache2/bin/apxs -c -i mod_limitipconn.c 其中 /usr/local/apache2/bin/apxs 这里必须是指定阿帕奇目录下的bin/apxs，这里需要看自己的服务器阿帕奇安装路径编辑httpd.confExtendedStatus On LoadModule limitipconn_module modules/mod_limitipconn.so #将路径修改为安装后的路径，保存时去掉以下代码的注释 #对应根目录 MaxConnPerIP 5 ＃最大并发数为5 NoIPLimit image/* ＃对图片不做限制 注意上面的配置复制进去之后，注释全部都要去掉，对应根目录是指自己的项目路径使用mod_bandwidth模块限制带宽mod_bandwidth可以对IP的并发数进行控制，也可以对下载流量进行控制，也可以对某个目录的流量进行控制。安装：wget http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz tar zxvf mod_bw-0.7.tgz cd mod_bw /usr/local/apache2/bin/apxs -c -i mod_bw.c 其中 /usr/local/apache2/bin/apxs 这里必须是指定阿帕奇目录下的bin/apxs，这里需要看自己的服务器阿帕奇安装路径编辑httpd.confLoadModule bw_module modules/mod_bw.so ServerName vhost1.cszhi.com DocumentRoot /var/www/vhost1 BandwidthModule On ForceBandWidthModule On Bandwidth all 1024000 MinBandwidth all 50000 ＃每个客户端最高速度可达50KB LargeFileLimit * 500 50000 MaxConnection all 6 其它参数事例说明BandWidth localhost 0 #对localhost不限速 BandWidth 192.168.1.5 102400 #对192.168.1.5限速为100KB BandWidth “u:^Mozilla(.*)” 10240 #用mozilla时限速10KB BandWidth “u:wget” 102400 ＃如果用wget下载时限速10KB MinBandWidth all -1 ＃保证每个客户端最高速度可达10KB LargeFileLimit .jpg 100 10240 ＃jpg文件超过100KB，限速10KB ＃下面的510挺好，如果不设置，apache自己会报错，就根报404差不多，页面非常的丑 ErrorDocument 510 /exceed_speed.html BandWidthError 510 MaxConnection all 10 #所有ip最大连接数为10 MaxConnection 192.168.1.5 5 ＃192.168.1.5最大连接数为5 示例结果：上面功能主要用于限制，当项目存在多个php-fpm请求时需要做项目的限制处理
重启防火墙（iptables)命令#service iptable restart失效Redirecting to /bin/systemctl restart iptables.ser linux下执行防火墙相关指令报错：1，安装systemctl：yum install iptables-services 2，设置开机启动：systemctl enable iptables.service 然后就可以执行以下指令了：systemctl stop iptables //停止 systemctl start iptables //启动 systemctl restart iptables //重启 systemctl reload iptables //重载
【技术解读】用php获取本周,上周,本月,上月,本季度日期的代码
PHP date函数参数详解time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧不过这样方便计算,要找出前一天的时间就是 time()-606024;要找出前一年的时间就是 time()606024365那么如何把这个数字换成日期格式呢,就要用到date函数了$t=time();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日，二位数字，若不足二位则前面补零; 如: "01" 至 "31"D - 星期几，三个英文字母; 如: "Fri"F - 月份，英文全名; 如: "January"h - 12 小时制的小时; 如: "01" 至 "12"H - 24 小时制的小时; 如: "00" 至 "23"g - 12 小时制的小时，不足二位不补零; 如: "1" 至 12"G - 24 小时制的小时，不足二位不补零; 如: "0" 至 "23"i - 分钟; 如: "00" 至 "59"j - 几日，二位数字，若不足二位不补零; 如: "1" 至 "31"l - 星期几，英文全名; 如: "Friday"m - 月份，二位数字，若不足二位则在前面补零; 如: "01" 至 "12"n - 月份，二位数字，若不足二位则不补零; 如: "1" 至 "12"M - 月份，三个英文字母; 如: "Jan"s - 秒; 如: "00" 至 "59"S - 字尾加英文序数，二个英文字母; 如: "th"，"nd"t - 指定月份的天数; 如: "28" 至 "31"U - 总秒数w - 数字型的星期几，如: "0" (星期日) 至 "6" (星期六)Y - 年，四位数字; 如: "1999"y - 年，二位数字; 如: "99"z - 一年中的第几天; 如: "0" 至 "365"其它不在上列的字符则直接列出该字符下面是实际使用方式：<?php echo date("Ymd",strtotime("now")), "\n"; echo date("Ymd",strtotime("-1 week Monday")), "\n"; echo date("Ymd",strtotime("-1 week Sunday")), "\n"; echo date("Ymd",strtotime("+0 week Monday")), "\n"; echo date("Ymd",strtotime("+0 week Sunday")), "\n"; echo "*********第几个月:"; echo date('n'); echo "*********本周周几:"; echo date("w"); echo "*********本月天数:"; echo date("t"); echo "*********"; echo ' 上周起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y"))),"\n"; echo ' 本周起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"))),"\n"; //从第几周找出该周的开始日期和结束日期 $dayNumber = date('W') * 7; $weekDayNumber = date("w", mktime(0, 0, 0, 1, $dayNumber, date("Y")));//当前周的第几天 $startNumber = $dayNumber - $weekDayNumber; echo date("Y-m-d", mktime(0, 0, 0, 1, $startNumber + 1, date("Y")));//开始日期 echo date("Y-m-d", mktime(0, 0, 0, 1, $startNumber + 7, date("Y")));//结束日期 echo ' 上月起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m")-1,1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m") ,0,date("Y"))),"\n"; echo ' 本月起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("t"),date("Y"))),"\n"; $season = ceil((date('n'))/3);//当月是第几季度 echo ' 本季度起始时间: '; echo date('Y-m-d H:i:s', mktime(0, 0, 0,$season*3-3+1,1,date('Y'))),"\n"; echo date('Y-m-d H:i:s', mktime(23,59,59,$season*3,date('t',mktime(0, 0 , 0,$season*3,1,date("Y"))),date('Y'))),"\n"; $season = ceil((date('n'))/3)-1;//上季度是第几季度 echo ' 上季度起始时间: '; echo date('Y-m-d H:i:s', mktime(0, 0, 0,$season*3-3+1,1,date('Y'))),"\n"; echo date('Y-m-d H:i:s', mktime(23,59,59,$season*3,date('t',mktime(0, 0 , 0,$season*3,1,date("Y"))),date('Y'))),"\n"; ?> 输出结果
一、部署在apache web服务器上（wamp|xammp）1.后台接口需要做跨域设置​（1）在服务端利用Access-Control-Allow-Origin响应头解决。设置Access-Control-Allow-Origin：*，允许所有域名的脚本访问该资源。如果考虑到安全问题，也可以设置Access-Control-Allow-Origin：www.build.im 允许特定域名访问（2）服务器做反向代理（2）打包文件单独放置一个服务器 1.把react 项目 build 打包后 复制build 里面的文件到web服务器的根目录 2.同时需要在web根目录放置.htaccess文件，文件内容为：（当服务器出现找不到路由时自动回到index.html 路由由react-router 接管 附备注： 前端本地开发时会存在跨域问题，如果项目是用creat-react-app cli 创建的，则直接在package.json 文件里添加 api 地址目录即可："proxy"： “www.api.com:8000” 即可解决跨域问题，如果是自己创建的项目 配置好proxy middlle 中间件 也可以实现代理。本地fecth( ''api/userinfo", fucntion(){} ); 请求会发送到 http://www.online.com:80/api/userinfo 接口上proxy: { '/api)': { target: 'http://www.online.com:80/', changeOrigin: true }, } Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.html [QSA,PT,L] 二，部署在nginx web 服务器上try_files 指令：配置 nginx/nginx.conf 文件server { ... location / { try_files $uri /index.html } } react build 后的文件包里的文件直接放到 nginx 下的web 目录 即可通过ip 访问