导图社区 前端 超级思维导图
前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。随着互联网技术的发展,HTML5,CSS3,前端框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率,完美的动效设计,给用户带来极高的用户体验
编辑于2022-08-05 11:24:59 湖北省Java
idea
安装:
教程地址:
https://blog.csdn.net/kaixuansui/article/details/89145365
破解 idea教程
https://www.exception.site/essay/how-to-free-use-intellij-idea-2019-3?tdsourcetag=s_pctim_aiomsg
快捷键:
psvm
public static void main() { }
sout
System.out.println();
.return
.for
子主题
ctrl+F
查找
ctrl+R
查找替换
alt+鼠标选中
批量选中
java基础
基础类型
基础语句if for等
类 对象 封装继承多态
抽象类 接口
内部类
一些工具(如date math函数等)
集合
泛型
文件
文件流
properties
Properties properties=new Properties();
多线程
网络编程
Steam流
反射
JavaWeb
后端
xml
MySQL
mysql的下载配置启动等
mysql的下载
下载地址:
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-winx64.zip
mysql的可视化软件下载
sqlyog.en.softonic.com/download
mysql的配置
教程地址:
https://blog.csdn.net/a802976/article/details/119255644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163743125716780357235552%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163743125716780357235552&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119255644.first_rank_v2_pc_rank_v29&utm_term=mysql%E4%B8%8B%E8%BD%BD&spm=1018.2226.3001.4187
my.ini
mysql的初始化:cmd中运行:
mysqld --initialize --console
注意其中的密码
mysql的启动:cmd中运行:
mysqld --install mysql
net start mysql
mysql的登录
mysql -hlocalhost -p3306 -uroot -p
mysql -uroot -p
mysql配置环境变量:
SQL语句的增删改查
Select
select * from wenzhang where id = #{id}
Update
update wenzhang set data = #{data} , date = #{date} , title = #{title} , weight = #{weight} where id = #{id}
delete
delete from wenzhang where id = #{id}
Insert
insert into wenzhang (id, data, date, title, weight) VALUES (id,data,date,title,weight)
MySQL的表的操作
创建表
create table if not exists student( id int primary key auto_increment, name varchar(24) not null unique , age int default 0, rid int references student_role(student_id) );
修改表的列
修改表的名字
rename table people to Person;
删除表
drop table if exists student
显示表的结构
desc student
Jdbc
maven在pom.xml里按快捷键del+insert搜索导入jdbc
连接数据库
数据库连接池
连接数据库时的URL
jdbc:mysql://localhost:3306/xiaobai?useSSL=false&serverTimezone=UTC
Druid数据库连接池
maven
maven的下载
下载地址:
https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.zip
配置环境变量
config文件夹下setting.xml增加镜像阿里云:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
修改配置文件
mavensetting 设置版本为11
profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> <jdk>11</jdk> </activation> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion> </properties> </profile>
maven的xml文件里设置为版本11
<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion> </properties>
连接阿里云仓库
修改仓库所在位置
修改maven默认的JDK版本
用maven配置下载jar包
maven web创建
blog.csdn.net/qq_44751508/article/details/121195640?utm_source=app&app_version=4.18.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
jsp
jsp标准开头
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> </body> </html>
tomcat
servlet
SSM
spring
pom.xml中配置:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.13</version> </dependency>
切面编程
xml增强
<aop:config> <aop:aspect ref="myAspect"> <aop:pointcut id="myPointcut" expression="execution(* com.jdk.*.*(..))"/> <aop:around method="around" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config>
注解增强
自动代理
application中配置
<aop:aspectj-autoproxy/>
子主题
spring mvc
pom:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</version> </dependency>
spring-mvc.xml配置:
必须加
<mvc:annotation-driven></mvc:annotation-driven>
子主题
默认地址
<mvc:default-servlet-handler/>
如果不加这个,访问其他非虚拟地址的资源就会找不到
扫描注解@controller的所在目录,比如com.controller
<context:component-scan base-package="com.controller"/>
web.xml配置:
<servlet><!-- 配置前端控制器 --> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><!--配置前端控制器的路径--> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
@Controller
@RequestMapping
映射设置虚拟地址
@ResponseBody
子主题
@RequestHeader
@CookieValue
从网页获取数据
参数自动匹配
发送数据到网页
modelAndView.addObject("eeeee","save0"); modelAndView.setViewName("index.jsp");
函数参数内的注解
@RequestParam
默认参数
@PathVariable
自定义类型转换器
post请求方式时的中文乱码问题
web.xml中配置
<filter><!-- 配置拦截器以解决中文乱码问题 --> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
文件上传
上传文件时需要的pom:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
上传文件spring-mvc中需要配置的:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="524280"></property> <property name="maxUploadSizePerFile" value="524280"></property> <property name="defaultEncoding" value="UTF-8"></property> </bean>
MultipartFile 来接受被上传的文件
filter拦截器
处理异常
mvc配置:
子主题
mybatis
//mybatis 网站:
https://mybatis.org/mybatis-3/zh/getting-started.html
创建maven模块
导入maven
maven pom.xml下配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>xiaobai</groupId> <artifactId>Demo21</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version> </dependency> </dependencies> </project>
mybatis-config.xml配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <typeAliases> <typeAlias type="" alias=""/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/>--> <!--自动搜索包--> <package name="com.mapper"/> </mappers> </configuration>
关于mybatis-config :
https://blog.csdn.net/weixin_41910059/article/details/82659238
配置jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/xiaobai?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=123456+
将自己创建的项目配置上mybatis
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
resourves创建Mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
插件搜索并下载mybatisX
自定义handle
配置扫描
<typeHandlers> <typeHandler handler="com.handler.DataTypeHandler"/> </typeHandlers>
代码:
public class DataTypeHandler extends BaseTypeHandler<Date> { @Override public void setNonNullParameter (PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLExceion { preparedStatement.setLong(i,date.getTime()); } @Override public Date getNullableResult (ResultSet resultSet, String s) throws SQLExceion { return new Date(resultSet.getLong(s)); } @Override public Date getNullableResult (ResultSet resultSet, int i) throws SQLExceion { return new Date(resultSet.getLong(i)); } @Override public Date getNullableResult (CallableStatement callableStatement, int i) throws SQLExceion { return new Date(callableStatement.getLong(i)); } }
作用:
在数据库到集合的时候实现自动转换
分页助手
分页插件导入pom.xml
代码(写到mybatis-config.xml里)
<plugins> <plugin interceor="PageHelper"> <property name="dialect" value="mysql"/> </plugin> </plugins>
mybatis一种不需要配置文件的方法:
<!-- 引入文件:jdbc.properties--> <context:property-placeholder location="jdbc.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dao"/> </bean>
Spring JdbcTemplate
pom.xml导包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
spring 引入properties文件:
<context:property-placeholder location="classpath:jdbc.properties"/>
实例:
创建对象
jdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource);
查询所有
jdbcTemplate.query("select * from students", new BeanPropertyRowMapper<Student>(Student.class))
查询数量例子
jdbcTemplate.queryForObject("select count(*) from students", Long.class)
根据id查询例子
jdbcTemplate.queryForObject("select * from students where id = ?", new BeanPropertyRowMapper<Student>(Student.class), 1)
修改
jdbcTemplate.update("update test set username = 'eaeawe11' where id = 1");
ssm整合
第一步:创建maven项目,添加web框架,java下创建一个com包,包下创建
dao
service
controller
utils
pojo
test
第二步,配置pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <groupId>demo34</groupId> <artifactId>demo34</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.13</version> </dependency> <!--spring整合mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!--servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!--spring-mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.13</version> </dependency> <!--mysql connect--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <!--druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <!----> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.13</version> </dependency> </dependencies> </project>
第三步:配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 连接spring--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <!-- spring监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- spring-mvc核心控制器--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 全局编码过滤器 解决post上传时的乱码--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
第四步: resource下创建 :
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="studentDao1" class="com.dao.StudentDao1"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <bean id="studentService1" class="com.service.StudentService1"> <property name="studentDao" ref="studentDao1"/> </bean> <bean id="studentController1" class="com.controller.StudentController"> <property name="studentService" ref="studentService1"/> </bean> </beans>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <typeAliases> <!-- <typeAlias type="" alias=""/>--> <!-- <package name="com.xiaobai.dao"/>--> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/>--> <!--自动搜索包--> <package name="com.xiaobai.dao"/> </mappers> </configuration>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--组件扫描--> <context:component-scan base-package="com.xiaobai.controller"/> <!--mvc注解驱动--> <mvc:annotation-driven/> <!--开放静态默认资源访问权限--> <mvc:default-servlet-handler/> <!--内部识图资源解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value=""/> <property name="suffix" value=""/> </bean> <!--配置异常处理器--> <!-- <bean id="myExceionResolver" class="com.libin.web.controller.MyExceionHandler"></bean>--> </beans>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/xiaobai?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=123456+
配置监听器
第五步:数据库的开启
jdbc的url:
jdbc:mysql://localhost:3306/xiaobai?useSSL=false&serverTimezone=UTC
事务增强
applicationContext.xml下配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="transactionInterceor" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="transactionInterceor" pointcut="execution(* com.service.impl.*.*(..))"/> </aop:config>
mybatis-plus
导包pom.xml:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
dao层:
@Repository public interface UserDao extends BaseMapper<User> { }
service层:
定义接口
继承接口
Spring Boot
spring boot 官网
https://spring.io/projects/spring-boot/
Spring Boot 的创建
如果国外的访问不了就访问:
http://start.aliyun.com
配置文件下的一些作用
spring.banner.image.location
启动的时候控制台打印图片
logging.level.root=debug/error
启动时打印环境信息等
Spring Boot配置
Spring Boot常用依赖pom.xml:
测试依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
pom.xml:
手动配置的:
<dependency> druid数据库连接池 <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> <dependency> mybatis-plus <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency>
application.yml
server: port: 8080
数据库id自增
mybatis-plus: global-config: db-config: id-type: auto
开启mybatis-plus运行日志:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
application.properties
server.port=8080
可以改服务器默认接口
com下创建一个类:
com.config.MybatisPlustConfig
配置注解:
@Configuration @MapperScan("com.springboot13.dao")
内容:(开启分页功能)
@Bean public MybatisPlusInterceor mybatisPlusInterceor(){ MybatisPlusInterceor interceor = new MybatisPlusInterceor(); interceor.addInnerInterceor(new PaginationInnerInterceor()); return interceor; }
yml(yaml)的格式
Dubbo
zookeeper安装
pom.xml:
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.2.1</version> </dependency> <!--ZooKeeper客户端实现 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.1.0</version> </dependency> <!--ZooKeeper客户端实现 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.1.0</version> </dependency>
Spring-Cloud
pom.xml:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注册中心Ereka:
eureka服务端
eureka的服务端依赖:
pom.xml:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
eureka自动装配:在boot启动对象内加注解:
@EnableEurekaServer
application.yml配置:
server: port: 10086 #配置端口 spring: application: name: eurekaserver #给自己的服务起一个名字,唯一的,最好是模块名 eureka: client: service-url: #eureka的地址信息 defaultZone: http://localhost:10086/eureka
eureka客户端
eureka的客户端依赖:pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.0.5</version> </dependency>
application.yml配置:
copy一个服务
例:
-Dserver.port=8082
负载均衡Ribbon
启动类中增加:
@Bean @LoadBalanced //负载均衡 public RestTemplate restTemplate(){ return new RestTemplate(); }
换负载均衡的算法:
Bean方式换
@Bean public IRule RandomRule(){ return new RandomRule(); }
yml配置换:
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loudbalancer.RandomRule #负载均衡规则
随机负载均衡:
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #随机选择的负载均衡规则
优先本地集群的负载均衡规则:
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #优先本地集群负载均衡规则
负载均衡饥饿加载开启(项目启动时创建):
ribbon: eager-load: enabled: true #开启饥饿加载 clients: userservice
Nacos
nacos的下载安装:
第一步:
进入官网:
nacos.io
第二步:
点击进入Github
第三步:
下载:
第四步:
安装:
第五步:
nacos改默认接口:
子主题
Nacos的注册中心使用步骤:
第零步:
启动Nacos
nacos文件路径输入cmd:
startup.cmd -m standalone
第一步:
引入父工程:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
第二步:
客户端依赖:
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
第三步:
order配置
spring: application: name: orderservice #设置本服务名 cloud: nacos: server-addr: localhost:8848 #设置服务地址和端口 discovery: cluster-name: China #设置集群名 namespace: cad905a3-c26f-4397-ad17-2df393a71b68 #命名空间id ephemeral: false #默认true为临时实例, 设置为永久实例
第四步:
user 配置
spring: application: name: userservice #服务名称 profiles: active: dev #运行环境 cloud: nacos: server-addr: localhost:8848 #Nacos地址 config: file-extension: yaml #文件后缀名 discovery: cluster-name: China #配置集群名
第五步:
提供者中更改负载均衡规则:
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #优先本地集群负载均衡规则
Nacos的配置管理
引入依赖:
<!-- nacos配置管理依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
Nacos的热部署:
方式一:
在@value所在类加上@RefreshScope
方式二:
通过@ConfigurationProperties注入,自动刷新
Feign
使用Feign步骤
第一步:
引入依赖:
<!-- Feign客户端依赖包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步:
在启动类添加注解开启Feign:
@EnableFeignClients//开启Feign的自动装配
第三步:
编写Feign客户端:
//一些常用注解介绍:
@FeignClient
Feign的日志配置:
yml配置
feign: client: congig: default: #这里的default是全局配置 loggerLevel: Full #日志级别 一共有四个级别 NONE BASIC HEADERS FULL userservice: #这里的是针对某个微服务的配置 loggerLevel: Full #日志级别 一共有四个级别 NONE BASIC HEADERS FULL
Java代码配置
Feign的性能优化:
使用连接池
HttpClient连接池
使用步骤:
引入依赖:
<!--Feign的httpclient连接池--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
yml中配置:
feign: httpclient: enabled: true #开启feign对HttpClient的支持 max-connections: 200 #最大连接数 max-connections-per-route: 50 #每个路径的最大连接数
日志使用NONE或者BASIC
注:原因是因为日志读取写入很消耗性能,所以日志越少越好
Feign的另一种写法:
新建Feign-API模块
将pojo,Client等写在这个模块
然后用项目依赖此模块
加载这个模块到spring:
第一种办法:
启动类上写:
@EnableFeignClients(clients = {UserClient.class})//这种方法代表指定某个单个接口
第二种办法:
启动类上加上:
@EnableFeignClients(basePackages = "com.xiaobai.feign.client")//这种方式是扫描包将改目录全部扫描
Gateway
网关gateway的依赖:
<!--Gateway网关依赖--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>
gateway的配置:(例:)
server: port: 10010 #Gateway端口号 spring: application: name: gateway #微服务名 必须是唯一标识 cloud: nacos: server-addr: localhost:8848 #指定nacos所在的端口号 gateway: routes: - id: user-service #路由标识 必须唯一 uri: lb://userservice #lb的意思是负载均衡 后面跟微服务的名称 predicates: - Path=/user/** #指定允许的路径 - id: order-service #order服务的路由标识 自取,但必须唯一 uri: lb://orderservice predicates: - Path=/order/** filters: - AddRequestHeader=eee, eawea #过滤 请求自动加上eee=eawea default-filters: AddRequestHeader=aaa, eawea #全局过滤 请求自动加上aaa=eawea
GlobalFileter
例:
@Order(-1) @Component public class AuthorizeFilter implements GlobalFilter { @Override public Mono<Void> filter (ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); MultiValueMap<String, String> queryParams = request.getQueryParams(); String username = queryParams.getFirst("username"); if ("xiaobai".equals(username)){ return chain.filter(exchange); } exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } }
解决跨域问题:
docker:
https://blog.csdn.net/qq_39135287/article/details/83993574
CentOs
CentOS安装教程
https://blog.csdn.net/qq_39135287/article/details/83993574
子主题
redis:
redis官网:
http://redis.io
redis的数据类型:
String类型:
set username xiaobai
get username
返回值为
”xiaobai“
del username
删除
Hash类型:
存储:
hset student1 username xiaobai hset student1 age 19
获取:
获取某一个
hget student1 username
获取所有
hgetall student1
删除:
hdel student1 username
List类型
存储:
左插:
lpush nums 1
右插:
lpush nums 2
范围获取:
lrange nums 0 -1
Set类型
存储:
sadd hobby 玩游戏
sadd hobby 吃饭
获取:
smembers hobby
删除:
srem hobby 玩游戏
Sortedset
存储
zadd student 100 xiaobai
zadd student 90 xiaobai
子主题
命令:
keys *
显示所有的键
type key
显示该键的类型
del key
根据键删除
加载配置启动redis服务
redis-server.exe redis.windows.conf
//windows上启动
jedis
jedisPoolConfig配置:
host=localhost port=6379 maxTotal=50 maxIdle=10
happy
C++
string
构造
重载
vector
构造函数
vector<int>v(15)//第一种
v.assign()
重载
比如<<
还有=
v.push_back( )
v.pop_back( )
v.clear( )
v.erase(v.begin())
v.insert(v.begin())
v.empty()判断是否为空
v.capacity( )返回总容量
v.size()返回当前数量
v.resise()
v.resise(10)改变数量为10
v.resise(10,1)在上的基础上,多余的补为1
v.begin( )
v.end( )
v.swap(v1)
deque
构造
重载
d.push_back
d.pop_back
d.
stack
queue
list
自由主题
deque没有容量概念
我的代码
js
判断闰年
alert((s = prompt('输入一个年份,判断是否闰年')) + (s % 100 && !(s % 4) || !(s % 400) ? '不是' : '是') + '闰年');
判断成绩等级
alert((score = prompt('请输入分数')) >= 70 ? (score >= 80 ? (score >= 90 ? 'A' : 'B' ) : 'C') : score >= 60 ? 'D' : 'E')
打印时间
var today = new Date(); var n = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六']; alert('今天是' + today.getFullYear() + '年' + (today.getMonth() + 1) + '月' + today.getDate() + '日' + today.getHours() + ':' + today.getMinutes() + ':' + today.getSeconds() + ' ' + n[today.getDay()]);
定时函数
// 传入设定的时间,返回还差多少时间 function f(time) { var nowTime = Date.now(); var inputTime = +new Date(time); var times = (inputTime - nowTime)/1000; var day = Math.floor(times/(3600*24)); times = times % (3600*24); var hour = Math.floor(times / 3600); times = times % (3600); var minutes = Math.floor(times / 60); times = times % 60; var seconds = Math.floor(times / 60); times = times % 60; var str = times / 60; return (day < 10 ? '0' + day : day) + '天' + (hour < 10 ? '0' + hour : hour) + '时' + (minutes < 10 ? '0' + minutes : minutes) + '分' + (seconds < 10 ? '0' + seconds : seconds) + '秒'; } alert(f('2222-2-7 22:30'));//测试
自己写一个去重的函数
function unique(arr) { if (Array.isArray(arr) != true) { return undefined; } var newArr = []; for (var i = 0; i < arr.length; ++i) { if (newArr.indexOf(arr[i]) === -1) { newArr.push(arr[i]); } } return newArr; } var arr = [1,1,2,3,1,4,3,5,7,9,1]; alert(unique(arr));
返回匹配字符串的所有索引集:
function f(str,key) { var arr = []; for (var n = 0; (n = str.indexOf(key,n)) != -1; arr.push(n++)); return arr;//返回值为key出现的索引集 } alert(f("atagddytesateta",'at'));//测试
判断字符出现数量
function CharCount(char) { this.ch = char; this.n = 1; this.addCount = function () { ++this.n; } } function judgeCharCount(str) { var arr = []; var bool = false; for (var i = 0; i < str.length; ++i) { for (var j = 0; j <arr.length; ++j) { if (arr[j].ch == str[i]) { arr[j].addCount(); bool = true ; break; } } if (bool == false) { arr.push(new CharCount(str[i])); } } return arr; } console.log(judgeCharCount("abcoefoxyozzopp"));
var o = {} var str = "ewaeaklawklamsp"; for (var i = 0; i < str.length ; ++i) { if (o[str[i]] ) { ++o[str[i]]; } else { o[str[i]]=1; } } console.log(o);
我的世界彩色字体转化
var s = '2345679abcdef'; var str = ''; var str1 = ''; while (1) { str = prompt('请输入你要转化为彩色的的字符'); for (var i = 0; i < str.length; ++i) { str1 += '&' + s[i % s.length] + str[i]; } alert(str1); str1 = ''; }
替换字符串
//替换字符串 function replace(str,str1,str2) { while (str.indexOf(str1) != -1) { str = str.replace(str1,str2); } return str; } var a = "qwq"; alert(replace(a,'q','a')); alert(a);
类似鸡兔同笼的三马问题:
public class Main { public static void main (String[] args) { for (int i = 0; i <= 33; ++i) { for (int j = 0; j <= 100 - i; ++j) { for (int k=0; k <= 100 - i - j; ++k) { if (i * 3 + j * 2 + 0.5 * k == 100 && i+j+k ==100) { System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("k = " + k); System.out.println(); } } } } } }
ACC竞赛第一题数圈圈:
Map<String,Integer> map = new HashMap<>(); map.put("8",2);map.put("B",2);map.put("0",1);map.put("4",1);map.put("6",1);map.put("9",1);map.put("A",1);map.put("D",1); String string = Integer.toHexString(new Scanner(System.in).nextInt()).toUpperCase(); int n = 0; Integer ch; for (int i = 0; i < string.length(); ++i) { if ((ch = map.get(String.valueOf(string.charAt(i)))) !=null) { n += ch; } } System.out.println(n);
知乎邀人脚本:
知乎邀请人脚本
(function() { 'use strict'; var btn = document.getElementsByClassName("Button Button--grey Button--withIcon Button--withLabel")[0]; window.alert("已捕获\"" + btn.textContent + "\"按钮"); var r=confirm("是否一键邀请?"); if (r==true) { btn.click(); setTimeout(function() { var item_num = document.getElementsByClassName("List-item").length; //window.alert(item_num); var items = document.getElementsByClassName("List-item"); for (var i = 0; i < item_num; ++i){ var node = items[i].getElementsByClassName("Button Button--blue")[0]; if (node != null){ node.click(); } } }, 1.5 * 1000); } else { x="你按下了\"取消\"按钮!"; } })();
小练习:
leetcode:
import java.util.*; public class test { public static void main (String[] args) { int[] A={1,3,4,5,7,8,10,11,16,19}; int M = 3; System.out.print("A = "); for (int i = 0; i < A.length; System.out.print(A[i++]+" ")) ; System.out.println("\nM = " + M + "\n" + "result: " + test02(A,M)); } public static int test02 (int[] A,int M) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0 , j = i + 1 ; i < A.length; j = ++ i + 1) { for (Integer temp; j < A.length; ++j) { if (Math.abs(A[i] - A[j]) % M == 0) { map.put(i,((temp = map.get(i)) == null ? 0 : temp ) + 1); map.put(j,((temp = map.get(j)) == null ? 0 : temp ) + 1); } } } List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet()); int n = list.get(0).getValue(); for (int i = 0 , temp, len = list.size(); i < len; n = (temp = list.get(i++).getValue()) > n ? temp : n); return list == null ? 0 : n + 1; } }
将json的紧缩形格式转化成扩展格式:
kmp算法
各大排序算法
红黑树
链表
leetcode刷的题
具体略,详情见D:/小白文件夹
前端
html
html对照表
https://tool.oschina.net/commons?type=2
" " "
& & &
< < <
> > >
空格  
html文档查看:
https://www.runoob.com/tags/ref-standardattributes.html
前端网站
https://www.showdoc.com.cn/item/index
ShowDoc
https://www.showdoc.com.cn/escook/3707490625528400
登录接口
将自己的html变成页面
http://free.3v.do
知识点:
html基础属性:
accesskey 规定激活元素的快捷键。
class
略
contenteditable 规定元素内容是否可编辑。
例: <div contenteditable></div>
contextmenu 规定元素的上下文菜单。上下文菜单在用户点击元素时显示。
data-* 用于存储页面或应用程序的私有定制数据。
dir 规定元素中内容的文本方向。
draggable 规定元素是否可拖动。
dropzone 规定在拖动被拖动数据时是否进行复制、移动或链接。
hidden 规定元素仍未或不再相关。
id 规定元素的唯一 id。
lang 规定元素内容的语言。
spellcheck 规定是否对元素进行拼写和语法检查。
style 规定元素的行内 CSS 样式。
tabindex 规定元素的 tab 键次序。
title 规定有关元素的额外信息。
translate 规定是否应该翻译元素内容。
<a>:
href 页面跳转地址
href="javascript:void(0)"
href="https://www.baidu.com/"
target="_blank"
在新标签页打开
href="#id/.class/标签名" 描点链接
//地址链接跳转
例: <a target="_blank" href="https://www.baidu.com/">跳转到百度</a>
<img>
src 例:
<img src="./xiaokeai.gif" target="_blank">
//图片
如果是小图片建议用base64 ,大图片用路径格式
<br>
换行
<div>
<h1>
标题标签
<span>
<label>
例:
<label for="checkInput"><input id="checkInput"></input></label>
注:如果label被点击,被label绑定的标签也会触发点击事件
<table>
<tr><th></th></tr> <tr><td></td></tr> <tr><td></td></tr>
属性
cellpadding="18px"
边缘和内容的距离
cellspacing="0"
单元格之间的距离
frame
规定哪个外框可见
rules
规定哪个内框可见
width
规定表格宽度
summary
表格摘要
例:
<table align="center" border="1px" cellspacing="5px" cellpadding="5px">
css属性:
border-collapse: collapse
//去除表格的边框重复
列表
<ul>
<ul><li></li></ul>
有序列表
<ol>
<ol><li></li></ol>
无序列表
<dl>
<dl> <dt></dt> <dd></dd> </dl>
具有层级关系
一个header其他全是body
<input>
属性:
type:
值:
text
文本框
button
按钮
hidden
隐藏的一个东东
checkbox
子主题
属性:
checked
//如果加上为默认选中
js属性:
element.checked = true
//设置此选择框为勾选
radio
子主题
password
密码输入框
submit
提交
file
文件上传
image
html5
search
新特性,专用来搜索
限制输入为邮箱类型
url
限制输入为url类型
date
限制输入为日期类型
time
限制输入为时间类型
month
限制输入为月类型
week
限制输入为周类型
number
限制输入为数字
去除number的上下箭头的方法:
input[type='number'] { -moz-appearance: textfield; } input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; }
tel
手机号码
color
生成一个颜色选择表单
placeholder
子主题
::placeholder给placeholder设置css属性
required
//非空约束
autofocus
//页面加载后获得focus,例如百度
autocomplete
//是否开启历史记录
multiple
//多选文件提交
//只对file有效
<select>
<select> <option>选项1</option> <option>选项2</option> </select>
//下拉菜单
<textarea>
属性
cols
列数
rows
行数
disabled
禁用文本区域
readonly
只读
(new)
autofocus
页面加载后文本区域自动获得焦点
form
规定区域所属的表单
maxlength
规定最大字符数
placeholder
required
规定文本区域是必填的
<b> 定义粗体文本。
<big> 定义大号字。
<em> 定义着重文字。
<i> 定义斜体字。
<small> 定义小号字。
<strong> 定义加重语气。
<sub> 定义下标字。
<sup> 定义上标字。
<ins> 定义插入字。
<del> 定义删除字。
<pre></pre>
通常用来显示代码
<button>
//按钮
去除button默认样式
HTML5 常用标签
<header>
头部标签
<nav>
导航标签
<article>
内容标签
<section>
定义文档区域
//通常用于划分区块,比较常用
<aside>
侧边栏标签
<footer>
尾部标签
<audio>
//音频
素材:
http://dl.stream.qqmusic.qq.com/C400001uWRMb3OPvEq.m4a?guid=4823774515&vkey=AC11B086F0F008C8B0AEC6E46319966AC50BB255FAC57E56BFCC8C82B2F79DF42AD3C0870D477B76E489F43EF629A14DB65463195C7C7D0A&uin=2214255336&fromtag=66
//为照顾兼容
属性:
src
src: url
loop
循环播放
controls
播放控件
autoplay
自动播放
<video>
//视频
属性:
src
//视频地址
例:
src:"./mp4/test.mp4"
autoplay
//是否自动播放
controls
//播放控件,比如暂停最大化等
loop
//是否循环播放
muted
//静音播放
poster
//加载时的等待画面图片
preload
//是否开启预加载
auto
//预加载
none
width
height
js:
可以使用element.play()来播放
//为了照顾兼容问题,可以使用这种方式:
<video width="320" height="240" controls> <source src="test.mp4" type="video/mp4"> <source src="test.ogg" type="video/ogg"> <source src="test.WebM" type="video/WebM"> 您的浏览器不支持视频,请先升级您的浏览器 </video>
防止盗链:
素材视频:
//战斗天使:
https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/9372971ba76adb3f5b9b9443beff465e.mp4
//赛博朋克2077:
class属性名规范:
https://gitee.com/mafqla/my-notes/blob/master/%E5%93%81%E4%BC%98%E8%B4%AD%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83.md
about 关于
account 账户
arrow 箭头图标
article 文章
aside 边栏
audio 音频
avatar 头像
bg,background 背景
bar 栏(工具类)
branding 品牌化
crumb,breadcrumbs 面包屑
btn,button 按钮
caption 标题,说明
category 分类
chart 图表
clearfix 清除浮动
close 关闭
col,column 列
comment 评论
community 社区
container 容器
content 内容
copyright 版权
current 当前态,选中态
default 默认
description 描述
details 细节
disabled 不可用
entry 文章,博文
error 错误
even 偶数,常用于多行列表或表格中
fail 失败(提示)
feature 专题
fewer 收起
field 用于表单的输入区域
figure 图
filter 筛选
first 第一个,常用于列表中
footer 页脚
forum 论坛
gallery 画廊
group 模块,清除浮动
header 页头
help 帮助
hide 隐藏
hightlight 高亮
home 主页
icon 图标
info,information 信息
last 最后一个,常用于列表中
links 链接
login 登录
logout 退出
logo 标志
main 主体
menu 菜单
meta 作者、更新时间等信息栏,一般位于标题之下
module 模块
more 更多(展开)
msg,message 消息
nav,navigation 导航
next 下一页
nub 小块
odd 奇数,常用于多行列表或表格中
off 鼠标离开
on 鼠标移过
output 输出
pagination 分页
pop,popup 弹窗
preview 预览
previous 上一页
primary 主要
progress 进度条
promotion 促销
rcommd,recommendations 推荐
reg,register 注册
save 保存
search 搜索
secondary 次要
section 区块
selected 已选
share 分享
show 显示
sidebar 边栏,侧栏
slide 幻灯片,图片切换
sort 排序
sub 次级的,子级的
submit 提交
subscribe 订阅
subtitle 副标题
success 成功(提示)
summary 摘要
tab 标签页
table 表格
txt,text 文本
thumbnail 缩略图
time 时间
tips 提示
title 标题
video 视频
wrap 容器,包,一般用于最外层
wrapper 容器,包,一般用于最外层
css
样式例:
把一个图片固定在右下角:
body { background-image: url("./xiaokeai.gif"); background-position: right bottom; background-repeat: no-repeat; background-attachment: fixed; }
弹出到最顶层的中间
.modal{ position: absolute; top: 50%; left: 50%; width: 400px; transform: translate(-50%,-50%); -radius: 5px; background: #fff; box-shadow: 2px 3px 20px rgba(0,0,0,0.2); z-index: 120; display: none; }
遮罩层:
.mask { height: 50%; width: 50%; transform: translate(-50%, -50%); } .mask :after { content: ""; position: fixed; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); z-index: 999; }
无法被复制:
-moz-user-select:none; /* Firefox私有属性 */ -webkit-user-select:none; /* WebKit内核私有属性 */ -ms-user-select:none; /* IE私有属性(IE10及以后) */ -khtml-user-select:none; /* Khtml内核私有属性 */ -o-user-select:none; /* Opera私有属性 */ user-select:none; /* CSS3属性 */
我的模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>小白</title> <!--引入Vue--> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> <!--引入Axios--> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <style> body { background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20170711/a1f636ac8ef943a2aacf00394ff538e9.gif"); background-position: right bottom; background-repeat: no-repeat; background-attachment: fixed; } </style> </head> <body> <h1>菜单</h1> <div id="app"> </div> <!--背景的几何效果--> <div style="z-index: 999"> <script src="https://cdn.bootcss.com/canvas-nest.js/1.0.1/canvas-nest.min.js"></script> <canvas id="c_n14" width="320" height="568" style="position: fixed; count:'1000'; top: 0px; left: 0px; z-index: -1; y: 5000;"></canvas> </div> </body> <script> </script> </html>
知识点:
选择器
标签选择器
p {} div{}
id选择器
#app{}
通配符选择器
* {}
类选择器
.div1{}
后代选择器
div span{}
子类选择器
div >span{}
相邻选择器
.eee + span {}
选择.eee的下一个span兄弟
//如果.eee的下一个元素节点不是span则不生效
.eee ~ span { ... }
//选择 .eee的同级的所有的后面的兄弟
属性选择器
例:
div[title]
div[title="eee"]
input[type^="t"]
//匹配type属性中值以t开头的标签
input[type$="t"]
//匹配type属性中值以t结尾的标签
input[type*="t"]
//匹配type属性中值包含t的标签
子主题
并集选择器
例:
div,p,span>a
伪类选择器
伪类选择器顺序:
link→visited→hover→active
:link
选择未访问的链接
:visited
选择访问过的链接
:hover
选择鼠标停留后的衔接
例:
a:hover {color: red;}
div:hover a { visibility: visity }
:active
点击后衔接的样式
:focus
选择获得了光标的样式
:contains(key)
匹配text内容选择器
子主题
:header
匹配标题
:not(标签名)
例:
:animated
匹配动画效果中的元素
:empty
匹配所有不含子元素和文本的空元素 //有空格都不算空元素
:first-child
//匹配此父元素的第一个子元素
:last-child
//匹配此父元素的最后一个子元素
:nth-child
li:nth-child(n)
//匹配父元素中的第n个子元素
在同一父元素下,所有子元素第n个
li:nth-child(even)
//匹配父元素的偶数元素
li:nth-child(odd)
//匹配父元素的奇数元素
:first-of-type
last-of-type
nth-of-type(n)
//在同一父元素下, 同类子元素第n个
例:
2n
偶数
2n+1
奇数
5n
5,10,15,20
n+5
(5,n)
5-n
[0,5)
:target
匹配被激活的描点
:first-letter
匹配元素的文字的首字符
:first-line
匹配元素的首行
:selection
匹配用户选中的内容
//只能设置字体颜色和背景颜色
伪元素选择器
::after
例:
::after { content: "", display: block; }
//注 ::后面不能有空格
//必须要有content属性
//
::before
如上
属性
width
设置元素的宽度
height
设置元素的高度
操作字体
关于字体: px是像素,em是当前字体的宽度
color
red/blue/white/black/yellow
font-size
字体大小
font-family
font-family: '微软雅黑'/'宋体'/'楷体'
字体:
黑体:
\9ED1\4F53
宋体
\5B8B\4F53
为了浏览器兼容,可以用这些Unicode编码格式来导入字体
微软雅黑
\5FAE\8F6F\96C5\9ED1
font-weight
bold
加粗
400
600
800
none
text-indent:10px
首行偏移10px
line-height
设置行高
//可以用来让字体垂直居中
font-style
italic
//斜体 倾斜
none
//无
font: font-style font-weight font-size/line-height font-family
//例:
font: 20px/28px
text:
text-align
text-align: center/left/right
text-decoration
给文本添加上划线下划线或者是删除线
none/underline/overline/line-through
text-indent
第一行的缩进
text-shadow:
h-shadow v-shadow blur color
属性:
h-shadow
水平阴影的位置
v-shadow
垂直阴影的位置
blur
模糊距离
color
阴影颜色
背景
background-color
背景颜色
backgroud-image
背景图片
值:
url("")
none
background-repeat
值:
repeat
平铺
no-repeat
不平铺
repeat-x
平铺x
repeat
平铺y
background-postion
值:
top
center
left
right
bottom
例子:
background-position: center top
background-position: 15px 95px
background-attachment
是否随着其余页面滚动
值:
scroll
滚动
fixed
背景固定
background-size
例:
background-size: 100% 100%
透明背景:
background: rgba(0,0,0,.5)
背景简写:
background: 背景颜色 背景图片地址 背景平铺 背景滚动 背景位置
例:
background: background-color background-image background-repeat background-position background-attachment
background: pink url("./img/001.png") no-repeat fixed center top;
border
border:
border: border-width || border-style || border-color
例:
border: 1px solid red
border-top:
类似上↑
border-left:
border-width
定义边框粗细
border-style
边框样式:
solid
实线
none
无边框
hidden
隐藏边框
dotted
点线
dashed
虚线
double
双线
groove
3D凹槽
ridge
菱形边框
inset
3D凹边
outset
3D凸边
border-color
边框颜色
属性:
transparent
//透明
border-radius
边框圆弧px
例:
border-radius-left: 16px/50%
border-radius: 5px 0 0 30%
border-collapse: collapse
将相邻table的表框合并
//只对表格有效
border-radius
倒圆角
例:
border-radius: 5px
border-radius: 50%
padding
padding: 5px
内边距5px
padding-top/left/right/bottom: 5px
给每条边单独设置
margin
margin: 5px
外边距5px
margin-top/left/right/bottom: 5px
margin: 0 auto 可以实现一个元素的居中,不过需要该元素有设置大小
overflow: hidden
解决塌陷,触发BFC
box-shadow
//盒子阴影
标签属性:
h-shadow
水平阴影的位置
v-shadow
垂直阴影的位置
blur
模糊距离
spread
阴影尺寸
color
阴影颜色
inset
外部阴影改为内部阴影
box-shadow: h-shadow v-shadow blur spread color inset;
例:
box-shadow: 0px 0px 18px 5px rgba(0,0,0,0.3)
float
float: left
属性
left/right
清除浮动:
overflow: hidden;
溢出的块会显示不出来
<div style="clear: both"></div>
.clearfix:after { content: ""; height: 0; display: block; clear: both; visibility: hidden; } .clearfix { *zoom: 1; }
.clearfix:after , .clearfix:before { display: table; content: ""; } .clearfix:after { clear: both; } .clearfix { *zoom: 1; }
双伪元素清除浮动
定位:
position
属性
static
静态定位
relative
相对定位
相对于自身定位
absolute
绝对定位
fixed
固定定位
sticky
粘性定位
//必须要加一个属性比如 top: 0 否则无法生效
z-index
设置重叠优先级
//注:z-index对默认定位static不起作用
//注2: 父子元素之间 z-index 无效,永远是子元素在父元素前
opacity
设置透明度
例
opacity:0.5
visibility
设置隐藏
类似displa:none
属性:
inherit
默认,继承父对象
visible
不隐藏
hidden
隐藏
collapse
隐藏表格的行和列等 , 类似hidden
overflow
属性
visible
默认,不删除溢出内容也不做任何处理
auto
溢出时添加滚动条
hidden
不显示溢出内容
scroll
总是显示滚动条
cursor
属性:
default
默认 箭头形状
pointer
手形
move
拖动形
text
文本形
wait
等待,转圈形
not-allowed
禁止图标
help
问号
crosshair
十字光标
例:
cursor: pointer
contenteditable="true|false"
将内容设置为可编辑
仅限于textarea和input
outline
属性
none
取消轮廓线
outline-color
outline-style
边框样式:
solid
实线
none
无边框
hidden
隐藏边框
dotted
点线
dashed
虚线
double
双线
groove
3D凹槽
ridge
菱形边框
inset
3D凹边
outset
3D凸边
outline-width
outline: color style width
resize
属性
none
防止拖拽
比如取消textarea右下角的东西
vertical-align
//垂直居中
属性:
middle
垂直居中
top
bottom
baseline
只对行内块元素或者行内元素有效
white-space
属性
nowrap
强制在一行内显示
如果设置了这个,就不会自动换行了,就会全挤到同一行
normal
默认,自动换行
text-overflow
属性
ellipsis
多余部分转为"..."
//只对行内块或者块元素有效
多余部分用...代替的实现:
white-space: nowrap;//在一行显示 overflow: hidden;//多余部分隐藏 text-overflow: ellipsis;//将多余部分转为"..."
第三行用...代替 :
.overflowellipsis { white-space: normal; word-wrap:break-word; display: -webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; text-overflow: ellipsis; overflow: hidden }
word-wrap:break-word;
//自动换行
css初始化
为照顾不同浏览器差异,进行初始化:
例:
* { margin:0; padding:0; } em, i { font-style:normal; } li { list-style:none; } img { border:0; vertical-align:middle; } button{ cursor:pointer } a { color:#666; text-decoration:none; } a:hover { color:#c81623; } button, input { font-family: Microsoft YaHei,Heiti SC,tahoma,arial,Hiragino Sans GB,"\5B8B\4F53",sans-serif; } body { -webkit-font-smoothing:antialiased; background-color:#fff; font:12px/1.5 Microsoft YaHei,Heiti SC,tahoma,arial,Hiragino Sans GB, "\5B8B\4F53",sans-serif; color:#666 } .hide, .none { display:none; } .clearfix { *zoom: 1 } .clearfix:after { visibility:hidden; clear:both; display:block; content:"."; height:0 }
//初始化的内容: 1、消除默认内外边距 2、清楚按钮,<input>,<a>等的hover等效果 3、设定默认字体的样式 4、设置图片等的垂直居中 5、取消li的默认样式 6、清除浮动的对象 比如.clearfix,以方便随时调用
box-sizing
例:
box-sizing: border-box
属性:
content-box
//默认,所有fiv默认的方式
border-box
//设置了此属性之后,padding border将不会再撑大盒子
//盒子模型
filter
属性
blur
//设置清晰度
例:
filter: blur(5px)//
transition
例:
transition: 要过渡的属性 花费时间 运动曲线 开始和结束延迟
transition: height 1s ease 0.3s
//要过渡的属性为height
//1秒内过渡完成
//逐渐变慢
//开始和结束延迟为0.3秒
transition:height 1s, width 1s
transition:all 1s
过渡
linear
匀速
ease
逐渐减速
ease-in
加速
ease-out
减速
ease-in-out
先加速再减速
calc
例:
width: calc(100% - 10px)
//比父小10像素
支持 + - * /等操作
计算
transform:
rotate
旋转
例:
transform: rotate(45deg);
旋转45度的意思
设置旋转中心点:
transform-origin: x y z;
子主题
skew
扭曲
scale
缩放
transform scale(缩放数值)
例:
transform:scale(2)
放大到两倍
transform scale(0.5)
缩小到一半
transform scale(1, 2)
x不变,y变大两倍
//不会影响其他盒子
translate
移动 偏移 位移
例:
transform: translate(-50%,-50%);
<div class="box"></div> <style> .box { height: 150px; width: 150px; background-color: pink; transition: all 1s; } .box:hover { transform: translate(50%,50%) rotate(36000deg) scale(5); } </style>
//注 translate的百分比偏移是相对自身的大小来偏移的,不同于position是相对于父元素的大小
2D转换
注:transform对 行内元素inline元素无效
综合例:
transform: translate(50%,50%) rotate(36000deg) scale(5);
3D
perspective
//放在父盒子中
透视
//定义一个虚拟的“眼睛”作为观察者
transform3d(x,yz)
//注: x z可以为% z不能,建议z为px
旋转
rotateX/Y/Z: (deg)
以 X/Y/Z轴旋转 多少度
rotate3d(x, y, z, deg)
xyz为向量 deg为旋转多少度
设置旋转中心点:
transform-origin: x y z;
transform-style:
控制子元素是否开启三维立体环境
值:
flat
默认
不开启3d立体空间
preserve-3d
开启立体空间
动画
用例:
定义
@keyframes move { /* @keyframes 自定义的动画名 */ 0% { transform: translate(0,0) } 100% { transform: translate(1000,0) } }
使用
div.box { width: 100px; height: 100px; background-color: pink; animation-name: animate1;/* 动画名 */ animation-duration: 2s; /*花费时间*/ }
animation
@keyframes { 0%{ ... } 100% { ... } }
属性:
animation
动画的简写 就和border-color 等和border 的关系一样
简写格式:
子主题
例:
/*animation: 动画名称 持续时间 运动曲线 开始时间 播放次数 是否反方向 动画结束的起始状态*/ animation: animate2 2s linear 0s infinite normal forwards;
animation-name
使用哪个动画 //必须
animation-duration
规定动画完成一个周期所需要花费的时间
默认0秒
animation-timing-function
动画的速度曲线
ease
默认
先快再慢
linear
线性
ease-in
逐渐加速
ease-out
逐渐减速
steps()
指定步长 一跳一跳的效果
例:
steps(5)
//动画会分为五个步长一步一步的逐渐显示出来
animation-delay
动画的开始延迟
animation-iteration-count
动画的循环次数
默认值为1 如果设置为infinite 则为无限循环
animation-direction
规定动画是否在下一周期逆向播放
默认"normal"
alternate为逆播放
动画走回来而不是跳回来:
alternate
animation-play-state
规定动画的运行或暂停
默认 running 运行
pause停止
animation-fill-mode
规定动画结束后是否回到起始位置
默认保持 forwards
backwards 为动画结束回到起始位置
qwq
css样式引入方式
<link rel="stylesheet" href="css/css.css">
Emmet
快速生成html标签:
例:
div*9
ul>li
div+span
div#10
div#$*10
div$*10
例: div.header>ul>li*4>a.nav
快速生成css
快速格式化代码
行内元素和块元素
行内元素:
不能设置width和height,高度取决于内容的高度
行内转块
display:block
块转行内
display:inline
转为行内块元素
display:inline-block
三大特性
覆盖
继承
优先级
!important >
行内style >
id选择器 >
对象选择器 >
标签选择器 >
通配符选择器
字体图标
下载:
iconmoon.io
https://icomoon.io/app/#/select
https://www.iconfont.cn/
来自阿里巴巴
引入:
将fonts文件夹贴贴到html目录下
然后再复制style.css文件里的css贴贴到html
引入字体
例:
span { font-family: 'icomoon' }
追加:
使用:
打开iconmmon文件夹
打开demo.html
复制其中的框框
代码例:
例1:
css:
<style type="text/css"> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
html:
<svg class="icon" aria-hidden="true"> <use xlink:href="#图标名"></use> </svg>
例2
<style type="text/css"> /*读取icomoon的文件信息*/ @font-face { font-family: 'icomoon'; src: url('fonts/icomoon.eot?wm1zex'); src: url('fonts/icomoon.eot?wm1zex#iefix') format('embedded-opentype'), url('fonts/icomoon.ttf?wm1zex') format('truetype'), url('fonts/icomoon.woff?wm1zex') format('woff'), url('fonts/icomoon.svg?wm1zex#icomoon') format('svg'); font-weight: normal; font-style: normal; font-display: block; } icon { //使用iconmon的字体 font-family: 'icomoon'; } .icon1:after { content: '\eb24'; } </style> <icon class="icon1"></icon>
css三角
例:
div { height: 0; width: 0; line-height: 0; font-size:0pt; color:#303030;"> border: 100px solid transparent; border-top: 100px solid red; }
鼠标样式:
子主题
效果储存
右下角2D小人效果
<scri type="text/javascri" charset="utf-8" async="" src="https://cdn.jsdelivr.net/npm/live2d-widget@3.0.4/lib/L2Dwidget.min.js" defer> </scri> <div id="page_end_html"> <!-- 右下角live2d效果 --> <scri type="text/javascri"> setTimeout(() => { L2Dwidget.init({ "model": { "scale": 0.5 }, "display": { "position": "right", "width": 180, "height": 260, "hOffset": 0, "vOffset": -20 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "yDefault": 0.7, "yOnHover": 0.2 } }); },1000) </scri> </div>
页面背景的几何效果:
<scri src="https://cdn.bootcss.com/canvas-nest.js/1.0.1/canvas-nest.min.js"></scri> <canvas id="c_n14" width="320" height="568" style="position: fixed; count:'1000'; top: 0px; left: 0px; z-index: -1; y: 5000;"></canvas>
js文件样式:
!function(){function n(n,e,t){return n.getAttribute(e)||t}function e(n){return document.getElementsByTagName(n)}function t(){var t=e("script"),o=t.length,i=t[o-1];return{l:o,z:n(i,"zIndex",-1),o:n(i,"y",.5),c:n(i,"color","0,0,0") ,n:n(i,"count",500)}} function o(){a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}function i(){r.clearRect(0,0,a,c);var n,e,t,o,m,l;s.forEach(function(i,x){for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e<u.length;e++)n=u[e],null!==n.x&&null!==n.y&&(o=i.x-n.x,m=i.y-n.y,l=o*o+m*m,l<n.max&&(n===y&&l>=n.max/2&&(i.x-=.03*o,i.y-=.03*m),t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke()))}),x(i)}var a,c,u,m=document.createElement("canvas"),d=t(),l="c_n"+d.l,r=m.getContext("2d"),x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(n){window.setTimeout(n,1e3/45)},w=Math.random,y={x:null,y:null,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";y:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o,window.onmousemove=function(n){n=n||window.event,y.x=n.clientX,y.y=n.clientY},window.onmouseout=function(){y.x=null,y.y=null};for(var s=[],f=0;d.n>f;f++){var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3})}u=s.concat([y]),setTimeout(function(){i()},100)}();
页面背景的雪花特效:
页面背景的点击浮现文字效果:
放烟花效果:
https://blog.csdn.net/weixin_52691965/article/details/122633835
flex 弹性盒子
display: flex
父盒子属性:
display: flex
flex-direction
设置子元素的主轴
row
默认值
从左到右
row-reverse
懂的都懂
column
从上到下
column-reverse
懂都懂+1
flex-wrap
设置子元素是否默认换行
nowrap
默认值,如果空间不够时也不换行,会将内容挤在一行
wrap
换行
wrap-reverse
换行并翻转
flex-flow
相当于flex-direction + flex-wrap的简写
例:
flex-flow: row wrap
相当于:
flex-direction: row ; flex-wrap: wrap
justify-content:
设置子元素的主轴排列方式
flex-start
默认值
从头部开始
flex-end
center
让子盒子们居中对齐
space-around
例:
平分剩余空间
space-between;
例:
先贴两边再平分剩余空间
align-items:
设置侧轴上的子元素排列方式(单行)
flex-start
默认 从上到下
flex-end
ceter
垂直居中
//注: 对多行无效
stretch
拉伸
//注: 只适合子盒子为单行/单列的情况下使用
align-content:
设置侧轴上的子元素排列方式(多行)
flex-start
从头到尾排列
flex-end
center
居中
space-around
平分剩余空间
space-between
先分布两头再平分剩余空间
stretch
拉伸,子项元素高度平分父元素高度
align-content适用于多行的情况下, 且单行情况下无效
子盒子中的属性:
属性:
flex
flex子项目占的份数,定义 子项目分配剩余空间 ,用flex来表示占多少份数
值
number类型
例:
flex: 1
大概就是以1权重均分剩下的空间
会拉伸元素
align-self
控制子项自己在侧轴的排序方式
flex-start
默认 从上到下
flex-end
ceter
垂直居中
stretch
拉伸
order
定义项目的排列顺序
值为number型
不能为小数,可以为负数
数值越小排列越靠前
默认值0
设定为flex后,它子元素的flout clear vertical-align都将失效
具体案例 的测试和练习 移至test 137
css优化必须做到:
尽量减少HTTP请求的个数
CSS和JS放到单独的文件中
页面顶部引入CSS
响应式网页布局
要求:
不能固定宽度,必须使用流式布局
文字和图片大小随着容器的大小而改变
根据不同设备,显示不同效果
less
注释:
//
/* */
计算:
例:
width: 100 + 50px
height: 5 * 99px
//注: 如果是除法,算式必须被括号包裹 比如 (100 / 2px)
或除号前加点:
100 ./2 px
嵌套:
例:
ul { height: 90px; li { height: 100%; } }
span { background-color:pink; &:hover {//相当于span:hover { ... } background-color:skyblue; } }
变量名
例:
自定义设置变量名
@tran: translate(-50%, -50); .img { transform: @tran; }
导入less
less 导入 less:
例:
@import './less1.less'
//如果引入的是less ,可以省略 .less
例:
@import './less2'
导出less
JavaScript
js基础
注释
输入输出
prompt
例:
var s = prompt('请输入您的年龄')
输入
alert('')
输出
例:
alert('666')
console
例
console.log('hello world')
//输出到控制台日志
打印到控制台日志
数据类型
Number
默认0
Number最大值:
Number.MAX_VALUE
Number最小值
Number.MIN_VALUE
三个特殊数值:
Infinity
//无穷大。大于任何数
-Infinity
//无穷小,小于任何数
NaN
//代表一个非数值
isNaN()
//此函数判断是否是NaN
转换为Number的办法:
parseInt
parseFloat
方法:
.toFixed(n)
保留n位小数
例:
alert(15.12345413.toFiexed(2)); //值为 15.12
String
默认""
强转String的办法:
String(19)//值为"19"
(num=19).toString()
Boolean
默认false
强转为Boolean:
Boolean();
Undefined
默认undefined
//未定义类型
Null
默认null
object
操作:
可以通过typeof来获取数据类型
运算符
递增递减运算符与表达式:
子主题
比较运算符
==
===
>=,<=,>,<,!=,!==
逻辑运算符
&&
&
||
|
!
赋值运算符
=
+=
-=
*=
/=
%=
运算符优先级
流程控制
分支控制
if
三元表达式
switch
循环
for
while
do...while
命名规范:
驼峰或_命名
变量名一般用名词
函数名一般用动词
函数
相关事项
如果没有return,则默认返回undefined
如果返回值有多个值,永远只返回最后一个,比如return 1,2;的值是2
遗漏的参数都会用undefined 代替,多余的参数被将忽略
arguments
作用域
局部变量
var a = 5;
全局变量
例:
n=10
块变量
let n = 1;
相关事项:
函数的形式参数虽然没有var但是也是局部变量
函数内不要使用n = 10 这种类型的,因为是全局变量
作用域链
//就近原则
预解析
先进行预解析,在进行逐行执行代码
数组
伪数组
伪数组没有数组的一些方法比如push( )等
对象
创建对象:
方法一例:
var student1 = { name : 'xiaobai,, age : 18 }
方法二例:
var student1 = new Object(); student1.name = 'xiaobai'; student1.age = 19; student1.fun1 = function () { alert('hello'); }
方法三例:
function student(name , age) { this.name = name; this.age = age; }//先创造构造方法 类似 类 //再用构造方法创建对象 var stu1 = new student('小白', 18);
构造方法
function Studnet(name, age) { this.name = name; this.age = age; }
调用对象的属性
student1['name'];
student.age;
student.fun1();
遍历对象
例:
var obj1 = { name: 'xiaobai', age: 18 } for (var n in obj1) { console.log(n + ':' + obj1[n]); }
常用函数
parseInt()
转化为int类型的数
eval()
将字符串转化为代码执行
例:
eval("alert('666666')")
常用内置对象
Math
Math.PI
获取π
Math.E
Math.abs(num)
绝对值
Math.max(num1,num2...)
最大值
Math.floor()
向下取整
Math.ceil()
向上取整
Math.round()
四舍五入
Math.random()
随机数
获取一个范围为n1到n2的随机数的例字:
Math.floor(Math.random() * (n2 - n1 + 1) + n1);
详情地址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math
Date
创建当前日期的对象
new Date
获取Date对象的属性:
getFullYear()
获取年
getMonth()
获取月
[0-11]
getDate()
获取当天日期
getDay()
获取星期几
getHours()
获取小时
getMinutes()
获取当前分钟
getSeconds()
获取当前秒钟
例:
var today = new Date(); var n = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六']; alert('今天是' + today.getFullYear() + '年' + (today.getMonth() + 1) + '月' + today.getDate() + '日' + today.getHours() + ':' + today.getMinutes() + ':' + today.getSeconds() + ' ' + n[today.getDay()]);
注:
时间是从1970年1月1日开始过了多少的
获取当前时间的毫秒数:
+new Date()
Date.now()
(new Date).valueOf()
获取年月日:
(new Date().toLocaleDateString()
//获取年月日 例: 2022/4/19
(new Date()).toLocaleString()
//获取详细时间 例: 2022/4/19 21:02:35
(new Date()).toLocaleTimeString()
//获取时间 例: 21:02:25
.toLocaleDateString()
获取
Array
创建真数组:
new Array()
//创建空数组
new Array(2)
//创建容器大小为2的数组
arr[i]
取出数组的第i个数字,如果不存在为undifnd
判断一个var数据是否是数组
Array.isArray(传入的var)
←方式一的例
如果为数组值为true 否则 false
var arr[], alert(arr instanceof Array)
←方式一的例
.push(var n1...)
数组末尾插入元素
返回值为新的长度
.unshift(var n1...)
//类似上
数组开头插入元素
返回值为新的数组的长度
.filter(fn)
例:
选择数组中的所有 >5 的数
<script> let arr = [1, 3, 5, 7, 9, 10]; console.log(arr.filter((n)=>n>5)); </script>
//返回新数组
//不会对原数组产生任何
.pop()
删除最后一个元素
返回值为删除的元素的值
.shift()
//类似上
删除第一个元素
返回值为删除的值
reverse()
翻转数组
返回值为新的数组,原数组不会改变
.sort()
排序
例:
var arr = [10,24,50,25,1,0]; alert(arr.sort());
返回值为新的数组,原数组不会改变
//默认按照ASCII码排序的
使用构造器例:
var arr = [10,24,50,25,1,0]; alert(arr.sort(function (a, b) { return b - a; }));
.indexOf(key,n)
//从第n个索引开始,查找数组中的第一个key所在位置 ,如果不存在返回-1
//注: 如果没有n ,默认从数组开头开始查找
.lastIndexOf(key,n)
//查找数组中的最后一个key所在位置,如果不存在返回-1
数组转字符串:
.toString()
例:
var arr = [1,2,3,4,5,7,9]; alert(arr.toString()); //打印的值为: '1,2,3,4,5,7,9'
.join()
例:
var arr = [1,2,3] alert(arr.join('---')) //值为: 1---2---3
.concat(arr...)
//连接多个数组
返回值为新数组,不影响原数组
例:
var arr1 = [1,2,4]; var arr2 = [3,4,7]; alert([].concat(arr1,arr2)); //打印的值为: 1,2,4,3,4,7
.slice(begin,end)
作用是截取数组
返回值为新数组
例:
var arr = [0,1,2,3,4,5,6,7,8,9]; alert(arr.slice(2,4)); //打印的值为: 2,3
.splice(begin,删除数量)
从索引begin开始删除若干个元素
返回值为删除的值的数组
例:
var arr = [0,1,2,3,4,5,6,7,8,9]; alert(arr.splice(3,5)); //打印的值为: 3,4,5,6,7 alert(arr); //打印的值为: 0,1,2,8,9
.forEach(function(item,index){...})
对数组进行遍历操作
.some(function(item,index){...})
类似上,但是return true时函数会退出
.every(n=>n.state==true)
只有数组中所有元素都满足true才返回true否则false
.reduce
例:
this.price=this.goodsList.filter(goods=>goods.goods_state).reduce((result,goods)=>result+=goods.goods_count*goods.goods_price,0);
String
.charAt(index)
//返回index索引的字符
str[index]
//如上
.charCodeAt(index)
//返回index索引的字符ASCII码
.concat(str...)
拼接多个字符串
返回值为新字符串
例
alert('ewaewaw'.concat("ewaeeaw","eaeaea","aaaaaaa")); //打印结果为: ewaewawewaeeaweaeaeaaaaaaaa
.substr(start,length)
从start开始截取length个字符
返回值为截取的字符
.slice(satrt,end)
从start截取到end //类似python的切点
返回值为截取的字符
//接受负值 ,负值即为从倒数第一位开始计算
.substring(start,end)
从start截取到end
返回值为截取的字符
//不接受负值
.replace(str1,str2)
把字符中的str1替换为str2
返回值为替换后的新字符串
//注: 只替换第一个
.split(str)
分割字符串
返回值为string[]
例:
"小明,小红,小刚".split(',') //值为: ['小明','小红','小刚']
.toUpperCase()
.toLowerCase()
Json
Json.stringify(obj)
//把一个对象转化为string格式
Json.parse(json)
//把string转化为原本的形式
函数式编程:
document.onclick = ()=>alert(111);
instanceof
例:
obj instanceof Obj //判断obj是否是Obj这个类
判断是否属于某个类
${}
模板替换
例:
console.log(`name=#{name},age=#{age}`) 相当于↓
console.log("name =" + name +" ,age =" + age);
对于原生html 只对 js有效,如果加了vue,对{{ }} v-等指令内也可以使用
例: :style="`color: rgb(${r},${g},${(b)})`
解构赋值:
例:
const {name: n} = {name:"xiaobai", age=18} //这一句相当于: const n = {name:"xiaobai", age=18}.name console.log(n);
关于浏览器兼容:
debugger
调试,断电
DOM
DOM树
文档
document
节点
node
元素
属性
文本
//element
获取Element对象:
根据id获取
var d = document.getElementById('id');
//id为大小写敏感,即带小写不能写错
根据标签名获取
var d = document.getElementsByTagName('标签名')
//返回值为element[]
根据类名获取
var d = document.getElmenstByClassName('类名')
//返回值为element[]
选择器获取
var d = document.querySelector('选择器表达式')
var d = document.querySelectorAll('选择器表达式')
//返回值为element[]
使用例:
var checkboxs = document.querySelectorAll("div.box > input[type = 'checkbox']")
获取HTML
document.documentElement;
获取Body
document.body;
事件
鼠标事件
t.onclick
鼠标点击左键触发
.onmouseover
鼠标经过触发
.onmouseout
鼠标离开触发
.onmouseenter
.onmouseleave
.onfocus
获得鼠标焦点时触发
.onblur
失去鼠标焦点时触发
.onmousemove
鼠标移动触发
.onmousedown
鼠标按下触发
.onmouseup
鼠标弹起触发
键盘事件
.onkeypress
.onkeydown
.onkeyup
其他事件
onscroll
滚动事件
onchange
绑定了此事件的元素,会在内容发生改变时触发
比如单选框复选框选中取消的时候
比如input 中输入了什么
事件绑定例:
var d = document.querySelector('div button'); d.onclick = alert();//鼠标点击弹出窗口
伪类选择器:伪类选择器
修改元素文本内容
.innerText
例:
.innerText = '内容'
不识别html标签,去除开头和结尾的空格 以及 结尾的换行
.innerHTML
例:
.innerHTML = '内容' + '<br>'
识别html标签,并且保留空格和换行
获取元素属性
element.属性
//只对内置属性有效,对自定义属性无效
element['属性名']
element.getAttribute('属性名');
修改元素属性
例:
// a.src = 'https:www.com'
// button.value = ' '
// src.href = '../src/.jpg'
element.setAttribute('属性名',值)
element.dataset.属性名
element.dataset['属性名']
//自定义属性规范建议属性名为 'data-属性名'的格式
移除元素属性
element.removeAttribute("属性名")
修改和获取表单元素的值
例:
input.value = ' '
input.onclick.disabled = true
修改元素CSS样式
修改 或 读取 行内CSS样式:
element.style.(这里是css的样式名)
例:
element.style.color = 'pink'; //改变element的color样式为红色
//因为是行内样式,权重高,所以会覆盖别的样式
注: 只能获取行内样式
修改 或 读取 CSS的class样式:
element.className
例:
element.className = 'class2'
//将元素的对象变为class2
element.classList[]
使元素获得焦点:
element.focus();
获得元素的标签名
element.localName
选中元素:
dom.select()
获取/设置光标位置:
dom.selectionStart
例:
console.log(textarea1.selectionStart)//打印textarea1目前光标最左边的位置
dom.selectionStart = 0
//将左光标移动到第一个位置
设置/获取 左光标的位置
例:
dom.selectionEnd
设置/获取 右光标的位置
dom.setSelectionRange()
移动光标例:
$("textarea"[0]).focus();//先让textarea获取光标 $("textarea")[0].setSelectionRange(5,5)//然后移动光标到5这个位置
选中光标例:
$(".box")[].setSelectionRange(0,10)//选中box这个元素从0到10的内容
offset
element.offsetParent
返回作为该元素的带有定位的父级元素,如果父级元素没有定位则返回body
element.offsetWidth
返回自身的宽度
element.offsetHeight
返回自身的高度
注: 包括padding,border,内容的高度
返回的值不带单位
只读
element.offsetTop
元素相对带有定位的父元素上的偏移量
element.offsetLeft
元素相对带有定位的父元素左的偏移量
client
element.clientTop
返回上边框(border)的高度
element.clientLeft
返回左边框的宽度
element.clientWidth
不包括border
包括padding,返回的数值不带单位
element.clientHeight
scroll
element.scrollTop
滚动条滚动的距离
不包括边框
element.scrollLeft
element.scrollWidth
内容的总长度
element.scrollHeight
内容的总高度
element.scrollBy(x,y)
滚动 x,y 的相对距离
element.scrollTo(x, y)
滚动到x, y 的绝对坐标
页面的滚动距离:
window.pageXOffset
window.pageYOffset
Node
元素是节点,但是节点不一定是元素
element.parendNode
获取父节点
//例:
document.querySelector('.box').parentNode;
.childNodes
返回某节点的所有子节点[]
.children
类似上但是不返回text
返回值为element []
.nodeType
获取node类型
1为元素类型
3为文本类型
.firstChild
返回第一个节点
.lastChild
返回最后一个节点
.nextSibling
值为下一个节点
.nextElementSibling
值为下一个元素节点
.previousSibling
值为上一个节点
.previousElementSibling
值为上一个元素节点
如果有兼容性问题可以自己封装一个:
function getPreElementSibling(element) { var n = element; while ((n = n.previousSibling).nodeType==3); return n; }
document.createElement('tagName')
创建节点
document.writer()
略
添加节点
node.appendChild(child)
添加节点child
返回值为: 添加的这个child
element.insertBefore(添加的元素,被添加的元素所在的元素)
例:
ul.insertBefore(li,lis[0])
删除节点
node.removeChild(child);
克隆节点
node.cloneNode();
//只克隆标签
node.cloneNode(true)
//克隆节点且包括其所有子节点
例:
node.parentNode.appendChild(node.cloneNode(true)); //将此节点拷贝到结尾一份
注册监听器:
element.attachEvent('onclick',function(){...});
给onclick绑定触发函数function
element.addEventListener('click',function(){...})
//给element绑定触发了click时间之后执行的函数
和传统的element.onclick = function() {...}的等相比,他可以给同一种触发事件注册多个事件
IE 9 之后才支持
删除监听器
element.datachEvent('事件名',删除的函数名)
element.removeEvenListener('事件名',删除的函数名)
dom事件流
捕获阶段
自上而下传播
冒泡阶段
自下而上传播
事件对象
例:
document.onclick = function(event) { console.log(event); }
事件对象的属性和方法:
event.target
触发事件的对象
//标准
//谁触发,就是谁
event.srcElement
触发事件的对象
//非标准 ie6-8
this
谁绑定,就是谁
event.currentTarget
可以理解为this
谁绑定,就是谁
event.type
返回触发事件的类型
//比如onclick,onmousemove
阻止冒泡
event.cancelBubble
ie6-8
用法: event.cancelBubble = true
event.stopPropagation()
//推荐使用
阻止默认事件
event.returnValue
event.preventDefault()
//标准,建议使用这个
//比如<a>的衔接跳转,比如网页中右键弹出的右键菜单,点击checkbox之后的勾选,都属于默认事件
子主题
鼠标事件对象的属性
event.clientX
//触发事件时的X坐标
event.pageX
//触发事件时的距离网页最顶端的X坐标
event.screenX
//触发事件时的鼠标位置距离电脑屏幕的X坐标
键盘事件对象
keypress
键盘按下时触发
//注: 键盘按下后会快速的频繁触发
//无法识别功能键比如↑←↓→ enter shift等
event.keyCode
//keypress的keyCode获取的字母区分大小写
keydown
//keydown和keyup的keyCode获取的字母视为小写
//执行顺序为 keydown > keypress
keyup
//键盘弹起时触发
键盘事件对象的属性:
其他事件对象
onhashchange
//当 location 的 hash 发生变化时 触发的事件
例:
created () { let that = this; window.onhashchange = function () { console.log(location.hash) switch (location.hash) { case '#/home': that.myCom = 'Home' break; case '#/movies': that.myCom = 'Movies' break; case '#/about': that.myCom = 'About' break; } } },
控制台打印dom的方法
console.dir(d)
dom复制:
document.execCommand("copy");
//需要配合dom.select()一起使用
例:
document.querySelector("span").select(); document.execCommand("copy"); //然后就复制成功了
相关操作:
例一: 禁止在网页中右键
document.documentElement.addEventListener('contextmenu',function (event) { event.preventDefault(); });
// 为右键添加自定义事件,可以禁用 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); });
例二: 禁止选中文字
document.documentElement.addEventListener('selectstart',function (event) { event.preventDefault(); })
禁止鼠标右键:οncοntextmenu="return false";
禁止选择:onselectstart="return false";
禁止拖放:οndragstart="return false";
禁止拷贝:οncοpy=document.selection.empty() 。
禁止复制:oncopy = "return false";
禁止保存:<noscript><iframe src="*.htm"></iframe></noscript>,放在head里面。
禁止粘贴:<input type=text οnpaste="return false">
禁止剪贴:oncut = "return false";
关闭输入法:<input style="ime-mode:disabled">
BOM
窗口加载事件
window.onload = function() { ... }
//等窗口加载完后才会执行函数内的代码
window.addEventListener('load',function () { ... })
//等窗口加载完后才会执行函数内的代码
//可以多个
document.addEventListener('DOMContentLoaded', function( ) { ... })
//和以上两个相比,他不会等待图片,样式等的加载
页面展示时间
window.pageshow = function(){...}
调整窗口大小事件
window.onresize = function() {...}
窗口被调整的时候会触发
window.addEventListener('resize', function ( ) { ... })
window.innerWidth
当前屏幕的宽度
window.devicePixelRatio
窗口像素比的值
电脑为1
手机端因不同机型而异
比如安卓为2
定时器
setTimeout(函数,毫秒数)
例:
timer1 = setTimeout(fun(){},1000)
setInterval(函数,毫秒数)
clearTimeout(计时器名)
//清除定时
clearInterval(计时器名)
location对象:
URL(了解即可)
统一资源定位符
一般格式:
protocol://host[:port]/path/[?query]#fragment
解释:
protocol
通信协议,常用的http,https,ftp,maito等
host
主机域名
比如 www.qq.com,www.taobao.com,都属于主机域名
port
端口号
可忽略
path
路径
由多个/符号隔开的字符串,一般用来表示主机上的一个目录或者文件地址
query
参数,以键值对的形式,通过&符号分割
例:name=xiaobai&age=18
fragment
描点链接
例:
http://www.xiaobai.com/index.html?name=xiaobai&age=18#index
location.href
获取或者设置网页的路径
//可以用来改变此路径以跳转到新的衔接
值为当前网页的地址
location.host
返回主机域名
例: www.baidu.com
location.port
返回端口号
location.pathname
返回路径
//例如: /video/BV1Sy4y1C7ha
location.search
返回参数
比如: ?name=xiaobai
location.hash
返回最后片段
比如: #link
location.assign(href)
重定向页面
跟href一样,可以跳转页面
无返回值
location.replace()
替换当前页面,不记录历史,不能后退页面
location.reload()
重新加载页面,相当于网页刷新,等价于F5
可以加参数,类型boolean,默认为false,如果加入true,则为强转刷新,等价于ctrl+ F5
navigator对象:
navigator.userAgent
//客户端的user agent信息
history对象:
history.back()
后退到上一个页面
history.forward()
前进到前一个页面
history.go(num)
前进或者后退
比如go(1)就是前进,go(-2)是后退到前两个页面
sessionStorage
会话存储
用来存储临时信息
相关:
只有当前页面可以使用
生命周期持续到浏览器被关闭
以键值对的形式存储的
sessionStorage.setItem(key,value)
sessionStorage.getItem(key)
sessionStorage.removeItem(key)
sessionStorage.clear()
localStorage
本地存储
用来存储需要长期保存的信息
//浏览器的所有页面都能共同使用
//永久保存
localStorage.setItem(key,value)
localStorage.getItem(key)
localStorage.removeItem(key)
localStorage.clear()
子主题
MDN
查阅文档:
https://developer.mozilla.org/zh-CN/
JQuery
关于JQuery
JQuery官网
https://jquery.com/
JQuery引入:
JQuery 3.6.0的 JS
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
导入jQuery
$等价于jQuery
比如$.hider()相当于jQuery.hide();
等页面加载后执行的函数
$(document).ready(function(){...})
$(function(){...})
jQuery根据选择器获取对象
$('div')
类似document.querySelector('div');
把dom对象转成jQuery对象:
$(dom)
jQuery转成dom对象:
$('')[0];
隐式迭代
jquery会自行给所有匹配到的元素进行循环遍历,执行相应的方法,因而不用再手动循环,简化了我们的操作
jQuery选择器
:first
获取第一个li元素
例:
$('li: first')
:last
获取最后一个元素
例:
$('li: last')
:eq(index)
获取第index个元素
例:
$('li: eq(2)')
获取第二个元素
:odd
获取索引号为奇数的元素
:even
获取索引号为偶数的元素
:checked
选择所有cheked值为ture的jq元素
jQuery对象常用筛选方法
.parent('选择器')
得到该jquery对象的父级
例:
$('li').parent();
.parents('选择器')
得到该jq元素的所有祖先
.childer(选择器)
得到该jquery对象的子级
例:
$('ul').children('li');
相当于ul > li
.find(选择器)
从该jQuery对象中查找符合选择器条件的元素
例:
$('ul').find('li')
相当于 ul li
.eq(index)
从该jQuery对象中根据index获取子对象
例
$(" ").eq(2)
//返回第三个jquery元素
.siblings(选择器)
查找该元素的所有兄弟节点
例:
$('li.class1').sibings('a')
//找出li.class1的所有兄弟下的所有包含<a>标签的jq元素
.nextAll(expr)
查找当前元素之后的所有兄弟元素
next()
下一个兄弟jq元素
.prevtAll([expr])
查找当前元素之前的所有兄弟元素
.prev()
上一个兄弟元素
.hasClass(class)
判断当前的元素是否含有某个特定的类,如果含有则返回true,反之false
例:
$(' ').hasClass('box')
jQuery 操作css:
修改css
$('').css(style,value);
例:
$('a').css("list-style","none");
或:
$('a').css({ color: red, backgroundColor, skyblue, height: 50 });
获取css
$('').css(style);
例:
console.log($('a').css("list-style"));
jQuery操作对象
.addClass(className)
例:
$().addClass('red')
.removeClass(className)
例:
$().removeClass('red')
.toggkeCkass(className)
例:
$().toggleClass('current')
jQuery动画效果
显示隐藏
.show(speed,easing,fn)
使jq元素显示
speed为显示的速度,可以使用fast,slow,normal或者自定义多少秒内完成
easing为切换的效果
如:
swing(变速切换)
linear(匀速变换)
fn为回调函数,动画效果执行完后调用
例:
.show(1000,swing,function() {alert("动画效果结束")})
.hide(speed,easing,fn)
使jq元素隐藏
.toggle(speed,easing,fn)
切换jq元素显示隐藏的状态,如果当前是隐藏就切换到显示,不然则反之
滑动
.slideDown()
.slideDown()
.slideToggle()
淡入淡出效果
.fadeIn()
渐渐出现
.fadeOut()
渐渐消失
.fadeToggle()
fadeTo(speed, opacity, easing, fn)
将目前的透明度调整为opacity
opacity为透明度
自定义动画
.animate
例:
$(window).animate({scrollY: 0},1000);
意思是将scrollY属性动态的变为0,花费1秒时间
(selector).animate({styles},speed,easing,callback)
相关详情请见:
https://www.runoob.com/jquery/eff-animate.html
停止动画效果
.stop()
jQuery函数
.hover(over,out)
事件切换
例:
$('').hover(function(){..}, function(){..})
如果只写了一个函数,那么鼠标经过和离开时都会触发
jQuery操作元素属性
.prop(key,value)
获取属性的值
例:
console.log($('img').prop('src'))
设置属性的值
例:
$('a').prop('href','https://www.baidu.com');
//只能获取固有属性
.attr(key,value)
类似上,但是还可以可以获取和设置自定义属性
.data(key,value)
把数据存取到元素的缓存中
默认前缀data-
例:
$('.box').attr('data-eee',"ee"); alert($('div').data('eee'));
.html(value)
获取、设置 元素的innerHtml 值
例:
获取:
console.log($('').html())
设置
$('').html('<span>嗯嗯</span>')
.text(value)
例 :如上
获取、设置 元素的innerText 值
.val(value)
获取、设置 表单元素的 value值,相当于element.value
例:
$("input[type='text']").val("内容")
jQuery添加 删除 创建元素
创建jq元素
$("<>text</>")
例:
var jq1 = $("<span>i'm span</span>")
内部添加
.append()
尾部添加
例:
$("div").append(jq1))
.prepend()
头部添加
例:
$("div").prepend("jq1")
这两种方法添加和被添加的元素是父子关系
外部添加
.after()
例:
$("div").after("jq1")
.before()
例:
$("div").before("jq1")
这两种方法添加和被添加的元素是兄弟关系
删除元素
.remove()
例: $('div.box').remove()
清空元素
.empty()
删除该元素的所有子元素
$('div.box').empty()
//相当于 .html("");
获取jq元素大小
.width()/height()
width / height
.innerWidth()/innerHeight()
+ padding
.outerWidth()/outerHeight()
+padding + border
.outerWidth(true)/outerHeight(true)
+padding + border + margin
jq元素位置的 获取/设置
.offset()
获取相对于dom的位置
例:
$(".fa > .son").offset().top;
//获取
$(".fa > .son").offset({top: 100, left: 100})
//设置
注: 设置的位置是相对于dom的,如果有带定位的父级元素,他也会相应的调整和父级的相对位置以使得达到相对与dom的值
.position()
//只能获取不能设置
获取相对于带定位的父级元素的相对位置
例: $(".fa > .son").position().top;
jq滚动距离
.srollTop()
例:
$(window).scrollTop(100)
alert($(window).scrollTop());
jQuery遍历
$(" ").each(fn(){..})
用来遍历jq元素对象
例:
$(" ").each(function(i, dom){ $(dom). XXX })
$.each(fn(){..})
可以遍历 数组,对象等
如果是对象则遍历的为key和value
例:
$.each(obj, function(i, dom){ $(dom). XXX })
jQuery绑定事件:
.on(method, 选择器, fn)
例:
$("ul").on('click','li',function () { console.log($(this).index()); })
$(".box").on({ click: function () { $(this).css("backgroundColor","#00AEEC"); }, mouseenter: function () { $(this).css("backgroundColor","black"); }, mouseleave: function () { $(this).css("backgroundColor","pink"); } })
.one()
语法和上一样,只是只触发一次
.off()
解除绑定
例:
$(".box").off()
解除所哟绑定事件
$(".box").off('click')
解除click绑定事件
$(".box").off('click', "span")
解除时间委托
jQuery触发事件
.trigger()
会触发元素的默认行为
//例如input的光标闪烁
例
$("button").trigger('click')
//等价于$("button").click();
.triggerHandler()
不会触发元素的默认行为
例:
$("button").triggerHandle('click')
jQuery 改名
var n = $.noConflict()
给$符号换个名字
//执行后,$关键词将会被n替换
jQuery插件
jQuery插件库
https://www.jq22.com/
jQuery之家
http://www.htmleaf.com/
jQuery API
https://jquery.cuishifeng.cn/
jQuery发送ajax请求:
$.get("https://www.escook.cn/api/finduser/"+"admin",(val)=>console.log(val));
webpack
web
流程:
1、创建一个新的文件夹
//路径不能有中文或者特殊字符
2、文件夹中创建名为src的文件夹
3、src文件夹中创建两个文件 index.html 以及 index.js
4、在文件夹中打开终端,输入 npm init -y 以初始化package.json文件
5、安装插件
终端输入: npm install jquery -S
6、安装webpack和webpack 和 webpack-dev-server
终端输入: npm i webpack webpack-cli webpack-dev-server html-webpack-plugin style-loader css-loader less-loader less url-loader file-loader babel-loader @babel/core @babel/plugin-proposal-decorators clean-webpack-plugin -D
7、根目录创建webpack.config.js 并写入:
//test 108 webpack test4/webpack.config.js const path = require("path"); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const HtmlPlugin = require('html-webpack-plugin'); const htmlPlugin = new HtmlPlugin({ template: "./src/index.html",//被复制 filename: "./index.html"//贴贴所在位置和名字 }) module.exports = { mode: 'development',//可选production 前者为开发模式,后者为部署上线模式 devtool: 'eval-source-map',//source map 能保证运行时报错的行数和源代码的行数位置保持一致 // 为了安全性考虑 建议source map尽在测试和开发时使用,因为报错的时候点击报错信息会显示出源码 // devtool: 'nosources-source-map',//报错的时候不会显示源码 但是可以显示原来报错的行数 //前者体积大,但是部署时间快,后者体积小,部署时间慢 entry: path.join(__dirname, './src/index.js'),//被处理的js文件所在位置 output: { path: path.join(__dirname, 'dist'), //导出路径 filename: 'js/main.js'//生成的js文件的导出路径 }, plugins: [htmlPlugin, new CleanWebpackPlugin()],//new CleanWebpackPlugin在这里的作用是 每次生成时先把原先的文件夹删掉 devServer: { open: true, //如果为true 初次打包完成后自动打开浏览器 host: 'localhost', //打开时的主机地址 port: 80//端口号 }, module: { rules: [{ //处理css test: /\.css$/, //给css 配置导入的接口 use: ['style-loader', 'css-loader'] }, { //处理less test: /\.less$/,//给less 配置导入的接口 use: ['style-loader', 'css-loader', 'less-loader'] }, { //处理 jpn png gif test: /\.jpg|png|gif$/,//这个插件会把图片转化为base64格式 use: 'url-loader?limit=22228&outputPath=images'//limit这里的意思是 只有图片大小小于22229字节才会被转化为base64 //outputPath=images的意思是导出路径为./images //另一种写法: /* test: /\.jpg|png|gif$/, //匹配的文件 use: { loader: 'url-loader', //加载器名 option: { limit: 22228, //小于22228的图片会被转化为base64的格式 outputPath: 'images' //图片导出路径 //只有不满足limit条件的才会被导出到这个路径中 } } */ }, { test: /\.js$/, //处理高级js语法 use: 'babel-loader', exclude: /node_modules/ //这句的意思是 不扫描node_modules文件夹 }] }, resolve: { '@': path.join(__dirname, './src/') //让@代表src根目录路径 } }
8、根目录创建babel.config.js并在其中写入:
module.exports = { plugins: [[ '@babel/plugin-proposal-decorators', { legacy: true } //babel 可以用来处理 js高级语法,解决兼容性等 ]] }
9、package.json 的 scripts 节点下 :
"scripts": { "dev": "webpack server"//引入 webpack插件 作用是可以通过webpack 压缩代码,并且自动生成兼容性的代码,引入后可以通过 npm run dev来执行 //dev是开发时运行的 serve可以实现网页的热更新 serve是将生成的渲染页面放在内存中,而build是放在文件(磁盘)里的 "build": "webpack --mode production --devtool nosources-source-map" //项目上线时运行的 //--mode production 会将build的时候以production模式构建dist }
//npm run dev后会 生成到dict/main.js
10、index.js中写自己的js 代码
//例:
import $ from 'jquery' $(function () { $("li").odd().css("color","red"); })
//如果要引入自己刚才安装的插件就使用 import xxx from '插件名' 的方式
11、index.html中增加 <script src="../dict/main.js"></script>
完毕
webpack命令
npm init -y
//初始化包管理配置文件 package.json
npm install 引入的插件名 -S/-G
//例:
npm install jquery -S
//通过ES6 模块化的方式导入 jQuery
//或者是 npm i jquery -s
-s本地安装
通常在安装某个模块比如.js文件时使用
-g全局安装
通常在安装命令行工具时使用
npm官网:
https://www.npmjs.com/
ES6
node -v
查看版本
npm -v
import
导入
类似函数调用
export default {}
默认导出
类似return
export {}
导出
例:
import { n } from "./test1.js"
如果用import 接收 参数名必须一致
as
导入时可以通过as重命名
例:
import { n as num } from "./test1.js" console.log(num);
导入模块时会执行模块内部的所有代码
Promise
then-fs的安装
npm i then-fs
创建对象:
const p = new Promise();
相关操作:
p.then( result=> {},//如果成功就调用这个 error => {}//如果失败就调用这个 )
.catch(function(n){ ... })
报错后执行
.then(function(n){ ... })
//等待异步函数结束后调用
.finally(function(n){ ... })
.all()
其中的异步请求会依次按顺序调用
等所有的异步操作全部结束后才会执行下一步的.then操作
Promise.all(promise[]).then
例:
const promiseList = [ axios.get("https://www.escook.cn/articles?_page=1&_limit=50"), axios.get("http://liulongbin.top:3006/api/getbooks"), axios.get("https://www.escook.cn/api/cart") ] Promise.all(promiseList).then( function (arrs) { console.log(arrs) } )
.race()
类似赛跑,谁先执行完,就调用谁,
格式和上一样
创建封装的异步操作例:
getBooks() { return new Promise(function () { axios.get("http://liulongbin.top:3006/api/getbooks") }) }
function getFile() { return new Promise(function (resolve, reject) { fs.readFile(fpath, "utf8", (err, dataStr) => { if (err) return reject(err) resolve(dataStr) }) }) }
async
异步
例:
(async function () { console.log(await axios.get("http://liulongbin.top:3006/api/getbooks")); console.log(await axios.get("https://www.escook.cn/api/cart")); console.log(await axios.get("https://www.escook.cn/articles?_page=1&_limit=50")); }())
第一个await之前的代码会同步执行,await之后的代码会异步执行
await
触发事件中的axios简写例:
<button>按钮</button> </body> <script> $("button").on("click",async function () { console.log( await axios["get"]("http://liulongbin.top:3006/api/getbooks")); }) </script>
等待异步完成
如果在函数中使用了await 则函数必须被async修饰
event loop
异步任务
宏任务
// ajax 请求 , settimeout , 文件操作等都属于宏任务
微任务
//promise.then/catch/finally process.nextTick都属于微任务
npm i express@4.17.1 mysql2@2.2.5
vue
vue2
node.js下载
vue官网
cn.vuejs.org
https://vuejs.bootcss.com/api/
vue通过http引入
<scri src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></scri>
<!--引入Vue--> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
import
导包
如果导入的是某个文件夹,则默认导入这个文件夹下的index.js的文件
vue模板:
const app = new Vue({ el: "#app", data: { }, methods: { }, filters: { fn(val) { return ; } } })
v-text
例:
略
{{ }}
//类似于v-text
vue的值可以是js语句比如:
{{ n +1 }}
{{ gender == "男" ? "男" : "女" }}
{{ str.split(',').reverse().join('') }}
v-bind:id=" 'list-' + id "
//注: 只能是有返回值的表达式
v-html
例:
略
v-bind
例:
v-bind:src="src1"
例:
:src ="src1"
v-show
//显示隐藏元素
v-if
创建删除元素
v-else-if
v-else
v-on
//v-on:click=""
鼠标事件
@click=“”
单击
@dblclick
双击
@mouseenter
鼠标经过
//相比mouseover他经过自身子节点也只触发一次,除非再次离开
@mouseleave
鼠标离开
@mouseover
鼠标经过
@mouseout
鼠标离开
@mousemove
鼠标移动事件
@mousedown
鼠标按下
@change
@mousewheel
鼠标滚轮事件
//input加上@mousewheel=""之后,可以通过滚轮增加减少input的数字型值
键盘事件
@keyup
键盘弹起
@keydown
键盘按下
@keypress
键盘按下
具体见: 键盘事件对象
事件修饰符:
.prevent
阻止默认行为
//比如a衔接的跳转,表单的提交
例:
@submit.prevent=""
//阻止表单的自动提交
.stop
阻止事件冒泡
例:
@click.stop = ""
.capture
//以捕获模式触发当前的事件处理函数
.once
绑定的事件只触发一次
.self
只有触发的是自身而非自身的子元素时才会触发
键盘事件修饰符:
.entet
触发enter时
例:
@keyup.enter=""
//在检测到enter按键时触发
.esc
触发esc时
例:
@keyup.esc=""
//在检测到esc按键时触发
//等等
子主题
v-model
例:
<div class="box"> <select v-model="city"> <option value="0">请选择城市</option> <option value="1">武汉</option> <option value="2">北京</option> <option value="3">上海</option> </select> <!--引入Vue--> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.js"></script> <script> const box = new Vue({ el: ".box", data: { city: 0 } }) </script> </div>
<div class="box"> <input type="text" v-model.number.lazy="n1">+<input type="text" v-model.number.lazy="n2">=<span>{{n1+n2}}</span><br> <input type="text" v-model.trim="username"><br> <input type="checkbox" v-model="checkbox"> <button @click="test">打印checkbox</button> <br> <input type="radio" v-model="radio" name="radio1" value="1"> <input type="radio" v-model="radio" name="radio1" value="2"> <input type="radio" v-model="radio" name="radio1" value="222"> <button @click="test2">打印radio</button> </div> <!--引入Vue--> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.js"></script> <script> const box = new Vue({ el: ".box", data: { n1: 0, n2: 0, username: "", checkbox: "", radio: "" }, methods: { test: function () { console.log(this.checkbox); }, test2: function () { console.log(this.radio); } } }) </script>
注: 只对表单元素有效
v-model.
.number
将数值转化为 数字型
.trim
去除首尾空格
.lazy
在change 时更新
v-model vue3 锚链接:
v-model
v-for
<div v-for="(n,i) in data"> {{i}}:{{n}} </div>
<span v-for="i in 10"> {{i}} </span>
//如果遍历数字则是从1开始,如果是键值对则是从0开始
强烈建议使用v-for的时候使用:key
:key
key的值只能是number或者string 否则就会报错
key的值不能重复
过滤器
new Vue({ filters: { fn1(obj) { ... } }
例:
new Vue({ el: ".box", data: { str: "ewakawekjl weamwk weakjl;e ewaew" }, methods: { }, filters: { fn1 = (str) => str[0].toUpperCase() + str.slice(0) }
全局过滤器
Vue.filter("过滤器名", (obj) => { ... })
过滤器其他写法
<p>{{ message | filter1(obj1, obj2) }}</p> Vue.filter("filter1", (msg,obj1,obj2)=>{ ... })
监听器
函数式的监听器
watch: { data1: (newVal,oldVal)=>{ ... } }
例:
watch: { data1: (newVal,oldVal) => console.log(newVal,oldVal) }
//注: 如果监听的是一个对象 对象的属性发生变化时不会触发监听器
对象式监听器
watch: { data1: { handler: (newVal,oldVal)=>console.log(newVal, oldVal), immediate: true,//如果为true则为初始化 进入页面就立即触发一次, deep: true } }
immediate: true/false.
如果为true则为初始化 进入页面就立即触发一次
deep:
是否深度监听
//用来解决 对象的属性被改变时不会触发监听器的问题
计算,器
computed
定义的时候以方法格式定义
例:computed: { num1: function () { ... } }
使用计算属性的时候, 可以当做普通的属性使用
例:<p>{{ num1 }}</p>
计算属性中以来的数据源变化时,计算属性也会自动重新求值
例:
<div class="rgb"> <div>R: <input type="text" v-model="r"></div> <div>G: <input type="text" v-model="g"></div> <div>B: <input type="text" v-model="b"></div> <div :style="`backgroundColor: ${rgb}; color: ${rev_rgb}`">{{ rgb }}</div> </div> <script> const rgb = new Vue({ el: ".rgb", data: { r: 0, g: 0, b: 0 }, computed: { rev_rgb: function () { return `rgb(${255-this.r},${255-this.g},${(255-this.b)})`; } , rgb: function () { return `rgb(${this.r},${this.g},${this.b})`; } } }) </script>
vue项目的创建:
通过vue-cli快速搭建vue项目结构 ↓
vue-cli
官网:
https://cli.vuejs.org/zh
vue-cli的安装
文件夹目录打开终端,输入 npm i @vue/cli -g
vue-cli创建项目
vue create 项目名:
第一步:选择Manually select features
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
第八步:
//是否存为预设
finish!
命令
cd 项目名
将当前cd路径改为根目录
npm run serve
生成后的项目结构
package.json
/src/
/assets:
存放项目中用到的静态资源比如图片,css等
/components
存放可复用的组件等
main.js
项目的入口文件,整个项目的运行,会先执行main.js
例:
import Vue from 'vue'//导入vue import App from './App.vue'//导入App.vue Vue.config.productionTip = true new Vue({ render: h => h(App),//渲染App }).$mount('#app')//渲染到#app这个位置 相当于el: "#app"
App.vue
项目的根组件,此文件会被main.js渲染到public的 index.html的div.app下
官方中文文档:
https://cli.vuejs.org/zh/config/
组件的安装:
例如安装axios:
所在目录终端输入:
npm i axios -s
vue组件之间的嵌套
通过components导入其他vue模块
实例:
<div class = "box"> <Left></Left> </div> import Left from "./components/Left.vue" export default { components: { Left } }
在main.js中导入全局component模块
import component1 from "./component/component1" //导入组件路径 Vue.component("myCount",component1); //给导入的组件起名
props
格式:
props: [属性名,属性名,...]
例:
props: ["num"]
props: { 属性名: { } }
props的属性
type
设定传入类型,自动隐式转化
type: Number, //Boolean /String / Array / Object
可以是数组:
type: [Number, Array]
default
用来设置默认值 //只有在没有接收到值得情况下才会为此值,类似c++的函数默认参数
如果是对象类型,则为:
例:
obj: function() { return { name: "" } }
required
校验, 检验传入的值是否符合type类型,以及是否传入了值
用例:
被引用的.vue中声明
例:
export default { props: ["init"], name: "test.vue" }
props: { num: { default: 0 , //默认值,如果没有接收到num则默认num为0 type: Number, //Boolean /String / Array / Object / Date / Function / Symbol //定义传入的类型 required: true } }
引用方法:
<test init = "eee"></test>
使用
{{eee}}
注意事项: props里的值是只读的,虽然可以修改,但是强烈不建议修改
.vue 的 style
属性:
lang
例:
<style lang="less"></style>
能够让css支持less语法
scoped
私有css属性
scoped的实现是通过在底层给每一个当前标签都加上一个属性名然后选择器在进行一个过滤
例
<style scoped></style>
/deep/
可以改子组件的css属性
例:
<style> /deep/ button { outline: none; } </style>
vue生命周期函数:
组件创建阶段
beforeCreate
创建之前运行的函数
created
在内存中创建后运行的函数
//此时porps/data/methods 都已经创建好,处于可用的状态
//一般会在这个阶段发起axios请求获取数据等
//这个阶段模板结构尚未生成,无法操作dom元素
beforeMount
在渲染之前运行的函数
此时浏览器还没有dom结构
mounted
渲染之后运行的函数
此时dom已经渲染完成
例: created() {...}
组件运行阶段
beforeUpdate
更新之前执行的函数
updated
更新完后执行的函数
组件销毁阶段
beforeDestroy
销毁前执行的函数
destroyded
销毁后执行的函数
组件激活/停用阶段
activated
组件激活后执行的函数
//组件被创建时也会执行
deactivated
组件停用后执行的函数
子向父传值
自定义事件
传参的时候可以通过$event传递event对象
this.$emit("事件名", 传递的参数)
兄弟组件共享
解决方案是 EventBus
$ref:
this.$nextTick
组件的$nextTick(CB)方法,会把CB回调推迟到下一个DOM更新周期之后执行。通俗的理解是: 等组件的DOM更新完成之后,再执行cb回调函数。从而能保证cb回调函数可以操作到最新的DOM元素。
例:
this.$nextTick(function () { ... })
<component>
例:
<component is="Test"></component>
可以通过此组件来灵活的切换组件
组件激活/停用阶段
activated
组件激活后执行的函数
//组件被创建时也会执行
deactivated
组件停用后执行的函数
切换组件时会销毁被切换的组件,如果想要保留可以使用↓
<keep-alive>
例:
<keep-alive> <component is="Test"></component> </keep-alive>
将会在组件被切换时将组件缓存下来,以保存数据
include属性
例:
<component :is="comName" include="Left"></component>
意思是之保存Left的数据
可以指定哪些组件需要被保存数据(缓存)
不可与下面的exclude属性共存
exclude属性
例:
<component :is="comName" include="Left"></component>
意思是之除了不保存Left的数据,其他都保存
和上相反,相当于白名单和黑名单的区别
<template>
此标签是一个虚拟标签,只起到包裹性的作用,不会渲染为任何实质的html元素
如果是根部的template 其中的 根标签名要加一个 -container
插槽
<slot>
例:
组件中:
<slot class="slot"></slot>
//假设此组件叫Test↑
引用组件时:
<Test> <span>hello test</span> </Test>
网页:
hello test
会将组件中的内容传入<slot标签中>
<slot>后备内容
例:
<slot>如果没有传入内容,则会默认显示此内容</slot>
属性:
name
例:
<slot name="slot1"></slot>
默认为default,也就是:
<slot></slot> 相当于 <slot name="default"></slot>
作用域插槽
即<slot>中带有数据
例:
<slot msg="hello slot"></slot>
例:
使用组件时
<template #content="scope"></template>
组件中:
<slot msg="">
v-slot
例:
组件中的代码
例1
<slot name="slot1"></slot> <slot name="slot2"></slot>
例2
<slot></slot>
引用组件的代码:
<Test> <template v-slot:slot1> <div>hello test</div> </template> <template v-slot:slot2> <div>slot2</div> </template> </Test>
网页:
hello test
v-slot:后面要跟插槽名
例:
v-slot:slot1
简写形式#
如 v-slot:slot1 可以写成 #slot1
注: 只能在template 或组件 使用此属性
作用域插槽:
例:
定义插槽时:
<slot name="slot1" test1="test1" test2="test2"></slot>
使用插槽时:
<template #slot1="scope">{{scope}}</template>
网页中:
{"test1": "test1", "test2": "test2"}
详情具体见 test_130
这些知识的整合具体使用请见案例test_130
自定义指令:
私有自定义指令
directives
定义例:
directives: { color: { //定义一个名为color 的指令 //只有指令第一次被绑定时 会立即触发bind函数 只会触发一次 bind(el,binding) { //el是被绑定的dom对象 el.style.color = binding.value }, update(el,binding) { //每次dom被更新后调用 el.style.color = binding.value } } }
directives: { color(el,binding) { //el是被绑定的dom对象 el.style.color = binding.value } }
使用例:
<span v-color="color">hello</span>
bind(el,binding)函数
第一次被绑定时会触发一次
只会触发一次
el是被绑定的dom对象
binding是传递过来的参数
全局自定义指令
例:
Vue.directive("color",(el,binding))=>el.style.color=binding.value)
写在main.js里
注:
定义自定义指令时,不需要加v-的前缀,但是使用时需要加v-的前缀
ESLint
官网:
https://eslint.bootcss.com/
可组装的JavaScript和JSX检查工具
详情请见:
http://doc.toutiao.liulongbin.top/mds/1.init.html
idea设置为两格缩进
教程地址
https://blog.csdn.net/wwppp987/article/details/107614486
Vue.prototype
给Vue添加属性
例:
Vue.prototype.$axios = axios
//将axios赋值给 Vue 的 $axios 属性
注: 写在main.js
路由
路由的工作方式和流程:
vue-route
详情见:
https://router.vuejs.org/zh
具体流程
1安装 vue-router
2创建路由模块
创建一个router文件夹
下面创建一个index.js
其中内容为:
import Vue from 'vue' // 从vue-router引入,以VueRouter 接受 import VueRouter from 'vue-router' // Vue.use是安装插件的意思 // 这句相当于是把 VueRouter 装到了 Vue Vue.use(VueRouter); //创建路由的实例对象 const router = new VueRouter(); //向外共享路由的实例对象 export default router;
例:在 @/router/index.js中:
import Vue from 'vue' // 从vue-router引入,以VueRouter 接受 import VueRouter from 'vue-router' import Home from '@/components/Home.vue' import About from "@/components/About"; import Movie from "@/components/Movie"; // Vue.use是安装插件的意思 // 这句相当于是把 VueRouter 装到了 Vue Vue.use(VueRouter); //创建路由的实例对象 const router = new VueRouter({ routes: [ {path: '/home', component: Home}, {path: '/about', component: About}, {path: '/movie', component: Movie} ] }); //向外共享路由的实例对象 export default router;
3导入并且挂载路由模块
在main.js中
import router from @/router/index.js
4生命路由衔接和占位符
route的安装
npm i vue-router -s
最新版可能不支持vue 2
npm i vue-router@3.5.2 -s
支持vue 2
动态路由
例:
{ path: ':id', component: Video }
这个'id'会被保存到$route.params的.id中
配置:
例:
routes: [ { path: '/', redirect: '/home' }, { path: '/home', component: Home }, // 给不同地址绑定不同组件 { path: '/about', component: About }, { path: '/movie', component: Movie } ]
redirect
重定向
例如上
如果该地址被访问,会被跳转到指定的地址中
children
子路由
默认子路由的方法
例:
{ path: '', component: 组件名}
即path值为空就是默认子路由
component
锚链接对应的组件
props
是否开启props传参
如果开启之后,动态路由传入的值会被传入该组件的props中
this.$route
.params
接收到的路径参数
例: /movie/1中的 /1
值为: {id: 1}
.query
接收到的查询参数
假设: ?name=xiaobai 则query值为
{name: xiaobai}
.path
相对路径
例:
'/movie/2'
.fullpath
完整路径
例:
'/movie/2?name=xiaobai'
.hash
锚链接
例:
'#n1'
this.$router
.push(hash)
例:
this.$router.push('/about')
跳转到指定 锚链接
//会增加一条历史记录
.replace(hash)
同上,但是不会增加历史记录而是替换当前历史记录
.go(n)
例:
this.$router.go(-1)
//上一页
在历史记录中前进后退
//如果超过上限则原地不动
.back()
返回上一个页面
.forward()
下一个页面
.beforeEach(fn(to,from,next))
//写在router/index.js下
to是去到的链接的对象信息
from是先前所在的链接的对象信息
next
next()
放行
next('锚链接地址')
强制跳转到该锚链接
例:
next('/login')
跳转到登录页面
next(false)
不做任何操作
导航守卫
案例具体见test_132
<router-view>
<vue-link>
例:
<router-link to="/about">关于</router-link>
相当于:
<a href="#/about">关于</a>
具体案例见test_132
我的.vue空模板:
<template> <div class="test"> </div> </template> <script> export default { name: "Left", props: { pro1: { type: Number,// Number / Object / Boolean / String / Array required: true, //如果为true 没有传入值时, 或者传入的值不符合type,会报错 default: 1 //会在传入值为NULL NaN undefined 等时为此值 } }, data() { return { data1: "test", arr1: [{name: "xiaobai", age: 18}], obj1: {att1: "att1", att2: "att2"}, nums: [1,3,8,9,4,6], total: 0 } }, methods: { test() { console.log(this.data1); } }, watch: {//监听器 data1: { handler: function (newVal, oldVal) {//数据发生变化时触发的函数 console.log(newVal) }, immediate: true,//如果为true则为初始化 进入页面就立即触发一次, deep: true //是否深度监听 用来解决对象的属性被改变时不会触发监听函数 用指针来理解就行了 } }, computed: { //计算器 如果值所依赖的值发生改变(默认深度监听的),此值也会发生改变, total: function () { return this.nums.reduce((result, n) => result += n, 0) // result 每一层的接受值以及上一层的返回值 n遍历的值 0是result的初始值 } }, created() { //此时 porps / data / methods 都已经创建好,处于可用的状态 //一般会在这个阶段发起 ajax / axios请求 console.log("created阶段 函数执行") }, mounted() { console.log("created阶段 函数执行") }, activated() {//激活时执行 console.log("activated阶段 函数执行") }, deactivated() {//停用时执行 console.log("deactivated阶段 函数执行") } } </script> <style scoped lang="less"> * { box-sizing: border-box; } .test { :last-child { } &:hover { } &:active { } } input[type='number'] { -moz-appearance: textfield; outline: none; } input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; } </style>
vue3
vite
通过vite创建vue3工程化项目的步骤:
npm init vite@latest
npm init vite-app 项目名
cd 项目名
npm install/i
npm run dev
安装npm:
npm i less -D
创建的目录介绍
./project/
/node_modules/
/public/
静态资源
/favicon.icon
网页的图标
/src/
源代码目录,所有的代码都在此文件夹下
/assets/
用来存放项目中所有的静态资源文件
/components/
用来存放项目中的所有自定义组件
/App.vue
项目的根组件
/index.css
全局样式表
/main.js
打包入口文件
/.gitignore
/index.html
/package.json
包管理配置文件
/package-lock.json
:deep()
:class
例:
html:
<span class="test" :class="classObj">the test</span><br> <button @click="classObj.italic = !classObj.italic">toggle italic</button> <button @click="classObj.delete = !classObj.delete">toggle delete</button>
java script //data() {}种
classObj: { italic: false, delete: false }
:style
例1:
html:
<div :style="{ color: style1.color, fontSize: style1.fontSize + 'px' }">Hello World</div> <button @click="--style1.fontSize">字体大小 - 1</button> <button @click="++style1.fontSize">字体大小 + 1</button>
js //data () { }
style1: { color: "red", fontSize: "24" }
例2:
html
:style="{ backgroundColor: bgColor, color: color }
js (data)
props: ["title", "bgColor", "color"]
组件之间的数据传递
props:
validator
例:
props: { num: { validator(value) { //value为num传入的值 return ...//返回true代表验证通过,false代表验证失败 } } }
自定义验证函数
v-model
例:
定义组件时:
emits: ["update:count"], //第一步 props: ["count"],//第二步 methods: { add () {//第三步 this.$emit("update:count", this.count + 1); } }
使用组件时:
<Count v-model:count="count"></Count>
具体例见test_141 和 test_140
v-model的详情:
v-model
bus
安装mitt包
npm i mitt@2.1.0
EventBus.js中:
import mitt from 'mitt' const bus = mitt() export default bus
发送方:
import bus from '...' bus.emit("自定义事件", 发送的数据)
接收方
import bus from '...' bus.on("自定义事件", fn(val){...})
子孙祖先之间的数据传递:
详情见test_143
祖先到子孙的互相绑定:
子孙:
inject: ["count"]
{{ count.value }}
祖先:
import { computed } from 'vue' provide() { return { count: computed(()=>this.count) } }
vuex
watch
监听某个对象的某个属性
watch: { 'user.age': function () {...} }
生命周期
beforecraete
craeted
内存中创建完毕
beforemounte
mounted
已经渲染到dom上了
beforeupdate
updated
检测到dom元素的更新时触发
beforeunmouted
unmounted
详情见vue2 vue生命周期函数:
$refs
ref
ref用来辅助开发者在不依赖于jQuery的情况下,获取DOM元素或组件的引用
注: ref的起名规则要求是xxx-ref或者xxxRef这样,以方便它人一眼就知道是ref属性,例如 countRef
$refs
每个vue组件实例上都包含一个$ref对象,里面存着对应的DOM元素或组件的引用
默认组件的$refs指向一个空对象
用法:
给需要控制的组件添加ref
例:
<Count ref="countRef"></Count>
可以通过js代码控制调用拥有 被控制组件的的属性方法等
例:
console.log(this.$refs.countRef)
console.log(this.$refs.countRef.count)
获取到的refs.的具体值为DOM对象
自定义指令
具体见vue2 自定义指令:
vue3多了自定义指令支持 生命周期函数生命周期
注:vue3删除了bind(),取而代之的是created,mounted, update 被 updated代替
自定义私有指令
例:
directives: { 指令名: { craeted(el, binding) { console.log(el, binding) }, mounted(el,binding) { ... }, update(el, binding) { ... } } }
自定义全局指令
例:
app.directive("指令名", {对象内参考如上})
关于vue3的axios常见用法
例:
import axios from 'axios' axios.defaults.baseURL = "http://api.com" //设置根路径 App.config.globalProperties.$http = axios; //将$http属性挂载到app ,使得 组件可以通过 this.$http来访问
axios.defaults.baseURL
例:
axios.defaults.baseURL="http://api.com"
//写到main.js
可以配置axios的根路径
创建项目:
第一步创建项目
npm init vite@latest 项目名
cd 项目名
npm i
npm run dev
安装组件(按需):
less
npm i less -D
axios
npm i axios -s
导入:
import axios from 'axios'
bootstrap
npm i bootstrap
//# Yarn //$ yarn add element-plus //# pnpm //$ pnpm install element-plus
导入:
import bootstrap from 'bootstrap'
element-ui
npm i element-plus -s
导入:
手动导入:
在main.js中:
import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' app.use(ElementPlus)
按需导入:
安装
npm install -D unplugin-vue-components unplugin-auto-import
配置
webpack.config.js/vite.config.ts
const AutoImport = require('unplugin-auto-import/webpack') const Components = require('unplugin-vue-components/webpack') const { ElementPlusResolver } = require('unplugin-vue-components/resolvers') module.exports = { // ... plugins: [ AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ], }
vant
ajax
axios
官网
axios中文官网
http://www.axios-js.com/
axios英文官网
https://www.npmjs.com/package/axios
axios.js远程引入
<!--引入Axios--> <scri src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></scri>
axios格式:
axios发送get请求
axios({ methods: "get",//请求类型 例get post url: "https://autumnfish.cn/api/joke/list?num=1",//请求的url地址 params: {username: "小白"}//请求的参数值 }).then(function (result) { console.log(result); } )
格式一例
axios.get("https://autumnfish.cn/api/joke/list",{ num: 1 }).then(function (result) { console.log(result); } )
格式二例
axios发送post请求
axios({ methods: "post",//请求类型 post url: "https://autumnfish.cn/api/joke/list?num=1",//请求的url地址 data: {username: "小白"}//请求的参数值 }).then(function (result) { console.log(result); } )
格式一例
axios.post("https://autumnfish.cn/api/joke/list?num=1", {id: 1}).then(function (result) { console.log(result); } )
格式二例
返回值的格式
{ config:{},//配置信息 data: {},//返回的数据 headers: {}// status: 200/404/506,状态 statusText: ""//状态信息 }
await和async
触发事件中的axios简写例:
<button>按钮</button> </body> <script> $("button").on("click",async function () { console.log( await axios["get"]("http://liulongbin.top:3006/api/getbooks")); }) </script>
axios.defaults
给axios配置默认值
例:
axios.defaults.baseURL = 'http://www.liulongbin.top:3006/'
//给axios配置默认的根地址
注:写在 main.js
例:
axios.get("https://autumnfish.cn/api/joke/list?num=1").then(function (value) { alert(value); },function (reason) { alert("服务器错误"); })
myData = { name: "xiaobai", age: 19 } axios.post("https://autumnfish.cn/api/joke/list?num=1",myData).then(function (value) { alert(value); },function (reason) { alert("服务器错误"); })
axios的最佳实践:
创建一个/utils/request.js文件
例:
import axios from 'axios' const request = axios.create({ baseURL: "https://www.escook.cn/" }) export default request;
测试用接口:
接口 joke
https://autumnfish.cn/api/joke/list?num=1
天气
http://wthrcdn.etouch.cn/weather_mini?city=武汉
歌曲
https://autumnfish.cn/search?keywords=周杰伦
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?aggr=1&cr=1&flag_qc=0&p=1&n=10&w=周杰伦
有道翻译
http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=中国
获取图书信息
http://liulongbin.top:3006/api/getbooks
获取商品列表
https://www.escook.cn/api/cart
获取文章信息
https://www.escook.cn/articles
参数:
_page
Number型
//页码值
_limit
Number型
//每页多少条信息
测试get
http://www.liulongbin.top:3006/api/get
测试post
http://www.liulongbin.top:3006/api/post
原生写法:
react:
前端框架
bootstrap
https://v3.bootcss.com/css
quickui
http://www.uileader.com/quickui_doc/
Element ui
官网
https://element.eleme.cn/#/zh-CN/component/button
引入
<!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <!-- 引入组件库 --> <script src="https://unpkg.com/element-ui/lib/index.js"></script>
安装
npm指令
npm i element-ui -S
main.js中
import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import App from './App.vue'; Vue.use(ElementUI);
Vant
Vant 3组件库
https://vant-contrib.gitee.io/vant/#/zh-CN/nav-ba
//仅适用于vue3
Vant 2组件库
https://vant-contrib.gitee.io/vant/v2/#/zh-CN/
终端:
npm i vant@latest-v2 -S
main.js中:
import Vue from 'vue'; import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant);
Lodash
https://www.lodashjs.com/
//包括节流 防抖 操作数组 对象的一系列等功能
https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.zip