1.BOM常用对象:window、screen、history、location、navigator、event
1.history:保存当前窗口的历史纪录(历史url)
作用:history.go(正数);前进
history.go(负数);后退
history.go(0);刷新
2.(重点)location:保存当前窗口在打开的url
常识:一个url由5部分组成
第一部分:协议:http/https(请求响应模式)/ftp(传输文件/ws(广播收听模式:直播))—————根据网页的功能的不同写对应的协议。
第二部分:主机号/域名:www.baidu.com/127.0.0.1 ————主机号不方便记忆所以多半都会购买域名,而且127.0.0.1只能访问自己
第三部分:端口号,8020————默认端口:http:80/https-443默认端口号可以省略
第四部分:文件的相对路径:new/01-3.html /s -百度加密了
第五部分:?wd=178&rsv_spt=1... - 表单提交到服务器的东西 - 请求消息
2、属性:不需要记忆,直接用console.log(location)可以查看到有哪些属性
作用:获取:协议、域名、端口号、文件路径、查询字符串
3.API:跳转
location:"新url";
location.href="新url";
location.assign("新url");
以上三个功能相同,意味着以后不一定非要用a标签跳转
3、navigator:保存了当前浏览器的信息(浏览器的名称/版本号)
属性:navigator.userAgent;
根据字符串截取出浏览器名称&版本号:本来的目的是为了做兼容,但是没用
因为所有的API前辈们都已经设置好了兼容
4.event:事件对象
事件:多半都是用户触发的或浏览器自动触发的操作
1.绑定事件3种
<elen on事件名="js语句"></elem>
缺点:1,没有实现js与HTML的分离 (要让HTML(内容)与CSS(样式)与JS(行为))分离
2.无法动态绑定事件——一次只能绑定一个元素
3.无法同时绑定多个元素
2.(推荐)使用JS的事件属性绑定:
elem.on事件名=function(){
js语句;
}
优点:1.实现了JS与HTML的分离
2.动态绑定事件
缺点:1.无法同时绑定多个函数对象————(算不算缺点,可以把多个函数对象的JS语句写在一起。)
3.使用JS的API绑定事件
主流:elem.addEventListener("事件名",callback);
老IE:elem.attachEvent("on事件名",callback);
(使用兼容模式):
if(elem.addEventListener){
elem.addEventListener("on事件名",callback);
}else{
elem.attachEvent("on事件名",callback)
}
优点:1实现了JS与HTML的分离
2.动态绑定事件
3.同时绑定多个函数对象
缺点:需要处理兼容性问题
2、事件周期:
主流:3个
1、捕获阶段:由外向内,记录着要执行的事件
2、目标触发:当前点击的元素优先出发
3、冒泡触发:由内向外的冒泡触发事件
老IE:2个
没有捕获阶段
3.(重点)获取到事件对象的evemt:
主流:事件函数中传入一个形参e,就可以自动接住事件对象event
老IE:window.event;
兼容:event;不光老IE可用,主流浏览器也可以使用 - 小三上位
2、事件周期:
主流:3个
1、捕获阶段:由外向内,记录着要执行的事件
2、目标触发:当前点击的元素优先出发
3、冒泡触发:由内向外的冒泡触发事件
老IE:2个
没有捕获阶段
3、(重点)事件委托(利用冒泡):
为什么:优化,每绑定一个事件,相当于就创建了一个事件监听对象,创建的对象越多,网页的性能越底下
建议:建议把事件都绑定在自己的父元素身上一次即可
获取目标元素:触发的元素 - 永远不变就是你触发到的元素
当前元素:this -> 指向多的一批
主流:e.target;
老IE:e.srcElement;
兼容:e.srcElement;不光老IE可用,主流浏览器也可以使用 - 小三上位
以后事件之中再也不要使用this了
(拓展内容)客户端存储技术 - 以前使用cookie(缺点:大小有限2kb,30天必死),HTML5提出了一个新概念webStorage:2种(优:大小有限8mb,生命周期无限,缺点:老IE不支持)
1、localStorage:本地级 - 浏览器关闭甚至电脑关闭,第二天打开依然存在
2、sessionStorage:会话级 - 浏览器一旦关闭自动死亡
作用:
1、数据可以跨页面传输
2、皮肤、主题
3、浏览器的历史记录
语法:非常简单,类似于对象:
添加:xxxxStorage.属性名="值";
获取:xxxxStorage.属性名;
删除:xxxxStorage.removeItem("属性名");
清空:xxxxStorage.clear();
服务器端技术 linux
a:学习快速掌握开发 mysql/php
b:生产环境 {安全,稳定,高效,价格}
linux
windows server 2000/2003/2008/ 价格
稳定/windows 一周重新启动... 3w
linux 一年 免费
每一个在网络中运行的程序都会分配网络地址 端口{数字}
80
21
25
1-65535 apache 80 /mysql 3306
IIS 启动占用 80
解决问题:
修改端口 1023-65535
数据库
数据库软件:完成二个功能{任何其它软件都不能完成}
1:海量数据存储
a:变量不能 var i = 10
b:文本文件 存储数据 永久保存
c:数据库
通常情况下数据库数据按表保存 高性能 500w{单表}
500亿{单表}
2:高速查询
114 [项目上手问题 sql server 400w电话]
升级
[高端服务器 8CPU 32GB/ Oracle ..] 公司技术差一些
5s
40分钟
数据库分类
a:关系型数据库非关系型数据
SQL :关系型数据库
数据库保存方式:按表方式这种数据库关系型数据库
用户信息
编号 姓名 年龄
1001 tom 21
1002 jerry 22
示例:oracle mysql sqlserver access ...
NOSQL:非关系型数据
key value
1001 {name:tom,age:19}
1002 {name:jerry,age:21}
示例:redis/memcached
使用哪种:
1:项目中以关系型数据库为主存储
使用非关系型数据库辅助
2:关系型数据库并发量低{数据保存磁盘和内存}
非关系型数据并发量高{数据保存内存}
b:商业公司/开源自由软件
oracle 甲骨文/ sql server 微软/db2 IBM
1:优点
a:功能强大
b:售后完善 24*7 {另外}
c:银行 电信 ...
d:政府 电信 银行 担心
c:开源自由软件 {开源} 互联网 BAT
mysql 为首很多 redis
mysql 数据库 1972 开发 2005 mysql稳定
瑞典公司 MySQL AB--->Sun 10亿美金
Sun 75亿美金 -->Oracle
使用MySQL:
SQL语言 - 操作操作数据库 SQL 92 /SQL 99
-DDL 数据定义语句
-DCL 数据控制语句
-DML 数据操作语句
-DQL 数据查询语句
基本概念:
1:MySQL 数据库管理软件
2:数据库 在MySQL内部可以创建多个库
3:数据表 一个库中保存多张表
4:表是由列与行{记录}组成
DDL - 数据库定义语句{CREATE/ALTER/DROP}
-创建数据库
语法: CREATE DATABASE 数据库名称
示例:
CREATE DATABASE user
-查询当前mysql所有库名称
SHOW DATABASES
**information_schema
**mysql
test
user
**MYSQL自动创建好不要修改,要不删除
**information_schema 虚拟库里保存参数设置值
**MySQL 权限用户等信息
-DROP DATABASE 库名
DROP DATABASE user
**注意事项-软件项目如何防止出现乱码
**在数据库创建过程[指定好编码]
**
-修改指令
CREATE DATABASE 库名 CHARACTER SET 编码
示例:
CREATE DATABASE user01 CHARACTER SET gbk
CREATE DATABASE user02 CHARACTER SET utf8
mysql编码utf8
-查询user02这库创建时指令
SHOW CREATE DATABASE user02
-如果创建库编码指定错
ALTER DATABASE 库名 CHARACTER SET 新编码
-修改成功[]
练习:
1:创建库 user03 指定编码utf8
CREATE DATABASE user03 CHARACTER SET utf8
-在指令加一条判断
CREATE DATABASE IF NOT EXISTS user03 CHARACTER SET utf8
-如果指令长记不住
a:自动提示
? CREATE DATABASE
b:查手册
2:查询当前mysql存在多少库
SHOW DATABASES
3:删除 user03 删除
DROP DATABASE user03
-区别大小写 希望库名,表名,列名,区分别
示例: USE test
数据库类型:
-数值类型
INT 整型(整数) -21亿~21亿
FLOAT/DOUBLE 浮点
DECIMAL(10,2) 高精度 货币
-字符串类型
CHAR 长度固定的字符串
VARCHAR 长度可变的字符串*
-日期类型
DATE 日期
DATETIME 日期时间
TIMESTAMP 时间戳
建议:
1:所有数据类型:保存正确数据
2:有可能情况下使用整数
-创建表
CREATE TABLE 表名(
字段名称 数据类型,
字段名称 数据类型,
字段名称 数据类型
)
用户信息表
编号 姓名 年龄
1001 tom 21
1002 jerry 22
?表名 t_userinfo
?t table
?列名 编号 id int
姓名 name varchar
年龄 age int
use user03
CREATE TABLE t_userinfo (
id int,
name varchar(20),
age int
)
20个字符(汉字)
INSERT INTO t_userinfo VALUES(1001,'tom',21)
INSERT INTO t_userinfo VALUES(1002,'jerry',19)
SELECT * FROM t_userinfo
-修改数据表指令[添加列,删除列,修改]
语法 - ALTER TABLE 表名 参数语句
示例:添加新列
ALTER TABLE t_userinfo ADD rdate datetime
示例:修改列属性
ALTER TABLE t_userinfo MODIFY name varchar(30)
-删除数据表指令
语法 - DROP TABLE 表名
DROP TABLE t_userinfo
-查看数据表指令
语法 - DESC 表名
DESC t_userinfo
练习:
1:t_userinfo 添加二列 rdate datetime
count int
2:查询表结构
ALTER TABLE t_userinfo ADD rdate datetime
ALTER TABLE t_userinfo ADD count int
DESC t_userinfo
DML- 数据表中记录操作语句(INSERT/UPDATE/DELETE)
INSERT INTO 表名(字段名1,字段名2,..)
VALUES(字段1值,字段2值...)
-字段值与字段名一一对应
示例
1:
INSERT INTO t_userinfo(id,name,age,rdate,count)
VALUES(1009,'kk',19,'2016-04-05',1)
2:
INSERT INTO t_userinfo VALUES
(1008,'kk1',21,'2016-04-04',1)
*修改(更新)
语法:UPDATE 表名 SET 字段名=值,字段名1=值
注意:更新 WHERE 条件
UPDATE t_userinfo SET age = 21
WHERE id = 1002
*删除
语法:DELETE FROM 表名 WHERE 条件
DELETE FROM t_userinfo
WHERE id = 1002
软件项目规则大->不允许删除
逻辑删除 - 表列 state 状态
0 记录己被删除
1 记录正常状态
DQL - 数据查询语句***********
基本查询
- SELECT * FROM 表名
- SELECT 字段名1,字段名2.... FROM 表名
示例
SELECT * FROM t_userinfo
SELECT id,name,age,rdate,count FROM t_userinfo
-建议使用后一种:
-只查询所需要字段内容
条件查询
- SELECT * FROM 表名 条件
运算符
= != <> >= <=
is null 为空/is not null不为空
AND
OR
BETWEEN AND ...
-排序
语法:SELECT * FROM 表 ORDER BY 字段名[ASC/DESC]
-升序 ASC{默认}
查询
SELECT * FROM t_userinfo WHERE id = 1001
SELECT * FROM t_userinfo WHERE id != 1001
SELECT * FROM t_userinfo WHERE id >= 1001
//查询rdate等于null
SELECT * FROM t_userinfo WHERE rdate is null
SELECT * FROM t_userinfo WHERE rdate is not null
-数据库中最好不要有null值..
SELECT * FROM t_userinfo WHERE id = 1001 OR age = 21
排序
INSERT INTO t_userinfo VALUES(20001,'tom21',18,now(),1)
INSERT INTO t_userinfo VALUES(20002,'tom22',17,now(),1)
INSERT INTO t_userinfo VALUES(20003,'tom23',16,now(),1)
INSERT INTO t_userinfo VALUES(20004,'tom24',15,now(),1)
now() mysql函数获取当前日期和时间
排序
SELECT id,name,age
FROM t_userinfo
ORDER BY age
SELECT id,name,age
FROM t_userinfo
ORDER BY age DESC
LIMIT ->MYSQL专用{分页}
SELECT * FROM t_userinfo LIMIT 1
语法
LIMIT num
LIMIT start,count 查询几条件记录
start 一始记录数 {0}
count 查询几条记录 3
10条记录
每页获取3条记录 4
SELECT * FROM t_user LIMIT 0,3
SELECT * FROM t_user LIMIT 3,3
SELECT * FROM t_user LIMIT 6,3
SELECT * FROM t_user LIMIT 9,3
CREATE TABLE t_user(
id int,
name varchar(20)
)
INSERT INTO t_user VALUES(1,"tom1")
INSERT INTO t_user VALUES(2,"tom2")
INSERT INTO t_user VALUES(3,"tom3")
INSERT INTO t_user VALUES(4,"tom4")
INSERT INTO t_user VALUES(5,"tom5")
INSERT INTO t_user VALUES(6,"tom6")
INSERT INTO t_user VALUES(7,"tom7")
INSERT INTO t_user VALUES(8,"tom8")
INSERT INTO t_user VALUES(9,"tom9")
INSERT INTO t_user VALUES(10,"tom10")
面试不会问题:
a:数据库常用应用
b:数据库开发[..]
c:数据库优化
优化-0:架构优化
1:独立数据库服务器
2:主从数据库服务器
3:读写分离
4:添加缓存服务器
架构优化.jpg
优化一:表设计
0:表
0.1:一个库中最多300-400张表
0.2:单张表不超过50个INT字段
0.3:单张表不要超20个char字段
a:年龄
age int{范围太大}
age tinyint 数据占1个字节 -128~127
age tinyint unsigned
优化:高效,查询快,占用空间小
b:IP 202.190.111.111
b.1:char(15)
b.2:int unsigned 无符整型
inet_aton('202.190.111.11')
inet_ntoa(数字)
SELECT inet_aton('202.190.111.11')
3401477899
SELECT inet_ntoa(3401477899)
c:性别
sex enum('F','M')
d:货币
DECIMAL(10,2)
e: int(1) vs int(11)
id int(1)
以上二个指令:功能一样创建创建整型列
保存范围 -21亿~21亿
000000000123
优化二:查询优化
示例:
dept 部门表
emp 雇员表
salgrade 薪水级别表
ename
wJNYCP
SELECT * FROM emp WHERE ename = 'wJNYCP'
SELECT * FROM emp WHERE empno = 10002
SELECT * FROM emp WHERE empno = 999999
SELECT * FROM emp WHERE empno = 4199999
解决查询慢问题:
索引:索引数据库中一个对象解决查询缓存
CREATE INDEX 索引名称
ON 表名 (列名)
示例:
CREATE INDEX idx_emp_empno
ON emp(empno)
SELECT empno,ename FROM emp
WHERE empno = 888888
-主键索引
-唯一性
-组合索引
优化三:分析索引
EXPLAIN SQL语句
possible_key 该查询可以利用的索引
key 此次查询选择的索引
1、PHP:最简单的一门后端语言
火爆架构:LAMP
php文件后缀名.php
1、如何运行php文件:
***打开apache,并且将你的项目放到htdocs文件夹中,打开浏览器输入:127.0.0.1:端口号,打开你需要的文件
特殊:其实PHP文件也支持前端代码和PHP代码,以后我们上网时,看到网页后缀.php也不必惊讶 - 比js严格
2、PHP语法基础:
1、输出方式:
1、echo(想要输出的内容)
2、var_dump(想要输出的内容)
缺点:1、输出的太过完整,以后PHP只要输出在页面上的东西,都会被前端使用ajax拿走
2、复合类型暂时也只能用var_dump输出 - 以后不会再用了
2、变量和常量:
*1、变量:值可以改变
语法:$变量名=值
注意:使用时$也不能省略
2、常量:值一旦创建,不可以改变
语法:const 常量名=值
3、*数据类型:
四种标准/基础类型:
整型:Int
浮点型:Float/Double
布尔:Boolean
字符串:String - 不太一样
单引号:直接放纯文本
双引号:支持放入变量
echo "我的名字叫{$name}今年{$age}岁喜欢{$hobby}"
两种复合类型:
1、Array - 数组
创建:
1、直接量:$arr=[值1,....]
2、内置函数:$arr=array( - hash数组。其实就是对象
"key"=>value,
...
)
访问:$数组名[下标/"自定义"]
遍历:循环
2、Object - 面向对象
两种特殊类型:
1、Resource - 资源类型:连接上数据库才会看到
2、Null - 释放内存
"" - 有值,值为空
null - 没有
4、运算符:除了一个不同:字符串的拼接使用的是.
5、分支:完全一样
6、循环:完全一样
7、函数:完全一样
8、API:理论上完全一样,但是操作却不同,不需要做任何的记忆,百度搜索
全栈:
1、前端->后端:
前端需要发起请求:
1、表单请求 提交
注意:
1、input必须添加name属性,甚至有的input/textarea/select*option还要添加value属性
2、form表单必须添加action="服务器端文件的路径"
3、method到底用get还是post,和后端沟通(安全性为主)
只负责发送,不负责保存
2、服务器端 需要接收住 前端传来的 请求消息
语法:$_GET/POST/REQUEST["input的name的值"]
REQUEST->请求:能接住一切请求不管是get还是post
2、后端<->数据库:PHP自带操作MySQL数据的API,只需要学习4句话
1、创建出连接数据库对象
$conn=mysqli_connect("hostname","username","userpwd","dbname")
我们班的固定:
$conn=mysqli_connect("127.0.0.1","root","","h52106")
1.5、立马为数据库传输设置中文编码
mysqli_query($conn,"SET NAMES utf8")
2、创建SQL语句:
$sql="INSERT/DELETE/UPDATE/SELECT"
3、某个数据库要执行某个操作
$rs=mysqli_query($conn,$sql)
//$rs:增删改,是一个布尔值,true->成功,false->失败
查:是一个我们都不认识的结果集:解决将不认识结果集变为我们认识的数据
mysqli_fetch_row($rs)//一次只能得到一行的数据,是一个索引数组
*mysqli_fetch_assoc($rs)//一次只能得到一行的数据,是一个hash数组
解决固定套路:
while(($row=mysqli_fetch_assoc($rs))!=null){
$row
}
4、断开和数据库的连接
mysqli_close($conn)
扩展:<input type="hidden" name="hide" value="登录" /> - 隐藏作用域,不是给用户看/输入,提交时用户后端判断执行不同代码的
连接前端与后端的ajax
同步交互和异步交互:
同步:客户端向服务器端发送请求直到服务器端进行响应的全过程,用户只能等待 - 不严格的说法:整个页面都会刷新一下
举例:1、网址提交 2、表单提交
异步:客户端向服务器端发送请求直到服务器端进行响应的全过程,用户不必等待 - 不严格的说法:局部页面会进行刷新
举例:1、ajax
很久之前我们就见过异步的技术:
定时器:就算定时器里面的操作在耗时,也不会影响后续代码,用户也能看到后续代码的效果
1、*****ajax:asynchronous javascript and xml:直译:异步的javascript和xml
好处:1、不会让用户等待
2、不会刷新页面也能和服务器端进行交互(比表单强)
3、将服务器端的数据获取到前端页面
使用步骤:4步
1、创建ajax核心对象xhr
var xhr=new XMLHttpRequest();
2、创建和服务器端的连接
xhr.open("GET/POST","xx.php");
3、向服务器端发送请求消息
xhr.send()
特殊:
1、GET方式,xhr.send失效,还不能省略,必须写为xhr.send(null),请求消息需要拼接到url?后面
xhr.open("GET","xx.php?key=value&key=value...");
xhr.send(null);
2、POST方式,xhr.send可用,在之前设置请求头部
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("key=value&...");
4、绑定监听状态改变事件
xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200){
xhr.responseText;
}
}
ajax就是固定的方法:难就难在你拿到数据后要干什么