第二阶段1

数据库–1,概述作用就是用来存储数据和管理数据,本质上就是需要安装MySQL软件.分类: 关系型数据库MySQL 和 非关系型数据库Redis ,主要观察数据之间的关系

–2,使用1,安装服务器端: 存数据,管理数据

  核心步骤: 设置字符集/编码成 utf-8   , 端口号3306 , 设置服务名称MySQL , 设置密码root

2,安装客户端: 连接服务器,操作服务器里的数据

  1,小黑窗口/DOS窗口: 
      --从开始菜单里找MySQL/Mariadb,输入密码
      --win+r 然后输入cmd 
  
      #发起MySQL的命令  -u是指定用户名(root) -p是指定密码(自定义的)
      mysql -uroot -proot

2,图形化的工具:sqlyog

  3,数据库的结构
  数据库 -> 表(行和列) -> 数据
  ​
  4,SQL语言
  1,概述
  结构化查询语言,用来操作数据库的语言,是一种标准.
  增删改查里将来发生最多的业务就是: 查 !!!
  ​
  2,分类:
  DML是数据操纵语言
  DDL是指数据定义语言
  DCL是指数据控制语言
  DQL是指数据查询语言
  ​
  二,数据库的常见操作
  增删改查 CRUD
  ​
  –1,创建库
  也可以简写成:create table cgb charset utf8 ;![img](https://img-blog.csdnimg.cn/c0f90ddb11bf40d1ba949729f064b780.png)
  ​
  ### –2,查询库
  ​
  ![img](https://img-blog.csdnimg.cn/396e4247fb394ffc95d90f8ecd6e2b2e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAY2dibHB4,size_20,color_FFFFFF,t_70,g_se,x_16)
  ​
  ### –4,删除库
  ​
  ![img](https://img-blog.csdnimg.cn/25ca0ee7cc8046e890cecd8b873ccee1.png)
  ​
  ## 三,表的常见操作
  ​
  增删改查 CRUD
  ​
  ### –1,使用指定的数据库
  ​
  ![img](https://img-blog.csdnimg.cn/3598be1e299843fb926f62bab2cf559d.png)
  ​
  ### –2,创建表
  ​
  语法:
  ​
  ```sql
  create table 表名(字段名称 字段类型(字段长度),字段2,字段3,...)

练习:

  
  mysql> create table tb_order_detail(
      -> id int(11),
      -> order_id int(11),
      -> num tinyint(4),
      -> item varchar(30),
      -> price double
      -> );
  Query OK, 0 rows affected (0.02 sec)

–3,查看表

  
  mysql> show tables;
  +---------------------+
  | Tables_in_cgb210901 |
  +---------------------+
  | tb_door             |
  | tb_order_detail     |
  +---------------------+
  2 rows in set (0.00 sec)
  ​

–4,修改表

  mysql> alter table tb_door add column money numeric(7,2);
  Query OK, 0 rows affected (0.02 sec)
  Records: 0  Duplicates: 0  Warnings: 0

–5,描述表结构

–6,删除表

  mysql> drop table tb_door;
  Query OK, 0 rows affected (0.00 sec)

四,数据的常见操作

增删改查 CRUD

–1,查询数据/记录

–2,插入数据/记录

语法:insert into 表名 values(1,2,3,4,5,6)注意:1, 需要设置几个值?要看表里有几个字段2, 值的顺序要和字段的顺序保持一致3, 如果字段是字符串类型,设置值时必须要有" " ’ '的标记

–3,修改数据/记录

–4,删除数据/记录

五,数据库的使用细节

–1,命名规范

1, 以字母开头,不要以数字开头2, 不能使用保留字:select / from / update / delete / insert into3, MySQL数据库不区分大小写,多个单词用下划线分开

–2,数据类型

1, 整型:int2, 小数:double(不精确) / numeric(a,b) / decimal(a,b)–a是数字的位数b是小数位数3, 时间: date(年月日) time(时分秒) datetime(年月日时分秒) timestamp(时间戳,毫秒数)4, 字符串: char / varchar区别:char 是固定长度,浪费空间char(10)varchar 是可变长度,节省空间varchar(10)特殊场景: 数据长度如果就是固定的,优先选char,因为查的快5, 图片: 如果想存入数据库,只会存文件的磁盘路径D:/abc/1.jpg,不是存文件本身

六, 字段约束

使用的时间: 通常在设计表创建表时就已经确定了

–1,非空约束

哪个字段添加了非空约束,从此,字段值不能为空,使用not null

  mysql> create table b(
      -> password varchar(100) not null  #给字段添加非空约束
      -> );
  Query OK, 0 rows affected (0.01 sec)
  ​
  mysql> insert into b values('abc');  #password字段设置了值,执行OK
  Query OK, 1 row affected (0.00 sec)
  mysql> insert into b values(null); #password字段值不能设置成null,否则不符合非空约束啦,报错!
  ERROR 1048 (23000): Column 'password' cannot be null

–2,主键约束

每个表都应该设计主键 , 主键是每条记录/数据的唯一标识.现象是: 字段的值必须唯一且不能为空,使用primary key

–3,唯一约束

哪个字段添加了唯一约束,从此,字段值不能相同

一,字段约束

–1,唯一约束

哪个字段添加了唯一约束,从此,字段值不能相同,使用unique

  C:\Users\WangYiBo>mysql -uroot -proot 
  #使用用户名root和密码root来连接数据库
  mysql> show databases; #展示所有数据库
  mysql> use cgb210901; #使用指定的数据库
  mysql> show tables; #展示所有表
  #唯一约束:添加后,字段值不能重复
  CREATE TABLE d( #创建表
   tel CHAR(11) UNIQUE #唯一约束
   #字段名称 字段类型(字段长度)
  );
  INSERT INTO d VALUES('12345678901'); #成功
  INSERT INTO d VALUES('12345678901'); #报错,值相同啦.
  #Duplicate entry '12345678901' for key 1

练习:

  mysql> create table e(   #创建表
      -> password varchar(10)        not null   unique
         #字段名称  字段类型(字段长度) 非空约束   唯一约束
      -> );
  Query OK, 0 rows affected (0.01 sec)
  mysql> insert into e values(null); #报错,字段值不符合非空约束
  ERROR 1048 (23000): Column 'password' cannot be null
  mysql> insert into e values('123'); #正确的,因为满足了非空约束和唯一约束
  Query OK, 1 row affected (0.00 sec)
  mysql> insert into e values('123');#报错,字段值不符合唯一约束
  ERROR 1062 (23000): Duplicate entry '123' for key 1
  mysql>
  ​

–2,主键约束

每个表都应该设计主键 , 主键是每条记录/数据的唯一标识.现象是: 字段的值必须唯一且不能为空,使用primary key主键自增策略: 使用auto_increment,让主键的值交给数据库自动维护

  mysql> create table g(
      #字段名 字段类型 主键        自增
      -> id int    primary key  auto_increment,
      -> name varchar(100),
      -> age int
      -> );
  Query OK, 0 rows affected (0.00 sec)
                      #主键的值不用自己设置null,数据库会自增
  mysql> insert into g values(null,'tony',18);
  Query OK, 1 row affected (0.00 sec)
  mysql> select * from g;
  +----+------+------+
  | id | name | age  |
  +----+------+------+
  |  1 | tony |   18 |
  +----+------+------+
  1 row in set (0.00 sec)
  ​

二,基本函数

–1,工具的使用

1,找到.exe程序,双击,输入了密码,点击连接,就可以了2,创建库: 右键-新建数据库-设置数据库名-选字符集utf8-确定3,创建表: 右键-创建表-输入字段名字段类型字段长度字段约束-创建表-输入表名-确定4,添加表里的记录,如下图

–2,准备数据

  
  CREATE TABLE dept(
  deptno int primary key auto_increment ,
  dname VARCHAR(20),
  loc VARCHAR(13)
  );
  INSERT INTO dept VALUES(null,'accounting','一区');
  INSERT INTO dept VALUES(null,'research','二区');
  INSERT INTO dept VALUES(null,'operations','二区');
  CREATE TABLE emp(
  empno int primary key auto_increment,
  ename VARCHAR(10),
  job VARCHAR(10),
  mgr int,
  hiredate DATE,
  sal double,
  comm NUMERIC(7,2),
  deptno int
  );
  INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-1',90000,NULL,1);
  INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2);
  INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2);
  INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2);
  INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);

–3,基础函数的使用

lower–全转小写upper–全转大写length–求长度substr–截取子串concat–拼接字符串replace–替换

  #SQL中的函数
  #SELECT 列名1,列名2 FROM 表名 
  SELECT * FROM emp #查询所有列
  SELECT ename FROM emp #查名字
  SELECT empno,ename FROM emp #查编号和名字
  SELECT empno a FROM emp #给列设置别名
       #UPPER转大写  列名  列的别名
  SELECT ename,UPPER(ename)  a    FROM emp
       #lower转小写  列名
  SELECT ename,LOWER(ename) FROM emp
  #length求长度,根据u8,一个字母或数字长度为1,一个汉字长度为3 
  SELECT ename,LENGTH(ename) FROM emp#查ename的长度
  SELECT ename,job,LENGTH(job) FROM emp#查job的长度
  #substr截取子串
  #SUBSTR(a,b)-a是截取谁b是从哪个字符开始
  SELECT ename,SUBSTR(ename,2) FROM emp
  #SUBSTR(a,b,c)-a是截取谁b是从哪个字符开始c是截取的长度
  SELECT ename,SUBSTR(ename,2,2) FROM emp
  #concat(a,b,...)拼串-a是列名b是要拼接的数据
  #...是指可以有多个参数
  SELECT ename,CONCAT(ename,"hello",1,2) FROM emp
  #替换replace(a,b,c)-a是字段名把b换成c
  SELECT ename,REPLACE(ename,'a','666') FROM emp
  #ifnull(a,b)-a是字段名b是要换成的值
  SELECT comm,IFNULL(comm,100) FROM emp#如果是null就换成100
  #查询每个员工的月薪
  SELECT sal,comm,sal+IFNULL(comm,0) FROM emp
  #对小数的函数:
  SELECT comm,ROUND(comm) FROM emp#四舍五入,取整
  SELECT comm,ROUND(comm,1) FROM emp#四舍五入,保留1位小数
  SELECT comm,CEIL(comm) FROM emp#ceil向上取整
  SELECT comm,FLOOR(comm) FROM emp#floor向下取整
  #对日期数据的函数:
  SELECT NOW() #当前时间
  SELECT YEAR('1999-1-1')
  SELECT YEAR( NOW() )#当前年
  SELECT MONTH( NOW() ),DAY( NOW() )#当前月,当前日
  #hour时 minute分 second秒
  SELECT HOUR( NOW() ),MINUTE( NOW() ),SECOND( NOW() )
  #生成一个32位的随机数
  SELECT UUID()
  #\表示转义符号,把'当做普通的字符在使用而不是字符串的标记
  SELECT 'xi\'an'

三,条件查询

–1,基础语法

  
  #条件查询
  #1.去重distinct
  SELECT DISTINCT loc FROM dept #查询部门地址
  #2.where连接查询的条件
  #select 字段名 from 表名 where 字段名=字段值
  #练习1:查询编号为1的部门信息
  SELECT * FROM dept WHERE deptno=1
  #练习2:查询编号>1的部门信息
  SELECT * FROM dept WHERE deptno>1
  SELECT * FROM dept WHERE deptno<2
  SELECT * FROM dept WHERE deptno!=1
  SELECT * FROM dept WHERE deptno<>1 #表示!=,同上
  #练习3:查询名称是research的部门编号
  SELECT deptno FROM dept WHERE dname='research'
  #练习4:查询地址在二区编号为3的部门名称
  SELECT dname FROM dept WHERE 
  loc='二区' AND deptno=3 #并且关系
  #练习5:查询部门名称是accounting/research的部门地址
  SELECT loc FROM dept WHERE 
  #dname='accounting' or dname='research'#或者关系
  dname IN('accounting','research')#in子句in(a,b),同上
  #练习6:查询编号是1 2 3的部门信息
  SELECT * FROM dept WHERE 
  deptno IN(1,2,3)
  #3.like--模糊查询,%通配符0~n个字符,_通配符1个字符
  #练习1:查询名字包含a的员工信息
  SELECT * FROM emp WHERE 
  ename LIKE '%a%' #包含a
  #ename LIKE 'a_' #a后只有一个,了解

一,MySQL数据的备份

–1,用工具直接备份就行

1,如果是SQL,直接ctrl s保存就行2,也可以把表或者数据库一整个导出–右键–导出–以SQL转储文件…

–2,练习

  
  #练习SQL语句:
  #练习1:查询部门地址在二区的部门名称
  SELECT dname FROM dept WHERE loc='二区'
  #练习2:查询部门地址在二区名字里有o的部门编号
  SELECT deptno FROM dept WHERE 
  loc='二区' AND dname LIKE '%o%'
  #练习3:查询名字以l开头的员工岗位并去重
  SELECT DISTINCT job FROM emp WHERE ename LIKE 'l%'
  #练习4:查询15年到19年入职的员工姓名和岗位
  SELECT ename,job FROM emp WHERE 
  #year(hiredate)>=2015  and YEAR(hiredate)<=2019
  hiredate>='2015-1-1' AND hiredate<='2019-12-31'
  #练习5:查询副总的年薪
  SELECT sal*12+IFNULL(comm,0)*12 FROM emp WHERE job='副总'
  ​

二,条件查询

–1,null

  
  #1.null的数据用is /is not关键字来过滤
  #练习1:查询没有奖金的员工信息
  SELECT * FROM emp WHERE comm IS NULL
  #练习2:查询有奖金的员工信息
  SELECT * FROM emp WHERE comm IS NOT NULL
  ​

–2,between and

  
  #练习3:查询工资5000~10000的员工信息
  SELECT * FROM emp WHERE 
  #sal>=5000 and sal<10000
  sal BETWEEN 5000 AND 10000 #[5000,10000]
  #练习4:查询2019年入职的员工姓名
  SELECT ename FROM emp WHERE 
  #hiredate between '2019-1-1' and '2019-12-31'
  YEAR(hiredate)=2019
  ​

–3,limit分页

  
  #练习5:展示前两条员工数据
  SELECT * FROM emp LIMIT 2 #只取前n条
  SELECT * FROM emp LIMIT 0,2 #从0+1的数据开始,总共展示2条
  #练习6:查询岗位是员工的第一条记录
  SELECT * FROM emp WHERE job='员工' LIMIT 0,1#limit通常放最后 
  ​

–4,order by

  
  #4.order by排序,按照字典顺序排,默认是升序ASC
  #练习7:按照工资排序
  SELECT * FROM emp ORDER BY sal DESC #按数值降序
  #练习8:按照名字排序
  SELECT * FROM emp ORDER BY ename DESC #按字母降序
  #练习9:按照岗位排序
  SELECT * FROM emp ORDER BY job ASC #按汉字对应的编号升序
  #练习10:查询15年到19年入职的员工信息只取前两条并按照工资升序排
  SELECT * FROM emp WHERE 
  YEAR(hiredate) BETWEEN 2015 AND 2019 #区间[2015,2019]
  ORDER BY sal #排序,默认的升序
  LIMIT 2 #分页,只取前两条,通常放最后

–5,统计案例

  
  #统计需求
  #练习1:统计每个员工的年薪
  SELECT sal,comm,sal*16+IFNULL(comm,0)*16 FROM emp
  #练习2:统计19年以前入职的员工信息
  SELECT * FROM emp WHERE 
  YEAR(hiredate)<2019

三,聚合函数–1,概述基础函数:upper lower length concat substr replace ifnull now()/date()/year()…聚合函数:把一个字段的值聚合起来,进行获取最大值,最小值,平均数,求和,求个数…max() min() sum() avg() count()

–2,测试

  
  #聚合函数max min sum avg count
       #最大值     最小值   求和    求平均数  
  SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) FROM emp 
  #求总记录数
  SELECT COUNT(*) FROM emp#低效
  SELECT COUNT(1) FROM emp#高效
  SELECT COUNT(sal) FROM emp#了解,不推荐
  SELECT COUNT(comm) FROM emp#按照字段统计时不统计null
  #练习1:统计名字里包含a的总记录数
  SELECT COUNT(1) FROM emp WHERE ename LIKE '%a%'
  #练习2:统计19年入职的员工里的最高薪
  SELECT MAX(sal) FROM emp WHERE YEAR(hiredate)=2019
  #练习3:统计2号部门的平均薪资
  SELECT AVG(sal) FROM emp WHERE deptno=2
  #练习4:统计2号部门一年的工资支出总数
  SELECT SUM(sal)*12 FROM emp WHERE deptno=2

四,分组

把表里的所有数据 按照 合理的维度 分成不同的组

–1,group by

  
  #分组:使用group by 
  #练习1:统计每个部门的平均薪资
  SELECT AVG(sal),deptno FROM emp 
  GROUP BY deptno #按照部门分组
  #练习2:统计每个部门的最高薪资
  SELECT MAX(sal),deptno FROM emp 
  #口诀1:查询结果中出现了混合列,包括着聚合列和非聚合列,必须分组
  GROUP BY deptno
  #口诀2:通常按照非聚合列分组
  #练习3:统计每年入职的总人数
  SELECT YEAR(hiredate),COUNT(1) FROM emp 
  GROUP BY YEAR(hiredate)
  #练习4:统计每个岗位的平均薪资
  SELECT AVG(sal),job FROM emp
  GROUP BY job
  ​

–2,having

把分组后的数据还想继续过滤,使用group by的固定搭配having

  
  #having
  #练习5:统计每个岗位的平均薪资,而且只要>=10000的
  SELECT AVG(sal) a,job FROM emp
  #where AVG(sal)>=10000 
  #注意:::where里不能用别名,也不能出现聚合函数
  GROUP BY job  #按照非聚合列分组
  HAVING a>=10000 #分组后的过滤,a是别名
  #练习6:统计每年入职的人数,而且只要19年的
  SELECT YEAR(hiredate) ,COUNT(1) FROM emp
  WHERE YEAR(hiredate)=2019 
  GROUP BY YEAR(hiredate) #分组
  #having a=2019 #分组后的过滤
  # where比having 高效,因为执行时机要早一些

五,事务–1,概述1,数据库事务用来保证 多个SQL 要么全成功,要么全失败.英文叫transaction.MySQL数据库会自动管理事务,Oracle数据库需要程序员管理事务.MySQL也允许程序员手动管理事务2,事务的四大特征:ACID原子性: 把多条SQL看做一个原子密不可分,要么全成功,要么全失败一致性: 保证数据守恒,将来广泛的应用到分布式系统里隔离性: MySQL数据库可以支持高并发,可能会有数据安全的隐患,也有复杂的隔离级别持久性: 对数据库的操作增删改,有持久影响3,隔离级别:read uncommitted读未提交:性能好,但是安全性差read commited读已提交:是Oracle数据库默认的隔离级别,性能较差,但是安全性较好repeatable read可重复读:是MySQL数据库默认的隔离级别,性能再差一点,但是安全性特别好Serializable串行化:性能非常差,但是安全性比较好也可以查:SELECT @@tx_isolation;

–2,测试窗口1:

  
  mysql> use  cgb210901; #使用数据库,准备往表里插入数据
  mysql> start transaction; #开启事务start transaction
  mysql> insert into g values(null,'jack',20);#多条执行增删改的SQL
  mysql> commit;#提交事务commit,不提交的话别人查不到的,没有持久影响

窗口2:

  
  mysql> use cgb210901;
  mysql> select * from g; #窗口1不执行commit,这里永远查不到的

一,SQL练习

–1,测试

  
  #练习1:依次按照多个条件排序,asc升序,desc降序
  SELECT * FROM emp ORDER BY sal DESC,ename ASC
  SELECT * FROM emp ORDER BY deptno DESC,ename ASC
  #练习2:统计每个岗位的员工人数
  SELECT job,COUNT(1) FROM emp
  #什么时候必须需要分组?查询时出现了混合列
  #按照啥分组?按照非聚合列分组
  GROUP BY job 
  #练习3:统计每个部门包含re的部门编号
  SELECT deptno FROM dept 
  WHERE dname LIKE 're%' #以re开始的
  GROUP BY loc #合理的分组
  #练习4:统计每年入职的员工的最高薪资,只要>5000的
  SELECT MAX(sal) a,YEAR(hiredate) b FROM emp
  GROUP BY b #分组,除了where里不能用别名其他位置都行
  #having里可用聚合函数where不能
  HAVING a>5000 #分组后过滤
  #练习5:查询所有员工的最高薪-用分页
  SELECT MAX(sal) FROM emp
  SELECT sal FROM emp ORDER BY sal DESC LIMIT 1
  #创建user表(id,name,pwd),并插入数据
  CREATE TABLE USER(
   id INT PRIMARY KEY AUTO_INCREMENT,#主键自增
   NAME VARCHAR(20),
   pwd VARCHAR(10)
  )
  INSERT INTO USER VALUES(NULL,'jack',"123")
  INSERT INTO USER VALUES(NULL,'rose',"456")
  #对上面SQL中使用的事务进行优化,因为上面的SQL需要两个事务的开启和关闭
  #下面这种SQL也叫作批量插入的功能,高效,多次插入使用同一个事务
  INSERT INTO USER VALUES
      (NULL,'tony',"123"),(NULL,'jerry',"456")

二,字段约束

–1,默认约束

哪个字段添加了默认约束,从此字段值的就有了默认值

  
  #默认约束:给字段设置默认值而不是默认的null,使用default
  CREATE TABLE a(
   id INT PRIMARY KEY AUTO_INCREMENT,
   sex VARCHAR(10) DEFAULT '男'#默认约束
  )

–2,检查约束

哪个字段添加了检查约束,从此,字段值必须符合检查的条件才可以

  
  #检查约束:使用check,了解
  CREATE TABLE b(
   id INT PRIMARY KEY AUTO_INCREMENT,
   age INT,
   CHECK(age<200 AND age>0)#检查约束
   #数据要满足检查条件才可以
  )

! --3,外键约束

使用明确的一段代码表示,两个表之间的关系

  
  #外键约束:先创建外键+再使用外键
  CREATE TABLE tb_user(
   id INT PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(20),
   age INT,
   sex CHAR(10) DEFAULT '男'#默认约束
  )
  CREATE TABLE tb_user_address(
   user_id INT PRIMARY KEY,
   address VARCHAR(200),
   #foreign key(当前表的主键名) references 对方表(对方的主键)
   FOREIGN KEY(user_id) REFERENCES tb_user(id)#1.创建外键
  )
  #2.使用外键
  #约束的情况1:子表的主键值  必须 取自 主表的主键值
  #约束的情况2:主表的记录不能随便删,要保证没有被子表使用才可以删

三,多表联查

–1,准备表和数据

#多表联查:
#1.课程表
CREATE TABLE courses( 
cno VARCHAR(5) NOT NULL, 
cname VARCHAR(10) NOT NULL,
tno VARCHAR(3) NOT NULL, 
PRIMARY KEY (cno) #单独设置主键
);
#2.得分表
CREATE TABLE scores(
sno VARCHAR(3) NOT NULL,
cno VARCHAR(5) NOT NULL, 
degree NUMERIC(10,1) NOT NULL,
PRIMARY KEY (sno, cno) #联合主键,了解
);
#3.学生表
CREATE TABLE students( 
sno VARCHAR(3) NOT NULL,
sname VARCHAR(4) NOT NULL,
ssex VARCHAR(2) NOT NULL,
sbirthday DATETIME, 
class VARCHAR(5), 
PRIMARY KEY (sno)#主键
);
#4.老师表
CREATE TABLE teachers( 
tno VARCHAR(3) NOT NULL,
tname VARCHAR(4),
tsex VARCHAR(2),
tbirthday DATETIME,
prof VARCHAR(6),
depart VARCHAR(10),
PRIMARY KEY (tno)
);
#5.插入数据
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,'1977-09-01',95033);
 
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,'1975-10-02',95031);
 
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033);
 
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033);
 
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031);
 
INSERT INTO STUDENTS (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031);
 
INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'易天','男','1958-12-02','副教授','计算机系');
 
INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'王旭','男','1969-03-12','讲师','电子工程系');
 
INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'李萍','女','1972-05-05','助教','计算机系');
 
INSERT INTO TEACHERS(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'陈冰','女','1977-08-14','助教','电子工程系');
 
INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825);
 
INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804);
 
INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('6-166' ,'模拟电路' ,856);
 
INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('6-106' ,'概率论' ,831);
 
INSERT INTO COURSES(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,831);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
 
INSERT INTO SCORES(SNO,CNO,DEGREE)VALUES (108,'6-166',81);


–2,方式1:笛卡尔积

#多表联查,三种方式:
#方式1:笛卡尔积,用逗号连接多张表
SELECT * FROM dept,emp #产生了大量的结果集
SELECT * FROM dept,emp #逗号隔开表
#描述两张表的关系   表名.字段名
WHERE dept.deptno = emp.deptno
#练习1:查询部门名称和员工表的所有数据
SELECT dept.dname,emp.* FROM dept,emp #逗号隔开表名
WHERE dept.deptno=emp.deptno #表关系
#练习2:查询部门的所有和员工的名字,只要部门名称叫accounting的
SELECT dept.*,emp.ename FROM dept,emp #逗号隔开表名 
WHERE dept.deptno=emp.deptno #表关系
AND dept.dname='accounting' #业务条件
#练习3:查询所有部门和员工的数据,条件是部门编号>1的	
SELECT * FROM dept,emp 
WHERE dept.deptno=emp.deptno#表关系
AND emp.deptno>1 #业务条件
#练习4:查询易天老师能讲的课程名称
SELECT courses.cname FROM teachers,courses 
WHERE courses.tno=teachers.tno #表关系
AND teachers.tname='易天' #业务条件
#练习5:查询计算机导论课程的总分
SELECT SUM(degree) FROM courses,scores 
WHERE courses.cno=scores.cno #表关系
AND courses.cname='计算机导论' #业务条件


–3,方式2:连接查询

#方式2:连接查询,用join连接多张表
SELECT * FROM dept JOIN emp #用join连接多张表
SELECT * FROM dept JOIN emp
ON dept.deptno=emp.deptno #表关系
#练习1:查询部门名称和员工表的所有数据
SELECT dept.dname,emp.* FROM dept JOIN emp 
ON dept.deptno=emp.deptno#表关系
#练习2:查询部门的所有和员工的名字,只要部门名称叫accounting的
SELECT dept.*,emp.ename FROM emp JOIN dept
ON dept.deptno=emp.deptno #表关系
WHERE dept.dname='accounting' #业务条件
#练习3:查询所有部门和员工的数据,条件是部门编号>1的
SELECT * FROM dept JOIN emp
ON dept.deptno=emp.deptno #表关系
WHERE emp.deptno>1 #业务条件	
#练习4:查询易天老师能讲的课程名称
SELECT courses.cname FROM courses JOIN teachers
ON courses.tno=teachers.tno #表关系
WHERE teachers.tname='易天' #业务条件
#练习5:查询计算机导论课程的总分
SELECT SUM(scores.degree) FROM courses JOIN scores
ON courses.cno=scores.cno #表关系
WHERE courses.cname='计算机导论' #业务条件
#测试 三种连接的区别????
#有两种连接查询:内连接和外连接(左外连接,右外连接)
#inner join:取两张表的交集
#left join:左边表的所有和右边满足条件的
#right join:右边表的所有和左边满足条件的
#内连接:取交集,取左右表都满足条件的
SELECT * FROM dept INNER JOIN emp 
ON dept.deptno=emp.deptno
#左连接:取左表的所有和右表满足条件的不满足的都是null
SELECT * FROM dept LEFT JOIN emp
ON dept.deptno=emp.deptno
#右连接:取右表的所有和左表满足条件的不满足的都是null
SELECT * FROM emp RIGHT JOIN dept
ON dept.deptno=emp.deptno
#连接查询的效率:小表驱动大表,
#把结构简单或者数据量少的表放在前面作为左表
#因为左表会查所有数据,右表只查满足了条件的那些数据


–4,方式3:子查询

在这里插入代码片


SQL的作业:

用两种多表联查的方式完成以下练习:

练习1:查询research部门的所有员工姓名和工资练习2:查询jack所在的部门信息练习3:查询总监的部门信息练习4:查询李军的平均分练习5:查询陈冰能讲的课程名

一,多表联查

–1,方式3:子查询

也叫嵌套查询,把上次的查询结果,当这次查询的条件来用

  
  #方式3:子查询:要分析第一次查啥,第二次查啥
  #练习1:查询计算机导论课程的总分
  #第一次查:根据cname查cno- 3-105
  SELECT cno FROM courses WHERE cname='计算机导论'
  #第二次查:根据cno查degree
  SELECT SUM(degree) FROM scores WHERE cno='3-105'
  #改成子查询:嵌套查询
  SELECT SUM(degree) FROM scores WHERE cno=(
   SELECT cno FROM courses WHERE cname='计算机导论'
  )
  #练习2:查询易天老师能讲的课程名称
  #第一次查:根据tname查tno 804
  SELECT tno FROM teachers WHERE tname='易天'
  #第二次查:根据tno查cname
  SELECT cname FROM courses WHERE tno=804
  #改造 (子查询)
  SELECT cname FROM courses WHERE tno=(
   SELECT tno FROM teachers WHERE tname='易天'
  )
  #练习3:查询accounting部门的员工的名字
  SELECT ename FROM emp WHERE deptno IN(
   SELECT deptno FROM dept WHERE loc='二区'
  )
  #练习4:查询高于平均工资的员工信息
  SELECT * FROM emp WHERE sal>(
   SELECT AVG(sal) FROM emp #平均工资
  )

–练习1:查询research部门的所有员工姓名和工资

  
  #练习1:查询research部门的所有员工姓名和工资
  #方式3:子查询
  SELECT emp.ename,emp.sal FROM emp WHERE deptno=(
   SELECT deptno FROM dept WHERE dname='research'
  )
  #方式1:笛卡尔积
  SELECT emp.ename,emp.sal FROM emp,dept 
  WHERE emp.deptno=dept.deptno#表关系
  AND dept.dname='research'#业务条件
  #方式2:连接查询
  SELECT emp.ename,emp.sal FROM dept INNER JOIN emp 
  ON emp.deptno=dept.deptno#表关系
  WHERE dept.dname='research'#业务条件

–练习2:查询research部门的所有员工姓名和工资

  
  #练习2:查询jack所在的部门信息
  #方式3:子查询
  SELECT * FROM dept WHERE deptno=(
   SELECT deptno FROM emp WHERE ename='jack'
  )
  #方式1:笛卡尔积
  SELECT dept.* FROM dept,emp
  WHERE emp.deptno=dept.deptno#表关系
  AND emp.ename='jack'#业务条件
  #方式2:连接查询
  SELECT dept.* FROM dept JOIN emp
  ON emp.deptno=dept.deptno#表关系
  WHERE  emp.ename='jack'#业务条件

–练习3:查询总监的部门信息

  
  #练习3:查询总监的部门信息
  #方式1:笛卡尔积
  SELECT dept.* FROM dept,emp
  WHERE emp.deptno=dept.deptno#表关系
  AND emp.job='总监'#业务条件
  #方式2:连接查询
  SELECT dept.* FROM dept JOIN emp
  ON emp.deptno=dept.deptno#表关系
  WHERE emp.job='总监'#业务条件
  #方式3:子查询
  SELECT dept.* FROM dept WHERE deptno=(
   SELECT deptno FROM emp WHERE job='总监'
  )

–练习4:查询李军的平均分

  
  #练习4:查询李军的平均分
  #方式3:子查询
  SELECT AVG(degree) FROM scores WHERE sno=(
   SELECT sno FROM students WHERE sname='李军'
  )
  #方式1:笛卡尔积
  SELECT AVG(scores.degree) FROM students,scores
  WHERE students.sno=scores.sno#表关系
  AND students.sname='李军'#业务条件
  #方式2:连接查询
  SELECT AVG(scores.degree) FROM students JOIN scores
  ON students.sno=scores.sno#表关系
  WHERE students.sname='李军'#业务条件

–练习5:查询陈冰能讲的课程名

  
  #练习5:查询陈冰能讲的课程名
  #方式3:子查询
  SELECT courses.cname FROM courses WHERE tno=(
   SELECT tno FROM teachers WHERE tname='陈冰'
  )
  #方式1:笛卡尔积
  SELECT courses.cname FROM teachers,courses
  WHERE teachers.tno=courses.tno #表关系
  AND teachers.tname='陈冰'#业务条件
  #方式2:连接查询
  SELECT courses.cname FROM teachers JOIN courses
  ON teachers.tno=courses.tno #表关系
  WHERE teachers.tname='陈冰'#业务条件

二,数据库的扩展–1,索引概述好处是: 提高查询效率 坏处是: 本身是单独的空间来存储分类:1,单值索引:一个索引只包含一列2,唯一索引:一个索引只包含一列,值不能重复3,复合索引:一个索引包含多个列

单值索引create index 索引名 on 表名(字段名)–一个索引只包含一个列

  
  #索引:创建索引+使用索引
  #1.查看索引
  SHOW INDEX FROM emp
  #2.创建 单值索引:一个索引包含一列
  CREATE INDEX nameindex ON emp(ename)
  #3.使用索引,发起select语句
  SELECT * FROM emp WHERE ename='jack'
  #4.检查SQL的执行效率(观察用没用索引)
  EXPLAIN#解释说明SQL的执行计划/性能(观察possible keys的值)
  SELECT * FROM emp WHERE ename='jack'
  #练习:
  CREATE INDEX jobindex ON emp(job)#单值索引
  SHOW INDEX FROM emp#查看索引
  EXPLAIN SELECT * FROM emp WHERE job='员工'#检查是否使用了索引

唯一索引

create unique index 索引名 on 表名(字段名)一个索引只包含一个列,列的值不能重复

  
  #5.创建 唯一索引:一个索引包含一列,值要唯一
  CREATE UNIQUE INDEX locindex ON dept(loc)
  #添加失败,因为loc的值有重复的
  CREATE UNIQUE INDEX dnameindex ON dept(dname)
  SHOW INDEX FROM dept#查看索引
  #使用索引
  EXPLAIN SELECT * FROM dept WHERE dname='research'

复合索引

create index 索引名 on 表名(字段名1,字段名2,字段名3…)一个索引包含多个字段,用时要遵循最左原则,否则复合索引失效失效的情况:按照 2 3 23 ,没有包含最左边的

  
  #6.创建 复合索引:
  CREATE INDEX fuheindex ON emp(ename,job,deptno)
  SHOW INDEX FROM emp
  #用时可能会让复合索引失效--必须遵循最左原则(必须包含着最左边的)
  EXPLAIN SELECT * FROM emp WHERE ename='jack' #生效
  EXPLAIN SELECT * FROM emp WHERE job='总监' #失效
  EXPLAIN SELECT * FROM emp WHERE ename='jack' AND job='副总' #生效
  EXPLAIN SELECT * FROM emp WHERE job='副总'AND ename='jack'#生效

删除索引

alter table 表名 drop index 索引名show index from 表名使用explain关键字检查,SQL中是否使用了索引(检查SQL的执行性能)

  
  #7.删除索引
  SHOW INDEX FROM emp
  ALTER TABLE emp DROP INDEX jobindex

总结缺点:索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

–2,视图概念是一个特殊的表,存了上次查询的结果.

测试

  
  #视图:创建视图+使用视图
  #练习:查询名字里有a的员工信息
  SELECT * FROM emp WHERE ename LIKE '%a%'
  #1.创建视图:create view 视图名 as select语句
  CREATE VIEW empview AS 
  SELECT * FROM emp WHERE ename LIKE '%a%'
  #2.使用视图
  SELECT * FROM empview
  #好处:提高了SQL的复用性+屏蔽了业务表的复杂性+数据共享
  #坏处:是一张单独的表存了业务表的数据造成了数据重复+无法优化

–3,SQL优化1, 用字段名称代替*2, where里: 尽量用and不用or , 尽量用=不用!= <> , 条件越精确越好 ,3, 表设计:表里的索引不要超过5个 , 给where后或者order by经常用的字段加索引 ,复合索引要遵循最左特性不然就失效了 , 索引表及时删掉多余的索引用varchar代替char , 用数字代替字符串 , 用默认值代替null4, 批量处理:批量查,批量的删,最好使用分页详情见课件:数据库从入门到精通03_cgblpx的博客-CSDN博客

–4,三范式数据库的专业术语,用来设计表要遵循的原则,范式NF分为六大范式,通常只要遵循前三大范式就可以了第一范式1NF: 表里的字段 不可分割,是指字段的值就是最小单位简而言之,第一范式就是无重复的列第二范式2NF: 基于第一范式的基础上产生的,指表里都应该设计主键/主关键字/主属性每行都应该围绕着主键来 描述数据总之,第二范式就是非主属性完全依赖于主关键字第三范式3NF: 基于第二范式的基础上产生的,是指表里的字段之间尽量不要产生依赖,总之,第三范式就是属性不依赖于其它非主属性

一,JDBC

–1,概述sun公司提供的一套 java操作数据库的标准专门用来完成 java 和 数据库 交互的技术,全称是: java database connectivity

–2,使用步骤1, 提供了丰富的工具类jar包,项目中导入jar包2, 连接数据库: 端口号3306 库名cgb2109 用户名root 密码root3, 写SQL4, 处理数据库返回给java的结果–3,导入jar包1,选用哪个版本的jar包,要看你安装的数据库的版本

2,导入jar包

1, 复制粘贴到工程里2, 选中jar包,右键-add as libarary… ok

–4,入门案例

  
  package cn.tedu.jdbc;
  import org.junit.Test;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.Statement;
  ​
  //测试jdbc
  public class Test1 {
      //junit单元测试:@Test public void 没有参数
      @Test
      public void get() throws Exception {
          //1,注册驱动 --参数是类的全路径
          Class.forName("com.mysql.jdbc.Driver");//5版本的jar包
  //Class.forName("com.mysql.cj.jdbc.Driver");//8版本的jar包
          //2,连接数据库,并返回了数据库的连接Connection
          String url = "jdbc:mysql://localhost:3306/cgb2109";
                       //遵循的协议://本机ip地址:端口号/数据库名
          Connection c = DriverManager.getConnection(url,"root","root");
          //3,获取传输器
          Statement s = c.createStatement();
          //4,执行SQL语句
          //需求:利用java查询数据库中dpet表的所有数据
          ResultSet r = s.executeQuery("select * from dept");//执行查询的SQL语句
  //s.executeUpdate()执行增删改的SQL语句
          //5,处理结果
          while( r.next() ){//next()判断有没有数据
              //getXxx()获取不同类型的数据
  //            r.getInt(1);//根据列的编号获取列的值
              int a=r.getInt("deptno");//根据列名获取列的值
              String b = r.getString("dname");
              String d = r.getString(3);
              System.out.println(a+b+d);
          }
          //6,释放资源
          r.close();//结果集
          s.close();//传输器
          c.close();//连接器
      }
  ​
  }

–5,总结

二,JDBC的练习

–1,查询courses表的所有数据

  
  package cn.tedu.jdbc;
  import org.junit.Test;
  ​
  import java.sql.*;
  ​
  //测试jdbc
  public class Test1 {
     
      //需求:查询courses表的所有数据
      @Test
      public void get2() throws Exception{
          //1,注册驱动 --参数是类的全路径
          Class.forName("com.mysql.jdbc.Driver");
          //2,连接数据库,并返回了数据库的连接Connection
          String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url,"root","root");
          //3,获取传输器
          Statement s = c.createStatement();
          //4,执行SQL
          ResultSet r = s.executeQuery("select * from courses");//查询SQL
          //5,处理结果
          while(r.next()){//判断有没有数据
              //表里有三列,循环三次就行了
              for (int i = 1; i <4 ; i++) {
        //获取数据getXxx()--getObject()更通用可以获取任意类型的数据
                  Object a = r.getObject(i);//i是列的索引1 2 3..列
                  System.out.println(a);//打印每列的值
              }
          }
          //6,释放资源
          r.close();
          s.close();
          c.close();
      }
    
  ​
  }

–2,向dept表中插入数据

  
  //需求:向dept表中插入数据
      @Test
      public void add() throws Exception{
          //1,注册驱动 --参数是类的全路径
          Class.forName("com.mysql.jdbc.Driver");
          //2,连接数据库,并返回了数据库的连接Connection
  //        String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
          String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";//简写
          Connection c = DriverManager.getConnection(url,"root","root");
          //3,获取传输器
          Statement s = c.createStatement();
          //4,执行SQL
          int rows = s.executeUpdate(
                  "insert into dept values(null,'java开发',\"北京\")");
          //5,处理结果
          //executeQuery查询,会把结果返回给ResultSet需要遍历,,,
          //executeUpdate增删改,会返回对数据库的影响行数,,,通常不处理
          //6,释放资源
          s.close();
          c.close();
      }

–3,模拟用户登录

1, 让用户输入用户名 和 密码

2, 在数据库里 准备表

  
  CREATE TABLE `user` (
     `id` int(11) NOT NULL auto_increment,
     `name` varchar(20) default NULL,
     `pwd` varchar(10) default NULL,
     PRIMARY KEY  (`id`)
   ) 

3, 利用JDBC查库,发起select语句

select * from user where name=‘jack’ and password=‘123’

  
  package cn.tedu.jdbc;
  ​
  import org.junit.Test;
  ​
  import java.awt.*;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.Statement;
  ​
  //模拟用户登录
  public class Test2 {
      //模拟用户登录
      @Test
      public void login() throws Exception{
          //1,注册驱动
          Class.forName("com.mysql.jdbc.Driver");
          //2,连接数据库
          String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url, "root", "root");
          //3,获取传输器
          Statement s = c.createStatement();
          //4,执行SQL
          String sql="select * from user where name='jack' and pwd='123'";
          ResultSet r = s.executeQuery(sql);
          //5,处理结果
          if( r.next() ){//判断有数据吗?如果有数据就可以登录
              System.out.println("登录成功!");
          }else{//没数据,重新输入或去注册
              System.out.println("登录失败,请重新输入或去注册!");
          }
          //6,释放资源
          r.close();
          s.close();
          c.close();
      }
  }

一,SQL攻击

–1,模拟SQL攻击的现象

//出现了问题:SQL攻击://1,本质上就是因为SQL中出现了特殊符号#,#号在SQL中是注释的意思(测试时使用固定的用户名jack’#)//2,Statement传输器在执行SQL时遇到了SQL拼接,把#当做了注释用!!

  
  package cn.tedu.jdbc;
  import org.junit.Test;
  import java.awt.*;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.Statement;
  import java.util.Scanner;
  //模拟用户登录
  public class Test2 {
     
      //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
      public static void main(String[] args) throws Exception{
          //1,注册驱动
          Class.forName("com.mysql.jdbc.Driver");
          //2,连接数据库
          String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url, "root", "root");
          //3,获取传输器
          Statement s = c.createStatement();
          //4,执行SQL
          System.out.println("请输入用户名:");
          String username = new Scanner(System.in).nextLine();
          System.out.println("请输入密码:");
          String password = new Scanner(System.in).nextLine();
          //拼接字符串: 一对儿双引号中间一对儿加号 再中间看你了 "+???+"
  //        String sql="select * from user where name='jack' and pwd='123'";
          String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
          ResultSet r = s.executeQuery(sql);
          //5,处理结果
          if( r.next() ){//判断有数据吗?如果有数据就可以登录
              System.out.println("登录成功!");
          }else{//没数据,重新输入或去注册
              System.out.println("登录失败,请重新输入或去注册!");
          }
          //6,释放资源
          r.close();
          s.close();
          c.close();
      }
  }

–2,解决方案

  
  package cn.tedu.jdbc;
  ​
  import org.junit.Test;
  ​
  import java.awt.*;
  import java.sql.*;
  import java.util.Scanner;
  ​
  //模拟用户登录
  public class Test2 {
      //解决了问题:SQL攻击:
      //1,本质上就是因为SQL中出现了特殊符号#,当普通字符用而不是注释
      //2,PreparedStatement 传输器在执行SQL时遇到了SQL拼接时直接写?占位符
      //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效
      //模拟用户登录,从单元测试改成main()原因是IDEA单元测试方法无法键盘输入
      public static void main(String[] args) throws Exception{
          //1,注册驱动
          Class.forName("com.mysql.jdbc.Driver");
          //2,连接数据库
          String url="jdbc:mysql:///cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url, "root", "root");
          //3,获取传输器
  //        Statement s = c.createStatement();//SQL攻击问题
          //4,执行SQL
          System.out.println("请输入用户名:");
          String username = new Scanner(System.in).nextLine();
          System.out.println("请输入密码:");
          String password = new Scanner(System.in).nextLine();
  //        String sql="select * from user where name='"+username+"' and pwd='"+password+"'";
          //SQL骨架,?叫占位符
          String sql="select * from user where name=? and pwd=?";
          //准备执行预编译的SQL
          //PreparedStatement好处:SQL简单,安全(解决SQL攻击),高效
          PreparedStatement s = c.prepareStatement(sql);
          //设置SQL中的参数
          s.setObject(1,username);//给第1个?设置用户名
          s.setObject(2,password);//给第2个?设置用户名
  ​
          ResultSet r = s.executeQuery();
          //5,处理结果
          if( r.next() ){//判断有数据吗?如果有数据就可以登录
              System.out.println("登录成功!");
          }else{//没数据,重新输入或去注册
              System.out.println("登录失败,请重新输入或去注册!");
          }
          //6,释放资源
          r.close();
          s.close();
          c.close();
      }
  }

–3,练习PreparedStatement

  
  package cn.tedu.jdbc;
  ​
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.PreparedStatement;
  ​
  //需求:利用新的传输器,向dept表里插入数据
  public class Test3 {
      public static void main(String[] args) throws Exception{
          //1,注册驱动
          Class.forName("com.mysql.jdbc.Driver");
          //2,获取连接
          String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url, "root", "root");
          //3,传输器
          String sql ="insert into dept values(null,?,?)";//SQL骨架
          PreparedStatement p = c.prepareStatement(sql);
          //设置SQL中的参数--给第几个?设置啥值
          p.setObject(1,"php开发部");
          p.setObject(2,"北京");
          //4,执行SQL
          p.executeUpdate();//执行增删改的SQL,返回影响行数
          //5,处理结果
          //6,释放资源
          p.close();
          c.close();
      }
  }
  ​
  ​

–4,扩展: 程序优化

JDBC的前两步,重复的写了很多次,优化这种现象来提高代码的复用性/高内聚.

1,创建工具类

1,提供工具类2,提供方法(封装JDBC的前两步)

  
  package cn.tedu.jdbc;
  ​
  import java.sql.Connection;
  import java.sql.DriverManager;
  ​
  //封装了注册驱动,获取连接.
  //目的:获取连接,并返回给调用者
  public class JDBCUtils {
      /**目的:获取连接,并返回给调用者 */
      static public Connection get() throws Exception{
          //1,注册驱动
          Class.forName("com.mysql.jdbc.Driver");
          //2,获取连接
          String url="jdbc:mysql://localhost:3306/cgb2109?characterEncoding=utf8";
          Connection c = DriverManager.getConnection(url, "root", "root");
          return c; //返回给调用者
      }
  }

2,改造测试类

3,调用类里的方法

  
  package cn.tedu.jdbc;
  ​
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.PreparedStatement;
  ​
  //需求:利用新的传输器,向dept表里插入数据
  public class Test3 {
      public static void main(String[] args) throws Exception{
          //TODO  利用工具类里封装好的方法
          Connection c = JDBCUtils.get();
          //3,传输器
          String sql ="insert into dept values(null,?,?)";//SQL骨架
          PreparedStatement p = c.prepareStatement(sql);
          //设置SQL中的参数--给第几个?设置啥值
          p.setObject(1,"php开发部");
          p.setObject(2,"北京");
          //4,执行SQL
          p.executeUpdate();//执行增删改的SQL,返回影响行数
          //5,处理结果
          //6,释放资源
          c.close();
          p.close();
      }
  }
  ​
  ​

3,总结

二,HTML–1,概述是超文本标记语言.网页中的元素类型可以超过文本内容标记语言: HTML中提供了大量标记/标签,开始标签和结束标签

–2,入门案例1,右键-新建项目-输入项目名称-创建2,右键-新建-HTML文件-输入文件名-创建3,保存文件-运行-运行到浏览器–选择一个能用的直接测试

  
  <!DOCTYPE html> <!--是文档声明行,用来声明这是一个HTML文件 -->
  <html> <!-- HTML文件里的根元素-->
      <head> <!-- 网页中的头部分,优先于body加载,用来设置网页的属性-->
          <meta charset="utf-8"> <!-- 设置网页的编码 -->
          <title>你好,HTML</title> <!-- 设置网页的标题 -->
      </head>
      <body><!-- 网页的体部分,放展示的数据 -->
          hell&nbsp;&nbsp;&nbsp;&nbsp;o html~ 
          hello html~  <br></br>
          <!-- br标签是换行 
               &nbsp;表示一个空格
           -->
          hello html~ 
          hello html~ 
          hello html~ 
          hello html~ 
      </body>
  </html>

三,HTML的常见标签

–1,概述

1,输入框: 单选多选2,图片3,按钮4,视频5,超链接

–2,标题,列表,图片标签

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 标题标签</title>
      </head>
      <body>
          <!-- 3.图片标签 
              src属性用来指定图片的位置(先保证图片资源和网页在同一级目录)
              width属性用来指定图片的宽度,单位是像素px
              height属性用来指定图片的高度,单位是百分比
          -->
          <img src="logo.png" width="30px" height="10%"/>
          <img src="logo.png" width="30px" height="10%"/>
          
          <!-- 2.列表标签 
              有序列表orderlist: ol是定义列表   li定义列表项
              无序列表unorderlist: ul是定义列表   li定义列表项
          -->
          <ul>
              <li>31省区市新增本土确诊65例</li>
              <li>神十三航天员圆满完成出舱任务</li>
          </ul>
          <ol>
              <li>31省区市新增本土确诊65例</li>
              <li>神十三航天员圆满完成出舱任务</li>
          </ol>
          
          <!-- 1.标题标签  h1大~h6小 自动换行 -->
          <h1>hello</h1>
          <h2>hello</h2>
          <h3>hello</h3>
          <h4>hello</h4>
          <h5>hello</h5>
          <h6>hello</h6>
          
      </body>
  </html>
  ​
  ​

–3,超链接,输入框标签

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 超链接标签</title>
      </head>
      <body>
          <!-- 2.input输入框 -->
          密码输入框:<input type="password" />
          普通输入框:<input type="text" />
          数字输入框:<input type="number" />
          日历输入框:<input type="date" />
          日历输入框:<input type="week" />
          单选框:<input type="radio" />男
          多选框:<input type="checkbox" />迪丽热巴
          普通按钮: 没有提交数据的功能,只能点点
          <input type="button" value="注册"/>
          <button>登录</button>
          提交按钮:把用户在浏览器输入的数据提交给后端的java程序处理
          <input type="submit"/>
          <button type="submit">提交</button>
          
          <br />
          <!-- 1.超链接标签  
                href属性表示可以被点击
                target属性表示用什么方式打开
                默认值是_self当前窗口,_blank是在新窗口打开
          -->
          <a href="http://www.baidu.com/" target="_blank">百度一下</a>
          <!-- 锚定:回到固定位置 -->
          <a name="top">我是顶部</a>
          <h1>如何套取富婆的欢心</h1>
          <h1>如何套取富婆的欢心</h1>
          <h1>如何套取富婆的欢心</h1>
          <h1>如何套取富婆的欢心</h1>
          <a href="#top">点我,回去顶部</a><!--通过#获取name属性的值-->
      </body>
  </html>
  ​

–4,表格标签

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 表格标签</title>
      </head>
      <body>
          <!-- 1.准备表格 
              结构:table里包含行tr,tr里包含列td
              属性:border设置边框,width宽度,bgcolor背景色
              cellspacing单元格的距离
              colspan是列合并:把多个列合并成一个大列,值是指合并几个
              rowspan是行合并:把多个行合并成一个大行,值是指合并几个
          -->
          <table border="1px" width="500px" 
                cellspacing="0px" bgcolor="greenyellow">
              <tr>
                  <td colspan="2">11</td>
                  <td>13</td>
              </tr>
              <tr>
                  <td>21</td>
                  <td>22</td>
                  <td rowspan="2">23</td>
              </tr>
              <tr>
                  <td>31</td>
                  <td>32</td>
              </tr>
          </table>
      </body>
  </html>

四,作业

制作两个表格

一, 表单标签

–1,用户注册表单

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 表单</title>
      </head>
      <body>
          <!-- 表单标签,用来提交数据 -->
          <form>
              <table bgcolor="pink" border="1px" cellspacing="0px">
                  <tr>
                      <td align="center" colspan="2">
                          <h1>注册表单</h1>
                      </td>
                  </tr>
                  <tr>
                      <td>用户名:</td>
                      <td>
                          <input type="text" />
                      </td>
                  </tr>
                  <tr>
                      <td>密码:</td>
                      <td>
                          <input type="password" />
                      </td>
                  </tr>
                  <tr>
                      <td>确认密码:</td>
                      <td>
                          <input type="password" />
                      </td>
                  </tr>
                  <tr>
                      <td>昵称:</td>
                      <td>
                          <input type="text" />
                      </td>
                  </tr>
                  <tr>
                      <td>邮箱:</td>
                      <td>
                          <input type="email" />
                      </td>
                  </tr>
                  <tr>
                      <td>性别:</td>
                      <td>
                          <input type="radio" />男
                          <input type="radio" />女
                      </td>
                  </tr>
                  <tr>
                      <td>爱好:</td>
                      <td>
                          <input type="checkbox" />篮球
                          <input type="checkbox" />足球
                          <input type="checkbox" />乒乓球
                      </td>
                  </tr>
                  <tr>
                      <td>城市:</td>
                      <td>
                          <!-- select是定义下拉框,option是下拉选项 -->
                          <select>
                              <option>-请选择-</option>
                              <option>北京</option>
                              <option>上海</option>
                              <option>广州</option>
                          </select>
                      </td>
                  </tr>
                  <tr>
                      <td>头像:</td>
                      <td>
                          <input type="file" />
                      </td>
                  </tr>
                  <tr>
                      <td>验证码:</td>
                      <td>
                          <input type="text" />
                          <img src="a.png" />
                          <button>点我换一张</button>
                      </td>
                  </tr>
                  <tr>
                      <td>自我描述:</td>
                      <td>
                          <!-- textarea是文本域,用来写大段文字的 -->
                          <textarea>在这儿写信息...</textarea>
                      </td>
                  </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <button type="submit">提交</button>
                          <button>重置</button>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
  </html>

–2,提交数据的细节处理

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 表单</title>
      </head>
      <body>
          <!-- 表单标签,用来提交数据 
              1,标签:form表单,table表格,tr行,td列,th表头,h1标题,
                  select是下拉框,option是下拉选项,textarea文本域
              2,属性:type="file"是浏览文件,type="email"是邮箱,align是元素的位置
              3,提交数据的要求:必须用form标签+必须有submit按钮+必须有name属性
                         提交的数据都在地址栏:被拼接在了?之后
              http://127.0.0.1:8848/cgb2109/test6.html?user=rose&pwd=123
                                                      name属性的值=浏览器上输入的值   
              4,name用来收集用户从浏览器填的数据,value用来设置提交的值
              5,数据提交的方式!!!: get和post
                get方式: 默认的就是get方式,数据拼接在地址栏中,缺点是不安全,长度受限
                post方式:好处是安全,数据大小没有要求,但是数据不在地址栏展示了
              6,method属性用来设置数据的提交方式默认是get,
                action属性用来指定是哪段java程序来处理这次提交的数据
          -->
          <form method="post" action="#">
              <table bgcolor="pink" border="1px" cellspacing="0px">
                  <tr>
                      <td align="center" colspan="2">
                          <h1>注册表单</h1>
                      </td>
                  </tr>
                  <tr>
                      <td>用户名:</td>
                      <td>
                          <input type="text" name="user"/>
                      </td>
                  </tr>
                  <tr>
                      <td>密码:</td>
                      <td>
                          <input type="password" name="pwd"/>
                      </td>
                  </tr>
                  <tr>
                      <td>确认密码:</td>
                      <td>
                          <input type="password" name="repwd"/>
                      </td>
                  </tr>
                  <tr>
                      <td>昵称:</td>
                      <td>
                          <input type="text" name="nick"/>
                      </td>
                  </tr>
                  <tr>
                      <td>邮箱:</td>
                      <td>
                          <input type="email" name="mail"/>
                      </td>
                  </tr>
                  <tr>
                      <td>性别:</td>
                      <td>
                          <input type="radio" name="sex" value="1"/>男
                          <input type="radio" name="sex" value="0"/>女
                      </td>
                  </tr>
                  <tr>
                      <td>爱好:</td>
                      <td>
                          <input type="checkbox" name="hobby" value="1"/>篮球
                          <input type="checkbox" name="hobby" value="2"/>足球
                          <input type="checkbox" name="hobby" value="3"/>乒乓球
                      </td>
                  </tr>
                  <tr>
                      <td>城市:</td>
                      <td>
                          <!-- select是定义下拉框,option是下拉选项 -->
                          <select name="city">
                              <option value="">-请选择-</option>
                              <option value="1">北京</option>
                              <option value="2">上海</option>
                              <option value="3">广州</option>
                          </select>
                      </td>
                  </tr>
                  <tr>
                      <td>头像:</td>
                      <td>
                          <input type="file" />
                      </td>
                  </tr>
                  <tr>
                      <td>验证码:</td>
                      <td>
                          <input type="text" />
                          <img src="a.png" />
                          <button>点我换一张</button>
                      </td>
                  </tr>
                  <tr>
                      <td>自我描述:</td>
                      <td>
                          <!-- textarea是文本域,用来写大段文字的 -->
                          <textarea>在这儿写信息...</textarea>
                      </td>
                  </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <button type="submit">提交</button>
                          <button>重置</button>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
  </html>

–3,其他标签

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 其他标签</title>
	</head>
	<body>
		<!--0. 都可以包括各种数据,效果不同.
			每个div独占一行, 每个p独占一行,多个span会在一行
		-->
		<div>你好</div>
		<div>你好</div>
		<div>你好</div>
		<p>hello</p>
		<p>hello</p>
		<p>hello</p>
		<span>你好</span>
		<span>你好</span>
		<span>你好</span>
		<!-- 1.音频 controls属性必须有的,用来作为控制器-->
		<audio controls="controls">
			<!-- 指定资源的位置 -->
			<source src="jay.mp3"></source>
		</audio>
		<!-- 2.视频 controls属性必须有的,用来作为控制器-->
		<video controls="controls">
			<source src="b.mp4"></source>
		</video>
	</body>
</html>


二,练习学生信息系统

–1,效果

–2,代码

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>学生信息管理系统MIS</title>
      </head>
      <body>
          <!-- 完成网页的制作,总结: 
              1,标签:form表单可以提交数据,table表格,tr行,td列,h1标题,input输入框,
                      select下拉框,option下拉选项,button按钮,br换行
              2,属性:method是form提交数据的方式,默认是get,数据在地址栏
                      action是form提交的数据交给哪个程序处理,#是没人处理
                      name是提交数据时的key,placeholder是输入框的提示,
                      checked是默认选中,value是提交的数据的值
          -->
          <form method="post" action="#">
              <table>
                  <tr>
                      <td>
                          <h1>学生信息管理系统MIS</h1>
                      </td>
                  </tr>
                  <tr>
                      <td>姓名:</td>
                  </tr>
                  <tr>
                      <td>
                          <input type="text" name="user" placeholder="输入姓名.."/>
                      </td>
                  </tr>
                  <tr>
                      <td>年龄:</td>
                  </tr>
                  <tr>
                      <td>
                          <input type="number" name="age" placeholder="输入年龄.."/>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          性别:(单选框)
                          <input type="radio" name="sex" value="1" checked="checked"/>男
                          <input type="radio" name="sex" value="0"/>女
                      </td>
                  </tr>
                  <tr>
                      <td>
                          爱好:(多框)
                          <input type="checkbox" name="hobby" value="ppq" checked="checked"/>乒乓球
                          <input type="checkbox" name="hobby" value="ps"/>爬山
                          <input type="checkbox" name="hobby" value="cg"/>唱歌
                      </td>
                  </tr>
                  <tr>
                      <td>
                          学历:(下拉框)
                          <select name="edu">
                              <option value="1">本科</option>
                              <option value="2">专科</option>
                              <option value="3">小学</option>
                          </select>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          入学日期:<br />
                          <input type="date" name="intime"/>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          <input type="submit" value="保存"/>
                          <input type="reset" value="取消"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
  </html>

三,CSS

–1,概述

CSS全称是层叠样式表,主要用来修饰HTML网页的CSS代码可以出现的位置:1,行内CSS2,内部CSS3,外部CSS语法: 选择器 { 属性名:属性值; }

–2,入门案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 css</title>
		<!-- 2.内部CSS -->
		<style>
			/* 语法: 选择器 { 属性名:属性值;样式2; } */
			/* 练习:把所有的p元素都设置红字 */
			p{
				color:red;
			}
			/* 练习:把所有的div元素都设置粉字 */
			div{
				color: pink;
			}
		</style>
	</head>
	<body>
		<!-- 1.行内CSS(优先级高),效果只作用在这一行. 属性名:属性值;
			 color修饰文字的颜色,font-size修饰字号
		-->
		<div style="color:green;font-size:20px;">我是div1</div>
		<div style="color:green;font-size:20px;">我是div2</div>
		<p>我是p1</p>
		<p>我是p2</p>
		<a>我是a1</a>	
		<a>我是a2</a>	
	</body>
</html>


四,选择器!!!

方便的选中网页中的一些元素分类:简单选择器 , 复杂选择器

–1,标签名选择器

根据标签的名字,选中元素

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 css的选择器</title>
		<style>
			/* 1.标签名选择器:按照标签的名字选中元素 */
				/* 练习0:给网页设置背景色 */
				body{
					background-color:#d0e4fe;
				}
				/* 练习1:把a的文字改成绿色 */ 
				a{
					color: green;
				}
				/* 练习2:把div加个边框颜色 */
				div{
					text-align:center;/* 文字居中 */
					border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */
					border-radius:15px; /* 圆角边框 */
				}
			/* 2.标签名选择器:按照标签的名字选中元素 */
		</style>
	</head>
	<body>
		<a>我是a1</a>
		<a>我是a2</a>
		<div>我是div1</div>
		<div>我是div2</div>
	</body>
</html>


–2,class选择器

使用步骤: 给元素添加class属性 + 通过.选中有class属性的元素

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 css的选择器</title>
		<style>
			/* 1.标签名选择器:按照标签的名字选中元素 */
				/* 练习0:给网页设置背景色 */
				body{
					background-color:#d0e4fe;
				}
				/* 练习1:把a的文字改成绿色 */ 
				a{
					color: green;
				}
				/* 练习2:把div加个边框颜色 */
				div{
					text-align:center;/* 文字居中 */
					border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */
					border-radius:15px; /* 圆角边框 */
				}
			/* 2.class选择器:先给元素添加class属性+通过.选中元素 */
				/* 练习1:把div的字号变大 */
				.a{/* 选中class=a的所有元素,class的值可以相同 */
					font-size: 25px;/* 字号 */
					font-family: "宋体";/* 字体 */
				}
		</style>
	</head>
	<body>
		<a>我是a1</a>
		<a>我是a2</a>
		<div class="a">我是div1</div>
		<div class="a">我是div2</div>
	</body>
</html>


–3,id选择器

按照id属性的值来选中元素.步骤: 给元素添加id属性 + 通过#获取id属性的值

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 css的选择器</title>
		<style>
			/* 1.标签名选择器:按照标签的名字选中元素 */
				/* 练习0:给网页设置背景色 */
				body{
					background-color:#d0e4fe;
				}
				/* 练习1:把a的文字改成绿色 */ 
				a{
					color: green;
				}
				/* 练习2:把div加个边框颜色 */
				div{
					text-align:center;/* 文字居中 */
					border: 1px solid red;/* 边框的宽度 实线 边框的颜色 */
					border-radius:15px; /* 圆角边框 */
				}
			/* 2.class选择器:先给元素添加class属性+通过.选中元素 */
				/* 练习1:把div的字号变大 */
				.a{/* 选中class=a的所有元素,class的值可以相同 */
					font-size: 25px;/* 字号 */
					font-family: "宋体";/* 字体 */
				}
			/* 3.id选择器:先给元素添加id属性(值必须唯一)+通过#获取id的值 */
				/* 练习1:把div1添加蓝色圆角边框 */
				#b{/* 获取网页中id=b的元素 */
					border:1px solid blue;/* 边框的宽度 实线 颜色 */
					border-radius: 10px;/* 边框圆角 */
				}
			/* 综合练习:给按钮添加背景色,选择器有好几种,优先使用id选择器选择高效 */
			#c{
				background-color: blue;/* 背景色 */
				border: 1px dashed red;/* 边框的宽度 虚线 颜色 */
				color: white;/* 文字的颜色 */
			}
			
		</style>
	</head>
	<body>
		<a>我是a1</a>
		<a>我是a2</a>
		<div class="a" id="b">我是div1</div>
		<div class="a">我是div2</div>
		<button id="c">按钮</button>
	</body>
</html>


–4,分组选择器

–5,属性选择器

五,作业

美化学生管理系统

一,作业

–1,美化学生管理系统

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>学生信息管理系统MIS</title>
          <style>
              .a{
                  width: 300px;/* 宽度 高度 */
                  height: 30px;
              }
              #btn1{
                  /* 背景色 文字的颜色 宽度 高度 */
                  background-color: #0000FF;
                  border-color: #0000FF;
                  color: white;
                  width: 50px;
                  height: 30px;
                  font-size: 15px;
              }
              #btn2{
                  /* 背景色 文字的颜色 宽度 高度 */
                  background-color: hotpink;
                  border-color: hotpink;
                  color: white;
                  width: 50px;
                  height: 30px;
                  font-size: 15px;
              }
          </style>
      </head>
      <body>
          <!-- 完成网页的制作,总结: 
              1,标签:form表单可以提交数据,table表格,tr行,td列,h1标题,input输入框,
                      select下拉框,option下拉选项,button按钮,br换行
              2,属性:method是form提交数据的方式,默认是get,数据在地址栏
                      action是form提交的数据交给哪个程序处理,#是没人处理
                      name是提交数据时的key,placeholder是输入框的提示,
                      checked是默认选中,value是提交的数据的值
          -->
          <form method="post" action="#">
              <table>
                  <tr>
                      <td>
                          <h1>学生信息管理系统MIS</h1>
                      </td>
                  </tr>
                  <tr>
                      <td>姓名:</td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="text" name="user" placeholder="输入姓名.."/>
                      </td>
                  </tr>
                  <tr>
                      <td>年龄:</td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="number" name="age" placeholder="输入年龄.."/>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          性别:(单选框)
                          <input type="radio" name="sex" value="1" checked="checked"/>男
                          <input type="radio" name="sex" value="0"/>女
                      </td>
                  </tr>
                  <tr>
                      <td>
                          爱好:(多框)
                          <input type="checkbox" name="hobby" value="ppq" checked="checked"/>乒乓球
                          <input type="checkbox" name="hobby" value="ps"/>爬山
                          <input type="checkbox" name="hobby" value="cg"/>唱歌
                      </td>
                  </tr>
                  <tr>
                      <td>
                          学历:(下拉框)
                          <select name="edu">
                              <option value="1">本科</option>
                              <option value="2">专科</option>
                              <option value="3">小学</option>
                          </select>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          入学日期:<br />
                          <input type="date" name="intime"/>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          <input id="btn1" type="submit" value="保存"/>
                          <input id="btn2" type="reset" value="取消"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
  </html>
  ​
  ​

二,CSS选择器

–1,分组选择器,属性选择器

分组选择器:选择器1,选择器2,选择器3{声明样式}属性选择器:根据属性选中元素

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 高级选择器</title>
      </head>
      <body>
          <style>
              /* 1.分组选择器:选择器1,选择器2,选择器3{声明样式} */
              div,#a,.b{ /* 通过多种选择器选中多个元素 */
                  font-size: 30px;/* 字号 */
                  text-indent: 20px;/* 文本缩进 */
              }
              /* 2.属性选择器:根据属性选中元素 */
              [type]{/* 只要有type属性的就会被选中 */
                  background-color: #0000FF;
              }
              [type='text']{/* 只要type属性等于'text'的 */
                  background-color: #FF0000;
              }
              input[type="password"]{/*只要input,而且type属性等于'password'的 */
                  background-color: #FF69B4;
              }
          </style>
          <input type="text" placeholder="姓名"/>
          <input type="password" placeholder="密码"/>
          <div>我是div1</div>
          <div>我是div2</div>
          <div>我是div3</div>
          <p id="a">我是p1</p>
          <p class="b">我是p2</p>
          <p class="b">我是p3</p>
          <span>我是span1</span>
          <span>我是span1</span>
          <span>我是span1</span>
      </body>
  </html>
  ​
  ​

三,盒子模型

–1,概述

CSS把HTML里的元素看做是一个一个的盒子.内边距padding: 一个盒子里的现象,内容和边框的距离外边距margin: 盒子和盒子间的距离边框border:是指盒子可以设置边框

–2,测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 小票</title>
          <style>
              /* 统一网页的风格 */
              body{
                  width: 300px;/* 宽度 */
              }
              /* 加大字号 */
              .a{
                  font-size: 30px;
              }
              /* 文字居中 */
              .b{
                  /* text-align:center ; */
                  margin-left: 80px;/* 左 内边距 */
              }
              /* 设置首行缩进 */
              #readme{
                  text-indent: 30px;
              }
              /* 设置图片居中 */
              img{
                  margin-left: 20px;
              }
              /* 设置水平线: 宽度 虚线 红色*/
              hr{
                  border:1px dashed red;
              }
          </style>
      </head>
      <body>
          <div>顾客联</div>
          <div class="a">请您留意取餐账单号</div>
          <div class="b">自取顾客联</div>
          <div>永和大王(北二环西路店)</div>
          <div>010-62112313</div>
          <div class="b">--结账单--</div>
          <div class="a">账单号:P00000009</div>
          <div>账单类型:食堂</div>
          <div>人数:1</div>
          <div>收银员:张静</div>
          <div>开单时间:2018-04-17 07:24:11</div>
          <div>结账时间:2018-04-17 07:24:22</div>
          <hr />
          <table>
              <tr>
                  <td>数量</td>
                  <td>品项</td>
                  <td>金额</td>
              </tr>
              <tr>
                  <td>1</td>
                  <td>
                      油条豆浆套餐<br />
                      1X--油条<br />
                      1X--现磨豆浆(热/甜)
                  </td>
                  <td>7.00</td>
              </tr>
          </table>
          
          <hr />
          <table>
              <tr>
                  <td width="180px">支付宝花呗一元早餐</td>
                  <td>-3.00</td>
              </tr>
              <tr>
                  <td>合计</td>
                  <td>4.00</td>
              </tr>
              <tr>
                  <td>支付宝</td>
                  <td>1.00</td>
              </tr>
              <tr>
                  <td>支付宝补贴</td>
                  <td>3.00</td>
              </tr>
          </table>
          <hr />
          打印时间:2018-04-17 07:24:22
          <hr />
          <div id="readme">
              根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。
          </div>
          <div>
              <img src="2.png"/>
          </div>
          <div>官网:www.yonghe.com.cn</div>
          <div>加盟热线:86-21-60769397 或 86-21-60769002</div>
  ​
      </body>
  </html>
  ​
  ​

四,HTMLCSS综合案例

–1,小票

创建1.css文件

  
  /* 统一网页的风格 */
  body{
      width: 300px;/* 宽度 */
  }
  /* 加大字号 */
  .a{
      font-size: 30px;
  }
  /* 文字居中 */
  .b{
      /* text-align:center ; */
      margin-left: 80px;/* 左 内边距 */
  }
  /* 设置首行缩进 */
  #readme{
      text-indent: 30px;
  }
  /* 设置图片居中 */
  img{
      margin-left: 20px;
  }
  /* 设置水平线: 宽度 虚线 红色*/
  hr{
      border:1px dashed red;
  }
  ​

改造html文件,引入css文件

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 小票</title>
          <!-- link把外部CSS文件引入到这个网页中 
              rel是指文件的类型(stylesheet是固定值是样式表)
              href是指定文件的位置
          -->
          <link rel="stylesheet" href="1.css"/>
      </head>
      <body>
          <div>顾客联</div>
          <div class="a">请您留意取餐账单号</div>
          <div class="b">自取顾客联</div>
          <div>永和大王(北二环西路店)</div>
          <div>010-62112313</div>
          <div class="b">--结账单--</div>
          <div class="a">账单号:P00000009</div>
          <div>账单类型:食堂</div>
          <div>人数:1</div>
          <div>收银员:张静</div>
          <div>开单时间:2018-04-17 07:24:11</div>
          <div>结账时间:2018-04-17 07:24:22</div>
          <hr />
          <table>
              <tr>
                  <td>数量</td>
                  <td>品项</td>
                  <td>金额</td>
              </tr>
              <tr>
                  <td>1</td>
                  <td>
                      油条豆浆套餐<br />
                      1X--油条<br />
                      1X--现磨豆浆(热/甜)
                  </td>
                  <td>7.00</td>
              </tr>
          </table>
          
          <hr />
          <table>
              <tr>
                  <td width="180px">支付宝花呗一元早餐</td>
                  <td>-3.00</td>
              </tr>
              <tr>
                  <td>合计</td>
                  <td>4.00</td>
              </tr>
              <tr>
                  <td>支付宝</td>
                  <td>1.00</td>
              </tr>
              <tr>
                  <td>支付宝补贴</td>
                  <td>3.00</td>
              </tr>
          </table>
          <hr />
          打印时间:2018-04-17 07:24:22
          <hr />
          <div id="readme">
              根据相关税法规定,电子发票的开票日期同网上申请电子发票的日期,如您需要当日的电子发票请务必在消费当日通过扫描下方二维码,根据指引步骤开具您的增值税电子普通发票。此二维码30天有效,扫描时请保持小票平整。
          </div>
          <div>
              <img src="2.png"/>
          </div>
          <div>官网:www.yonghe.com.cn</div>
          <div>加盟热线:86-21-60769397 或 86-21-60769002</div>
  ​
      </body>
  </html>

–2,用户注册

创建2.css文件

  
  /* 1.修饰input框  宽度高度 内边距 外边距 字号 */
  .a{
      width: 330px;
      height: 40px;
  }
  /* 2.修饰提示文字 字号 颜色 缩进 */
  .b{
      font-size: 5px;
      color: gray;
      text-indent: 10px;
  }
  /* 3.立即注册的按钮 背景色 字的颜色 字号 边框的颜色 居中*/
  button{
      background-color: red;
      border-color: red;
      color: white;
      text-align: center;
      width: 330px;
      height: 50px;
      font-size:25px ;
  }
  /* 4.居中的用户注册 */
  h1{
      /* text-align: center; */
      margin-left: 100px;
  }
  ​

创建html文件,并引入2.css文件

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>用户注册</title>
          <!-- 引入外部的css文件 -->
          <link rel="stylesheet" href="2.css"/>
      </head>
      <body>
          <form>
              <table>
                  <tr>
                      <td>
                          <h1>用户注册</h1>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="text" placeholder="用户名" name="user"/>
                      </td>
                  </tr>
                  <tr>
                      <td class="b">支持中文、字母、数字、“-”、“_”的组合,4-20个字符</td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="password" placeholder="设置密码" name="pwd"/>
                      </td>
                  </tr>
                  <tr>
                      <td class="b">建议使用数字、字母和符号两种以上的组合,6-20个字符</td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="password" placeholder="确认密码" name="repwd"/>
                      </td>
                  </tr>
                  <tr>
                      <td class="b">两次密码输入不一致</td>
                  </tr>
                  <tr>
                      <td>
                          <input class="a" type="number" placeholder="验证手机" name="tel"/>
                          或 
                          <a href="#">验证邮箱</a>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          <input type="checkbox" />
                          我已阅读并同意
                          <a href="#">《京淘用户注册协议》</a>
                      </td>
                  </tr>
                  <tr>
                      <td>
                          <button type="submit">立即注册</button>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
  </html>

五,Git–1,概述完成版本控制,可以实时上传代码到码云服务器上.日常操作:1,上传: add -> commit -> pushadd : 把即将上传的资源,从工作空间添加到本地索引commit: 把已经添加了索引的文件,从本地索引提交到本地仓库push: 把本地仓库的 推送到 Gitee上2,下载: clone/pullclone: 把Gitee上的代码下载到你的电脑里

–2,准备工作安装Git(下一步下一步就行了)去码云注册账号(记住账号密码,并激活邮箱)

一,Git–1,概述常见命令,在本地仓库执行!!! :add: 添加, 把即将上传的资源从工作空间添加到本地索引commit: 提交, 把本地索引的资源 提交给本地仓库push: 推送, 把本地仓库的资源 上传到远程仓库clone: 下载, 把远程仓库的资源 下载到你电脑上

–2,准备工作安装Git(下一步下一步就行了)去码云注册账号(记住账号密码,并激活邮箱)

–3,Git日常操作1,远程仓库:需要登录Gitee网站,在网站上创建仓库(右上角的加号–新建仓库–输入仓库名字选成开源–创建)

2,第一次上传::::在本地仓库要执行Git命令(除了touch命令不用执行)

  
  git config --global user.name "cgblpx" #配置了全局注册的账号
  git config --global user.email "[email protected]" #配置了全局注册的邮箱
  mkdir cgb2109 #在本地仓库中创建文件夹
  cd cgb2109 #进入指定的文件夹
  git init #初始化了git环境
  在本地仓库中自己创建文件1.txt  #即将上传这个资源
  git add .  # 添加即将上传的全部资源(资源的名字)
  git commit -m "first commit" #把即将上传的资源提交到本地仓库
  git remote add origin https://gitee.com/你的账号/你的仓库名.git  #把本地仓库和远程仓库挂载
  git push -u origin master #把资源从本地仓库上传到远程仓库
  第一次上传必须输入账号密码!
  成功后的提示:
  Enumerating objects: 3, done.
  Counting objects: 100% (3/3), done.
  Writing objects: 100% (3/3), 206 bytes | 103.00 KiB/s, done.
  ​

Git

3,下载::::

直接从Gitee网站下载压缩包,或者使用clone命令来下载

  
  #把指定账号的指定仓库的资源下载到你的电脑里
  E:\workspace\gitee\cgb201901>git clone https://gitee.com/cgblpx/cgb201901.git

4,不是第一次上传::::

在本地仓库要执行Git命令(除了touch命令不用执行)

  
  git add .  # 添加即将上传的全部资源(资源的名字)
  git commit -m "first commit" #把即将上传的资源提交到本地仓库
  git push -u origin master #把资源从本地仓库上传到远程仓库

二,Javascript–1,概述简称是js,是一种脚本语言,只能在浏览器中执行特点:直译式,不需要编译的过程.js是一种弱类型的语言,用来提高网页与用户的交互性事件驱动: 指JS代码以什么方式来触发执行基于对象: JS也有类似于OOP的思想,可以自己new对象脚本语言: 只能在特定场景执行的语言,JS只能在浏览器来执行JS的出现的位置:行内JS,内部JS,外部JS

–2,入门案例

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 js的入门案例</title>
          <!-- js可以让网页动起来,基于对象,事件驱动,脚本语言 -->
          <!-- 2.js代码可以出现的位置:内部JS -->
          <script>
              alert(100);
          </script>
      </head>
      <body>
          <!-- 1.js代码可以出现的位置:行内JS -->
          <!-- 事件驱动: js代码什么方式会被触发执行-->
          <!-- 点击时弹框 -->
          <div οnclick="alert('您点击了一个div元素')">我是div1</div>
          <!-- 鼠标路过时弹框 -->
          <div οnmοuseenter="alert('您路过了一个div元素')">我是div2</div>
          <!-- 双击时弹框 -->
          <div οndblclick="alert('您双击了一个div元素')">我是div3</div>
  ​
      </body>
  </html>

三,JS语法

–1,数据类型和变量

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 数据类型</title>
          <script>
              //2,变量: 变量类型 变量名=变量值
                  var b = 10;//number
                  b = 20; //number
                  b = 1.6;//number
                  b = true;//boolean
                  alert(b);//true
                  //练习:交换变量的值(首尾相连)
                  var c = 10;
                  var d = 20;
                  var e = c;
                      c = d;
                      d = e;
                  alert(c+","+d)//20,10
              //1,数据类型:number  string  boolean null undefined
                  //+两个作用:加法运算 和 拼接字符串
                  alert(2.4+3.6);//结果是number类型的,6
                  //在js中,字符串可以用单引号或者双引号引起来
                  alert("10");
                  alert('你好');//单引号也可以表示字符串
                  alert("10"+10);//1010
                  alert("10"+10+20);//101020
                  alert(10+20+"10");//3010
                  //boolean类型
                  alert(false);
                  alert(true);
                  alert(null);
                  alert(undefined);//未被定义
                  var a ; alert(a);//undefined
                  
          </script>
      </head>
      <body>
      </body>
  </html>

–2,运算符

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 js的运算符</title>
          <script>
              //TODO java的面试题:a=a+1; a+=1的区别???
              //5,运算符typeof:用来获取数据的类型
                  //alert弹出框
                  //输出结果到控制台,f12找到浏览器里的控制台
                  console.log(100);
                  console.log(typeof 100);//输出100的类型,number
                  console.log(typeof "100");//输出100的类型,string
                  console.log(typeof "100"+100);//输出100的类型拼接100数字,string100
              //4,三元运算符: 求两个数里的大值
                  var e = 10;
                  var f =5;
                  var g = e > f ? e : f ;//记录大的值
                  alert(g);
              //3,比较运算符,描述的成立就是true,不成立就是false
                  alert(1!=="1");//true
                  alert(1==1);//true
                  alert(1=="1");//true,==只比值
                  alert(1==="1");//false,===比类型和值
                  alert(1===1);//true,类型和值都是一样的
              //2,复合赋值运算符 %=
                  var d = 10;
                  alert(d%=3);//1
                  // d %= 3 相当于: d = d % 3;   
              //1,算术运算符 / % ++ --
                  alert(5/2);//2.5,js是弱类型的语言
                  alert(5%2);//取余数,1
                  var a=10;
                  var b=10;
                  var c = a+++b;//++优先级高于+,所以先结合的是a++然后再+b
                  alert(c);//20 
                  // alert(a++);//10
                  // alert(++b);//11
                  a = a++;//把a++的结果交给a保存
                  alert(a);//10
                  b = ++b;//把++b的结果交给b保存
                  alert(b);//11
              
              
          </script>
      </head>
      <body>
      </body>
  </html>

四,JS语句

–1,分支结构

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 js的语句</title>
          <script>
              //2.switch...case
                  //根据用户指定的值,提示今天是星期几
                  var day = prompt('请输入数据:') ;
                  console.log(typeof day);//浏览器收到的都是string
                  switch(day){
                      //break结束循环,结束case的结构
                      case '1' :console.log("今天是星期一");break;
                      case "2" :console.log("今天是星期二");break;
                      case "3" :console.log("今天是星期三");break;
                      case "4" :console.log("今天是星期四");break;
                      case "5" :console.log("今天是星期五");break;
                      case "6" :console.log("今天是星期六");break;
                      case "7" :console.log("今天是星期日");break;
                  }
              //1.if...else
                  var a = 3;
                  //===要求类型和值都一样才是true
                  if(a==="3"){//false
                      console.log('ok');
                  }else{
                      console.log('no ok');
                  }
                  //练习:判断成绩,判断成绩所属的等级
                  // 80~100(包括80,也包括100)      优秀 
                  // 60~80(包括60,但不包括80)       中等
                  // 0~60(包括0,但不包括60)     不及格
                  // 其他值                      输入有误
                  var b = 98;
                  if(b>=80 && b<=100){
                      console.log("优秀");
                  }else if(b>=60 && b<80){
                      console.log("中等");
                  }else if(b>=0 && b<60){
                      console.log("不及格");
                  }else{
                      console.log("输入有误")
                  }
          </script>
      </head>
      <body>
      </body>
  </html>

–2,循环结构

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 js的循环语句</title>
          <script>
              //2,while循环 while(循环条件){ 循环体 }
                  //练习1:假如你有1亿,每天花一半,能花多少天
                  var money = 100000000;//定义变量,记录钱
                  var days = 0;//定义变量,记录天数
                  while(money>1){
                      money = money/2;//花钱
                      days++;//天数++
                  }
                  console.log("1亿能花"+days+"天~~");
              //1,for循环
                  //练习1:打印1~10
                  for(var i=1;i<=10;i++){
                      console.log(i);
                  }
                  //练习2:求1~100里偶数的和
                  var sum = 0 ;//定义变量,记录和
                  for (var i = 1; i <=100; i++) {
                      if(i % 2 == 0){//偶数
                          sum = sum + i ;//修改变量的值
                      }
                  }
                  console.log("1~100的偶数和是: "+sum);
                  
          </script>
      </head>
      <body>
      </body>
  </html>

[(cgb2109-day11_cgblpx的博客-CSDN博客)]

通过script标签引入JS代码

js概念名词解释:

事件驱动:在JS中,大部分情况下都是通过事件触发驱动函数执行的,从而实现特定的功能。(比如点击div将内容替换为时间、当鼠标滑过元素,元素就有翻转的动态。)

脚本语言:在网络前端开发环境下,用于嵌入在客户端浏览器中的一段小程序。

特点和优势

特点:

(1)JS是一门直译式的语言,直接执行的就是源代码.

是一边解释一边执行,没有编译的过程(不像Java需要提前编译为class文件再运行).

(2)JS是一门弱类型的语言,没有严格的数据类型.

优势:

(1)良好的交互性

(2)一定的安全性(JS被强制的要求,不能访问浏览器以外的东西,只能访问浏览器和浏览器内部的资源)

(3)跨平台性(Java语言具有跨平台性,是因为有虚拟机)

JS数组用于在单个的变量中存储多个值(其实就是一个容器)。

JS中的数组可以存储例如:数值、字符串、布尔值、undefined、null、对象、函数等

JS数组的声明方式

var arr1 = new Array();//声明一个空数组var arr2 = new Array("abc", "hello", true);//声明一个具有初始值的数组alert(arr2.length);//3

var arr4 = [];//声明一个空数组alert(arr4.length);//0

arr4 = ["abc", "hello", true];//声明一个具有初始值的数组alert(arr4);

js中o是下标,但是java中是数组

for(var o in c){ console.log(o) }JS函数:使用了关键词 function

java中:

for(类型 数组 ,数组名称)

alert()

js函数两种方式:

方式一:通过function关键字声明函数

声明:function 函数名称([参数列表]){ 函数体 }

调用: 函数名称([参数列表])

function sum(){

​ var num=0;

​ var a=[1,2,3,4,5,6,7,8,9,10]; for(var i in a){ num+=a[i]; } console.log(num); }

​ 按钮:<button οnclick="sum();">点我求和</button>

方式二:通过函数直接量声明函数

声明:var 函数名称 = function([参数列表]){ 函数体 }调用: 函数名称([参数列表]);

<script> function tostring(a){ 参数不需要加var var s=" "; 这里string类型,需要写成var for(var i in a){ s+=a[i]+" "; } return s; } var arr=new Array("1","2"); var sum=tostring(arr); console.log(sum) </script>

js对象

<div onlclick="b()">一下</div>

<div οndblclick="a()">点我,两下,触发函数</div>

内置对象

String/Array/Number/Math/JSON…

拼串

var c=a.concat("world") console.log(c)

全转大写

var r=a.toUpperCase() console.log(r)

substring()截取方法,包括左边,不包括右边

math中的方法

console.log(Math.PI);console.log(Math.random());console.log(Math.round(2.8));

js中获取随机数只能是0到1

自定义对象

(1)方式一:

声明对象:function Person(){}创建对象:var p1 = new Person();设置属性:p1.name = "张飞"; p1.age = 18;设置方法:p1.run = function() { alert(this.name+" : "+this.age); }

调用方法:p1.run()调用范围小,只能被p1对象调用

(2)方式二:

var 对象名 ={“k”,“v”,特征2,特征3}

k的双引号可以去掉,属性之间是逗号。属性如果是string不能省双引号,数字可以省

var s={ "pinpai":"黄大发", price:function(){ console.log("....") } } console.log(s) console.log(s.pinpai) console.log(s.price) s.price();

Dom树:

是用来利用js代码,操作html每个元素的

dom用一套api来快速的通过js代码获取元素

Document对象

--获取对象: window.document,window.可以省略--调用方法: getElementById("元素的id的属性的值")--返回1个元素 getElementsByName("元素的name属性的值")--返回多个元素(用数组) getElementsByClassName("元素的class属性的值")--返回多个元素(用数组) getElementsByTagName("元素的标签名的值")--返回多个元素(用数组)write()--向文档写 HTML 表达式 或 JavaScript 代码title--返回网页的标题id--设置或返回元素的idinnerHTML--设置或返回元素的内容

<script> function get(){ //window.document; var x=document.getElementById("a"); console.log(x); } </script>

<body> <button οnclick="get()">按钮</button> <div id="a">我是div1</div > <div id="b">我是div2</div> <span class="c">我是span1</span> <span class="c">我是span2</span> </body>

一,JS的数组

–1,概述

1,特点: 长度可变,数据类型可以存的非常丰富.2,创建:

var a  = new Array(1,2,3,4.1);
var a = [1,2,3,4.1];


3,遍历:

//i是下标,a[i]是数据
for(var i=0;i<a.length;i++){}
for(var i in a){}


–2,测试

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 js数组</title>
		<script>
//JS数组的特点:存的数据类型丰富,也有下标0,也有length,随时改长度
			//1.创建数组的方式一:
				var a = new Array();
				console.log(a);
				console.log(a.length);//获取数组的长度
				var b = new Array(1,1.1,true,'hello');
				console.log(b);
				console.log(b.length);
				console.log(b[2]);
				console.log(b[3]);
				console.log(b[4]);//undefined!!!
			//2.创建数组的方式二:	
				var c = [];
				console.log(c.length);//0
				c = [1,1.1,true,'abc'];
				console.log(c.length);//4
				c[99]=true;
				console.log(c);
				console.log(c.length);//100
			//3.遍历数组
				for(var i=0;i<c.length;i++){
					//i是下标,c[i]是通过下标获取c数组里的数据
					console.log(c[i]);
				}
				//java的foreach:for (Object o : y) {o是数据}
				for (var o in c) {//forin,o是下标
					console.log(c[o]);
				}
		</script>
	</head>
	<body>
	</body>
</html>


二,JS函数

–1,概述

和java里的方法一样,也是有()的标记,也可以有参数列表,也可以有返回值

//定义函数
function a(参数名){ return b; }
var a = function(参数名){return b; }
//调用a函数,并传入参数,并用c记录返回值
var c = a(传参);


–2,测试

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 js函数</title>
		<script>
			//练习: 设计函数,并提供返回值和参数列表
			//需求:打印指定数组中的所有数据
				function tostring(a){
					var s = "";//定义变量,记录数据拼接后的字符串
					for(var i in a){//i是下标,a[i]是数据
						//把每个数据拼接成字符串,空格隔开
						s = s + a[i]+" ";
					}
					return s;//把结果返回给调用者
				}
			//调用函数,并准备参数arr,并用result接受函数返回来的结果
				var arr = new Array("abc",1.1,"jack",666);
				var result = tostring(arr);
				console.log(result);
				
			//练习: 设计函数,并提供返回值(通过return返回结果)
				var x = function(){
					return "hello js";//把结果返回给调用者
				}
				//调用了x(),并用y保存了函数的返回值
				var y = x();
				console.log(y);
			//2,创建JS函数方式2:
				//创建
				var get = function(){
					console.log('get()被调用!');
				}
				//调用
				get();
				//练习:统计1~10的偶数个数(使用数组和函数)
				var count = function(){
					var a =[1,2,3,4,5,6,7,8,9,10];
					var b = 0;//记录个数
					for(var i in a){//i是下标,a[i]表示数组里的数据
						if(a[i] % 2 == 0){//判断数据a[i]是不是偶数
							b++;//求个数
						}
					}
					console.log(b);
				}
				count();
				
			//1,创建JS函数方式1:
				//创建
				function save(){
					console.log('save()被调用成功!');
				}
				//调用
				save();
				
				//练习:统计1~10的总和(使用数组和函数)
				function sum(){
					var a =[1,2,3,4,5,6,7,8,9,10];//创建数组
					var b = 0;//定义变量,记录和
					for(var i in a){//forin遍历数组,i是下标
						//把每个数据a[i]求和
						b = b + a[i];
					}
					console.log(b);
				}
				
		</script>
		<style>
			/* 给按钮添加背景色 */
			button{
				background-color: pink;
				border-color: pink;
			}
		</style>
	</head>
	<body>
		<!-- 单击按钮,触发了js中定义好的sum() -->
		<button οnclick="sum();">点我,求和</button>
	</body>
</html>


–3,!!!自定义对象

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>测试 自定义js对象</title> <script> //!!!!! 创建JS对象的方式2: //语法: var 对象名={k:"v",k:"v",k:function(){}} //改造Person2对象 var person2={ name:"jack", study:function(){ console.log('study()已被调用'); } } //调用对象的属性--要么打印要么赋值 console.log(person2.name); //调用对象的函数 person2.study();

			//改造Car2对象
			var car2 = {
				pinpai:"黄大发" ,
				price:9.9
			}
			console.log(car2);
			//调用对象的属性
			console.log(car2.pinpai);
			console.log(car2.price);
		
		//创建JS对象的方式1:
			//练习:创建Car对象,设计属性和函数并完成调用!
			function Car(){}
			var c = new Car();
			console.log(c);
			
			//设置属性并调用
			c.pinpai="黄大发";
			c.price=9.9;
			console.log(c);
			console.log(c.pinpai);
			console.log(c.price);
			
			//设置函数并调用
			c.run=function(x){
				 return x+10;
			}
			var y = c.run(100);
			console.log(y);
		
			//1,声明对象
			function Person(){}
			//2,创建对象
			var p = new Person();
			console.log(p);
			//3,设置属性
			p.name="jack";
			console.log(p);
			//4,设置函数
			p.study=function(){
				console.log(100);
			}
			//5,调用属性
			console.log(p.name);
			//6,调用函数
			p.study();
		
	</script>
</head>
<body>
</body>
<html/>


四,DOM

–1,概述

是用来 利用JS代码,操作HTML的每个元素的利用document对象,

–2,测试

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 DOM</title>
		<!-- DOM就是用一套API来快速的通过js代码获取元素 -->
		<script>
			function get(){
				//1,获取id="a"的元素的内容
				//获取document对象
				//按照id获取元素getElementById("id属性的值")
				var x = document.getElementById("a");
				console.log(x);
			}
		</script>
	</head>
	<body>
		<button οnclick="get()">按钮</button>
		<div id="a">我是div1</div>
		<div id="b">我是div2</div>
		<span class="c">我是span1</span>
		<span class="c">我是span2</span>
	</body>
</html>


一,DOM

–1,用法

第一步:获取document对象, window.document,其中window可以省略不写第二步:使用对象的属性和函数

  
  getElementById()--按照id属性的值,来获取元素,只能获取一个
  getElementsByName()--按照name属性的值,来获取元素,获取多个,并存入数组
  getElementsByClassName()--按照class属性的值,来获取元素,获取多个,并存入数组
  getElementsByTagName()--按照标签名的值,来获取元素,获取多个,并存入数组
  ​
  innerHTML属性---获取内部的内容
  innerText属性---获取内部的内容
  注意:innnerhtml可以识别标签,innertext不能识别标签

–2,测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 DOM</title>
          <!-- DOM就是用一套API来快速的通过js代码获取元素 -->
          <script>
              function get(){
                  //1,获取id="a"的元素的内容
                  //获取document对象
                  //按照id获取元素getElementById("id属性的值")
                  var x = document.getElementById("a");
                  console.log(x);
                  var y = x.innerHTML;//获取元素的内容
                  console.log(y);
                  //2,获取id="b"的元素的内容 并修改????
                  var z = document.getElementById("b").innerHTML;
                  console.log(z);
                  z='我变了...';
                  console.log(z);
                  //3,修改id="a"的元素的内容
                  document.getElementById("a").innerHTML="我也变了";
                  //4,获取我是span1--按照class的值获取
                  var a = document.getElementsByClassName("c");
                  console.log(a);//按照class获取到了数组
                  var b = a[0].innerHTML;//按照下标操作元素
                  console.log(b);
                  //5,获取我是span1--按照标签名的值获取
                          //  按照标签名span获取到一个数组       下标  获取内容
                  var c = document.getElementsByTagName("span")[0].innerHTML;
                  console.log(c);
                  //6,修改我是span2的内容
                  //了解:innerHTML和innerText的区别?前者可以解析HTML代码,后者不能
  document.getElementsByClassName("c")[1].innerHTML="<h1>我是渣渣辉</h1>";
                  // document.getElementsByClassName("c")[1].innerText="<h1>我是渣渣辉</h1>";
              }
          </script>
      </head>
      <body>
          <button οnclick="get()">按钮</button>
          <div id="a">我是div1</div>
          <div id="b">我是div2</div>
          <span class="c">我是span1</span>
          <span class="c">我是span2</span>
      </body>
  </html>
  ​
  ​

二,!!!JSON

1,概述

是一种轻量级的数据交换格式,本质就是一个字符串.用来 规定浏览器和服务器之间 数据交换的一个格式.

–2,测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 json</title>
          <script>
              //1,创建json字符串
              var a ='"name":"jack"';//注意语法!!
              console.log(a);
              console.log(a.length);//求长度
              console.log(a.concat(100));//拼接
              //2,创建json对象--为了方便的操作字符串
              var b = '{"name":"jack","age":"20"}';
              console.log(b);
              console.log(b.length);//获取字符串的长度
              //js对象--为了方便的解析对象的属性
              var b2 = {name:"jack",age:20};
              console.log(b2.name);//获取属性的值
              //3,创建json数组
              var c = '[{"name":"jack","age":"20"},{"name":"rose","age":"18"}]';
              console.log(c.length);
              console.log(c.concat(100));
              //TODO 需求:解析c里面每个属性的值
          //解决方案:把json字符串转成js对象,否则就只能一点一点截取字符串啦!
              //利用js的内置对象JSON,完成json字符串和js对象的互转
              //parse(): json字符串->js对象:为了方便的调用对象的属性
              var obj = JSON.parse(c);
              console.log(obj);
              console.log(obj[0].name);//jack
              console.log(obj[0].age);//20
              console.log(obj[1].name);//rose
              console.log(obj[1].age);//18
              //stringify(): js对象->json字符串:为了方便的操作字符串
              //定义JS对象
              var person={name:"jack",age:20};
              //利用工具变成json字符串
              var str = JSON.stringify(person);
              console.log(str);
              console.log(str.length);
              var y = str.substring(9,13);
              console.log(y);//jack
          </script>
      </head>
      <body>
      </body>
  </html>
  ​

三,Vue

–1,概述

是一个轻量级的前端框架.封装了HTML CSS JS的代码.特点:1, 是一个轻量级的 渐进式的框架, 按需配置2, 实现了数据驱动/双向绑定 和 组件化的思想(高内聚)3, vue框架可以避免了DOM的API

4, 遵循了MVVM设计模式,实现前端代码的松耦合

M是Model,是指数据

V是View,是指视图VM是ViewModel,是指在指定视图里渲染指定数据

–2,入门案例

把vue.js导入到你的项目中

创建HTML文件,并引入vue.js

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 vue框架</title>
          <!-- 1.引入vue.js来用vue框架的核心功能 
              src用来指定js文件的位置
          -->
          <script src="vue.js"></script>
      </head>
      <body>
          <!-- 2.准备解析vue的数据 
              {
  
  {message}}是插值表达式,用来获取message的值
          -->
          <div id="app"> {
  
  {message}} </div>
          <!-- 3.给第二步准备数据 -->
          <script>
              var a={
                  message:"hello vue~"
              }
              //1,创建Vue对象
              new Vue({
                  //el挂载点,意思是,把数据挂载到指定位置
                  el:"#app",//利用CSS的id选择,选中了网页中的元素
                  //data是vue为挂载点准备好的数据
                  data:a
              })
          </script>
      </body>
  </html>
  ​
  ​

测试

总结

–3,练习

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>练习 vue开发步骤</title>
          <!-- 1.引入vue.js -->
          <script src="vue.js"></script>
      </head>
      <body>
          <!-- 2.准备数据渲染区,插值表达式获取属性的值-->
          <div id="app">
              姓名:{
  
  {name}}
              年龄:{
  
  {age}}
          </div>
          <!-- 3.创建Vue对象 -->
          <script>
              new Vue({
                  el:"#app" , //挂载点
                  data:{ //给挂载点准备数据
                      name:"jack" ,
                      age:20
                  } 
              })
          </script>
      </body>
  </html>
  ​
  ​

四,Vue的基础语法

–1,运算符&函数

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 vue的运算符</title>
          <!-- 1.引入vue.js -->
          <script src="vue.js"></script>
      </head>
      <body>
          <!-- 2.准备数据渲染区 创建Vue对象 -->
          <div id="app">
              加减乘除运算: {
  
  {3+2}} {
  
  {3-2}} {
  
  {3*2}} {
  
  {3/2}} {
  
  {3%2}}
              三元运算符: {
  
  { age > 18 ? "成年人" : "未成年" }}
              字符串的常见操作:{
  
  {str}} {
  
  {str.length}} {
  
  {str.concat(100)}}
          
              调用函数: {
  
  { show() }}  {
  
  { print(100) }}  {
  
  {add(1,2)}}
          </div>
          <!-- 3.创建Vue对象 -->
          <script>
              new Vue({
                  //指定挂载点的位置,每个Vue对象必须有这个el属性!!!
                  el:"#app",
                  data:{ //给数据渲染区准备数据
                      age:10,
                      str:"hello"
                  },
                  methods:{ //准备函数
                   //函数名:函数的声明
                      show:function(){
                          console.log("show()调用成功!");
                      },
                      print:function(a){
                          console.log("print()调用成功"+a);
                      },
                      add:function(a,b){
                          console.log(a+b);
                      }
                  }
              })
          </script>
      </body>
  </html>

一,Vue的基础语法

–1,解析类型丰富的data

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 vue解析复杂的数据</title>
          <script src="vue.js"></script>
      </head>
      <body>
          <div id="app">
              {
  
  {name}}
              <h1>解析vue对象的数据:</h1>
              <h1>姓名:{
  
  {person.name}}  年龄:{
  
  {person.age}} </h1>
              <h1>解析vue数组的数据:</h1>
              <h2>{
  
  {hobby}}  {
  
  {hobby[0]}}  {
  
  {hobby[1]}} </h2> 
              <!-- 数组名[下标].属性名   目的是来获取每个对象中属性对应的值 -->
              <h2>{
  
  {persons[0].name}}  {
  
  {persons[1].age}}</h2>
          </div>
          <script>
              var vm = new Vue({
                  el:"#app",
                  data:{
                      name:"jack",
                      //对象名:对象的多个特征
                      person:{
                          name:"rose",
                          age:20
                      },
                      //数组
                      hobby:["篮球","足球"],
                      //数组
                      persons:[
                          { name:"jack" , age:20 },
                          { name:"rose" , age:10 }
                      ]
                  }
              })
          </script>
      </body>
  </html>

–2,data的三种写法

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>vue里data的三种写法</title>
          <script src="vue.js"></script>
      </head>
      <body>
          <div id="a">
              {
  
  {msg}} {
  
  {hobby[0]}}
          </div>
          <script>
              new Vue({
                  el:"#a",
                  //通过函数,设置返回值--vue项目中组件化的使用
                  // data:function(){
                  data(){//效果同上,是上面代码的简写形式
                      //必须返回js对象
                      return {
                          msg:"hello vue",
                          hobby:[1,2,3]
                      }
                  }
              })
          </script>
      </body>
  </html>

二,Vue的指令

–1,概述

就是Vue框架提供的一些有特殊意义的代码,都有v-的前缀常见的指令: v-if v-for v-on …使用方式: 在开始标签处,添加新的属性,有v-的前缀的标识

–2,v-model & v-cloak

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 vue指令</title>
          <script src="vue.js"></script>
          <style>
              /* 语法: 选择器{样式1;样式2;...} */
              [v-cloak]{/* 选中有指定属性的元素 */
                  display: none; /* 隐藏 */
              }
          </style>
      </head>
      <body>
          <!-- 2.v-cloak指令:解决插值表达式的闪现问题 -->
          <div class="a" v-cloak>
              {
  
  {address}}  {
  
  {address}} {
  
  {address}}
              <!-- 1.v-model指令:双向绑定,是指V和M的数据可以实时同步
                      address值是指你的数据要和哪个属性进行绑定.
                      可以获取也可设置属性的值
               -->
              <input type="text" v-model="address"/>
          </div>
          {
  
  {address}}
          <script>
              new Vue({
                  el:".a",
                  data(){
                      return{
                          address:"北京"
                          
                      }
                  }
              })
          </script>
      </body>
  </html>

–3,v-if & v-show & v-for

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 vue指令</title>
          <script src="vue.js"></script>
      </head>
      <body>
          <div id="app">
              <h1>{
  
  {name}}</h1>
              <!-- 3.v-text和v-html 指令 都是用来获取属性值的,
                  区别是:前者无法解析HTML标签只能当做一个普通文本展示
                        后者可以解析数据中出现的HTML标签
              -->
              <h1 v-text="name"></h1>
              <h1 v-html="name"></h1>
              <!--4.v-if指令,判断条件满足时就展示元素,不满足就不展示
                  了解:v-if和v-show区别?都可以判断,不满足时前者干脆不会解析元素
                  后者会解析这个元素但是结合css代码来隐藏style="display: none;"
              -->
              <div v-if="age>18">年成人</div> 
              <div v-show="age>18">年成人</div> 
              <!--5.v-if指令的复杂使用 if...else if...else语法同java-->
              <div v-if="salary>20000">金领</div>
              <div v-else-if="salary>10000">白领</div>
              <div v-else>屌丝</div>
              <!--6.v-for指令用来循环遍历,通常用来遍历数组,语法类似forin,
                  i是获取遍历得到的数据,in是固定语法,hobby是数组名,index是下标
              -->
              <div v-for="i in hobby">{
  
  {i}}</div>
              <div v-for="i,index in hobby">{
  
  {i}}--{
  
  {index}}</div>
          </div>
          <script>
              new Vue({
                  el:"#app",
                  data(){
                      return{
                          name:"<p>tony</p>",
                          age:10,
                          person:{
                              salary:10000
                          },
                          hobby:["吃","喝","王者","Anglelababa"]
                      }
                  }
              })
          </script>
      </body>
  </html>

–4,v-on & v-bind

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测 vue指令</title>
          <script src="vue.js"></script>
      </head>
      <body>
          <!-- 0.是HTML的元素 -->
          <button οnclick="alert(1)">按钮1</button>
          <a href="https://www.baidu.com/">百度一下</a>
          
          <div id="app">
              <!-- 1.v-on指令:给元素绑定不同的事件,可以简写成@ -->
              <button v-on:click="show()">按钮2</button>
              <button v-on:dblclick="print(100)">按钮3</button>
              <button @click="add(1,2,3)">按钮4</button>
              
              <!-- 问题:跳转时404,没有把url当变量,而是直接把整体当做跳转路径 -->
              <a href="{
  
  {url}}">百度一下1</a>
              <!-- 2.v-bind指令:把url当变量,去获取了变量的值进行跳转
                   v-bind:href可以简写成:href,意思是后面出现的url是变量不是字符串
               -->
              <a v-bind:href="url">百度一下2</a>
              <a :href="url">百度一下3</a>
          </div>
          <script>
              new Vue({
                  el:"#app",
                  data:{ 
                      url:"http://www.baidu.com/"
                  },
                  methods:{
                      //函数名:函数声明(参数列表){函数体} 
                      show:function(){
                          console.log(100)
                      } ,
                      print:function(a){
                          console.log(a);
                      },
                      //函数名(参数列表){函数体},是上面函数的简写方式
                      add(a,b,c){
                          console.log(a+b+c);
                      }
                  }
              })
          </script>
      </body>
  </html>

三,Vue组件Component

–1,概述

好处:可以提高前端代码的复用性.使用步骤:1,定义组件: 全局组件 + 局部组件2,使用组件: 就像使用HTML的标签一样

–2,全局组件

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 Component组件</title>
          <!-- 1.组件是vue.js的核心功能,先导入vue.js -->
          <script src="vue.js"></script>
      </head>
      <body>
          <!-- 2.在数据渲染区 -->
          <div id="app">
              <!-- 3.2,使用组件,就像使用HTML的标签一样 -->
              <Person></Person>
          </div>
          
          <div id="a">
              <Person></Person>
          </div>
          <!-- 3.创建Vue对象 -->
          <script>
          //全局组件:作用范围是可多个Vue对象使用,可以在所有的渲染区使用
              //3.1,创建全局组件--1是组件名2是组件内容
              // Vue.component(1,2)
              Vue.component('Person',{
                  // template:组件具体要啥内容
                  template:"<h1>姓名:jack,年龄:20</h1>"
              })
              new Vue({
                  el:"#app"
              })
              new Vue({
                  el:"#a"
              })
          </script>
      </body>
  </html>

–3,局部组件

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 局部组件</title>
          <script src="vue.js"></script>
      </head>
      <body>
          <div id="app">
              <Car></Car><!-- 2.使用了局部组件 -->
              <Student></Student><!--使用了全局组件-->
          </div>
          <div id="a">
              <Student></Student><!--使用了全局组件-->
          </div>
          <script>
              //全局组件
              Vue.component('Student',{
                  template:'<h1>这是一个全局组件</h1>'
              })
              //局部组件:只能当前对象(在指定的数据渲染区)使用
              new Vue({
                  el:"#a"
              })
              new Vue({
                  el:"#app",
                  //1.创建局部组件
                  components:{
                      //组件名:组件的内容
                      Car:{
                          template:"<p>这就是Car组件!</p>"
                      }
                  }
              })
          </script>
      </body>
  </html>

一,Vue组件的练习

–1,测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 组件</title>
          <!-- 自己写一个全局组件和局部组件 -->
          <script src="vue.js"></script>
      </head>
      <body>
          <div id="app1">
              <!-- 1,使用组件 -->
              <Com1></Com1>
              <Com2></Com2>
              <Com10></Com10>
              <Com20></Com20>
          </div>
          <div id="app2">
              <!-- 1,使用组件 -->
              <Com1></Com1>
              <Com10></Com10>
          </div>
          <script>
              /* 2.创建全局组件,在全局使用 */
              Vue.component('Com1',{
                  template:'<h1>你好Com1</h1>'
              })
              Vue.component('Com10',{
                  template:'<ol><li>我是元素1</li><li>我是元素2</li></ol>'
              })
              new Vue({
                  el:"#app1",
                  /* 3.创建局部组件:只能在局部(id=app1的位置)使用 */
                  components:{
                      'Com2':{
                          template:'<h1>你好Com2</h1>'
                      },
                      'Com20':{
                          template:'<button style="background-color: red;">按钮1</button>'
                      }
                  }
              })
              new Vue({
                  el:"#app2"
              })
          </script>
      </body>
  </html>

二,Vue路由Router

–1,概述

基于Vue组件化的思想,从用户发起一个请求,一直到展示指定组件,这个过程就是Vue路由负责的使用步骤: vue.js + vue-router.js 引入到网页中

–2,测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 Vue路由</title>
          <!-- 1.引入js文件,注意顺序! -->
          <script src="vue.js"></script>
          <script src="vue-router.js"></script>
      </head>
      <body>
          <!-- 2.准备数据渲染区,即将展示组件的功能 -->
          <div id="app">
              <!-- 3.4,点击不同的元素,即将路由到不同的组件 -->
              <router-link to="/home">主页</router-link>
              <router-link to="/help">帮助页</router-link>
              <!-- 3.5,展示组件的内容 -->
              <router-view></router-view>
          </div>
          <!-- 3.创建Vue对象 -->
          <script>
              //3.3,创建组件,让路由动态匹配
              var home={
                  template:'<h1>我是主页..</h1>'
              }
              var help={
                  template:'<h1>我是帮助页..</h1>'
              }
              //3.2,创建路由的细则
              //VueRouter表示vue路由的对象,routes属性用来描述细则
              var router=new VueRouter({
                  //属性名:属性值
                  routes:[
                      //根据不同的请求,路由到不同的组件
                      //path:访问路径,component:组件名称
                      {path:"/home",component:home}  ,
                      {path:"/help",component:help}
                  ]
              })
              new Vue({
                  el:"#app",
                  //3.1,设置路由功能
                  // router:router //key 和value一样时,可以简写
                  router//同上,简写形式
              })
          </script>
      </body>
  </html>

–3,总结

–4,练习

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>练习路由</title>
          <script src="vue.js"></script>
          <script src="vue-router.js"></script>
      </head>
      <body>
          <div id="app">
              <router-link to="/runoob">runoob</router-link>
              <router-link to="/w3c">w3c</router-link>
              <router-view></router-view>
          </div>
          <script>
              var runoob={
                  template:"<a href='http://www.runoob.com'>http://www.runoob.com</a>"
              }
              var w3c={
                  template:"<a href='http://www.w3school.com.cn'>http://www.w3school.com.cn</a>"
              }
              var router=new VueRouter({
                  routes:[
                      {path:"/runoob", component:runoob},
                      {path:"/w3c", component:w3c}
                  ]
              })
              new Vue({
                  el:"#app",
                  router
              })
          </script>
      </body>
  </html>

三,Vue的ajax

–1,概述

可以避免刷新整个网页,而实现了局部刷新的效果,异步访问的.提高了网页的动态性,提高了网页的响应速度.在Vue框架中,封装了Ajax的复杂语法,技术命名叫axios,使用步骤: 导入vue.js + axios.js 文件语法: axios.get(java程序的访问方式).then( a => { console.log(a); } )

-2.测试

  
  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8">
          <title>测试 axios的语法</title>
          <!-- 1.导入js文件:
              vue.js核心 + vue-router.js是路由 + axios.js使用vue封装好的Ajax技术
           -->
          <script src="vue.js"></script>
          <script src="axios.min.js"></script>
      </head>
      <body>
          <div id="app">
              <button @click="show()">按钮</button>
          </div>
          <script>
              //Vue的属性:el挂载点 + data数据区 + methods方法区 
                    //components局部组件 + router创建路由
              new Vue({
                  el:"#app" ,
                  methods:{
                      show(){
                          //vue提供的对象,get函数是指即将发起一个get请求
                          //参数是一段java程序的访问方式
                          //当程序访问成功时,then函数是vue自动调用的函数
                          axios.get('http://www.baidu.com/').then(
                              //a记录着java程序的返回值return
                              //=>叫箭头函数
                              a => {
                                  //在函数体重,处理返回的结果
                                  console.log(a.data);
                              }
                          )
                      }
                  }
              })
          </script>
      </body>
  </html>

四,Vue-cli

–1,概述

npm:包管理器,npm命令会去指定的网址下载/安装好多的包(文件夹结构)webpack:自动化构建项目的命令,可以自动下载项目相关的资源(html css js 图片),而且可以自动压缩,打包.

–2,安装vue-cli

1,安装原因

  
  为了能够成功的使用vue项目,必须先安装vue-cli脚手架

2,安装nodejs.mis的应用程序

  
  (win7系统只能装nodejs13的,win10系统装nodejs14),
  双击下一步下一步就可以了.

3,验证nodejs是否安装:

  
  C:\Users\WangYiBo>node -v
  v14.17.5

4,安装脚手架:

  
  C:\Users\WangYiBo>npm config get registry  #第一次获取,会是一个国外的网址,即将下载的非常慢,不好,必须修改!
  C:\Users\WangYiBo>npm config set registry https://registry.npm.taobao.org #就是把npm的默认网址改成淘宝的!
  C:\Users\WangYiBo>npm install vue-cli -g #安装vue脚手架,本质上是去npm下载了好多包,原则是一路没有遇到飘红的ERR,只有黄色的WARN没关系,遇到飘红就重新执行这个命令(也许要多次执行)
  C:\Users\WangYiBo>vue -V  #查看vue-cli的版本
  2.9.6
  C:\Users\WangYiBo>where vue #查看下载的位置 (npm文件夹有20M左右)

五,创建Vue项目!!

1,首先创建一个文件夹,用来存放下载好的vue项目资源

2,在这个文件夹处,执行命令来下载

3,开始下载:

  
  E:\workspace\vue>vue init webpack jt  #准备下载jt项目
  #下载一些项目需要的资源,但是要进行一些配置,参考下图选择yes或者no

4,检查:

原则还是一路没有遇到飘红的ERROR还有提示信息: Project initialization finished!

5,启动项目

  
  E:\workspace\vue>cd jt  #进入项目所在的文件夹
  E:\workspace\vue\jt>npm run dev   #启动项目(在哪个项目执行这个命令就启动哪个项目)

6,访问项目

六,在项目中添加自己的资源

1,用Hbuilder打开你下载好的项目.

文件-打开目录-浏览项目位置-打开

2,目录结构

3,在vue项目中添加自定义组件

在src/components文件夹里,创建组件

  
  <template>
    <div>
        {
  
  {msg}}
    </div>
  </template>
  <script>
  //表明 这个组件可以导出
  export default{
      name:'Person',//组件名
      data(){
        return{
          msg :'hello vue project~'
        }
      }
  }
  </script>
  ​
  <style>
  </style>

在src/App.vue文件里,注册组件

  
  <template>
    <div id="app">
      //3,使用自定义的组件
      <Person></Person>
    </div>
  </template>
  <script>
  //1.导入指定的自定义组件 ,路径要求必须有./
  import Person from './components/Person.vue'
  export default {
    name: 'App',
    components:{ //2.添加组件
      Person //使用第一步导入成功的组件名
    }
  }
  </script>
  ​
  <style>
  #app {
    font-family: 'Avenir', Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }
  </style>
  ​

测试

1,进入项目所在的文件夹里,运行启动命令来启动项目 : npm run dev2,打开浏览器访问: http://localhost:8080 ,观察有没有展示你自定义组件的内容

猜你喜欢

转载自blog.csdn.net/weixin_43762083/article/details/121522623