//压缩文件 $zipper=new Zipper(); $zipper->make($dir.'.zip')->add($dir); $zipper->close(); return response()->download(public_path($dir.'.zip'));
//压缩文件 $zipper=new Zipper(); $zipper->make($dir.'.zip')->add($dir); $zipper->close(); return response()->download(public_path($dir.'.zip'));
1.使用Ctrl+R 调出运行,输入eventvwr.msc
2.选择 > 应用程序和服务日志 > Microsoft > Windows > Task Scheduler > Operational, 右键选择清除日志.
Go有一个内置函数len
可以获取字符串的长度,这样我们就可以通过len来获取数据的长度,例如:
if len(r.Form["username"][0])==0{
//为空的处理
}
r.Form
对不同类型的表单元素的留空有不同的处理, 对于空文本框、空文本区域以及文件上传,元素的值为空值,而如果是未选中的复选框和单选按钮,则根本不会在r.Form中产生相应条目,如果我们用上面例子中的方式去获取数据时程序就会报错。所以我们需要通过r.Form.Get()
来获取值,因为如果字段不存在,通过该方式获取的是空值。但是通过r.Form.Get()
只能获取单个的值,如果是map的值,必须通过上面的方式来获取。
你想要确保一个表单输入框中获取的只能是数字,例如,你想通过表单获取某个人的具体年龄是50岁还是10岁,而不是像“一把年纪了”或“年轻着呢”这种描述
如果我们是判断正整数,那么我们先转化成int类型,然后进行处理
getint,err:=strconv.Atoi(r.Form.Get("age"))
if err!=nil{
//数字转化出错了,那么可能就不是数字
}
//接下来就可以判断这个数字的大小范围了
if getint >100 {
//太大了
}
还有一种方式就是正则匹配的方式
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
return false
}
对于性能要求很高的用户来说,这是一个老生常谈的问题了,他们认为应该尽量避免使用正则表达式,因为使用正则表达式的速度会比较慢。但是在目前机器性能那么强劲的情况下,对于这种简单的正则表达式效率和类型转换函数是没有什么差别的。如果你对正则表达式很熟悉,而且你在其它语言中也在使用它,那么在Go里面使用正则表达式将是一个便利的方式。
Go实现的正则是RE2,所有的字符都是UTF-8编码的。
有时候我们想通过表单元素获取一个用户的中文名字,但是又为了保证获取的是正确的中文,我们需要进行验证,而不是用户随便的一些输入。对于中文我们目前有两种方式来验证,可以使用 unicode
包提供的 func Is(rangeTab *RangeTable, r rune) bool
来验证,也可以使用正则方式来验证,这里使用最简单的正则方式,如下代码所示
if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m {
return false
}
我们期望通过表单元素获取一个英文值,例如我们想知道一个用户的英文名,应该是astaxie,而不是asta谢。
我们可以很简单的通过正则验证数据:
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
return false
}
你想知道用户输入的一个Email地址是否正确,通过如下这个方式可以验证:
if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
fmt.Println("no")
}else{
fmt.Println("yes")
}
你想要判断用户输入的手机号码是否正确,通过正则也可以验证:
if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
return false
}
如果我们想要判断表单里面<select>
元素生成的下拉菜单中是否有被选中的项目。有些时候黑客可能会伪造这个下拉菜单不存在的值发送给你,那么如何判断这个值是否是我们预设的值呢?
我们的select可能是这样的一些元素
<select name="fruit">
<option value="apple">apple</option>
<option value="pear">pear</option>
<option value="banana">banana</option>
</select>
那么我们可以这样来验证
slice:=[]string{"apple","pear","banana"}
v := r.Form.Get("fruit")
for _, item := range slice {
if item == v {
return true
}
}
return false
如果我们想要判断radio按钮是否有一个被选中了,我们页面的输出可能就是一个男、女性别的选择,但是也可能一个15岁大的无聊小孩,一手拿着http协议的书,另一只手通过telnet客户端向你的程序在发送请求呢,你设定的性别男值是1,女是2,他给你发送一个3,你的程序会出现异常吗?因此我们也需要像下拉菜单的判断方式类似,判断我们获取的值是我们预设的值,而不是额外的值。
<input type="radio" name="gender" value="1">男
<input type="radio" name="gender" value="2">女
那我们也可以类似下拉菜单的做法一样
slice:=[]string{"1","2"}
for _, v := range slice {
if v == r.Form.Get("gender") {
return true
}
}
return false
有一项选择兴趣的复选框,你想确定用户选中的和你提供给用户选择的是同一个类型的数据。
<input type="checkbox" name="interest" value="football">足球
<input type="checkbox" name="interest" value="basketball">篮球
<input type="checkbox" name="interest" value="tennis">网球
对于复选框我们的验证和单选有点不一样,因为接收到的数据是一个slice
slice:=[]string{"football","basketball","tennis"}
a:=Slice_diff(r.Form["interest"],slice)
if a == nil{
return true
}
return false
上面这个函数Slice_diff
包含在我开源的一个库里面(操作slice和map的库),https://github.com/astaxie/beeku
你想确定用户填写的日期或时间是否有效。例如 ,用户在日程表中安排8月份的第45天开会,或者提供未来的某个时间作为生日。
Go里面提供了一个time的处理包,我们可以把用户的输入年月日转化成相应的时间,然后进行逻辑判断
t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Printf("Go launched at %s\n", t.Local())
获取time之后我们就可以进行很多时间函数的操作。具体的判断就根据自己的需求调整。
如果我们想验证表单输入的是否是身份证,通过正则也可以方便的验证,但是身份证有15位和18位,我们两个都需要验证
//验证15位身份证,15位的是全部数字
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("usercard")); !m {
return false
}
//验证18位身份证,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
return false
}
右击命令行窗口标题,查看属性,可以看到当前命令行窗口使用的编码格式
使用命令
CHCP 65001
将命令行窗口的编码格式修改为utf-8,可以解决命令行乱码问题,
css3 transition 和 animation实现横向、纵向 滚动、走马灯( marquee 在H5已被废弃)
横向:
transition写法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>marquee</title> <style type="text/css"> body{ padding: 0; margin: 0; } #demo{ width: 100%; height: 50px; background: #eee; position: fixed; } #demo>#spa{ word-break:keep-all; white-space:nowrap; position: absolute; left: 100%; font-size: 30px; line-height: 50px; } </style> </head> <body> <div id="demo"><span id='spa' >走马灯效果</span></div> </body> <script type="text/javascript"> var spa = document.getElementById("spa"); var spaw = spa.offsetWidth; var bodyw = document.body.clientWidth; var w = 0-(spaw+bodyw); spa.style.transform = 'translate(' + w + 'px, 0px)'; spa.style.transition = 'transform 5s linear'; window.setInterval(function(){ spa.style.transform = 'translate(0px, 0px)'; spa.style.transition = 'transform 0s linear'; window.setTimeout(function(){ spa.style.transform = 'translate(' + w + 'px, 0px)'; spa.style.transition = 'transform 5s linear'; },100) },5000) </script> </html>
animation写法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>marquee</title> <style type="text/css"> #demo{ width: 100%; height: 50px; background: #eee; position: fixed; } #demo>span{ word-break:keep-all; white-space:nowrap; position: absolute; left: 100%; font-size: 30px; line-height: 50px; } #demo>.a{ -webkit-animation:demo 5s infinite; -webkit-animation-timing-function:linear; } </style> <style id='asty'></style> </head> <body> <div id="demo"><span id='spa' class='a'>走马灯效果</span></div> </body> <script type="text/javascript"> var spa = document.getElementById("spa"); var width = 0-(spa.offsetWidth); var style = document.getElementById("asty"); style.innerHTML = '@-webkit-keyframes demo{from {left: 100%;}to {left: '+width+'px;}}'; spa.className = 'a'; </script> </html>
纵向:
一、逐条无缝滚动(无闪动)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>marquee</title> <style type="text/css"> @-webkit-keyframes scrollText1 { 0%{ -webkit-transform: translateY(0px); } 20%{ -webkit-transform: translateY(-30px); } 40%{ -webkit-transform: translateY(-60px); } 60%{ -webkit-transform: translateY(-90px); } 80%{ -webkit-transform: translateY(-120px); } 100%{ -webkit-transform: translateY(-150px); } } @keyframes scrollText1 { 0%{ transform: translateY(0px); } 20%{ transform: translateY(-30px); } 40%{ transform: translateY(-60px); } 60%{ transform: translateY(-90px); } 80%{ transform: translateY(-120px); } 100%{ transform: translateY(-150px); } } .box3{ position: relative; top: 20px; left: 20px; width: 200px; height: 30px; overflow: hidden; border:1px solid #ccc; } .border3{ top: 0px; -webkit-animation:scrollText1 8s infinite cubic-bezier(1,0,0.5,0) ; animation:scrollText1 8s infinite cubic-bezier(1,0,0.5,0) ; } .border3 div{ height: 30px; } .border3:hover{ animation-play-state:paused; -webkit-animation-play-state:paused; } </style> </head> <body> <div class="box3"> <div class="border3"> <div>This is a test 1.</div> <div>This is a test 2.</div> <div>This is a test 3.</div> <div>This is a test 4.</div> <div>This is a test 5.</div> <div>This is a test 1.</div> </div> </div> </body> </html>
二、
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>marquee</title> <style type="text/css"> .marquee div { display: block; width: 100%; text-align: center; position: absolute; overflow: hidden; -webkit-animation: marquee 5s linear infinite; animation: marquee 5s linear infinite; } @keyframes marquee { 0% { transform: translateY(-50); } 100% { transform: translateY(-230px); // 每行高50 } } </style> </head> <body> <div class="marquee"> <div> <p class="label_txt">我是最后一个</p> <p>让我掉下眼泪的 不止昨夜的酒</p> <p>让我依依不舍的 不止你的温柔</p> <p>余路还要走多久 你攥着我的手</p> <p>走到玉林路的尽头 坐在(走过)小酒馆的门口</p> <p class="label_txt">我是最后一个</p> </div> </div>
清理配置缓存(当你添加配置文件或修改配置文件时一定要清理,否则无法读取新增配置文件或变动):
php artisan config:clear
清理文件缓存:
php artisan cache:clear
<p>页面将在<span id="show"></span>秒后自动跳转</p> <script type="text/javascript"> var t=5;//设定跳转的时间 setInterval("refer()",1000); //启动1秒定时 function refer(){ if(t===0){ location="{!! url('') !!}"; //#设定跳转的链接地址 } if(t>-1){ document.getElementById('show').innerHTML=""+t+""; // 显示倒计时 t--; // 计数器递减 } } </script>
创建项目
django-admin.py startproject HelloWorld
创建app
django-admin.py startapp TestModel
创建表结构
$ python manage.py migrate # 创建表结构
$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel # 创建表结构
在新增表后重新执行:
$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel # 创建表结构
Python有五个标准的数据类型:
List
列表是 Python 中使用最频繁的数据类型。
列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。
列表用 [ ] 标识,是 python 最通用的复合数据类型。
l = ['A', 'b', 'C']
tuple
元组是另一个数据类型,类似于List(列表)。
元组用”()”标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。
t = ('C', 'D', 'A')
dict
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典用”{ }”标识。字典由索引(key)和它对应的值value组成。
d = {'lisa': 90, 'hanmei': 70, 'harry': 85}
set
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
>>>x = set('runoob') >>> y = set('google') >>> x, y (set(['b', 'r', 'u', 'o', 'n']), set(['e', 'o', 'g', 'l'])) # 重复的被删除 >>> x & y # 交集 set(['o']) >>> x | y # 并集 set(['b', 'e', 'g', 'l', 'o', 'n', 'r', 'u']) >>> x - y # 差集 set(['r', 'b', 'u', 'n']) >>>
<?php /** * RSA加密 * env:(PHP 4 >= 4.0.4, PHP 5, PHP 7) * 密钥对生成 * 工具:OpenSSL * 生成私钥:genrsa -out rsa_private_key.pem 1024 * 生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem * Author:luchanglong * Date:2017-12-14 * ********************************************** * * 私钥丢失将导致数据永久无法解密 * ********************************************* */ header("Content-type: text/html; charset=utf-8"); class RsaTools { //私钥文件路径 private $rsaPrivateKeyFilePath; //私钥值 private $rsaPrivateKey; //公钥文件路径 private $rsaPublicKeyFilePath; //公钥值 private $rsaPublicKey; function __construct() { $this->rsaPrivateKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_private_key.pem'; $this->rsaPublicKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_public_key.pem'; } /** * rsa公钥加密 **/ public function rsaEncrypt($data) { if($this->checkEmpty($this->rsaPublicKeyFilePath)){ //读取字符串 $pubKey= $this->rsaPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; }else { //读取公钥文件 $pubKey = file_get_contents($this->rsaPublicKeyFilePath); //转换为openssl格式密钥 $res = openssl_get_publickey($pubKey); } ($res) or die('RSA公钥错误。请检查公钥文件格式是否正确'); $data=trim($data); openssl_public_encrypt($data,$encrypted,$pubKey);//公钥加密 $encrypted = base64_encode($encrypted); return $encrypted; } /** * rsa私钥解密 **/ public function rsaDecrypt($data) { if($this->checkEmpty($this->rsaPrivateKeyFilePath)){ //读字符串 $priKey=$this->rsaPrivateKey; $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($priKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; }else { $priKey = file_get_contents($this->rsaPrivateKeyFilePath); $res = openssl_get_privatekey($priKey); } ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置'); $data=base64_decode($data); openssl_private_decrypt($data, $dcyCont, $res); return $dcyCont; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } } $r=new RsaTools(); $str="0123456789?><~!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm"; echo '待加密:'.$str."<br>"; $en=$r->rsaEncrypt($str); echo '加密后:'.$en.'<br>'; $de=$r->rsaDecrypt($en); echo '解密后:'.$de;