标量:整型 浮点型 布尔型 字符串
复合型:"对象和数组
特殊类型:资源和null
常量:只能是标量;只能在声明时赋值,不能在运行时改变
/*var_dump($a) 查看数据类型+变量
/*echo gettype($a) 查看数据类型+
/*array(1,2,3)数组
/*object对象 class
/*resource资源类型
define("NAME","张三");常量 echo NAME;
defined("NAME")检查常量 返回bool
$age=30;变量
isset();检查变量 返回bool
echo _FILE_;获取路径
echo _LINE_;获取行数
echo PHP_VERSION;php版本
echo PHP_OS;
$a=100; 十进制
$a=-100;
$=0100; 八进制
$=0xff; 十六进制
标量:整型0false 浮点型0.0false 布尔型false 字符串"" "0"false
复合型:"对象和数组array[]false
特殊类型:资源true和nullfalse
1.强制转换 形成新的类型
$a="100abc";
$b=(int)$a;
var_dump($b);
2.强制转换 在原来改变
$a="100abc";
setType($a,"integer");
var_dump($a);
3.强制转换 形成新的类型
$a="100abc";
$b=intval($a);
var_dump($b);
强制转换
整型:(int) (integer)
(bool) (boolean)
(float)(double)(real)
(string)
数组(array)
对象(object) 读法 Oj
$_POST 在数组里显示
$_GET 显示
$_REQUEST; 不管get post都接受 读绿快
print_r($_POST) 全局数组
$_FILES 上传数据
$_COOKIE
$_SESSION
$_SERVER
$_ENA
REMOTE_ADDR 获取ip
DOCUMENT_ROOT 获取管理路径
SCRIPT_FILENAME 文件路径
运算符
算数运算符+ - * / % ++ --
比较运算符== === != <> !== < > <= >= ? :
逻辑运算符&& || ! and or xor
位运算符 & | ^ ~ << >> >>>
赋值运算符= += -= *= /= %=
其他运算符. .=
科学计数法 1.2e+4 1.2剩余10的4次反
$b=(int)$a; 不改变原来的数据,形成新的数据
setType($a,"integer"); 把原来的数据改变
$b=intval($a); 不改变原来的数据,形成新的数据
字符串转换整型 只会转换字母前的数,否则转换0 e字母转科学计数法
$a=10;
$b=$a++; //$b=10 $a=11;
$c=$b--; //$c=10 $b=9
&d=--$c; //&d=9 &c=9
$e=++$d; //$e=10 $d=10
// 10 + 8
$f=$e-- - --$e; //$e=8 $f=2
$g=$f++ + ++$f; //$f=4 $g=6
// 2 + 4
"100abc"==100 true 先转换整型再比较
"100abc"===100 false ===比较全等
<>不等 同 !=
$a=false;
$a?$b=100:$b=1000
如果a为真 执行 ?俩边数据 否则执行后面的
echo $b;
&& 俩个位true and
|| 其中一个为true 就是true or
! 起反 xor
and or xor 一般在连接数据库那样情况用
位运算 32位
& 按二进制 俩个为1时是1 否则是0
| 其中一个为1时 就是1
^ 不同为1,相同为0
~ 一元运算符 取反 11111111 11111111 11111111 11110000
<< 二进制向左移动n个 右边就补上n个0 前面是0补0是1补1某平台不同
>> 二进制右边移动n个 左边就补上n个0 前面是0补0是1补1某平台不同
>>> 全部补0
逻辑&& || 和位运算& | 一样用 但是短路&&一个false就不再计 &前面false一样计后面
$a+=1 等于 $a=$a+1
. 连接字符串来使用 不可以垃圾整型等 可以连接变量
.= 和+=类似
遇到优先级 用无限括号
字符串是整数
% 一般数在0-10
分支结构
if...else switch(变量)...case 参数:..break;..default try...catch
if()...else if()...else 还有嵌入式if
单个值使用switch方便
break b绿 跳出循环 同时匹配多个值
break 1 2退出多循环
default 默认与else相同
continue 本次循环停止,后面的继续 在while会死循环
continue 1 2退出多循环
case 1:
case 2:
echo "111";
同
if(n==1 || n==2)
循环结构
while(){} do{}...while(){}
for(; ;){}
函数是一段完成指定任务的已命名代码
function 函数名(参数1,参数2,....){ //形参
函数体
return 返回值
}
函数名() 调用 //实参
写返回值是个函数,不写是个过程
写函数的帮组文档
1.函数有几个参数 每个参数的类型
2.函数执行后返回什么样的结果
函数内的变量 局部变量
在函数外的 全局变量
$a=100;
function fun(){
global $a; //global 表示已声明
echo $a;
}
function fun(){
echo $GLOBAL["a"]; //global 表示已声明 使用global 数组中的全局变量
}
function fun(){
global $a; //global 表示已声明
$a=888; //成功输出 新成新的变量
}echo $a;
function fun($a){
global $a; //global 表示已声明
$a=888;
} echo $a; 数不变
function fun(&$a){
global $a; //global 表示已声明
$a=888;
} echo $a; 数变888传地址
echo "function_exists(fun)"; 检测函数存在 存在true 否则false
static 静态 共享 第一次初始化
变量区分大小学
函数其他不区分
实参可以比形参多
比形可以实参多 但是会警告 可以忽略 在调用加@ @fun()
function fun($a){
$args=func_get_args();//接收任意参数 为数组
echo count($args); //输出参数的个数
echo $args[4]; //输出参数的第几个 0-开始
}
fun(0,1,2,3,4)
function fun($a){
$sum=0;
$args=func_get_args();
for($i=0;$i<count($args);$i++){
$sum+=$args{i};
}
return $sum;
}
fun(0,1,2,3,4);
$b=fun; //把函数赋值b
$b(); //调用
递归调用自己调用自己
function fun($a){
if($a>1){
$r=$a*fun($a-1);
}else{
$r=$a;
}
return $r;
}
fun(3);//3x2x1
<?php //累加
$sm=0;
for($ii=0;$ii<=100;$ii++){
$sm+=$ii;
}
echo "$sm<br>";
function fun($a){
$sum=0;
$i=0;
if($i<=$a){
$sum=$a+fun($a-1);
}
return $sum;
}
echo fun(100);
?>
内部函数
不可以直接调用内部函数
但是可以在函数调用不同的外函数
重用函数
<?php
include("demo.php"); in ku lu
fun()
?>
<?php
require("demo.php"); 绿快儿 require "demo.php";
fun()
?>
避免函数名相同
include_once("demo.php"); 计文件名拷贝
require_once("demo.php");完全拷贝到
字符串
定义 双引号"" 单引号'' 反引号`` 定界符
双引号"" 1.可以在里面执行标量 .标量. ${num}
2.可以使用转义字符 "this is a \"string"\ test"
3.可以用'' 单引号
单引号'' 1.不能在单引号执行变量
2.只能使用部分转义字符\' \\
反引号`` 1.在反引号使用的是服务器的命令
定界符<<<1.可以在里面执行标量
2.可以使用转义字符
3.可以使用任何多的双引号""
$str=<<<<here
aaaaaaaaaaaa
aaaaaaaaaaaa
here;
1·函数的功能介绍
2·需要几个参数,一每个参数的类型,那些参数是必需的,那些参数是可选的。
3.函数返回值,返回值的类型
输出函数
echo()
print() 有返回值 1 0布尔型
die() 输出并退出程序
printf()
sprintf()可以保存才输出 变量
print_r() 输出数组
var_dump() 输出类型
echo "sss","sss"
$num=100.001;
printf("%s---%d"---%b---%x--%o--%c---%X---%f---%.2f,$num,$num)
按格式输出 字符串 整型 二进制 十六进制八进制 安编码 大写 浮点型 保留小数
printf("%'#20s",$num) 一共20位 补
ltrim()做掉字符串左空格
rtrmin()做掉字符串右空格
trim()去掉字符左右右空格
strrev()将字符串反转 新成新的变量
新的要赋值变量
strtolower()小写
strtoupper()大写
strlen($str) 查看长度
ucfirst()将第一个字符改大写
ucwords()将字符串中的每个单词改为大写
explode(string separator,string string,[,int limit])使用一个字符串分割别一个字符串
implode() 用一组较小的字符串创建一个大字符串 join另一个名
substr(string string,int start[,int length])取得部分字符串
strstr(string,string) 别名 strchr() 返回字符串中某字符串开始处至结束的字符串
strpos(string,char,[int offset]) 寻找字符中某字符最先出现的位置 从0开始
strrpos() 寻找字符中某字符最后出现的位置
strrchr() 返回最后出现的字符到结束的字符串
str_pad(string str,int length,string add,) 字符串的填补函数
STR_PAD_LEFT 左
STR_PAD_RIGHT 右
STR_PAD_BOTH 俩边
$ex=explode(" ",$str,2) 2分多
print_r($ex);
$arr=array("hello","ss")
implode(",",$arr)
> < ==
按字节进行字符串比较
strcmp(); < 1 >-1 =0
strcasecmp(); < 1 >-1 =0
按照自然排序法进行字符串比较
strnatcmp()
按照字符串的模糊比较
soundex() 读音相不同
similar_text(string,string,[$similar%]) 相同的数目
if(soundex($st)==soundex($stt)){
echo "==";
}else{
echo "!=";
}
echo similar_text($st,$stt,$similar);
echo $similar."%";
str_replace(string,string,string)替换 可以是arrays
str_replace(array,string,string)
str_replace(array,array,string)
str_replace(要替换的,替换成,那个字符串)
$str="http://www.uselib.com/bbs/index.php";
$arr=array("http"", "uselib", "com", "php");
$url=str_replace($arr, "lampuser", $str);
echo $str."<br>";
echo $url;
strtr(string,string,string) 字符串的翻译函数 替换
strtr($str,"com","net") 全部个换
$str="http://www.uselib.com/bbs/content.php";
$arr=array("http"=>"ftp","1ib"=>"1amp","com"=>"net","php"=>"jsp");
$url=strtr($str,Sarr);
stripslashes();去掉引号 addslashes()
<?php
echo stripslashes($_GET["username"]);
?>
<form>
请输入:<input type="text" size=100 name="username">
<input type="submit" value="提交">
</form>
htmlentities()处理标签 <center></center> htmlspecialchars()
<center></center>
strip_tags()删除标签
strip_tags("string","<b><i>")过滤
处理URL
对URL字符串的解析
parse_str()
parse_url();
URL编码处理函数
rawurlencode()要编码的字符串
rawurldecode()要解码的字符串
urlencode()要编码的字符串
urldecode()要解码的字符串
构造查询字符串等
http_build_query()
<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
?>
$str = "http://www.baidu.com/";
print_r(parse_url($str));
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&');
?>
PHP数组应用
1.PHP中数组的声明
2.PHP数组的遍历
3.PHP数组的相关处理函数
数组是一个可以存储一组或一系列数值的变量.
1.可以存储任何类型的数据(多数类型);
2.长度可以变长
下标:可以视为资料内容在些数组中的识别名称
数组的声明:
PHP数组分两类
索引数组:数组的索引值是整数,0开始
关联数组:数组以字符串作为索引值
关联数组不影响索引数组 重新0排序
$数组变量名[索引值]=资料内容
$arr[0]=12
arr["name"]="zhangsan";
$arr[]=10;
$arr[]=100;
$arr[0][0]二维数组 索引第一的数组中的第一个
$arr=array(array(array(),array()),array(array(),array()))三维数组
$数组变量名=array(资料内容,资料内容...)
$arr=array(1, "abc", 2);
$arr=array("one"=>1, 100=>"abc", 2);
$arr[0]=100;
$arr[1]=110;
以上个数组索引值是几就继续
$arr=null;
for($i=0;i<100;i++){
$arr=0;
}
$person["name"]="Koo"
$arr=array(1,2,“one”,3.333,true);
$arr=array("age"=>1,2,“one”,3.333,true);
"age"=>1指定下标
$arr[name]="Koo"
数组遍历
$arr=array(1,2,3,4,5,6);//只能索引数组 自定义索引麻烦输出
for($i=0;$i<count($arr);$i++){
echo "\$arr[".$i."]=".$arr[$i]."<br>";
}
foreach( as )循环结构
<?php
$arr=array(1,2,3,4,5,6);
foreach($arr as $key=>$value){
echo "\$arr[".$key."]=".$value."<br>";
}
?>
<?php //二堆数组
$arr=array(array(1,2,3,4,5,6),array(5,63,45,545,655));
foreach($arr as $key=>$value){
foreach($value as $k=>$v){
echo "\$arr[".$key."][".$k."]=".$v." ";
}
echo "<br>";
}
?>
while() list() each()
<?php
$arr=array(1,2,3,4,5,6);
while($a=each($arr)){//each到最后返回false while循环退出 each返回数组
echo "下标".$a[0]."---".$a["key"]."<br>";//0和key 是下标
echo "值".$a[1]."---".$a["value"]."<br>";//1和value是值
echo "\$arr[".$a["key"]."]"."=".$a["value"]." ";
}
?>
$arr=array(1,2,3);
list($a,$b,$c)=$arr;
echo $a."<br>";
echo $b."<br>";
echo $c."<br>";
数组相关处理函数
current(数组名称)取得value key(数组名称)取得key 只能第一个
next(数组名称)下一个 prev()上一个 end()最后 reset()重新 指针一个
<?php
$arr=array(1,7,"HH"=>9,"www"=>12,12,8=>6);
$acc=array(55,7,12,35);
$i=0;
while($i<count($arr)){
$a=current($arr);
next($arr);
print_r($a);
$i++;
}
?>
count()数组个数 sizeof()数组个数
array_change_key_case(目标数组,形态常数) 数组的索引大小写
CASE_UPPER CASE_LOWER 大小写
array_chunk(目标数组,索引个数,[booleam])将索引的数成小数组 改变成索引数组 加ture就保留
array_count_values(数组名称)数组值出现几次
array_fill(起始索引位置,区段大小,指定字元)
$arr=array_fill(10,100,"www");填充
array_filter(目标数组,自定义的函数)过滤
<?php
$arr=array(1,2,3,4,5,6,"sss");
$newarr=array_filter($arr,fun);
print_r($newarr);
function fun($value){
if($value==0){
return true;
}else{
return false;
}
}
?>
array_map()
<?php
$arr=array(1,2,3,4,5,6);
$newarr=array_map(fun,$arr);
print_r($newarr);
function fun($value){
return $value*$value;
}
?>
array_flip(目标数组) $key倒换$value
array_sum(数组) 计算数组的值的总和
array_unique() 取得没有重复的值
<?php
$a="uselib_one";
list($aa,$one)=explode("_",$a);
echo $one;
?>
<?php
$arr=array(1,2,3,4,5,6);
list($key,$value)=each($arr);
echo $key."<br>";
echo $value."<br>";
?>
<?php
$arr=array(1,2,3,4,5,6);
while(list($key,$value)=each($arr)){
echo $key."=>".$value."<br>";
}
?>
array_values() 返回值 key全部成索引
array_keys() 返回key为值 索引
in_array(value,$arr,true)查找value是否存在 返回bool
第一个参数:要检索的元素,第二个:数组本身 第三个参数:truefalse是否严格按数据类型进行检索
array_search()同上 返回key 查找value是否存在 不存在返回false
array_key_exists()查看key存在 返回bool
extract()数组转换成变量 只能关联数组
compact()变量 转换成 数组 保存key
$a=1;$aa=1;$aaa=compact("a","aa");print_r($aaa);
数组与栈array_push(数组,string,string)入栈多个返回数目
array_pop(数组)弹出栈只能一个删除数组那个元素 默认最后一个 返回元素的值
数组与队 先进先出 array_unshift(数组,value,...)开头输入入栈
array_shift(数组)开头弹出
忽略key数组排序
sort(数组) 排序
rsort()
usort()
保留key名排序
asort()
arsort()
uasort()
<?php
function fun($arr,$b){
if($arr==$b){return 0;}
return ($arr<$b)?-1:1;
}
$arr=array(1,7,9,4,2,6);
usort($arr,"fun");
print_r($arr);
?>
通过key名对数组进行排序
ksort()
krsort()
uksort()
<?php
function fun($arr,$b){
if($arr==$b){return 0;}
return ($arr<$b)?-1:1;
}
$arr=array(1,7,8=>9,6=>4,2,6);
uksort($arr,"fun");
print_r($arr);
?>
自然排序法排序
natsort()
natcasesort()
array_sum()数组相加
array_merge(数组,数组)合并数组
array_merge_recursive()
array_diff()相差什么返回什么
array_diff_assoc()vlue相同但key不同一样输出
array_intersect() 相同的返回
array_intersect_assoc() value和key相同才输出
PHP面向对象oop
什么是类电脑配置单,桌子图纸,椅子图纸,人类
什么是对象电脑教室(20台电脑,20桌子,20个椅子,一个投影,6灯,一个白板,一台IBM,手机,20个学员);类和对象之间的关系
什么是成员属性
什么是成员方法
类里面
{
成员属性 前面有个修饰var
成员方法
}
class人类
{
成员属性:姓名,性别,年龄,身高,体重;
成员方法:可以说话,工作,学习,吃饭,使用电脑
]
命名文件要和类名有关
person.php person_class.php
<?php
class Person{
//成员属性
var $name;
var $age;
var $sex;
var $phone;
//构造方法
function Person(){
//创建对象自动调用最先
}
//成员方法
function run(){
echo "我在说话";
}
}
class Phone{
var $xinghao;
function sendMessage($person,$message){
$person->phone->reviceMessage($Message);
}
function reviceMessage($Message){
echo "接信息是$Message<br>";
}
}
$p1=new Person();
$p2=new Person();
?>
实例化对象
$对象名称=new 类名称()
初始化静态段 在内存占一个 被数据共同用于的
栈内存 空间小访问速度快 长度不变的数据类型 int ....
堆内存 空间大访问速度慢 大的类型 空间不定长的类型 string 对象
代码段 语言的结构 函数信息
$p1->name="John";
$p2->name="Koo";
$p1->run();
在一个类中可以把另一个类 当属性
$phone1=new Phone();
$phone1->xinghao="sm-9100";
$phone2=new Phone();
$phone2->xinghao="sm-7100";
$p1->phone=$phone1;
$p1->phone->sendMessage($p2,"hello");
整合
<?php
class Person{
var $name;
var $age;
var $sex;
var $phone;
function run(){
echo "我在说话";
}
}
class Phone{
var $xinghao;
function sendMessage($Person,$Message){
$Person->phone->reviceMessage($Message);
}
function reviceMessage($Message){
echo "<br>接信息是$Message<br>";
}
}
$p1=new Person();
$p2=new Person();
$p1->name="John";
$p2->name="Koo";
$p1->run();
$phone1=new Phone();
$phone2=new Phone();
$phone1->xinghao="sm-9100";
$phone2->xinghao="sm-7100";
$p1->phone=$phone1;
$p2->phone=$phone2;
$p1->phone->sendMessage($p2,"hello");
?>
$对象名称->成员属性;
$对象名称->成员方法;
特殊的引用$this使用
function run(){
echo "MyName:".$this->name;
echo "<br>我在说话";
}
//构造方法
function Person(){
//创建对象自动调用最先
}
构造方法特点:名称是和类名相同,对象一产生的时候,就自动调用的方法
去初始化成员属性
function Person($name,$age,$sex){ //php4的
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
$p1=new Person("John",20,"男");在创建对象的时候就赋值
//PHP5的构造方法
function __construct(){}
先找PHP5的构造方法,找到就执行php5的,就不在执行php4的了
找不到,在执行php4的
function __destruct(){ //析构方法 结束前调用 最后创建的对象先开始
echo $this->name."bye<br>";
}
加@ 可以屏蔽警告
封装性
就是将对象内部的属性或方法封装在自己对象的内部,在对象内部可以被使用和访问,
但在对象的外部或是在其他对象里不能使用的封装的成员
private $age; p 来 var ti
private function eat(){
echo "<br>吃饭";
}
__set() __get() __isset() __unset()
在某一时刻自动调用的方法
private function __get($proName){
return $this->$proName;
}
echo "<br>".$p1->name."<br>";
public function __set($proName,$value){
if($proName=="age"){
if($value<0||$value>150)
return;
}
$this->$proName=$value;
}
$p1->age=33;
isset(变量) 判断变量是否存在 存在返回1 不在返回空
private function __isset($proName){ //访问对象中的私有属性
return isset($this->$proName);
}
if(isset($p1->age)){
echo "属性存在<br>";
}else{
echo "属性不存在<br>";
}
unset(变量) 清除变量
function __unset($proName){
unset($this->$proName);
}
unset($p1->age);
类的继承
继承就是对原有的扩展 单继承
class Student extends Person{
var $school;
function study(){
}
}
私有的方法继承的不能使用
私有属性也是 但是重新创建了属性 使用才正常使用
类方法的重载
同类中方法名和参数个数相同 不存在 没有这个概念
参数个数不同就有
现在说重载是指子类的 覆写
function __construct($name,$age,$sex,$school){
parent::__construct($name,$age,$sex);
$this->school=$school;
}
function run(){
parent::run();//调用继承父类的方法
echo $this->school."<br>";
}
访问类型
private protected public
protected在本类和子类可以访问
子类不能低于父类的访问权限 方法
final static const
define()常量
final: 只能用来定义类和方法
作用:使用final定义的类不能被继承
使用final 定义的方法不能覆盖重载
static共享的 属于类的
static成员,使用 类名::成员 self本类的静态
修饰属性和方法 用static声明的方法不能使用非静态成员;
class test{
static $s="sss";}
echo test::$s;
//echo self::$s;
静态的方法
Person::run();
const是一个在类里面定义成员属性为常量的关键字
不需要$的 大写
类名::成员属性
只能修饰属性
只有在声明的时候给初使值
class test{
const S="sss";}
echo test::S;
__toString() __clone() __call() __autoload()
__toString打印对象信息
class Person{
*
function __toString(){
$str="";
$str=$this->name.$this->age.$this->sex;
return $str;
}
}
$p1=new Person("John",22,"man");
echo $p1."<br>";
__clone对象克隆
$p2=$p1;//是把对象赋值与p2 共同管理一个对象
$p2=clone $p1;//克隆一个新的对象
function __clone(){
$this->name="JohnBak".$that->name;
//this指clone副本的 that指原本
}
$p2=clone $p1;//克隆一个新的对象
__call() 调用不存在的函数时调用
function __call($funName,$argus){//需要俩个参数 一个传入函数名 一个传入的参数是数组形式
echo $funName."函数";
print_r($argus);
echo "参数,不存在<br>";
}
$p1->fun("数组");//调用不存在函数
__autoload() 自动加载类php 写在外部的
function __autoload($className){//需要一个参数
include_once($className."_class.php");
}
对象的串行化 函数serialize() unserialize()
俩个过程:串行化,就是把对象转为二进制的字符串,serialize()
反串行化,把二进制字符串转化为对象 unserialize()
第一种:对象在网络中传输的时候
第二种:将对象写入文件或者写数据库时
$p1=new Person("John",22,"man");
echo $p1."<br>";
$str=serialize($p1);
$file=fopen("tmp.txt","w");
fwrite($file,$str);
fclose($file);
<?php
function __autoload($className){//需要一个参数
include_once($className."_class.php");
}
$file=fopen("tmp.txt","r");
$str=fread($file,filesize("tmp.txt"));
fclose($file);
$p=unserialize($str);
$p->run();
?>
定义在对象类中 系列化 休眠
function __sleep(){//serialize部分
$arr=array("name","sex");
return $arr;
}
定义在对象类中 系列化 唤醒
function __wakeup(){//唤醒并且修改
$this->name="wakeup";
$this->age="999";
}
抽象类与接口
抽象方法:在类里面没有方法体的方法是抽象方法,没有{}以及其中的内容,
在方法名后面加一个分号,另外还要在方法声明时加上关键字abstract来修饰
abstract function fun1();
抽象类:如果一个类里面有一个方法是抽象的,此类就是抽象类;
用abstract修饰的类 抽象类不可以实例化对象
要被子类继承 并且覆写全部抽象方法 才能实例化
abstract class Demo{
可以有成员属性
可以有普通方法
至少一个抽象方法
}
class Test extends Demo{覆写全部方法}
用途:抽象类就相当于一个规范
接口:相当于一个规范 不可以实例化对象
要被子类继承 并且覆写全部方法 不全部就是抽象类 可以用abstract修饰 才能实现接口
子类可以有多个接口
实现接口时使用implements ==extends
可以使用抽象类去实现接口的部分方法;
interface 接口 extends 接口{}
class 子类 implements 父类,父类2{}
class 子类 extends 父类 implements 父类,父类2{}
interface Demo{
所有的成员属性必须是常量;
所以的方法都是抽象的 不用abstract修饰
所有的成员都是必须是public
}
多态的应用
弱类型
类直接对象 调用 不好像java子类父类类型转换
interface PCI{
function start();
function stop();
}
class NetCard implements PCI{
function start(){ echc "start";}
function stop(echc "stop";);
}
class ViewCard implements PCI{
function start(){ echc "start";}
function stop(echc "stop";);
}
class mainBoard{
function usePCI($pci){$pci->start();$pci->stop();}
}
class Person{
function install(){
$nc=new NetCard();$vc=new ViewCard();
$pci=$nc;$pci=$vc;
$pci->start();$pci->stop();
}
}
$p=new Person();
$p->install();
正则表达式
描述字符排列模式一种语法规则:
作用:字符串的模式分割 匹配 查找 替换
正规字符:abcd 123456 特殊字符:()?^$
俩套函数库:
PCRE preg_ 效力高
POSIX ereg_ 可以不用定界符
原子:(普通字符,如:英文字符) 单个字符 数字 a-z A-Z 0-9 单元(abc)
表子表:[abc]匹配其中一个 [^abc0-9]除里面的
转义字符:
\d 匹配一个数字[0-9]
\D 匹配除数字外的字符 [^0-9]
\w 匹配一个英文字符,数字,下划线_ [0-9a-zA-Z_]
\W 匹配除一个英文字符,数字,下划线_外的字符[^0-9a-zA-Z_]
\s 匹配空白字符 [\f\n\r\t\v]
\S 匹配除空白字符[^\f\n\r\t\v]
\f 换页字符
\n 换行
\r 回车
\t 制表符符
\v 垂直制表符
\oNN 八进制
\xNN 十六进制
\cC 控字符
元字符:(有特效功能用途字符)*+?.|^$
* 0,1多次匹配其前的原子
+ 1多次匹配其前的原子
? 0次或1次匹配其前原子
. 匹配除换行符外任何一个字符 win[^\n\r] linux[^\n]
| 优先级低 或 匹配俩个或多个选择
^ 匹配字符串串首的原子 $mode="/^ab/";
$ 匹配字符串串尾的原子 /ab$/
\b 单词边界 this this空格边界的
\B ^单词边界
{m} 表示其前原子恰好出现m次
{m,n} 表示其前原子出现至少出现m次,或者n次
{m,} 表示其前原子出现不少于m次
(abc) 整体表示一个原子 (\W)系统存-\\1读取第一个存匹配
/^\d{4}(\W)\d{2}(\W)\d{2}\\1\d{2}\\2\d{2}$/
(\W)系统存-\\1读取第一个存匹配
优先级
模式匹配的顺序 左到右
模式单元() 1 最高
重复匹配? * + {} 2
边界限制^ $ \b \B 3
模式选择 | 4
模式修正字符: (i,U,s,x)
增强正则表达式
标记在整个模式之外 /abc/iUsx
i 不区分大小写的匹配
m 将字符串视为多行
s 将字符串视为单行,换行符作为普通字符
x 将模式中的空白忽略
e 与替换的字符串。当表达式求值结果替换 单引号、双引号、反斜线(\)和 NULL 字符在后向引用替换时会被用反斜线转义.
A 强制与模式开头匹配
D 强制与模式结尾匹配 有换行\n不行 $结尾\n可以
U 匹配与模式最近的一个 :html <b>
S 额外的分析
search:常用的正则表达式
preg_match(string pattern,string subject[,array matches[,int flags]]) 多个数组
<?php
$content="当前的日期和时间是".date("Y-m-d h:i a").",我们一起学习php";
if(preg_match("/(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) ([ap]m)/",$content,$m)){
echo "匹配的时间是:".$m[0]."<br>";//$m[0]全部
echo "匹配的日期是:".$m[1]."<br>";//$m[1]
echo "匹配的时间是:".$m[2]."<br>";//$m[2]
echo "匹配的上下午是:".$m[3]."<br>";//$m[3]
}
?>
<?php
$content="abcaaaaaaaaaa";
if(eregi("^abc",$content,$m)){ //不需要定界符eregi不区分大小写
echo "匹配成功".$m[0]."<br>";
}
?>
str高于正则表达式
preg_match_all()全局匹配 多次匹配放到array
<?php
$urlstr="看看http://有lamp视频,在http://www.baidu.com搜索.";
echo url2html($urlstr);
function url2html($urlstr)
{
preg_match_all("/http:\/\/(www\.)?.+\.(com|org|net)/iU",$urlstr,$urls);
foreach($urls[0] as $url)
{
$urlstr=str_replace($url,"<a href=$url>$url</a>",$urlstr);
}
return $urlstr;
}
?>
preg_grep(string pattern,array input[,int flags]) 和数组匹配 过滤
<?php
$arr=array("aaa b2b","ccc","233");
$brr=preg_grep("/\d/i",$arr); //$brr=preg_grep("/^[a-z]*$/i",$arr);
print_r($brr);
?>
preg_replace()替换
preg_replace("/\d/","MM",$str,1) 默认全部-1 1
preg_replace("/\d/e","md5(MM)",$str) e当表达式
str="current date and time is".date("Y-m-d h:i a").",we are learning php";
echo preg_replace("/(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) ([ap]m)/",
"<font color=red>\\1<font><font color=red>\\2<font><font color=red>\\3<font>",
$str
);
preg_split()分割 是个数组
arr=preg_split("/[: , \s]/",$str);
.任意字符一个
.+或者.* 0个多个
?可以没有
.*?
\x7f-\xff 中文
UBBCode转义
<b></b> [b][/b] 论坛发贴
注入网络的一种技术类似html 避免html的效果
<?php
$str="[b]粗体[/b]<br>
[font=宋体]font[/font]<br>
[size=7]size[/size]<br>
[color=red]color[/color]<br>
[align=left]align[/align]<br>
[url=http://www.baidu.com]http://www.baidu.com[/url]<br>
[url]www.baidu.com[/url]<br>
[email=lamp@gmail.com]gmail[/email]<br>
[img]img[/img]<br>
[code]code[/code]<br>";
echo $str;
echo "<br>";
echo conUbb($str);
function conUbb($str)
{
$pattern=array(
"/\[b\](.*?)\[\/b\]/is","/\[u\](.*?)\[\/u\]/is","/\[i\](.*?)\[\/i\]/is",
"/\[font=([,\w\x7f-\xff]+?)\](.*?)\[\/font\]/is",
"/\[color=([a-z]{3,}|#?[0-9a-f]{6})\](.*?)\[\/color\]/is",
"/\[size=(\d{1,2})\](.*?)\[\/size\]/is",
"/\[align=(left|center|right)\](.*?)\[\/align\]/",
"/\[url=(.*?)\](.*?)\[\/url\]/is",
"/\[url\]www\.(.*?)\[\/url\]/is",
"/\[email=([.a-z]*?@[.a-z]*?)\](.*?)\[\/email\]/is",
"/\[img\](.*?)\[\/img\]/is"
);
$replacement=array(
"<b>\\1</b>","<i>\\1</i>","<u>\\1</u>",
"<font face='\\1'>\\2</font>",
"<font color='\\1'>\\2</font>",
"<font size='\\1'>\\2</font>",
"<div align='\\1'>\\2</div>",
"<a href='\\1' target=_blank>\\2</a>",
"<a href='http://www.\\1' target=_blank>www.\\1</a>",
"<a href='mailto:\\1'>\\2</a>",
"<img src='\\1'>"
);
$str1=preg_replace($pattern,$replacement,$str);
return $str1;
}
?>
查找分割匹配过滤
<?php
$str="名字: {name}<br>,email: {email}<br>,age: {age}";
$arr=preg_split("/[: , \s]/",$str);
foreach($arr as $value){
echo $value."<br>";
}
?>
<form>
输入一个字符串:<input type="text" name="str1">
<input type="submit" value="提交">
</form>
<br><hr>
<?php
$str1=$_REQUEST["str1"];
$mode="/abc/";
if(preg_match($mode,$str1,$content)){
echo $str1."和模式".$mode."匹配成功".$content[0];
}else{
echo $str1."和模式".$mode."不匹配成功";
}
?>
<?php
$urlstr="回复康师傅http://www.baidu.com 防腐剂 分开解放军萨福克
http://www.lamp.com进口量金风科技";
echo url2html($urlstr);
function url2html($urlstr){
return preg_replace("/.*(http:\/\/www\.\w+\.com) .*/is","<a href=\\1>\\1</a>",$urlstr,1);
}
?>
<?php
$urlstr="create table tab1 (id int,name varchar(20))";
echo url2html($urlstr);
function url2html($urlstr){
return preg_replace("/.*create table ([a-z0-9_]+) .*/is","\\1",$urlstr,1);
}
?>
<?php
$str="名字: {name}<br> email: {email}<br> age: {age}";
$pattern=array("/{name}/","/{email}/","/{age}/");
$replacements=array("John","qq@qq.com","23");
echo preg_replace($pattern,$replacements,$str);
?>
9.1文件系统处理
文档--本地 联网
gvim
https://blog.csdn.net/zxy9602/article/details/79439257
C:\Program Files\Git\cmd\curl.cmd
curl --version
所有在 linux 下在 .vimrc 中配置的命令,都可以在 defaults.vim 文件中进行配置
https://blog.csdn.net/Alisebeast/article/details/79868694
fopen("目的文件名称","文件打开模式参数")
目的文件件名称:
windows:c:\\text/test.txt
linux:/root.DIRECTORY_SEPAPATOR.test/test.txt
linux:/root/test/test.txt
../
http:/x/x.php
ftp:/x/x
文件打开模式参数
r 只读打开 文件必须存在 指针开头
r+ 读写打开 文件必须存在 指针开头
w 写文件打开 将文件清空 不存创建 指针开头
w+ 读写打开文件 将文件清空 不存创建 指针开头
a 写打开 追加 不存创建 指针结尾
a+ 读写打开 追加 不存创建 指针结尾
x 读打开 存在false 不存在创建文件 指针开头 只能本地
x+ 读写打开 存在false 不存在创建文件 指针开头 只能本地
b 只能win 创建二进制文件
t 只能win \n转换\r\n 跨平台文件
$file=fopen 成功返回文件相当true 不返回boolfalse
if(!$file){
echo 'error';
exit();
}
直接 or die('openerror');
fwrite 写入文件
for []
fwrite($file,'内容','int只写多少个');
fclose($file) or die('closeerror') 关闭
关闭成功true false
PHР文件系统(文件操作)
1·写入文件
2.写入数据库
php对文件系统的操作是基于Unix系统,或者linux文件一般处理函数fopen();
<?php
$file=fopen('test.txt','a+') or die('openError');
/*if(!file){
echo 'openError';
exit();
}*/
for($i=0;$i<10;$i++){
fwrite($file,'helloworld',10);
}
fclose($file) or die('closeError');
?>
少打$ 循环 死机
$i++ 只一个递增 死循环
9.2 文件系统处理
fwrite 别名 fputs()
fread($file,filesize($filename));
读取全部
fgets($file,intLength) 返回文件一行长度
读取一行
循环读取
指针往下
fgetc($file) 读取一个字符 指针往下
返回内容
结尾返回false
filesize($filename)
获得文件大小
feof($file)
feof 判断是否到文件 末尾
{
<?php
$fileName="test.txt";
$file=fopen($fileName,'a+') or die('openError');
// echo fread($file,filesize($fileName));
while(!feof($file)){
$linestr=fgets($file);
echo $linestr."<br>";
}
fclose($file) or die('closeError');
?>
}
{
<?php
$fileName="test.txt";
$file=fopen($fileName,'a+') or die('openError');
while(($ch=fgetc($file))!==false){
echo $ch.'<br>';
}
fclose($file) or die('closeError');
?>
}
file($filename);
返回一个数组
每一行一个元素
不用打开 关闭文件
<?php
$filename="test.txt";
$lineArr=file($filename);
var_dump($lineArr);
?>
<?php
$filename="test.txt";
$lineArr=file($filename);
foreach($lineArr as $line){
echo $line."<br>";
}
?>
readfile();
直接输出到浏览器 里面
读入一个文件并写入到输出缓冲里面
不方便控制 直接dom
不用打开关闭
看内容 还可以
file_exists($filename) 判断文件存在 返回bool
{
<?php
$filename="count.txt";
//文件不存在 创建文件
if(!file_exists($filename)){
$f=fopen($filename,'w');
fwrite($f,0);
fclose($f);
}
//fn 累加
function counts($filename){
$file=fopen($filename,'r');
$num=fread($file,8);
fclose($file);
echo "访问数量:".$num."次<br>";
$num+=1;
$second=fopen($filename,'w');
fwrite($second,$num);
fclose($second);
}
counts($filename);
?>
}
9.3 文件系统处理
fopen('http://www.baidu.com/1.txt','r');
远程文件 有权限 只能 读取 打开
并且php.init配置应许
allow_url_fopen=on
{
<?php
$file=fopen("http://127.0.1/es6/test.txt",'r');
$data="";
while(!feof($file)){
$data.=fgets($file,1024);
}
echo $data;
fclose($file);
?>
}
php 不能自己现在用的路径
过
<?php
$file=fopen("test.txt",'r');
$data="";
while(!feof($file)){
$data.=fgets($file);
}
preg_match_all("/<title>.+?<\/title>/",$data,$arr);
echo $arr[0][0];
foreach($arr[0]) as $h3){
echo $h3.'<br>';
}
fclose($file);
?>
file_get_contents($filename)
可以本地 网络
不用 打开关闭 都封装好了
file_put_contents($filename,'内容');
写入内容
不用 打开关闭 都封装好了
返回内容长度
清空 替换
防止多个人同时操作文件
flock(); 锁成功true false
枷锁
$file=fopen('test.txt','r');
flock($file,[conts]);
LOCK_SH:共享锁定,读文件的时候使用
LOCK_EX:独占锁定,写入文件的时候使用
LOCK_UN:释放锁定
LOCK_NB:附加锁定
读完 lock_un 释放文件 第三个才可以读取
die('推出并且输出')
{
<?php
$filename="test.txt";
$file=fopen($filename,'r');
//lock_sh 共享锁定 读取用
//lock_ex 独占锁定 写入用
//lock_un 释放锁定
//lock_nb 附加锁定
if(!flock($file,LOCK_SH)){
die("无法锁定文件");
}
echo fread($file,filesize($filename));
if(!flock($file,LOCK_UN)){
die("无法释放文件锁");
}
fclose($file) or die("文件关闭失败");
?>
}
俩人操作写文件 大家都锁定
多重锁定 error
防止 多锁定 加 附加锁
等一个人 释放了 才可以
LOCK_EX+LOCK_NB
{
<?php
$filename="test.txt";
$file=fopen($filename,'a+');
//lock_sh 共享锁定 读取用
//lock_ex 独占锁定 写入用
//lock_un 释放锁定
//lock_nb 附加锁定 多人写多独占锁定 加附加
if(!flock($file,LOCK_EX+LOCK_NB)){
die("无法锁定文件");
}
fwrite($file,"helloworld");
if(!flock($file,LOCK_UN+LOCK_NB)){
die("无法释放文件锁");
}
fclose($file) or die("文件关闭失败");
//file() file_get_contents() readfile()
echo file_get_contents($filename);
?>
}
9.4 文件系统处理
文件指针
ftell() 返回文件指针 位置
fseek() 设置指针位置 返回bool
fseek(文件指针,移动的字节数,起始位置)
fseek($file,30,SEEK_CUR) 读30字符(相当跳过30字符) 当前 ftell查看
还可以是-5 反读
起始位置
SEEK_CUR当前位置
SEEK_SET开头
SEEK_END结尾
rewind() 移动指针到文件 开头
组合fread(file,设置指针)
{
<?php
$filename="test.txt";
$file=fopen($filename,'r');
//lock_sh 共享锁定 读取用
//lock_ex 独占锁定 写入用
//lock_un 释放锁定
//lock_nb 附加锁定 多人写多独占锁定 加附加
if(!flock($file,LOCK_SH+LOCK_NB)){
die("无法锁定文件");
}
echo fread($file,100)."<br>";
echo ftell($file);//ftell获得文件指针位置
//SEEK_CUR 当前位置
//SEEK_SET 开头
//SEEK_END 结尾
//fseek 移动文件指针 -1|多少字符 位置
fseek($file,20,SEEK_SET);//return bool
echo "<br>".ftell($file);
//rewind 指针文件开头
rewind($file);
echo "<br>".ftell($file);
if(!flock($file,LOCK_UN)){
die("无法释放文件锁");
}
fclose($file) or die("文件关闭失败");
//file() file_get_contents() readfile()
// echo file_get_contents($filename);
?>
}
都不要 打开 关闭 文件
copy("c:\\curentFilename","c:\\targetFilename") 复制 return bool
unlink("c:\\targetFilename") 删除 return bool
rename("demo.txt","hello.txt") 重新命名 return bool
需要打开 关闭
$fp=fopen() 返回文件的指针
ftruncate($fp,int多少Char) 截取文件内容 return bool
源文件 改变 只能保留 截取文件内容
{
< ?php
if(copy("test.txt",'copy.txt')){//copy
echo "copy success";
} else{
echo 'copy error';
}
if(unlink("copy.txt")){//del file
echo "del success";
}else{echo 'del error';}
if(rename("test.txt","rename.txt")){//rename
echo "rename success";
}else{echo "rename error";}
$fp=fopen("rename.txt",'a+');//return file指针
if(ftruncate($fp,10)){//ftruncate 截取
echo 'ftruncate success';
}else{echo 'ftruncate error';}
?>
}
9.5 文件系统处理
参数 都是 文件名 如果是目录
时间戳 date("Y-m-j",timestamp)
filectime() 文件创建时间
filemtime() 修改时间
fileatime() 最后访问时间
file_exists() 文件存在
filesize() 文件大小
filetype() 文件类型
is_dir() 是否目录
is_file() 是否是文件
is_link() 是否是链接文件
is_executable() 是否可执行文件
is_readable() 是否可读写文件
is_writable() 是否可以写文件
{
<meta charset="utf-8">
<?php
$filename="data";
if(file_exists($filename)){
echo "文件存在".'<br>';
if(is_file($filename))echo "是文件"."<br>";
if(is_link($filename))echo "是链接文件"."<br>";
if(is_executable($filename))echo "可执行文件"."<br>";
if(is_readable($filename))echo "可读文件"."<br>";
if(is_writable($filename))echo "可写文件"."<br>";
echo "filesize:".filesize($filename)."<br>";
echo "filetype:".filetype($filename)."<br>";
echo "fileCreateTime:".date("Y年m月j日",filectime($filename))."<br>";
echo "fileXiuGaiTime:".date("Y年m月j日",filemtime($filename))."<br>";
echo "fileFanWenTime:".date("Y年m月j日",fileatime($filename))."<br>";
}else{
echo "文件不存在";
}
?>
}
在win 修改不太明显
linux下
还是改文件权限 改group rwx
chmod($filename,0644) return bool
权限
chown($filename,501) return bool
所有者
chgrp($filename,503) return bool
所有组
fileowner($filename)
文件所有者 0管理员 返回id
filegroup($filename)
文件所有组 0管理员 返回id
继续 再重来
{
//chmod($filename,0777);//权限修改
//chown($filename,501);//所有者修改
//chgrp($filename,503);//所有组修改
echo fileowner($filename)."<br>";//return 所有者uid
echo filegroup($filename)."<br>";//return 所以组id
}
9.6 文件处理之目录操作
9.7 文件处理之目录操作
目录操作
遍历目录 循环遍历 函数遍历
打开文件
fopen() fread() fclose()
打开目录
opendir(目标路径);
return bool fase+e_wangine警告信息
@opendir() @屏蔽警告
readdir(目录引用句柄) 文件目录都读取 但不目录下面的目录和文件
return bool 指针 目录里面目录下个
读取一个目录文件 循环读取 指针向下
没有 返回false 到底
特殊俩个目录 .当前 ..上级目录
不输出 或先读取跳过
if判断. ..
rewinddir() 指针目录开始
closedir()
检索目录 ==shell ls * ls?
* 任意字符 ?任意一个字符 {包括}
glob('目标路径',[模式]) 检索目录 returnArray
模式: 常量大写
glob_mark 返回时加一个斜线
glob_nosort 原顺序返回 不排序
glob_nocheck 没匹配文件 返回 搜索模式
glob_noescape 反斜线不转义字符
glob_brace 扩充{a,b,c} 匹配 a b c
glob_onlydir 仅返回目录
glob_err 停止并读取错误信息 不可读取目录 win的系统格式目录...
$fileArray=glob('data/a*'); a开头文件目录
$fileArray=glob('data/*'); 所有
$fileArray=glob('data/????.php'); 四个字符的.php文件
$fileArray=glob('data/{a,b}*'); 包括a或b 开头的文件
foreach遍历
{
<meta charset="utf-8">
<?php
$fileArr=glob('data/*',GLOB_ONLYDIR);
foreach($fileArr as $file){
echo "文件:".$file.'<br>';
}
?>
}
建立目录
mkdir($pathname,[,mode])
目录名字 权限0777
return bool
{
if(mkdir('createdir',0777)){
echo "目录创建成功";
} else{
echo "目录创建失败";
}
}
删除目录
安全 不要是系统目录
delete 只是文件 连接文件 未知
unlink 只是删除文件 连接文件
rmdir(dirname)
只能删除空目录
有文件 目录都不行了
递归删除
{
<meta charset="utf-8">
<?php
$dirname="createdir";
function deleteDir($dirname){
$dirJB=@opendir($dirname);
readdir($dirJB);//.
readdir($dirJB);//.
while(($file=readdir($dirJB))!==false){
$file=$dirname.DIRECTORY_SEPARATOR.$file;
if(is_dir($file)){
deleteDir($file);//如果是目录 递归 删除 自己调用自己
}
else{
if(unlink($file)){
echo "删除文件成功:".$file.'<br>';
}
else{
echo "删除文件失败:".$file."<br>";
}
}
}
closedir($dirJB);//先关闭 占用
if(rmdir($dirname)){
echo "目录删除成功:".$dirname."<br>";
}
else
{
echo "目录删除失败:".$dirname."<br>";
}
}
deleteDir($dirname);
?>
}
复制目录
复制目录暂时没有提供 copy('','');
自己写
递归 目录创建 文件拷贝
加计算器 global调用全局变量 并且赋值
{
<meta charset="utf-8">
<?php
$fileCount=0;
$dirCount=0;
function copyDir($dirFrom,$dirTo){
global $fileCount;//调用全局变量 赋值
global $dirCount;
if(is_file($dirTo)){
die("拷贝目录失败");//目标可是目录 copey里面去 不能是文件
}
//判断文件目录存在 不存在创建
if(!file_exists($dirTo)){
mkdir($dirTo);
$dirCount++;
}
$handle=opendir($dirFrom);
readdir($handle);//. ..
readdir($handle);//. ..
//dirFrom 如果是目录创建 文件拷贝
while(($file=readdir($handle))!==false){
$fileFrom=$dirFrom.DIRECTORY_SEPARATOR.$file;
$fileTo=$dirTo.DIRECTORY_SEPARATOR.$file;
if(is_dir($fileFrom)){
copyDir($fileFrom,$fileTo);//目录 递归
}
else{
copy($fileFrom,$fileTo);//文件拷贝
$fileCount++;
}
}
closedir($handle);
}
copyDir("data","data1");
echo "创建目录:".$dirCount."<br>";
echo "创建文件:".$fileCount."<br>";
?>
}
is_idr("phpdir"."/".$file)
win\\ linux/ other可能不
都支持 //
跨平台分隔符
directory_separator
常量 大写
在读一次 目录指针下面 二次不执行
rewinddir 目录指针开头
{
<meta charset="utf-8">
<?php
$dirHandle=@opendir("data") or die("open dir error");
readdir($dirHandle)."<br>";
readdir($dirHandle)."<br>";
while(($file=readdir($dirHandle))!==false){
//if(is_dir($file)){
if(is_dir("data".DIRECTORY_SEPARATOR.$file)){
echo "目录:".$file."<br>";
}else{
echo "文件:".$file."文件大小:".filesize("data".DIRECTORY_SEPARATOR.$file)."<br>";
}
}
rewinddir($dirHandle);
echo "<br>二次读取<br>";
while(($file=readdir($dirHandle))!==false){
if($file!='.' && $file!='..'){
if(is_dir("data".DIRECTORY_SEPARATOR.$file)){
echo "目录:".$file."<br>";
}else{
echo "文件:".$file."文件大小:".filesize("data".DIRECTORY_SEPARATOR.$file)."<br>";
}
}
}
closedir($dirHandle);
?>
}
$d=dir(目标目录str) 返回目录对象
oop 模式
对象下面的方法
路径 $d->path
引用句柄 $d->handle
读取内容 $d->read()
同readdir return 文件 失败false
读取一个文件目录
指针向下 循环读取
关闭 $d->close();
{
<meta charset="utf-8">
<?php
$d=dir("data");
echo "路径:".$d->path."<br>";
echo "句柄指针".$d->handle."<br>";
// $->read();.
// $->read();..
while(($file=$d->read())!==false){//readdir()
if($file!='.'&&$file!='..'){
echo "文件目录:".$file."<br>";
}
}
$d->close();//closedir()
?>
}
优化 如果文件存在 提示 覆盖 或者跳过
echo break
C:\Users\Administrator\Desktop\video_10
10.1 文件上传
文件上传
文件下载
1.表单提交
2.对文件的操作
<input type="test" name="xxx">
<input type="password" name="yyy">
http协议
表单必须要改的:
<form>
1.method="post"
2.enctype="multipart/form-data" form
服务器 才自动 是上传 常规文件 带文件大小
$_post ... 看不到数据 提交数据 不是设置enctype 并没上传 只是路径str 刷新
$_files [][] 看提交 文件 数据 全局 post get request 都看到
支持多个 上传
input:hidden name="max_file_size" value=10000 控制上传文件大小 1k 字节
安全 可以篡改 表面限制下
服务器限制 php.ini
不加是 路径地址
$_files 会显示上传位置
C:\Users\Administrator\AppData\Local\Temp\php6584.tmp
缓存 系统自动clean
php.ini
file_upload=on 是否应许文件上传
upload_max_filesize = 2M 服务器限制上传大小
post_max_size = 8M post数据大小
$_get post request files
gvim自动补齐
https://blog.csdn.net/sunjiajiang/article/details/36875781
https://jingyan.baidu.com/article/e3c78d6469c3903c4c85f596.html
按ctrl + x 状态栏提示 ,再按ctrl + o
插件 特效 不重要 过 diy打到会 复习
html
{
<html>
<head>
<title>上传文件</title>
<meta charset="utf-8"/>
</head>
<body>
<form enctype="multipart/form-data" action="todo.php" method="post">
User:<input type="text" name="user"/><br>
Passwd:<input type="password" name="pwd"/><br>
<input type="file" name="upfile"/><br>
<input type="hidden" name="MAX_FILE_SIZE" value="100000"/>
<input type="file" name="upfile1"/><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
}
server
{
<meta charset="utf-8"/>
<?php
//echo $_GET['user'];//get
//echo $_POST['user'];//post
//print_r($_POST); 单 全部内容
echo $_REQUEST['user']."<br>";//get post
echo $_REQUEST['pwd'];//get post
// var_dump($_REQUEST);//全部 字符串 fileset属性不显示
print_r($_FILES);//form enctype="multipart/form-data" input:file 显示详细
?>
}
10.2 文件上传
$_FILES
标准的MIME类型
text
text/html .html .htm...
text/plain .txt .log
image
image/gif .gif
image/jpeg .jpeg .jpg
image/png .png
audio
audio/x-midi mid .mid .midi
audio/w-wav .wav
video
video/quicktime .qt .mov
video/mpeg .mpeg
application
application/pdf .pdf
application/msword .doc .dot
application/vnd.ms-excel .xls
application/vnd.ms-powerpoint .ppt
application/zip .zip
application/rar .rar
application/xml .xml .xsl
application/mshelp .hlp .chm
application/octet-stream .ext .bin .com .dll .class
multipart
message
控制上传 类型
注意 可执行 文件 权限
安全 临时文件 不能 执行 rwx rw-
安全 目录都是随机字符串 临时目录
cpoy 到 自己指定 目录 也行了
专门函数
move_uploaded_file()
移动上传文件 return bool
move_uploaded_file(目标路径,现在路径可同时改名)
move_uploaded_file(.$_FILES['upfile']['tmp_name'],'upload/'.time().$_FILES['upfile']['name'])
改名 随机 安全
成功显示大小 size b /512*1024
byte/512*1024 to kb
echo "size:".($_FILES['upfile']['size']/512*1024)."kb<br>";
$_files[myfile][error]>0
才执行 移动
switch
1.上传的文件超过了php.ini upload_max_fileszie
2.上传的文件超过了html表单中max_file_size
3.文件部分上传 不完整
4.没有文件上传
论坛discuz ->
判断上传文件 在不在 临时 目录 下
is_uploaded_file($_FILES['upfile']['tmp_name'])
return bool
在 才执行 移动
版本 老是 4 成功也是..暂时注销4
看错了 有俩个file
一个file 0 一个不用是4 [[]]
{
<html>
<head>
<title>上传文件</title>
<meta charset="utf-8"/>
</head>
<body>
<form enctype="multipart/form-data" action="todo.php" method="post">
User:<input type="text" name="user"/><br>
Passwd:<input type="password" name="pwd"/><br>
<input type="file" name="upfile"/><br>
<input type="hidden" name="MAX_FILE_SIZE" value="100000"/>
<input type="file" name="upfile1"/><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
}
{
<meta charset="utf-8"/>
<?php
//echo $_GET['user'];//get
//echo $_POST['user'];//post
//print_r($_POST); 单 全部内容
echo $_REQUEST['user']."<br>";//get post
echo $_REQUEST['pwd'];//get post
// var_dump($_REQUEST);//全部 字符串 fileset属性不显示
print_r($_FILES);//form enctype="multipart/form-data" input:file 显示详细
echo "<br>";
echo "name:".$_FILES['upfile']['name']."<br>";
echo "size:".$_FILES['upfile']['size']."<br>";
echo "type:".$_FILES['upfile']['type']."<br>";
echo "path:".$_FILES['upfile']['tmp_name']."<br>";
if($_FILES['upfile']['type']!="text/plain"){
// die("你传的不是文本文件");
echo "你传的不是文本文件<br>";
}
if($_FILES['upfile']['error']>0){
switch($_FILES['upfile']['error']){
case 1:echo '超过服务器限制';break;
case 2:echo '超过form限制';break;
case 3:echo '没上传完';break;
case 4:echo '没上传';break;
}
exit;
}else{
//exists temp 文件存在 才移动
if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
$path='data'.DIRECTORY_SEPARATOR.time().$_FILES['upfile']['name'];
//从temp 移动到 指定目录 rw-
if(move_uploaded_file($_FILES['upfile']['tmp_name'],$path)){
echo 'upload sussecc';
}else{
echo 'upload error';
}
}
}
?>
}
10.3 上传多个文件和文件下载处理
$_files['myfile']['name'][0]
$_files['myfile']['name'][1]
$_files['myfile']['name'][2]
$_files['myfile']['size'][2]
$_files[myfile][error]!=upload_err_ok
常量
$_files[myfile][error]!=0
标签加个[]
变三维数组
<input type="file" name="upfile[]"/><br>
俩个文件改
浏览器 缓存问题
成功 过
出现 多个不是
是因为只上一个 其他空 才显示 这
{
<html>
<head>
<title>上传文件</title>
<meta charset="utf-8"/>
</head>
<body>
<form enctype="multipart/form-data" action="todo2.php" method="post">
User:<input type="text" name="user"/><br>
Passwd:<input type="password" name="pwd"/><br>
<input type="file" name="upfile[]"/><br>
<input type="file" name="upfile[]"/><br>
<input type="file" name="upfile[]"/><br>
<input type="file" name="upfile[]"/><br>
<input type="hidden" name="MAX_FILE_SIZE" value="100000"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
}
{
<meta charset="utf-8">
<?php
$uploaddir="data".DIRECTORY_SEPARATOR;
var_dump($_FILES['upfile']["name"]);
for($i=0;$i<count($_FILES['upfile']["name"]);$i++){
if($_FILES['upfile']["size"][$i]>=40000){
echo $_FILES['upfile']["name"][$i]."文件太大<br>";
continue;
}
if($_FILES['upfile']["type"][$i]!="text/plain"){
echo $_FILES['upfile']["name"][$i]."文件不是文本类型<br>";
continue;
}
if($_FILES['upfile']["error"][$i]!=0){//!=UPLOAD_ERR_OK
echo $_FILES['upfile']["name"][$i]."文件不能上传<br>";
continue;
}
if(move_uploaded_file($_FILES['upfile']["tmp_name"][$i],$uploaddir.$_FILES['upfile']['name'][$i])){
echo "上传成功<br>";
}
}
?>
}
下载
输入地址 根 直接下载了
图片部分 html 不行了
服务器设置 才可以
浏览器 打开
文件下载
文件下载的类型使用MIME类型表示
下载文件的描述如给出文件名称等
下载文件的长度以字节为位
header()
告诉浏览器header是什么
header() 只能在php文件开头
不能输出 echo 空格等
这空格也不行<?php?>
header("Content-type:text/html");//文件格式header("Content-type:image/png jpeg");
header('Content-Disposition:attachment:filename="download.html"');//文件描述\download.jpg\
同时改下载时 显示的名字 否则原来名字
header("Content-Length:".filesize($filename));//response browser 文件长度
用 读打开文件 fopen html用
while feof($p) 是否指针到底
fread()
fclose
readfile($filename) 直接显示dom 图片用
告诉浏览器 是什么类型 不是浏览 是下载
路径 有 index 会auto index
无权访问此服务器上的/es6/data/。
工具设置 权限设置
不行 简单 不直接下载
{
<meta charset="utf-8">
<?php
$downname="data".DIRECTORY_SEPARATOR."demo.html";
header("Content-type:text/html");
header("Content-Desposition:attachment;filename='down.html'");
header("Content-Length:".filesize($downname));
$fp=fopen($downname,'r');
while(feof($fp)==false){
echo fread($fp,filesize($downname));
}
fclose($fp);
$downname="data".DIRECTORY_SEPARATOR."demo.jpg";
header("Content-type:image/jpeg");
header("Content-Desposition:attachment;filename='down.jpg'");
header("Content-Length:".filesize($downname));
readfile($downname);
?>
}
C:\Users\Administrator\Desktop\array
array_filter
函数array_filter()
作用:调用回调函数过滤数组中的元素
原型:array_filter(array input[,callback callback]);
第一个参数:input
第二个参数:callback
匿名函数 函数 函数() 测试下就知行不 简单小时过
返回值 array 新数组 原不变
<meta charset="utf-8">
<?php
$arr=[1,3,2,-3,-5];
$newarr=array_filter($arr,function($val){
if($val>0)return true;
else return false;
});
print_r($newarr);
?>
array_intersect
函数array_intersect()
数组中都有的数
作用:计算数组的交集
原型:array_intersect(array array1,array array2,[,array...])
第一个参数:array1
第二个参数:arrayn
返回值 array 新数组 原不变
俩个数组都有的 显示
多个比较
<meta charset="utf-8">
<?php
$arr=['window','php','linux'];
$arr1=['unix','php','linux'];
$newarr=array_intersect($arr,$arr1);
print_r($newarr);
?>
array_merge
函数array_merge()
作用:把一个或多个数组合并为一个数组
原型:array_merge(array array1[,array array2,array...])
第一个参数:array1
第二个参数:arrayn
返回值 array 新数组 原不变
索引数组 一个一个排
新数组从0
关联数组 ...相同key最后数组覆盖
<meta charset="utf-8">
<?php
$arr=['a'=>'window','php','linux'];
$arr1=['a'=>'unix','php','linux'];
$newarr=array_merge($arr,$arr1);
print_r($newarr);
?>
array_pop
函数array_pop()弹出 array_push添加入栈
作用:删除数组中的最后一个元素,即将数组最后一个单元弹出(出栈)
原型:mixed array_pop(array &array)
第一个参数:array 必须是数组变量 (引用传递)
返回值 mixed删除内容 原变
array_push
函数array_push()
作用:向数组的结尾压入数据(进栈)
原型:int array_push(array &array,mixed var[,mixed...])
第一个参数:array 必须是数组变量 (引用传递)
第二个参数:var ..添加内容 多个...
返回值 int newarrayLen 原arr变
array('arr','bb') 类创建数组
字面量 快
添加
$arr[]=100;
<meta charset="utf-8">
<?php
//$arr=['a'=>'window','php','linux'];
$arr=array("hello",'world');
echo array_push($arr,'koo');
$arr[]='john';
print_r($arr);
?>
array_rand
函数array_rand()
作用:从数组中随机选出一个或多个元素
原型: mixed array_rand(array input [,int num_req])
第一个参数:input
第二个参数:num_req
返回值 array 新数组 mixed
在数组 中 取得 n 个
1个 直接 字符串 返回的是原数组的下标
2个以上 数组 返回的是原数组的下标
array_rand($arr,2)
<meta charset="utf-8">
<?php
$arr=['a'=>'hello','b'=>'world','c'=>'koo'];
echo array_rand($arr,1)."<br>";//返回的是原数组的下标
$key=array_rand($arr,2);//2-> 返回key组成的数组
print_r($key);
echo "<br>".$arr[$key[0]];
?>
array_shift
函数array_shift() shift开头删除 unshift开头添加 push结尾添加 pop结尾删除 en分池其他语言pull|版本
作用:删除数组中第一个元素
原型:mixed array_shift(array &array)
第一个参数:array 必须是数组变量 (引用传递)
返回值 mixed 删除内容 原数组改变
<meta charset="utf-8">
<?php
$arr=['a'=>'hello','b'=>'world','c'=>'koo'];
echo array_shift($arr);
print_r($arr);
?>
array_sum
函数array_sum()
作用:返回数组中所有值的总和
原型:number array_sum(array array)
第一个参数:array
返回值 number
<meta charset="utf-8">
<?php
$arr=[1,2,3,5];
var_dump(array_sum($arr));
?>
in_array
函数in_array()
作用:检查数组中是否存在某个值
原型:bool in_array(mixed needle,array haystack[,bool strict])
第一个参数:needle "str"
第二个参数:haystack 目标数组
第三个参数:strict 严格按类型匹配
返回值 boolean
字符串区分大写
regx php one
<meta charset="utf-8">
<?php
$arr=["Win",12,"33"];
if(in_array('12',$arr,false)){
echo "z";
}else{
echo "bz";
}
?>
range
函数range()
作用:创建并返回一个包含指定范围的元素的数组
原型:array range(mixed first,mixed second [,number step])
第一个参数:first
第二个参数:second
第二个参数:step
返回值 newarr
多用于初始化 数组
range(1,50,10) 1-50 每次跳10 数组
<meta charset="utf-8">
<?php
//$newarr=range(0,50,10);
$newarr=range('a','z',1);
var_dump($newarr);
?>
shuffle
函数 shuffle()
作用:把数组中元素按随机顺序重新排列
原型: bool shuffle(array input)
第一个参数:input
返回值 bool
原数组改变
下标 随机改变
php5 视频 函数库
<meta charset="utf-8">
<?php
$newarr=[1,3,4,5,6];
shuffle($newarr);
var_dump($newarr);
?>
unique
函数array_unique()
作用:删除数组中重复的值,并返回没有重复的新数组
原型:array array_unique(array array)
第一个参数:array
返回值 array 新数组 原不变
key不同 value相同去掉
<meta charset="utf-8">
<?php
$newarr=['a'=>'php','b'=>'mysql','c'=>'php'];
var_dump(array_unique($newarr));
?>
C:\Users\Administrator\Desktop\datetime
date
函数 date()
作用:格式化一个本地时间/日期
原型: string date(string format[,int timestamp])
第一个参数:format
a am pm
A AM PM
d 01-31
D fir sum mod
F january-December
g 1-12
G 0-24
h 01-12
H 00-23
i 00-59
I 0 1
L 0 1
l sunday-saturday
m 01-12
M Jan~Dec
n 1-2
s 00~59
U
w 0-6
Y year xxxx
y xx
z 0-366
第二个参数:timestamp
返回值 string
date("Y-m-d H:i:s",time())
time()
unix_timestrap
<meta charset="utf-8">
<?php
echo time()."<br>";
echo @date("Y-m-d H:i:s",time());
?>
getdate
函数 getDate()
作用:取得日期/时间信息
原型: array getDate([int timestamp])
第一个参数: timestamp
返回值 array
<meta charset="utf-8">
<?php
$arr=@getDate(time());
$arr=@getDate();
var_dump($arr);
?>
microtime
时间戳 包括微秒 microtime =js-getTime
函数 microtime()
作用:返回当前Unix时间戳和微秒数
原型: mixed microtime([bool get_as_float])
第一个参数:get_as_float bool true获得微秒
msec sec
返回值 mixed
{
<meta charset="utf-8">
<?php
class Timer {
private $starttime;
private $stoptime;
function __construct(){
$this->starttime=0;
$this->stoptime=0;
}
function start(){
$this->starttime=microtime(true);
}
function stop(){
$this->stoptime=microtime(true);
}
function spent(){
$spent=$this->stoptime-$this->starttime;
return round($spent,4);//四舍五入4位
}
}
$timer=new Timer();
$timer->start();
usleep(1000);//休眠 停止 100s
$timer->stop();
echo "程序脚本运行时间s:".$timer->spent();
echo "<br>微秒:".microtime(true);
?>
}
mktime
函数 mktime()
作用:取得一个日期的Unix时间戳
原型: int mktime([int hour,int minute,int second,int day, int year,intis_dst])
第一个参数:hour
第二个参数:minute
第三个参数:instecond
返回值 int
验证 好用
<meta charset="utf-8">
<?php
echo @date("Y-m-d H:i:s",mktime(22,30,33,12,31,2019));
echo @date("Y-m-d H:i:s",mktime());
?>
2019-12-31 22:30:33
C:\Users\Administrator\Desktop\file
basename
函数 basename()
作用:返回路径中的文件名部分
原型: string basename(string path[,string suffix])
第一个参数: path
第二个参数: suffix .php 返回就去后缀
返回值 string
文件名
分隔符 . ../ \ directory_separator
<meta charset="utf-8">
<?php
$filename="/tmp/demo/test.php";
// echo basename($fiename); test.php
echo basename($filename,'.php');//test 去后缀
?>
dirname
函数 dirname()目录部分 basename()文件部分
作用:返回路径中的目录部分
原型: string dirname(string path)
第一个参数: path
返回值 string
<meta charset="utf-8">
<?php
$filename="/tmp/demo/test.php";
// echo basename($fiename); test.php
echo basename($filename,'.php');//test 去后缀 文件
echo dirname($filename);//目录
?>
file
函数 file() file_get_contents()
作用:把整个文件读入一个数组中
原型: array file(string filename,[int use_include_path,resource context])
第一个参数:filename
返回值 array
一行一个建值
不用打开 关闭
<meta charset="utf-8">
<?php
$newArr=file("demo.txt");
var_dump($newArr);
?>
file_get_contents
函数 file_get_contents
作用:将整个文件读入一个字符串
原型: string file_get_contents(string filename,
[bool use_include_path,resource context,int offset ,int maxlength])
第一个参数:filename
返回值 string
<meta charset="utf-8">
<?php
$str=file_get_contents("demo.txt");
echo $str;
$handle=fopen("demo.txt",'r');
echo fread($handle,filesize("demo.txt"));
fclose($handle);
?>
filetype
函数 filetype()
作用:取得文件类型
原型: string filetype(string filename)
file dir unknown
block char dir fifo
file link unknown
第一个参数:filename
返回值 style
<meta charset="utf-8">
<?php
echo filetype("demo.txt");
?>
fopen
支持远程文件
函数 fopen()
作用:打开文件或者URL
原型: resource fopen(string filename,string mode [,bool use_include_path,resource zcontext])
第一个参数: filename
第二个参数:mode
r r+读写打开 w w+清空创建
x x+不存在创建 a a+最加
b二进制 t跨平台\n \r
返回值 resource
$_server['document_root']
服务器跟地址
都 帮助文档 看
<meta charset="utf-8">
<?php
$handle=fopen('demo.txt','r+');//returnBool r r+ w w+ a a+ x x+ b t
fread($handle,1024);//fwrite($handle,'hello',3);
fclose($handle);//returnBool
?>
项目合作 不一个人 分公
pathinfo
函数 pathinfo() dirname basename
作用:返回文件路径的信息
原型: array pathinfo(string path,[int options])
dirname basename extension扩展名
第一个参数:path
第二个参数: options
返回值 array
<meta charset="utf-8">
<?php
$filename="/tmp/demo/demo.php";
$pathinfos=pathinfo($filename);
//array
var_dump($pathinfos);
echo "目录部分:".$pathinfos['dirname']."<br>";//dirname()
echo "文件部分:".$pathinfos['basename']."<br>";//basename()
echo "扩展名:".$pathinfos['extension']."<br>";
?>
readfile
函数 readfile() file() gets()
作用:输出一个文件
原型: int readfile(string filename,[bool use_include_path,resource context])
第一个参数:filename
返回值 int
<meta charset="utf-8">
<?php
$filename="demo.txt";
readfile($filename);
?>
mysqli
函数 mysqli_connect() mysqli()
作用:创建mysqli对象,连接MySQl数据库
原型: mysqli mysqli_connect([stringhost,stringusername,stringpasswd,
stringdbname ,int port,stringsocket
])
class mysqli{
__construct([stringhost,stringusername,stringpasswd,
stringdbname ,int port,stringsocket
]){
}
}
返回值 mysqli对象
$mysqli=new mysqli();
$mysqli->connect()
$mysqli->select_db()
调用对象下的方法
$mysqli=new mysqli(1270.0.01...)
构造方法 init
$mysqli var_dump查对象
<meta charset="utf-8">
<?php
//$mysqli=new mysqli();
//$mysqli->connect();
//$mysqli->select_db();
$mysqli=new mysqli('localhost','root','root','demo',3306);
var_dump($mysqli);
?>
mysqli_connect_errno
函数 mysqli_connect_errno()是否错误 mysqli_connect_error()错误信息
作用:测试在建立连接的过程中是否发生错误
原型: bool mysqli_connect_errno(void)
返回值 boolean
<meta charset="utf-8">
<?php
//$mysqli=new mysqli();
//$mysqli->connect();
//$mysqli->select_db();
$mysqli=new mysqli('localhost','root','rooot','demo',3306);
var_dump($mysqli);//对象内容 connect_errno error
if(mysqli_connect_errno()){//是否连接失败
echo '连接失败msg:'.mysqli_connect_error();
exit();
}
?>
mysqli_fetch_accoc
函数 mysqli_fetch_assoc() mysqli_fetch_row()
作用:从结果集中获取一条记录
原型: mixed mysqli_fetch_assoc(mysqli_result result)
class mysqli_result{
mixed fetch_assoc(void)
}
返回值 mixed
{
<meta charset="utf-8">
<?php
//$mysqli=new mysqli();
//$mysqli->connect();
//$mysqli->select_db();
$mysqli=new mysqli('localhost','root','root','demo',3306);
var_dump($mysqli);//对象内容 connect_errno error
if(mysqli_connect_errno()){//是否连接失败
echo '连接失败msg:'.mysqli_connect_error();
exit();
}
$result=$mysqli->query("select * from demo");//sql
var_dump($result->fetch_row());//fetch_row 内容 一列内容
while($row=$result->fetch_row()){
print_r($row);
echo "<br>";
}
?>
}
{
<meta charset="utf-8">
<?php
//$mysqli=new mysqli();
//$mysqli->connect();
//$mysqli->select_db();
$mysqli=new mysqli('localhost','root','root','demo',3306);
var_dump($mysqli);//对象内容 connect_errno error
if(mysqli_connect_errno()){//是否连接失败
echo '连接失败msg:'.mysqli_connect_error();
exit();
}
$result=$mysqli->query("select * from demo");//sql
while($row=$result->fetch_assoc()){
print_r($row);
echo "<br>";
}
?>
}
$res=$mysqli->query(sql语句)
$res->fetch_row fetch_assoc 一行数据
mysqli_fetch_array
函数 mysqli_fetch_array()返回指定都关联索引数组
mysqli_fetch_assoc()return关联 mysqli_fetch_row()索引数组
作用:从结果集中获取一条记录
原型: mixed mysqli_fetch_array(mysql_result result,[int resulttype])
Object oriented style(method);
class mysqli_result{
mixed fetch_array([int resulttype])
}
大写 常量
mysqli_assoc关联数组 返回 用这 直接用mysqli_fetch_assoc
mysqli_num 索引数组 mysqli_fetch_row()
mysqli_both 默认 关联 索引 没必要 俩个返回
返回值 mixed
<meta charset="utf-8">
<?php
$mysqli=new mysqli('localhost','root','root','demo',3306);
if(mysqli_connect_errno()){
echo "MySqlConnectErrorMsg:".mysqli_connect_error();
exit();
}
$result=$mysqli->query("select * from demo");
//可以while 全部
$row=$result->fetch_array(MYSQLI_ASSOC);//一行数据 默认关联索引都显 myqli_both mysqli_assoc关联 索引mysqli_num
print_r($row);
?>
mysqli_fetch_object
函数 mysqli_fetch_object()
mysqli_fetch_array()
mysqli_fetch_assoc()
mysqli_fetch_row()
作用:从结果集中获取一条记录对象
原型: mixed mysqli_fetch_object(mysqli_result result);
Object oriented style(method);
class mysqli_result{
mixed fetch_object(void)
}
返回值 mixed
指针向下 读取
<meta charset="utf-8">
<?php
$mysqli=new mysqli('localhost','root','root','demo',3306);
if(mysqli_connect_errno()){echo "error:".mysqli_connect_error();exit();}
$result=$mysqli->query('select * from think_data');
$row=$result->fetch_object();//读取一行 成 obj 访问->
print_r($row);
echo $row->id.'<br>';
echo $row->title;
?>
mysqli_fetch_row
函数 mysqli_fetch_row()
作用:从结果集中获取一条记录对象
原型: mixed mysqli_fetch_row(mysqli_result result)
Object oriented style(method);
class mysqli_result{
mixed fetch_row(void)
}
返回值 mixed
读取到最后返回 null false 循环while
<meta charset="utf-8">
<?php
$mysqli=new mysqli('localhost','root','root','demo',3306);
if(mysqli_connect_errno()){ echo "Emsg:".mysqli_connect_error();exit();}
$result=$mysqli->query('select id,title from think_data');
while($row=$result->fetch_row()){
print_r($row);
echo "<br>";
}
?>
mysqli_query
函数 mysqli_query()
作用:执行SQL命令
原型: mixed mysqli_query(mysqli link,string query,[int resultmode])
Object oriented style(method);
class mysqli{
mixed query(string query,[int resultmode])
}
返回值 mixed
插入sql 返回bool
插入sql 更新 返回bool
insert info think_data(id,title) values('3','name');
update think_data set name='x' where id=1;
select查询 返回mysqli对象
select * from demo;
{
<meta charset="utf-8">
<?php
$mysqli=new mysqli('localhost','root','root','demo',3306);
if(mysqli_connect_errno()){ echo "Emsg:".mysqli_connect_error();exit();}
//$result=$mysqli->query('select id,title from think_data');
//$result=$mysqli->query('insert into think_data(id,title) values(10,"hello")');
$result=$mysqli->query('update think_data set title="hh" where id=10');
print_r($result);
?>
}
C:\Users\Administrator\Desktop\session
session_destroy
函数 session_destroy()
作用:销毁和当前session有关的资料
原型: bool session_destroy(void)
返回值 boolean
不能这样 全局变量都删除了
unset($_SESSION['username']);
等空数组
session_start();
$_SESSION=array();
//判断变量是否存在
if(isset($_COOKIE[session_name()]))
{
setCookie(session_name(),'',time()-60,'/');
}
session_destroy();
session_start
函数 session_start()
作用:启动session
原型:bool session_start(void)
开始不能有空格 换行 同 header()
返回值 boolean
用户会话开始
session_start();
echo session_id();
浏览器其他同页面 一个id
客户端 返回的id
<meta charset="utf-8">
<?php
session_start();
echo session_id();
?>
setCookie
函数 setcookie()
作用:发送一个cookie信息
原型: bool setcookie(string name,[string value,int expire
,string path ,string domain ,bool secure
])
第一个参数:name key
第二个参数: value
第三个参数:expire 到期时间
返回值 boolean
oldCookie newStroage
以后调用
$_COOKIE['cookiename']
$username=skygao
expire time()+60*60*24*7 7天
ie 删除cookies chrome 控制台查看
c://documents and settings/ibm/cookies 内容里面
setCookie('username','koo',time()*60*60);
del
setCookie('username','',time()-60);
setCookie('username');
<meta charset="utf-8">
<?php
// setCookie('name','koo',time()*60*60*1);//expire1day
// setCookie('name');//del cookie key有 value''
//setCookie('name','',time()-60);//del cookie keyvalue=没
?>
{
<meta charset="utf-8">
<?php
setCookie('name','koo',time()*60*60*1);//expire1day
// setCookie('name');//del cookie key有 value''
//setCookie('name','',time()-60);//del cookie keyvalue=没
var_dump($_COOKIE);
echo $_COOKIE['name'];//查看 cookis
session_start();
echo session_name();
echo session_id();
var_dump($_SESSION);
$_SESSION=array();
if(isset($_COOKIE[session_name])){
setCookie(session_name(),'',time()-60,'/');
}
session_destroy();
?>
}
C:\Users\Administrator\Desktop\string
explode
函数 explode()
作用:字符串分割
原型:array explode(string separator,string string,[int limit])
第一个参数:必须
第二个参数:必须
第二个参数:可选 分割多少部分 -1最后 2
返回值 array 数组
list($var,$var2)=explode('+',$lamp);
以前文件了
转换为 变量
print_r
var_dump
<meta charset="utf-8">
<?php
$str='linux/apache/mysql/php';
$arr=explode('/',$str,4);
var_dump($arr);
list($a,$b,$c,$d)=$arr;//list 数组 转 变量
echo $a."<br>";
echo $b."<br>";
?>
ke全部多time不轮 少轮
多轮各扩挑重 少肯轮
htmlspecialchars
函数 htmlspecialchars()
作用:将HTML标记中的特殊字符转换成HTML实体
原型: string htmlspecialchars(string string,[int quote_style,string charset])
第一个参数: 必须 <"<" " $quot; > $gt; <p> <script>
第二个参数:可选 大写 ent_compat只转双引号 ent_quotes都转单双引号 entnoquotes不引号转换
第三个参数:可选 字符集编码
返回值 字符串
直接 echo html brower 解析显示
查看源码 显示 带引号 二参数
安全 转换 html 代码
控制
<meta charset="utf-8">
<?php
$str='<button onclick="javascript:alert(`hh`)">按钮</button><script>console.log("hh")</script>';
echo $str;
echo htmlspecialchars($str,ENT_QUOTES,'utf-8');
?>
implode
函数 implode() join()别名
作用:连接数组中的元素组合成为字符串
原型: string implode(string glue,array pieces)
第一个参数:必须
第二个参数:必须
返回值 字符串
分割explode 联合implode()john()
<meta charset="utf-8">
<?php
$arr=Array("Linux","Apache","MySql","PHP");
echo implode('->',$arr).'<br>';
echo join('=>',$arr);
?>
md5
函数 md5()
作用:将一个字符串进行MD5算法加密
原型: string md5(string str,[bool raw])
第一个参数: str 表示待处理的字符,是必须传递的参数
第二个参数: raw 是一布尔类型
返回值 str
数据库 猜密码
文件加密
md5_file();
<meta charset="utf-8">
<?php
$pwd='liujunqiu';
echo md5($pwd);//md5_file文件
if(md5($pwd)=='87475cf9c2b9ada7f7c33cb0980a4277'){
echo 'success';
}else{
echo 'error';
}
?>
md5 implode-join explode htmlspecialchars
list() md5_file
number_format
函数 number_format
作用:123,456,890
原型: string number_format(
float number,
[int decimals,string dec_point,string thousands_sep ]
)
第一个参数: number 一个数字 必须 数字
第二个参数:decimals 多少位小数
第三个参数:dec_point 整数.分割符中间.小数部分
第四个参数:thousands_sep 整数分割符
返回值 str
<meta charset="utf-8">
<?php
$number=888333222.111888;
echo number_format($number,2,';','|');
?>
preg_match
regex
函数 preg_match()
ereg_match()
作用:正则表达式的匹配函数
原型: int preg_match(string pattern,string subject,[array matches]);
第一个参数:pattern / *.+/gi "//i"
第二个参数: subject string object
第三个参数: matches 匹配的都放在这个数组上
数组0全部 数组其他()每个元子
返回值 0或1
.任意一个
? 0|1
*0个以上
+1个以上
{
<meta charset="utf-8">
<?php
$pattern="/(http|https|ftp):\/\/(www|bbs)\..+\.(com|cn|org)/i";
$str="hello:https://www.koo.cn";
if(preg_match($pattern,$str,$newArrBox)){
echo "match success:".$newArrBox[0]."<br>";//htmlspecialchars
print_r($newArrBox);
}else{
echo 'no match';
}
?>
}
printf
函数 printf() 直接输出到浏览器
参数相同
sprintf() 返回字符串变量 在echo..输出
作用:格式化输出字符串
原型:string printf(format,arg1,arg2...argn)
%%百分百输出
%b 数字 二进制
%c 字符
%d 数字 十进制
%e 科学计数法
%u 无符号
%f 浮点数
%F 双浮点数
%o 八进制
%s 字符串
%x 16进制
%X 16进制
返回值 字符串
12个
<meta charset="utf-8">
<?php
$num=999.666;
printf('符号:%%<br>Byte:%b<br>10jz:%d<br>float:%f<br>double:%F<br>8zj:%o<br>16zjx:%x<br>16zjd:%X<br>char:%c<br>string:%s<br>unsign:%u<br>kexue:%e',$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num);
?>
字符串类
%%-%c-%s
进制类
%b
%o
%d-%f-%F-%e-%u
%x-%X
共12
sprintf
printf() 直接输出到浏览器
参数相同
sprintf() 返回字符串变量 在echo..输出
sprintf
php3 45->
sprint-返回一个格式化字符串
描述
string sprint(string format,[]mixed args,mixed..)
b 整数转成二进位.
c 整数转成对应的ASCI1字符
d 整数转成十进位
f 单倍精确度数字转成浮点数。.
o 整数转成八进位转成字符串。.
s 转换字符串
x 整数转换小写十六进位
X 整数转换大写十六进位
{
<meta charset="utf-8">
<?php
$num=999.666;
$tmp=sprintf(
"字符3类:<br>
符号输出:%%<br>
字节:%c<br>
字符串: %s<br>
进制类:<br>
二进制:%b<br>
八进制:%o<br>
十进制5类:<br>
十进制:%d<br>
Float:%f<br>
Double:%F<br>
科学计数法:%e<br>
无符号:%u<br>
十六进制2类:
十六大写:%X<br>
十六小写:%x<br>
",
$num,$num,$num, $num,$num,$num, $num,$num,$num, $num,$num,$num
);
echo $tmp;
?>
}
str_replace
函数 str_replace()
作用:替换
原型:mixed str_replace(mixed search,mixed replace,mixed subject,[int &count])
第一个参数:str对象里面内容 要替换的内容 可数组多个
第二个参数:替换成什么 可数组可多个
第二个参数:str对象
第二个参数:可先 替换多少次
返回值 str 原str不变
<meta charset="utf-8">
<?php
$str="http://www.koo.kt";
// $newstr=str_replace('www','bbs',$str,$count);
$inside=Array('http','www','kt');
$outside=['https','bbs','com'];
$newstr=str_replace($inside,$outside,$str,$count);
echo $newstr."<br>替换n次:".$count;
?>
strip_tags
函数 strip_tags($str) 去掉标签[保留] 过滤用
htmlspecialchars() 标签原本输出 原来用
作用:删除一些对页面布局有影响的html标记
原型: string strip_tags(string str,[string allowable_tags])
第一个参数:必须 str对象
第二个参数:可选 保留标签列表'<i><b>' 不用闭合
返回值 新字符串
{
<meta charset="utf-8">
<?php
$str="<del>deldeldel</del><code>daima</code><var>var</var>";
$newstr=strip_tags($str,'<del><code>');//默认把标签清除,[保留list]
echo $newstr."<br>";//strip_tags htmlspecialchars
echo htmlspecialchars($str);//原本输出
?>
}
printf-sprint
str_replace
<br>-strip_tags()-htmlspecialchars()
strip_tags 字符串ip-热门标签
html speci Al chars
strpos
strpos 找到第一次出现的字符串的所在位置
描述
int strpos(string haystack,mixed needle,[int offset])
strpos(strobj,'里面内容',编移位置)
存在返回索引位置
不存在 返回 false
<meta charset="utf-8">
<?php
$str="hello world google";
if(strpos($str,'l',2)!==false){
echo 'exists';
}else{
echo 'not exists';
}
?>
strrchr
strrchr 查找最后一次出现在字符串中的字符
描述
string strrchr(string haystack,string needle)
返回最后一个字符
之间的字符串 返回
只查找需要查 的字符第一个来查 ab b不用
<meta charset="utf-8">
<?php
$mail="hello@qq.com";
echo strrchr($mail,'@');//@qq.com
?>
strrpos
找到最后一次出现字符串的所在位置
描述
int strrpos(string haystack,mixed needle,[int offset])
-1最后一个 0开始
r 返回过来 -1=0 0=-1
<meta charset="utf-8">
<?php
$mail="hello@qq.com";
var_dump(strrpos($mail,'@',5));
?>
strstr
找到第一个出现的字符串
描述
string strstr(string haystack,mixed needle)
返回以后 的字符串
不存在 bool false
<meta charset="utf-8">
<?php
$mail="hello@qq.com";
var_dump(strstr($mail,'@'));
?>
substr
返回字符串的一部分
描述
string substr(string string,int start,[int lenght])
字符串截取 tp5还可以是编码
strobj 开始\-1 长度|-1
<meta charset="utf-8">
<?php
$mail="hello@qq.com";
echo substr($mail,0,-7);//0 5 == 0 -7
?>
php.substr ===js.splice
trim
函数 trim() both
ltrim() left
rtrim() right
作用:清除空格 俩边
原型: string trim(string str,[string charlist])
第一个参数:必须 require
第二个参数:可选 options " "="\0"空 "\t" \n <-默认
|".." 0..9中间 a..z 设置del目标 默认空格
返回值 new字符串
str regex preg_ ereg_
strlen长度
cn gw doc ...
<meta charset="utf-8">
<?php
$str=" *helloworld999* ";
echo trim($str,'\0 * 0..9');//rtrim ltrim
?>
源码
工具 g- bg
shop tpshop 书才有 g- ***ds
tp 08 有 书有 视频无 g- xg
linux old g-
sp名 不txt
2g 小 直接desktop
old 挑重
新书 在新视频|old
看书 +shop ...ds
先linux oldg
newtxt old配套phpdoc
C:\Users\Administrator\Desktop\
Linux教学视频
phptiao 这old更tiao
图片 各有不截图
文字 音 挑重 g 可以漏
liunx 版本随便一个 模拟 可以就练 没就看过下 ds系统
newphp..linux...
源码最好新 改bug
废弃...
环境php配过 jdg 集成
1.Linux应用与发展(一)
完美应用ubuntu,PHP5项目实战详解
《UNIX系统管理实用教程》、《Solaris8系统管理员指南》
bzy g tz
操作系统是一个能够协调、控制计算机系统硬件和软件资源的控制程序,位于计算机硬件和应用程序之间,
核心程序处于中心,提供最基本的计算功能。操作系统实现了用户与计算机之间的交互。
操作系统主要提供以下基本服务程序:
1·文件系统
2,设备驱动程序
3,用户接口
4.系统服务程序
unix
c语言
unix俩大分类
System V
BSD
bg bzy
UNIX主要发行版本
版本 公司 芯片
aix ibm powerpc
hp-ux hp pa-risc
solaris sun sparc
lrix sgi mips
digitalUnix dec alpha
linux BSD redhatlinux-ubuntu-freebse la(intel amd cyrix rise...)
2.Linux应用与发展(二)
linux
Linux主要发行版本
redhat fedora turbolinux
centos mandriva gentooliunx
novell suse 红旗...
debian ubuntu knoppix
自由软件介绍
口使用的自由
可以不受任何限制地使用软件
口研究的自由
可以获得软件源代码、研究软件运作方式
口散布的自由
可以自由复制软件及散布给他人
口改良的自由
可以自行改良软件并散布改良后的版本
软件应该是自由的,应尊重人类的自由意志,它与人类之间不应有任何隔膜。
商业模式
自由软件介绍
samba sendmail.org apache mysql php internetsystensconsortium
deepin...ds
3.Linux应用与发展(三)
Linux优良特性
分时的多用户、多任务的操作系统
多数网络协议支持,方便的远程管理
强大的内存管理和文件管理系统
大量的可用软件和免费软件
优良的稳定性和安全性
良好的可移植性和灵活性
可供选择的厂商多
Linux系统结构
用户 图形界面
应用层 图形界面
shell层 shell命令
内核层 系统调用
硬件
X Window简介
old new其他界面 kde基于....x11
ds
X Window系统特点:
口独立于操作系统
口网络特性
口源代码免费
UNIX图形环境:
CDE(通用桌面环境)
Common Desktop Environment
cde kde gnome
xfce mate...
fvvm...
Linux应用领域
电子政务
网络应用
科学运算
嵌入式应用
linux php mysql perl openofice
redoffice
uos
deepin ....
new old ...
kali ....
随便一个 都一样 到时 ...内核一样..插件特效到时....
Linux娱乐应用
wine....
网络应用
lamp
基于LAMP的网站论坛及B/S架构应用
基于Linux的负载均衡和集群
基于Linux的防火墙及代理服务器
基于Linux的网游服务器
每天一点 从头到尾 多打练 系统 靠自己 基础命令
检查 ip 域名 服务器....
http://news.netcraft.com
类似 kail 渗透测试 nmap python2 py3 淘汰 不在兼容等等...
源码 加载...编译 自己...
安全 运维....
lgpgdsg
lamp兄弟连php论坛 phpchina中国开源
www search
科学运算
http://www.top500.org/
bgws g 500q gs server search....
cad/cam
嵌入式应用
生物特征识别系统
智能卡系统
掌上电脑、手机、信息家电
路出器、机顶盒、数码相机、MP4
嵌入式应用
Linux技术认证
redhat linux-professional
全国信息技术人才培养工程
5.Linux系统安装(一)
zj dsxt
yg jg
先用过 以前学过 忘记到时重来多练 旧过 到时系统过
内容概要
VMware虚拟机软件应用 会过 简单过下 winlinux模拟 不行到时
Linux系统安装设置
远程登录管理工具介绍
VMware简介
VMware是一个虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环境,相当于模拟出一台新的PC,以此来实现在一台机器上真正同时运行两个独立的操作系统。
VMware官方网站http://www.vmware.com
search www
VMware简介
VMware主要产品:
口VMware-ESX-Server
D VMware-GSX-Server
D VMware-WorkStation
dorkbox 容器到时...
VMware主要特点:
1、不需要分区或重新开机就能在同一台
PC上使用两种以上的操作系统
2、本机系统可以与虚拟机系统网络通信
3、可以设定并且随时修改虚拟机操作系
统的硬件环境
6.Linux系统安装(二)
fedora8 以前用过
分区...会过
文件系统结构
/
home tmp etc
alex jenny hls
bin notes
report log
tree
/home/alex
/root
/dev --devices
scsi:硬盘接口
/dev/sda1
/dev/sda2
/dev/sdb
ide: 硬盘接口
/dev/hda
/dev/hdb
分区规划
必要分区:
1、根分区/
2.swap分区
其他分区可根据需要划分
密码设置
1、八位以上,大小写字母、数字、符号组合
2、要容易记忆
合格的密码示例:Am@ri3ln
3、定期更换
密码规则
American e--@ abcd--1234
7.Linux系统安装(三)
注意防火墙 配置
稳定就好
应许通过的
每天一点 坚持...头到尾学位置newold
selinux 安全控制功能...
vm 快照...
ifconfig=ipconfig
eth - ethernet 0 eth1 启动第一个网卡
网卡 桥接...
win 控制面板
添加硬件 添加网卡设置
网络适配器
本地循环loop
8.Linux系统安装(四)
vm网卡手动以前?....g-
远程登录管理工具
而令行远程管理工具
Putty SecureCRT telnet默认关闭 ssh
windows:sniffer 监听器...
文件共享工具:
SSH Secure Shell Client
ftp sercurectr状态 其他同步工具 用过....
ds g-
用户登录成功后,系统缺省的主提示符.
普通用户为"$":超级用户root为"#"。
用户退出系统的方法有两种:
1)键入命令:exit或logout
2)在提示符下按Ctrt+D组合键
不错误 rm -rf /
home/user
/root
上传位置默认
liming
9.远程访问Linux服务器
redhat liunx
ferose...
..debian ...kali.deepin..arch..
win 快捷键冲突...
虚拟机配置...
glf
win添加网卡...
以前 现在 手动配置 ip 回还接口ip
同一个网段...
ip....
桥接...
jdg
设置IP
netconfig -redhat系列...
service network restart 重启网络服务
service iptables stop 关闭防火墙
====
iptables -F 防火墙有关
iptables -X 禁用..
iptables 防火墙
vm dor容器 win
wc
win 防火墙...
ssh服务
远程访问
service sshd start
apt install ssh ..
new
service ssh start
..默认root不能..直接 newversion限制...ds
version new old
apt sourcse
nano /etc/apt/sources.list
https://mirrors.cloud.tencent.com/index.html
https://mirrors.cloud.tencent.com/kali/
http://mirrors.aliyun.com/kali
http://mirrors.ustc.edu.cn/kali
....随便个 ...
putty.exe
sshSecureShellClient 3.2....
聚成 file remote管理
...
iso有old 随便个 用过...
1g...
10.熟悉Linux的工作环境
dir.txt
/boot
目录:保存系统的引导相关的文件
内核文件
grub
/etc
目录:系统常用的配置文件
系统管理员经常需要修改的文件
决定系统行为的配置文件
/bin
目录:用户常用的命令
文件和目录的操作命令
所有用户都可以使
/sbin
目录:保存系统维护所使用的命令文件
fdisk mkfs
很多命令通户都不能使用,只有root
/lib
目录
系统运行所需要的库文件
静态库,.a文件
动态库,,so文件
/dev
系统设备文件
/dev/cdrom
/dev/hda
/dev/sdb
/var
保存变化的数据
日志文件
脱机文件,
/mnt
系统用来安装文件系统设备目录
光盘/mnt/cdrom
U盘/mnt/sdb2
/proc 系统内存/cpu的映射
/tmp 保存系统运行时产生的临时文件
/usr 系统中保存与用户相关的信息
/home 系统中普通用户主目录
/root 系统中超级用户的主目录
系统 一条龙....服务....学...
tree
11.Linux命令格式
Linux文件的后缀
.exe .ini .txt
无 方便查找
系统文件:*.conf *.rpm
程序与脚本:*.c *.php
格式文件:*.wav jpg html
存档的与压缩文件:*.tar *.gz
linux文件命名规则
1.大小写敏感
2·除了/之外,所有的字符都合法
3·有些字符最好不用,如空格、制表符、退格符和字符@#$&()-[]
4.避免使用加减或.作为普通文伴的名第一个学符
linux命令格式
命令 -选项 参数
命令
命令 -选项
命令 参数
绝对路径:是从根开始一级一级地进入各个子目录,最后指定该命令或文件
相对路径:是从当前目录进入某目录,最后指定该命令或文件
. 当前目录
.. 上一级目录
通配符合
*匹配任何字符或任何数目的字符
?匹配符何单学符
[]匹配在何包含在括号里的单字符
ls [1234].txt
ls
list --ls 显示文件
/bin/ls ---/bin/ * 是所以用户都可以使用 /sbin
ls -a 所有
ls -l 列表
ls -F unknown 全部 但是去. ..
rm -i 提示是否...
12.Linux常用命令(一)
echo "33">t.txt >>最加 linux+"" win不用
命令名称:touch
功能描述:生成空文件
所在路径:/bin/touch :all user
活法格武:touch [选项] 文件名
命令名称:cd --change directory
功能描述:切换目录
所在路径:shell内部指令
活法格武:cd [目录]
cd ~
cd
cd ..
cd ../user
cd -
cd !$
cd ~/tect err
cd ../usr
cd - 查看上次
pwd
cd !$ 切换到上次目录 上次命令...
cp 拷贝
命令名称:pwd print work directory
功能描述:显示目前所在的工作目录
所在路径:/bin/pwd all user
活法格式:pwd
命令名称:cp copy
功能描述:拷贝
所在路径:/bin/cp
活法格式:cp -aifp [file]
cp -r |-a 复制目录
-i 默认 有覆盖提示 不提示 -y
-f 强制 覆盖
-p 保留原文件 创建时间...properties ly
命令名称:rm remove
功能描述:删除文件
所在路径:/bin/rm all user
活法格式:rm -irf [文件或目录]
-f 强制 删除 不提示
-i 提示 设置默认不提示 有些xd版本.. 回车
-r 删除目录
-rf * 当前全部...
命令名称:mv move
功能描述:移动文件
所在路径:/bin/mv all user
活法格式:mv -f [源文件或目录] [目的文件或目录]
可以重新命名....rename
win C-x 剪切
命令名称:cat不管文件多长一次性读取出来
more 分页显示文件内容
f或者空格 显示下一页面 f |
enter 下一行
q|Q 推出 more
less 同more... 上下移动 less语言到时...
f或者空格 显示下一页面 f |
y 上一行
enter 下一行
q|Q 推出 more
head 开头10行 看结尾-1 文件
tail 结尾10行 看开头-1 -f 实时查看 其他用户更改 同步.. C-c
5g cat more less head tail
功能描述: 查看
所在路径: /bin
活法格式:common -[] file
滚动条查看 当自带cmd shell 不能...
cat passwd > newsave.txt 读查看保存到new文件中
move 空格一屏幕 回车放页 q推出
13.Linux常用命令(二)
ln 产生链接文件 link /bin/ln
ln -s [源文件] [目标文件]
注意:源文件和目标文件一定要使用绝对路径
/a/b
ln file1 file2 硬链接不能块分区
相当备份...一个改其他不
ln -s file1 file 相当win快捷键 软连接
mkdir -p 创建空目录 -p递归创建 子目录
tree parent/ 查看树...
rmdir 删除空目录
rm -rf 可以删除非空目录..
whereis 显示系统命令和帮助手册所在的目录
whatis ls 显示命令是干嘛的
find [搜索路径] [搜索关键字] [文件或目录] 相当win搜索 复杂其他到时..忘记ds
find /etc/ -name f*
locate 也是查找 同过节点....更新同步...问题 新创建不收录
每隔一段时间 自动更新 时?1
updatedb 更新库 qtsqlds
慢 取消可用 其他win盘符...鸭蛋大 yqx 选择不...jiekou
locate对 | locale ?
grep -v 其他命令加管道符| 过滤...
-v 全部显示
cat bak | grep -v hello
cat bak | grep hello
man manual 查看手册 帮组等等
单里面提示 分类...
手册 分类 0 1 2 3 ...其他
命令 --help ==
info ls 查看命令
whatis ls 打错 其他继承...
whereis ls
man ls
ls --help
which ls
查命令位置
whereis ls 可以找到man 1-3
which ls
命令信息
info ls
whatis ls
man ls 里面可以找到man 1-3
ls --help
挂钩法数字... 联想法顺序..启发物 比喻 内在化 图表法 笔记流...
信息压缩...简写...
oldzc newybg
14.Linux常用命令(三)
gzip GUN zip 默认原文件del
gzip -1 表示快速压缩
gzip -9 nine nice 好压缩
.gz 压缩扩展名
gunzip name.gz 解压...压缩del
====
gzip -d name.gz 解压
gzip不能压缩目录
tar 可以打包目录 和压缩 源文件存在
tar -cvf -c create创建 -v view显示 -f filename指定文件名
tar打包命令,-c-v-f -cvf简写
cuf可以不加-
tar -cvf dirname
gzip -9 dirname.tar
dirname.tar.gz
gunzip dirname.tar.gz
tar -xvf dirname.tar
-x解包 v显示详细 f文件名
加其他参数压缩好...ds...
不用gzip 但tar
tar -zcvf name.tar.gz mydir/ -z gzip压缩 c创建 v显示 f文件名
tar -zxvf name.tar.gz 解压
zip -r压缩目录 -f更新压缩包 -F修理压缩 源文件存在
.zip
zip -r mydir.zip mydir/
unzip 解压name 提示不version 覆盖....
0.5 1 2...h zm ed 不缺少...
write root用户名 同一个机器通讯..指定
ctrl+d 停止
要ssh登录才行了
wall 消息helloworld 所以用户都广播....
mesg n不接受 mesg y接受wall广播
vmwin 不行 要其他ds g
koo koo
root root ttry1
cp reset reinstall
who 查看登录用户那些
useradd username 添加用户
passwd username 设置密码 其他到时创建home..配置自动...
del ds 重新 reset 先用
自带vm shell 不puttytools
diyserverunix 远程...集群...
都认真 dk zm 1 topend everydaysome
邮箱服务器 win....
系统开发...
service sendmail start 开启邮箱服务
mail root
>title subject
>body C-D context
>end root 那 cc:
root
mail
>1 n表示未读取
>r 回信
>q exit quit
mail 1
不行了过
exit
louyout
ifconfig
ifconfig eth0:1 ip192.168.1.1
设置ip 添加多个ip
win ip 加虚拟网卡...本地连接
ping -c 5 19.....
-c count 次数 默认继续
win 默认 4 -t继续
shutdown -h 10 10分钟关机 init 0
reboot 重启动 =init 6
vm--连win.. 可没 看过 不练....麻烦
其他命令也可以....
15.文本编辑器vi的使用(一)
auto壁纸 动态视频卡不
img小可以 尽暗不动 以前难不找..
现在 ..
启动就同步 动
取消 覆盖壁纸 ...gujby yqanby
启动-取消 可以1 不就2
缓存自动kjwifibbzy
本编辑器vi gui
了解vi的工作模式 只是一个文本编辑器--记事本
命令模式:所有在键盘打字都有可能是命令
插入模式:进入插入模式i1 aA oO回命令模式ESC
vi filename
命令模式 插入模式 编辑模式
命令模式:所有在键盘打字都有可能是命令
iao IAO 插入模式 esc 命令模式
命令以回车结束运行 编辑-命令模式 shift+:
保存退出ZZ
i:在光标前插入文本
I:在本行开始插入文本
a:在光标后附加文本
A:在本行末附加文本
o:在光标下插入新行
O:在光标上插入新行
命令行模式定位命令
h 左移一个字符
j 下 移一个字符
k 上 移一个字符
l 右 移一个字符
方向键盘也可以
$: 带空白 结尾 移至行尾
不带 g_
0: 带空白 开头 移至行首
不带 ^
enter: 下行 移至下行行首
H: 屏幕 开头 移至屏幕上端
M:屏幕 中间 移至屏幕中央
L: 屏幕 结尾 移至屏幕下端
gg:到文件开头
G:到文件最后一行
1G:到文件第一行
nG:到文件第n
:20 到第20行
:set nu设置行号 set num
:set nomu取消行号 set nonum
临时有效
永久 当前用户home目录下 .vimrc
:set nu
cz ds zm
16.文本编辑器vi的使用(二)
命令行模式删除命令
x:删除光标所在处的字符
X: 删除光标前面的字符
dd:删除光标所在的行
dG删除光标所在行到未尾的内容
D:删除光标所在处到结尾
:n1,n2d
命令行模式复制命令
yy,Y复制当煎行
nyy,nY夏制当前行以下n行
P 将已经选择复制或被除的行放到在当前行下 粘贴
命令行模式替换和取消的命令
r 取代光标所在处的字符
R 从光标所在处开始替换字符,按esc结束
s 替换光标所在出字符,并进入文本输入方式
S 替换光标所在全行,按esc结束
u 取消上一步操作,取消到上次打开文件的点上.并不是上次保存的点,ctrl+r
U 取消当前行所有操作
命令行模式保存和退出命令
:w
w new_filename
wq
ZZ
q
q!
wq!
x
x!
搜索和替换命令
/string
?string
n N 上下个
替换
:%s/old/new/g g全局
:%s/old//g 清空
gi i不区分大小 regex
:r 文件名 打开其他文件
:r 把其他文件加到 光标行
:e 文件名 bn bp 上下个
:!ls 操作系统命令
vi -o file1 file2 打开俩个文件 split
ctrl+ww 切换
split vsplit 分屏 ctrl+w+shift+_| 最大化
ctrl+w+-+ 加大
vi -O file1 file2 打开俩个文件 vsplit
17.Linux的用户管理(一)
Linux下的用户管理
Linux下有三类用户
1,超级用户:root具用操作系统的一切权限 U1D值为0
2,普通用户:普通用户具有操作系统有限的权限 UID值500--6000
3·伪用户:是为了方便系统管理,满足相应的系统进程文件属主的要求,不能登录,
UID 1-499
passwd /etc/passwd 只定义账号不定义口令
在该文件中一行定义一个用户,分七个部分
账号名称:root
用户密码:x 加密不同version passwdshadow
用户标识码(用户ID)0
组标识码(用户组1D)0
用户相关信息:admin
用户目录:/root
用户环境:/bin/bash bash shell 默认
/bin/sh
改了不一样 不改 简单运行 sh exit
查看 echo $SHELL 用户变量 shell 用那个
root@DESKTOP-C2CIP0J:~/demo# echo $SHELL
/bin/bash
sh 进入其他shell dsxt...g-
查看 用户id
id 用户
root@DESKTOP-C2CIP0J:~/demo# id root
uid=0(root) gid=0(root) groups=0(root)
root@DESKTOP-C2CIP0J:~/demo# id koo
uid=1000(koo) gid=1000(koo) groups=1000(koo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev)
添加用户
useradd user1
passwd user1 改密码
实际上改足够文件
/etc/shadow 这个文件只有root用户可以读 这个文件用冒号间隔9个字段组成
用户 密码加密 到时期时间等等...提示...
md5以上加密
用户名:root
口令:存放加密的口令,如果这个口令的第一个字符是! 则这个用户不能登录
! 不能登录 root不直接
最后一次修改时间:
最大时间间隔:0 可以随时改变
最小时间间隔:99999
警告时间:1周
不活动时间:
失效时间:
时间顺序 提示 失效才提示 提示又不能登录....
cat /etc/passwd |grep kali
cat /etc/shadow | grep kali
id kali
useradd kali
passwd kali
时间戳....
wq! a ...强制保存才行了
root改全部...
root@DESKTOP-C2CIP0J:~/demo# su kali
没设置其他 可能不同
18.Linux的用户管理(二)
用户账号管理
创建账户
1.在/etc/passwd中添加一条记录
2-创建用户主目录
3.在用户主目录设置默认的配置文件
4·设置用户初始口令
useradd或者 adduser 命令创建
versionnewold branch 不同
创建不自带home 加参数 del也是...
useradd -u 600 指定用户id开始 默认上个 user
-g 500 指定组必须存在 默认自己组 多组 缺省组
-G 502 多个 个组
-d /home/user 指定家目录 可以其他diy
-s /bin/sh 指定shell
-c mynet 注释
-e -k -m -M -r 等等..自己看
删除用户
userdel kali
-r 带home | rm -rf 手动删除 可删除用目录及用户所有信息
默认不删除home 数据丢失
改用户名
usermod -l newkali oldkali
锁定 登录失败
usermod -L kali
解锁
usermod -U kali
passwd 当前用户 默认
passwd -S kali 查看密码加密 状态 status
passwd -l kali 锁密码 文件里面 密码段 加!
passwd -S kali 查看密码加密 不同
passwd -u kali 解锁密码
passwd -S kali 查看密码加密 不同
version branch diff -U -L = u l
tail -5 /etc/passwd
tail -5 /etc/shadow
ls /home/
/etc/skel/
这个目录 所有创建用户home下 默认配置信息
pwd
在里面创文件 所以用户都有..
重新登录 重新 adduser
version branch diff
查看当前登录用户
whoami
所有用户
who
su user 都可以 锁也可以上切换
login 不行
login 手动输入
login kalilinux
v|v
19.Linux的用户组管理
用户组的管理
用产组分两
私有组:
当在创建一个新用户user时,若没有指定他所属于的组,
Linux就建立一个和该用产同名的私有组
标准组:
标准组可以容纳多个用户,若使用标准组.
在创建一个新用户时就应该指定该用户所属于的组
/etc/passwd
组文件
/etc/group在这个文件中由三个冒号分隔为四个部分
1,组名:用户登录时所在的组名
2.组口令:一般不使用
3.GID 组标识号
4·组内用户列表:属于该组的所有用户名表
添加用户组
useradd用户名user 一个组和用户同名 user
groupadd 组帐号名 该组帐号大于500
改变组账号名称
groupmod -n 新组名 原组名
删除组帐号
groupdel 组帐号名称
注意:该账号必须存在且不能作为私有组被用户帐号引用
useradd -g demo user 使用 组了
usermod -g demo kali
-G demo:x:1002:kali组内用户列表
del # gpasswd -d kali demo
cat /etc/group |grep demo
uid=1001(kali) gid=1002(demo) groups=1002(demo)
-g 组id一个私有组 -G 组列表多个标准组
useradd usermod
-gG 俩个 组都可以加
gpasswd -a 加是的组列表
添加用户到组 组列表多个标准组
gpasswd -a 用户账号 组帐号名
从组中删除用户
gpasswd -d 用户账号 组帐号名
id -g -G demo
id -u kali
id命令
默认全部
功能:查看一个用户的UID和GID
id[选项]用户名
finger命令
功能:可以查看用户的相关信息,包括用户的主目录,启动SHELL,用户名等
finger[选项]用户名
finger -l -s排版显示
命令名称:
功能描述:
所在路径:
活法格式:
命令名称:
功能描述:
所在路径:
活法格式:
old 也topbottomeveryday nolooknoda yb last ...
这old end top-bottom everyday
apt install neofetch 图标查询版本 200m 大不下
vm 真机才搭算..数
dorkbox 容器到时...
都是查找str
strpos 返回位置 str position位置
str r右边 pos
strrchr str r char字符 返回字符串
strrchr == strstr
strstr 返回字符串后面 ->
jdg原变?
更高级 截取 切片
php.substr ===js.splice
trim
其他大直接iso-多分
小拷贝 c
不全 不系统 old g-
ds
一边整理笔记 网络 思维导图 图片 一边重练
越来越 走远 长命 到时 g-
经验:新疆水利潘区流量计费项目开发、
卫星云图监控及广播系统开发、办公自动化0A,新闻、电子商务等Web项目开发。
www.phpchina.com
www.uselib.com
****************php各种学习路线--------省电水气---**********************-----------------------------**************------------------------------**********************************************************
//mysql_connect("localhost","root","root")or die(连接失败);
<?php
echo "用户名:";
echo "$_REQUEST[username]";
$pass="$_REQUEST[pass]";
echo "<br>密码是:";
echo $pass;
?>
9x9乘法表
<?php
for($i=1;$i<=9;$i++){
for($j=1;$j<=$i;$j++){
echo $j."x".$i."=".$j*$i." ";
}
echo "<br>";
}
?>
  空格
<?php
function fun($num,$num2,$String){
$sum=null;
switch($String){
case "+":
$sum=$num+$num2;
break;
case "-":
$sum=$num-$num2;
break;
case "*":
$sum=$num*$num2;
break;
case "/":
$sum=$num/$num2;
break;
}
return $num.$String.$num2."=".$sum;
}
$a=fun(10,5,"-");
echo $a;
?>
<?php
$arr=array(1,2,3,4,5,6);
for($i=0;$i<count($arr);$i++){
echo "\$arr[".$i."]=".$arr[$i]."<br>";
}
?>
熟悉握Unix/Linux/Windows等多翻操作系统,
嵌入式、C/C++,J2EE、J2ME.J2SE,PHP及Oracle数据库器枝本研友工作具中,
对Web系统软件
ThinkPHP5入门
https://study.163.com/course/courseMain.htm?courseId=1005572004
fig k Oink
http://www.thinkphp.cn/
https://www.kancloud.cn/manual/thinkphp5/
零基础入门 BBS留言板 商城实战
微博登录 支付宝支付 VIP会员
边学边做
数据库 模型 分页 支付宝 入门 微博登录 API 短信 商城 Ajax 上传 后台 Bootstrap 二维码
install ThinkPHP5
手册search
ip/tp5/public
Tp5基础
目录结构
访问方式mvc
模块控制器操作
index.php应用入口文件 可hidden search
手册
目录name lowercase
G:\phpStudy\WWW\thinkphp\application\index\controller\index.php
SourceCode
{
<?php
namespace app\index\controller;
class Index
{
public function index()
{
return '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ad_bd568ce7058a1091"></think>';
}
}
}
G:\phpStudy\WWW\thinkphp\application\config.php
开启调试模式
// 应用调试模式
'app_debug' => true,
发布改回来 安全 目录信息
https://baijiahao.baidu.com/s?id=1621967218169192225&wfr=spider&for=pc
use framework development framework
new tp6.0
https://github.com/top-think/think
https://github.com/top-think/framework
https://www.kancloud.cn/special/thinkphp5_quickstart
https://www.kancloud.cn/manual/thinkphp5/118003
http://127.0.0.1/thinkphp/public
http://127.0.0.1/thinkphp/public/index.php/index
入口 方法 传值
应用项目:https://github.com/top-think/think
核心框架:https://github.com/top-think/framework
命名规范
{
目录使用小写+下划线;
驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);
以双下划线“__”打头的函数或方法作为魔术方法
}
目录结构
{
project 应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共(函数)文件
│ ├─config.php 应用(公共)配置文件
│ ├─database.php 数据库配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─route.php 路由配置文件
├─extend 扩展类库目录(可定义)
├─public WEB 部署目录(对外访问目录)
│ ├─static 静态资源存放目录(css,js,image)
│ ├─index.php 应用入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于 apache 的重写
├─runtime 应用的运行时目录(可写,可设置)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think Think 类库包目录
│ │ └─traits 系统 Traits 目录
│ ├─tpl 系统模板目录
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 基础定义文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
}
MVC是一个设计模式
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/参数/值…
https://www.jb51.net/article/108798.htm
http://serverName/index.php/index/index/hello/val/value
http://serverName/index.php?s=/index/index/hello&val=value
$php index.php index/index/hello/val/value...
ThinkPHP5.0在没有启用路由的情况下典型的URL访问规则是:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]
URL大小写
默认情况下,URL是不区分大小写的,也就是说 URL里面的模块/控制器/操作名会自动转换为小写,控制器在最后调用的时候会转换为驼峰法处理。
http://127.0.0.1/thinkphp/public/index/index/index
http://127.0.0.1/thinkphp/public/index.php/index/index
http://127.0.0.1/thinkphp/public/index.php/index/index20 error
http://127.0.0.1/thinkphp/public/index/index/index20
http://127.0.0.1/thinkphp/public/index/index/demo/5
.php class func values
https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/145250
https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/145250
URL地址
传参数不分先后
MVC
http://127.0.0.1/thinkphp/public/index/index/demo/id/55/name/koo
http://127.0.0.1/thinkphp/public/index/index/test/id/55/name/cshaps
<?php
namespace app\index\controller;
class Hi
{
public function index($id){
return $id.'Demo';
}
}
}>
http://127.0.0.1/thinkphp/public/index/hi/index/id/55
快速入门 完整->
URL传值规则MVC模式
tp5
├─application 应用目录
├─extend 扩展类库目录(可定义)
├─public 网站对外访问目录
├─runtime 运行时目录(可定义)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架核心目录
├─build.php 自动生成定义文件(参考)
├─composer.json Composer定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行工具入口
控制器
我们找到index模块的Index控制器(文件位于application/index/controller/Index.php 注意大小写),我们把Index控制器类的index方法修改为Hello,World!。
class HelloWorld
默认情况下正确的方法是使用下面的URL进行访问
http://tp5.com/index.php/index/hello_world
error index/HelloWorld
//class.name=file.name class HelloWorld url:hello_world
因为默认的URL访问是不区分大小写的,
全部都会转换为小写的控制器名,除非你在应用配置文件中,
设置了关闭url自动转换如下:
'url_convert' => false,
/index/HelloWorld
如果要继承一个公共的控制器类,可以使用:
{
?php
namespace app\index\controller;
use app\index\controller\Base;
class Index extends Base
{
public function index()
{
return 'Hello,World!';
}
}
}
控制器类可以包括多个操作方法,但如果你的操作方法是protected或者private类型的话,
是无法直接通过URL访问到该操作的,
也就是说只有public类型的操作方法才是可以通过URL访问的。
{
?php
namespace app\index\controller;
class Index
{
public function hello()
{
return 'hello,thinkphp!';
}
public function test()
{
return '这是一个测试方法!';
}
protected function hello2()
{
return '只是protected方法!';
}
private function hello3()
{
return '这是private方法!';
}
}
当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常。
http://tp5.com/index.php/index/index/hello
http://tp5.com/index.php/index/index/test
http://tp5.com/index.php/index/index/hello2
http://tp5.com/index.php/index/index/hello3
}
mysql.run 脚本 批量
{
老手推荐使用cmd指令来执行sql,因为速度比较快,首先也是连接上数据库,创建并选择好数据库:
mysql>use 数据库名;
mysql>set names utf8; --设置传输编码,避免中文乱码
mysql>source d:/xxx.sql; -- source 文件路径
就这么简单, 然后就等着sql执行完毕即可.
}
首先我们需要在应用的数据库配置文件application/database.php中添加数据库的连接信息如下:
{
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'demo',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => true,
];
}
接下来,我们修改下控制器方法,添加读取数据的代码:
{
?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function index()
{
$data = Db::name('data')->find();
$this->assign('result', $data);
return $this->fetch();
}
}
}
{
thinkphp/application/index/view/index/hello.html
<html>
<head>
<title>hello</title>
</head>
<body>
{$result.id}--{$result.data}
</body>
</html>
}
thinkphp/application/index/controller/hi.php
{
?php
namespace app\index\controller;
use app\index\controller\Index;//继承公共控制器类 .php.name+class.name
class Hi extends Index
{
public function index($id='values'){
$hi=new Index();
//$hi=super.demo()
return $id.'Demo<br>'.$hi->demo();
}
}
//class.name=file.name class HelloWorld url:hello_world
}
{
?php
namespace app\index\controller;
use think\Controller;
use think\Db;//use sql
class Index extends Controller
{
public function index()
{
//http://127.0.0.1/thinkphp/public/index.php/index/index/index
return 'helloworld';
}
public function demo($id=3)
{
return "This is a Test".$id;
}
public function test($id=3,$name="koo")
{
return $id.'name:'.$name;
}
public function hello()
{
//$this->assign('name',$name);
//return $this->fetch();
//http://127.0.0.1/thinkphp/public/index.php/index/index/hello
$data=Db::name('data')->find();
$this->assign('result',$data);
return $this->fetch();
}
}
}
数据库
插入三种方法
插入后获取id和多条插入
//Db::execute('insert*');调用sql语句
tp5构造方法
//Db::table('table_name')->insert(['name'=>'','id'=>'']);
去表前缀
Db::name('data')->insert(['name'=>'','id'=>'']);
//dump查询数据类型 数组 //创建成功返回true dump int 1
phpMyAdmin Sqlname sql脚本
mysql -uroot -proot -D think_data > demo.sql
mysql>source demo.sql
insert into data(id,name) values (1,'k'),(2,'kk');
//ctrl+enter EditPlus
arguments `` error
Db::name('data')->insert(['data'=>'koo']); 不用id 单可以OK
不用key error
query和execute两个方法
Db::query('select * from think_data where id = 5');
query方法返回的结果是一个数据集(数组),如果没有查询到数据则返回空数组。
execute 创建成功返回true dump int 1
show tables from demo
query方法用于查询,默认情况下返回的是数据集(二维数组),execute方法的返回值是影响的记录数。
切换数据库
{
$result = Db::connect([
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '123456',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
])->query('select * from think_data');
dump($result);
}
{
或者采用字符串方式定义(字符串方式无法定义数据表前缀和连接参数),如下:
$result = Db::connect('mysql://root:123456@127.0.0.1:3306/thinkphp#utf8')->query('select * from think_data where id = 1');
dump($result);
}
应用配置文件(application/config.php
// 数据库配置1,
// 数据库配置2
{
// 数据库配置1
'db1' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '123456',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
// 数据库配置2
'db2' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'test_',
],
}
$result = Db::connect('db1')->query('select * from think_data where id = 1');
$result = Db::connect('db2')->query('select * from think_data where id = 1');
values (?, ?, ?)', [8, 'thinkphp', 1]);
values (:id, :name, :status)', ['id' => 10, 'name' => 'thinkphp', 'status' => 1]);
链式操作
使用链式操作可以完成复杂的数据库查询操作,例如:
// 查询十个满足条件的数据 并按照id倒序排列
$list = Db::name('data')
->where('status', 1)
->field('id,name')
->order('id', 'desc')
->limit(10)
->select();
dump($list);
支持链式操作的查询方法包括:
方法名 描述
select 查询数据集
find 查询单个记录
insert 插入记录
update 更新记录
delete 删除记录
value 查询值
column 查询列
chunk 分块查询
count等 聚合查询
{
?php
namespace app\index\controller;
use think\Controller;//使用app/index/view/index/hello.html
use think\Db;//use sql
class Index extends Controller
{
public function koo(){
echo 'hello<hr color=red>';
echo "Db::execute Db::table Db::name";
$result=Db::connect([
'type'=>'mysql',
'hostname'=>'127.0.0.1',
'database'=>'test',
'username'=>'root',
'password'=>'root',
'hostprot'=>'3306',
'params'=>[],
'charset'=>'utf8',
'prefix'=>'',
])->query('show tables');
//$res=Db::connext('mysql://root:root@127.0.0.1:3306/test#utf8')->query('show tables');
dump($result);
}
public function index()
{
//http://127.0.0.1/thinkphp/public/index.php/index/index/index
echo "<h1>^_^</h1>";
//后面的数据库查询代码都放在这个位置
//插入记录-用原生写法-优点:直接用sql语句
//Db:execute();调用sql语句 id不能重复刷新error 否则去id
$result=Db::execute('insert into think_data(id,data) values(500,"demo")');
dump($result);//dump查询数据类型 数组
//插入记录 - 用TP5的查询构造器方法
//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);
Db::table('think_data')->update(['id'=>4,'data'=>'dae']);
//插入记录-去掉表前缀
Db::name('data')->insert(['id'=>900,'data'=>'data']);
return '<hr>helloworld';
}
public function demo($id=3)
{
return "This is a Test".$id;
}
public function test($id=3,$name="koo")
{
return $id.'name:'.$name;
}
public function hello()
{
//$this->assign('name',$name);
//return $this->fetch();
//http://127.0.0.1/thinkphp/public/index.php/index/index/hello
$data=Db::name('data')->find();
$this->assign('result',$data);
return $this->fetch();
}
}
}
//插入记录-去掉表前缀 config配置里的前缀
数据库插入数据的四种写法
Db::execute
Db::table
Db::name
db('data')
insertGetID
insertAll($data) 多条
系统提供的助手函数db
dump($result);//返回插入数目
切换数据库:
$res=Db::connect('mysql://root:root@127.0.0.1:3306/demo#utf8')->query('show tables');
岔开分离 操作
链条操作
//参数绑定占位符
Db::query('insert into think_data(data) values (?),(?)',['hello','world']);
//带命名占位符
Db::execute('insert into think_data(data) values (:data),(:data1)',['data'=>'hh','data1'=>'ww']);
field:领域
//加where
Db::table('think_data')->where('id',9)->update(['data'=>'update9']);
//查询数据 field('id,data')范围
$list=Db::name('data')->field('id,data')->where('id',9)->select();
dump($list);
//链式操作可以完成复杂的数据库查询操作
//链式操作不分先后,只要在查询方法(这里是select方法)之前调用就行
$list=Db::name('data')->where('id',9)->field('id,data')->order('id','desc')->limit(10)->select();
dump($list);
column 列
chunk 分块
count 集合查
事务支持
到事务的功能,请先修改数据表的类型为InnoDB,而不是MyISAM。
mysql 表的类型
MySQL 数据表主要支持六种类型 ,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。
https://www.cnblogs.com/qlqwjy/p/8594846.html
创建表时指定表类型的方法
create table `data`(
`id`int(88) not null auto_increment primary key,
`name` varchar(255) default null
) engine=myisam;
-- 也可以创建后更改:
alter table `data` engine=innodb;
-- 查看表类型(存储引擎) data是数据库名称
show table status from `data`;
-- -- 结果为数据库test中所有表的信息,其中第二项type即是表的类型。
-- 查看表类型(存储引擎)2 message是表名称
show create table `data`;
-- -- 结果为表message创建时的信息,其中有TYPE或ENGINE一项,指定了表的类型(存储引擎)。
-- show tables不能得到表类型的信息。
transaction方法
//事务批量处理alter table `think_data` engine=innodb;
//自动transaction方法都
Db::transaction(function(){
Db::table('think_data')->where('id',9)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
});
//手动控制事务
Db::startTrans();
try
{
Db::table('think_data')->where('id',3)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
Db::commit();//提交事务
}
catch(\Exception $e)
{
Db::rollback();//回滚事务
}
{
?php
namespace app\index\controller;
use think\Controller;//使用app/index/view/index/hello.html
use think\Db;//use sql
class Index extends Controller
{
public function koo(){
echo "Db::execute Db::table Db::name db('data') insertGetId insertAll Db::connext";
echo 'hello<hr color=red>';
//手动控制事务
Db::startTrans();
try
{
Db::table('think_data')->where('id',3)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
Db::commit();//提交事务
}
catch(\Exception $e)
{
Db::rollback();//回滚事务
}
}
public function index()
{
//http://127.0.0.1/thinkphp/public/index.php/index/index/index
echo "<h1>^_^</h1>";
//后面的数据库查询代码都放在这个位置
//插入记录-用原生写法-优点:直接用sql语句
//Db:execute();调用sql语句 id不能重复刷新error 否则去id
$result=Db::execute('insert into think_data(id,data) values(500,"demo")');
dump($result);//dump查询数据类型 数组
//插入记录 - 用TP5的查询构造器方法
//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);
Db::table('think_data')->update(['id'=>4,'data'=>'dae']);
//插入记录-去掉表前缀 config配置里的前缀
Db::name('data')->insert(['id'=>900,'data'=>'data']);
//插入记录 - 更加简单的写法
$db=db('data');
//插入记录
$result1=$db->insertGetId(['data'=>'database']);
dump($result1);
//插入记录 - 返回ID的方法
$data=['data'=>'tp5'];
$result2=Db::name('data')->insertGetId($data);
dump($result2);//返回数据库的ID
//插入记录 - 插入多条的方法
$data1=[
['data'=>'dataTablesid'],
['data'=>'dataTablesid3'],
['data'=>'dataTablesid2']
];
$result3=$db->insertAll($data1);
dump($result3);//返回插入数目
//切换数据库
$res=Db::connect('mysql://root:root@127.0.0.1:3306/demo#utf8')->query('show tables');
dump($res);
//参数绑定占位符
Db::query('insert into think_data(data) values (?),(?)',['hello','world']);
//带命名占位符
Db::execute('insert into think_data(data) values (:data),(:data1)',['data'=>'hh','data1'=>'ww']);
//加where
Db::table('think_data')->where('id',9)->update(['data'=>'update9']);
//查询数据 field('id,data')范围
$list=Db::name('data')->field('id,data')->where('id',9)->select();
dump($list);
//删除数据
Db::name('data')->where('id',9)->delete();
//链式操作可以完成复杂的数据库查询操作
//链式操作不分先后,只要在查询方法(这里是select方法)之前调用就行
$list=Db::name('data')->where('id',9)->field('id,data')->order('id','desc')->limit(10)->select();
dump($list);
//事务批量处理alter table `think_data` engine=innodb;
//自动transaction方法都
Db::transaction(function(){
Db::table('think_data')->where('id',9)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
});
//手动控制事务
Db::startTrans();
try
{
Db::table('think_data')->where('id',3)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
Db::commit();//提交事务
}
catch(\Exception $e)
{
Db::rollback();//回滚事务
}
return '<hr>helloworld';
}
public function demo($id=3)
{
return "This is a Test".$id;
}
public function test($id=3,$name="koo")
{
return $id.'name:'.$name;
}
public function hello()
{
//$this->assign('name',$name);
//return $this->fetch();
//http://127.0.0.1/thinkphp/public/index.php/index/index/hello
$data=Db::name('data')->find();
$this->assign('result',$data);
return $this->fetch();
}
}
}
增删改查
数据库update更新的四种写法
Db::startTrans();
try{
Db::execute('update think_data set data="hello" where id<=5');
Db::commit();
}
catch(\Exception $e){
Db::rollback();
}
}
fetch 获取
驼峰访问加_
在应用配置文件中设置:
// 关闭URL自动转换(支持驼峰访问控制器)
'url_convert' => false,
ThinkPHP/application/config.php
服务器环境不支持pathinfo方式的URL访问,可以使用兼容方式,例如:
http://tp5.com/index.php?s=/index/Index/index
http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo
?s=
其中变量s的名称的可以配置的。
5.0不再支持普通的URL访问方式,所以下面的访问是无效的,你会发现无论输入什么,访问的都是默认的控制器和操作^_^
http://tp5.com/index.php?m=index&c=Index&a=hello
//http://127.0.0.1/thinkphp/public/index.php?m=index&c=index&a=koo error
应用配置文件中的url_param_type
// 按照参数顺序获取
'url_param_type' => 1,
默认不安顺序
按顺序绑定参数的话,操作方法的参数只能使用URL pathinfo变量,而不能使用get或者post变量。
隐藏index.php
隐藏入口
G:\phpStudy\WWW\thinkphp\public\.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
定义路由
URL地址里面的index模块怎么才能省略
application/route.php
return [
// 添加路由规则 路由到 index控制器的hello操作方法
'hello/:name' => 'index/index/hello',
];
http://tp5.com/index/index/hello/name/thinkphp
to
http://tp5.com/hello/thinkphp
return [
// 路由参数name为可选
'hello/[:name]' => 'index/hello',
];
'koo/[:name]'=>'index/koo',
二:
采用动态定义路由规则的方式定义
application/route.php
use think\Route;
Route::rule('hello/:name', 'index/hello');
完整匹配
return [
// 路由参数name为可选
'hello/[:name]$' => 'index/hello',
];
$结尾的时候就表示当前路由规则需要完整匹配。
http://tp5.com/hello // 正确匹配
http://tp5.com/hello/thinkphp // 正确匹配
http://tp5.com/hello/thinkphp/val/value // 不会匹配
闭包定义
{
return [
// 定义闭包
'hello/[:name]' => function ($name) {
return 'Hello,' . $name . '!';
},
];
use think\Route;
Route::rule('hello/:name', function ($name) {
return 'Hello,' . $name . '!';
});
http://tp5.com/hello/thinkphp
Hello,thinkphp!
}
URL分隔符
application/config.php
// 设置pathinfo分隔符
'pathinfo_depr' => '-',
http://tp5.com/hello-thinkphp
// pathinfo分隔符
'pathinfo_depr' => '/',
http://tp5.com/hello/thinkphp
路由参数
约束路由规则的请求类型或者URL后缀之类的条件
return [
// 定义路由的请求类型和后缀
'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],
];
http://tp5.com/hello // 无效
http://tp5.com/hello.html // 有效
http://tp5.com/hello/thinkphp // 无效
http://tp5.com/hello/thinkphp.html // 有效
use think\facade\Route;
Route::get('blog/:id','blog/get');
// 输出 blog/thinkphp
Url::build('blog/read', 'name=thinkphp');
Url::build('blog/read', ['name' => 'thinkphp']);
助手函数url来简化
url('blog/read', 'name=thinkphp');
// 等效于
Url::build('blog/read', 'name=thinkphp');
// 添加hello路由标识
Route::rule(['hello','hello/:name'], function($name){
return 'Hello,'.$name;
});
// 根据路由标识快速生成URL
Url::build('hello', 'name=thinkphp');
// 或者使用
Url::build('hello', ['name' => 'thinkphp']);
use think\facade\Url;
//5.1版本 use think\facade\Url;
use think\Url;
application/route.php
{
?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\Route;
//use think\facade\Url; tp5.1
use think\Url;
Route::rule('hello/:name','index/hello');//动态路由
Route::rule('demo/:name',function($name){
return $name;//http://127.0.0.1/thinkphp/public/demo/hello doc hello
});
// 添加hello路由标识
Route::rule(['kt','kt/:name'], function($name){
return 'Hello,'.$name;
});
// 根据路由标识快速生成URL
Url::build('kt', 'name=thinkphp');
// 或者使用
Url::build('kt', ['name' => 'thinkphp']);
url('kt', 'name=thinkphp');
return [
// 全局变量规则定义
'__pattern__' => [
'name' => '\w+',
],
'koo/[:name]$'=>'index/koo',//固定路由 $完整匹配
'[hello]' => [
':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
':name' => ['index/hello', ['method' => 'post']],
],
];
}
{
?php
namespace app\index\controller;
use think\Controller;//使用app/index/view/index/hello.html 视图
use think\Db;//use sql
class Index extends Controller
{
public function koo(){
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo
//http://127.0.0.1/thinkphp/public/koo
//http://127.0.0.1/thinkphp/public/index.php?m=index&c=index&a=koo error
echo "Db::execute Db::table Db::name db('data') insertGetId insertAll Db::connext";
echo 'hello<hr color=red>';
Db::startTrans();
try{
Db::execute('update think_data set data="hello" where id<=5');
Db::commit();
}
catch(\Exception $e){
Db::rollback();
}
}
public function index()
{
//http://127.0.0.1/thinkphp/public/index.php/index/index/index
echo "<h1>^_^</h1>";
//后面的数据库查询代码都放在这个位置
//插入记录-用原生写法-优点:直接用sql语句
//Db:execute();调用sql语句 id不能重复刷新error 否则去id
$result=Db::execute('insert into think_data(data) values("demo")');
dump($result);//dump查询数据类型 数组
//插入记录 - 用TP5的查询构造器方法
//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);
Db::table('think_data')->update(['id'=>4,'data'=>'dae']);
//插入记录-去掉表前缀 config配置里的前缀
Db::name('data')->insert(['data'=>'data']);
//插入记录 - 更加简单的写法
$db=db('data');
//插入记录
$result1=$db->insertGetId(['data'=>'database']);
dump($result1);
//插入记录 - 返回ID的方法
$data=['data'=>'tp5'];
$result2=Db::name('data')->insertGetId($data);
dump($result2);//返回数据库的ID
//插入记录 - 插入多条的方法
$data1=[
['data'=>'dataTablesid'],
['data'=>'dataTablesid3'],
['data'=>'dataTablesid2']
];
$result3=$db->insertAll($data1);
dump($result3);//返回插入数目
//切换数据库
$res=Db::connect('mysql://root:root@127.0.0.1:3306/demo#utf8')->query('show tables');
dump($res);
//参数绑定占位符
Db::query('insert into think_data(data) values (?),(?)',['hello','world']);
//带命名占位符
Db::execute('insert into think_data(data) values (:data),(:data1)',['data'=>'hh','data1'=>'ww']);
//加where
Db::table('think_data')->where('id',9)->update(['data'=>'update9']);
//查询数据 field('id,data')范围
$list=Db::name('data')->field('id,data')->where('id',9)->select();
dump($list);
//删除数据
Db::name('data')->where('id',9)->delete();
//链式操作可以完成复杂的数据库查询操作
//链式操作不分先后,只要在查询方法(这里是select方法)之前调用就行
$list=Db::name('data')->where('id',9)->field('id,data')->order('id','desc')->limit(10)->select();
dump($list);
//事务批量处理alter table `think_data` engine=innodb;
//自动transaction方法都
Db::transaction(function(){
Db::table('think_data')->where('id',9)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
});
//手动控制事务
Db::startTrans();
try
{
Db::execute('update think_data set data="hello" where id<=5');//<=5 change
Db::table('think_data')->where('id',3)->update(['data'=>'transaction']);
Db::table('think_data')->insert(['data'=>'transaction']);
Db::commit();//提交事务
}
catch(\Exception $e)
{
Db::rollback();//回滚事务
}
return '<hr>helloworld';
}
public function demo($id=3)
{
return "This is a Test".$id;
}
public function test($id=3,$name="koo")
{
return $id.'name:'.$name;
}
public function hello()
{
//$this->assign('name',$name);
//return $this->fetch();
//http://127.0.0.1/thinkphp/public/index.php/index/index/hello
$data=Db::name('data')->find();
$this->assign('result',$data);
return $this->fetch();
}
}
}
select
Db::transaction(function(){
$res=Db::query('select * from think_data where id <>9');//id<>9 不等9
var_dump($res);//var_dump查询类型var_dump无规律散乱 dump整齐
});
//查询数据 field('id,data')范围
$list=Db::name('data')->field('id,data')->where('id',9)->select();
Db::execute | ::query
Db::table
Db::name
db()
三.请求和响应
request response
require包含
ThinkPHP5 的 Request 对象由 think\Request 类完成。
//http://127.0.0.1/thinkphp/public/koo?name=thinkphp
use think\Request;
$request=Request::instance();
//获取当前url地址 不含域名
echo 'url:'.$request->url();
http://127.0.0.1/thinkphp/public/koo.html?name=hello
use think\Controller;
echo 'url:'.$this->request->url().'<br/>';
使用助手函数
echo 'url:'.request()->url().'<br/>';
//http://127.0.0.1/thinkphp/public/koo/demo
dump($request->param());
echo $request->param('name');
input助手函数来简化 Request 对象的param方法
dump(input());
echo input('name');
{
自动注入请求对象 如果没有继承 think\Controller ,则可以使用 Request 对象注入的方式来简化调用:
?php namespace app\index\controller;
use think\Request;
class Index {
public function hello(Request $request, $name = 'World')
{ // 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
return 'Hello,' . $name . '!';
}
}
获取请求变量 系统推荐使用 param 方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用 不同的全局变量或者方法,并且可以满足大部分的参数需求,下面举一个例子。
{ echo '请求参数:';
dump($request->param());
echo 'name:'.$request->param('name');
}
echo 'GET参数:';
dump($request->get());
echo 'GET参数:name';
dump($request->get('name'));
echo 'POST参数:name';
dump($request->post('name'));
echo 'cookie参数:name';
dump($request->cookie('name'));
echo '上传文件信息:image';
dump($request->file('image'));
}
{
获取变量的方法包括: 方法 作用 param 获取请求变量 get 获取$_GET变量 post 获取$_POST变量 put 获取PUT请求变量 delete 获取DELETE请求变量 patch 获取PATCH请求变量 request 获取$_REQUEST变量 route 获取路由(URL)变量 session 获取$_SESSION变量 cookie 获取$_COOKIE变量 server 获取$_SERVER变量 env 获取$_ENV变量 file 获取上传文件信息
}
dump($request->method());//请求方法
dump($request->type());//资源类型
dump($request->ip());//访问ip
dump(var_export($request->isAjax(),true));//是否Ajax请求
dump($request->param());//参数
dump($request->only(['name']));//参数包name
dump($request->except(['name']));//参数排除name
{
URL请求和信息方法可以总结如下: 方法 作用 domain 获取当前的域名 url 获取当前的完整URL地址 baseUrl 获取当前的URL地址,不含QUERY_STRING baseFile 获取当前的SCRIPT_NAME root 获取当前URL的root地
pathinfo 获取当前URL的pathinfo地址 path 获取当前URL的pathinfo地址,不含后缀 ext 获取当前URL的后缀 type 获取当前请求的资源类型 scheme 获取当前请求的scheme query 获取当前URL地址的QUERY_STRING host 获取当前URL的host地址 port 获取当前URL的port号 protocol 获取当前请求的SERVER_PROTOCOL remotePort 获取当前请求的REMOTE_POR
}
{
dump($request->method());//请求方法
dump($request->type());//资源类型
dump($request->ip());//访问ip
dump(var_export($request->isAjax(),true));//是否Ajax请求
dump($request->param());//参数
dump($request->only(['name']));//参数包name
dump($request->except(['name']));//参数排除name
//url、baseUrl、baseFile、root方法如果传入true,表示获取包含域名的地址
dump($request->domain());//域名
dump($request->baseFile());//入口文件当前
dump($request->url());//url 不含域名
dump($request->url(true));//含域名完整url
dump($request->baseUrl());//url no QUERY_STRING
dump($request->root(true));//url访问的root地址 !+true
dump($request->pathinfo());//url中的path_info
dump($request->path());//url中的path_info 不含后缀
dump($request->ext());//url中的后缀信息
dump($request->scheme());//获取当前请求的scheme
dump($request->query());//获取当前URL地址的QUERY_STRING
dump($request->host());//获取当前URL的host地址
dump($request->port());//获取当前URL的port号
dump($request->protocol());//获取当前请求的SERVER_PROTOCOL
dump($request->remotePort());//获取当前请求的REMOTE_PORT
}
dump($request->module());//当前模块
dump($request->controller());//控制器
dump($request->action());//操作信息
dump($request->routeInfo());//路由信息
dump($request->dispatch());//调度信息
{
修改配置文件,添加:
// 默认输出类型 'default_return_type' => 'json',
return ['name'=>'koo']
修改输出类型为xml:
// 默认输出类型 'default_return_type' => 'xml',
<think> <name>thinkphp</name> <status>1</status> </think>
}
$data=['name'=>'hello','id'=>'1'];
xml($data,404);
json($data)->code(404)->header( ['Cache-control' => 'no-cache,must-revalidate']);
return json($data,404,['Cache-control' => 'no-cache,must-revalidate']);
use traits\controller\Jump;//页面跳转
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo/name/hello
//success to func-demo error to func-test
if('hello'==$name){
$this->success('success','demo');
}
else{
$this->error('error','test');
}
引入了一个 Jump trait,这是 PHP5.4 版本的新特性,
如果你的控制器类是继承的 \think\Controller 的话,系统已经自动为你引入了 \traits\controller\Jump ,无需再次引 入
页面重定向 如果要进行页面重定向跳转,可以使用:
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo/name/hello
//redirect重定向 success to func-demo error to func-test
if('baidu'==$name){
$this->redirect('http://www.baidu.com');
}
的助手函数redirect函数进行重定向。
if ('thinkphp' == $name)
return redirect('http://thinkphp.cn');
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo/name/baidu
//组手redirect()重定向 success to func-demo error to func-test
if('qq'==$name){
return redirect('http://www.qq.com',302);
}
数据库删除5
db('data')->where('id','<',2)->delete();
//根据主键del
db('data')->delete(1);
db('data')->delete([1,8,9]);
数据库 结合url传值 增删应用实例
echo $name.'增删改查OK<br>';
//结合urlhttp://127.0.0.1/thinkphp/public/index.php?s=/index/index/test/name/ls
db('data')->insert(['data'=>$name]);
模板调用快速入门源码
模板入门
调用模板,美工设计和程序分工协助
VC模式
//不用use think\Controller or class Index extends \think\Controller
{
use think\Controller;//使用app/index/view/index/hello.html 视图
class Index extends Controller
{
public function kali(){
//http://127.0.0.1/thinkphp/public/index/index/index/kali
//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.html
//模板变量赋值
$this->assign('name','<h1>hello</h1>');
//或者批量赋值 覆写前面name
$this->assign([
'name'=>'koo',
'email'=>'qq@qq.com'
]);
//数组赋值
$data['name']='john';
$data['email']='qq@qq.con';
$this->assign('data',$data);
//模板输出-指定模板文件名
//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.html
return $this->fetch('kali');
//模板输出-使用默认控制器的名字
//G:\phpStudy\WWW\thinkphp\application\index\view\index\index.html fetch() 不带值
//return $this->fetch();
}
}
}
//或者批量赋值 覆写前面name html调用用前面name {$name}
//数组赋值 {$data.name}
//模板输出-指定模板文件名
//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.html
return $this->fetch('kali');
//模板输出-使用默认控制器的名字
//G:\phpStudy\WWW\thinkphp\application\index\view\index\index.html fetch() 不带值
//return $this->fetch();
三方法:
$this->assign('name','hellowrold');
$this->assign([
'tel'=>'120',
'phone'=>'apple'
]);
//$data['dog']='long';
$data=['dog'=>'longlong'];
$this->assign('data',$data);
return $this->fetch();
四方法:
//fetch('现实html',[$name=>value]) 省assign
return $this->fetch('index',['name'=>'hello']);
没有view html create
//不带值 不调用 默认url 没有arguments
$this->assign('name');
public function index(Request $request,$name='world')
//不带值 不调用 默认url 没有arguments
//+$name才用
视图实例化
视图功能由\think\View类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。
继承\think\Controller类
// 渲染模板输出
return $this->fetch('hello',['name'=>'thinkphp']);
方法 说明
fetch 渲染模板输出
display 渲染内容输出
assign 模板变量赋值
engine 初始化模板引擎
engine 发动机 引擎
$this->view 对象:
助手函数
return view('hello',['name'=>'thinkphp']);
无需继承think\Controller
view('[模板文件]'[,'模板变量(数组)'][,模板替换(数组)])
{
//return 先遇到的 马上返回 不执行后面
//view()组手函数=fetch()
return view('index',['name'=>'view']);
}
芒果k php
内置模板引擎
应用配置文件中配置template参数即可,例如:
{
'template' => [
// 模板引擎类型 支持 php think 支持扩展
'type' => 'Think',
// 模板路径
'view_path' => './template/',
// 模板后缀
'view_suffix' => 'html',
// 模板文件名分隔符
'view_depr' => DS,
// 模板引擎普通标签开始标记
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' => '}',
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
],
}
调用engine方法初始化
视图类也提供了engine方法对模板解析引擎进行初始化或者切换不同的模板引擎
return $this->engine('php')->fetch();
表示当前视图的模板文件使用原生php进行解析。
display 均可传入模版变量
$content = '{$name}-{$email}';
return $this->display($content, [
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
share方法
V5.0.4+开始,支持在任何地方使用静态方法进行模板变量赋值
think\View::share('name','value');
// 或者批量赋值
think\View::share(['name1'=>'value','name2'=>'value2']);
全局静态模板变量最终会和前面使用方法赋值的模板变量合并。
share分享共享
//share()支持在任何地方使用静态方法进行模板变量赋值 {$share}
//use think\View;
\think\View::share('share','share');
\think\View::share(['share'=>'PCShare']);
return $this->fetch();
渲染模板最常用的是继承系统的控制器基类后调用fetch方法,调用格式:
fetch('[模板文件]'[,'模板变量(数组)'])
用法 描述
不带任何参数 自动定位当前操作的模板文件
[模块@][控制器/][操作] 常用写法,支持跨模块
完整的模板文件名 直接使用完整的模板文件名(包括模板后缀)
当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
return $this->fetch('member/read');
表示调用Member控制器下面的read模板。
G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.html
G:\phpStudy\WWW\thinkphp\application\index\view\index\index.html
return $this->fetch('/directory/index');
//G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.html
跨模块渲染模板
return $this->fetch('admin@member/edit');
渲染输出不需要写模板文件的路径和后缀。这里面的控制器和操作并不一定需要有实际对应的控制器和操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有Public控制器,更没有Public控制器的menu操作,但是一样可以使用
return $this->fetch('public/menu');
支持从视图根目录开始读取模板,例如:
$this->fetch('/menu');
当前模块/默认视图目录/menu.html
渲染完整模板
return $this->fetch('./template/public/menu.html');
其他的后缀文件,也支持直接输出,例如:
return $this->fetch('./template/public/menu.tpl');
增加__ROOT____STATIC____JS__和__CSS__内置替换规则
输出替换
视图输出的内容进行字符替换
$this->assign('name','thinkphp');
return $this->fetch('index',[],['__PUBLIC__'=>'/public/']);
如果需要全局替换的话,可以直接在配置文件中添加:
'view_replace_str' => [
'__PUBLIC__'=>'/public/',
'__ROOT__' => '/',
]
助手函数view也支持全局配置参数view_replace_str的设置,如果需要设置不同的替换参数,可以使用:
return view('index',['name'=>'thinkphp'],['__PUBLIC__'=>'/public/']);
在渲染模板或者内容输出的时候就会自动根据设置的替换规则自动替换。
分页输出 可以很简单的输出用户的分页数据,控制器 index 方法修改为
$list = UserModel::paginate(3);
$this->assign('list',$list);
return $this->fetch();
bootstrap
列表:{$list->total()}
{volist name="list" id="user"}
ID:{$user.id}<br/> 昵称:{$user.nickname}<br/>
邮箱:{$user.email}<br/> 生日:{$user.birthday}<br/>
{/volist}
{$list->render()}
view html
导入kali.html
{include file="index/kali" title="$title"/}
// 模板路径
'view_path' => '../template/index/',
{
?php
namespace app\index\controller;
use think\Controller;//使用app/index/view/index/hello.html 视图
use think\Db;//use sql
use think\Request;//request response
use traits\controller\Jump;//页面跳转 extends Controller自带 或者用组手函数redirect
//不用use think\Controller or class Index extends \think\Controller
class Index extends Controller
{
public function kali(){
//http://127.0.0.1/thinkphp/public/index/index/index/kali
//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.html
//模板变量赋值
$this->assign('name','<h1>hello</h1>');
//或者批量赋值 覆写前面name html调用用前面name {$name}
$this->assign([
'name'=>'koo',
'email'=>'qq@qq.com'
]);
//数组赋值 {$data.name}
$data['name']='john';
$data['email']='qq@qq.con';
$this->assign('data',$data);
//模板输出-指定模板文件名
//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.html
return $this->engine('php')->fetch('kali');
//engine('php')表示当前视图的模板文件使用原生php进行解析。
//模板输出-使用默认控制器的名字
//G:\phpStudy\WWW\thinkphp\application\index\view\index\index.html fetch() 不带值
//return $this->fetch();
}
public function koo(Request $request,$name='world'){
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo
//http://127.0.0.1/thinkphp/public/koo.html?name=hello
//http://127.0.0.1/thinkphp/public/koo
//http://127.0.0.1/thinkphp/public/index.php?m=index&c=index&a=koo error
echo "Db::execute Db::table Db::name db('data') insertGetId insertAll Db::connext";
echo '<hr color=red>';
dump($request->module());//当前模块
dump($request->controller());//控制器
dump($request->action());//操作信息
echo '<hr color=red>';
//http://127.0.0.1/thinkphp/public/index.php?s=/index/index/koo/name/baidu
//组手redirect()重定向 success to func-demo error to func-test
if('qq'==$name){
return redirect('http://www.qq.com',302);
}
}
public function index(Request $request,$name='world')
{
//https://www.kancloud.cn/manual/thinkphp5/118113 模型模板
//https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/147290
//不带值 不调用 默认url 没有arguments
//+$name才用 http://127.0.0.1/thinkphp/public/index/index/index/name/koo
$this->assign('name',$name);
$this->assign([
'tel'=>'120',
'phone'=>'apple'
]);
//$data['dog']='long';
$data=['dog'=>'longlong'];
$this->assign('data',$data);
//share()支持在任何地方使用静态方法进行模板变量赋值 {$share}
//use think\View;
\think\View::share('share','share');
\think\View::share(['share'=>'PCShare']);
//视图输出内容字符替换
return $this->fetch('index',[],['__PUBLIC__'=>'/public/']);
return $this->fetch('directory/index');
//G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.html
//return 先遇到的 马上返回 不执行后面
//view()组手函数=fetch()
return view('index',['name'=>'view'],['__PUBLIC__'=>'/public/']);
return $this->fetch();
//fetch('现实html',[$name=>value]) 省assign
return $this->fetch('index',['name'=>'hello']);
//display 均可传入模版变量
$content='{$name}';
return $this->display($content,['name'=>'display']);
}
}
}
模板和数据库 组合操作入门
exit() 退出 后面不执行
view html
{$list.0.name}
二维数组+key0
视图+数据库组合操作入门
//https://www.kancloud.cn/manual/thinkphp5/118113 5.0全模型模板
//https://www.kancloud.cn/manual/thinkphp5_1/353946 5.1全模型模板
//https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/147290 5.0快
方法内:
$list=Db::name('data')->where('id','>=",'5')->select();
dump($list);
$this->assign('list',$list);
return $this->fetch('kali');
ViewHtml
{
TwoArrayID:{$list.1.id+10}<br><!-- 支持运算-->
<!-- 循环遍历输出-->
{foreach $list as $key=>$val}
{$key}=>{$val.id}:{$val.data}<br>
{/foreach}
<!--
volist标签循环遍历输出
name="遍历对象" id="values"
-->
{volist name="list" id="val"}
{$val.id}:{$val.data}<br>
{/volist}
<!--
volist标签循环遍历输出
name="遍历对象" id="values"
offset="开始第几条" length="读多少条"
输出其中的第5~15条记录
empty="暂时没有数据" 为空时执行
-->
<hr color=yellow>
{volist name="list" id="val" offset="0" length="3" empty="暂时没有数据"}
{$val.id}:{$val.data}<br>
{/volist}
}
ThinkPHP内置了一个基于XML的性能卓越的模板引擎,这是一个专门为ThinkPHP服务的内置模板引擎,使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。
标签类型 描述
普通标签 主要用于输出变量、函数过滤和做一些基本的运算操作
XML标签 也称为标签库标签,主要完成一些逻辑判断、控制和循环输出,并且可扩展
普通标签
普通标签用于变量输出和模板注释,
普通模板标签默认以{ 和 } 作为开始和结束标识,
并且在开始标记紧跟标签的定义,如果之间有空格或者换行则被视为非模板标签直接输出。
例如:{$name} 、{$vo.name} 、{$vo['name']|strtoupper} 都属于正确的标签,
而{ $name} 、{ $vo.name}则不属于。
要更改普通标签的起始标签和结束标签,可以更改template.php中的配置参数:
// 普通标签开始标记
'tpl_begin' => '<{',
// 普通标签结束标记
'tpl_end' => '}>'
普通标签的定界符就被修改了,原来的 {$name} 和 {$vo.name} 必须使用 <{$name}> 和 <{$vo.name}> 才能生效了。
{
//标签库标签开始标签
'taglib_begin' => '<',
//标签库标签结束标记
'taglib_end' => '>',
{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
复制
就需要改成
<eq name="name" value="value">
相等
<else/>
不相等
</eq>
}
模板标签的{}和$之间不能有任何的空格,否则标签无效
一个对象{$data->name}
常量:{$data::CONST_NAME}
方法:{$data->fun()}
使用默认值
{$user.name|default="default"}
默认值和函数可以同时使用,例如:
{$Think.get.name|getName|default="名称为空"}
系统变量输出
普通的模板变量需要首先赋值后才能在模板中输出,但是系统变量则不需要,可以直接在模板中输出,系统变量的输出通常以{$Think.}(大小写一致) 打头,例如:
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.page} // 输出$_GET['page']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
复制
支持输出 $_SERVER、$_ENV、 $_POST、 $_GET、 $_REQUEST、$_SESSION和 $_COOKIE变量。
还可以输出常量
{$Think.const.PHP_VERSION}
输出配置参数使用:
{$Think.config.default_module}
{$Think.config.default_controller}
输出语言变量可以使用:
{$Think.lang.page_error}
{$Think.lang.var_error}
请求变量
模板支持直接输出Request请求对象的方法参数,用法如下:
$Request.方法名.参数
{
// 调用Request对象的get方法 传入参数为id
{$Request.get.id}
// 调用Request对象的param方法 传入参数为name
{$Request.param.name}
// 调用Request对象的param方法 传入参数为user.nickname
{$Request.param.user.nickname}
// 调用Request对象的root方法
{$Request.root}
// 调用Request对象的root方法,并且传入参数true
{$Request.root.true}
// 调用Request对象的path方法
{$Request.path}
// 调用Request对象的module方法
{$Request.module}
// 调用Request对象的controller方法
{$Request.controller}
// 调用Request对象的action方法
{$Request.action}
// 调用Request对象的ext方法
{$Request.ext}
// 调用Request对象的host方法
{$Request.host}
// 调用Request对象的ip方法
{$Request.ip}
// 调用Request对象的header方法
{$Request.header.accept-encoding}
}
需要对模板输出使用函数进行过滤或其它处理的时候,可以使用:
{$data.name|md5} {$data.name | md5}
如果你不需要转义(例如你需要输出html表格等内容),可以使用:
{$data.name|raw}
系统内置了下面几个固定的过滤规则(不区分大小写)
过滤方法 描述
date 日期格式化(支持各种时间类型)
format 字符串格式化
upper 转换为大写
lower 转换为小写
first 输出数组的第一个元素
last 输出数组的最后一个元素
default 默认值
raw
{$data.create_time|date='Y-m-d H:i'}
{$data.number|format='%02d'}
{$data.name|substr=0,3}
多个函数过滤
{$name|md5|strtoupper|substr=0,3}
{:substr(strtoupper(md5($name)),0,3)}
可以在模板中直接使用系统的助手函数进行输出
{:app('cache')->get('name')}
表示调用容器中的think\Cache对象实例输出name缓存标识内容。
{:}开头的变量输出表示调用函数或者类的方法及属性,如果你要带命名空间调用类的属性,例如:
{:think\\App::VERSION}
{:think\\facade\\Request::get('name')}
类的命名空间中的\需要改成\\才能正常调用。
运算符 使用示例
+ {$a+$b}
- {$a-$b}
* {$a*$b}
/ {$a/$b}
% {$a%$b}
++ {$a++} 或 {++$a}
-- {$a--} 或{--$a}
综合运算 {$a+$b*10+$c}
模板可以支持三元运算符,例如:
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
{$name ?? '默认值'}
表示如果有设置$name则输出$name,否则输出默认值。
{$name?='默认值'}
表示$name为真时才输出默认值。
{$name ?: 'NO'}
表示如果$name为真则输出$name,否则输出NO。
{$a==$b ? 'yes' : 'no'}
前面的表达式为真输出yes,否则输出no, 条件可以是==、===、!=、!==、>=、<=
原样输出
{
可以使用literal标签来防止模板标签被解析,例如:
{literal}
Hello,{$name}!
{/literal}
上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。
literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。
总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal标签处理。
}
模板注释
{ /* 注释内容 */ } 或
{// 注释内容
}
模板布局 看别人打
全局配置方式
return [
'layout_on' => true,
'layout_name' => 'layout',
]
模板标签方式
{layout name="layout" /}
动态方法布局
$this->view->engine->layout(true);
return $this->fetch('add');
例如全局配置已经开启了布局,可以在某个页面单独关闭
$this->view->engine->layout(false);
模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。
{block name="title"}<title>网站标题</title>{/block}
然后我们在子模板(其实是当前操作的入口模板)中使用继承:base.html
{extend name="base" /}
这一区块中有{__block__}这个标签,当区块中有这个标记时,就不只是直接重载这个区块,它表示引用所继承模板对应区块的内容到这个位置,最终这个区块是合并后的内容。所以这里footer区块最后的内容是: 底部@ThinkPHP 版权所有
{
extend标签的用法和include标签一样,你也可以加载其他模板:
{extend name="Public:base" /}
}
绝对文件路径加载
{extend name="./Template/Public/base.html" /}
{
{extend name="./base.html"/}
{block name="title"}{$title}{/block}
{block name="menu"}
首页
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="val"}
{$val.id}=>{$val.data}<br>
{/volist}
{/block}
{block name="right"}{/block}
{block name="footer"}
{__block__}
@ThinkPHP
{/block}
}
{
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}标题{/block}</title>
</head>
<body>
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}
</body>
</html>
}
包含文件
{include file='模版文件1,模版文件2,...' /}
模版表达式的定义规则为:模块@控制器/操作
{include file="public/header" /} // 包含头部模版header
{include file="public/menu" /} // 包含菜单模版menu
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版
一次包含多个模版
{include file="public/header,public/menu" /}
直接包含一个模版文件名(包含完整路径),例如:
{include file="../application/view/default/public/header.html" /}
传入参数
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /}
复制
就可以在包含的header.html文件里面使用title和keywords变量,如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
模板输出替换
如果需要全局替换的话,可以直接在template.php配置文件中添加:
'tpl_replace_string' => [
'__STATIC__'=>'/static',
'__JS__' => '/static/javascript',
]
标签库
导入标签库
{taglib name="html" /}
多个
{taglib name="html,article" /}
{article:read name="hello" id="data" }
{$data.id}:{$data.title}
{/article:read}
{article:read name="hello" /} 就是开放标签。
内置标签
无需导入即可使用
{
{eq name="status" value="1" }
正常
{/eq}
复制
如果Cx不是内置标签的话,可能就需要这么使用了:
{cx:eq name="status" value="1" }
正常
{/cx:eq}
}
标签库预加载
{
在应用或者模块的配置文件中添加:
'taglib_pre_load' => 'article,html'
设置后,模板文件就不再需要使用
{taglib name="html,article" /}
}
内置标签
{
标签名 作用 包含属性
include 包含外部模板文件(闭合) file
load 导入资源文件(闭合 包括js css import别名) file,href,type,value,basepath
volist 循环数组数据输出 name,id,offset,length,key,mod
foreach 数组或对象遍历输出 name,item,key
for For循环数据输出 name,from,to,before,step
switch 分支判断输出 name
case 分支判断输出(必须和switch配套使用) value,break
default 默认情况输出(闭合 必须和switch配套使用) 无
compare 比较输出(包括eq neq lt gt egt elt heq nheq等别名) name,value,type
range 范围判断输出(包括in notin between notbetween别名) name,value,type
present 判断是否赋值 name
notpresent 判断是否尚未赋值 name
empty 判断数据是否为空 name
notempty 判断数据是否不为空 name
defined 判断常量是否定义 name
notdefined 判断常量是否未定义 name
define 常量定义(闭合) name,value
assign 变量赋值(闭合) name,value
if 条件判断输出 condition
elseif 条件判断输出(闭合 必须和if标签配套使用) condition
else 条件不成立输出(闭合 可用于其他标签) 无
php 使用php代码 无
}
循环标签
{foreach $list as $key=>$vo }
{$vo.id}:{$vo.name}
{/foreach}
可以不通过模板变量赋值,支持使用函数或者方法获取数据循环输出:
{foreach :model('user')->all() as $key=>$vo }
{$vo.id}:{$vo.name}
{/foreach}
VOLIST标签
volist标签通常用于查询数据集或者二维数组的结果输出。 在控制器中首先对模版赋值:
{volist name="list" id="data"}
{$data.id}:{$data.name}<br/>
{/volist}
Volist标签的name属性表示模板赋值的变量名称,因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突
可以直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:
{volist name=":model('user')->all()" id="vo"}
{$vo.name}
{/volist}
支持输出查询结果中的部分数据,例如输出其中的第5~15条记录
{volist name="list" id="vo" offset="5" length='10'}
{$vo.name}
{/volist}
输出偶数记录
{volist name="list" id="vo" mod="2" }
{eq name="mod" value="1"}{$vo.name}{/eq}
{/volist}
为空的时候输出提示:
{volist name="list" id="vo" empty="暂时没有数据" }
输出循环变量:
{volist name="list" id="vo" key="k" }
{$k}.{$vo.name}
{/volist}
果没有指定key属性的话,默认使用循环变量i,例如:
{volist name="list" id="vo" }
{$i}.{$vo.name}
{/volist}
FOR标签
{for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" }
{/for}
开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。comparison 的默认值是lt,name的默认值是i,步进值的默认值是1,举例如下:
{for start="1" end="100"}
{$i}
{/for}
解析后的代码是
for ($i=1;$i<100;$i+=1){
echo $i;
}
比较标签
{比较标签 name="变量" value="值"}
内容
{/比较标签}
{
标签 含义
eq或者 equal 等于
neq 或者notequal 不等于
gt 大于
egt 大于等于
lt 小于
elt 小于等于
heq 恒等于
nheq 不恒等于
}
{eq name="name" value="value"}value{/eq}
{else/}
当 name变量的值大于5就输出
{gt name="name" value="5"}value{/gt}
所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如: 当name变量的值等于5就输出
{compare name="name" value="5" type="eq"}value{/compare}
{eq name="name" value="5" }value{/eq}
条件判断
SWITCH标签
{switch 变量 }
{case value1 }输出内容1{/case}
{case value2}输出内容2{/case}
{default /}默认情况
{/switch}
{case gif|png|jpg}图像格式{/case}
IF标签
{if 表达式}value1
{elseif 表达式 /}value2
{else /}value3
{/if}
{if ( $name == 1) OR ( $name > 100) } value1
范围判断
范围判断标签包括in/notin/ between/ notbetween四个标签,都用于判断变量是否中某个范围。
$id = 1;
$this->assign('id',$id);
IN和NOTIN
我们可以使用in标签来判断模板变量是否在某个范围内,例如:
{in name="id" value="1,2,3"}
id在范围内
{/in}
如果判断不在某个范围内,可以使用notin标签:
{notin name="id" value="1,2,3"}
id不在范围内
{/notin}
{in name="id" value="1,2,3"}
id在范围内
{else/}
id不在范围内
{/in}
BETWEEN 和 NOTBETWEEN
between标签来判断变量是否在某个区间范围内
{between name="id" value="1,10"}
输出内容1
{/between}
notbetween标签来判断变量不在某个范围内
{notbetween name="id" value="1,10"}
输出内容2
{/notbetween}
可以使用else标签把两个用法合并,例如:
{between name="id" value="1,10"}
输出内容1
{else/}
输出内容2
{/between}
{between name="id" value="A,Z"}
{between name="Think.post.id" value="1,5"}
{between name="id" value="$range"}
PRESENT/NOTPRESENT标签
present标签用于判断某个变量是否已经定义,用法:
{present name="name"}
name已经赋值
{/present}
复制
如果判断没有赋值,可以使用:
{notpresent name="name"}
name还没有赋值
{/notpresent}
可以把上面两个标签合并成为:
{present name="name"}
name已经赋值
{else /}
name还没有赋值
{/present}
EMPTY/NOTEMPTY 标签
empty标签用于判断某个变量是否为空
{empty name="name"}
name为空值
{/empty}
复制
如果判断没有赋值,可以使用:
{notempty name="name"}
name不为空
{/notempty}
可以把上面两个标签合并成为:
{empty name="name"}
name为空
{else /}
name不为空
{/empty}
DEFINED 标签
DEFINED标签用于判断某个常量是否有定义,用法如下:
{defined name="NAME"}
NAME常量已经定义
{/defined}
如果判断没有被定义,可以使用:
{notdefined name="NAME"}
NAME常量未定义
{/notdefined}
可以把上面两个标签合并成为:
{defined name="NAME"}
NAME常量已经定义
{else /}
NAME常量未定义
{/defined}
资源文件加载
<script type='text/javascript' src='/static/js/common.js'>
{load href="/static/js/comm.js"/}
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
{load href="/static/css/style.css"}
多个
{load href="/static/js/common.js,/static/css/style.css" /}
{js href="/static/js/common.js" /}
{css href="/static/css/style.css" /}
标签嵌套
系统内置的标签中,volist、switch、if、elseif、else、foreach、
compare(包括所有的比较标签)、(not)present、(not)empty、(
not)defined等标签都可以嵌套使用
原生PHP
{php}echo 'Hello,world!';{/php}
php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:
设置了tpl_deny_php参数为true,就不能在模板中使用原生的PHP代码,但是仍然支持PHP标签输出。
定义标签
ASSIGN标签
ASSIGN标签用于在模板文件中定义变量,用法如下:
{assign name="var" value="123" /}
在运行模板的时候,赋值了一个var的变量,值是123。
var=123
DEFINE标签
DEFINE标签用于中模板中定义常量,用法如下:
{define name="MY_DEFINE_NAME" value="3" /}
在运行模板的时候,就会定义一个MY_DEFINE_NAME的常量。
标签扩展
自定义标签
建议开发者将自定义标签库请放置应用目录中,请勿放在框架系统目录内,以免使用Composer更新框架时导致自定义标签库的丢失
use think\template\TagLib;
class Demo extends TagLib
这时候我们的控制器继承Controller,在配置参数中配置:
在控制器中对模版赋值:
在模版中调用我们已经预先加载的标签:
{
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}title{/block}</title>
</head>
<body>
{block name="menu"}menu{/block}
{block name="left"}left{/block}
{block name="main"}main{/block}
{block name="right"}right{/block}
{block name="footer"}footer{/block}
<hr color=red>
{assign name="demo" value="tag"/}
{demo:close name="demo"/}
<hr color=red>
{assign name="var" value="assignVar"/}
{$var}
<hr color=red>
{if 1==2}hello
{elseif 1==3}koo
{else/} world
{/if}
<hr color=red>
{for name="i" start="0" comparison="lt" end="8" step="1"}
{$i}
{/for}
<hr color=red>
{switch 1+1}
{case 1}hello{/case}
{case 2}world{/case}
{default/}default
{/switch}
<hr color=red>
{php}//phpinfo();{/php}
</body>
</html>
}
{
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kali-{$name}</title>
</head>
<body>
<div class="container">
<hr color=red>
{/* */}
{//
}
{literal}
$NOAfter:{$name??'default'}
trueAfter:{$name?='default'}
trueName:{$name?:'default'}
Tree:{$name?'Y':'N'}
{/literal}
<hr color=red>
<hr color=red>
$NOAfter:{$name??'default'}
trueAfter:{$name?='default'}
trueName:{$name?:'default'}
Tree:{$name?'Y':'N'}
<hr color=red>
Name:{$name|md5|strtoupper|substr=0,3}
=>or:
{:substr(strtoupper(md5($name)),0,3)}
<hr color=red>
Name:{$name|md5}
<br>
Email:{$email}
<br>
Date[]:{$data.name,$data.email}
<hr color=red>
TwoArray:{$list.1.data}<br>
TwoArrayID:{$list.1.id+10}<br><!-- 支持运算-->
<hr color=green>
<!-- 循环遍历输出-->
{foreach $list as $key=>$val}
{$key}=>{$val.id}:{$val.data}<br>
{/foreach}
<hr color=red>
phpVersion:{$Think.PHP_VERSION}<br>
getID:{$Request.get.id}
name:{$Request.param.name}
path:{$Request.path}
module:{$Request.module}
controller:{$Request.controller}
action:{$Request.action}
.ext{$Request.ext}
host{$Request.host}
ip{$Request.ip}
<hr color=green>
<!--
volist标签循环遍历输出
name="遍历对象" id="values"
-->
{volist name="list" id="val"}
{$val.id}:{$val.data}<br>
{/volist}
<!--
volist标签循环遍历输出
name="遍历对象" id="values"
offset="开始第几条" length="读多少条"
输出其中的第5~15条记录
empty="暂时没有数据" 为空时执行
-->
<hr color=yellow>
{volist name="list" id="val" offset="0" length="3" empty="暂时没有数据"}
{$val.id}:{$val.data}<br>
{/volist}
</div>
</body>
</html>
}
BBS浏览展示页面
G:\phpStudy\WWW\thinkphp\application\index\view\bbs\bbs.html
{
<!DOCTYPE html>
<html>
<head>
<title>BBS</title>
</head>
<body>
{foreach $show as $key=>$val}
{$key}=>{$val.id,$val.data}<br>
{/foreach}
<hr>
{volist name="show" id="val" empty="empty"}
Default:{$i}-ID=>{$val.id}:{$val.data}<br>
{/volist}
</body>
</html>
}
G:\phpStudy\WWW\thinkphp\application\index\controller\Bbs.php
{
?php
namespace app\index\controller;
use think\Db;
class Bbs extends \think\Controller
{
public function show()
{
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
$db=db('data');
$show=$db->where('id','<','88')->select();
//dump($show);
$this->assign('show',$show);
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
}
}
}
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
分页实现入门
.留言板展示页
paginate(一页显示多少,共多少) 30=1 2 3
$show=$db->where('id','>=','1')->paginate(10,30);
显示分页{$show->render()}
{volist name="show" id="val" empty="empty"}
Default:{$i}-ID=>{$val.id}:{$val.data}<br>
{/volist}
{$show->render()}
reader 阅读读取 en 分页render
默认类名是.pagination
.pagination li
{
?php
namespace app\index\controller;
use think\Db;
class Bbs extends \think\Controller
{
public function show()
{
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
$db=db('data');
//查询状态为1的用户数据 并且每页显示10条数据
$show=$db->where('id','>=','1')->paginate(10,80);
//dump($show);
//把分页数据赋值给模板变量list
$this->assign('show',$show);
//渲染模板输出
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
//http://127.0.0.1/thinkphp/public/index/bbs/show?page=4
//http://127.0.0.1/thinkphp/public/index/bbs/show/page/8
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
//$db=db('data');
//$show=$db->where('id','<','88')->select();
//dump($show);
//$this->assign('show',$show);
//return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
}
}
}
//http://127.0.0.1/thinkphp/public/index/bbs/show?page=4
//http://127.0.0.1/thinkphp/public/index/bbs/show/page/8
{
<!DOCTYPE html>
<html>
<head>
<title>BBS</title>
</head>
<style>
点pagination{border:solid #ccc 1px;}
点pagination li{
display:inline-block;
list-style:none;
padding:10px;
border:solid #f50 1px;
box-shadow:10px 10px 20px;
}
ul li{
list-style:none;
}
</style>
<body>
{foreach $show as $key=>$val}
{$key}=>{$val.id,$val.data}<br>
{/foreach}
<hr>
{volist name="show" id="val" empty="empty"}
Default:{$i}-ID=>{$val.id}:{$val.data}<br>
{/volist}
{$show->render()}
</body>
</html>
}
}
分页显示
{$show->render()}
每页显示10条数据
paginate(10);
也可以单独赋值分页输出的模板变量
&list=db('data')->where('id','>',1)->paginete(10);
//获得分页显示
$page=$list->render();
$this->assign('list',$list);
return $this->fetch();
html
{$page}
生成的分页输出是完整分页功能
<ul class="pagination">
<li><a href="?page=1">«</a></li>
<li><a href="?page=1">1</a></li>
<li class="active"><span>2</span></li>
<li class="disabled"><span>»</span></li>
</ul>
分页后数据处理
支持分页类后数据直接each遍历处理,方便修改分页后的数据,而不是只能通过模型的获取器来补充字段。
&list=db('data')->where('id','>',1)
->paginete(10)->each(function($item,$key){
$item->nickname = 'think';
$item['nickname'] = 'think';
return $item;
});
Db类操作分页数据 each方法的闭包函数中需要使用返回值
简洁分页
仅仅只有上下页的分页输出
paginate(10,true);
简洁分页模式的输出代码为:
<ul class="pager">
<li><a href="?page=1">«</a></li>
<li class="disabled"><span>»</span></li>
</ul>
分页参数
参数 描述
list_rows 每页数量
page 当前页
path url路径
query url额外参数
fragment url锚点
var_page 分页变量
type 分页类名
设置
第一种是在配置文件
{
//分页配置
'paginate' => [
'type' => 'bootstrap',
'var_page' => 'page',
],
type属性支持命名空间,例如:
//分页配置
'paginate' => [
'type' => '\org\page\bootstrap',
'var_page' => 'page',
],
}
第二种调用分页方法的时候传入
{
$list = Db::name('user')->where('status',1)->paginate(10,true,[
'type' => 'bootstrap',
'var_page' => 'page',
]);
}
// 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000
$list = User::where('status',1)->paginate(10,1000);
分页用Ajax无刷新实现快速入门
分页快速入门
留言板展示页
无刷新ajax分页快速入门
菜鸟
https://www.runoob.com/ajax/ajax-tutorial.html
和https://www.runoob.com/jquery/ajax-ajax.html
w3cschool
https://www.w3school.com.cn/ajax/index.asp
innerHTML清空替换
bbs.php
{
< ? php
namespace app\index\controller;
use think\Db;
class Bbs extends \think\Controller
{
public function show()
{
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
$db=db('data');
//查询状态为1的用户数据 并且每页显示10条数据 可以paginate(10) paginate(10,88) 上下paginate(10,true)
$show=$db->where('id','>=','1')->paginate(10,88,['type'=>'bootstrap','var_page'=>'show']);//type默认 var_page$show有关本页
//dump($show);
//把分页数据赋值给模板变量list
$this->assign('show',$show);
//渲染模板输出
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
//http://127.0.0.1/thinkphp/public/index/bbs/show?page=4
//http://127.0.0.1/thinkphp/public/index/bbs/show/page/8
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
//$db=db('data');
//$show=$db->where('id','<','88')->select();
//dump($show);
//$this->assign('show',$show);
//return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
}
public function ajax()
{
//http://127.0.0.1/thinkphp/public/index/bbs/ajax 自动找\application\index\view\bbs/ajax.html
//猜可能是aiax函数名 对应的模板 fetch() 默认找对应
return $this->fetch();
}
}
}
ajax.html
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>BBS-Ajax</title>
</head>
<style>
</style>
<script>
function showHint(str)
{
var xmlhttp;
if(str.length==0)
{
document.getElementById('txtHint').innerHTML="";
return;
}
if(window.XMLHttpRequest)
{
//IE7+,Firefox,Chrome,Opera,Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
//ie6,ie5 浏览器执行代码
xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById('txtHint').innerHTML=xmlhttp.responseText;
}
}
//http://localhost/本地测试可以,但是在真服务器要掉 麻烦去掉
xmlhttp.open("GET","/thinkphp/public/index/bbs/show?page="+str,true);
xmlhttp.send();
}
</script>
<body>
<h1>留言板</h1>
留言如下:
<p><span id="txtHint"></span></p>
<h3>在输入框中输入页码:</h3>
<form action="">
跳转到:<input type="text" id="txt1" onkeyup="showHint(this.value)"/>
</form>
</body>
</html>
}
分页用Bootstrap美化界面入门
分页快速入门
留言板展示页
无刷新ajax分页快速入门
结合Bootstrap美化分页
bootstrap和tp 类对齐 规范 好记 统一等 谁先
cdn 本地引入
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
列表用Bootstrap美化内容入门
先窄手机 宽pc
分页快速入门
留言板展示页
无刷新ajax分页快速入门
结合Bootstrap美化分页,美化列表版面
{
<!DOCTYPE html>
<html>
<head>
<title>BBS</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<style>
/* .pagination{border:solid #ccc 1px;}
.pagination li{
display:inline-block;
list-style:none;
padding:10px;
border:solid #f50 1px;
border-radius:20px;
box-shadow:10px 10px 20px;
}
ul li{
list-style:none;
} */
</style>
<body>
<div class="container">
<h1>留言展示-Tp5简易留言板</h1>
<p>留言如下:</p>
<div class="row">
<div class="col-md-8 col-sm-4">
<table class="table table-bordered table-hover">
<thead>
<tr class="danger"><th>ID</th><th>内容</th><th>姓名</th></tr>
</thead>
<tbody>
{volist name="show" id="val" empty="empty"}
<tr class="success"><th>{$i}</th><td>{$val.id}</td><td>{$val.data}</td></tr>
{/volist}
</tbody>
</table>
{$show->render()}
<!-- {foreach $show as $key=>$val}
{$key}=>{$val.id,$val.data}<br>
{/foreach} -->
<!-- <hr> -->
</div>
</div>
</div>
</body>
</html>
}
Bbs简单发布功能的实现,发布之表单的制作
<a href="/thinkphp/public/index/bbs/add">发布留言</a>
public function add(){
//$request=Request::instance();
//echo '请求方法:'.$request->method().'<br/>';
//echo '请求参数:';
//dump($request->param());
//echo Request::instance()->param('name');
//echo "-------";
//echo input('param.name');
return $this->fetch();
}
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BBS留言板</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>p5简易留言板</h1>
<p>发布留言:</p>
<form action="" method="post">
<div class="form-group">
<label class="sr-only container-label">留言标题</label>
<input type="text" class="form-control" autofocus id="title" name="title" value="" placeholder="请输入留言标题"/>
</div>
<div class="form-group">
<label class="sr-only container-label">留言内容</label>
<textarea class="form-control" row="3" id="content" name="content" value="" placeholder="请输入留言内容"></textarea>
</div>
<button type="submit" class="btn btn-primary">发布留言</button>
</form>
</div>
</body>
</html>
}
BBs发布快速入门 表单数据的接受
发布文章
表单设计->对接程序->对接数据库->前台显示
Request::instance()->param('name');
好!
input('param.name');
{
< ?php
namespace app\index\controller;
use think\Db;
use think\Request;
class Bbs extends \think\Controller
{
public function show()
{
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
$db=db('data');
//查询状态为1的用户数据 并且每页显示10条数据 可以paginate(10) paginate(10,88) 上下paginate(10,true)
$show=$db->where('id','>=','1')->paginate(10,88,['type'=>'bootstrap','var_page'=>'show']);//type默认 var_page$show有关本页
//dump($show);
//把分页数据赋值给模板变量list
$this->assign('show',$show);
//渲染模板输出
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
//http://127.0.0.1/thinkphp/public/index/bbs/show?page=4
//http://127.0.0.1/thinkphp/public/index/bbs/show/page/8
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
//$db=db('data');
//$show=$db->where('id','<','88')->select();
//dump($show);
//$this->assign('show',$show);
//return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
}
public function add(){
$request=Request::instance();
echo '请求方法:'.$request->method().'<br/>';
echo '请求参数:';
dump($request->param());
echo Request::instance()->param('title');
echo "-------";
echo input('param.content');
return $this->fetch();
}
public function ajax()
{
//http://127.0.0.1/thinkphp/public/index/bbs/ajax 自动找\application\index\view\bbs/ajax.html
//猜可能是aiax函数名 对应的模板 fetch() 默认找对应
return $this->fetch();
}
}
}
BBS发布快速入门 把表单数据存入到数据库
tp5支持utf8 不支持ansi编码
{
< ?php
namespace app\index\controller;
use think\Db;
use think\Request;
class Bbs extends \think\Controller
{
public function show()
{
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
$db=db('data');
//查询状态为1的用户数据 并且每页显示10条数据 可以paginate(10) paginate(10,88) 上下paginate(10,true)
$show=$db->where('id','>=','1')->paginate(10,88,['type'=>'bootstrap','var_page'=>'show']);//type默认 var_page$show有关本页
//dump($show);
//把分页数据赋值给模板变量list
$this->assign('show',$show);
//渲染模板输出
return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
//http://127.0.0.1/thinkphp/public/index/bbs/show?page=4
//http://127.0.0.1/thinkphp/public/index/bbs/show/page/8
//http://127.0.0.1/thinkphp/public/index/bbs/show
//index模块/bbs控制器/show操作
//$db=db('data');
//$show=$db->where('id','<','88')->select();
//dump($show);
//$this->assign('show',$show);
//return $this->fetch('bbs');//自动bbs/bbs.html =fetch('bbs/bss');
}
public function add(){
// $request=Request::instance();
// echo '请求方法:'.$request->method().'<br/>';
// echo '请求参数:';
// // dump($request->param());
// echo Request::instance()->param('title');
// echo "-------";
// echo input('param.content');
$title=input('param.title');
$content=input('param.content');
// $title!='' $title<>''
if ($title!='') {
//插入记录-去掉表前缀
$result=Db::name('data')
->insert(['title'=>$title,'data'=>$content,'time'=>time()]);
// dump($result);
//return "恭喜那留言成功!";//只显示
// return $this->error('恭喜你留言成功'); //返回继续添加
return $this->success('恭喜那留言成功!','bbs/show');//并跳转到表页
}
return $this->fetch();
}
public function ajax()
{
//http://127.0.0.1/thinkphp/public/index/bbs/ajax 自动找\application\index\view\bbs/ajax.html
//猜可能是aiax函数名 对应的模板 fetch() 默认找对应
return $this->fetch();
}
}
}
BBS展示页字段处理完善
不美观,太长
前端属性截取长度 input maxlength='10' 类似百度贴吧
tp5的模板 使用函数 截取
其他是yMd hms
时间格式{$time|date='y-m-d h:i:s',###} ###表示变量站位 date(格式,变量) 用#
时间格式 字符截取乱码 mb_substr=0,3,'utf-8'
substr=0,3中文会乱码
问题tp5官方搜索
留言顺序
新发才前面
查询时加入 order('id','desc')
添加时判断下 是否输入sql php语句
不安全 等等
非法语句 操作数据库...
攻击等
与我联系
qq:250285636
手机/微信号:18210787405
QQ交流群:189250799
百度网盘下载地址:
http://pan.baidu.com/s/1c1SkwHM
网址:www.rinuo.com
微信公号:郭孟涛
{$data.name|md5}
{$name|md5|strtoupper|substr=0,3}函数会按照从左到右的顺序依次调用。
{:substr(strtoupper(md5($name)),0,3)}
<tbody>
{volist name="show" id="val" empty="empty"}
<tr class="success"><th>{$i}</th><td>{$val.id}</td><td>{$val.title|mb_substr=0,10,'utf-8'}</td><td>{$val.data|mb_substr=0,20,'utf-8'}</td><td>{$val.time|date='y-m-d h:i',###}</td></tr>
{volist}
</tbody>
$show=$db->where('id','>=','1')->order('id','desc')->paginate(10,88,['type'=>'bootstrap','var_page'=>'show']);//type默认 var_page$show有关本页
BBS详细页的快速实现入门
{
public function view(){
echo input('param.id');
$id=input('id');
if($id<>''){
//查询数据-查询留言详细内容
$list=Db::name('data')->where('id','=',$id)->select();
dump($list);
//上个查询数据-去掉表前缀
$up=Db::name('data')->where('id','>',$id)->order('id','desc')->limit(1)->value('id');
dump($up);
//下个
$next=Db::name('data')->where('id','<',$id)->order('id','desc')->limit(1)->value('id');
//dump($next==0);
dump($next);
$this->assign('up',$up);
$this->assign('next',$next);
$this->assign('list',$list);
//渲染模板输出
return $this->fetch();
}
return "留言不存在";
}
}
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>详细内容</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2><a href="/thinkphp/public/index/bbs/show/">TP5简易留言板</a></h2>
<p>留言标题:</p>
{$list.0.title}
<p>留言内容:</p>
{$list.0.data}
<p>留言时间: {$list.0.time|date="y-m-d h:i:s",###}</p>
<p>
<a href="/thinkphp/public/index/bbs/view/id/{$list.0.id+1}">上一页</a>
<a href="/thinkphp/public/index/bbs/view/id/{$list.0.id-1}">下一页</a>
</p>
<p>+-id-0+ 数组下标越界 $id<>''不在</p>
<p>
<a href="/thinkphp/public/index/bbs/view/id/{$up}">上一页</a>
<a href="/thinkphp/public/index/bbs/view/id/{$next}">下一页</a>
</p>
</div>
</body>
</html>
}
<td><a href="/thinkphp/public/index/bbs/view/id/{$val.id}">{$val.id}</a></td
上一页和下一页的快速实现入门
数据库 删除 可能不按顺序
模板+- 在传时 判断下删除 下一个 一直没返空
condition
条件
详细页快速入门
实现思路
上一页和下一页实现分析
tp5手册
杂项目
分页
验证码
模板支持判断计算
模板
使用运算符
内置-条件判断
数据库
limit
下用到大
上用最小
//上个查询数据-去掉表前缀
echo $id;
$up=Db::name('data')->where('id','>',$id)->order('id','')->limit(1)->value('id');
dump($up);
value('id');只获得id
if
删除 不点
不连接
{if condition="$up neq ''"}
<a href="/thinkphp/public/index/bbs/view/id/{$up}">上一页</a>
{else /}
上一页没有了
{ /if}
{if condition="$next neq ''" }
<a href="/thinkphp/public/index/bbs/view/id/{$next}">下一页</a>
{ else /}
下一页没有了
{ / if}
}
}
BBS详细页界面与前端Bootstrap对接
前端不要能简单 前端好上手
详情页快速入门
实现思路,核心代码编写
上一页 和 下一页 实现分析
程序结合前端Bootstrap完善界面
href="/thinkphp/public/index/bbs/view/id/{$val.id}
href="../view/id/{$val.id}"
href="/thinkphp/public/index/bbs/show/"
href="{$Think.server.script_name}/index/bbs/show/"
<a href="/thinkphp/public/index/bbs/view/id/{$up}">
a href="{$up}"
tp5
模板
内置标签 资源文件加载
差数据库 一共多少条
paginate(10,88) 传到88
$result=mysql_query("select count(*) as max from 表名");
$result=mysql_query("select * from 表名");
$num_rows = mysql_num_rows($result);
{
$db=db('data');
//查询状态为1的用户数据 并且每页显示10条数据 可以paginate(10) paginate(10,88) 上下paginate(10,true)
$result=Db::query('select count(*) as max from think_data');
$count=$result[0]['max'];
$show=$db->where('id','>=','1')->order('id','desc')->paginate(10,$count,['type'=>'bootstrap','var_page'=>'show']);//type默认
}
[
[
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>详细内容</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2><a href="{$Think.server.script_name}/index/bbs/show/">TP5简易留言板</a></h2>
[
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="pannel-title">{$list.0.title}</h3>
</div>
<div class="panel-body">
{$list.0.data|default="默认内容"|}
</div>
<ul class="list-group">
<li class="list-group-item">
{$list.0.time|date="y-m-d h:i:s",###}
</li>
</ul>
</div>
<!-- <div class="panel panel-info">
<div class="panel-body">
<p class="text-center"><strong>{$list.0.title}</strong></p>
<p class="text-center">{$list.0.time|date="y-m-d h:i:s",###}</p>
{$list.0.data|default="默认内容"|}
</div>
</div> -->
[
<nav class="nav">
<ul class="pager">
{if condition="$up neq ''"}
<li class="previous">
<a href="{$up}">
<span>←</span>上一页
</a>
</li>
{else/}
<li class="previous disabled">
<span>←上一页</span>
</li>
{ / if}}]
{if condition="$next neq ''"}
<li class="next">
<a href="{$next}">
下一页<span>→</span>
</a>
</li>
{else/}
<li class="next disabled">
<span>下一页<span>→</span></span>
</li>
{/if}
</ul>
</nav>
<!-- <hr>
<p>
<a href="/thinkphp/public/index/bbs/view/id/{$list.0.id+1}">上一页</a>
<a href="/thinkphp/public/index/bbs/view/id/{$list.0.id-1}">下一页</a>
</p>
<p>+-id-0+ 数组下标越界 $id<>''不在</p>
<p>
<a href="/thinkphp/public/index/bbs/view/id/{$up}">上一页</a>
<a href="/thinkphp/public/index/bbs/view/id/{$next}">下一页</a>
</p>
{if condition="$up neq ''"}
<a href="/thinkphp/public/index/bbs/view/id/{$up}">上一页</a>
{else/}
上一页没有了
{/if}
{if condition="$next neq ''"}
<a href="/thinkphp/public/index/bbs/view/id/{$next}">下一页</a>
{else/}
下一页没有了
{/if} -->
</div>
</body>
</html>
}]}
]
]
]
]
]
模型快速上手,查出一个笑脸
使用模型 开发的助理
初步认识模型-作用
MVC != 模块/控制器/操作
模型使用格式
4种使用方法
api/
controller
model tp格式这样目录
view
{
< ?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Data;
class Model extends Controller {
public function index(){
//http://127.0.0.1/thinkphp/public/index/model/index
//使用模型的方法 助手model('Data') model(Data.php)
//Data::get(1) 静态方法 但要use
$res=model('Data');
$res=$res::get(1);
$res=$res->toArray();
dump($res);
$result=Data::get(1);
return $result;//直接application/html config json 改了dump也变
}
}
}
< ?php
namespace app\index\model;
use think\Model;
class Data extends model{
找 %data% 表 sql tableName
}
模型查询的四种方法
助手 model(模型php)
Loader Loader::model()
new Data()
Data::get()
{
< ?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Data;//引入
use think\Loader;
class Model extends Controller {
public function index(){
//http://127.0.0.1/thinkphp/public/index/model/index
//1.使用模型的方法 助手model('Data') model(Data.php)
//Data::get(1) 静态方法 但要use
//使用助手函数的写法
$res=model('Data');
$res=$res::get(1);
//不toArray() 返回是一个对象 多
$res=$res->toArray();//读取出对象其中的数组的值
dump($res);
//3.new实例化 要use use app\index\model\Data; new的写法
$result=new Data();
$result=$result::get(2);
return $result;
//4. 可以加载多个model use think\Loader 可以加多个模型的写法
$load=Loader::model('data');
$load=$load::get(3);
return JSON($load);
//2.静态方法 推荐 要use use app\index\model\Data; 静态调用的写法
$result=Data::get(1);
return $result;//直接application/html config json 改了dump也变
}
}
}
项目发布上线快速入门 准备工作
域名解析管理 腾讯云
云主机
域名注册
国外 不用备案 最少香港
服务器 功能多 远程访问
虚拟主机
域名备案 香港 国外主机免备案
实现通过域名或ip访问tp5笑脸和BBS页
项目发布上线快速入门 成功上线
数据库 导出 导入 版本 字符集 改名 密码...
win 自带远程 copy
第三方API接口调用快速入门 二维码接口实现
<div class="panel panel-default">
<div class="panel-heading">扫码访问当前留言</div>
<div class="panel-body">
<img src="http://www.kuaizhan.com/common/encode-png?large=true&data={$Request.root.true}/{$Request.path}">
<!-- 不行网搜免费<img src="http://pan.baidu.com/share/qrcode?w=150&h=150&url={$Request.root.true}/{$Request.path}"/> -->
</div>
</div>
{$Request.root.true}/{$Request.path}
主机 / 路径
免费生成二维码的api接口
{
1.百度网盘(可使用https)
http://pan.baidu.com/share/qrcode?w=150&h=150&url=内容
2.iClick接口 (无https)
http://bshare.optimix.asia/barCode?site=weixin&url=内容
3.JiaThis 接口(无https)
http://s.jiathis.com/qrcode.php?url=内容
4.联图网(无https)
http://qr.liantu.com/api.php?text=内容
5.K780数据网(支持https和http)
http://api.k780.com:88/?app=qr.get&data=内容&level=L&size=6
https://sapi.k780.com/?app=qr.get&data=内容&level=L&size=6
6.QR Code Generator(https接口)
https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=内容
}
说明:把url=后面的网址改成你的,四种任选一。
http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://lanyes.org
http://b.bshare.cn/barCode?site=weixin&url=http://lanyes.org
http://s.jiathis.com/qrcode.php?url=http://lanyes.org
http://www.kuaizhan.com/common/encode-png?large=true&data=http://lanyes.org
说明:下面是EMLOG程序专用的,把代码复制到EMLOG模板echo_log.php你需要的位置即可。
http://b.bshare.cn/barCode?site=weixin&url=<?php echo Url::log($logid);?>
http://s.jiathis.com/qrcode.php?url=<?php echo Url::log($logid);?>
第三方api接口调用快速入门 域名查询接口实现
思路
二维码接口
域名查询接口实现
file_get_contents get请求
微博登录实现curl
域名查询
http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=www.baidu.com
simplexml_load_string()
函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象。
json_encode 对变量进行 JSON 编码
json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
{
<?php
namespace app\index\controller;
class Api extends \think\Controller{
public function domain(){
//http://127.0.0.1/thinkphp/public/index/api/domain
$domain=input('param.domain');
// echo $domain;
//$domain=='' arr-isEmpty()
if (!$domain) {
$domain='baidu.com';
}
$cha='http://panda.www.net.cn/cgi-bin/check.cgi?area_domain='.$domain;
$fp=file_get_contents($cha,'rb');//get请求
// dump($fp);
// exit();//退出
$xml=simplexml_load_string($fp);//函数转换形式良好的 XML 字符串
// dump($xml);//object(SimpleXMLElement)
$data=json_decode(json_encode($xml),TRUE); //to array
//json_encode 对变量进行 JSON 编码
// json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
// dump($data);
//模板变量赋值
$this->assign('data',$data);
//渲染模板输出
return $this->fetch();
}
}
}
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>DoMain</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2><a href="{$Think.server.script_name}/index/bbs/show">TP5简易留言板</a></h2>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="pannel-title">域名:{$data.key}</h3>
</div>
<div class="panel-body">
<label>注册状态:</label>
<p>{$data.original}</p>
</div>
<div class="panel-footer">
<p>210可以注册,211已经注册</p>
</div>
</div>
<form class="form-inline pull-right" method="post" action="{$Think.server.script_name}/index/api/domain">
<input type="text" class="form-control" name="domain" placeholder="输入域名">
<input type="submit" class="btn btn-info" value="提交">
</form>
</div>
<footer class="bs-docs-footer" style="
padding-top: 50px;
padding-bottom:50px;
margin-top: 100px;
margin-bottom: 0px;
color: #99979c;
text-align: center;
background:#2a2730;
">
<div class="container">
<p>版权所有</p>
</div>
</footer>
</body>
</html>
}
第三方api接口调用快速入门 微博登录接口入门开发实战 准备工作
注册
//http://open.weibo.com/wiki/Connect/login
//http://open.weibo.com/wiki/2/users/show
看不用配行不 本地
免费域名f 腾讯dns 自己搭服务器
https://api.weibo.com/oauth2/access_token?client_id=2771291031&client_secret=8cebc2d870dee1a84e3d5192833a9d57&grant_type=authorization_code&redirect_uri=&code=
file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
https://blog.csdn.net/weixin_33769125/article/details/91634108
file_get_contents failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request
原因1:url参数值没有url编码
用 urlencode($val) 来编码参数的值,注意是参数值
http://www.baidu.com/link?url=AGem0WKbRquT-AAjchrM1BsC6dx1ZYb7IgYKmw_DaPA_f73zHwr-y5taU_O4MX076QRIaiuiyQIrYt_l1h_v97c81dIzZxhKzRGfYnfGM4q&wd=&eqid=dd9decc9000718e0000000065dceb54c
invalid_grant 21325 提供的Access Grant是无效的、过期的或已撤销的
invalid authorization
无效授权
他要求必须是post方式才行的
http://open.weibo.com/wiki/OAuth2/access_token
https://blog.csdn.net/the_victory/article/details/50578660
https://blog.csdn.net/tflasd1157/article/details/79074572
{
C:\phpStudy\WWW\thinkphp\thinkphp\library\think\Debug.php:193:string 'd02a8982d48cf0e4b647bd09da995e89' (length=32)
C:\phpStudy\WWW\thinkphp\thinkphp\library\think\Debug.php:193:
array (size=5)
'access_token' => string '2.00aD3DnC85DYBD3d1b82975d03cg6L' (length=32)
'remind_in' => string '157679999' (length=9)
'expires_in' => int 157679999
'uid' => string '2557105902' (length=10)
'isRealName' => string 'true' (length=4)
}
code一次
{
"access_token": "2.00aD3DnC85DYBD3d1b82975d03cg6L",
"remind_in": "157679999",
"expires_in": 157679999,
"uid": "2557105902",
"isRealName": "true"
}
https://www.jianshu.com/p/9fe14afd7b50
{
1.先创建微连接或轻应用(获取到App Key 和 App Secret)
App Key:4200929625
App Secret:08607ff2e036d2718b64bcba6bdbf78c
2.根据https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
client_id :App Key
redirect_uri : 在高级信息中设置授权回调页
3.会生成code eg: code=8a36c00dcff81f70cb4f340f3e8d273b
4.根据生成的code 换取token
https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE
post请求
eg : {
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxx",
"remind_in": "157679999",
"expires_in": 157679999,
"uid": "6613798869",
"isRealName": "true"
}
5.根据token 就可以去微博API获取自己想要的数据
}
{
access_token:这个才是真正的ACCESS_TOKEN,
remind_in:157679999,
expires_in:157679999,
uid:授权了的那个用户的uid
}
https://www.2cto.com/kf/201408/323430.html
6、使用获得的Access Token和uid调用API
获取用户信息API:
"https://api.weibo.com/2/users/show.json?uid={0}&access_token={1}";
"https://api.weibo.com/2/users/show.json?uid=2557105902&access_token=2.00aD3DnC85DYBD3d1b82975d03cg6L";
https://blog.csdn.net/sdksdk0/article/details/51939853
重要思路
https://www.cnblogs.com/lamp01/p/7423798.html
file_get_contents
file_post_contents
api.php
{
<?php
namespace app\index\controller;
class Api extends \think\Controller{
public function weibobak(){
header("Content-Type:text/html;charset=utf-8");
$code=input('code');
echo $code;
$tom="https://api.weibo.com/oauth2/access_token?client_id=2771291031&client_secret=8cebc2d870dee1a84e3d5192833a9d57&grant_type=authorization_code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo&code=".$code;
//post获得开始,获取重要的唯一id
$url=$tom;
//echo $url.'<br>';
}
public function weibo(){
//http://open.weibo.com/wiki/Connect/login
//http://open.weibo.com/wiki/2/users/show
$co=input('param.code');
dump($co);
$client_id='2771291031';
$client_secret='8cebc2d870dee1a84e3d5192833a9d57';
$redirect_uri="http://127.0.0.1/thinkphp/public/index.php/index/api/weibo";
$code=$co;//d65d39b76dde4bd1228dafb5d07bdc8f
// https://api.weibo.com/oauth2/authorize?client_id=2771291031&response_type=code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo
// $demo="https://api.weibo.com/oauth2/authorize?client_id=%s&response_type=code&redirect_uri=%s";
// $urld=sprintf($demo,$client_id,$redirect_uri);
// $result=curl_get($urld);// bebug
// $fp=json_decode($result,true);
// dump($fp);
// exit();//退出
//https://api.weibo.com/oauth2/access_token?client_id=2771291031&client_secret=8cebc2d870dee1a84e3d5192833a9d57&grant_type=authorization_code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo&code=d65d39b76dde4bd1228dafb5d07bdc8f
$api="https://api.weibo.com/oauth2/access_token?client_id=%s&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s";
$url=sprintf($api,$client_id,$client_secret,$redirect_uri,$code);
$result=curl_post($url);// bebug
$fp=json_decode($result,true);
// $fp=file_get_contents($url,'rb');//get请求 不行
dump($fp);
echo $fp['access_token'].'<br>';
echo $fp['uid'];
$access_token=$fp['access_token'];
$uid=$fp['uid'];
// 用户信息
// https://api.weibo.com/2/users/show.json?uid=2557105902&access_token=2.00aD3DnC85DYBD3d1b82975d03cg6L
$userUrl="https://api.weibo.com/2/users/show.json?uid=%s&access_token=%s";
$userRequest=sprintf($userUrl,$uid,$access_token);
$dataResult=curl_get($userRequest);
$data=json_decode($dataResult,true);
dump($data);
$this->assign('data',$data);
//exit();//退出
return $this->fetch();
}
public function domain(){
//http://127.0.0.1/thinkphp/public/index/api/domain
$domain=input('param.domain');
// echo $domain;
//$domain=='' arr-isEmpty()
if (!$domain) {
$domain='baidu.com';
}
$cha='http://panda.www.net.cn/cgi-bin/check.cgi?area_domain='.$domain;
$fp=file_get_contents($cha,'rb');//get请求
// dump($fp);
// exit();//退出
$xml=simplexml_load_string($fp);//函数转换形式良好的 XML 字符串
// dump($xml);//object(SimpleXMLElement)
$data=json_decode(json_encode($xml),TRUE); //to array
//json_encode 对变量进行 JSON 编码
// json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
// dump($data);
//模板变量赋值
$this->assign('data',$data);
//渲染模板输出
return $this->fetch();
}
}
}
common.php
{
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用公共文件
/**
* @param string $url get请求地址
* @param int $httpCode 返回状态码
* @return mixed
* 封装的http 请求
*/
function curl_get($url, &$httpCode = 0)
{
$ch = curl_init();//init
curl_setopt($ch, CURLOPT_URL, $url);//url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//1 true 返回结果 0-truefalse
// curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); http版本
//不做证书校验,部署在linux环境下请改为true
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); ssl host
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);//超时10=10s
$file_contents = curl_exec($ch);//执行
// $val=curl_error($ch); 调试 url 空格 只能双引号
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);//函数获取CURL请求输出的相关信息
curl_close($ch);//关闭释放资源
return $file_contents;
}
/**
* @param string $url post请求地址
* @param array $params
* @return mixed
*/
function curl_post($url, array $params = array())
{
$data_string = json_encode($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt(
$ch, CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json'
)
);
$data = curl_exec($ch);
curl_close($ch);
return ($data);
}
}
weibo.html
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>微博</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2><a href="{$Think.server.script_name}/index/bbs/show">TP5简易留言板</a></h2>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="pannel-title">用户:{$data.name}</h3>
</div>
<div class="panel-body">
<img src="{$data.profile_image_url}" alt="">
<p>id:{$data.id}</p>
<p>name:{$data.name}</p>
<p>出生地:{$data.location}</p>
</div>
<div class="panel-footer">
<p>性别:{$data.gender}</p>
<p>性别,m:男、f:女、n:未知</p>
<p>用户头像:
<img src="{$data.avatar_large}" alt="">
<img src="{$data.avatar_hd}" alt="">
</p>
<p>在线:{$data.online_status}->用户的在线状态,0:不在线、1:在线</p>
</div>
</div>
</div>
<footer class="bs-docs-footer" style="
padding-top: 50px;
padding-bottom:50px;
margin-top: 100px;
margin-bottom: 0px;
color: #99979c;
text-align: center;
background:#2a2730;
">
<div class="container">
<p>版权所有</p>
</div>
</footer>
</body>
</html>
}
bbs.html
{
<p><a href="https://api.weibo.com/oauth2/authorize?client_id=2771291031&response_type=code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo">微博登录</a></p>
}
微博登录接口入门开发上手 4-1获取code值
微博登录接口快速上手
发起请求 告诉微博那个网站的用户来登录
接收返回数据
请求用户信息
存在入数据库
file_get_contents 跨域
微博 curl post
$error=request()->param('error');
dump($error);//in_array()
if ($error) {
echo "error:用户取消或失败";
exit();
}
微博登录接口入门开发上手 4-2获取唯一钥匙
input('param.code');
微博登录接口入门开发上手 4-3获得信息
https://api.weibo.com/2/users/show.json?uid=%s&access_token=%s
微博登录接口入门开发上手 4-4写入模板
登录退出 清空 过
存入数据库
微博登录接口入门开发上手 4-0总体流程介绍
API接口开发快速入门 file_get_contents
header() 跨域
其他api 微信qq 等。..github google fb tw
登录推出
php官网
请求URL 普通网站 限制 源码 不继续 验证码攻击
接口 选择 过滤 简单 用
api跨域快速入门
作用:实现采集,登录别人的网站
curl->client url library 客户端url库
file_get_contents文件获取
{
public function demo(){
//http://127.0.0.1/thinkphp/public/index/api/demo
dump("演示一下,api跨域访问");
// $url="http://127.0.0.1/thinkphp/public/index/api/domain";
// $url=file_get_contents($url);
// echo $url;
// dump($url);//看源码
// exit();
$data=array(
"title"=>"用机器人来发帖了,我来采集你的内容了",
"content"=>"加个验证码吧,不然被攻击了"
);
//1.初始化
$ch=curl_init();
//2.设置选项,包括URL
//指定请求的URL:
curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com");
// curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
//返回字符串
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//3.执行并获取html文档内容
$output=curl_exec($ch);
//4.释放curl句柄
curl_close($ch);
echo $output;
}
}
API接口开发快速入门 Curl
curl
官网php.net 查看多参数
curl 进行里面操作 搜索点击 等 可以 不断继续
file_get_contents 不可以
实现采集,登录别人网站
curl client url library客户端url库
file_get_contents文件获取
curl_init
curl_setopt
curl_exec
curl_close
模型工作安排 原理入门讲解
user 控制 美工
助手-数据库
查 增 改 删
增删改查
<?php
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;
class Data extends model{
use SoftDelete;
protected $deleteTime='delete_time';
// protected $autoWriteTiemstamp=true;
// protected $auto=[];
// protected $insert=['name'=>'游客','age'=>17];
// protected $update=['name'];
// public function setNameAttr($value){
// return request()->ip();
// return '30';
// }
// public function setAgeAttr($value){
// return '30';
// }
// public function setTitleAttr($value){
// //return request()->ip();
// return strtolower($value);
// }
// public function setContentAttr($value){
// return $value;
// }
}
模型查询数据方法演示
tp5 文档 模型 过 ->
读取器get表断Attr
修改器set表断Attr
控制器
model.php
{
<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Data;//引入
use think\Loader;
class Model extends Controller {
public function find(){
//http://127.0.0.1/thinkphp/public/index/model/find
//使用主键查询
$data=Data::get(1);
// dump($data);
echo $data->id;
// return $data;
// //使用数组查询
// $data=Data::get(['id'=>'1']);
// //使用闭包查询
// $data=Data::get(function($query){
// $query->where('id','>','2')->order('id','desc');
// });
// //使用实例化查询
// $data=new Data();
// //查询单个数据
// $data=$data->where('id','<>','8')->find();
// // echo $data->title;
// $data=$data->toArray();
// dump($data)
// //根据主键获取多个数据
// // $data=Data::all('1,2,3');
// //或使用数组
// $data=Data::all([2,3]);
// foreach ($data as $key => $user) {
// echo $user->title."<br>";
// }
// //使用数组查询
// $data=Data::all(['id'=>2]);
// //使用闭包查询
// $data=Data::all(function($query){
// $query->where('id','>',2)->limit(30)->order('id','asc');
// });
// foreach ($data as $key => $user) {
// echo $user->id."<br>";
// }
// //使用实例化查询
// $data=new Data();
// //查询数据集
// $data=$data->where('id','>',2)
// ->limit(10)
// ->order('id','desc')
// ->select();
// foreach ($data as $key => $user) {
// echo $user->id.$user->title."<br>";
// }
// //dump($data);
// //使用数据库的查询 最方便
// $data=data:where('id',">",2)->select();
// foreach ($data as $key => $user) {
// echo $user->id."<br>";
// }
// //dump($data);
}
public function index(){
//http://127.0.0.1/thinkphp/public/index/model/index
//1.使用模型的方法 助手model('Data') model(Data.php)
//Data::get(1) 静态方法 但要use
//使用助手函数的写法
$res=model('Data');
$res=$res::get(1);
//不toArray() 返回是一个对象 多
$res=$res->toArray();//读取出对象其中的数组的值
dump($res);
//3.new实例化 要use use app\index\model\Data; new的写法
$result=new Data();
$result=$result::get(2);
return $result;
//4. 可以加载多个model use think\Loader 可以加多个模型的写法
$load=Loader::model('data');
$load=$load::get(3);
return JSON($load);
//2.静态方法 推荐 要use use app\index\model\Data; 静态调用的写法
$result=Data::get(1);
return $result;//直接application/html config json 改了dump也变
}
}
}
模型增加数据方法演示
tp 模型 新增
手册不能当教程 手册过查 教程各补
模型
实例化
$user=new Data() $user=new Data(['id'=>''])
$user->id=*;$user->data(['id'=>''])
$user->save(); saveAll($arr)
静态方法 create() 不用save()
$user=Data::create(['id'=>''])
组手函数
$user=model('Data');
$user->id=*;$user->data(['id'=>''])
$user->save(); saveAll($arr)
$arr=[['id'=>''],['id'=>'']] 二维数组
代码
{
public function save(){
// http://127.0.0.1/thinkphp/public/index/model/save
//http://127.0.0.1/thinkphp/public/index/bbs/show 检查
//添加一条数据
//第一种是实例化模型对象后赋值并保存
$tom=new Data;//use app\index\model\Data;//引入
$tom->title='new Data()';
$tom->data='use模型';
$tom->save();
//data方法批量赋值
// $tom=new Data;//use app\index\model\Data;//引入
// $tom->data([
// 'title'=>'data()方法',
// 'data'=>'模型下的批量data'
// ]);
// $tom->save();
//直接在实例化的时候传入数据
// $user=new Data([
// 'title'=>'new Data([])',
// 'data'=>'实例化的时候传入数据'
// ]);//use data模型
// $user->save();
// //获取自增ID
// echo $user->id;
//静态方法 create 返回query对象
// $user=Data::create([
// 'title'=>'新增模型静态方法',
// 'data'=>'Data::create'
// ]);
// echo $user->id;
//使用model助手函数实例化user模型
// $user=model('Data');
// //模型对象赋值
// $user->data([
// 'title'=>'model助手函数',
// 'data'=>'model(模型)->data([])'
// ]);
// $user->save();
//model助手函数 批量新增
// $user=model('Data');
// $list=[
// ['title'=>'model()','data'=>'批量'],
// ['title'=>'新增','data'=>'save|saveAll']
// ];
// $user->saveAll($list);
// echo $user->id;//获取自增ID
}
}
模型更新数据方法演示
$user=new Data();$user=Data::get(23);
$user->字段=*;
$user->save(); $user->save([改的内容],[条件]|callback($query));
SaveAll()
$user->isUpdate(true)->saveAll()
isUpdate(true) 更新
isUpdate(false) 新增
如果你调用save方法进行多次数据写入的时候,
需要注意,第二次save方法的时候必须使用isUpdate(false),否则会视为更新数据。
Data::where('id','=','2')->update(['title'=>'kk']);
Data::update(['id'=>23,'title'=>'update'])
{
public function update(){
// http://127.0.0.1/thinkphp/public/index/model/update
//http://127.0.0.1/thinkphp/public/index/bbs/show 检查
//在取出数据后,更改字段内容后更新数据.
// $user=Data::get(23);
// $user->title='get';
// $user->data='Data';
// $user->save();
//直接带更新条件来更新数据
// $user=new Data();
// //save方法第二个参数为更新条件
// $user->save([
// 'title'=>'save',
// 'data'=>"save([title=>x],['id'=>'23'])"
// ],['id'=>23]);
//模型支持静态方法直接更新数据,例如:
// Data::where('id',23)->update(['data'=>'update']);
// //或者使用:
// Data::update(['id'=>23,'title'=>'update']);
//可以通过闭包函数使用更复杂的更新条件,例如:
//save([改的内容],条件|callback($query))
$user=new Data();
$user->save(['title'=>'save([改的内容],条件|callback($query))'],function($query){
//更新status值为1 并且id大于10的数据 下面当前的 俩条件改
$query->where('title','改后来')->where('id','>',10);
});
}
}
模型删除数据方法演示
分开
$user=Data::get(primayID)
$user->delete()
静态方法
Data::destroy(primayID)
Data::destroy('primayID,primayID')
Data::destroy([primayID,primayID])
条件
Data::destroy(['id'=>'x'])
闭包
Data::destroy(function($query){
$query->where('id','>',30);
})
where查询条件
Data::where('id','=',2)->delete();
{
public function delete(){
//http://127.0.0.1/thinkphp/public/index/model/delete
//http://127.0.0.1/thinkphp/public/index/bbs/show 检查
//删除模型数据,可以在实例化后调用delete方法.
// $user=Data::get(26);
// $user->delete();
// dump($user);
//或者直接调用静态方法
// Data::destroy(27);
//支持批量删除
// Data::destroy('29,30');
// 或者
// $tom=Data::destroy([29,30]);
// dump($tom);
// 条件删除
//使用数组进行条件删除,例如:
// $tom=Data::destroy(['title'=>'f']);
//dump($tom); //返回删除数目
//使用闭包删除,例如:
// Data::destroy(function($query){
// $query->where('id','>',30);
// });
// //或者通过数据库类的查询条件删除
// Data::where('title','=','f')->delete();
}
}
模型软删除 配置方法
deleteTime
删除 查找 新增 测试 数据库查找 页面测试bbs
model
Data.php
安全删除
use traits\model\SoftDelete;
use SoftDelete; 方法内使用
默认 deleteTime
protected $deleteTime='delete_time';
设置默认删除字段为什么
protected $autoWriteTiemstamp=true;
设置自动写入当前时间戳
设置 数据库 字段 默认null
alter table think_data add delete_time int default null;
desc think_data;
show create table tableName;
show full columns from tableName;
phpadmian...
工具
cmd
软删除
不真正删除 数据分析 ...
deleteTime字段 标志是删除
测试 bbs还存在 delete删除
数据库 也还在
软删除
use traits\model\SoftDelete;
use SoftDelete; 方法内使用
在实际项目中,
对数据频繁使用删除操作会导致性能问题,
软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。
软删除功能,需要引入SoftDelete trait
use traits\model\SoftDelete;
use SoftDelete;
查询的数据 不包含 软删除数据,
如果需要包含软删除的数据
Model::withTrashed()->find()|select() 都包含
仅软删除的时间
User::onlyTrashed()->find()|select()
模型软删除 使用演示
查询 软删除 数据
// //查询包含软删除的数据
// $data=Data::withTrashed()->where('id','>',25)->select();
// dump($data);
//仅查询软删除了的数据
$data=Data::onlyTrashed()->where('id','>',25)->select();
foreach ($data as $key => $user) {
echo $user->id."<br>";
}
// dump($data);
删除 设置软删除 一样可以真删除
1.$user=Data::get(26);
$user->delete(true);//加true delete_time|id没值 就算了软删除 一样真删除
2.Data::destroy(30,true);一样真删除
数据库类的查询条件删除 直接删除
3.Data::where('title','=','f')->delete();//设置软删除 一样删除where()
模型帮助加时间戳功能
baseconfig.php
可以设置开始 模型设置 自动时间戳
保存的格式 也可以改 %y %M %d %H %i %s
改默认name ....
find 加 更新删除时间字段 int 输出
saveupdate createtime
bbs 保存时候 开启 配置开启|模型类开启
自己 timestamp函数 tp5
时间戳
autoWriteTimestamp方法动态设置时间字段写入
第一种方式,是在数据库配置文件中添加全局设置:
// 开启自动写入时间戳字段
'auto_timestamp' => true,
第二种是直接在单独的模型类里面设置:
protected $autoWriteTimestamp = true;
// 开启自动写入时间戳字段
'auto_timestamp' => 'datetime',时间字段不是int类型这样写
protected $autoWriteTimestamp = 'datetime';
$user->create_time; // 输出类似 2016-10-12 14:20:10
// 关闭自动写入update_time字段
protected $updateTime = false;
// 关闭自动写入时间戳
protected $autoWriteTimestamp = false;
// 关闭全局自动写入时间字段
'auto_timestamp' => false,
用模型 实现分页
给模型 安排俩个工作
软删除
时间戳
模型分页展示
重构原来用DB的分页
DB软删除 都显示
模型类 软删除才生效
protected $createTime="create_time";
模型 数据库 字段 defalut null;
$count=Data::count();//去隔开 去软删除
$show=Data::where('id','>=','1')->order('id','desc')->paginate(8,$count);
//paginate(int,int(多少数据)|bool(简洁),['page(1)'...])1页显示8个
时间戳 显示 自动 格式了
暂时不能 保存 创建时间
数据库 改了
模型的又一个功能
新旧功能 到时
老
tpdoc
模型 获取器
读取器get表断Attr
class User extends Model
{
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
获取器还可以定义数据表中不存在的字段
不存在 设个 假返回 不改sql
修改器 设置器 改数据库
public function getTitleAttr($value){
if($value==1){
return '男';
}else if($value==2){
return '女';
}else{
return $value;
}
}
模型的修改器
模型
获取器
修改器 增加是起作用
自动完成
修改器的作用是可以在数据赋值的时候自动进行转换处理,
修改 增加 是 修改 再保存到数据库
class User extends Model
{
public function setNameAttr($value)
{
return strtolower($value);转为小写
md5($value) md5 加密
}
}
序列化字段
serialize($data);
模型的自动完成
模型
数据完成
支持auto、insert和update三个属性
auto属性自动完成包含新增和更新操作
在写入、新增和更新的时候进行字段的自动完成机制
{
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $auto = [];
protected $insert = ['ip','status' => 1];
protected $update = ['login_ip'];
protected function setIpAttr()
{
return request()->ip();
}
}
}
如果 传值来 模型 保存时
没有对应的字段 自动补齐对应的内容
开启 自动 如果 读取器 修改器没有设置 返回内容
就算插入内容 一样$insert内容 覆盖
支付宝支付 快速上手课
微信.支付宝接口
支付宝付款
0.01->alipay->返回结果
网上 自己 过
官网文档 看看
docs.open.alipay.com/62/104743
申请即时到账
参数多 校验
自己表单 填信息 会过 麻烦过
value=md5 表单对应的value 提交 url 注意
官网demo 简单 用 配置文件配
支付宝支付-->支付宝小程序--taobao....
网页 app ios ->
对接支付宝支付接口开发详细步骤
视频慢 直接文档 search
以后在视频 书籍
https://blog.csdn.net/cdszdd8/article/details/76815394
注册开发者
open.alipay.com/platform/manageHome.htm
https://openhome.alipay.com/platform/appManage.htm#/apps
开发指南
https://docs.open.alipay.com/200/105311/
https://docs.open.alipay.com/291/105971
https://docs.open.alipay.com/270
demo下载
https://docs.open.alipay.com/54/103419
https://docs.open.alipay.com/270/106291/
合作伙伴身份(PID):
2088432226420887
开发者中心
研发服务
https://blog.csdn.net/suprezheng/article/details/84931225
外网映射工具(将自己的电脑映射到外网)
nat123
https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
先看看 到时_> 重新
过
20xx 最新 的支付教程 到时 过
短信验证登录 快速上手课
短信SMS验证与登录
1.介绍SMS
Short Message Service手机短信服务
2.应用场景
安全认证 找回密码 获取联系方式 群发通知
3工作流程
发起请求>短信平台->返回结果
4.如何着手,申请,通信,存储等
显示页面 验证手机 定时按钮 form提交过
过 核对用户输入 和 平台发的
api短信 收费过 贵便
短信平台 百度搜 很多 收费
api.chanyoo.cn
v1
api
alipay 支付宝过
都和微博等等差不多 过
sms
file_get_contents跨域
注意 过得的值
ajax 错误 保留页面内容
编辑页面接口->彻底参数到其他接口->验证
ajax地址 form函数 地址
短信平台 返回格式xml 转换json 数组等
验证码错误时
缓存保存cookies...
插入数据库 短信返回成功时
严格 电信 短信 规范模板
用户 平台 时间间隔 恶意 屏蔽 ...
重复按钮
时间 添加 js
setTimeout 定时器
removeAttribute 添加禁用属性
setAttribute 设置属性
event.value设置标签内容
先过 用再来 系统重新
{
<script type="text/javascript">
var event=document.getElementById('btn');
// console.log(event.value)
event.addEventListener('click',function(){
setTimeout(function(){
var count=60;
if (count==0) {
event.removeAttribute('disabled');
event.value="获取验证码";
count=60;
}else{
event.setAttribute("disabled",true)
event.value=`重新发送${count}s`;
count--;
}
},1000)
})
</script>
}
入门课小总结
tp5入门课小总结
2017-10-16->2017-11-4 3周 第50课
你觉得自己入门了吗?
感谢各位同学的鼓励/批评/包容/
第1.2.3课你还记得吗?反正我都忘了教的啥了…
仅仅带你入门,路还要自己走.
基础-官方手册…
博客 企业网站 商城...
博客-走起…
思路
群 过
东西多 复制 道理要知道
框架 忘记 看 练
视频麦克风小 直大
与我联系
一个互联网老兵
微信公号:郭孟涛TOM
QQ:250285636
手机/微信号:18210787405
QQ交流群:189250799{教程首发}
百度网盘下载
http://pan.baidu.com/s/1c1SkwHM
网址:www.rinuo.com
免费ThinkPHP5简易商城入门
TP5简易商城创建
综合应用-商城
一个综合应用实战案例
边学边用
近距离实战
支付
同理 学过 过
看
源码
网页 原 简单过
代码 原 简单过
文档5-6 tp 到时 系统 老过
慕课-->到时
tp5 url中隐藏public目录
vhost.int
改路径 为 public/
改了 phpstudy 探针 不能用 维持
或者 学过
加域名 同时 改 vhost.ini
会 过 维持
再短 用 tp5 路由
域名/index/index/index
=
域名
tp5 创建shop表 调整各页面表名称一致
表 think_data=think_shop
同 过
页面 简单 过
代码同 过
调重主要
不会的看 过复习
支付 新版 旧版 靠 自己 网上查
diy
tp5 商城 后台管理员模块创建
简单 系统 过 看
phpmyadmin
访问不了 复制到 public下
或者命令行 其他工具
以前过 现在简单g 难打
cms 新难 打
jt
最好都打 练习 复习 y
cmeb新api看字段 复old 到时 过 现不
以前 现在 会过 学过 过 挑重 快
app/admin/controller/Index.php
多复习 多练打 以前不(需要重来看打) 现在要 简单难都要
{
<?php
namespace app\admin\controller;
use app\index\model\Data;
use think\Controller;
class Index extends Controller
{
public function index(){
//http://127.0.0.1/thinkphp/public/admin
return "管理后台";
$show=Data::wehere('id',">",0)->order('id','desc')->paginate(30);
$this->assign('show',$show);
return $this->fetch();
}
public function view(){
}
}
}
http://127.0.0.1/thinkphp/public/admin
不全 不系统 g 会 学过 g
快
tp5 商城后台 头部导航条创建
后台管理 模块创建
创建模块
设置后台布局
bootstrap
不源码 自带 练复习
tp5 自带 view 不前 后 分离 *
三段分离
请求api操作
或者 直接tp5命令
复用 bootstrap demo
public 下 放 js
admin 下不能访问
访问其他不存在ky
其他访问自己 才存在跨域问题
tp5 商城后台 左侧菜单创建
unserialize(): Error at offset 0 of 96 bytes出现的原因分析以及解决方法
https://blog.csdn.net/glx490676405/article/details/79041405
从数据库中取出数据后进行反序列化后
分析原因:英文数据中含有中文字符串,所以我们就可以想到编码的问题,serialize()函数对在不同编码下对中文的处理结果是不一样的。
数据库有个列是数组序列化后存到数据库的,取出来得反序列化,
php想要把数组保存到数据库里,有两种序列化方式,分别是:
//php系统序列化
$b = serialize($a); //序列化数组$a,得到字符串$b,存到数据库
$a = unserialize($b); //从数据库取出来,反序列化字符串$b,得到数组$a
//使用json序列化
$b = json_encode($a); //序列化数组$a,生成字符串
$a = json_decode($b); //反序列化字符串$b,生成数组
tp5
模板问题
可能要全部加 字符串 编码
TP5.0.24 php unserialize(): Error at offset 114 of 330 bytes
https://blog.csdn.net/weixin_42276430/article/details/90733259
TP5官方说清除下runtime就好了,可是清除了还是会出现
runtime下 全部清空
http://www.thinkphp.cn/topic/57674.html
https://www.cnblogs.com/Renyi-Fan/p/10652715.html
bootstrap 组件内容
tp5 后台首页设置 调用图片文件写法
https://www.kancloud.cn/manual/thinkphp5/118120
config.php
{默认空arr
// 视图输出字符串内容替换
'view_replace_str' => [
'__PUBLIC__'=>'/public',
'__TOM__'=>'这是一个英文名',
'tom'=>'小写的',
],
}
输出位置改变 可以用本地js css ->
html调用
img src='__PUBLIC__/img/h.jpg'
html 直接_tom__
__static__ tp自带
位置再 public/static/ *
__root__许多自带tp
自己添加 config.php
view_replace_str
局部
return $this->fetch('index',[],['__PUBLIC__'=>'/public/']);
全局config
'view_replace_str' => [
'__PUBLIC__'=>'/public/',
'__ROOT__' => '/',
]
<a href="{$Think.server.script_name}/admin/index/index" class="navbar-brand">__KOO__网页后台管理</a>
<script src=" __STATIC__/js/jquery.js"></script>
视频配套 类似 功能 ui到时 逻辑业务要
局部刷新 ajax 麻烦 过 到时
tp自带
Tp5调用CSS和JS文件写法
后台管理 模块创建
创建模块
设置后台布局
图片CSSjs文件的引入
资源文件加载 内置标签 模板 tp5.0
传统方式的导入外部JS和CSS文件的方法
<script type='text/javascript' src='/static/js/common.js'>
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
专门的标签
{load href="/static/js/common.js" /}
{load href="/static/css/style.css" /}
支持同时加载多个资源文件
{load href="/static/js/common.js,/static/css/style.css" /}
两个标签别名js和css 用法和load一致
{js href="/static/js/common.js" /}
{css href="/static/css/style.css" /}
load css js __STATIC__
用include把包含文件引入
包含文件引入
包含文件调用
{include file="public/header"/} //包含头部模板header
公用头部header 底部footer
导入其他html
配合 fetch assgin
tp5 doc 模板 包含文件
在当前模版文件中包含其他的模版文件使用include标签,标签用法:
{include file='模版文件1,模版文件2,...' /}
模版表达式的定义规则为:模块@控制器/操作
{include file="public/header" /} // 包含头部模版header
{include file="public/menu" /} // 包含菜单模版menu
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版
以一次包含多个模版
{include file="public/header,public/menu" /}
模版文件
{include file="../application/view/default/public/header.html" /}
传入参数
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
header 简单过 会过
简单 不用变量 直接输出
{include file="index/footer"/}<!--控制器行-->
{include file="../application/admin/view/index/footer.html"/}<!--模板文件行-->
重复 代码 有空 提取 简单过
自己部分 不提取
htmljscss部分提取 其他嵌套麻烦 简单过
以前不 现在重过
商城后台 嵌套一个模板
包含文件引入
包含文件调用
{include file="public/header"/} //包含头部模板header
分离出-共用头部header 底部footer
模板嵌套
点击表单 后台 不是前台
__root__ === /
{$Think.server.script_name}/index/bbs/view/id/{$val.id}
{$Think.server.script_name}/admin/index/view/id/{$val.id}
__root__/admin/index/view/id/{$val.id} 不行了
不改域名 ...
商品发布的简单实现
下证明 本视频不行了 不管qt浏览器服务器 上传录不行了
不行 过 自己 是一 过
x
当 模拟 add() 过
扩展 简单实现
编辑 del
tp自带不明白
<a> api del
先ajax
刷新
location.reload()
a 调到那 js也可以
直接api 简单 都有
用tp模板fetch
可以tp挑战
https://blog.csdn.net/qq_39734584/article/details/84841041
模板引入没问题,这里一般是 return $this->view->fetch();前面忘了加return
https://blog.csdn.net/u012045045/article/details/83822699
textArea没有value 属性 如何显示
textArea
{} 标签里面加
textArea
3过
商品删除 模态框弹出确认
bootstrap 实现 model..pages...
官网...随便个
https://v3.bootcss.com/javascript/#modals
原生 js comfirm prompt alert
comfirm prompt alert <-
https://blog.csdn.net/qq_38225558/article/details/83141854
ifame不行过
添加完成 改完成
todo 颜色btn 模态框..
dadantiaozhong
看 暂时不用 支付 购买 htmlkok api暂时不ds
试听进入 =详情 dsg 看过 ... htmlok apiok 都k 对接就行了
---先html 半api
以前不 现在要支付 不能直接沙箱
看 不用过 进入才 dsg
都简单过 全 其他到时 快zhajin
前端东西..
后端对接
tzwz
简单 靠自己 ...
boot代码 打 练习
抄打 忘记 gs ..
靠自己 x
按
实现对应 重要功能 逻辑 业务 就行了 大概 ...
?onload事件
网页开始加载,BOM事件,事件主体是window对象
?onready事件
文档加载完毕,DOM事件,事件主体是document对象
?jQuery的$(function),相当于onready事件
$(function(){})
$(document).ready(function(){})
id一个
jq js fn参数
html event data-id自定义传值
..
fan小程序
师傅领入门 修行靠个人 深入..学...
配套jq...api
jq ajax
$.ajax({url:"demo_test.txt",success:function(result){
$("#div1").html(result);
}});
$.get("demo_test.html",function(data,status){
alert("Data: " + data + "nStatus: " + status);
});
验证码 ddos xxs 安全ds...
都打 尽力 还不行 过 ds h再来
商品删除 模型删除方法调用
sjmf 免 但可以模拟器模拟 还是麻烦 好过没
尽win 在vm sj--doc paf app阅读...
不行了 自网 ipid servers 其他课dsmf收费-->
实际搞定 没看而已...
g 行 再...
跳转
https://www.kancloud.cn/manual/thinkphp5/118051
$this->redirect('News/category', ['cate_id' => 2]); 控制器 带参数 状态码 数据session
$this->redirect('http://thinkphp.cn/blog/2',302);url
$this->success('新增成功', 'User/list');
$this->error('新增失败');
1.5内 2 bqz duobj
lf cm jx
xcjx
其他行 这不行 跳过 无意义 跳过 随便一个www
设置 多 延迟卡住 成多个 先订阅
但是api.收费的
视频以前免..现收...所以不行 各个叫 自己监听...
不行了 其他看 随便个...
打不了模拟下 模板...目录过下
https://study.163.com/course/introduction.htm?courseId=1004860011&share=1&shareId=2877244#/courseDetail?tab=1
收费
免费
https://study.163.com/course/courseMain.htm?courseId=1005613001
代替
https://www.bilibili.com/video/av33463957/
不练 无意义 继续...
删除商品
前端 模态框弹出
后台 模型删除方法实现
模型 mvc架构
他yongid
我 data-id自定义传值
以前 现在 未来 过 ...
model.php 学过 过
会过 同理 挑重过
实现 过 ..
内容同过...
bibli 临时 特殊 其他laoold
pan ld pt 163kebibli pan moocjike51w3cichunqiu....ds
old
p13 64课 商品的图片 视频简单实现上传
上传文件
上传 图片 文件 视频
PHP最大上传文件大小限制修改
PHP默认的上传文件大小限制为2M,可以修改php.ini文件来增大上传大小。
改成50M需修改如下:
upload_max_filesize=50M
post_max_size=100M
memory_limit=150m 内存 缓存
自动 维持 不改 g ds
上传文件 接口 就是增加接口
加多上传 文件 位置 保存列表路径sql
tp5 doc
杂项-上传
php原生 改 form 属性 ...
tp5 unknown
<form action="{$Think.server.script_name}/admin/index/add"
enctype="multipart/form-data"
method="post">
<!--上传文件名字 tp自带浏览器自带-->
tp5 自动创建uploads目录 public下
pt fengkai
默认时间格式名字
demog intdayg xczjg
内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展。
ds 重构 重复提取
现在直接
可以限制上传类型 tp php
到时 简单过下
同时改名字 文件名字...
ds
{
public function upload(){
//上传文件接口 // 获取表单上传文件 例如上传了001.jpg
$vedio=request()->file('vedio');
$image=request()->file('image');
//// 移动到框架应用根目录/public/uploads/ 目录下
if ($vedio){
$info=$vedio->move(ROOT_PATH.'public'.DS.'uploads');
if ($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension()."<br>";
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $vedio->getError();
}
}elseif ($image){
$info=$image->move(ROOT_PATH.'public'.DS.'uploads');
if ($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension()."<br>";
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $image->getError();
}
}
}
}
html不能限制类型 可以大小
服务器都可以...
<form action="{$Think.server.script_name}/admin/index/upload" enctype="multipart/form-data" method="post">
<div class="form-group">
<label>发布课程</label>
<br>
<input type="file" name="vedio"><!--上传文件名字 tp自带浏览器自带-->
<input type="submit" value="上传">
</div>
</form>
多文件上传
<input type="file" name="image[]" /> <br>
{
public function upload(){
// 获取表单上传文件
$files = request()->file('image');
foreach($files as $file){
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
}
上传验证
$info = $file->
validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads');
验证参数 说明
size 上传文件的最大字节
ext 文件后缀,多个用逗号分割或者数组
type 文件MIME类型,多个用逗号分割或者数组
上传规则
默认情况下,会在上传目录下面生成以当前日期为子目录,以微秒时间的md5编码为文件名的文件,
指定上传文件的命名规则,使用rule方法
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用md5规则
$file->rule('md5')->move('/home/www/upload/');
自定义命名规则,可以在rule方法中传入函数或者方法
你希望保留原文件名称
$file->move('/home/www/upload/','');
默认情况下,会覆盖服务器上传目录下的同名文件,如果不希望覆盖,可以使用
$file->move('/home/www/upload/',true,false);
g ds xbl lbl
tp过dsxt php原生xueguo
都过
xbl
P14 65课修改php上传2M的限制
没提示 大于 空页面..
php.ini 改...
tp5 tpshop....
lavel...
本地测试 快....
优化...
tz
改 会....
服务器 php tp html 限制...
P15 66课上传功能嫩融合到自己表单里
整合上传功能在自己的表单里面
multipart/form-data 在使用包含文件上传控件的表单时,必须使用该值。
bqg 随便顺便g primary second
ys 都要认真 认识 不快进..
xg k b
挑重要
..
最后last
3和自己...
过下....
ds系统...全 new....
一次 自己扩展....
都有....
吃透一个框架语言...
其他容易上手...
laravel
...nui-app vue2 3 wx7mothday laravel...
old ds xbl
P16 67课上传文件路径存入数据库
上传文件入库
思路
存入对应的上传文件路径
min rz 都rz bkj
nv phpa cmd
麻烦不
mysql path
net mysql8 start
service mysql8 start
...other sql ds
不net cli exe 简单工具
存视频的url
字段 lesson...
alter table think_data add lesson varchar(255) default null;
字符集合...随便一个 父级tables sql
完整路径ds 不全 配套yx
video==lesson
维持...
一边 jd 过下 otherds
$lesson=$info->getSaveName();//保存sql路径 可以字符串加完成 tp变量补齐 输出在补齐也可以 尽量不客户端
$result=$user->data(['title'=>$title,'data'=>$content,'lesson'=>$lesson,'create_time'=>time()])->save();
可以局部 成员变量
$lesson="";//预防 上传失败 插入sql 异常
不* sql占资源 大
P17 68课前台展示播放上传的视频
上传文件路径存入数据库
思路
存入对应的上传文件路径
显示页面对应完善
前 后加下...add...page ...一个 laods
view...
h5 video...
poster 没视频 失败 没播放
时显示代替图片
<video width="100%" poster="__STATIC__/img/2.jpg" loop controls>
<source src="__PUBLIC__/uploads/{$list.0.lesson}" type="video/mp4"/>
</video>
改主机 域名换其他代替...
再定义一个全局..
http://127.0.0.1/thinkphp/public/uploads/20200114/2f72f989ddc6dfb8b56c383b4fa99f0d.mp4
<video width="100%" height="300" poster="__STATIC__/img/2.jpg" loop controls>
<source src="http://127.0.0.1/thinkphp/public/uploads/{$list.0.lesson}" type="video/mp4"/>
</video>
编辑
有编辑 else 编辑
无 更编辑
input 参数
request 参数 ->file上传内容...
jd 不记录
其他模板 标签 字段..
随便个 就行了 会过
mg hg
qd
view 字段价格添加
show 也是 ..jdg x wc
if 显示 考自己 扩展...
cms 输出一些参数设置....支付api需要参数 id 开发者信息...
input...
以前 以前用 现在use..<--
P18 69课支付宝支付demo接口配置演示
前台支付对接
第一步
走通收款demo
sql字段 显示jdg
bn...改名而已过滤...保存多个等..
2011-2015 支付宝接口
重新申请对接...同直接..
接口 沙箱...
订单号...
新版多...加密...功能多 过下
沙箱不会 企业没g
alipay
返回页面是
return_url.php
notify_url.php
通知同步 异步页面
以前alipayapi.php
现在config.php
不是自己 自己也可以继承覆写...
自己..
//异步通知地址
'notify_url' => "http://127.0.0.1/thinkphp/public/index/api/alipayasync",
//同步跳转
'return_url' => "http://127.0.0.1/thinkphp/public/index/api/alipaysync",
//异步通知地址
'notify_url' => "http://127.0.0.1/alipay/notify_url.php",
//同步跳转
'return_url' => "http://127.0.0.1/alipay/return_url.php",
5几s 排除...
..错误学习..
客户..在线 离线 电话...
阿里可以 腾讯不麻烦..
人工
配置参数...
还是7mothday 好 统一...---系统..不全部..
在线 离线 app iphone 技术教ds
怎么写都行了...
其他人demo看看
http://www.suooa.com/alipay.trade.page.pay-JAVA-UTF-8/
http://talenmall.com/
图形工具
https://docs.open.alipay.com/291/106097/
cmd
使用OpenSSL工具生成密钥
https://github.com/openssl/openssl/releases
https://docs.open.alipay.com/291/106130
https://www.jb51.net/article/96501.htm
https://www.jianshu.com/p/fb2ae3dc7986
win版本 源码上面gcc
https://blog.csdn.net/qq_30007885/article/details/91869053
http://slproweb.com/products/Win32OpenSSL.html
https://www.activestate.com/activeperl/downloads
https://blog.csdn.net/sunhuansheng/article/details/82218678
直接不行 要企业账户
沙箱测试..
https://docs.open.alipay.com/194/105201/
当面付Demo
电脑网页都行
本地随便个测试
系统看别人弄可以的 本不全经验少系统..
https://www.jb51.net/article/96501.htm
C:\Windows\System32\cmd.exe
C:\Program Files\OpenSSL-Win64\bin
openssl
genrsa -out rsa_private_key.pem 1024
是用于生成RSA私钥,执行后在程序目录中生成一个文件rsa_private_key.pem,其内容如下
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
是用于生成RSA公钥,执行后在程序目录中生成一个文件rsa_public_key.pem,其内容如下
openssl不行了g
官网工具 不能空格系统默认不行
或者新版可以...
https://docs.open.alipay.com/291/106097/
支付宝公key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0pwwZiEq73crpDN6LvlD7DTI+xcSsTURvEjdSD75KM8VCBicpefU/6/0jISiRcYzkMHzt4Nf0lswH1Br4tsHz4xY3YnHhWKl8EzLA6TqIIm2P6PJZ/0MKrFdXZnXgsJ0BGQ3/yc54ZC23VvWgwnm3XFmGKL411lmj3QzQsofElsV7DXYUzRfxwRFQJ53fz2O6CvFH/aF9D9ZGEIF1Mixbr7XgxQAJtfeVfMuIvKx2i3uC87ibITz7YZR5rinkjiixEMBgGDBmsKzkzzm2QZmCsR9ho6munYyC76CR+5ygjxvOfWxRXNVC9gZGjikVEWF0oLe4bqThi4xpwxkKbqL2QIDAQAB
3.设置回调地址
1.使用内网穿透工具进行内网穿透 比如 ngrok
小程序wx 不能模拟暂时
这个可以 但是麻烦 要内网转发...
授权回调地址
设置 别人支付和失败 成功回调接口 要映射 没域名主机..dns
过...
参考..
https://blog.csdn.net/a639735331/article/details/92847337
https://blog.csdn.net/a639735331/article/details/93063187
{
<?php
$config = array (
//应用ID,您的APPID。
'app_id' => "2016101700711036",
//商户私钥
'merchant_private_key' => "MIIEowIBAAKCAQEAp/76Y3us0HUYvonkEU/2IiGkqbFpCybqI6MW4Y86xGozg2fjMuYmy87E+WpLcPb2Fvjft1mQXjx4grc99peQWW306LSsOo0iGg3t2AXXVz0yVS6RqIplxqXTAQDFJe87/yrpIe+HVsDFmefjDBK/e/0d5dR8kmY2AGpgV1ru+I/59d+h3a+7Crh50TpQwxwgLQyCnZ8zgGytnRzRfbXIoLJaLrG3iOz1WCXWeDYSZDzJoXWfFMReMghj7SRQeyg1RLG2gS361LY7hYKhcfU91JwvFSHgdUd2pPs6kE0bu2bMCBClxoKLi+bOeF8IzrUh+sgzI/MAEv6Z4VWQ3Y33fwIDAQABAoIBAAH5SvPURimE1q+WaymQ6PFpt8eOoA9Te7jDd8daqXQZU1Wd6Nt2PMp0OXg8uXowTJ/keKxszvdsenX+tSmqijWixxfc15Ewi1AHDd5V4zvRKkA59dgnGB8HX71JRwe1Ed1joa2WZN6uESRHxzEjH0DTroA+yN/nd4b1uQANv3UIJxzinbIaakYG362jtBTTxDdx4KU7Pm+hNQhUB793lyMcZ+CotpwnAgaFe5jKo6tLmMTLR5w4X7h4wFIPdLvdarnFpo6Ei5XX43Jn4Db87U4qsJhCeZPAyMDEl1EBSsNRQcI3PuMUiWAI13lvv+fdaOcdDXao68F5yqItgzud9yECgYEA6j95ZJFx2flIy/+w21iL8mD+QNCcC3+sQ9jsVC0K4z1MEvBA/VT3FZSNXJ35wY7qlVpLcipHecFzQXra5okHdE5t+1mYnWoCqC5dUzwHSfdATDn6Wmha50MtPs2JTkJtYSBCYI5fE/Xqmub5obLlN4x6N+fJqoaDDjxkv5atB5cCgYEAt5iRRF987DmdqFQR3Pg+tbTAbfuYNldP0aaUNFbfOZoTf2jMuz65+IXrjbWV7ceZ/vQIIR0HN/DCFjUv4dwijV3ejTfXKMH7n+BY9tElC3BPqgVaxyNpZk4TG8/ce3ugn5xVjOyHDlYUTWhtmcWZIsbBfP4x1xRHpOwKR+y2zFkCgYA5u1sXxiDhL+cZH/Nem/whyHXhU4ih7N1v+06DkHZWewz8venGheI/l1Uftm+PnMGD/bUKdhEXmO3m/XhlyO/lYk8I25QZd78f5A1sLic9u4pFPyTMk1uUE6JbEBz/BLAgd+rkETKtoLYpZzOu/oAvqJeWn7G8LVqvb4MFFQWgEQKBgF2vSqFbIIHiPKMCk0Lwof9SxsbYlalVEHPozsOOeMYJ610eeyopLfi1Tae4O1NkgR5qJCPRjjdrcX6nkVFtZWxBtCjXj8FKiz3f20XHH2Ig42Xc6Z+oYEZGHNYaUWXpheMsgTMyFxCnuCBv402OWUA3r9A6XfBkdtKfZ/efwP+xAoGBAOoHi1IMtEfU9SsIxzggCwwe6GnDn22WxbCZMPPRD+J5mw7ygvxh87X26TB+DAwqE31NwqaoQASdF76oIWLtpp95iY7sFRUCUrYkyXyhow9pohIqmau9BODkuGjYckXmmkrHBVfNkFyBPYPfH+12fCrx5eIN4XSAkTlY1l9UeNTa",
//异步通知地址
'notify_url' => "http://127.0.0.1/alipay/notify_url.php",
//同步跳转
'return_url' => "http://127.0.0.1/alipay/return_url.php",
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0pwwZiEq73crpDN6LvlD7DTI+xcSsTURvEjdSD75KM8VCBicpefU/6/0jISiRcYzkMHzt4Nf0lswH1Br4tsHz4xY3YnHhWKl8EzLA6TqIIm2P6PJZ/0MKrFdXZnXgsJ0BGQ3/yc54ZC23VvWgwnm3XFmGKL411lmj3QzQsofElsV7DXYUzRfxwRFQJ53fz2O6CvFH/aF9D9ZGEIF1Mixbr7XgxQAJtfeVfMuIvKx2i3uC87ibITz7YZR5rinkjiixEMBgGDBmsKzkzzm2QZmCsR9ho6munYyC76CR+5ygjxvOfWxRXNVC9gZGjikVEWF0oLe4bqThi4xpwxkKbqL2QIDAQAB",
);
}
P19 70课支付宝整合tp5实例演示 整合要点分享
https://www.bilibili.com/video/av33463957?p=19
整合支付宝
1.放到tp5 extend目录
2、修改 文件和类名格式
3..function.php里的方法会被自动加载
4·支付宝接口文件分析 复杂
返回地址
api
jack...
├─extend 扩展类库目录(可定义)diy
├─vendor 第三方类库目录(Composer
有命令空间自动 没loader手动...
loader() import() require()
https://www.kancloud.cn/manual/thinkphp5/177200
使用...
//请在汉里加上商户的业务逻姆程序代码
/一请根据你的业予逻错来编写程序(以下代码仅作参考)一
//获联安付宝的通知返回参效,可参考技术文档中页面跳转同步通知参数列表
系统支付宝 带源码那些...现在麻烦过
不行过下...
代理中间 返...
分服务端 客户端支付宝api
sms以前不需要 简单过下 以前过 现过 收费...过
判断这笔行单是否在商户网站中已经做过处理
//a果较有做过处理,根据订单号(out.trade,no)在商户网站的订单系统中章到该笔订单的详细,并执行商户的业务a序
,/如果有做过处理,不执行商户的业务程序
//如要调试,请看alipay.notify.php页面的verifyReturn函数,
sms g
自动号等等到时...先简单连接
沙箱和现实不同 过下
// import('alipay/tom.php');
// require('alipay/tom.php');
行了在记录
回调 结果跳过 要返代理 麻烦会....软件配置wwwsearch
麻烦---g...回调通知
参数验证....异常处理...
$foo = new \first\second\Foo();
或者先
use first\second\Foo;
要命名空间
分析api 导入...
简单实现...g-
尽量不源码api
简单改下 原生不行....
今天剩下代理
{
<?php
class Config{
function getConfig(){
return $config = array (
//应用ID,您的APPID。
'app_id' => "2016101700711036",
//商户私钥
'merchant_private_key' => "MIIEowIBAAKCAQEAp/76Y3us0HUYvonkEU/2IiGkqbFpCybqI6MW4Y86xGozg2fjMuYmy87E+WpLcPb2Fvjft1mQXjx4grc99peQWW306LSsOo0iGg3t2AXXVz0yVS6RqIplxqXTAQDFJe87/yrpIe+HVsDFmefjDBK/e/0d5dR8kmY2AGpgV1ru+I/59d+h3a+7Crh50TpQwxwgLQyCnZ8zgGytnRzRfbXIoLJaLrG3iOz1WCXWeDYSZDzJoXWfFMReMghj7SRQeyg1RLG2gS361LY7hYKhcfU91JwvFSHgdUd2pPs6kE0bu2bMCBClxoKLi+bOeF8IzrUh+sgzI/MAEv6Z4VWQ3Y33fwIDAQABAoIBAAH5SvPURimE1q+WaymQ6PFpt8eOoA9Te7jDd8daqXQZU1Wd6Nt2PMp0OXg8uXowTJ/keKxszvdsenX+tSmqijWixxfc15Ewi1AHDd5V4zvRKkA59dgnGB8HX71JRwe1Ed1joa2WZN6uESRHxzEjH0DTroA+yN/nd4b1uQANv3UIJxzinbIaakYG362jtBTTxDdx4KU7Pm+hNQhUB793lyMcZ+CotpwnAgaFe5jKo6tLmMTLR5w4X7h4wFIPdLvdarnFpo6Ei5XX43Jn4Db87U4qsJhCeZPAyMDEl1EBSsNRQcI3PuMUiWAI13lvv+fdaOcdDXao68F5yqItgzud9yECgYEA6j95ZJFx2flIy/+w21iL8mD+QNCcC3+sQ9jsVC0K4z1MEvBA/VT3FZSNXJ35wY7qlVpLcipHecFzQXra5okHdE5t+1mYnWoCqC5dUzwHSfdATDn6Wmha50MtPs2JTkJtYSBCYI5fE/Xqmub5obLlN4x6N+fJqoaDDjxkv5atB5cCgYEAt5iRRF987DmdqFQR3Pg+tbTAbfuYNldP0aaUNFbfOZoTf2jMuz65+IXrjbWV7ceZ/vQIIR0HN/DCFjUv4dwijV3ejTfXKMH7n+BY9tElC3BPqgVaxyNpZk4TG8/ce3ugn5xVjOyHDlYUTWhtmcWZIsbBfP4x1xRHpOwKR+y2zFkCgYA5u1sXxiDhL+cZH/Nem/whyHXhU4ih7N1v+06DkHZWewz8venGheI/l1Uftm+PnMGD/bUKdhEXmO3m/XhlyO/lYk8I25QZd78f5A1sLic9u4pFPyTMk1uUE6JbEBz/BLAgd+rkETKtoLYpZzOu/oAvqJeWn7G8LVqvb4MFFQWgEQKBgF2vSqFbIIHiPKMCk0Lwof9SxsbYlalVEHPozsOOeMYJ610eeyopLfi1Tae4O1NkgR5qJCPRjjdrcX6nkVFtZWxBtCjXj8FKiz3f20XHH2Ig42Xc6Z+oYEZGHNYaUWXpheMsgTMyFxCnuCBv402OWUA3r9A6XfBkdtKfZ/efwP+xAoGBAOoHi1IMtEfU9SsIxzggCwwe6GnDn22WxbCZMPPRD+J5mw7ygvxh87X26TB+DAwqE31NwqaoQASdF76oIWLtpp95iY7sFRUCUrYkyXyhow9pohIqmau9BODkuGjYckXmmkrHBVfNkFyBPYPfH+12fCrx5eIN4XSAkTlY1l9UeNTa",
//异步通知地址
'notify_url' => "http://127.0.0.1/alipay/notify_url.php",
//同步跳转
'return_url' => "http://127.0.0.1/alipay/return_url.php",
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0pwwZiEq73crpDN6LvlD7DTI+xcSsTURvEjdSD75KM8VCBicpefU/6/0jISiRcYzkMHzt4Nf0lswH1Br4tsHz4xY3YnHhWKl8EzLA6TqIIm2P6PJZ/0MKrFdXZnXgsJ0BGQ3/yc54ZC23VvWgwnm3XFmGKL411lmj3QzQsofElsV7DXYUzRfxwRFQJ53fz2O6CvFH/aF9D9ZGEIF1Mixbr7XgxQAJtfeVfMuIvKx2i3uC87ibITz7YZR5rinkjiixEMBgGDBmsKzkzzm2QZmCsR9ho6munYyC76CR+5ygjxvOfWxRXNVC9gZGjikVEWF0oLe4bqThi4xpwxkKbqL2QIDAQAB",
);
}
}
}
{
<?php
namespace app\index\controller;
use AlipayTradePagePayContentBuilder;
use AlipayTradeService;
use think\Loader;
class Api extends \think\Controller{
public function alipay(){
//http://127.0.0.1/thinkphp/public/index/api/alipay
return $this->fetch();
}
public function alipayReturnUrl(){
// require('alipay/lib/alipay_notify.class.php');
// require('alipay/lib/alipay_core.function.php');
// require('alipay/lib/alipay_md5.function.php');
// require('alipay/lib/alipay.config.php');
// http://127.0.0.1/thinkphp/public/index/api/alipayreturnurl
$no=input('param.no');
$noname=input('param.noname');
$price=input('param.pirce');
$context=input('param.context');
$address=input('param.address');
$no=trim($no);
//loader import require
Loader::import('alipay.config');
$configobj=new \Config();
$config=$configobj->getConfig();
Loader::import('alipay.pagepay.service.AlipayTradeService');
Loader::import('alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');
//构造参数
$payRequestBuilder = new AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($context);
$payRequestBuilder->setSubject($noname);
$payRequestBuilder->setTotalAmount($price);
$payRequestBuilder->setOutTradeNo($no);
$aop = new AlipayTradeService($config);
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
var_dump($response);
}
public function jack(){
//反代理 回调通知...沙箱模拟
$alipay_config['partner']='';
//收款支付宝账号,一般情况下收款账号就是签约账号
$alipay_config['seller_email']='qq@qq.com';
//安全检验码,以数字和字母组成的32位字符
$alipay_config['key']='';
//上面 请在这里配置您的基本信息
////签名方式不需修改
$alipay_config['sign_type']=strtoupper('MD5');
//字符编码格式目前支持gbk或utf-8
$alipay_config['input_charset']=strtoupper('utf-8');
//ca证书路径地址,用于curl中ss1校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert']=getcwd().'\\cacert.pwm';
//访问模式,假据自己的服务基基否支持ss1访同,若支持请选择https;若不支持请法择http
$alipay_config['transport']='http';
//计算得出通知验证结果
$alipayNotify=new AlipayNotify($alipay_config);
$verify_result=$alipayNotify->verifyReturn();
if ($verify_result){
//商户订单号
$out_trade_no=$_GET['out_trade_no'];
//支付宝交易号
$trade_no=$_GET['trade_no'];
//交易状志
$trade_status=$_GET['trade_status'];
if($_GET['trade_status']=='TRADE_FINISHED'||
$_GET['trade_status']=='TRADE_SUCCESS'){
}else{
echo "trade_status".$_GET['trade_status'];
}
$this->assign('trade_no',$trade_no);
return $this->fetch();
}else{
echo "支付失败";
}
}
public function demo(){
//http://127.0.0.1/thinkphp/public/index/api/demo
dump("演示一下,api跨域访问");
// $url="http://127.0.0.1/thinkphp/public/index/api/domain";
// $url=file_get_contents($url);
// echo $url;
// dump($url);//看源码
// exit();
$data=array(
"title"=>"用机器人来发帖了,我来采集你的内容了",
"content"=>"加个验证码吧,不然被攻击了"
);
//1.初始化
$ch = curl_init();
//2.设置选项,包括URL
//指定请求的URL:
$url="http://127.0.0.1/thinkphp/public/view.php/view/bbs/add";
curl_setopt($ch, CURLOPT_URL,$url);
//不做证书校验,部署在linux环境下请改为true
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
//返回字符串
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//3.执行并获取html文档内容
$output=curl_exec($ch);
//4.释放curl句柄
curl_close($ch);
// echo $output;
}
public function weibo(){
//http://open.weibo.com/wiki/Connect/login微博登录官方开发步骤
//http://open.weibo.com/wiki/2/users/show获取信息接口
$error=request()->param('error');
dump($error);//in_array()
if ($error) {
echo "error:用户取消或失败";
exit();
}
$co=input('param.code');
dump($co);
$client_id='2771291031';
$client_secret='8cebc2d870dee1a84e3d5192833a9d57';
$redirect_uri="http://127.0.0.1/thinkphp/public/view.php/view/api/weibo";
$code=$co;//d65d39b76dde4bd1228dafb5d07bdc8f
// https://api.weibo.com/oauth2/authorize?client_id=2771291031&response_type=code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo
// $demo="https://api.weibo.com/oauth2/authorize?client_id=%s&response_type=code&redirect_uri=%s";
// $urld=sprintf($demo,$client_id,$redirect_uri);
// $result=curl_get($urld);// bebug
// $fp=json_decode($result,true);
// dump($fp);
// exit();//退出
//https://api.weibo.com/oauth2/access_token?client_id=2771291031&client_secret=8cebc2d870dee1a84e3d5192833a9d57&grant_type=authorization_code&redirect_uri=http://127.0.0.1/thinkphp/public/index.php/index/api/weibo&code=d65d39b76dde4bd1228dafb5d07bdc8f
$api="https://api.weibo.com/oauth2/access_token?client_id=%s&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s";
$url=sprintf($api,$client_id,$client_secret,$redirect_uri,$code);
$result=curl_post($url);// bebug
$fp=json_decode($result,true);
// $fp=file_get_contents($url,'rb');//get请求 不行
dump($fp);
echo $fp['access_token'].'<br>';
echo $fp['uid'];
$access_token=$fp['access_token'];
$uid=$fp['uid'];
// 用户信息
// https://api.weibo.com/2/users/show.json?uid=2557105902&access_token=2.00aD3DnC85DYBD3d1b82975d03cg6L
$userUrl="https://api.weibo.com/2/users/show.json?uid=%s&access_token=%s";
$userRequest=sprintf($userUrl,$uid,$access_token);
$dataResult=curl_get($userRequest);
$data=json_decode($dataResult,true);
dump($data);
$this->assign('data',$data);
//exit();//退出
return $this->fetch();
}
public function domain(){
//http://127.0.0.1/thinkphp/public/index/api/domain
$domain=input('param.domain');
// echo $domain;
//$domain=='' arr-isEmpty()
if (!$domain) {
$domain='baidu.com';
}
$cha='http://panda.www.net.cn/cgi-bin/check.cgi?area_domain='.$domain;
$fp=file_get_contents($cha,'rb');//get请求
// dump($fp);
// exit();//退出
$xml=simplexml_load_string($fp);//函数转换形式良好的 XML 字符串
// dump($xml);//object(SimpleXMLElement)
$data=json_decode(json_encode($xml),TRUE); //to array
//json_encode 对变量进行 JSON 编码
// json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
// dump($data);
//模板变量赋值
$this->assign('data',$data);
//渲染模板输出
return $this->fetch();
}
}
}
{
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>支付页面</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2><a href="{$Think.server.script_name}/index/bbs/show">TP5简易留言板</a></h2>
<p>支付宝在线支付</p>
<form action="{$Think.server.script_name}/index/api/alipayreturnurl" method="post">
<div class="form-group">
<label class="container-label">订单号</label>
<input type="number" class="form-control" autofocus name="no" maxlength="10" placeholder="请输入订单号"/>
</div>
<div class="form-group">
<label class="container-label">订单名称</label>
<input type="text" class="form-control" name="noname" maxlength="10" placeholder="请输入订单名称"/>
</div>
<div class="form-group">
<label class="container-label">付款金额</label>
<input type="number" min="0.01" class="form-control" name="pirce" maxlength="10" placeholder="0.01"/>
</div>
<div class="form-group">
<label class="container-label">订单描述</label>
<input type="text" class="form-control" name="context" maxlength="10" placeholder="请输入订单描述"/>
</div>
<div class="form-group">
<label class="container-label">商品地址</label>
<input type="text" class="form-control" name="address" maxlength="10" placeholder="请输入地址"/>
</div>
<button type="submit" class="btn btn-primary">提交订单</button>
</form>
</div>
</body>
</html>
}
Ngrok
Sunny-Ngrok内网转发
https://ngrok.com/
内网IP映射成对外可访问的域名
内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,
比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。
https://blog.csdn.net/yjc_1111/article/details/79353718
http://www.ngrok.cn/
myemali
koo
name数字.
我了解的内网穿透工具
Ngrok
Natapp
小米球
Sunny-Ngrok
echosite
Ssh、autossh
Lanproxy
Spike
frp
fcn
花生壳
https://my.oschina.net/ZL520/blog/2086061
https://github.com/ffay/lanproxy
授权码
1WU3i8PL7o6b3v92cZg1uyxbOAd_MAhEMV3n1EJVPFkKbgnm
./ngrok authtoken 1WU3i8PL7o6b3v92cZg1uyxbOAd_MAhEMV3n1EJVPFkKbgnm
https://blog.csdn.net/liu_005/article/details/79557818
https://www.jianshu.com/p/571fdbc98d25
根据官网给定的授权码,运行如下授权命令;
>ngrok authtoken 1WU3i8PL7o6b3v92cZg1uyxbOAd_MAhEMV3n1EJVPFkKbgnm
path win sqlmap..
Authtoken saved to configuration file: C:\Users\Administrator/.ngrok2/ngrok.yml
自己demodiyds...
根据需要,运行命令开发端口。
ngrok http 80
域名随机
注意安全 完了 就关闭...
每次启动ngrok都会分配一个新的外网域名,所以需要每次更换配置或者更换访问地址,不太方便。
当然,ngrok也提供了解决方法,那就是付费,
可以设置固定域名。
卡慢 国内的 随便一个 就这个麻烦 以后ds
域名 主机 dns 都可以了...
固定ip 才可以 先用 ...
随便个 ...继续 其他到时....
7ff16cd3.ngrok.io/thinkphp/public/index/bbs/show
关闭 c-d 关机就好了
cdn 浏览器 win 缓存 dns解析 快...第一次忙 以后优化
wx不能沙箱主要不能 其他都不要看就不行
支付宝可以模拟 才继续...以前不..现在要 this
可能可以免费域名固定 麻烦 不稳定 够用就会 没那么便宜午餐 够就好了....
接口 测试时在加 用手机登录
域名不同 每次 到时 用才加...g ds xbl
P20 71 支付宝完成对应商品对应价格
加字段 麻烦 用主键代替
简单过 会过 bqbxtg
last ip primary key
前台支付对接
·第一步
走通收款demo
融合到tp5架构里(难点)
完成对应商品对接
对接...基本...内外可以ds
融合第三方类 方法等...
验证码 第三方 类库等...
直接点击就可以购买 暂时不用回调不设置不手机
自动订单 参考网上 wx7月等等...
库存量检测
简单过下 主次分明...
a target=__blank 新tag
_parent父
_self 当前
alipayapi
参数写在里面 地址sql other 支付宝
地址到时编辑....jdg
<td>
<a class="btn btn-primary" href="{$Think.server.script_name}/index/bbs/view/id/{$val.id}">试听详情</a>
<a class="btn btn-primary" target="_blank" href="http://127.0.0.1/thinkphp/public/index/api/alipayReturnUrl?no={$val.id}&noname={$val.title|mb_substr=0,10,'utf-8'}&pirce={$i*0.01}&context={$val.data|mb_substr=0,20,'utf-8'|default='什么都没有'}&address=no">购买支付</a>
</td>
参考其他 页面
其他封装 以前 简单过x
以前的api 不是打的
用新不打 带不了源码看 差 没过下
官网g
html证明是官网 api old new过下
post get
my diy todo 一个 支付回调而已...ds ...
notify.URL 改下
return_url 改下
源码 继承改...
麻烦直接 源码....
//异步通知地址
'notify_url' => "http://127.0.0.1/alipay/notify_url.php",
//同步跳转
'return_url' => "http://127.0.0.1/alipay/return_url.php",
源码 可以空值一些参数api
可以不回调 配套不 下次 回调俩个接口没好
对了可以参考 官网的 只有官网也可以
改 不下就官网 多有3
支付宝点击 订单详请 可以全部..
原可以 里面可能行了 改自己好..
现在通知原可以那...alipay目录下 不是tp5里面
改配置地址
里面tp可能不行 加载了 难改进去 其他原来
定义一个接口
俩个搬过下
通知才公网 其他不用...
最好post 加密...
暂时简单过下
钱大少不行了 最少0.01
他那 完这 可以用就行了
他
returnurl方法 同步跳转
jact方法 /异步通知地址
他也是复制..
在空间导入 全部可用 里面jdg
俩个改公网稳定
以前复杂看过有源码在看过
现在简单过下
{
public function alipayapi(){
// require('alipay/lib/alipay_notify.class.php');
// require('alipay/lib/alipay_core.function.php');
// require('alipay/lib/alipay_md5.function.php');
// require('alipay/lib/alipay.config.php');
// http://127.0.0.1/thinkphp/public/index/api/alipayreturnurl
$no=input('param.no');
$noname=input('param.noname');
$price=input('param.pirce');
$context=input('param.context');
$address=input('param.address');
$no=trim($no);
// echo $no.'<br>'.$noname."<br>".$price.'<br>'.$context.'<br>'.$address;
// exit();
//loader import require
Loader::import('alipay.config');
$configobj=new \Config();
$config=$configobj->getConfig();
Loader::import('alipay.pagepay.service.AlipayTradeService');
Loader::import('alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');
//构造参数
$payRequestBuilder = new AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($context);
$payRequestBuilder->setSubject($noname);
$payRequestBuilder->setTotalAmount($price);
$payRequestBuilder->setOutTradeNo($no);
$aop = new AlipayTradeService($config);
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
var_dump($response);
}
public function notify_url(){
Loader::import('alipay.config');
$configobj=new \Config();
$config=$configobj->getConfig();
Loader::import('alipay.pagepay.service.AlipayTradeService');
$arr=$_POST;
$alipaySevice = new AlipayTradeService($config);
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
echo "trade_status".$_POST['trade_status'];
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
$this->assign('trade_no',$trade_no);
return $this->fetch();
}else {
//验证失败
echo "fail";
echo "支付失败";
}
}
public function return_url(){
Loader::import('alipay.config');
$configobj=new \Config();
$config=$configobj->getConfig();
Loader::import('alipay.pagepay.service.AlipayTradeService');
$arr=$_GET;
$alipaySevice = new AlipayTradeService($config);
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
//商户订单号
$out_trade_no = htmlspecialchars($_GET['out_trade_no']);
//支付宝交易号
$trade_no = htmlspecialchars($_GET['trade_no']);
echo "验证成功<br />支付宝交易号:".$trade_no;
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
echo "验证失败";
}
}
}
俩和 demo 服务端 客户端...
写 测试到时
smsds 打 pt不行了 其他不同接口收费更 最后打code源码复制了解..过
不用直接过
zfb公网 config本地 公网 异步 同步 ds
P21 72课前台头部和尾部模板文件分离共用
打diyg 看不同...
注册与登录
共用头部底部页面
Session和Cookie
前台 显示头部...
简单过下
会员功能
到时
前台 分离过下 同admin
show view ...分里加
可以不用 下拉菜单 bt学过 jd过
不属于
https://www.kancloud.cn/manual/thinkphp5/125009
模板 包含文件
session下次...
麻烦不提取了
控制器不
路径就好
新要
过下 其他不改 改过 有一个就好
jdg
对接接口 到时
{include file="../application/index/view/bbs/header.html"/}
前端慢慢改 简单过下
侧边也来 要改很多地方
input 下拉....
过下
响应式...
要改太多...
简单过下
其他 前端 前台 慢慢来弄 简单过下
xy
P22 73课Sessoin的使用入门
注册与登录
共用头部底部页面
Session和Cookie
都有 用随便一个 stroage都行 分离选择cms 3f
https://www.kancloud.cn/manual/thinkphp5/126166
Session和Cookie
tp5
记录登录
缓存kyhtml pt
public function session(){
// http://127.0.0.1/thinkphp/public/index/index/session 卡刷新可以
//use think\Session;
// echo "koo.<br>";
Session::set('name','tp5');//数据库读取 再设置 注册sql 下次 以后自己 ds
// echo Session::get('name');//单 当前用户设置才用 其他页面没
// exit();
return $this->fetch();
}
{$Think.session.name}
登录 不同用户...
// 删除(当前作用域)
Session::delete('name');
// 指定当前作用域
Session::prefix('think');
// 赋值think作用域
Session::set('name','thinkphp','think');
// 取值并删除
Session::pull('name');
// 清除session(当前作用域)
Session::clear();
// 清除think作用域
Session::clear('think');
// 设置session 并且在下一次请求之前有效
Session::flash('name','value');
// 清除当前请求有效的session
Session::flush();
助手函数
// 初始化session
session([
'prefix' => 'module',
'type' => '',
'auto_start' => true,
]);
// 赋值(当前作用域)
session('name', 'thinkphp');
开源软件 有空看下 学习..gwgn国内..
https://www.oschina.net/project
密码学到时...
编译也是..
支付宝其他小程序公告号...到时
Perl ds
toshop tp 以前平台少 现多 gs
tpshop->tp56 crmeb --->oher gn gw
http://www.tp-shop.cn/index.php?http_referer=tp2
weibo/del
my@mynm
免费域名www.freenom.com 腾讯dns 自己搭服务器|vmhost 云管理
kooteam.tk
cms二次--->down 简历个人+技术58o
俩天-><-循环 java类集容器
----------------------------------------------------------------
Web
---------------------
前端开发和页面架构优化
xhtml css2 css3 html5 javascript jquery
切片:在制图软件或网页制作软件中,将图像存为Web页时,把图像切成几部分,
一片一片往上传,这样上传的速度比较快。每个切片作为一个独立的文件存储,
文件中包含切片自己的设置、颜色调板、链接翻转效果及动画效果
切片工具主要是用来将大图片分解为几张小图片,这个功能用在网页中比较多,
因为现在的网页中图文并茂,也正因如此打开一个网页所须的时间就比较长,
为了不让浏览网页的人等待时间太长,所以他们将图片切为几个小的来组成。
切片是网页制作过程中非常重要的一个步骤,往往切片的正确与否会影响着网页的后期制作。一般是用ps或者fw对网页的效果图或者大幅的图片进行切割,重要的正确的切片会给网站带来一些非常正面的影响。比如:减少网页加载时间、制作动态效果、优化图像、链接等.
网页切片的作用
1、减少网页加载时间
有时候网页上可能需要大的banner图片或者背景图片,那么浏览器下载这个图片就要花费很长的时间,
这是很不利于用户体验的。而网页切片的出现就很好的解决了这个问题
切片的使用使整个大的图片分为了不同的很多小图片,浏览器也会对这些小图片进行分开下载,
这样浏览器下载图片的时间久大大的缩短了,节约了很多的时间.
2、优化图像
一般来说一个完整的图像只能是一种格式,jpg.gif.png,psd,bdf或者其他,
一种格式那么我们就只能采取一种优化方式。而网页切片可以把这张分割成很多小图片,
并且可以保存成其他格式,可以分别对其优化这样就能保证图片质量高等的情况下还能减少图片的内存,
也提高网页的力速度的.
一另存网页PSD文件
二整合PS的图片
113.111.212.44
61
一、分割切片
二切片的类型(用户切片、非用户切片)
一根据颜色范围来切;
二切片大小:把网页的切片切的越小越好;
三切片区域无整性:保正完整的一部分在一个切片内,例如某区域的标题文字,以后修改时方便;
四导出类型:颜色单一过渡少的,应该导出为GIF,
颜色过渡比较多,颜色丰富的应该导出为JPG,
有动画的部分应该导出为GIF动画.
五保留源文件:即使页面作好了,也要保留带切片层的源文件,
说不上哪天要改某一个部分,例如文字什么的,直接修改单独导出所用的切片就可以了.
6.切片的图层显示与隐藏
一背景图片的切片;\
二不规则图片的切片
要导出png 把文字背景隐藏
7.切片的编辑(大小、调整、删除、清除切片、保存切片)
切片名称写英文
alt标记 关键字
保存web所用格式
一三种切片的格式介绍
png背景透明 gif颜色单一 jpeg颜色丰富
二比较
三范围 优点
导出保存和命名
10.切片的技巧(渐变、阴影、不规则图形的切片)
<img scr=> 用样式
F:\麦子学院web前端开发工程师(jpzyfx.com精品资源分享)\01.第一阶段\01.Web前端开发之Photoshop切片
切片的概念 作用 具体操作 格式选择
F:\麦子学院web前端开发工程师(jpzyfx.com精品资源分享)\01.第一阶段\02.Web前端开发之HTML+CSS基础入门
注释<!-- -->
空格  
<小于号 < <
>大于号 > >
&和号 & &
"引号 " "
'撇号 ' '
¥ ¥ ¥
x 乘号 × ×
➗ 除号 ÷ ÷
html基本结构
<html>开始标记
<head>头信息开始标记 title meta style
<title>文件标题标记
<body>文档的主体标记 h1 p br
属性 bgcolor背景颜色
text 文本颜色
link 连接颜色
vlink 访问了的链接颜色
alink 正在点击链接颜色
<meta> 页面的元信息 搜索的描述和关键字
必须属性 content 值some_text name属性相关元信息
常见属性 name属性content关联 author keywords description others
关键字 <meta name="keywords" content="关键字">
编码 <meta charset="utf-8">
多个空格回车等一个空格
文档设置标记
格式标记
<br>强制换行标记 文字图片表格显示下一行 单标记
<p>换段落标记
<center>居中对齐标记
<pre>预格式化标记 按预先排版显示
<li>列表项目标记 可以设置value="1" 符号
<ul>无序列表标记
<ol>有序列表标记 配合li 嵌套<ol type="符号"> 符号阿拉伯数字 字母大小写 罗马大小写
<dl><dt><dd>定义型列表 列表简短说明
<dl>
<dt>软件说明:</dt>
<dd>软件功能应用</dd>
</dl>
<hr>水平分割线标记 单标记
<div>分区显示标记,层标记 大段落 多层嵌套
文档设置标记
文本标记
hn标题标记 n1-6 h1最大h6最小
font字体设置标记 封特
font三个属性:size字体大小 <font size="2" 范围1-7 默认3 xhtml不支持
color颜色 <font color="red">
face字体 <font face="微软雅黑">
b粗字体标记
i斜字体标记
sub文字下标字体标记
sup文字上标字体标记
tt打印机字体标记
cite引用方式字体斜体
em强调斜字体
strong强调粗字体
small小型字体标记 嵌套 比上小 小到不能小了就不
big大型字体标记
u下划线字体标记
vr
.当前目录
..上级目录
图像标记
<img>图像标记 单标签
使用方法:
<img src="图片路径/名称.格式" width="宽度" height="高度" border="宽度" alt="显示名">
属性:
src属性:图片路径/名称.格式 可以是远程图片
width/height/border:宽度/高度/边框宽度 单位px em cm mm
alt:在图标上鼠标显示名称 加载失败显示名 搜索引擎靠这抓取图片
超链接使用
<a href="" target="打开方式" name="描述点">连接文字/图片</a>
href 链接地址可以是网页.视频.图片音乐 外内部链接
target: _blank新窗口打开 seif当前窗口打开默认
框架用多 _parent父窗口打开 _top在顶部窗口打开文件
name 页面描述点
<a href="#dibu"></a>
<a name="dibu"></a>
表格--
表格的基本结构
<table></table>标记
table属性:width/height/border 宽度/高度/边框宽度
align:显示位置 默认left居左 center居中 right居右
cellspacing:单元格之间的间距.默认2px,单位像素
cellpadding:单元格内容与单元格边框的显示距离,单位像素
frame:控制表格最外层的四条线框
void默认无边框
above仅顶部有
below仅底部
hsides仅顶部和底部有
lhs仅左侧有
rhs仅右侧
vsides仅左右俩侧有
box包含全部4个边框
border包含全部4个边框
rules:控制是否显示以及如何显示单元格之间的分割线
none默认无分割线
all所有的分割线
rows仅行分割线
clos仅列分割线
groups仅在行组和列组之间有分割线
<caption></caption>标记 表格标题
就直接<table>之后,<tr>之前
align属性:top表格上部
bottom表格下面
left表格左部
right表格右部
<tr></tr>标记
定义表格一行 嵌套对个<th><td>
bgcolor背景属性
align垂直对齐属性 bottom底部对齐 top顶部对齐 middle居中
valign水平对齐属性 left左 right右 center居中
<th></th>标记粗显示
<td></td>标记
单元格的标记,必须嵌套在<tr>内
<th>表头标记位于首行/首列,加粗
<td>数据标记,单元格的具体数据
一样属性:
bgcolor单元格背景
align单元格对齐方式
valign水平对齐
width/height 单元格宽度/高度
rowspan单元格占行数
colspan单元格占列数
课后实战<制作一个简单的网页布局>
<body leftmargin="0" topmargin> ma几
html框架
框架将浏览器划分不同的部分,每部分加载不同的网页,同一窗口加载多页面的效果
<frameset>划分框架标记
<frameset></frameset>
属性:cols 使用"px"和"%"分割左右窗口,"*"表示剩余部分
使用("*","*")表示框架平均2个
rows 使用px和%分割上下,"*"表示剩下
frameborder 是否显示边框 0不 1显
border 设置边框大小,默认5px
<frame>子窗口标记 单标记
必须在<frameset>中设置几个就有几个frame框架 必须使用src指定网页
属性:src加载网页文件的url地址
name框架名称,是链接标记的target所要参数
noresize不能调整框架大小 noresize="noresize"
scrolling滚动条 auto自动-yes有-no无
frameborder 边框 1显示 0不显示
html表单
表单标记<form></form>
<form action="url">空使用当前文档url,no不需要
<form name="name">表单名字
<form method="post">传输方式,get默认显示在url地址,不超8192字符,不保密
post 将数据保存在表单主体一块传输,不限制大小
<form enctype> 设置表单的资料编码方式
<form target> 和超链接的属性类似,用来指定目标窗口
文本域和密码
<input>标记 单标记
<input type="text">type:默认是text文本输入框
password密码输入框 输入隐藏
submit 提交按钮
reset 重置按钮
button 普通按钮
radio 单项按钮
checkbox 复选框
radio|checkbox checked属性设置默认选项 相同name控制单一
hidden 隐藏域
<input name="name">name定义控件的名称
<input value="默认打开内容">value初始化值
<input size="length">size设置控件长度
<input maxlength="内容length">输入框最大输入的字符数
多行文本域
<textarea></textarea>
<textarea name="name" rows="value" cols="value" value="value">
... ... <textarea>
name定义控件的名称 rows行 cols列数 value默认
菜单下拉列表域
<select></select>标记
<select name="">name定义控件的名称
<select size="">size列表的高度
<select multiple>multiple可以多选择
<option></option>标记
用来指定列表中的选项,放在select里面
属性值:value给选项赋值,指定传送到服务器上的值
selected指定默认的选项
实战《会员登录表单》
HTML<!DOCTYPE HTML>声明标签
定义和用法
<!DOCTYPE>声明必须html文档第一行<html>之前
<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前。
<!DOCTYPE> 声明不是 HTML 标签;
它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。
在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML。
DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。
HTML5 不基于 SGML,所以不需要引用 DTD。
HTML5 <!DOCTYPE html> <meta charset="utf-8">
HTML4.01
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。
不允许框架集(Framesets)。
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
注意的规则:单标签必须闭合 比如<br>必须写为<br/> <input/>
单属性必须添加属性值<input typr="radio" checked >必须写为<input typr="radio" checked="checked" />
标记和属性必须使用小写<Body><BODY>是错的必须写为<body>
属性的属性值必须使用"" 在HTML4.01之前可以使用<body bgcolor=red>,HTML4.01必须写为<body bgcolor="red">
CSS样式
内链样式表 <bordy style="background-color:red;margin:0;padding:0;"></bordy>
嵌入式样式表 在<head>内 <style type="text/css">body{background-color:red;}</style>
引用样式表 <link rel="stylesheet" type="text/css" href="style.css">单标签
style.css =: body{background-color:red;}
定义css样式(css选择器)
html标记定义:<p>...</p>
p{属性:属性值;属性1:属性值1}
p可以叫选择器,定义那个标记中的内容执行其中的样式
一个选择器可以控制若干个样式属性,他们之间需要用;隔开,最后一个可以不用
子类改变 .div .p{color:blue;}
<div class="div">段落<p class="p">段落</p></div>
Class定义:<p class="p">...</p>
class定义是以"."开始
.p{属性:属性值;属性1:属性值1}
ID定义: <p id="p">...</p>
ID定义是"#"开始
#p{属性:属性值;属性1:属性值1}
优先级问题:1.ID>Class>HTML
2.同级选择里元素最近一个 css样式最后一个
注释/*#div .p{
color:blue;
}*/
组合选择器(同时控制多个元素):
h1,h2,p,.div,#p{color:red;font-size:13px;}
选择器组合用","隔开
伪元素选择器:
a:link{color:blue;} 正常链接样式
a:hover{color:green;} 鼠标放上
a:active{color:yellow;} 选择链接时
a:visited{color:red} 已经访问过
常见属性
1.颜色属性:
color属性定义文本的颜色
color:green
color:#ff6600 相同简单写color:#f60
color:rgb(255,255,255) 红(R)、绿(G)、蓝(B) 每个的取值范围0~255
color:rgba(255,255,255,0-1) 红(R)、绿(G)、蓝(B)和 Alpha[啊儿法]的(色彩空间)透明度0到1之间
255,255,255白色 0,0,0黑色
2.字体属性:
font-size字体大小:font-size:13px
px:设置一个固定的值
%:父元素的百分比
smaller:比父元素更小
larger:比父元素更大
inherit:继承父元素
font-family定义字体:font-family:'微软雅黑',serif; 烦魔里
可以使用","隔开,确保当字体不存在时使用下一个,字体发英文名字
font-weight字体加粗:normal(默认值) bold(粗) bolder(更粗) lighter(更细)
100~900 400=normal 700=bold 整百表示
font-style字体样式:normal正常标准
italic斜体
oblique倾斜
inherit继承
font-variant小型大写字母显示文本
normal标准
small-caps大写字母显示文本
inherit继承
3.背景属性:
背景颜色background-color:red #f160 rgba
背景图片background-image:url(图片路径)|background-image:none;
background-image:url(img/demo.jpg);
背景重复background-repeat:
repeat重复平铺默认
repeat-x|repeat-y 向x|y轴重复
no-repeat不重复
背景位置background-position:x y 默认center
横向(left,center,right)
纵向(top,center,bottom)
数值表示10px 10px
简写方式:background:背景颜色 url(图像) 重复属性 位置x 位置y
background:red url(img/img.jpg) no-repeat top center
其他的选择器也是可以简写
4文本属性:
text-align:横向排列left center right
line-height文本行高:%基于字体大小的百分比行高
数值来设置固定值
text-indent首行缩进:
%父元素的百分比
px固定值,默认0
inherit继承
letter-spacing字符间距:normal默认 inherit继承 lenght设置具体的数值(可以设置负数)
word-spacing单词间距:标准间距normal px固定值 inherit继承
direction文本方向:ltr从左到右默认 rtl从右到左 inherit继承.
text-transform文本大小写:
capitalize每个单词首字母大写开头
uppercase全部大写字母
lowercase全部小写字母
inherit从父元素继承text-transform属性值
边框属性:
1.边框风格border-style:
统一风格(简写风格)border-style
单独定义某一方向的边框样式:
border-bottom-style下边边框样式
border-top-style上边边框样式
border-left-style左边边框样式
border-right-style右边边框样式
边框风格样式的属性值:
none无边框
solid直线边框
dashed虚线边框
dotted点状边框
double双线边框
inherit继承
以下依托border-color属性值
groove凸槽边框
ridge垄状边框
inset边框
outset边框
2.边框宽度border-width:
统一风格border-width
单独风格:
border-top-width上边边框宽度
border-bottom-width下边边框宽度
border-left-width左边框宽度
border-right-width右边边框宽度
边框宽度的属性值:
thin细边框
medium中等边框
thick粗边框
px固定值的边框
inherit继承
3.边框颜色border-color:
统一风格border-color
单独风格:
border-top-color上边边框颜色
border-bottom-color下边边框颜色
border-left-color左边边框颜色
border-right-color右边边框颜色
属性值:颜色值的名称:red green blue
RGB rgb(255,255,255)
RGBA rgba(255,255,255,0-1)
十六进制 #ff6600 #f60
继承inherit
属性值的四种情况:
一个值:border-color:(上,下,左,右)
俩个值:border-color:(上下)(左右)
三个值:border-color:(上) (左右) (下)
四个值:border-color:(上) (右) (下) (左)
灰色#aaa #bbb #ccc #ddd
float:left浮动 margin-right:10px边距
简写方式:border:solid 2px #f60;
列表属性
标记的类型:list-style-type
none 无标记。
disc 默认。标记是实心圆。
circle 标记是空心圆。
square 标记是实心方块。
decimal 标记是数字。
decimal-leading-zero 0开头的数字标记。(01, 02, 03, 等。)
lower-roman 小写罗马数字(i, ii, iii, iv, v, 等。)
upper-roman 大写罗马数字(I, II, III, IV, V, 等。)
lower-alpha 小写英文字母The marker is lower-alpha (a, b, c, d, e, 等。)
upper-alpha 大写英文字母The marker is upper-alpha (A, B, C, D, E, 等。)
lower-greek 小写希腊字母(alpha, beta, gamma, 等。)
lower-latin 小写拉丁字母(a, b, c, d, e, 等。)
upper-latin 大写拉丁字母(A, B, C, D, E, 等。)
hebrew 传统的希伯来编号方式
armenian 传统的亚美尼亚编号方式
georgian 传统的乔治亚编号方式(an, ban, gan, 等。)
cjk-ideographic 简单的表意数字
hiragana 标记是:a, i, u, e, o, ka, ki, 等。(日文片假名)
katakana 标记是:A, I, U, E, O, KA, KI, 等。(日文片假名)
hiragana-iroha 标记是:i, ro, ha, ni, ho, he, to, 等。(日文片假名)
katakana-iroha 标记是:I, RO, HA, NI, HO, HE, TO, 等。(日文片假名)
标记的位置:list-style-position
inside 列表项目标记放置在文本以内,且环绕文本根据标记对齐。
outside 默认值。保持标记位于文本的左侧。列表项目标记放置在文本以外,且环绕文本不根据标记对齐。
inherit 规定应该从父元素继承 list-style-position 属性的值。
设置图像列表标记:list-style-image
URL 图像的路径。
none 默认。无图形被显示。
inherit 规定应该从父元素继承 list-style-image 属性的值。
简写方式:list-style:square inside url('/i/arrow.jpg');
DIV+CSS布局
1.div+span以及盒模型
div+span在整个html标记中,没有任何意义,他们存在就是为了应用css样式
div和span区别与:span是内联元素 div是块级元素
2.盒模型
margin盒子外边距 margin-left/right/top/bottom margin:0 auto;
padding盒子内边距
border盒子边框宽度
width盒子宽度
height盒子高度
3.布局相关的属性
1.position定位方式
relative正常定位
absolute根据父元素进行定位
fixed根据浏览器窗口进行定位
static没有定位
inherit继承
2.定位
left左 right右 top上 bottom下
离页面顶点的距离 left:-29;
3.z-index层覆盖先后顺序(优先级) 默认0;
4.display显示属性
display:none层不显示
display:block块状显示,在元素后面换行,显示下一个块元素
display:inline内联显示,多个块可以显示在一行内
5.float浮动属性
left左浮动
right右浮动
6.清除浮动
clear:both
在原层清 或新层专门清
7.overflow溢出处理
hidden隐藏超出层大小的内容
scroll无论内容是否超出层大小都添加滚动条
auto超出时自动添加滚动条
4.兼容问题及高效开发工具
IE兼容测试工具与高效开发工具 在body内测试
1.兼容性测试工具
IE Tester
Multibrowser
2.常用浏览器
Firefox
Google chrome
opera
3.高效的开发工具
轻量级:notepad++ sbulime Text notepad.exe
重量级:WebStorm Dreamweaver
4.网页设计工具
fireworks
photoshop
5.判断IE的方法
注意:条件注释只有在IE浏览器下才能执行,这样就达到了我们的效果!
条件判断格式:<!--[if 条件 版本]> 那么显示 <![endif]-->
不等于 [if !IE 8] 除了ie8都可以显示
小于 [if lt IE 5.5] 如果ie浏览器版本小于5.5的显示
大于 [if gt IE 5] 如果ie浏览器版本大于5的显示
小于或者等于 [if lte IE 6] 如果ie浏览器版本小于等于6的显示
大于或者等于 [if gte IE 7] 如果ie浏览器版本大于等于7的显示
大于和小于之间 [if (gt IE 6)&(lt IE 7)] 如果ie浏览器版本大于6小于7的显示
或 [if (IE 6)|(IE 7)] IE6或者IE7显示
仅 <!--[if IE 8]>仅ie8显示<![endif]-->
实战项目(从效果图到网页布局以及按需切图)
div.hander 按tab自动完成
ps ctrl+r标尺
*{ //所有带padding margin的 通用样式
padding:0;
margin:0;
}
text-decoration:none;无下划线
h1>a>img tab
form>table>tr>td*3
<td class="s_z z"></td>俩个类名
<button type="submit" name="submit"></button>
cursor:pointer;鼠标放上有个小手
f12调试styles 点可暂时失效
font:14px/24px
margin:0 20 0 0 上左下右
padding:0 28px;
下载器
文本区ps标尺计算长度剩下960-*- 20边距
二三级下拉菜单
https://jingyan.baidu.com/article/925f8cb8de3a12c0dde05616.html js
https://www.runoob.com/css/css-dropdowns.html css
https://www.cnblogs.com/lhb25/p/10-html5-css3-drop-down-menus.html 多种
https://jingyan.baidu.com/article/a3a3f811e0b4248da2eb8ad8.html js css
.xw_c li.a{
li的aclass
}
站外连接要加http
div>ul>li{ //>是子代选择器
float:left;
}
03.Web前端开发之HTML5+CSS3快速入门-----------------------
1.课程简介
掌握html5网页结构
熟悉掌握常用的css3新增的样式属性
独立完成常见html5网页
2.什么是HTML5
首先了解HTML
HTML即超文本标记语言(HyperText Markup language),这是一种语法简单、结构清晰的语解释型文档,他不同于其他的编程语言。
HTML5就是HTML网页标记语言的第五次重大更新产品,在这个版本中,新功能不断推出,以帮助Web应用程序的作者,努力提高新元素互操作性。
HTML5他的产生,最简单的目标就是,
用更简洁的HTML代码创建更多功能的网页程序!并且HTML5让网页结构变得更加的清楚明了,增加了更加语义化的结构标签,这样一个网页的结构就非常清晰,那个部位显示的什么内容,让人一目了然!
为开发人员节约时间,这句好话怎么理解,
因为之前我们所使用的HTML/XHTML在各大浏览器之间存在的不兼容问题显示的非常严重的问题,然而HTML5的出现就是为了解决这一个问题,HTML5的目标就是将HTML5网页上的音视频、图像、动画等等都带入一个国际标准化!
结构清晰的HTML5,在HTML5中增加了主体元素,比如新增的NAV标签,表示的就是导航的意思,而之间呢,就是用DIV并没有实际的意义!
兼容性:HTML5在老版本的浏览器上面也可以完美运行。
实用性:HTML5抛弃了不切实际的功能,一切按照实用性的线路出发!
3.认识新的网页结构
1、新的网页结构
<!DOCTYPE html>
<html>
<head lang="en">
<title></title>
<meta charset="utf-8">
</head>
<body>
<header></header>
<nav></nav>
<article></article>
<section></section>
<aside></aside>
<footer></footer>
</body>
</html>
1、DOCTYPE声明
HTML4中的DOCTYPE声明格式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
HTML5中的DOCTYPE声明格式
<!DOCTYPE html>
2、网页字符编码
HTML4中是指定<meta>元素的形式来制定网页的字符编码,如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
而在HTML5中是对<meta>元素直接进行追加sharset属性来指定字符,如下:
<meta charset="UTF-8">
3、<header>元素
header元素表示页面中的一个内容区块或者整个页面的标题!
HTML5中使用方法:
<header></header>
4、<nav>元素
nav元素表示页面中的导航链接部分。
HTML5中使用方法:
<nav>...</nav>
5、<article>元素
article元素表示页面中的一块玉上下文不相关的的独立内容,比如一篇文章中的文章。
HTML5的使用方法:
<article></article>
6、<section>元素
section表示页面中的一块内容区块,比如章节的页眉、页脚等等。也可以和Hn(h1、h2..)等一起使用,标示出文档的结构!
<section></section>
7、<aside>元素
aside元素表示article元素的内容之外的,和内容相关的辅助信息!
<aside><aside>
8、<footer>元素
footer表示页面或者是页面中的一块区域的页脚,比如存放文件的创建时间、作者、联系方式等等。
<footer></footer>
4.article元素的使用方法
2、新增的主体结构元素 独立区域
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<article>
<header>
<p>时间<time pubdate="pubdate">2019/5/11</time></p>
</header>
<p><b>Article是一个独一的区域</b></p>
<section>
<h2>评论</h2>
<article>
<header>
<h3>读者</h3>
<p>时间<time pubdate="pubdate">2019/5/11</time></p>
</header>
<p>好</p>
</article>
<article>
<header>
<h3>读者1</h3>
<p>时间<time pubdate="pubdate">2019/5/12</time></p>
</header>
<p>好1</p>
</article>
</section>
<footer>
<p><small>版权所有</small></p>
</footer>
</article>
</body>
</html>
5.section元素
内容标题 独立的区块
样式用div HTML5轮廓工具
轮廓:
http://gsnedders.html5.org/outliner/process.py
Untitled Section不建议用section
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<section>
<h1>section元素</h1>
<p>内容区域</p>
<section>
<h2>A</h2>
<p>A内容</p>
</section>
<section>
<h2>B</h2>
<p>B内容</p>
</section>
</section>
</body>
</html>
webstorm
ctrl+/ 快速注释
文章分段也由section完成
结构清晰忽略
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<article>
<h1>产品</h1>
<p>详细产品列表</p>
<section>
<h2>产品A</h2>
<p>产品A介绍</p>
</section>
<section>
<h2>产品B</h2>
<p>产品B介绍</p>
</section>
</article>
</body>
</html>
区域有独立的内容
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<section>
<h1>产品</h1>
<p>产品种类列表</p>
<article>
<h2>产品A</h2>
<p>产品A的介绍</p>
</article>
<article>
<h2>产品B</h2>
<p>产品B的介绍</p>
</article>
</section>
</body>
</html>
分段用section不用样式
6.aside元素
附属信息 主体内容广公告侧边栏
案例一
主要内容的附属信息
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<header><!--大标题-->
<h1>放假</h1>
</header>
<article><!--文章内容-->
<h2>看看</h2><!--小标题-->
<p>那里</p><!--正文-->
<aside><!--附加信息-->
<h3>解释</h3>
<dl>
<dt>这:</dt>
<dd>那里</dd>
</dl>
</aside>
</article>
</body>
</html>
案例二
全局附属信息
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<aside>
<h1>网站公告</h1>
<p>放假通知</p>
</aside>
</body>
</html>
7.nav元素
页面导航主要重要
使用场合
传统的导航条
侧边栏导航
内页导航
翻页操作
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>使用方法</h1>
<nav>
<ul>
<li><a href="">首页</a></li>
<li><a href="">2页</a></li>
</ul>
</nav>
<article>
<header>
<h2>方法2</h2>
<nav>
<ul>
<li><a href="">0页</a></li>
<li><a href="">01页</a></li>
</ul>
</nav>
</header>
</article>
<article>
<header>
<h2>方法3</h2>
<nav>
<ul>
<li><a href="">0页</a></li>
<li><a href="">01页</a></li>
</ul>
</nav>
</header>
</article>
<footer>
<p>
<a href="/">版权信息</a>
<a href="/">站点帮助</a>
<a href="/">联系我们</a>
</p>
</p>
</footer>
</body>
</html>
8.time元素
Time元素代表24小时中的某个时间或者是日期,表示时间时允许带时差。
他可以定义的格式如下:
<time datetime="2014-9-28">2014年9月28<time>
<time datetime="2014-9-28">9月28<time>
<time datetime="2014-9-28">今天的时间<time>
<time datetime="2014-9-28T22:30">2014年9月28晚上10点<time>
<time datetime="2014-9-28T22:30Z">UTC标准时间2014年9月28晚上10点<time>
<time datetime="2014-9-28T22:30+8:00">中国时间2014年9月28晚上10点<time>
9.pubdate属性
pubdate可以用在article元素里面的time上面表示,当前文章的发布时间
一个页面有多个time时,有pubdate="pubdate"表示当前页面文章发布时间
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<header>
<h1>pubdate</h1>
<p>
发布时间:<time datetime="2019-05-13" pubdate="pubdate">2019-05-13</time>
</p>
</header>
<p>国庆节<time datetime="2019-10-01">10-01</time>放假</p>
</body>
</html>
3、新增的非主体结构元素
10.header元素合成
header元素是一种具有引导和导航作用的结构元素,通常用来放置整个页面或页面内的一个内容区块的标题,
但也可以包含其他的内容,比如在header里面放置logo图片、搜索表单等等。
注意:一个页面内并没有限制header的出现次数,也就是说我们可以在同一页面内,
不同的内容区块上分别加上一个header元素。
在HTML5中,一个header元素至少可以包含一个heading元素(h1-h6),
也可以包括我们下节课将要学习的hgroup元素,还可以包括其他的元素,
在新的W3C HTML5标准,我们还可以把NAV元素包括进去。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
</head>
<body>
<header>
<h1>网页标题</h1>
</header>
<article>
<header>
<h1>文章标题</h1>
</header>
<p>文章正文部分</p>
</article>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
*{
margin:0;
padding:0;
}
body{
font-family:微软雅黑;
text-align:center;
}
a{
color:#160;
text-decoration:none;
}
hgroup{
margin-bottom:10px;
}
nav{
height:48px;
background:#f60;
}
nav li{
float:left;
background:#000;
border-radius:5px;
padding:5px 10px;
margin:10px;
list-style:none;
}
</style>
</head>
<body>
<header>
<hgroup>
<h1>html5视频教程</h1>
<a href="/">[手机版]</a>
<a href="/">[html5论坛]</a>
</hgroup>
<nav>
<ul>
<li><a href="/">首页</a></li>
<li><a href="/">手机版</a></li>
<li><a href="/">论坛</a></li>
</ul>
</nav>
</header>
</body>
</html>
11.hgroup元素合成
hgroup元素是将标题和他的子标题进行分组的元素。hgroup元素一般会把h1-h6的元素进行分组,
比如在一个内容区块的标题和他的子标题算是一组。通常情况下,文章只有一个主标题时,是不需要hgroup元素的。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<article>
<header>
<h1>标题</h1>
<p><time datetime="2019-05-14" pubdate="pubdate">2019-05-14</time></p>
</header>
<p>正文</p>
</article>
<article>
<header>
<hgroup>
<h1>主标题</h1>
<h2>子标题</h2>
</hgroup>
<p><time datetime="2019-05-14">2019-05-14</time></p>
</header>
<p>正文</p>
</article>
</body>
</html>
12.footer元素
footer元素可以作为他的上层父级内容区块或是一个根区块的注脚。
footer元素一般情况下包括与它相关的区块的注脚信息,比如作者、版权信息等。
注意:footer元素和我们前面所讲的header元素一样,并没有限制他的个数。
并且footer元素可以为article元素或者section元素添加footer元素。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
*{
margin:0;
padding:0;;
}
body{
font-family:微软雅黑;
text-align:center;
}
#footer,#footer a{
color:#555;
text-decoration:none;
}
footer,footer a{
color:#555;
text-decoration:none;
}
</style>
</head>
<body>
<div id="footer">
<p>
<a href="/">版权信息</a> |
<a href="/">关于我们</a> |
<a href="/">联系我们</a> |
<a href="/">站点地图</a>
</p>
<p>版权所有</p>
</div>
<footer>
<p>
<a href="/">版权信息</a> |
<a href="/">关于我们</a> |
<a href="/">联系我们</a> |
<a href="/">站点地图</a>
</p>
<p>版权所有</p>
</footer>
</body>
</html>
xigua9.5f10-60+15+30-9
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<article>
<p>文章内容</p>
<footer>文章脚本注释</footer>
</article>
<section>
<p>文章内容</p>
<footer>文章脚本注释</footer>
</section>
</body>
</html>
13.address元素合成
address元素用来在页面中呈现联系信息,包括文档的作者、邮箱、地址、电话信息等。
address元素还用来展示和文章中的相关的联系人的所有联系信息。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<header>
<h1>教程</h1>
</header>
<p>
正文部分
</p>
<footer>
<address>
<a href="/" title="John">John</a>
<a href="/" title="Koo">Koo</a>
地址<br>
</address>
时间:<time datetime="2019-05-14">2019-05-14</time>
</footer>
</body>
</html>
2、新增和废除元素的认识
1、其他新增元素
14.figure元素与figcaption元素
1、新增的figure元素与figcaption元素
figure元素是一种元素的组合,带有可选标题。figure元素用来表示页面上一块独立的内容,
如果将他从网页上删除不给我们的网页造成影响。
figcaption元素表示figure元素的标题,它属于figure元素,
figcaption元素必须书写在figure元素内部,可以写在figure元素内的其他从属元素前面或后面。
一个figure元素内最多只允许放置一个figcaption元素。
音频视频表格插件
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<figure>
<img src="1.jpg" title="poto">
<img src="2.jpg" title="poto">
<img src="3.jpg" title="poto">
<figcaption>风景</figcaption>
</figure>
</body>
</html>
15.details元素与summary元素
2、新增的details元素与summary元素
details元素是一种用于标识该元素内部的子元素可以被展开、收缩显示的元素。
details元素具有一个布尔类型的open属性,当该值为true时,该元素内部的子元素应该被展开显示,
当该属性值为false时,其内部的子元素应该被收缩起来不现实。该属性的默认值为false,
当页面打开时其内部的子元素应该处于收缩状态。
summary元素从属于details元素,用鼠标点击summary元素中的内容文字时,
details元素中的其他所有从属元素将会展开或者收缩。如果details元素内没有summary元素,
浏览器那你会提供默认的文字以供点击,例如“details”
目前只有谷歌的Chrome浏览器支持!
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<details>
<summary>show</summary>
<p>open</p>
</details>
</body>
</html>
------------------------------------Mindjet MindManager pro---------------------------------------------
16.mark元素
3、新增的mark元素
mark元素表示页面中需要突出显示或高亮显示的,对于当前用户具有参考作用的一段文字。
通常在引用原文时使用mark元素,目的是引起读者的注意。
mark元素是对原文内容有补充作用的一个元素,他应该用在一段原文作者不认为重要的,
但是现在为了与原文作者不相关的其他目的而需要突出显示或者高亮显示的文字上面。
mark元素最主要的目的就是吸引当前用户的注意。
mark元素除了高亮显示之外,还有一个作用就是在引用原文时,
为了某种特殊的目的而把作者没有表示出来的内容重点表示出来。
注意:mark元素和html4里面的em元素和strong元素的作用是有区别的
原文无关
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h2>以下是关于<mark>HTML5</mark>的搜索结果</h2>
<section>
<article>
<h2>
<a href="/"><mark>html5</mark>百度百科</a>
</h2>
<p>
万维网的核心语言标准通用标记语言的一个应用超文本标记语言
(<mark>HTML</mark>)的第五次重大修改...
</p>
</article>
</section>
</body>
</html>
17.progress元素
4、新增的progress元素
progress元素代表一个任务的完成进度,这个进度可以使不确定的,表示进度z正在进行,
但不清楚这个还有多少工作量没有完成,也可以用0到某个最大数字(比如100)之间的s数字来表示准确的进度情况(比如百分比)
该元素具有两个表示当前任务完成情路昂的属性,
value属性表示已经完成了多少工作量,max属性表示总共有多少工作量。工作量的单位是随意的,不指定的。
在设定属性点时候,value属性和max属性只能指定为有效的浮点数,
value属性必须大于0,且小于或等于max的属性,max的属性必须大于0。
<p>
完成进度:
<progress max="100" value="85"></progress>
</p>
18.meter元素
5、新增的meter元素
meter元素表示规定范围内的数量值。
meter元素有6个属性!
1、value属性:在元素中特地地表示出来的实际值。该属性值默认为0,可以为该属性制定一个浮点小数值。
2、min属性:指定规定范围时允许实用的最小值,默认0,在设定该属性时所设定的值不能小于0。
3、max属性:指定规定的范围时允许使用的最大值,如果设定时该属性值小于min的值,那么把min属性的值视为最大值。max属性的默认值1。
4、low属性:规定范围的下限值,必须小于或者等于high的值。
5、high属性:规定范围的上限值。如果该属性值小于low属性的值,那么把low属性的值视为high属性的值,同样如果该属性的值大于max属性的值,那么把max属性的值视为high的值。
6、optimum属性:最佳值属性值必须在min属性值与max属性值之间,可以大于high属性值。
low high optimum 结合控制颜色 绿黄红
<p>
Disk:
<meter value="43.9" max="119" min="0" low="50" high="70" optimum="51">*/119</meter>
</p>
19.html5废除的元素
2、废除元素 search html5废除的元素
<p>
1、能使用CSS代替的元素:
basefont、big、center、font、s、strike、tt、u
2、不在使用frame框架
对于frameset元素、frame元素与noframes元素,由于frame框架对页面可用性存在负面影响,在html5里面已经不支持frame框架,只支持iframe框架,同时废除以上这三个元素。
3、只有部分浏览器支持的元素
对于applet元素、bgsound、blink、marquee元素,由于只有部分浏览器支持这些元素,特别是bgsound元素以及marquee元素,只被IE浏览器支持,所以在HTML5里面被废除!而applet元素可以由embed元素或者object元素代替,bgsound元素由audio元素代替,marquee可以使用javascript来代替!
4、其他被废除的元素
A、废除rb元素,使用ruby元素代替
B、废除acronym元素,使用abbr元素代替
C、废除dir元素,使用ul元素代替
D、废除inindex元素,使用form元素与input元素相结合的方式代替
E、废除listing元素,使用pre元素代替
F、废除xmp元素,使用code元素代替
G、废除nextid元素,使用GUIDS代替
H、废除plaintext元素,使用“text/plian” MIME类型代替
</p>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
p span{font-size:19px;}
</style>
</head>
<body>
<p><big>大</big></p>
<p><span>>大</span></p>
</body>
</html>
20.HTML5的大纲(上)
3、Html5大纲
1、HTML5大纲上
1、在HTML5中,可以使用之前我们所学习的结构元素来编排一份网页大纲,那样我们就可以通过这个网页大纲来了解网页中具有那些内容,网页中以什么样的形式来组织这些内容有更清楚的认识。
2、HTML5大纲分析工具
http://gsnedders.html5.org/outliner
3、分析一个网页的大纲!
找到出现 Untitled Section 的原因并解决!
4、header元素可以做大纲吗?加h1-6 不是生成大纲的
5、在header元素中用图片来生成大纲的方法!加h1-6
6、关于nav元素和aside元素。应许出现 Untitled Section合理的
1.HTML5部分
1.HTML5的大纲(上)
1.什么是HTML5大纲
2.HTML5大纲分析工具
3.分析一个网页的大纲
2.HTML5的大纲(下)
1.显示编排
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h1>HTML5+CSS3</h1>
<header>
<h1>HTML5+CSS3</h1>
<h1><img src="/" alt="大纲"></h1>
</header>
<section>
<h1>HTML部分</h1>
<section>
<h2>HTML5的大纲(上)</h2>
<section>
<h3>什么是HTML5大纲</h3>
<p>内容</p>
</section>
<section>
<h3>HTML5大纲分析工具</h3>
<p>内容</p>
</section>
<section>
<h3>分析一个网页的大纲</h3>
<p>内容</p>
</section>
</section>
<section>
<h2>HTML5的大纲(下)</h2>
<section>
<h3>显示编排</h3>
<p>内容</p>
</section>
</section>
</section>
<footer>
<h1>版权信息</h1>
</footer>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h1>关于nav和aside元素</h1>
<nav>
<ul>
<li><a href="/">xxx</a></li>
<li><a href="/">xxx</a></li>
</ul>
</nav>
<aside>
侧边栏信息
</aside>
</body>
</html>
21.HTML5的大纲(下)
3、Html5大纲
2、HTML5大纲下
大纲的编排规则
关于HTML的大纲编排,我们可以划分为“显式编排”和“隐式编排”两种方式。
1、显式编排
显式编排是指明确使用section元素进行分块来创建网页文档,每个内容区块内使用标题(h1~h6)
2、隐式编排
所谓的隐式编排,就是我们不使用section元素进行明确的区块划分,而是根据我们写的(h1-h6、hgroup等)元素进行自动创建区块,因为HTML5的分析器可以根据不同级别的标题判断出对应的内容区块。
3、标题分级
不同的标题有不同的级别,在(h1-h6)中h1的级别最高,而h6的级别最低。所以在隐式编排的情况下就会按照以下规则生成!
1)、如果出现新的标题比上一个标题级别低,那么将生成下级内容区块!
2)、如果新出现的标题比上面出现的一个标题级别高,或者两者级别相同,那么就生成新的内容区块!
4、不同的内容区块可以使用相同级别的标题
父内容区块与子内容区块都可以使用相同级别的H1标题
hgroup公用一个文章标题
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h1>显示编排</h1>
<p>介绍</p>
<section>
<h2>区块A</h2>
<p>内容</p>
</section>
<section>
<h2>区块B</h2>
<p>内容</p>
</section>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h1>隐式编排</h1>
<p>隐式编排</p>
<h2>子目录A</h2>
<p>子目录</p>
<h2>子目录B</h2>
<p>子目录</p>
<h3>子子目录A</h3>
<p>子子目录</p>
<h3>子子目录B</h3>
<p>子子目录</p>
<h1>隐式编排方法</h1>
<p>隐式编排方法</p>
<h2>子隐式编排方法</h2>
<p>子隐式编排方法</p>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h1>网页的标题</h1>
<article>
<header>
<hgroup>
<h1>文章标题</h1>
<h2>文章的子标题</h2>
</hgroup>
<p>文章正文</p>
</header>
</article>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<header>
<h1>网页大纲编写实战</h1>
<nav>
<ul>
<li><a href="/">首页</a></li>
<li><a href="/">内容</a></li>
<li><a href="/">联系</a></li>
</ul>
</nav>
</header>
<article>
<hgroup>
<h1>文章主标题</h1>
<h2>文章子标题</h2>
</hgroup>
<p>文章正文</p>
<section>
<h1>文章评论列表:</h1>
<article>
<h1>评论标题A</h1>
<p>评论内容A</p>
</article>
<article>
<h1>评论标题B</h1>
<p>评论内容B</p>
</article>
</section>
</article>
<footer>
<small>版权所有</small>
</footer>
</body>
</html>
22.加强版的ol列表元素
3、加强版的ol与dl
1、ol的start属性和reversed属性
1、可以通过start属性来定义标号的开始值。
2、可以通过reversed属性来进行反向编号。单属性 ie11无反应
value=""<li>有value无效果
全部type倒数过头就0到负数
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<ol start="1" type="A" reversed="reversed">
<li><a href="/">列表A</a></li>
<li><a href="/">列表B</a></li>
<li><a href="/">列表C</a></li>
<li><a href="/">列表D</a></li>
<li><a href="/">列表E</a></li>
<li><a href="/">列表F</a></li>
<li><a href="/">列表G</a></li>
</ol>
</body>
</html>
23.重新定义后的dl元素
3、加强版的ol与dl
2、重新定义含义的dl元素
dl元素在HTML4中:
dl元素在HTML4中,是一个专门用来定义术语的列表。
dl元素在HTML5中:
dl元素在HTML5中,把dl元素进行了重定义。
每一项包含一条或者多条带名字的dt元素,用来表示术语,
dt元素后面紧跟一个或者多个dd元素,用来表示定义。
重定义后的dl列表包含多个带名字的列表项。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
</head>
<body>
<h3>介绍</h3>
<article>
<h1>HTML5+CSS3</h1>
<p>内容</p>
<aside>
<h2>术语解释:</h2>
<dl>
<dt>HTML5</dt>
<dd>html5是超文本标记语言</dd>
<dt>CSS3</dt>
<dd>CSS3是层叠式样式表</dd>
</dl>
</aside>
</article>
</body>
</html>
24.canvas元素创建画布
3、初识CANVAS
1、简单了解canvas
什么是canvsa?
canvas是在html5中新增的一个重要元素,专门用来绘制图形。
1、创建一个canvas画布
画布的创建方法:指定id、width(画布宽度)、height(画布高度)。
例如:<canvas id="canvas" width="500" height="350"></canvas>
上面这个实例的意思就是,创建一个画布,长度为500,高度为350.
2、引入绘画脚本
引入脚本的方法:
比如:<script type="text/javascript" src="canvas.js" charset="utf-8"></script>
上面这个实例的意思就是:引入一个名为canvas的JS脚本,JS脚本的语言编码是utf-8
3、使用draw函数进行绘画
在body的属性里面,使用onload="draw('canvas');"语句。
调用脚本文件中的draw函数进行图形绘画。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas');">
<canvas id="canvas" width="500" height="350"></canvas>
</body>
</html>
25.canvas绘制矩形
3、初识CANVAS
2、绘制一个矩形
本课目标
1、获取canvas元素
用getElementById方法获取到canvas对象。
2、取得上下文
在绘制图形的时候要用到图形上下文,图形上下文是一个封装了很多绘图功能的对象。
要使用canvas对象的getContext() 方法获得图形上下文。在draw函数中把参数设置为“2d”。
3、填充与会绘制边框
canvas绘制有两种方法:
1)、填充(fill)
填充是将图形内部填满。
2)、绘制边框(stroke)
绘制边框是不把图形内部填满,只是绘制图形的外框。
4、设置绘制样式
当我们在绘制图形的时候,首先要设定好绘制的样式,然后我们就可以调用有关的方法进行绘制。
1)、fillStyle属性
填充的样式,在这个属性里面设置填入的填充颜色值。
2)、strokeStyle属性
图形边框的样式,在这个属性里面设置填入边框的填充颜色。
5、指定画笔宽度
通过对上下文对象(context)的lineWidth属性来设置图形边框的宽度,
任何直线的宽度都是可以通过lineWidth来设置直线的宽度的。
6、设置颜色值
绘制图形的时候要填充的颜色或者边框分别可以通过fillStyle属性和strokeStyle属性来指定。
颜色的值可以使用
16进制的颜色值(#000000)
颜色名(black)
rgb(rgba(0,0,0))
rgba(rgba(0,0,0,0.1))
7、绘制矩形
使用fillRect方法和strokeRect方法来填充矩形和绘制矩形的边框。
context.fillRect(x,y,width,height)
context.strokeRect(x,y,width,height)
这两种方法的参数都是一样的,
X是指矩形的起点横坐标,y是指矩形的纵坐标,
坐标的原点是canvas画布的最左上角,width是指矩形的长度,height是指矩形的高度。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas');">
<canvas id="canvas" width="400" height="300"></canvas>
</body>
</html>
js区别大小写 最后可以不用;
canvas.js
function draw(id){
var canvas=document.getElementById(id);
var context=canvas.getContext('2d');
context.fillStyle="#000";
context.strokeStyle="#f60";
context.lineWidth=5;
context.fillRect(0,0,400,300);
context.strokeRect(30,50,200,200);
context.strokeRect(60,100,200,200);
}
26.canvas绘制圆形
3、绘制一个圆形
1、开始创建路径
使用图形上下文对象的beginPath方法。
context.beginPath();
2、创建图形路径
创建圆形路径时,需要使用图形上下文对象的arc方法。
context.arc(x,y,radius,starAngle,endAngle,anticlockwise)
布尔类型 true false anticlockwise
x是绘制圆形的起点横坐标,y是绘制圆形起点的纵坐标,radius是圆形的半径,starAngle是开始的角度,endAngle是结束的角度,anticlockwise是否按顺时针方向绘制。
绘制半径与圆弧时指定参数为开始弧度与结束弧度,如果你喜欢使用角度,可以使用以下这个方法,把角度换成弧度。
var radius = degrees*Math.PI/180
这个里面的Math.PI表示的角度是180度,Math.PI*2的角度是360度。
3、创建完成关闭路径
使用图形上下文对象的closePath方法将路径关闭。
context.closepath();
4、设置绘制样式然后调用绘制方法进行绘制
context.fillStyle = 'rgba(255,0,0,0.25)';
context.fill();
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas');">
<canvas id="canvas" width="400" height="400"></canvas>
</body>
</html>
js注释是//
function draw(id){
var canvas=document.getElementById(id);
var context=canvas.getContext('2d');
context.fillStyle="#f1f2f3";
context.fillRect=(0,0,400,400);
for(var i=0;i<10;i++){
context.beginPath();
context.arc(i*25,i*25,i*10,0,Math.PI*2,true);
context.closePath();
context.fillStyle="rgba(255,0,0,0.25)";
context.fill();
context.strokeStyle="red";
context.stroke();
}
}
context的beginPath和closePath 没有就会重新在原来画开始 rgba透明度叠加到不透明
27.canvas绘制文字
4、绘制文字
课后目标
绘制字体时可以使用fillText方法或者strokeText方法。
fillText方法用填充的方式来绘制字符串;
context.fillText(text,x,y,[maxwidth]);
strokeText方法用轮廓的方式来绘制字符串;
context.strokeText(text,x,y,[maxwidth]);
第一个参数text表示要绘制的文字,
第二个参数X表示要绘制的文字的起点横坐标,
第三个参数Y表示要绘制的文字的起点纵坐标,
第4个参数maxwidth为可选参数,表示显示文字的时候最大的宽度,可以防止文字溢出。
maxwidth画布大小.
1、设置文字字体
context.font = "font-weight font-size font-family ";
context.font有三个参数,第一个参数font-weight
值 描述
normal 默认值.定义标准的字符
bold 定义粗体字符
bolder 定义更粗的字符
lighter 定义更细的字符
100-900整百 定义由粗到细的字符 400等于normal 而700等于bold
第二个参数font-size规定文本的字体尺寸px
第三个参数font-family 规定文本的字体系列
font-family 可以的值是'ariSDal','arial','宋体','微软雅黑'...等等任何字体。
2、设置文字垂直对齐方式
context.textBaseline = 'alphabetic';
属性值可以是top(顶部对齐)、hanging(悬挂)、
middle(中间对齐)、、bottom(底部对齐)、alphabetic是默认值。
top顶部下点 hanging刚好顶部 middle中间显示一半
bottom顶部之上 alphabetic顶部上和五线谱一样
3、设置文字水平对齐方式
conText.textAlign = "start"
属性值可以设置为:start、end、left、right、center。
左边:end right
中间:center
右边:start left
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas')">
<canvas id="canvas" width="800" height="300"></canvas>
</body>
</html>
function draw(id){
var canvas=document.getElementById(id);
var context=canvas.getContext('2d');
context.fillStyle='green';
context.fillRect(0,0,800,300);
context.fillStyle='#fff';
context.strokeStyle='#fff';
context.font="bold 40px '微软雅黑','宋体'";
context.textBaseline='hanging';
//context.textAlign='start';
context.fillText('This is a Text',0,0);
context.fillText('787646564545456This is a Text4641111111111111881111111',
0,210,800);
//context.strokeText('This is a Text',0,40);
}
28.canvas保存文件
5、保存文件
很多时候绘制完成的图片需要保存,那么我们就可以使用到Canvas API来完成这最后一步!
Canvas API使用toDataURL方法把绘画的状态输出到一个 data URL中然后重新装载,然后我们就可以把重新装载后的文件直接保存。
Canvas API保存文件的原理实际上就是把我们绘画的状态动态输出到一个data URL地址所指向的数据中的过程。
什么是data URL ?
data URL实际上就是base64位编码的URL,主要用于小型的,可以在网页中直接嵌入,而不需要从外部嵌入数据,比如img元素里面的图像文件。
data URL的格式 “data:image/jpeg;base64,/9j/4...”
toDataURL的使用方法
canvas.toDataURL(type);
这个方法使用一个参数type,表述输出数据的MIME类型。
什么是MIME类型:
jpg image/jpeg
png image/png
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas')">
<canvas id="canvas" width="300" height="300"></canvas>
</body>
</html>
function draw(id){
var canvas=document.getElementById(id);
var context=canvas.getContext('2d');
context.fillStyle="green";
context.fillRect(0,0,300,300);
window.location=canvas.toDataURL('image/jpeg');
}
29.canvas绘制动画
6、canvas小示例
在canvas画布中制作动画相对来说很简单,实际上就是不断变化坐标、擦除、重绘、的过程。
1、使用setInterval 方法设置动画的间隔时间。
setInterval(code,millisec)
setInterval方法html中固有方法,这个方法接受两个参数,第一个函数表示执行动画的函数,第二个参数为间隔时间,单位是(毫秒)。
100毫秒 1000=1秒
2、用来绘图的函数
1)、通过不断的变换X和Y的坐标来实现动画效果。
2)、在该函数中先用clearRect方法将画布整体或者是局部擦除。
擦除图像clearRect方法:
context.fillRect(x,y,width,height);
x是指我们起点的横坐标,y是指我们起点的纵坐标,width是指擦子的长度,height是指擦子的高度。
/*
*
*/
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body onl oad="draw('canvas')">
<canvas id="canvas" width="400" height="400"></canvas>
</body>
</html>
js{
var context;
var width,height;
var i;
function draw(id){
var canvas=document.getElementById(id);
context=canvas.getContext('2d');
width=canvas.width;
height=canvas.height;
setInterval(painting,10);
i=0;
}
function painting(){
// context.fillStyle="green";
// context.fillRect(i,i,10,10);
// context.fillRect(i,0,10,10);
// context.fillRect(400-i,400-i,10,10);
// context.fillRect(0,400-i,10,10);
context.fillStyle="green";
context.fillRect(0,0,width,height);
context.clearRect(10,10,width,height);
context.fillStyle="green";
context.fillRect(i,20,10,10);
i++;
}
}
30.Web Storage本地储存
4、本地储存
1、Web Storsge
在HTML5中,除了CANVAS元素,另外一个新增的非常重要功能就是可以在本地客户端储存数据的Web Storage功能。
在HTML4 我们是使用的cookies在客户端保存用户名等等一些简单的用户信息。
cookies的缺点:
1)、大小限制在4KB;
2)、带宽浪费;
3)、难以操作;
为了解决这样的一些问题,在HTML5中重新提供了在客户端保存数据的功能,他就是我们的“Web Storage”。
这个小章节我们来简单了解,sessionStorage和localStorage之间的区别,掌握两者的基本用法。
1、sessionStorage临时保存
就是把数据保存在session对象之中。
session就是在打开网站到关闭网站之间要求进行保存的数据。
sessionStorage
临时保存的用法:
sessionStorage.setItem('key','value');
//或者是sessionStorage.key = 'value';
临时数据读取的方法:
变量=sessionStorage.getItem('key')
//或者是sessionStorage.key;
2、localStorage永久保存
就是将数据保存在客户端本地的硬件设备至上面,如果浏览器被关闭,这个数据不会丢失,下次打开可以继续使用。这个功能就是我们的localStorage永久保存功能。
localStorage
永久保存数据的方法:
localStorage.setItem('key','value');
//或者
localstorage.key;
读取的方法:
变量=localStorage.getItem('key');
//或者
变量=localStorage.key;
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body>
<h1>Web Storage本地储存</h1>
<p id="msg"></p>
<input type="text" id="input">
<input type="button" value="保存数据" onclick="saveStorage('input');">
<input type="button" value="读取数据" onclick="loadStorage('msg');">
</body>
</html>
js{
function saveStorage(id){
var target=document.getElementById(id);
var str=target.value;
sessionStorage.setItem("mess",str);
}
function loadStorage(id){
var target=document.getElementById(id);
var msg=sessionStorage.getItem("mess");
target.innerHTML=msg;
}
}
js{
function saveStorage(id){
var target=document.getElementById(id);
var str=target.value;
localStorage.setItem("mess",str);
}
function loadStorage(id){
var target=document.getElementById(id);
var msg=localStorage.getItem("mess");
target.innerHTML=msg;
}
}
target.innerHTML=msg; html固语输出
审查元素 performmance看看
31.简单的网页留言板
4、本地储存
2、实战简单的访客留言板
制作留言板需要使用到的函数有3个
1、saveStorage函数
使用“new Date().getTime()”语句来获取当前的日期和时间戳,然后使用localStorage.setItem将获取到的时间戳作为键值,并将文本框中的数据作为键名进行保存。保存后使用loadStorage函数在页面上显示保存后的数据。
2、loadStorage函数
这个函数取得保存后的所有数据,然后以表格的形式进行显示。
两个重要的属性:
1)、loadStorage.length
所有保存在localStorage中的数据条数。
2)、localStorage.key(index)
想要得到的数据的索引号作为index参数传入,可以得到得到localStorage中与这个索引号对应的数据。
3)、clearStorage函数
将保存在localStorage中的数据全部清除。
用法:localStorage.clear();
将时间戳转换为带格式的字符串进行输出 date.toGMTString();
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="canvas.js"></script>
</head>
<body>
<h1>简单的留言板</h1>
<textarea id="dome" cols="60" rows="10"></textarea>
<br>
<input type="button" value="保存" onclick="saveStorage('dome');">
<input type="button" value="清除" onclick="clearStorage('msg');">
<input type="button" value="读取" onclick="loadStorage('msg');">
<hr>
<p id="msg"></p>
</body>
</html>
js{
function saveStorage(id){
var data=document.getElementById(id).value;
var time=new Date().getTime();
localStorage.setItem(time,data);
alert("数据已经被保存!");
loadStorage('msg');
}
function loadStorage(id){
var reselt='<table border="1">';
for(var i=0;i<localStorage.length;i++){
var key=localStorage.key(i);
var value=localStorage.getItem(key);
var date=new Date();
date.setTime(key);
var datestr=date.toGMTString();
reselt +='<tr><td>'+'这是第'+i+'条数据</td><td>'
+value+'</td><td>'+datestr+'</td></tr>';
}
reselt += '</table>';
var target=document.getElementById(id);
target.innerHTML=reselt;
}
function clearStorage(id){
localStorage.clear();
alert("数据清空");
loadStorage('msg');
}
}
32.video元素与audio元素
5、影音多媒体
video元素与audio元素
v丢 唉丢
1、video元素与audio元素的基础知识
video元素
--在HTML5中专门用来播放网络上的视频或者电影。
audio元素
--在HTML5中专门用来播放网络上的音频。
使用video和audio元素进行播放时就不在需要使用其他的插件了,只要我们的浏览器支持HTML5就可以了!
浏览器的支持:
Safari3以上、Firefox4以上、0pera10以上、chrome3.0以上版本都对audio元素和video元素支持!
使用方法
audio元素只需要给他指定一个src属性:
<audio src="MP3.mp3" controls="controls"></audio>
对于不支持的浏览器我们可以在这对元素之间加入提示语句来代替
<audio src="MP3.mp3" controls="controls">您的浏览器不支持Audio元素</audio>
video元素要设定好长宽和src属性就可以了:
<video width="750" height="400" src="time.mp4"></video>
同样对于不支持video的浏览器可以在中间加入替换文字:
<video width="750" height="400" src="time.mp4">您的浏览器不支持video元素</video>
source元素指定多个播放格式与编码:
source元素可以为同一个媒体数据指定多个播放格式与编码方式,以确保浏览器可以从中选择一种自己支持的播放格式进行播放。选择顺序自上而下,直到选择到所支持的格式为止。
使用方法:
<video>
<source src="video.m4v" type="video/mp4" />
<source src="video.webm" type="video/webm" />
<source src="video.ogv" type="video/ogg" />
<source src="video.mp4" />
</video>
不加type也可以 但是会下载一点来判断什么格式播放 最好加 占带宽
各种设备对编码格式的支持情况:
webm(.webm)格式的视频 火狐4.0+、chrome6.0+、opera10.6+
mp4(.m4v)格式的视频 IE9.0+ 、Safari3.1+ 、iso5.0 、Android4.0+
ogg(.ogv)格式的视频 火狐3.5+、chrome3.0+、opera10.5+
mp4(.mp4)格式的视频 IE9.0+ 、Safari3.1+ 、iso3.0 、Android2.3+
<audio src="./data/MP3.mp3" controls="controls">不支持</audio>
<hr>
<video src="./data/video.mp4" width="650" height="280" controls="controls">不支持</video>
33.video元素与audio元素的常用属性
5、影音多媒体
video元素与audio元素
2.viedo与audio的常用属性
audio元素和video元素的常用属性
src属性:
在这个属性里面指定媒体数据的URL地址。
controls属性:
指定是否为视频或者音频数据添加浏览器自带的播放控制条,控制条中有播放按钮、暂停等按钮。
使用方法:
<video src="video.mp4" controls="controls"></video>
width和height属性(video独有):
指定视频的宽度与高度。
使用方法:
<video src="video.mp4" width="650" height="450"></video>
autoplay属性:autoplay="autoplay" 单属性
这个属性指定是否当我们网页加载完成之后就开始自动播放。
preload属性:
这个属性指定是否对数据进行预加载,如果是的话,浏览器会将视频数据或者音频数据进行缓冲,这样做可以加快播放的速度。
preload属性的三个值:
none 表示不进行预加载。
metadata 表示只预加载媒体的元数据。
auto(默认值) 表示预加载全部的视频或者音频。
使用方法:
<video src="video.mp4" preload="auto" ></video>
poster属性(video独有):
当视频不可以播放的时候,使用poster元素向用户展示一张图片代替视频。
使用方法:
<video src="video.mp4" poster="video.jpg"></video>
loop属性:
指定是否循环播放视频或者音频数据。
使用方法:
<video src="video.mp4" autoplay="auto" loop="loop"></video>
error属性:
读取过程中一旦发生错误,返回一个Media Error对象,这个对象的code返回对应的错误状态,默认情况下video和audio的error属性都是null。
4种错误状态,返回一个数字值,它表示音频/视频的错误状态:
1 = MEDIA_ERR_ABORTED - 取回过程被用户中止
2 = MEDIA_ERR_NETWORK - 当下载时发生错误
3 = MEDIA_ERR_DECODE - 当解码时发生错误
4 = MEDIA_ERR_SRC_NOT_SUPPORTED - 媒体不可用或者不支持音频/视频
读取错误状态示例
<video id="video" src="video.mp4"></video>
<script type="text/javascript">
var video = document.getElementById('video');
video.addEventListener("error",function(){
var error = video.error;
switch (error.code){
case 1:
alert('取回过程被用户中止。');
break;
case 2:
alert('当下载时发生错误。');
break;
case 3:
alert('当解码时发生错误。');
break;
case 4:
alert('媒体不可用或者不支持音频/视频。');
break;
}
},false);
</script>
networkState属性:
networkState 属性返回音频/视频的当前网络状态(activity)
4种错误状态,表示音频/视频元素的当前网络状态:
0 = NETWORK_EMPTY - 音频/视频尚未初始化
1 = NETWORK_IDLE - 音频/视频是活动的且已选取资源,但并未使用网络
2 = NETWORK_LOADING - 浏览器正在下载数据
3 = NETWORK_NO_SOURCE - 未找到音频/视频来源
networkState属性:
networkState 属性返回音频/视频的当前网络状态(activity)
3、video与audio的4种方法
video元素和audio元素的4种方法
play方法:
使用play方法来播放媒体,自动将元素的paused属性的值变成false。
pause方法:
使用pause方法来暂停播放,自动将元素的paused属性的值变成true。
load方法:
使用load方法来重新载入媒体进行播放,自动将元素的playbackRate属性的值变成defaultPlaybackRate属性的值,自动把error的值变成null。
canPlayType方法:
使用canPlayType方法来测试浏览器是否支持指定的媒体类型。
使用方法如下:
var support = videoElment.canPlayType(type);
canPlayType() 方法可返回下列值之一:
"probably" - 浏览器最可能支持该音频/视频类型
"maybe" - 浏览器也许支持该音频/视频类型
"" - (空字符串)浏览器不支持该音频/视频类型
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{
margin:0;
padding:0;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<hr>
<audio loop="loop" preload="auto" src="./data/MP3.mp3" controls="controls">不支持</audio>
<hr>
<video id="video" poster="./data/1.jpg" src="./data/video.mp4" width="650" height="280" controls="controls">
<source src="video.mp4" type="video/mp4">
</video>
<script type="text/javascript">
var video=document.getElementById('video');
video.addEventListener("error",function(){
var error=video.error;
switch(error.code){
case 1:alert('取回过程被用户终止.');break;
case 2:alert('当下载时发生错误.');break;
case 3:alert('当解码时发生错误.');break;
case 4:alert('媒体不可用或者不支持音频/视频.');break;
}
},false);
</script>
</body>
</html>
34.HTML5拖放
6、HTML5拖放API
1、拖放的步骤
1、对象元素的draggable属性设置为true(draggable="true")。
还需要注意的是a元素和img元素必须指定href。
2、编写与拖放有关的事件处理代码。
事件产生事件的元素描述dragstart被拖放的元素
开始拖放操作drag被拖放的元素拖放过程中dragenter拖放过程中鼠标经过的元素
被拖放的元素开始进入本元素的范围之内dragover拖放过程中鼠标经过的元素被拖放的元素
正在本元素范围内移动dragleave拖放过程中鼠标经过的元素被拖放的元素
离开本元素的范围drop拖放的目标元素其他元素被拖放到了
本元素中dragend拖放的对象元素拖放操作结束
2、DataTransfer对象的属性与方法
DataTransfer对象的属性和方法属性/方法描述dropEffect属性表示拖放操作的视觉效果,
允许设置其值,这个效果必须用在effectAllowed属性指定的允许的视觉效果的范围内,
允许指定的值none、copy、link、moveeffectAllowed属性
用来指定当元素被拖放时所允许的视觉效果,
可以指定的值copy、link 、move、copylink 、linkmove、all、none、uninitializedtypes属性存入数据的种类,
字符串的伪数组void clearData(DOMString format)方法清除DataTransfer对象中存放的数据,
如果省略掉参数format就会清除全部数据。
void steData(DOMString format,DOMStrong data)
向DataTransfer对象中存入数据DOMString getData(DOMString format)
从DataTransfer对象中读取数据void setDragImage(Element image,long x,long y)用img元素来设置拖放图标
clearData方法可以用于清除DataTransfer对象中的数据。
3、拖放的时的效果
设置拖放时的视觉效果
dropEffect属性与effectAllowed属性结合起来可以设定拖放时的视觉效果。
effectAllowed属性表示一个元素被拖放时所允许的视觉效果,
一般在ondragstart事件中设定,他的值如下:
属性值说明copy允许被拖动的元素被复制到项目中move允许将被拖动元素移动到被拖动的目标元素中link通过拖放操作,
被拖动的元素会连接到拖到的目标元素上copylink被拖动元素被复制或链接到拖动的目标元素中,
根据拖动的目标元素来决定执行复制操作还是链接操作copyMove被拖动元素复制或移动到拖到的目标元素中,
根据被拖动的目标元素来决定复制操作还是移动操作linkmove被拖动元素被连接或移动到拖动的目标元素中,
根据拖动的目标元素来决定执行链接操作还是移动操作all允许执行所有拖动操作none不允许执行任何拖动操作uninyialize不指定effectAllowed属性值。
这是将执行浏览器中默认允许的拖动操作,但是这个操作不能通过effectAllowed属性值来获取
dropEffect属性表示实际拖放时的视觉效果,
一般在ondragover事件中指定,允许的值none、copy、link、move。
有源代码
照打少记录
有文档图片
会
不重要大 反
有备份del
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script>
function allowDrop(ev)
{
//不执行默认处理(拒绝被拖放)
ev.preventDefault();
ev.dataTransfer.dropEffect = 'link'
}
function drag(ev)
{
// 使用setData(数据类型,携带的数据)
// 方法将要拖放的数据存入dataTransfer对象
// ev.clearData();
ev.effectAllowed = 'all';
ev.dataTransfer.setData("Text",ev.target.id);
}
function drop(ev)
{
//不执行默认处理(拒绝被拖放)
ev.preventDefault();
//使用getData()获取到数据,然后赋值给data
var data=ev.dataTransfer.getData("Text");
//使用appendChild方法把拖动的节点放到元素节点中成为他的子节点
ev.target.appendChild(document.getElementById(data));
}
</script>
<style>
#tuo{
background: #e54d26;
width: 540px;
height: 320px;
}
#cun{
width: 540px;
height: 320px;
border: 2px solid #D2D2D2;
box-shadow: 1px 4px 8px #646464;
}
</style>
</head>
<body>
<div id="cun" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<br/>
<img src="html5.png" id="tuo" draggable="true" ondragstart="drag(event)" width="500" height="280" / >
</body>
</html>
ondragstart开始拖动
Datatransfer data纯色佛
35.CSS3简介
第三讲、CSS简介
1、CSS3介绍
什么是CSS3?
CSS3是CSS技术的升级版本,CSS即层叠样式表(Cascading StyleSheet)。
在网页制作时采用层叠样式表技术,
可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。
只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,
或者页数不同的网页的外观和格式。
2、css3可以做什么
CSS3是CSS技术的升级版本,CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞大而且比较复杂,所以,把它分解为一些小的模块,更多新的模块也被加入进来。
这些模块包括:
盒子模型
文字特效
边框圆角
盒阴影
旋转
渐变
... ...
36.CSS3新增的属性选择器
第四讲:超级选择器
什么是选择器:
使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器。选择器是CSS3中一个重要的内容,使用CSS选择器可以大幅度提高开发人员的编写或者修改页面样式的时候的工作效率。每一条css样式定义由两部分组成,形式如下:
选择器{样式}
在{}之前的部分就是“选择器”。 “选择器”指明了{}中的“样式”的作用对象,也就是“样式”作用于网页中的哪些元素。
课后目标:
掌握CSS3中使用的选择器的基本概念,知道什么是选择器以及为什么需要使用选择器。
1、属性选择器
CSS3中的属性选择器:
在CSS中追加了三个属性选择器:[att*=val]、[att^=val]和[att$=val]
[att*=val]属性选择器
如果元素用att表示的属性的值中包含用val指定的字符,那么该元素使用这个样式。
[att^=val]属性选择器
如果用att表示的属性的属性值的开头字符为用val指定的字符的话,那么该元素使用这个值。
[att$=val]属性选择器
如果元素用att表示的属性的属性值的结尾字符为用val指定的字符,那么该元素使用这个样式。
小案例
- - 灵活使用属性选择器:
[id$=\-1]{加\数字前面有-连接符 _可以显示也可以加}
a是元素,表示选择a元素的href属性进行选择
a[href$=尾字符]{样式}
:after追加 content文字
a[href$=html]:after{
content:"网页文件";
color:green;
}
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
[id*=section1-1]{
background:green;
}
[id*=section2]{
background:#f60;
}
[id^=s]{
background:red;
}
[id$=a]{
background:#000;
}
[id$=\-1]{
background:blue;
}
[id$=\_2]{
background:#f70;
}
a[href$=html]:after{
content:"网页文件";
color:green;
}
a[href$=png]:after{
content:"图片文件";
color:green;
}
</style>
<script type="text/javascript" src="demo.js">
</script>
</head>
<body>
<h1>CSS3中的属性选择器</h1>
<div id="section1">section1</div>
<div id="section1-1">section1-1</div>
<div id="section1-1-1">section1-1-1</div>
<div id="section1-1-2">section1-1-2</div>
<div id="bection1-2">section1-2</div>
<div id="section1-2-1">section1-2-1</div>
<div id="section2">section2</div>
<div id="section2-1a">section2-1</div>
<div id="section2-2">section2-2</div>
<div id="section2_2">section2-2</div>
<div id="section2_2">section2-2</div>
<a href="demo.html">Index</a>
<a href="./data/html5.png">Image</a>
</body>
</html>
学了不重要备份del
37.结构性伪类选择器上
38.结构性伪类选择器下
第四讲:超级选择器
2、结构性伪类选择器
<p>
伪类选择器以及伪元素:
1、类选择器
在css中可以使用类选择器把相同的元素定义成不同的样式。比如:
p.left{text-align: left}
p.rigth{text-align: right}
2、伪类选择器
类选择器和伪类选择器的区别在于,类选择器我们可以随意起名,而伪类选择器是CSS中已经定义好的选择器,不可以随意起名。
最常见的伪类选择器
a:link{ color: #ff6600 } /* 未被访问的链接 */
a:visited{ color: #87b291 } /* 已被访问的链接 */
a:hover{ color: #6535b2 } /* 鼠标指针移动到链接上 */
a:active{ color: #55b28e } /* 正在被点击的链接 */
3、伪元素选择器
伪元素选择器,针对于CSS中已经定义好的伪元素使用的选择器。
使用方法:
选择器:伪元素{属性:值}
与类配合使用
选择器.类名:伪元素{属性:值}
4、在CSS中,主要有四个伪元素选择器。
1)、first-line伪元素选择器
first-line伪元素选择器用于向某个元素中的第一行文字使用样式。
2)、first-letter伪元素选择器
first-letter伪元素选择器用于向某个元素中的文字的首字母(欧美文字)或第一个字(中文或者是日文等汉字)使用样式。
3)、before伪元素选择器
before伪元素选择器用于在某个元素之前插入一些内容。
4)、after伪元素选择器
after伪元素选择器用于在某个元素之后插入内容。
5、结构性伪类选择器root、not、empty和target
1)、root选择器
root选择器将样式绑定到页面的根元素中。
2)、not选择器
想对某个结构元素使用样式,但是想排除这个结构元素下面的子结构元素,让它不使用这个样式时,我们就可以使用not选择器。
3)、empty选择器
empty选择器指定当元素中内容为空白时使用的样式。
4)、target选择器
target选择器对页面中某个target元素指定样式,该样式只在用户点击了页面中的超链接,并且跳转到target元素后起作用。
6、选择器first-child、last-child、nth-child和nth-last-child
1)、first-child选择器
first-child单独指定第一个子元素的的样式。
2)、last-child选择器
last-child单独指定最后一个子元素的的样式。
3)、nth-child选择器
nth-child(n) 选择器匹配正数下来第 N 个子元素
nth-child(odd)选择器匹配正数下来第奇数个子元素
nth-child(even)选择器匹配正数下来第偶数个子元素
4)、nht-last-child选择器
nth-last-child(n) 选择器匹配倒数数下来第 N 个子元素
nth-last-child(odd)选择器匹配倒数数下来第奇数个子元素
nth-last-child(even)选择器匹配倒数下来第偶数个子元素
7、选择器nth-of-type和nth-last-of-type
1)、在使用nth-child和nth-last-child时产生的问题
在案例中指定奇数文章的标题背景为黄色,偶数文章的标题为绿色。 <div> <h2>标题</h2> <p>内容</p> <h2>标题</h2> <p>内容</p> <h2>标题</h2> <p>内容</p> <h2>标题</h2> <p>内容</p> ... ... </div>
h2 p都一起算了
2)、使用nth-of-type和nth-last-of-type
nth-of-type和nth-last-of-type在css3中就是用来避免上面这类问题的发生,在统计的时候就只针对同类型的子元素进行计算。
nth-of-type正数
nth-last-of-type倒数
兼容性:
nth-of-type和nth-last-of-type都是CSS3开始提供需要在IE8以上的浏览器才会被支持,Chrome浏览器、Firefox浏览器、Opera浏览器、Safari浏览器都支持!
8、循环使用样式
nth-child(An+B)A表示每次循环中共包括几种样式,B表示指定的样式在循环中所处的位置。
9、only-child选择器
only-child选择器,只对唯一的子元素起作用。
</p>
:root <html就是根元素之前的效果
body内容区域
body *:not(h1){background:#fff}排除
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
:root{background:#123fb0}
body *:not(h1){background:#fff}
:empty{background:#abc}
p.left{text-align:left;color:red;}
p.right{text-align:right;color:red;}
a:link{color:#000}
a:visited{color:red}
a:hover{color:blue}
a:active{color:yellow}
p:first-line{color:#f60}
p:first-letter{color:green;font-size:24px}
li{list-style:none}
li:before{content:'*'}
li:after{content:'##'}
:target{background:#000;color:#fff;}
</style>
<script type="text/javascript" src="demo.js">
</script>
</head>
<body>
<a href="#A">A</a>
<a href="#B">B</a>
<a href="#C">C</a>
<div id="A"><h2>标题</h2><p>内容...</p></div>
<div id="B"><h2>标题</h2><p>内容...</p></div>
<div id="C"><h2>标题</h2><p>内容...</p></div>
<h1>类选择器</h1>
<p class="left">left</p>
<p class="right">right</p>
<hr>
<a href="demo.html">Index</a>
<a href="demo1.html">Index</a>
<p>
在Css中,主要有4个伪元素选择器<br>
first-line伪元素选择器用于向某个元素中的第一行文字使用样式.
</p>
<ul>
<li><a href="demo.html">伪类选择器</a></li>
<li><a href="demo.html">伪类选择器</a></li>
<li><a href="demo.html">伪类选择器</a></li>
</ul>
<hr>
<table border="1" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td>1</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr>
</table>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
li:first-child{background:#f50}
li:last-child{background:red}
/*li:nth-child(3){background:green}
li:nth-child(odd){background:blue}
li:nth-child(even){background:yellow}*/
li:nth-last-child(2){background:blue}
li:nth-last-child(odd){background:green}
li:nth-last-child(even){background:#f60}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>选择器first-child,last-child,nth-child,nth-last-child-child</h1>
<ul>
<li>第一项目</li>
<li>第二项目</li>
<li>第三项目</li>
<li>第四项目</li>
<li>第五项目</li>
</ul>
</body>
</html>
An+B A循环样式次数 /2n B循环位置
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
li:nth-child(2n+1){background:green}
li:nth-child(2n+2){background:red}
li:only-child{background:yellow}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<ul>
<li>第一项目</li>
<!--<li>第一项目</li>-->
</ul>
<ul>
<li>第一项目</li>
<li>第二项目</li>
<li>第三项目</li>
<li>第四项目</li>
<li>第五项目</li>
<li>第六项目</li>
<li>第七项目</li>
<li>第八项目</li>
</ul>
</body>
</html>
child 吃ai d
39 40.UI元素状态伪类选择器上
第四讲:超级选择器
3、UI元素状态伪类选择器
<div>
UI元素状态伪类选择器
什么是UI选择器?
UI选择器的特征就是指定的样式只有当元素处于某种状态下时,才起作用,在默认状态下不起作用!E:hover支持firefox、safari、Opera、ie8、chromeE:active支持firefox、safari、Opera、chrome 不支持ie8E:focus支持firefox、safari、Opera、ie8、chromeE:enabled支持firefox、safari、Opera、chrome 不支持ie8E:disabled支持firefox、safari、Opera、chrome 不支持ie8E:read-only支持firefox、Opera 不支持ie8、safari、chromeE:read-write支持firefox、Opera 不支持ie8、safari、chromeE:checked支持firefox、safari、Opera、chrome 不支持ie8E::selection 支持firefox、safari、Opera、chrome 不支持ie8E:default只支持firefoxE:indeterminate只支持chromeE:invalid支持firefox、safari、Opera、chrome 不支持ie8E:valid支持firefox、safari、Opera、chrome不支持ie8E:required支持firefox、safari、Opera、chrome不支持ie8E:optional支持firefox、safari、Opera、chrome不支持ie8E:in-range支持firefox、safari、Opera、chrome不支持ie8E:out-of-rang支持firefox、safari、Opera、chrome不支持ie8
1、选择器E:hover、E:active和E:focus
1)、E:hover选择器被用来指定当鼠标指针移动到元素上时元素所使用的样式
使用方法:
*元素>:hover{
CSS样式
}
我们可以在“*元素>”中添加元素的type属性。
例:
input[type="text"]:hover{
CSS样式
}
2)、E:active选择器被用来指定元素被激活时使用的样式
3)、E:focus选择器被用来指定元素获得光标聚焦点使用的样式,主要是在文本框控件获得聚焦点并进行文字输入时使用。
4)、小案例:
结合上诉实现以下效果,当鼠标移动上去是文本框变成绿色,当鼠标点击时(点击并未谈起)文本框处于蓝色,当处于可输入状态时文本框变成橙色。
2、E:enabled伪类选择器与E:disabled伪类选择器
1)、E:enabled选择器被用来指定当元素处于可用状态时的样式。
2)、E:disabled选择器被用来指定当元素处于不可用状态时的样式。
3)、小案例:
结合上诉实现以下效果,文本框可用时背景颜色绿色,不可用时背景变成浅灰色。
3、E:read-only伪类选择器与E:read-write伪类选择器
1)、E:read-only选择器被用来指定当元素处于只读状态时的样式。
2)、E:read-write选择器被用来指定当元素处于非只读状态时的样式。
3)、小案例:
结合上诉实现以下效果,文本框可用时输入文字变成红色,不可用时,设置里面的背景为黑色,文字为绿色。
4、伪类选择器E:checked、E:default和indeterminate
1)、E:cehcked伪类选择器用来指定当表单中的radio单选框或者是checkbox复选框处于选取状态时的样式。
2)、E:default选择器用来指定当页面打开时默认处于选取状态的单选框或复选框的控件的样式。
3)、E:indeterminate选择器用来指定当页面打开时,一组单选框中没有任何一个单选框被设定为选中状态时,整组单选框的样式。
4)、小案例:
A、模拟一个发布房产信息的选框控件,当选择以后,会给他一个2px 实线 绿色的边框!
效果:
B、实现一个默认选择中的控件,默认给他一个2px 实线 绿色的边框!
效果:
当他去掉勾以后还会有样式
C、实现一个在默认打开都没有选中时,给他们一个2px 实线 绿色的边框!
效果:
5、伪类选择器E::selection
1)、E:selection伪类选择器用来指定当元素处于选中状态时的样式。
2)、小案例:
选择网页中p段落中的文字和文本框中的文字,改变他的背景颜色为绿色!
效果:
选择网页中p段落中的文字
选择文本框中的文字
6、E:invalid伪类选择器与E:valid伪类选择器
1)、E:invalid伪类选择器用来指定,当元素内容不能通过HTML5通过使用的元素的诸如requirde等属性所指定的检查或元素内容不符合元素规定的格式时的样式。
2)、E:valid伪类选择器用来指定,当元素内容能通过HTML5通过使用的元素的诸如requirde等属性所指定的检查或元素内容符合元素规定的格式时的样式。
3)、小案例:
通过Email属性的表单判断输入是否正确,正确输入的内容为绿色,输入错误就是红色!
效果:
错误
正确
7、E:required伪类选择器与E:optional伪类选择器
1)、E:required伪类选择器用来指定允许使用required属性,而且已经指定了required属性的input元素、select元素以及textarea元素的样式。
2)、E:optional伪类选择器用来指定允许使用required属性,而且未指定了required属性的input元素、select元素以及textarea元素的样式。
3)、小案例:
姓名必填表单背景红色,年龄可选填表单背景绿色
效果:
8、E:in-range伪类选择器与E:out-of-range伪类选择器
1)、E:in-range伪类选择器用来指定当元素的有效值被限定在一段范围之内,且实际的输入值在该范围之内时的样式。
2)、E:out-of-range伪类选择器用来指定当元素的有效值被限定在一段范围之内,但实际输入值在超过时使用的样式。
3)、小案例:
0-100以内的数字,小于0或超过100字体变成红色,否则绿色。
效果:
100时:
1000时:
</div>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
input[type="text"]:hover{background:green}
input[type="text"]:focus{background:red}
input[type="text"]:active{background:blue}
input[type="text"]:enabled{background:#000}
input[type="text"]:disabled{background:#ccc}
input[type="text"]:read-only{background:#000;color:green}
input[type="text"]:read-write{color:#f60}
input[type="checkbox"]:checked{outline:2px solid green}
input[type="checkbox"]:default{outline:2px solid green}
input[type="radio"]:indeterminate{outline:2px solid green}
</style>
<script type="text/javascript" src="demo.js">
</script>
</head>
<body>
<h1>选择器E:hover E:active E:focus</h1>
<form>
<input type="radio" name="dan">man
<input type="radio" name="dan">woman
<br>
<input type="checkbox" checked>水
<input type="checkbox">电
<input type="checkbox">气
<br>
name:<input type="text" placeholder="readonly" readonly>
<br>
name:<input type="text" placeholder="input name">
<br>
age:<input type="text" placeholder="input age" disabled>
<br>
passwd:<input type="password" placeholder="password">
</form>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
::selection{background:green;color:#fff;}
input[type="text"]::selection{background:#f60;color:#fff;}
input[type="email"]:invalid{color:red}
input[type="email"]:valid{color:green}
input[type="text"]:required{background:red;color:#fff}
input[type="text"]:optional{background:green;color:blue}
input[type="number"]:in-range{color:green}
input[type="number"]:out-of-range{color:red}
</style>
<script type="text/javascript" src="demo.js">
</script>
</head>
<body>
<h1>伪类选择器
E::selection
:invalid :valid
:required :optional
:in-range :out-of-range
</h1>
<p>lfjdlfkjdjfjdkfkdjddddddddddddddkkkkkkkkkkkkkkkkkkkkkkkk</p>
<input type="text" placeholder="text">
<input type="email" placeholder="email">
<form>
name:<input type="text" placeholder="name" required>
<br>
age:<input type="text" placeholder="age">
</form>
<input type="number" min="0" max="100" value="0">
</body>
</html>
4、通用兄弟元素选择器
通用兄弟元素选择器
他用来指定位于同一个父元素之中的某个元素之后的所有其他某个种类的兄弟元素所使用的样式。
使用方法:
<子元素>~<之元素之后的同级兄弟元素>{
CSS样式
}
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
span~p{background:green}
</style>
<script type="text/javascript" src="demo.js">
</script>
</head>
<body>
<div>
<span>父元素之中 元素之后</span>
<p>分级基金</p>
<p>分级基金</p>
<p>分级基金</p>
<span>div同级元素</span>
</div>
<span>div同级元素</span>
<p>分级基金1</p>
<p>分级基金</p>
<p>分级基金</p>
<div>
<p>分级基金</p>
<p>分级基金</p>
<p>分级基金</p>
</div>
<p>分级基金1</p>
<p>分级基金</p>
</body>
</html>
</p>
41.使用选择器在页面中插入内容
第五讲:使用选择器在页面中插入内容
<p>
在前面的课程中我们讲过了如何使用before伪元素和after伪元素在页面中的元素前或者后加入内容,而插入的内容是以content属性来定义的。
before伪元素和after伪元素在CSS2.0的时候就已经被添加,从CSS2到CSS3一直都在对这两个选择器进行改良和扩展,从而使得我们的before伪元素和after伪元素的功能越来越强大。
课后目标:
能够熟练的使用before伪元素和after伪元素在页面中插入文字、图像、项目编号等等。
1、插入文字
1、使用选择器插入内容
在CSS2中,使用before选择器在元素前面插入内容,使用after在元素后面插入内容,在选择器content属性中定义要插入的内容。
例如对H2使用before选择器在H2的前面插入文字“Title”。
<style type="text/css">
h2:before{
content:"Title";
}
</style>
并且我们还可以给他定义样式,进行美化操作。
比如我们给“Title”的文字设置为白色,加上绿色的背景,内边距上下1像素左右5像素,外边距右边5像素,当然还可以设置他的字体等等。
1-2、排除一些不需要插入内容的元素
使用content属性的追加一个none属性值。
比如:
<style type="text/css">
h2.nocontent:before{
content:none;
}
</style>
2、插入图片
2、插入图片文件
使用before或者after除了可以在元素前后插入文字之外还可以插入图片。
在插入图片是需要使用URL指定图片的路径,比如在标题前插入一张图片!
比如:
<style type="text/css">
h2:before{
content:url(1.gif);
}
</style>
2、插入图片文件的好处
节省开发人员的工作量,比如可以通过类的方式来进行不同标题图片的追加!
比如我们给标题定义一个“hot”“digest”分别来调用一张站的图标个顶的小图标!
<style type="text/css">
h2.hot:before{ content:url(hot.gif); }
h2.digest:before{ content:url(digest.gif); }
</style>
<h2 class="hot">这是标题测试</h2>
<h2 class="digest">这是标题测试</h2>
<h2 class="hot">这是标题测试</h2>
<h2>这是标题测试</h2>
<h2>这是标题测试</h2>
3、插入项目编号
1、在多个标题前加上连续编号
在content属性中使用counter属性来正对对个项目追加连续的编号。
使用方法:
元素:before{
content:counter(计数器);
}
使用计数器来计算编号,计数器可以任意命名。
除了使用计数器,还需要在元素的样式中追加对元素的(counter-increment)属性的指定为content属性值中所指定的计数器名称。
元素{
counter-increment:content属性值中所指定的计数器名称
}
2、在项目编号中追加文字
h1:berore{
content:'第'counter(content属性值中所指定的计数器名称)'章';
}
变成另一种效果!“第一章、第二章...”
3、指定编号的样式
比如给他在编号后面带一个“.”文字,并且设置编号的颜色为绿色,字体大小42像素。
h1:before{
content:counter(content属性值中所指定的计数器名称)'.';
color:green;
font-size:42px;
}
变成另一种效果!“第一章、第二章...”
4、指定编号的种类
before和after不仅可以追加数字编号,还可以追加字母编号或者罗马数字编号。
content:counter(计数器名,编号种类)
可以使用list-style-type属性的值来指定编号的种类。比如指定大写字母编号时,使用“upper-alpha”属性,指定大写罗马字母时使用“upper-roman”属性。
h1:before{
content:counter(计数器名,编号种类)'.';
color:green;
font-size:42px;
}
5、编号嵌套、重置编号
我们可以在大编号中华嵌套中编号,在中编号中呢又嵌入小编号!
1)、大编号中嵌入中编号
2)、counter-reset属性重置编号
6、中编号中嵌入大编号
h2:before{
content:counter(大编号的计数器)'-'counter(中编号的计数器)
}
7、在字符串两边嵌套文字符号
可以使用content属性的open-quote属性值与close-quote属性值在字符串的两边添加诸如单引号、双引号之类的文字字符。
open-quote开始符号
close-quote结尾字符
quote字符类型(使用双引号("")的时候需要使用转义字符“\”)
示例:
<style>
h1:before{
content:open-quote;
}
h1:after{
content:close-quote;
}
h1{
quote:"(" ")";
}
</style>
<h1>标题</h1>
</p>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
h2:after{
content:"title";color:#fff;background:green;
padding:1px 5px;
margin-right:10px;
}
h2.not:after{content:none;}
h1:before{content:url('./data/html.png');}
h1:before{content:counter(jsq)'-'counter(sub)'.';color:green;font-size:20px;}
h1{counter-increment:sub;
}
h2:before{content:'第'counter(jsq,upper-alpha)'个.';
color:green;font-size:20px;
}
h2{counter-increment:jsq;counter-reset:sub;}
h2:before{content:open-quote;}
h2:after{content:close-quote;}
h2{quotes:"("")";}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h2>使用选择器插入内容</h2>
<h1>使用选择器在父元素设置counter-reset插入内容</h1>
<h1>使用选择器插入内容</h1>
<h1>使用选择器插入内容</h1>
<h2>使用选择器插入内容</h2>
<h1>使用选择器插入内容</h1>
<h1>使用选择器插入内容</h1>
<h1>使用选择器插入内容</h1>
<h2 class="not">使用选择器插入内容</h2>
<h1>使用选择器插入内容</h1>
<h1>使用选择器插入内容</h1>
<h1>使用选择器插入内容</h1>
</body>
</html>
42.文字阴影与自动换行
第六讲:文字阴影与自动换行
<div>
主要讲解对象:
CSS3中与文字字体相关的一些属性做详细的介绍,比如text-shadow属性、word-break属性、word-wrap属性等等。
课后目标:
掌握 text-shadow属性给页面的文字加阴影效果
掌握 word-break属性让页面文字自动换行
掌握 word-wrap属性让浏览器在长单词或很长的URL地址的中间进行换行。
掌握 如何使用浏览器在显示文字的时候使用服务器端的字体。
1、text-shadow
1、text-shadow属性的使用方法
在CSS3我们可以是用text-shadow属性给页面上的文字添加阴影效果,text-shadow在CSS2.1的时候是被删除了的一个属性,但是呢在3.0的CSS中又恢复了使用。
text-shadow的使用方法:
text-shadow:length length length color
第一个length表示的是阴影离开文字的横方向距离;
第二个length表示的是阴影离开文字的纵方向的距离;
第三个length表示的是阴影模糊半径;
color表示的是阴影的颜色。
2、位移距离
text-shadow所使用的参数中,前两个参数是阴影离开文字的横方向和纵方向的位移距离,使用的时候必须指定这两个参数
。
3、阴影的模糊半径
text-shadow属性的第三个参数就是阴影模糊半径,代表阴影向外模糊时的模糊范围。
4、阴影的颜色
text-shadow属性的第四个参数就是绘制阴影时所使用的颜色,可以放在三个参数之前,也可以放在之后。当没有指定颜色值的时候,会使用Color的颜色值。
5、指定多个阴影
我们可以使用text-shadow属性来给文字指定多个阴影,并且针对每个阴影使用不同的颜色。指定多个阴影的时候使用逗号“,”将多个阴影进行分割。
2、word-break
1、浏览器文本自动换行
学习word-break之前我们先来看看浏览器对默认文本的换行处理方法。
2、指定自动换行的处理方法
在CSS3中可以使用word-break属性来设置自动换行的处理方法。值换行规则IE5+Safari、chromenormla使用浏览器默认的规则支持支持keep-all只能在半角空格或连字符处理换行支持不支持break-all允许在单词内换行支持支持
使用示例:
<style>
div{
word-break:keep-all
}
</style>
3、word-wrap
3、长单词与URL地址自动换行
在CSS3中,使用word-wrap属性来实现长单词和URL的自动换行。
使用方法:
div{
word-wrap:break-word;
}
word-wrap属性的属性值有两个
第一个:normal 浏览器保持默认处理方式,只在半角空格或者是连字符的地方换行
第二个:break-word 浏览器可以在长单词或URL地址内部进行换行。
</div>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
h1{text-shadow:15px -15px 2px #000,13px 23px 2px red;}
P{word-break:break-all;}
p{word-wrap:break-word;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>文字阴影text-shadow 颜色可以在前面 没有继承color</h1>
<br>
<h1>浏览器文本自动换行normal默认 keep-all空格.符号 break-all单词内</h1>
<p>2018年NBA自由市场的大门即将开启,NBA每年自由市场开启日定在美国东部时间7月1日0点,北京时间7月1日12点。根据NBA劳资合同规则,7月1日至7月6日这段时间被称之</p>
<p>In 2018, the door of the NBA free market is about to open. The opening date of the NBA free market is set at 0 o'clock on July 1, American Eastern Time, and 12 o'clock on July 1, Beijing Time. The period from July 1 to July 6 is called the NBA Labor Contract Rules.</p>
<h1>word-wrap长单词url自动换行 normal默认空格连字符出换 break-word长单词url内换</h1>
<p>file:///G://Users/Administratorffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/desktop/PHP/demo.html</p>
</body>
</html>
43.服务器端字体和@font-face属性
4、服务器端字体和@font-face属性
<div>
1、在页面上显示服务器端的字体
在CSS3中可以使用@font-face属性来利用服务器端字体。
@font-face属性的使用方法:
@font-face{
font-family:webFont;
src:url('font/字体名称.otf')format("opentype");
}
font-family属性值中使用webfont来声明使用的是服务器端字体。
src属性值中首先指定了字体文件所在的路径,format声明字体文件的格式,可以省略文件格式的声明,单独使用src属性值。
可以使用的字体文件格式:字体格式字体属性otfopentypettftruetypeeotembedded-opentype
2、定义斜体或粗体字体
在定义字体的时候,可以把字体定义成斜体或者粗体,在使用服务器服务器端字体的时候,需要根据是斜体还是粗体,使用不同的文字 。
使用方法如下:
@font-face {
font-family: webfont;
src: url(字体1.otf);
}
@font-face {
font-family: webfont;
font-style: italic;
src: url(字体2.otf);
}
h1{
font-family: webfont;
}
h2{
font-family: webfont;
font-style: italic;
}
3、显示客户端本地的字体
@font-face除了可以显示服务器端的字体还可以显示本地字体。
首先将font-family设置为本地的字体名,然后将src属性设置为local('字体')。
例如:
@font-face{
font-family:Arial;
src:local('Arial');
}
4、属性值的指定:
1)、font-family:设置文本的字体名称。
2)、font-style:设置文本样式。
取值:normal不使用斜体
italic使用斜体
oblique使用倾斜体
inherit从父元素继承
3)、font-variant:设置文本是否大小写。
取值:
normal使用浏览器默认值
small-caps使用小型大写字母
inherit从父元素继承
4)、font-weight:设置文本的粗细。
取值:
normal使用浏览器默认值
bold使用粗体
bolder使用更粗的字体
lighter使用更细的字体
100-900从细字体到粗,值必须是100的倍数,其中400等于normal,700等同于bold。
5)、font-stretch:设置文本是否横向的拉伸变形。(IE及Firefox已支持font-stretch,但显示效果与正常文字并无不同。)
取值:
normal:正常文字宽度
wider把伸展比例设置为更进一步的伸展值 ;
narrower:把收缩比例设置为更进一步的收缩值;
ultra-condensed:比正常文字宽度窄4个基数;
extra-condensed:比正常文字宽度窄3个基数;
condensed:比正常文字宽度窄2个基数;
semi-condensed:比正常文字宽度窄1个基数;
semi-expanded:比正常文字宽度宽1个基数;
expanded:比正常文字宽度宽2个基数;
extra-expanded:比正常文字宽度宽3个基数;
ultra-expanded:比正常文字宽度宽4个基数;
6)、font-size:设置文本字体大小。
7)、src:设置自定义字体的相对路径或者绝对路径,注意,此属性只能在@font-face规则里使用。
</div>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
@font-face{font-family:webFont;src:url('./data/jpzk.otf');}
@font-face{
font-family:webFont;
src:url(./data/gtgg.otf);
font-style:italic;
}
h1{font-family:webFont;}
h2{font-family:webFont;font-style:italic;}
@font-face{font-family:Arial;src:local('Arial');}
h3{font-family:Arial;font-variant:small-caps;
font-weight:bolder;
font-stretch:expanded;
font-size:34px;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>Severs Font-family 服务器端字体</h1>
<h1>Severs Font-family 服务器端字体</h1>
<h2>Severs Font-family 服务器端字体</h2>
<h3>User Font-family 客户端字体</h3>
</body>
</html>
44.盒布局上
45.盒布局下
<div>
第七讲:盒模型
第七讲主要讲解,CSS3中各种盒模型、概念、使用方法和浏览器的支持情况,以及讲解当内容溢出是的操作办法,给盒子添加阴影效果,和如何使用CSS3中的属性来定义元素的宽度值和高度值中是否包含内补白区域,以及边框的宽度和高度。
课后目标:
1、掌握CSS3中各种盒的类型、概念、使用方法以及浏览器的支持情况。
2、当内容溢出时,如何按照自己的想法来让浏览器进行显示
3、掌握CSS3加阴影的方法,可以给盒加阴影。
1、各种盒模型
1、盒的基本类型:
在css3中使用display属性来定义盒的类型,总体来说盒分为block类型和inline类型。
比如之前我们所学的div元素和p元素就是属于block类型,span和a属于inline类型。
我们可以通过一个小小的实验来对比两种盒。
inline-block类型
2、inline-block类型
inline-block类型是css2.1中追加的一个盒类型。
inline-block类型盒属于block盒的一种,但是在显示时具有inline类型盒的特点。
例如:
在DIV元素中分别将display设置为inline-block和inline后他们的效果一样。
如果我们给他们都指定宽度和高度结果会是怎样?
2.2使用inline-block类型来执行分列显示
在css2.1之前,如果需要在一行中并列显示多个block类型的元素,需要用float属性或者position属性,但是这样会让我们的样式变的复杂,所以在CSS2.1中就追加了inline-block类型,使得并列显示多个block类型的元素操作变的很简单。
示例对比:
block类型
首先新建三个div元素,给前两个DIV使用float让前两个div元素并列显示,第三个div的话就会显示在前两个div元素的下部,但是因为前两个的高度不一样所以我们要使用clear属性清除浮动。
inline-block类型
使用inline-block类型可以直接将两个div元素进行并列显示,不需要使用float属性,也不需要使用clear属性了。
默认情况下使用inline-block类型时并列显示的元素的垂直对齐方式是底部对齐,为了让对齐方式改成顶部对齐,还要给DIV元素的样式中加入vertical-align属性。
2.3使用inline-block类型来显示水平菜单
在css2.1之前,如果要实现水平菜单,那么我们需要使用float属性,大多数菜单是利用ul列表和li列表项目来显示的,li元素隶属于block类型下的list-item类型,所以要并列显示的话就要使用float属性。
inline-table类型
inline-table类型
inline-table类型是css2中新增的盒类型 -- inline-table
实例讲解:
在css中使用table元素的示例,一个表格,前后都有文字将其围绕。
list-item类型
list-item类型,可以将多个元素作为列表来显示,同时在元素的开头加上列表的标记。
run-in类型与compact类型
将元素指定为run-in类型或compact类型时,如果元素后面还有block类型的元素,run-in类型那个的元素将被包括在后面的block类型的元素的内部,而compact类型的元素将被放置在block类型的元素左边。
表格相关类型
在CSS3中所有与表格相关的元素及其所属类型表:元素所属类型说明tabletable代表整个表格tableinline-table代表整个表格可以被指定为table类型也可以是inline-table类型trtable-row代表表格中的一行tdtable-cell代表表格中的单元格thtable-cell代表但单元格中的列标题tbodytable-row-group代表表格中行的所有行theadtable-header-group代表表格中的表头部分tfoottable-footer-group代表表格中的脚注部分coltable-columm代表表格中的一列colgrouptable-column-group代表表格中的所有列captiontable-caption代表整个表格的标题
通过一个小示例,来指定各种div的类型为各种表格相关的类型,让这些DIV构成一个完整的表格
none类型
当元素被指定了none类型后,这个元素将不会被显示
小示例使用前面所学的伪类选择器来实现鼠标移动上去隐藏,移开后显示。
各种浏览器对各种盒模型的支持情况
盒类型FirefoxSafariOperaIE8Chromeinlineinline-blockblockrun-innonetabletable-celltable-columntable-colgrouptable-header-grouptable-row-grouptable-footer-grouptable-rowtable-captionYESYESYESNOYESYESYESYESYESYESYESYESYESYES YESYESYESYESYESYESYESYESYESYESYESYESYESYES YESYESYESYESYESYESYESNONOYESYESYESYESYES YESYESYESNOYESYESYESYESYESYESYESYESYESYES YESYESYESNOYESYESYESNONOYESYESYESYESYES
46.overflow属性
2、显示不下的内容
当我们在样式中设置了宽度和高度之后,就有可能出现内容溢出的情况,就可以使用overflow属性来指定如何显示盒子内显示不下的内容。
1、overflow属性
overflow属性用来指定对盒中容纳不下的内容的显示办法。
取值:
hidden超出容纳范围的文字将被隐藏起来scroll在div元素中出现水平与垂直的滚动条,超出的内容被滚动显示auto当文字超出div元素的容纳范围时,根据需要出现水平滚动条或者是垂直滚动条,滚动显示超出的内容。visible和不使用overflow时候的显示效果一样,超出容纳范围的文字按原样显示
2、overflow-x属性与overflow-y属性
使用overflow-x属性或者overflow-y属性,可以单独指定可以在水平或者垂直方向上如果内容超出盒的容纳范围时的显示方法。
小示例:
将overflow-x属性设置为hidden,将overflow-y属性设置为scroll,那么超出之后只会在垂直方向上显示滚动条。
3、text-overflow属性
通过使用text-overflow属性,可以在盒的末尾显示一个代表省略的符号“...”,但是text-overflow属性只在当盒中的内容在水平方向上超出盒的容纳范围时有效
text-overflow:ellipsis;
white-space:nowrap;
小示例:
通过将white-space属性的属性值设定为nowrap,使得盒的右端内容不能换行显示,这样就达到了水平方向溢出的效果了。
3、盒阴影
1、box-shadow属性的使用方法
在CSS3中,可以使用box-shadow属性让盒在显示的时候产生阴影效果。
使用方法:
box-shadow:length length length color
前三个length表示文字阴影离开文字的横方向距离,阴影离开文字的纵方向距离和阴影的模糊半径,color制定阴影的颜色。
2、将参数设置为0
1、当阴影的模糊半径设定为0的时候,将绘制不向外模糊的阴影。
2、将阴影离开文字的横方向距离与阴影离开文字的纵方向距离都设置为0的时候,会在盒子的周围绘制阴影。
3、将阴影离开文字的横方向距离设定为负数值的时候,向左绘制阴影。
4、将阴影离开文字的纵方向距离设定为负数值的时候,向上绘制阴影。
3、对盒内子元素使用阴影
可以单独对盒内的子元素使用阴影。
小示例:
有一个DIV元素,div元素内部有一个span子元素,使用box-shadow属性让span子元素具有阴影效果。
4、对第一个文字或第一行使用阴影。
通过使用first-letter选择器或frist-line选择器可以只让第一个字或第一行具有阴影效果。
5、对表格及单元格使用阴影
可以使用box-shadow属性让表格及表格内的单元格产生阴影效果。
4、box-sizing宽高计算
1、box-sizing属性
在CSS3中,使用box-sizing属性来指定针对元素的宽度与高度的计算方法。
box-sizing可以指定用width属性与height属性分别指定的宽度只与高度值是否包含元素的内补白区域以及边框的宽度和高度。
可以给box-sizing属性指定的属性值为content-box属性值与border-box属性值。
content-box属性值表示元素的宽度与高度不包括内补白区域及边框的宽度高度;
border-box属性值表示元素的宽度与高度包括内补白区域及边框的宽度与高度,在没有使用box-sizing属性的时候,默认值是content-box属性值。
2、为什么要使用box-sizing属性
使用box-sizing属性的目的是对元素的总宽度做一个控制,如果不适应这个属性的话,样式中默认使用的是content-box属性值,他只对内容做一个指定,却没有队员说的总宽度进行指定,有些场合合理利用border-box属性值会是页面的布局很方便。
</div>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
/*div{background:green}
span{background:red}*/
div{background:green;}
.div1{display:inline-block;width:50px;height:50px;}
.div2{display:inline;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>盒的基本类型</h1>
<div class="div1">在css3中使用display属性来定义盒的类型,总体来说盒分为block类型和inline类型</div>
<div class="div2">在css3中使用display属性来定义盒的类型,总体来说盒分为block类型和inline类型</div>
<span>在css3中使用display属性来定义盒的类型,总体来说盒分为block类型和inline类型</span>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div.div{width:400px;}
div.div1{width:200px;background-color:green;float:left;}
div.div2{width:200px;background-color:#f60;float:left;}
div.div3{background-color:blue;clear:both;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>使用inline-block类型来执行分列显示</h1>
<div class="div">
<div class="div1">
block类型
首先新建三个div元素,给前两个DIV使用float让前两个div元素并列显示,第三个div的话就会显示在前两个div元素的下部,但是因为前两个的高度不一样所以我们要使用clear属性清除浮动。
</div>
<div class="div2">
inline-block类型
使用inline-block类型可以直接将两个div元素进行并列显示,不需要使用float属性,也不需要使用clear属性了。
</div>
<div class="div3">
默认情况下使用inline-block类型时并列显示的元素的垂直对齐方式是底部对齐,为了让对齐方式改成顶部对齐,还要给DIV元素的样式中加入vertical-align属性。
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div.div1{width:200px;background-color:green;display:inline-block;}
div.div2{vertical-align:top;width:200px;background-color:#f60;display:inline-block;}
div.div3{width:400px;background-color:blue;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>使用inline-block类型来执行分列显示</h1>
<div class="div">
<div class="div1">
block类型
首先新建三个div元素,给前两个DIV使用float让前两个div元素并列显示,第三个div的话就会显示在前两个div元素的下部,但是因为前两个的高度不一样所以我们要使用clear属性清除浮动。
</div><div class="div2">
inline-block类型
使用inline-block类型可以直接将两个div元素进行并列显示,不需要使用float属性,也不需要使用clear属性了。
</div>
<div class="div3">
默认情况下使用inline-block类型时并列显示的元素的垂直对齐方式是底部对齐,为了让对齐方式改成顶部对齐,还要给DIV元素的样式中加入vertical-align属性。
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
ul{margin:0;padding:0;}
li{
padding:10px 20px;
background-color:#2292ff;
border-right:solid 1px #2066c7;
width:100px;
text-align:center;
list-style:none;
float:left;
}
a{color:#fff;text-decoration:none;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>使用inline-block类型来显示水平菜单</h1>
<ul>
<li><a href="demo.html">index</a></li>
<li><a href="demo.html">index</a></li>
<li><a href="demo.html">index</a></li>
<li><a href="demo.html">index</a></li>
<li><a href="demo.html">index</a></li>
</ul>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
ul{margin:0;padding:0;}
li{
display:inline-block;
padding:10px 20px;
background-color:#2292ff;
border-right:solid 1px #2066c7;
width:100px;
text-align:center;
}
a{color:#fff;text-decoration:none;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>使用inline-block类型来显示水平菜单</h1>
<ul>
<li><a href="demo.html">index</a></li><li>
<a href="demo.html">index</a></li><li>
<a href="demo.html">index</a></li><li>
<a href="demo.html">index</a></li><li>
<a href="demo.html">index</a></li>
</ul>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
table{
border:solid 3px #ccc;
display:inline-table;
vertical-align:bottom;
}
td{
border:solid 3px #898989;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>inline-table类型</h1>
文字内容table
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
文字内容table
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
display:list-item;
list-style-type:circle;
margin-left:30px;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>list-item类型</h1>
<div>list-item类型</div>
<div>list-item类型</div>
<div>list-item类型</div>
<div>list-item类型</div>
<div>list-item类型</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
dl.run-in dt{display:run-in;border:soild 2px #d829ff;background-color:#ccc;}
dl.compact dt{display:compact;border:soild 2px #d829ff;background-color:#ccc;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>run-in类型或compact类型</h1>
<dl class="run-in">
<dt>run-in类型</dt>
<dd>run-in类型那个的元素将被包括在后面的block类型的元素的内部</dd>
</dl>
<dl class="compact">
<dt>compact类型</dt>
<dd>compact类型的元素将被放置在block类型的元素左边</dd>
</dl>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div.table{display:table;border:solid 3px #ccc;}
div.table-caption{display:table-caption;}
div.thead{display:table-header-group;}
div.tr{display:table-row;}
div.td{display:table-cell;border:solid 3px #898989;padding:5px;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>CSS3中所有与表格相关的元素</h1>
<div class="table">
<div class="table-caption">表格标题</div>
<div class="thead">
<div class="tr">
<div class="td">1</div>
<div class="td">2</div>
<div class="td">3</div>
</div>
<div class="tr">
<div class="td">1</div>
<div class="td">2</div>
<div class="td">3</div>
</div>
<div class="tr">
<div class="td">1</div>
<div class="td">2</div>
<div class="td">3</div>
</div>
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div#a{width:500px;height:500px;background-color:#ccc;}
div#b{display:block;width:200px;height:200px;background-color:green;}
div#a:hover div#b{display:none;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>none类型</h1>
<div id="a">
<div id="b"></div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
/*div{
width:150px;height:150px;background-color:green;
overflow:hidden;overflow:scroll;overflow:auto;overflow:visible;
overflow-x:scroll;overflow-y:hidden;
}*/
div{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
width:300px;
border:solid 1px green;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>overflow溢出</h1>
<div>overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出overflow溢出</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div span{width:300px;height:180px;}
div:first-line{
margin-left:180px;
background-color:green;
box-shadow:-10px 10px 5px #6c6c6c;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>box-shadow属性的使用方法</h1>
<div><span>box-shadow</span><br>属性的使用方法</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
table{
border-spacing:12px;
box-shadow:5px 5px 5px #000;
}
td{
background-color:green;
box-shadow:5px 5px 5px #002b00;
padding:10px;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>表格以及单元格使用阴影</h1>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;
border:solid 30px #6c6c6c;
padding:30px;
background-color:green;
margin:20px auto;
}
div#a{box-sizing:border-box;}
div#b{box-sizing:content-box;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>box-sizing属性</h1>
<div id="a">box-sizing属性内补白区和边框宽高box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性</div>
<div id="b">box-sizing属性不包括内补白区和边框宽高box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性box-sizing属性</div>
</body>
</html>
47.CSS3中新增的背景属性
第八讲:背景和边框的相关样式
主要讲解CSS中与背景和边框相关的一些样式,包括背景相关的几个属性,如何在一个背景中使用多个图像文件、如何绘制圆角边框、如何给元素添加图像边框。
课后目标:
1、掌握CSS 3中新增的与背景相关的属性的概念、使用方法以及各种浏览器的支持情况。
2、学会如何使用CSS 3中的border-radius属性给元素添加一个圆角边框。
3、学会如何使用CSS 3 中的border-images属性给元素添加一个可以随元素尺寸的变化而自动伸缩的图像边框。
1、新增的背景属性
属性功能
background-clip指定背景的显示范围 background-origin指定绘制背景图象时的起点
background-size指定背景中图像的尺寸 background-break指定内联元素的背景图像进行平铺时的循环方式
1、background-clip指定背景的显示范围
css3中的background-clip属性,它主要是用来控制我们的背景显示区域。
首先呢,我们来看一下它的用法
background-clip : border-box || padding-box || content-box
1、border-box:此值为默认值,背景从border区域向外裁剪,也就是超出部分将被裁剪掉;
2、padding-box:背景从padding区域向外裁剪,超过padding区域的背景将被裁剪掉;
3、content-box:背景从content区域向外裁剪,超过context区域的背景将被裁剪掉;
浏览器支持情况:
background-clip在各种浏览器内核下,都具有自己的私有前缀:
Firefox3.6版本以下(包含3.6版本):
-moz-background-clip: border || padding
Firefox4.0版本以上:
Firefox4.0版本以上,支持border-box,padding-box,content-box并且无需带上其前缀,如果你一不小心带上了“-moz-”,那么在Firefox4.0+版本反而是一种错误的写法
background-clip: border-box || padding-box || content-box
background-clip兼容各浏览器的正确写法应该如下:
/*Firefox3.6-*/
-moz-background-clip: border || padding;
/*Webkit*/
-webkit-background-clip: border-box || padding-box || context-box;
/*W3C标准 IE9+ and Firefox4.0+*/
background-clip: border-box || padding-box || context-box;
2、background-origin属性指定绘制背景图像的绘制起点
在绘制背景图象时,默认是从内补白(padding)区域的左上角开始绘制的,但是可以利用background-origin属性来指定绘制时从边框的左上角开始绘制,或者是从内容的左上角开始绘制。
padding-box(padding):此值为background-origin的默认值,决定background-position起始位置从padding的外边缘(border的内边缘)开始显示背景图片;
border-box(border):此值决定background-position起始位置从border的外边缘开始显示背景图片;
content-box(content):此值决定background-position起始位置从content的外边缘(padding的内边缘)开始显示背景图片;
语法:
background-origin在早期的Webkit和Gecko内核浏览器(Firefox3.6-,Safari和Chrome代版本)他们都支持一种老式的语法规则,类似于background-clip在Firefox3.6以下的版本一样
background-origin: padding || border || content
那么在那些现代浏览器都支持的是一种新的语法
background-origin: padding-box || border-box || content-box
为了兼容新老版本的浏览器,在使用background-origin改变background-position的原点位置时,最好老旧语法一起加上,并且新语法放在老语法后面,这样只要是支持新语法规则的浏览器就自动会识别background-origin的最新语法
background-origin: padding || border || content
background-origin: padding-box || border-box || content-box
取值说明:
1、padding-box(padding):此值为background-origin的默认值,决定background-position起始位置从padding的外边缘(border的内边缘)开始显示背景图片;
2、border-box(border):此值决定background-position起始位置从border的外边缘开始显示背景图片;
3、content-box(content):此值决定background-position起始位置从content的外边缘(padding的内边缘)开始显示背景图片;
有一点需要提出,在IE8以下版本解析是不一样的,在IE7以下版本background-origin默认是从border开始显示背景图片。
兼容浏览器:
background-origin虽然现代浏览器都支持,但在不同内核浏览器下还是需要带上其各自的前缀,这样在实际应用中最好按下面的语法规则书写,以保证只要支持background-origin的都能正常运行:
/*Old Webkit and Gecko*/
-moz-background-origin: padding || border || content;
-webkit-background-origin: padding || border || content;
/*New Webkit and Gecko*/
-moz-background-origin: padding-box || border-box || content-box;
-webkit-background-origin: padding-box || border-box || content-box;
/*Presto*/
-o-background-origin: padding-box || border-box || content-box;
/*W3c标准*/
background-origin: padding-box || border-box || content-box;
3、background-size属性指定背景图像的尺寸
在CSS3中,可以使用background-size属性来指定背景图像的尺寸。
使用方法:
background-size: auto || <length> || <percentage> || cover || contain
1、auto:此值为默认值,保持背景图片的原始高度和宽度;
2、length:设置背景图像的高度和宽度,第一个值设置宽度,第二个值设置高度,如果只设置一个值,则第二个值会被设置为 "auto"。
3、percentage:以父元素的百分比来设置背景图像的宽度和高度,第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 "auto"。
4、cover:此值是将图片放大,以适合铺满整个容器,这个主要运用在,当图片小于容器时,又无法使用background-repeat来实现时,我们就可以采用cover;将背景图片放大到适合容器的大小,但这种方法会使用背景图片失真;
5、contain:此值刚好与cover相反,其主要是将背景图片缩小,以适合铺满整个容器,这个主要运用在,当背景图片大于元素容器时,而又需要将背景图片全部显示出来,此时我们就可以使用contain将图片缩小到适合容器大小为止,这种方法同样会使用图片失真。
兼容的浏览器
background-size和其他的一些CSS3属性一样,需要加上自己的别名,
/*Mozilla*/
-moz-background-size: auto || <length> || <percentage> || cover || contain
/*Webkit*/
-webkit-background-size: auto || <length> || <percentage> || cover || contain
/*Presto*/
-o-background-size: auto || <length> || <percentage> || cover || contain
/*W3c标准*/
background-size: auto || <length> || <percentage> || cover || contain
4、Background-break属性指定背景图像的尺寸
css3里标签元素能被分在不同区域(如:让内联元素span跨多行),background-break属性能够控制背景在不同区域显示。
属性值:
(1)Background-break: continuous;
此属性是默认值,忽视区域之间的间隔空隙(给它们应用图片就好像把它们看成一个区域一样)
(2)Background-break: bounding-box;
重新考虑区域之间的间隔
(3)Background-break: each-box;
对每一个独立的标签区域进行背景的重新划分。
2、显示多个背景图片
在一个元素中显示多个背景图像
在CSS3中一个元素可以显示多个背景图像,还可以将多个背景图像进行重叠显示,这样可以让我们对背景中所用素材的调整变的更加容易。
使用方法:
background-image:url(1.png),url(2.png),url(3.png);
图层的排序方法:浏览器中显示时叠放的顺序从上往下指定的,第一个图像文件是放在最上面的,最后指定的文件是放在最下面的。
48.CSS3中边框相关的样式
3、圆角边框
border-radius属性
在css3中可以使用border-radius进行圆角边框的绘制,在网页中呢,我们经常使用圆角边框来美化我们的页面,在css3出现之前呢!我们如果要在网页上展示一个圆角边框的一个效果,那么我们需要绘制图形,在css3出现之后呢我们就只需要一段简单的代码就可以实现圆角边框的效果。
使用方法:border-radius:半径
border-radius属性使用的时候,我们只需要定义好圆角的半径就可以绘制圆角边框了。
兼容性:
IE9+、Firefox 4+、Chrome、Safari 5+ 以及 Opera 支持 border-radius 属性。
border-radius属性中指定两个半径
在border-radius属性中,可以指定两个半径,制定方法如下:
border-radius:40px 20px;
第一个半径作为边框左上角与边框右下角的圆半径来绘制。
第二个半径作为边框右上角与边框左下角的圆半径来绘制。
不显示边框时
在CSS3中,如果使用了border-radius属性但是把边框设置为不显示时,浏览器会把背景的四个角绘制成圆角。
修改边框种类时
使用了border-radius属性后,不管边框是什么种类,都会将边框沿着圆角曲线进行绘制。
绘制4个不同半径的圆角边框
border-top-left-radius:左上角半径
border-bottom-left-radius:左下角半径
border-top-right-radius:右上角半径
border-bottom-right-radius:右下角半径
4、图像边框
使用图像边框
在css3中增加了一个border-image属性,可以让元素的长度或宽度处于随时变化时,变化状态的边框统一使用一个图像文件来进行绘制.
1、border-image属性最简单的使用方法:
-webkit-border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距 ;
-moz-border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距 ;
-o-border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距 ;
border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距 ;
上面的参数中,图像的路径、上边距、右边距、下边距、左边距必须进行指定,但是如果上边距、右边距、下边距、左边距得值完全一样,那么就可以缩写为一个。
写法如下:
border-image: url("边框图像的路径") 边距 ;
当我们指定了上边距右边距下边距左边距之后呢!浏览器就会对我们的这个背景图像进行切割,那么他是怎样去对我们的这个图像进行切割的呢?
他会把图像切割成九个部分。
border-top-left-imageborder-top-imageborder-top-right-imageborder-left-imageborder-right-imageborder-bottom-left-imageborder-bottom-imageborder-bottom-right-image
在浏览器中显示的时候,border-top-left-image、border-top-right-image、border-bottom-right-image、border-bottom-left-image不会进行任何的拉伸。
而border-top-image、border-right-image、border-bottom-image、border-left-image会分别作为,上边框、右边框、下边框、左边框的这个背景图像来进行显示,必要的时候呢,还可以将这四个图像进行这个平铺或者伸缩。
2、border-image属性指定边框的宽度
在css3中除了可以使用border属性和border-width属性来指定宽度,我们还可以使用border-image属性进行指定边框的宽度。
指定方法:border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距/border宽度 ;
另外border的宽度也可以对四条边进行分别设置
设置的方法:
border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距/border上宽度 border右宽度 border下宽度 border左宽度;
3、指定四条边的背景的显示方法
在CSS3中可以在border-image属性中指定元素四条边中的图像,是以拉伸的方式显示,还是平铺的方式进行显示。
指定方法如下:
border-image: url("边框图像的路径") 上边距 右边距 下边距 左边距/border宽度 topbottom leftright;
topbottom表示元素的上下两条边中图像的显示方法,leftright表示元素的左右两条边中的显示方式,在显示方法中可以指定的值有repeat、stretch和round。
repeat:将图像以平铺的方式进行显示。
stretch:将图像以拉伸的方式进行显示。
round:将图像进行平铺显示,但是如果最后一幅图不能被完全显示时,就不显示图像,把之前的图像扩大。
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
background-color:#000;
width:300px;height:150px;
border:dashed 30px green;
padding:30px;
/*background-clip:border-box;
background-clip:padding-box;*/
background-clip:content-box;
-moz-background-clip:border;
-webkit-background-clip:border-box;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>Css3中新增的background-clip属性border-box默认 padding-box content-box</h1>
<div>Css3中新增的background-clip属性</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:600px;height:300px;
background-image:url('./data/html5.png');
background-repeat:no-repeat;
border:dashed 30px green;
padding:30px;
background-origin:border-box;
/*
old
-moz-background-origin:padding\border\centent;
-webkit-background-origin:padding\border\centent;
new
-moz-background-origin:padding-box\border-box\centent-box;
-webkit-background-origin:padding-box\border-box\centent-box;
-o-background-origin:padding-box\border-box\centent-box;
*/
background-size:auto;
/*
-moz -webkit -o w3c
background-size:auto\w-h!-auto\2%!-auto\cover放大\contain缩小*/
background-break:continuous;
/*background-break:continuous\bounding-box\each-box*/
/*background-image:url(1.png),url((1.png),url((1.png)*/
background-position:center;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>Css3中新增的background-origin属性padding-box默认 border-box centent-box</h1>
<div>Css3中新增的background-origin属性</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{width:300px;height:150px;
background-color:#000;
border:dashed 30px green;
/*border-radius:30px 90px;*/
border-top-left-radius:60px;
border-bottom-right-radius:60px;
border-top-right-radius:90px;
border-bottom-left-radius:90px;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>border-radius属性</h1>
<div>1个全部 2个左上右下对称 没border设置背景圆角/div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{width:300px;height:300px;
-webkit-border-image:url(./data/html5.png) 100/25px 50px 75px 100px stretch round;
/*border-width:100px;*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>border-image属性</h1>
<div></div>
</body>
</html>
49.CSS3中的变形功能
第九讲:CSS3的变形功能
<div>
这css3中,可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理。
课后目标:
第一、掌握css3中transform功能的使用方法,能够使用transform功能来实现文字或图像的旋转、缩放、倾斜、移动的变形效果。
第二、能够将旋转、缩放、倾斜和移动,这四种变形效果进行结合使用,并且知道如果使用的先后顺序不同,页面显示的结果会是怎样的一个区别。
1、如何使用transform功能
在css3中通过transform属性,来实现transform功能。
transform:功能;
-ms-transform:功能; /* IE 9 */
-moz-transform:功能; /* Firefox */
-webkit-transform:功能; /* Safari 和 Chrome */
-o-transform:功能; /* Opera */
2、rotate 旋转,在参数中规定角度
使用方法:
-ms-transform:rotate(角度); /* IE 9 */
-moz-transform:rotate(角度); /* Firefox */
-webkit-transform:rotate(角度); /* Safari 和 Chrome */
-o-transform:rotate(角度); /* Opera */
rotate表示的是顺时针旋转,deg是CSS3中的角度单位。
3、scale缩放转换
使用方法:
transform:scale(值),他的值是指定的缩放倍率,比如0.5就是缩放到50%,1就是100%,1.5就是放大点150%。
可能的值:
1)、scale(x,y)使元素X轴和Y轴同时缩放
2)、scaleX(x)元素仅X轴缩放
3)、scaleY(y)元素仅Y轴缩放
4、倾斜skew
使用方法:transform:skew(值),他的值是角度。
可能的值:
1)、skew(x,y)使元素在水平和垂直方向同时扭曲(X轴和Y轴同时按一定的角度值进行扭曲变形)只有一个参数时,只在水平方向上倾斜。
2)、skewX(x)仅使元素在水平方向扭曲变形(X轴扭曲变形)
3)、skewY(y)仅使元素在垂直方向扭曲变形(Y轴扭曲变形)
5、移动translate
使用方法:transform:translate(值),他的值是指定移动的距离。
可能的值:
1)、translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动)只有一个参数时,只在水平方向上移动;
2)、translateX(x)仅水平方向移动(X轴移动)
3)、translateY(Y)仅垂直方向移动(Y轴移动)
6、对一个元素使用多种变形的方法:
使用方法:transform:方法1 方法2 方法3 方法4;
7、改变元素基点transform-origin
可能的值top left top right topleft center right bottom leftbottom bottom right
浏览器兼容情况:
</div>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
-ms-transform:rotate(30deg);/*ie9*/
-moz-transform:rotate(30deg);/*firefox*/
-webkit-transform:rotate(30deg);/*safari and chrome*/
-o-transform:rotate(30deg);/*opera*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform属性rotate旋转</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
}
div:hover{
-ms-transform:scale(2,2);/*ie9*/
-moz-transform:scale(2,2);/*firefox*/
-webkit-transform:scalex(0.5);/*safari and chrome*/
-o-transform:scaley(2);/*opera*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform属性scale缩放大</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
}
div:hover{
-ms-transform:skew(45deg,45deg);/*ie9*/
-moz-transform:skew(45deg);/*firefox*/
-webkit-transform:skewx(45deg);/*safari and chrome*/
-o-transform:scaley(45deg);/*opera*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform属性skew倾斜</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
}
div:hover{
-ms-transform:translate(45px,45px);/*ie9*/
-moz-transform:translate(45px);/*firefox*/
-webkit-transform:translateX(45px);/*safari and chrome*/
-o-transform:translateY(45px);/*opera*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform属性translate移动</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
}
div:hover{
-ms-transform:translate(45px,45px);/*ie9*/
-moz-transform:translate(45px) scale(0.5,0.5);/*firefox*/
-webkit-transform:translateX(450px) rotate(45deg);/*safari and chrome*/
-o-transform:translateY(45px) skew(45deg,45deg);/*opera*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform属性多种变形</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
width:300px;height:300px;
background-color:#000;
}
div:hover{
-ms-transform:translate(45px,45px);/*ie9*/
-moz-transform:translate(45px) scale(0.5,0.5);/*firefox*/
-webkit-transform:rotate(45deg);/*safari and chrome*/
-o-transform:translateY(45px) skew(45deg,45deg);/*opera*/
-webkit-transform-origin:bottom right;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transform-origin属性改变元素基点
topleft top righttop
left center right
bottomleft bottom bottomright
</h1>
<div></div>
</body>
</html>
50.CSS3中的动画功能
<table>
第十讲:CSS3的动画功能
在CSS3中,如果使用动画功能可以使网页上文字或者图像具有动画效果,可以使背景颜色从一种颜色平滑过渡到另外一种颜色,Transition功能支持从一个属性值平滑到另外一个属性值,Animations功能支持通过关键帧的指定来在页面上产生更复杂的动画效果.
课后目标:
1、掌握CSS3中Transition功能的使用方法,以及能够使用Transition功能来实现属性值的开始值与属性得结束值之间的平滑过渡的动画。
2、掌握CSS3中Animations功能的使用方法,能够在样式中创建多个关键帧,在这些关键帧之中,编写样式,并且能够在页面中创造结合这些关键帧所运行的较为复杂的动画。
1、Transition功能
css3中transition允许css的属性值在一定的时间区间内平滑地过渡。这种效果可以在鼠标单击、获得焦点、被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值。
transition属性的使用方法:
transition:语法;
-moz-transition: 语法; /* Firefox 4 */
-webkit-transition:语法; /* Safari 和 Chrome */
-o-transition:语法; /* Opera */
语法:
transition: property duration timing-function delay;
transition主要包含四个属性值:
1)、执行变换的属性:transition-property,属性规定应用过渡效果的 CSS 属性的名称。(当指定的 CSS 属性改变时,过渡效果将开始)
值有三个类型:
A、none 没有属性会获得过渡效果。
B、all 所有属性都将获得过渡效果。
C、property 定义应用过渡效果的 CSS 属性名称列表,列表以逗号分隔。
2)、变换延续的时间:transition-duration;
规定完成过渡效果需要花费的时间(以秒或毫秒计),默认值0没有效果
3)、在延续时间段,变换的速率变化transition-timing-function;
值:
A、ease:(逐渐变慢)默认值,ease函数等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0).
B、linear:(匀速),linear 函数等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0).
C、ease-in:(加速),ease-in 函数等同于贝塞尔曲线(0.42, 0, 1.0, 1.0).
D、ease-out:(减速),ease-out 函数等同于贝塞尔曲线(0, 0, 0.58, 1.0).
E、ease-in-out:(加速然后减速),ease-in-out 函数等同于贝塞尔曲线(0.42, 0, 0.58, 1.0)
F、cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中定义自己的值。可能的值是 0 至 1 之间的数值。
4)、变换延迟时间transition-delay;
transition-delay是用来指定一个动画开始执行的时间,也就是说当改变元素属性值后多长时间开始执行transition效果,其取值:*time>为数值,单位为s(秒)或者ms(毫秒)
2、Animations功能
在CSS3之中我们除了可以使用transition实现动画效果之外呢,我们还可以使用Animations来实现动画效果。
1、使用transition和Animations的区别:
transition和Animations的区别在于,transition只能通过指定属性的开始值与结束值,然后通过两属性值之间进行平滑过渡的方式来实现动画效果,所以transition不能实现复杂的动画效果,而Animations功能是是通过关键帧以及每个关键帧中的属性值来实现更为复杂的动画效果。
2、Animations的使用方法:
@-webkit-keyframes 关键帧合集名称{创建关键帧的代码}
0%~100%{
本关键帧中的样式
}
关键帧创建好了之后,还要在元素的样式中使用该关键帧。
方法如下:
元素{
-webkit-animation-name:关键帧合集名称;
-webkit-animation-duration:5s;
-webkit-animation-timing-function:linear;
-webkit-animation-iteration-count:infinite;
}
-webkit-animation-name指定合集名称,-webkit-animation-duration整个动画执行完成所需的时间、需要的时间,-webkit-animation-timing-function实现动画的方法,-webkit-animation-iteration-count属性的属性值设定为某个整数值,那么这个动画播放的次数就等于这个整数值(infinite是无限循环播放)。
3、实现动画的方法:
A、linear:从开始到结束都是以同样的速度进行.
B、ease-in:开始速度很慢,然后沿着曲线进行加快.
C、ease-out:开始速度很快,然后沿着曲线进行减速.
D、ease:开始时速度很快,然后沿着曲线进行减速,然后再沿着曲线加速.
E、ease-in-out:开始时速度很慢,然后沿着曲线进行加速,然后再沿着曲线减速.
</table>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{width:200px;height:200px;background-color:green;
transition:all 1s linear 20s;
-moz-transition:none 1s ease 0;/*firefox4*/
-webkit-transition:all 1s cubic-bezier(0,0.5,0,0) 0; /*safari and chrome*/
-o-transition:background-color 1s ease-out 0,width 1s ease-in-out 0,height 1s ease-in 0;/*opera*/
}
div:hover{background-color:#f60;width:400px;height:400px;}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>transition属性</h1>
<div></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{width:200px;height:200px;background-color:#f60;
}
@-webkit-keyframes mycolor{
0%{background-color:#f60;-webkit-transform:rotate(0deg);
-webkit-transform:translate(0px,0px);
}
10%{background-color:green;/*width:100px;*/-webkit-transform:rotate(30deg)
-webkit-transform:translate(100px,0px);
}
20%{background-color:red;/*width:200px;*/-webkit-transform:rotate(0deg)}
80%{background-color:#000;/*width:800px;*/-webkit-transform:rotate(30deg)}
100%{background-color:#f60;/*width:1000px;*/-webkit-transform:rotate(0deg)}
}
div:hover{
-webkit-animation-name:mycolor;
-webkit-animation-duration:2s;
-webkit-animation-timing-function:linear;
-webkit-animation-iteration-count:1;
/*-webkit-animation-iteration-count:infinite;循环*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>animations属性</h1>
<div></div>
</body>
</html>
51.布局相关的样式-多栏布局
第十一讲:布局相关样式
什么是网页的布局?网页布局呢是指在页面中如何对标题、导航栏、主要内容、页脚、表单等各种构成要素进行一个合理的编排。在使用啊CSS3之前呢,主要使用float属性或position属性进行页面的简单布局,但是呢他们也有他们的缺点,比如在两栏或者多栏布局的时候,会出现元素的内容高度不一致,那么导致他们的底部很难对齐,在CSS3中追加了一些新的布局方式,使用这些新的布局方式,除了可以修改之前存在的问题之外,还可以进行更为便捷更为复杂的页面布局。
课后目标:
第一点、掌握CSS3中多栏布局的使用方法,知道为什么要想多栏布局。
第二点、掌握CSS3中盒布局的方法,知道为什么要使用盒布局。
第三点、掌握CSS中弹性盒布局的基本概念及使用方法。
1、多栏布局
1、column-count属性
在CSS3中可以通过,column-count属性来进行多栏布局,这个属性的含义是将一个元素中的内容分成多栏进行显示。
写法:
column-count: 栏目数;
兼容性写法:
-webkit-column-count:3;
-moz-column-count:3;
需要注意的是,在使用多栏布局的时候,要将元素的宽度设置成多个栏目的总宽度。
2、column-width属性:指定栏目的宽度来生成分栏。
兼容性写法: -webkit-column-width、-moz-column-width
3、column-gap属性:指定栏目与栏目之间的距离
兼容性写法: -webkit-column-gap、-moz-column-gap
4、column-rule属性:栏目与栏目之间增加一条分割线
兼容性写法: -webkit-column-rule、-moz-column-rule
52.布局相关的样式-盒布局
2、盒布局
盒布局的基础知识
1、使用float属性和position属性时的缺点
在CSS3中,除了多栏布局之外,还可以使用盒布局来解决使用float属性和position属性时多栏底部不能对齐的缺点。
首先来实现一个float属性布局的案例,并且找到缺点。
2、使用盒布局
在CSS3中,使用box属性来使用盒布局,在火狐中要把box写成“-moz-box”的形式,在谷歌浏览器中呢需要写成“-webkit-box”的形式。
综合上一个案例,将他修改成盒布局。
3、盒布局与多栏布局的区别
多栏布局的栏目宽度必须相等,指定栏目的宽度的时候也只能统一指定,栏目的宽度不可能全都一样,所以多栏布局比较适合在文字内容页面使用,并不适合整个网页编排时使用。
53.布局相关的样式-弹性盒布局
3、弹性盒布局
1、使用自适应窗口的弹性盒布局
如何才能让DIV的宽度跟随浏览器窗口变化而变换呢?在CSS3中我们只要使用一个box-flex属性,使得我们的盒布局变成弹性盒布局就可以了。
兼容性写法:
-webkit-box-flex (Safari浏览器、Chrome浏览器时前面加-webkit-)
-moz-box-flex (Firefox浏览器时前面加-moz-)
2、改变元素的显示顺序
使用弹性盒布局的时候,可以通过box-ordinal-group属性来改变各个元素的显示顺序,在每个元素中加入box-ordinal-group属性,这个属性使用一个表示序号的正数属性值,浏览器在显示的时候根据序号从小到大来显示这些元素。
兼容性写法:
-webkit-box-ordinal-group (Safari浏览器、Chrome浏览器时前面加-webkit-)
-moz-box-ordinal-group (Firefox浏览器时前面加-moz-)
3、改变元素的排列方向
在使用弹性盒布局的时候,可以通过box-orient来指定多个元素的排列方向。
值:
horizontal 在水平行中从左向右排列子元素。
vertical 从上向下垂直排列子元素。
兼容性写法:
-webkit-box-orient:vertical (Safari浏览器、Chrome浏览器时前面加-webkit-)
-moz-box-orient:vertical (Firefox浏览器时前面加-moz-)
4、元素的宽度与高度自适应
在使用盒布局的时候,元素的宽度与高度具有自适应性,就是元素的宽度与高度可以根据排列方向的改变而改变。
5、使用弹性盒布局来消除空白
方法就是给子DIV中加入一个box-flex属性
6、对多个元素使用box-flex属性
让浏览器或者容器中的元素的总宽度或者是总高度都等于浏览器或者是容器的高度。
方法对多个元素使用box-flex属性
7、指定水平方向与垂直方向的对齐方式
使用盒布局的时候,可以使用box-pack属性及box-align属性来指定元素中的文字、图像、以及子元素的水平方向或者是垂直方向上的对齐方式。
兼容性写法:
-webkit-box-pack:值 (Safari浏览器、Chrome浏览器时前面加-webkit-)
-moz-box-pack:值 (Firefox浏览器时前面加-moz-)
-webkit-box-align:值 (Safari浏览器、Chrome浏览器时前面加-webkit-)
-moz-box-align:值 (Firefox浏览器时前面加-moz-)
属性值box-pack属性值的含义box-align属性值的含义start左对齐,文字、图像或子元素被放置在元素最左边顶部对齐,文字.图像或子元素被放置在元素最顶部center中对齐,文字、图像或子元素被放置在元素中部中部对齐,文字、图像或子元素被放置在元素中部end右对齐,文字、图像或子元素被放置在元素最右边底部对齐,文字、图像或子元素被放置在元素最底部start顶部对齐,文字、图像或子元素被放置在元素最顶部左对齐,文字、图像或子元素被放置在元素最左边center中部对齐,文字、图像或子元素被放置在元素最中部中对齐,文字、图像或子元素被放置在元素最中部end底部对齐,文字、图像或子元素被放置在元素最底部右对齐,文字、图像或子元素被放置在元素最右边
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
#div1,#div2{
width:450px;float:left;
background-color:green;
}
#div1{margin-right:30px;}
#div3{clear:both;width:100%;height:300px;float:none;
background-color:#000;color:#fff;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<div id="div1">eeeeeeeeeeeeeeeeeeeeeeeeeee</div>
<div id="div2">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
<div id="div3">ffffffffffffffffffffffffffffffffffff</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
#div1{width:100%;
/*-webkit-column-count:3;
-moz-column-count:3;适应浏览器窗口*/
-webkit-column-width:150px;
-moz-column-width:150px;
-webkit-column-gap:50px;
-moz-column-gap:50px;
-webkit-column-rule:solid 1px #f60;
-moz-column-rule:solid 1px #f60;
}
#div3{width:100%;height:300px;
background-color:#000;color:#fff;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<div id="div1">eeeeeeeeeeeeeyyyyyyyyyyeeeeeey yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy eeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeeyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
<div id="div3">ffffffffffffffffffffffffffffffffffff</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
#centerboy{width:1000px;margin:0 auto;}
div#left{float:left;width:300px;padding:10px;background-color:green;}
div#right{float:right;width:300px;padding:10px;background-color:#ff39ca;}
div#center{float:left;width:400px;background-color:blue;}
div#left,div#center,div#right{
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>float属性布局</h1>
<div id="centerboy">
<div id="left">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
<div id="center">
<p>uiuiui斤斤计较经济军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军</p>
</div>
<div id="right">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
#centerboy{width:1000px;margin:0 auto;
display:-moz-box;
display:-webkit-box;
}
div#left{/*float:left*/;width:300px;padding:10px;background-color:green;}
div#right{/*float:right*/;width:300px;padding:10px;background-color:#ff39ca;}
div#center{/*float:left*/;width:400px;background-color:blue;}
div#left,div#center,div#right{
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>float属性布局</h1>
<div id="centerboy">
<div id="left">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
<div id="center">
<p>uiuiui斤斤计较经济军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军</p>
</div>
<div id="right">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{margin:0;padding:0;}
#centerboy{/*width:1000px;margin:0 auto;*/
display:-moz-box; /*搞定底部不对齐*/
display:-webkit-box;
-webkit-box-orient:vertical; /*垂直方向*/
-moz-box-orient:horizontal; /*水平方向*/
}
div#left{/*float:left;width:300px;*/padding:10px;background-color:green;
-webkit-box-ordinal-group:3; /*显示顺序*/
-moz-box-ordinal-group:3;
}
div#right{/*float:right;width:300px;*/padding:10px;background-color:#ff39ca;
-webkit-box-ordinal-group:2;
-moz-box-ordinal-group:2;
}
div#center{/*float:left;*//*width:400px;*/background-color:blue;
-webkit-box-flex:1; /*适应窗口*/
-moz-box-flex:1;
-webkit-box-ordinal-group:1;
-moz-box-ordinal-group:1;
}
div#left,div#center,div#right{
-webkit-box-sizing:border-box; /*定位方式*/
-moz-box-sizing:border-box;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>弹性盒布局</h1>
<div id="centerboy">
<div id="left">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
<div id="center">
<p>uiuiui斤斤计较经济军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军军</p>
</div>
<div id="right">
<h2>栏目列表</h2>
<ul>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
<li><a href="demo.html">栏目名称</a></li>
</ul>
</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div#conterbody{
display:-moz-box;display:-webkit-box;
border:solid 5px green;
-webkit-box-orient:vertical;-moz-box-orient:horizontal;
width:501px;height:400px;
}
div#div1{background-color:#0064ff;
-webkit-box-flex:1;-moz-box-flex:1;
}
div#div2{background-color:#ff39ca;
-webkit-box-flex:2;-moz-box-flex:2;
}
div#div3{background-color:#198000;
-webkit-box-flex:3;-moz-box-flex:3;
}
div#div1,div#div2,div#div3{
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
font-size:30px;
/*-webkit-box-flex:1; /*平分*/
-moz-box-flex:1;*/
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>弹性盒布局元素宽度高度自适应</h1>
<div id="conterbody">
<div id="div1">This is a Div1</div>
<div id="div2">This is a Div2</div>
<div id="div3">This is a Div3</div>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
div{
display:-webkit-box;diaplay:-moz-box;
-moz-box-align:start;-webkit-box-align:center;
-moz-box-pack:center;-webkit-box-pack:end;
width:300px;height:280px;background:blue;
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>弹性盒布局指定文字图像水平垂直方向的对齐方式</h1>
<div>
中
</div>
</body>
</html>
54.Media Queries 与自适应布局
第十二讲:不同浏览器窗口大小加载不同CSS样式
1、Media Queries
Media Queries模块 CSS3中的一个和各种媒体相关的重要模块。
课后目标:
目标一:掌握CSS3中的Media Queries模块的基本概念,以及使用Media Queries模块 可以实现的功能。
目标二:掌握如何编写媒体表达式来让浏览器根据当前窗口尺寸自动在样式表中挑选一种样式并使用。了解iPhone和iPad touch设备在支持Media Queries时,有何特殊之处,以及应该用何种方法来制定iPhone或者iPad touch设备中的Safari浏览器在处理页面是根据多少像素的窗口来处理。
目标三:掌握媒体查询表达式编写方法,掌握css3中定义所有设备类型及设备特性、媒体查询表达式中各种关键字的含义,以及结合使用设备类型设备特征和各种关键字来正确的编写媒体查询表达式。
2、使用方法
Media Queries的使用方法:
@media 设备类型 and (设备特征){样式代码}
在样式的代码开头必须要写@media,然后制定设备的类型(媒体类型)
可以指定的值与其所代表的设备类型all所有设备screen电脑显示器print打印用纸或者打印预览图handheld便携设备tv电视机类型设备speech语音和音频合成器braille盲人用点字法触觉回馈设备embossed盲文打印机projection各种投影设备tty使用固定密度字母栅格的媒介,比如电传打字机和终端。
设备特性的书写方式与样式的书写方式呢很相似,分为两个部分,当中有冒号分隔,冒号前书写设备的某种特性,冒号后书写该特性的具体值。例如,需要指定浏览器的窗口宽度大于400px时,我们可以这样书写(min-width:400px),大部分设备特性的指定值接受min/max的前缀,用来表示大于等于或小于等于的逻辑,以此来避免使用<和>这些字符。13种设备的特性说明特效可指定的值是否允许使用min/max前缀特性说明width带单位的长度数值允许浏览器的窗口宽度height带单位的长度数值允许浏览器窗口的高度device-width带单位的长度数值允许设备屏幕的分辨值device-height带单位的长度数值允许设备屏幕分辨率的最高值orientation只能指定2个值padding或landscape不允许浏览器的方向是纵向还是横向,当浏览器的高度值大于等于浏览器的宽度值的时候,这个特性的portrait否则为landscapeaspect-ratio比例值允许浏览器窗口的纵横比,比例值为浏览器窗口的宽度值/高度值device-aspect-ratio比例值允许屏幕分辨率的纵横比,比例值为设备屏幕分辨率的宽度值/高度值color整数值允许设备使用多少位的颜色值,如果不是彩色设备,该值为0color-index整数值允许色彩表中的色彩数monochrome整数值允许单色帧缓冲器中每像素的字节数resolution分辨率值允许设备的分辨率scan只能指定两个值progressive或interlace不允许电视机类型设备的扫描方式。progressive表示逐行扫描,interlace表示隔行扫描grid只能指定两个值0或1不允许设备是基于栅格还是基于位图。基于栅格时该值为1,否则该值为0
使用and关键字来指定某种设备类型的某种特性的值满足某个条件时所使用样式, 比如以下语句指定了,当设备窗口宽度小于640px时所使用的样式。
@media screen and (max-width:639px){
样式代码
}
可以使用多条语句来将同一个样式应用于不同的设备类型的设备特性中,指定方式如下:
@media handheld and (min-width:360px),screen and (min-width:480px){
样式代码
}
可以在样式中加入not关键字和only关键字,not表示去反,only是让那些不支持@Media Queries但是可以读取Media Type的设备的浏览器,将表达式中的样式隐藏起来。
not示例:
@media not handheld and (color){样式代码}
/*样式将被使用在除开便携设备和非色彩携带设备的所有设备中*/
@media all and (not color)
/*样式将被使用在所有非彩色设备中*/
其他的引入方式:
<link rel="stylesheet" media="screen and (max-width: 600px)" href="600.css" />
/*当页页宽度小于或等于600px,调用600.css样式表来渲染你的Web页面。*/
或者:
<style type="text/css" media="screen">
@import url("css/style.css");
</style>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
@media screen and (min-width:400px){
div#diva{
background-color:#f60;
width:400px;height:400px;
}
}
@media screen and (min-width:800px){
div#diva{
background-color:#0752ff;
width:800px;height:800px;
}
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>Media Queries模块</h1>
<div id="diva"></div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8"/>
<style type="text/css">
body{margin:20px 0;}
div#conterbody{width:960px;margin:auto;}
div#left{width:740px;float:left;}
p{
line-height:600px;
text-align:center;
font-weight:bold;
font-size:2em;
margin:0 0 20px 0;
color:#fff;
}
p#left-z{
width:200px;float:left;
background-color:#0752ff;
}
p#left-y{width:520px;float:right;background:#41db50;}
p#right{width:200px;float:right;background:#f60;}
/*大于1000px的时候*/
@media screen and (min-width:1000px){
div#conterbody{width:1000px;}
div#left{width:780px;float:left;}
p#left-z{width:200px;float:left;background:#0752ff;}
p#left-y{width:560px;float:right;background:#41db50;}
p#right{width:200px;float:right;background:#f60;}
}
/*最大不超过999px 最小不小于640px*/
@media screen and (min-width:640px) and (max-width:999px){
div#conterbody{width:640px;}
div#left{width:640px;float:left;}
p{line-height:430px;}
p#left-z{width:200px;float:left;background:#0752ff;}
p#left-y{width:420px;float:right;background:#41db50;}
p#right{width:100%;float:none;clear:both;background:#f60;
line-height:150px;
}
}
/*最大不超过639px*/
@media screen and (max-width:639px){
div#conterbody{width:100%;}
div#left{width:100%;float:none;}
p{line-height:300px;}
p#left-z{width:100%;float:none;background:#0752ff;}
p#left-y{width:100%;float:none;background:#41db50;}
p#right{width:100%;float:none;clear:both;background:#f60;
line-height:300px;
}
}
</style>
<script type="text/javascript" src="demo.js"></script>
</head>
<body>
<h1>Media Queries模块自适应布局</h1>
<div id="conterbody">
<div id="left">
<p id="left-y">Conter</p>
<p id="left-z">left</p>
</div>
<p id="right">right</p>
</div>
</body>
</html>
实操
55.集团网站建设-全局头部制作
56.集团网站建设-首页新闻列表
57.集团网站建设-首页集团活动制作
58.集团网站建设-首页右部份制作
59.集团网站制作-底部版权信息制作
60.集团网站建设-图片列表页制作
61.集团网站建设-文章内容页制作
62.关于兼容性的问题
第十三讲:HTML5制作企业网站
1、首页制作
兼容问题:
<!--[if lt IE 9]>
<script src="http://libs.useso.com/js/html5shiv/3.7/html5shiv.min.js"></script>
<script src="http://libs.useso.com/js/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
html5shiv.min.js
可以在老式IE里创建main,header,footer等HTML5元素
加速插件 w3c 360 公共库
respond.min.js
让IE6-8 支持 CSS3 Media Query
selectivizr.js
提供大量IE不支持的CSS选择器和属性,包括所有的last-child选择器。
判断IE的方法
<!--[if lt IE 7 ]>IE6<![endif]-->
<!--[if IE 7 ]>IE7<![endif]-->
<!--[if IE 8 ]>IE8<![endif]-->
<!--[if IE 9 ]>IE9<![endif]-->
2、列表页制作
3、内容页制作
G:\Users\Administrator\Desktop\PHP\demo\piclist.html
file:///G://users/administrator/desktop/php/demo/piclist.html
opacity:1;透明度
id只能1个
class多个
Q:782590844
有思维导图可行有备份学会就ok
自定义打字编程学习单词-->
24字母音标 练全部 熟能生巧
8k250个 4k120个打折
10 5官方
50 10j 50 20j 130j1x
xml html5基础路线等-->精通高级程序移动游戏search资料中国网站应用教程视频论坛
discuz
132190
标签:index,name,元素,基础,echo,PHP,data,id From: https://www.cnblogs.com/KooTeam/p/18606856