position 在英文中表示“位置”的意思 它主要是用于实现对元素的定位
在CSS中定位分为三种:
position:fixed 固定定位
position:relatvie 相对定位
position:absolute 绝对定位
position:static 无特殊定位 (默认值)。
注意:
在使用定位属性时,一定要配合定位的坐标来使用!
left:表示定位的元素离左边多远
right:表示定位的元素离右边多远
top:表示定位的元素离上边多远
bottom:表示定位的元素离下边多远
1固定定位
语法:
position:fixed
固定定位,它是相对于浏览器窗口来进行定位。不管页面如何滚动,固定定位元素显示的位置不会改变!
特点:
固定定位元素它脱离了标准文档流
固定定位元素的的层级比标准文档流里面的元素要高 所以固定定位元素它会压盖住标准文档流里面的元素
固定定位元素它不再占用空间
固定定位元素它显示的位置不会随着浏览器滚动而滚动
2相对定位
语法:
position:relative;
相对定位它是相对于“原来的自己”来进行定位!
特点:
相对定位元素它没有脱离标准文档流
相对定位元素如果没有设置定位的坐标,那么相对定位元素它还在原来的位置
相对定位元素设置了定位的坐标以后,那么它会在老家留下一个坑
相对定位元素它会将标准文档流中的元素压盖住。
相对定位元素的定位坐标值可以是负数
注意:
相对定位元素它会在老家留下一个坑,所以一般情况下它很少单独使用,相对定位元素它主要是用来配合“绝对定位”元素来使用的。
3绝对定位
语法:
position:absolute;
什么是绝对定位?
绝对定位元素是相对于“祖先定位元素”来进行定位!
什么是祖先定位元素?
绝对定位元素它会先去查找其父元素是否设置了定位的属性
如果有设置定位的属性 那么它就会相对于其父元素来进行定位;
但是如果它的父元素没有设置定位属性 那么它就会去查找其父元素的上一级元素是否设置了定位的属性,
如果有设置就相对于其父元素的上一级元素进行定位
但是如果没有设置 那么会继续往向一级进行查找,
如果其祖先元素都没有设置定位属性,那么它会相对于“浏览器窗口”来进行定位!
①自己设置了绝对定位时:如果父元素没有设置定位属性,那么就相对于body进行定
②自己设置了绝对定位时:如果父元素也设置定位属性,那么就会相对于父元素进行定位
③自己设置了绝对定位时:如果父元素也设置定位属性,那么就会相对于父元素进行定位
jQuery.ajax(options)
参数说明:
options :只有一个参数,要求是JSON格式的数据,其可以设置如下属性:
async :是否异步,true代表异步,false代表同步。默认为true
cache :是否缓存,true代表缓存,false代表不缓存,默认为true
complete :当Ajax状态码为4时所触发的回调函数
contentType :请求头,如果是POST请求,此参数为application/x-www-form-urlencoded
data : 发送Ajax请求时所传递的参数,要求是一个字符串
dataType :期待的返回值类型,可以是text/xml/json数据类型
success :当Ajax状态码为4且响应状态码为200时所触发的回调函数
type :发送的http请求,可以是get,也可以是post
url :请求的url地址
一.什么是同步请求:(false)
同步请求即是当前发出请求后,浏览器什么都不能做,必须得等到请求完成返回数据之后,才会执行后续的代码,相当于是排队,前一个人办理完自己的事务,下一个人才能接着办。也就是说,当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面处于一个假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面解除假死状态(即当ajax返回数据后,才执行后面的function2)。
二.什么是异步请求:(true)
异步请求就当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。
一般默认值为true,异步。异步请求可以完全不影响用户的体验效果,无论请求的时间长或者短,用户都在专心的操作页面的其他内容,并不会有等待的感觉。
魔术方法包括:
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
① 传参方式不同
get请求是在url的尾部传递参数的
post请求是在请求空白行的位置传递参数的
② 传参的大小不同
get请求,其传参的最大值为2kb
post请求理论上是没有任何限制的,但是实际应用中,受到php.ini文件的影响,一般为2M
③ 传参的类型不同
get请求,只能传递字符串
post请求,不仅可以传递字符串还可以传递二进制数据
④ 安全性不同
相对而言,post请求的安全性要略高于get请求
其请求头参数不同
I接收函数
M:实例化基础模型类
D:实例化自定义模型类
U:对URL地址进行组装
1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
共同点:做规范用
抽象类:不能被实例化,只能被继承;通过关键字abstract声明;抽象类中至少要包
含一个抽象方法,该抽象方法没有方法体,天生要被子类重写;
接口:通过interface声明;接口中的成员常量和方法都是 public 的,方法可以不写关键字 public;接口能实现多继承;
抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字
abstract 来声明的。
抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要 包含一个抽象方法,
抽象方法没有方法体,该方法天生就是要被子类重写的。 抽象方法的格式为:abstract function abstractMethod();
接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可 以不写关键字 public,
接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。 抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽
象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用implements。
防止类和函数方法冲突
命名空间可以解决下面两个问题:
(1)用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
(2)为很长的标识符创建一个别名,提高代码的可读性,减少代码的编写量。
ThinkPHP3.2
PHP 在 5.3.0 以后的版本开始支持命名空间。
PDO: PHP访问数据库定义的一个轻量级的一致接口。
CURL扩展
GD扩展
Memcache
Mysql
SVN作用:协同开发。
融合:
更新:
MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
MVC所指的就是在软件设计中一种编程模式。在该模式下会将业务操作、数据显示、数据交互会进行一个拆分操作
M:代表就是具体的模型(model) 主要作用就是与数据库进行数据交互
V:代表就是具体的视图(view)主要作用就是与用户进行数据交互
C:代表就是具体的控制器(controller)主要作用就是处理具体的业务逻辑
由模型(model),视图(view),控制器(controller)完成的应用程序,model 层负责提供数据,和数据库有关的操作都交给模型层来处理,view 层则提供交互的界面,并输出数据,而 controller 层则负责接收请求,并分发给相应的 model 来处理,然后调用 view 层来显示。
商品id,商品名称,商品货号,商品分类id,市场售价,本店售价,商品缩略图,商品缩略小图,是否热卖 1表示热卖 0表示不是,是否推荐 1表示推荐 0表示不推荐,是否热卖 1表示新品 0表示不是,添加时间,表示商品是否删除 1正常 0删除状态,商品是否销售 1销售 0下架状态,
商品表中的属性存成一个集合,属性表
对比一下两者,有以下几点不同:
1.作用位置:cookie是在客户端保存用户信息,session实在服务器端保存用户信息;
2.保存内容:cookie保存的是字符串,session中保存的是对象;
3.作用时间:cookie可以长期保存在客户端,session随会话结束而关闭;
4.一般cookie保存不重要的用户信息,重要的信息由session保存。
5、cookie分为两种:会话cookie和文件Cookie。会话cookie当浏览器关闭时,数据消失,文件Cookie是将数据存储在一个文件中,设置过期时间,关闭浏览器后,若没到过期时间,再次打开浏览器,数据还存在。
分两种情况:
1、用户没有登录,将数据存储在cookie中,若用户登录,再将cookie中的数据转存到数据库。
2、用户登录后,将数据直接存储到数据库。
基于角色的权限访问控制(Role-Based Access Control)
五张表:两个中间表 admin、role、rule、admin_role、role_rule
三张表:一个中间表
通过代码控制不同的管理员是否能够访问某个方法的过程就是权限控制。
RBAC(Role-Based AccessControl,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
先下载第三方接口文件,
JS客户端验证验证
手机号限制短信条数(计数器)
(一)增加图形验证
恶意攻击者采用自动化工具,调用“动态短信获取”接口进行动态短信发送,原因主要是攻击者可以自动对接口进行大量调用。
采用图片验证码可有效防止工具自动化调用,即当用户进行“获取动态短信” 操作前,弹出图片验证码,要求用户输入验证码后,服务器端再发送动态短信到用户手机上,该方法可有效解决短信轰炸问题。
安全的图形验证码必须满足如下防护要求
- 生成过程安全:图片验证码必须在服务器端进行产生与校验;
- 使用过程安全:单次有效,且以用户的验证请求为准;
- 验证码自身安全:不易被识别工具识别,能有效防止暴力破解。
图形验证的示例:
(二)单IP请求次数限制
使用了图片验证码后,能防止攻击者有效进行“动态短信”功能的自动化调用;
但若攻击者忽略图片验证码验证错误的情况,大量执行请求会给服务器带来额外负担,影响业务使用。建议在服务器端限制单个 IP 在单位时间内的请求次数,一旦用户请求次数(包括失败请求次数)超出设定的阈值,则暂停对该 IP 一段时间的请求;若情节特别严重,可以将 IP 加入黑名单,禁止该 IP 的访问请 求。该措施能限制一个 IP 地址的大量请求,避免攻击者通过同一个 IP 对大量用户进行攻击,增加了攻击难度,保障了业务的正常开展。
(三)限制发送时长
建议采用限制重复发送动态短信的间隔时长, 即当单个用户请求发送一次动态短信之后,服务器端限制只有在一定时长之后(此处一般为60秒),才能进行第二次动态短信请求。该功能可进一步保障用户体验,并避免包含手工攻击恶 意发送垃圾验证短信。
完整的动态短信验证码使用流程
具体同步回调跟异步回调
同步回调作用:实现当用户支付完成之后能够跳转到对应的商户页面(确保用户支付完成之后能够正确的对用户的支付做一个处理操作)
异步回调作用:确保商户对用户的支付做了一个正确的处理
1、申请支付宝账户信息,得到相应的APPID与公钥(交给支付宝)、私钥(自己保存)
2、下载官方文档,在本地搭建demo测试,config.php中设置APPID、同步异步回调地址、支付宝私钥等信息。
3、创建后台应用
4、具体使用代码实现支付功能
异步回调作用:确保商户对用户的支付做了一个正确的处理
1、确保同步没执行,异步单方面请求。()
2、解决掉单问题
3、比较安全
同步回调作用:实现当用户支付完成之后能够跳转到对应的商户页面(确保用户支付完成之后能够正确的对用户的支付做一个处理操作)(get方式)
异步回调作用:确保商户对用户的支付做了一个正确的处理(post方式)
查找文件:
find
-name根据文件名字进行查找
-group :根据文件的所属组进行搜索
-user :根据文件的拥有者进行搜索
locate指令,用于检索数据
locate 文件名称
df指令:显示磁盘信息
-l :显示本地磁盘信息
-h :以1024进制显示磁盘信息
-H :以1000进制显示磁盘信息
-T :显示磁盘格式信息
-t :显示指定格式的磁盘信息
cd 用户名:进入用于
cd ~ :回到家
yy:复制 p :粘贴
vim 文件名: 查看文件
1、301 MovedPermanently:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。永久重定向。
2、302 Move temporarily:请求的资源临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求
3、404 Not Found:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的
4、200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是
表示正常状态。
200(成功):服务器已成功处理了请求。通常,这表示服务器提供了请求的网页
201(已创建):请求成功并且服务器创建了新的资源
202(已接受):服务器已接受请求,但尚未处理
203(非授权信息):服务器已成功处理了请求,但返回的信息可能来自另一来源
204(无内容):服务器成功处理了请求,但没有返回任何内容
205(重置内容):服务器成功处理了请求,但没有返回任何内容
206 (部分内容):服务器成功处理了部分GET 请求
404(未找到):服务器找不到请求的网页
500(服务器内部错误):服务器遇到错误,无法完成请求
require()语句的性能与include()相类似,都是包括并运行指定文件。
不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估;报错时不会阻止后面的代码运行;而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句)。这就意味着如果可能执行多次的代码,则使用require()效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句
incluce在用到时加载
require在一开始就加载
1、找到软件压缩包,解压
2、编译make &&make install
3、配置php.ini
4、重启Apache
逻辑上的一组操作,含有几个组成部分,这几个部分构成一个整体,操作要么全部成功,要么全部失败并返回原状态!
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中。或者rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤消了!
事务的四大特性(ACID)
原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
PHP获取当前时间 time()
Php截取字符串:substr函数
PHP查找字符串中是否有子串:
In_array:判断数组中是否存在某个元素
array_reverse() 将数组中的元素倒叙,返回值为倒叙之后的数组。
array_splice(array1,start,length,array2) 从数组中移除相应的元素,并用新元素替换它
array_push() (进栈)向数组的尾部添加一个或多个元素,
array_pop() (出栈)从数组的中删除最后一个元素
JSONP
CORS
Mysiam与innodb
MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持。
MyISAM 类型的表强调的是性能,其执行速度比 InnoDB 类型更快,但是不提供事务支持,而 InnoDB 提供事务支持以及外部键等高级数据库功能。
创建索引:alert tabletablename add index (`字段名`)
6379
String、hash、list(链表)、set(集合)、zset(有序集合)
秒杀:
使用Redis的list链表,pop操作,即使是很多用户同时到达也是依次执行
1、现将商品表的库存存入队列
2、抢购开始,设置库存的缓存周期
3、客户端执行下单操作,下单前判断redis队列库存量
计数器:
Left join(左联接):是已左表为准,左表中的记录都会出现在查询结果中,如果右表没有相匹配的记录,则以 null 填充。
Right join(右联接):是以右表为准,右表中的记录都会出现在查询结果中,如果左表没有相匹配的记录,则以 null 填充。
Inner join(内联接):两张表地位是平等的,符合联接条件的记录才会出现在查询结果中。
27017,28017
Memcache 缓存是把所有的数据保存在内存中,采用hash 表的方式,把每条数据有 key 和 value 组成,每个 key 独一无二的,当要访问的某个值的时候先按照找到值,然后在返回结果,Memcache采用 LRU 算法来逐渐把过期的数据清除掉
1、设计数据库方面
2、建立索引
3、读写分离
4、缓存
1、添加商品时,商品库存增加。库存表针对不同的属性,添加
2、订单支付成功时,库存会减少
3、订单支付失败,库存不会减少
4、客户退货,库存增加
1、避免全表查询,给相应字段建立索引
2、避免查询语句过长,分批查询。
3、where后面不能有函数运算
4、左原则like第一个字段要有索引
5、在where和group by后面建立索引