使用IDEA和WebStorm 做一个小作业(一)

菜鸟教程

1、HTML

HTML 教程 | 菜鸟教程 (runoob.com)

2、CSS

CSS 教程 | 菜鸟教程 (runoob.com)

https://www.runoob.com/cssref/css-reference.html

3、JavaScript

JavaScript 教程 | 菜鸟教程 (runoob.com)

4、Python

Python3 教程 | 菜鸟教程 (runoob.com)

 

IDEA 后端

 

一、下载

1、IDEA

IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com)

 

注意:不要直接下载最新版本

 

2、补丁

 

 

 

注意:如果不能下载,电脑上需要下载网盘

 

3、jdk1.8版本

  • 配置jdk 环境

上网查

4、在idea自带Maven里配置国内仓库

D:\MyFiles\ideaIU\IntelliJ IDEA 2022.3.2\plugins\maven\lib\maven3\conf

找到IDEA文件 —— plugins —— maven —— lib —— maven3 —— conf

打开 settings.xml 文件,找到mirror元素,添加阿里云仓库镜像代码

 <mirror>
   <id>aliyunmaven</id>
   <mirrorOf>*</mirrorOf>
   <name>阿里云公共仓库</name>
   <url>https://maven.aliyun.com/repository/public</url>
 </mirror>

再把 settings.xml 文件复制到 C:\Users\Administrator\.m2

5、在idea里配置jdk、maven

  • 配置jdk

    File/齿轮 —— Project Structure —— + —— JDK —— 选择jdk路径

     

  • 配置idea自带maven

    File/齿轮 —— Settings —— Build, Execution, Deployment —— Build Tools —— Maven

     Maven home path:Bundled (Maven 3)


二、创建maven项目

1、方法一

New Project

 Name
 Location
 Language:Java
 Build system:Maven
 JDK
 Add sample code:√

2、方法二

Maven Archetype

 Name
 Location
 JDK
 Catalog:Internal
 Archetype:org.apache.maven.archetypes:maven-archetype-quickstart

3、在pom.xml 添加依赖

 <dependencies>
 
  添加依赖
 
 </dependencies>

有网:在 www.mvnrepository.com 搜索jar包

离线:配置环境变量

右键电脑 —— 属性 —— 高级系统设置 ——环境变量——系统变量——新建

 变量名:MAVEN_HOME
 变量值:maven地址

双击Path —— 新建

 D:\MyFiles\ideaIU\IntelliJ IDEA 2022.3.2\plugins\maven\lib\maven3\bin

找到IDEA文件 —— plugins —— maven —— lib —— maven3 —— conf

打开 settings.xml 文件,找到本地仓库 localRepository

 <localRepository>/path/to/local/repo</localRepository>移出注销
 
 修改   改斜杠:防止当成转义符号看<localRepository>C:/Users/Administrator/.m2/repository</localRepository>

修改完再把 settings.xml 文件复制到 C:\Users\Administrator\.m2

不启动idea 打开终端 win+r 输入cmd

 mvn -version 检查maven是否能用
 
 mvn clean 清除   target目录一起被清掉
 
  mvn package 重新打包
 
  cd.. 退到上一个目录
 

在idea上打开Terminal (快捷键:alt +F12)


必添加的依赖

springboot

 <!-- https://mvnrepository.com/artifact/org.kie.kogito/kogito-springboot-starter -->
 <dependency>
     <groupId>org.kie.kogito</groupId>
     <artifactId>kogito-springboot-starter</artifactId>
     <version>1.22.1.Final</version>
 </dependency>
 

4、代码(写代码前先检查环境是否正确)

1、Test

 package org.nf;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 /**
  * Hello world!
  *
  */
 @SpringBootApplication //注解 标记这是SpringBoot
 public class Test
 {
     public static void main( String[] args )
    {
         SpringApplication.run(Test.class);
    }
 
 }
 

访问是否正确 http://127.0.0.1:8080

如果出现404错误,创建配置文件

mian右键 —— New —— Directory —— 新建resources目录 —— resources右键 —— New —— File —— application.yml

 server: 
  port: 8888
  servlet:
    context-path: /
 

server:服务器 port:服务绑定的端口,不写默认是8080 context-path:服务的路径,不写默认为空

再次访问是否正确 http://127.0.0.1:8888 ,一切正常可以开始写代码

2、案例(一)

1、创建一个实体类 entity
 package org.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 public class Car {
     private Integer id;
     private String name;
     //alt + insert (添加get、set快捷键)
 
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 
2、创建一个servlet类

如果返回的都是json格式的数据的话,可以不写@ResponseBody,都但是@Controller 要改成 @RestController

 package org.nf.action;
 
 import org.nf.entity.Car;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 @Controller //注解:标记这是控制器
 public class CarAction {
     @RequestMapping("/getCar") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public Car geitCar(){
         Car car = new Car(); //创建实例对象
         car.setId(12);
         car.setName("奔驰600");
         return car;
    }
 }
 package org.nf.action;
 
 import org.nf.entity.Car;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 @Controller //注解:标记这是是控制器
 public class CarAction2 {
     @RequestMapping("/getCar2") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public List<Car> getCar(){
 
         //创建一个arraylist对象
         List<Car> carList = new ArrayList<Car>();
 
         Car car1 = new Car(); //创建实例对象
         car1.setId(12);
         car1.setName("奔驰600");
 
         Car car2 = new Car(); //创建实例对象
         car2.setId(44);
         car2.setName("奔驰300");
 
         carList.add(car1);
         carList.add(car2);
 
         return carList;
    }
 }
 

访问地址检查

 http://127.0.0.1:888/getCar
 http://127.0.0.1:888/getCar2

3、案例(二)

1、创建一个实体类 entity
 package org.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 public class Student {
     private Integer id;
 
     private String name;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 
2、创建一个servlet类

如果返回的都是json格式的数据的话,可以不写@ResponseBody,都但是@Controller 要改成 @RestController

前端传参 ,SpringBoot接收

127.0.0.1:888/s1?id=123

 package org.nf.action;
 
 import org.nf.entity.Student;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller
 public class StudentAction {
     @RequestMapping("/s1")
     @ResponseBody
     public Student getStudent1(String id){
 
         System.out.println("id:"+id); //输出打印
         Student s1 = new Student();
         s1.setId(1);
         s1.setName("小红");
         return s1;
    }
 
 }
 
 package org.nf.action;
 
 import org.nf.entity.Student;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller
 public class StudentAction {
     @RequestMapping("/s1")
     @ResponseBody
     public Student getStudent1(int id){
 
         id = id + 5;
         System.out.println("id:"+id); //输出打印
         Student s1 = new Student();
         s1.setId(id);
         s1.setName("小红");
         return s1;
    }
 
 }
 

127.0.0.1:888/s1?id=123

 

 package org.nf.action;
 
 import org.nf.entity.Student;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller
 public class StudentAction {
     @RequestMapping("/s1")
     @ResponseBody
     public Student getStudent1(int id,String name){
 
         Student s1 = new Student();
         s1.setId(id);
         s1.setName(name);
         return s1;
    }
 
 }
 
 package org.nf.action;
 
 import org.nf.entity.Student;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller
 public class StudentAction {
     @RequestMapping("/s1")
     @ResponseBody
     public Student getStudent1(Student s1){
 
         return s1;
    }
 
 }

WebStorm 前端

 

HTML(超文本标记语言) | MDN (mozilla.org)

 

1、下载WebStorm

https://www.jetbrains.com/zh-cn/webstorm/

2、axios

axios中文网|axios API 中文文档 | axios (axios-js.com)

进入点击文档,下滑到安装,复制

 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

到HTML的头部文件,就可以访问到了。运行成功,右击网页页面,点击检查,找到网络(Network),刷新,把 axios.min.js 另存为到电脑文件目录,用笔记本打开检查是否有代码

3、vue

Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)

进入点击文档,找到vue 2文档,选择 Vue 2.7,找到安装,在# CDN复制

 <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>

到HTML的头部文件,就可以访问到了。运行,右击网页页面,点击检查,找到网络(Network),刷新,把 vue.js 另存为到电脑文件目录,用笔记本打开检查是否有代码

4、mathjax

https://www.osgeo.cn/mathjax/web/start.html

找到

 <script type="text/javascript" id="MathJax-script" async
   src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
 </script>

放到HTML的头部文件,就可以访问到了。运行,右击网页页面,点击检查,找到网络(Network),刷新,把tex-mml-chtml.js另存为到电脑文件目录,用笔记本打开检查是否有代码

 

MathJax基础教程和快速参考

https://blog.csdn.net/icurious/article/details/81697410

 

5、创建项目

1、创建一个js文件

把 axios.min.js 复制到 WebStorm 的 js文件

2、代码

1、案例一

HTML

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <div>{{carList.length}}</div>
         <div v-for="Car in carList">
            车的ID:{{Car.id}}
            车名:{{Car.name}}
         </div>
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             carList:[]
        },
         mounted(){
             console.log(1)
             //var that = this; 指向carList:[]
             axios.get("http://127.0.0.1:888/getCar2") //获取路径
 
                 //接收内容
                .then((response)=>{
                     console.log(2)
                     let responseData = response.data // 声明变量
                     console.log(this.carList)
                     //that.carList = responseData;
 
                     this.carList = responseData;
                     console.log(responseData)
                })
 
             // function(response){} 默认 接收函数
             // response=>{} 箭头函数 常用
        }
    })
 </script>

让客户端响应变慢,在后端加Thread.sleep();

 package org.nf.action;
 
 import org.nf.entity.Car;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller //注解:标记这是是控制器
 public class CarAction2 {
     @CrossOrigin //跨域
     @RequestMapping("/getCar2") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public List<Car> getCar(){
 
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
         //创建一个arraylist对象
         List<Car> carList = new ArrayList<Car>();
 
         Car car1 = new Car(); //创建实例对象
         car1.setId(12);
         car1.setName("奔驰600");
 
         Car car2 = new Car(); //创建实例对象
         car2.setId(44);
         car2.setName("奔驰300");
 
         carList.add(car1);
         carList.add(car2);
 
         return carList;
    }
 }
 

解决跨域(不同服务器)的错误:

1、前端 (回调、代理等技术)

2、后端 添加 跨域的标记符@CrossOrigin

IDEA

 package org.nf.action;
 
 import org.nf.entity.Car;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 @Controller //注解:标记这是控制器
 public class CarAction {
     @CrossOrigin //注解:跨域的标记符
     @RequestMapping("/getCar") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public Car geitCar(){
         Car car = new Car(); //创建实例对象
         car.setId(12);
         car.setName("奔驰600");
         return car;
    }
 }
 

MySQL

1、重新安装mysql 【管理员】

1.卸载

a.检查mysql是否已经停掉,如果没有停net stop mysql ​ b.卸除服务mysqld --remove ​ 【D:\mysql-8.0.29-winx64\bin】 ​ c.直接删除整个目录D:\mysql-8.0.29-winx64

2.安装【服务端】

下载官方文档如下:https://www.mysql.com

a.解压

用终端操作

b.在mysql-8.0.32-winx64\bin目录安装data ​ 命令:mysqld --initialize-insecure --user=mysql ​ c.安装服务mysqld --install --mysql-8.0.32-winx64\bin目录 ​ d.启动服务端:net start mysql ​ 鼠标在服务,右键选启动 ​ e.把服务启动类型改为:手动 (防止每次开机都运行)

右键此电脑——属性——高级系统设置——环境变量——系统变量——找到Path点编辑新建

 D:\MyFiles\MySQL\mysql-8.0.32-winx64\bin

再把它上移最顶

3.使用客户端

mysql -uroot -p

4.修改登录密码

set password for 'root'@'localhost'='123456'; exit 重新登录 mysql -uroot -p mysql -uroot -p123456

5.检查编码(不是必须)

show databases; 显示当前的数据库

use 切换到数据库;

show tables; 查看所有表

show variables; 查看环境变量 show variables like '%char%';

6.修改数据库编码

a.进入 mysql-8.0.28-winx64文件夹中,新建一个名为 my,后缀为 .ini 的文件。 b.以 记事本 的形式打开 my.ini 文件,将下面的代码段复制进去。编辑并且添加内容

 [client]
 default-character-set=utf8
 
 [mysqld]
 character-set-server=utf8

c. 退出 exit

停止服务 net stop mysql

再重启服务(新版不重启也行)net start mysql

登录 mysql -uroot -p

7.创建数据库

 create database cardb;
 
 use cardb;
 
 create table carInfo(
  id int primary key auto_increment,
    name varchar(50)
 );
 
 insert into carInfo(name) values('小小');
 
 insert into carInfo(name) values('丽丽');
 
 select * from carInfo;
 
 
 use shcooldb;
 
 create table book(
  id int primary key auto_increment,
    book_name varchar(50)
 );
 
 insert into book(book_name) values('小王子');
 
 insert into book(book_name) values('红楼梦');
 
 insert into book(book_name) values('西游记');
 
 select * from book;
 

 

2、代码

案例一

解决这个Dao对象null的问题,2个解决方法 1、手写实现类,新建(new)出对象即可

1、创建实体类

 package org.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 public class Car {
     private Integer id;
     private String name;
     //alt +insert
 
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 

2、创建Dao

 package org.nf.dao;
 
 import org.nf.entity.Car;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/16
  */
 public interface CarDao {
     /**
      * 数量一
      *
      * @return
      */
     public List<Car> getBookById();
 
 
     /**
      * 多数
      * @return
      */
     public List<Car> getAllBook();
 }
 

3、创建DaoImpl

 package org.nf.dao.impl;
 
 import org.nf.dao.CarDao;
 import org.nf.entity.Car;
 
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/16
  */
 public class CarDaoImpl implements CarDao {
     /**
      * 连接数据库
      * @return
      */
     private static final String USER_NAME = "root";
     private static final String PASSWORD = "123456";
     private static final String JDBC_URL = "jdbc:mysql://localhost:3306/cardb?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false";
     private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
 
     @Override
     public List<Car> getBookById() {
 
         try {
             //加载驱动
             Class.forName(JDBC_DRIVER);
             //获取连接
             Connection conn = DriverManager.getConnection(JDBC_URL,PASSWORD,USER_NAME);
             //sql语句
             PreparedStatement pst = conn.prepareStatement("select * from carInfo");
             //执行查询,返回一个结果集
             ResultSet rs = pst.executeQuery();
 
             //创建接收到的信息的清单
             List<Car> carList = new ArrayList<Car>();
 
             while (rs.next()){
                 //System.out.println("************");
                 //创建对象
                 Car car = new Car();
                 car.setId(rs.getInt("id"));
                 car.setName(rs.getString("name"));
                 carList.add(car);
            }
             return carList;
 
        } catch (ClassNotFoundException e) {
             System.out.println("找不到驱动文件" + JDBC_DRIVER);
        } catch (SQLException e) {
             System.out.println("加载驱动后成功,但是有其它异常" + e.getMessage());
        }
 
         return null;
    }
 
     @Override
     public List<Car> getAllBook() {
         return null;
    }
 }
 
 

4、创建Action

 package org.nf.action;
 
 import org.nf.dao.CarDao;
 import org.nf.dao.impl.CarDaoImpl;
 import org.nf.entity.Car;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller //注解:标记这是是控制器
 public class CarAction3 {
 
     //private CarDao dao; 类成员变量,不对外,默认是空的
     //解决这个Dao对象null的问题,2个解决方法
     //1、手写实现类,新建(new)出对象即可
     private CarDao dao = new CarDaoImpl();
 
     //2、摆烂,空就交给框架,等myBatis框架完成
     @CrossOrigin
     @RequestMapping("/getCar3") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public List<Car> getCar(){
 
         System.out.println("dao:" + dao);
 
         return dao.getAllBook();
    }
 }
 

5、HTML

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <div>一共有{{carList.length}}辆车</div>
         <div v-for="Car in carList">
            车的ID:{{Car.id}}
            车名:{{Car.name}}
         </div>
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             carList:[]
        },
         mounted(){
             console.log(1)
             //var that = this; 指向carList:[]
             axios.get("http://127.0.0.1:888/getCar3") //获取路径
 
                 //接收内容
                .then((response)=>{
                     console.log(2)
                     let responseData = response.data // 声明变量
                     console.log(this.carList)
                     //that.carList = responseData;
 
                     this.carList = responseData;
                     console.log(responseData)
                })
 
             // function(response){} 默认 接收函数
             // response=>{} 箭头函数
        }
    })
 </script>

案例二

解决这个Dao对象null的问题,2个解决方法

2、摆烂,空就交给框架,等myBatis框架完成

 

 

1、创建entity类

 package org.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 public class Car {
     private Integer id;
     private String name;
     //alt +insert
 
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 

2、创建dao类 在配置文件的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="com.nf.dao.CarDao">
 
     <resultMap id="myCar" type="Car">
         <id property="id" column="id"></id>
         <result property="name" column="name"></result>
     </resultMap>
 
     <select id="getAllCar" resultMap="myCar">
        select * from carInfo
     </select> //select、delete、update、insert
 
 </mapper>

当id是主键的话,id 旁边的result 改为id即可

namespace 连接接口

resultMap 结果映射

property entity字段

column 数据库字段

 package org.nf.dao;
 
 import org.apache.ibatis.annotations.Mapper;
 import org.nf.entity.Car;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/16
  */
 @Mapper //声明身份
 public interface CarDao {
     /**
      * 数量一
      *
      * @return
      */
     public List<Car> getCarById();
 
 
     /**
      * 多数
      * @return
      */
     public List<Car> getAllCar();
 }
 

3、创建daoimpl类 删除掉

 package org.nf.dao.impl;
 
 import org.nf.dao.CarDao;
 import org.nf.entity.Car;
 import org.springframework.stereotype.Repository;
 
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/16
  */
 @Repository //注解:可提供数据库操作的实现类
 public class CarDaoImpl implements CarDao {
     /**
      * 连接数据库
      * @return
      */
     private static final String USER_NAME = "root";
     private static final String PASSWORD = "123456";
     private static final String JDBC_URL = "jdbc:mysql://localhost:3306/cardb?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false";
     private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
 
     @Override
     public List<Car> getCarById() {
 
         try {
             //加载驱动
             Class.forName(JDBC_DRIVER);
             //获取连接
             Connection conn = DriverManager.getConnection(JDBC_URL,PASSWORD,USER_NAME);
             //sql语句
             PreparedStatement pst = conn.prepareStatement("select * from carInfo");
             //执行查询,返回一个结果集
             ResultSet rs = pst.executeQuery();
 
             //创建接收到的信息的清单
             List<Car> carList = new ArrayList<Car>();
 
             while (rs.next()){
                 //System.out.println("************");
                 //创建对象
                 Car car = new Car();
                 car.setId(rs.getInt("id"));
                 car.setName(rs.getString("name"));
                 carList.add(car);
            }
             return carList;
 
        } catch (ClassNotFoundException e) {
             System.out.println("找不到驱动文件" + JDBC_DRIVER);
        } catch (SQLException e) {
             System.out.println("加载驱动后成功,但是有其它异常" + e.getMessage());
        }
 
         return null;
    }
 
     @Override
     public List<Car> getAllCar() {
         return null;
    }
 }
 
 

3、创建action

 package org.nf.action;
 
 import org.nf.dao.CarDao;
 import org.nf.entity.Car;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/14
  */
 
 @Controller //注解:标记这是是控制器
 public class CarAction3 {
 
     //private CarDao dao; 类成员变量,不对外,默认是空的
     //解决这个Dao对象null的问题,2个解决方法
     //1、手写实现类,新建(new)出对象即可
 
     //2、摆烂,空就交给框架,等myBatis框架完成
     @Autowired  //自动注入
     private CarDao dao;
     @CrossOrigin
     @RequestMapping("/getCar3") //注解:标记我的访问地址
     @ResponseBody //注解:将java对象转为json格式的数据
     public List<Car> getCar(){
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
         System.out.println("dao:" + dao);
 
         return dao.getAllCar();
    }
 }
 

4、html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <div>一共有{{carList.length}}辆车</div>
         <div v-for="Car in carList">
            车的ID:{{Car.id}}
            车名:{{Car.name}}
         </div>
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             carList:[]
        },
         mounted(){
             console.log(1)
             //var that = this; 指向carList:[]
             axios.get("http://127.0.0.1:888/getCar3") //获取路径
 
                 //接收内容
                .then((response)=>{
                     console.log(2)
                     let responseData = response.data // 声明变量
                     console.log(this.carList)
                     //that.carList = responseData;
 
                     this.carList = responseData;
                     console.log(responseData)
                })
 
             // function(response){} 默认 接收函数
             // response=>{} 箭头函数
        }
    })
 </script>

案例三(复习)

Test

 package com.nf;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 /**
  * @author lxm
  * @create 2023/3/17
  */
 @SpringBootApplication
 public class MyApplication {
     public static void main(String[] args) {
 
         SpringApplication.run(MyApplication.class);
 
    }
 
 }
 

entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 }
 

mapper

 <?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="com.nf.dao.BookDao">
 
     <resultMap id="myBook" type="Book">
         <id property="id" column="id"></id>
         <result property="bookName" column="book_name"></result>
     </resultMap>
 
     <select id="getAllBooks" resultMap="myBook">
        select * from book
     </select>
 
 </mapper>

action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
         return dao.getAllBooks();
    }
 
 }
 

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <div>一共有{{bookList.length}}本书</div>
         <div v-for="Book in bookList">
            书的ID:{{Book.id}}
            书名:{{Book.bookName}}
         </div>
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[]
        },
         mounted(){
             console.log(1)
             //var that = this; 指向carList:[]
             axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径
 
                 //接收内容
                .then((response)=>{
                     console.log(2)
                     let responseData = response.data // 声明变量
                     console.log(this.bookList)
                     //that.carList = responseData;
 
                     this.bookList = responseData;
                     console.log(responseData)
                })
 
             // function(response){} 默认 接收函数
             // response=>{} 箭头函数
        }
    })
 </script>

 

nodejs

1、下载网址:

Node.js (nodejs.org)

sass

https://www.sass.hk/

 1、可以通过v-bind直接访问is中data-->>dom

 nodejs-->>npm模块
  类似于java、maven (所有的包都先放在这个本地仓库)
 
 maven
 1.下载和安装
 2.配置环境变量
 3.配置镜像站 (由阿里)
 --本地仓库
 
 nmp
 分全局,当前项目 (创建1次项目,就下载一次)
 下载后,先不要碰它,打包。
 下次创建项目时,就不用再重新下载,而是解压一份即可
 node.js -->>npm -->>安装第一个vite (通过vite下载更新vue项目)

 

2、安装完成后,win + r 敲入cmd,必须使用管理员账号

 node
 
 --可以敲入javascript的代码--
 console.log(3)
 
 let a = 123;
 let b = 456;
 console.log(a+b)
 
 --退出windows界面
 .exit
 
 --新界面
 cls
 
 --查看版本
 npm -v
 
 --npm全局设置镜像
 npm config set registry="https://registry.npm.taobao.org"
 
 --查看当前本地npm配置的镜像站
 npm config get registry
 
 --配置全局目录
 npm config set prefix="D:\MyFiles\NodeJs\node_global"
 
 --配置临时目录
 npm config set cache="D:\MyFiles\NodeJs\node_cache"
 
 --下载模块
 npm install -g jquery
 或者
 npm i -g jquery
 
 npm i -g axios
 
 npm i -g mathjax
 

3、创建前端项目

3.1 创建vue的项目 方法一

1.三种做法

 1.原始webpack打包工具自己手动配置
 
 2.使用vue的脚手架 (创建工具) vue-cli它屏蔽webpack配置细节
  继承webpack的复杂,以及卡、慢
 
 3.使用vite创建工具

2.vue的版本

 vue 2.0 常用版本
 vue 3.0 组合式API
 vue 3.2 各种语法糖,大幅度降低编码难度

3.vite 官网

https://cn.vitejs.dev/guide/

4. 搭建第一个 Vite 项目,并压缩成原始包

win + r 敲入cmd

 --进入指定地址
 
 --使用npm下载依赖包
 npm create vite@latest
 --y
 --项目名 test01
 --Vue
 --TypeScript
 
 cd test01
 
 npm install --会读取package.json
 
 --运行项目
 npm run dev
 

5.创建新项目

5.1解压原始包,重命名
 --进入该项目
 cd test01
 
 --运行项目
 npm run dev
 --或在webstorm的项目上找到package.json里的dev运行
5.2 开发项目

用webstorm打开该项目

打开网页 http://localhost:5173/(cmd不能关闭)

如果想修改端口,找到配置文件vite.config.ts

 import { defineConfig } from 'vite'
 import vue from '@vitejs/plugin-vue'
 
 // https://vitejs.dev/config/
 export default defineConfig(
    {plugins: [vue()],
       server:{
         port:8888
      }
 
 })

3.2创建vue的项目 方法二

打开webstorm——New Project——Vite(最新版本,Vue.js旧版本2.0)

 Template:vue
 User TypeScript template:√

下载依赖包

 --查看最新版本
 npm info jquery
 
 --打开 package.json "dependencies" 里面 添加
 "jquery": "^3.6.4"
 "axios": "^1.3.5"
 mathjax: "^"
 
 
 当运行 npm install 的时候会自动下载依赖包
 
 --下载依赖包,直接点击弹出来的窗口 Run 'npm install'

3.3 变量的响应(访问后台服务器 - 示例)

(vue2.0与vue3.0的区别)

(1)添加依赖包

(2)App.vue

 <!--js-->
 <script setup lang="ts">
   import {ref} from "vue";
   let myResult = ref('loading....');
   console.log(myResult);
 
   //可以显示但是不响应
   let abc = '11111';
 
   setTimeout(()=>{
     //修改值
     myResult.value = '123';
  },3000)
 
 
 
 </script>
 
 <!--html-->
 <template>
   <div>
     <div>访问后台服务器 - 示例</div>
     <div>{{myResult}}</div>
     <div>{{abc}}</div>
   </div>
 </template>
 
 <!--样式-->
 <style scoped>
 
 </style>
 

3.4 生命周期钩子(onMounted)

 <!--js-->
 <script setup lang="ts">
 
 import {onMounted, ref} from "vue";
 
 let name = ref("小黑");
 
 onMounted(()=>{
   setTimeout(()=>{
     name.value = "小猫";
  },3000)
 })
 
 </script>
 
 <!--html-->
 <template>
   <div>
     <div>访问后台服务器 - 示例</div>
     <div>{{name}}</div>
   </div>
 </template>
 
 <!--样式-->
 <style scoped>
 
 </style>
 

3.5 全局axios封装

main.ts

 import { createApp } from 'vue'
 import './style.css'
 import App from './App.vue'
 import axios from "axios";
 
 //需求,在出发之前,往系统里设置某些变量(全局可以使用),axios
 let root = createApp(App)
 
 //封装
 axios.defaults.headers.get['Content-Type'] = 'application/json';//配置默认访问请求的头部
 axios.defaults.headers.post['Content-Type'] = 'application/json';
 axios.defaults.baseURL = ' http://localhost:5173/';//配置请求根路径
 root.config.globalProperties.$abc = 123;
 
 //设置为全局
 root.config.globalProperties.$http = axios;
 
 root.mount('#app')
 

App.vue

 <!--js-->
 <script setup lang="ts">
 import {getCurrentInstance, onMounted, ref} from "vue";
 
 //组件里,从全局变量中获取封装过的axios
 let instance = getCurrentInstance();
 let globalProperties = instance?.appContext.config.globalProperties;
 console.log(globalProperties);
 //console.log(globalProperties.$http);
 let request = globalProperties.$http;
 
 let myData = ref("loading...");
 onMounted(()=>{
   setTimeout(()=>{
     request.get('ttt').then(result=>{
       myData.value = result.data.abc;
    })
  },4000)
 })
 
 </script>
 
 <!--html-->
 <template>
   <div>
     <div>访问后台服务器 - 示例</div>
     <div>{{myData}}</div>
 
   </div>
 </template>
 
 <!--样式-->
 <style scoped>
 
 </style>
 

3.6 sass动态变量与vue3.2 v-bind结合

main.ts

 import { createApp } from 'vue'
 import './style.css'
 import App from './App.vue'
 import axios from "axios";
 
 // vue3.2 如何放一个全局变量
 //config 配置对象
 //globalProperties 全局的属性
 let rootElement = createApp(App);//创建组件
 
 //往组件里放两个元素
 rootElement.config.globalProperties.$width = 200;
 rootElement.config.globalProperties.$height = 300;
 
 //挂载上去这件事情
 rootElement.mount('#app');
 

App.vue

 <!--js-->
 <script setup lang="ts">
 import {getCurrentInstance, ref} from "vue";
 
   //getCurrentInstance() 获取当前实例
   let rootElement = getCurrentInstance();
 
   //获取元素
   //appContext 上下文
   let rootProp = rootElement?.appContext.config.globalProperties;
 
   //把对象中的变量拆出来
   let width = ref(rootProp.$width);
   let height = ref(rootProp.$height);
 
 let width2 = ref(width.value + 'px');
 let height2 = ref(height.value + 'px');
 
   //console.log(rootProp);
   //console.log(width);
   //console.log(height);
 
   //定义函数
   const up = ()=>{
     //console.log("OK");
     width.value += 10;
     height.value += 10;
 
     width2.value = width.value + 'px';
     height2.value = height.value + 'px';
  }
 
   const down = ()=>{
     //console.log("OK");
     width.value = width.value -= 10;
     height.value = height.value -= 10;
 
     width2.value = width.value + 'px';
     height2.value = height.value + 'px';
  }
 
  //在javascript中,我已经有2 个变量,那么请问怎么定义出一个div
   // 手动操作DOM,这破坏了mvvm模型的信仰
 
 
 
 </script>
 
 <!--html-->
 <template>
   <div>
     <div>我是App组件</div>
     <button @click="up">大</button>
     <button @click="down">小</button>
     <div class="xxx">演示</div>
 
   </div>
 </template>
 
 <!--样式-->
 <style lang="scss" scoped>
   .xxx{
     background: aqua;
     width: v-bind(width2);
     height: v-bind(height2);
  }
 </style>
 

3.7 vu3.2- 综合小案例一

main.ts

 import { createApp } from 'vue'
 import App from './App.vue'
 
 //设置一个根元素
 let rootElement = createApp(App);
 
 //全局
 rootElement.config.globalProperties.$width = 0;
 rootElement.config.globalProperties.$height = 0;
 
 //挂载
 rootElement.mount('#app')
 

App.vue

 <script setup lang="ts">
 import {computed, getCurrentInstance, ref} from "vue";
 
   //获取实例
   const globalProp = getCurrentInstance()?.appContext.config.globalProperties;
 
   //声明可响应的全局变量,再进行双向绑定(v-model)
   let width = ref(globalProp.$width);
   let height = ref(globalProp.$height);
 
   //计算属性
   let width2 = computed(()=>{
     return width.value*1 + 'px';
  })
 
   let height2 = computed(()=>{
     return height.value*1 + 'px';
  })
 
   //绑定
   let wUp = ()=>{
     //强制把字符串转换成数字,因为输入框里的内容默认成字符串
     width.value = width.value*1
     width.value += 1;
  }
   let wDown = ()=>{
     width.value = width.value*1
     width.value -= 1;
  }
 
   let hUp = ()=>{
     height.value = height.value*1
     height.value += 1;
  }
   let hDown = ()=>{
     height.value = height.value*1
     height.value -= 1;
  }
 
 </script>
 
 <template>
   <div>
       <div>
        宽度:<input type="text" v-model="width"/>
         <button @click="wUp"> + </button>
         <button @click="wDown"> - </button>
         <br>
       </div>
       <div>
        高度:<input type="text" v-model="height"/>
         <button @click="hUp"> + </button>
         <button @click="hDown"> - </button>
       </div>
 
       <div class="uu">{{width}} X {{height}}</div>
   </div>
 </template>
 
 <style lang="scss" scoped>
   .uu{
     background: aquamarine;
     width: v-bind(width2);
     height: v-bind(height2);
  }
 </style>
 

3.8 vu3.2- 综合小案例二

main.ts

 import { createApp } from 'vue'
 import App from './App.vue'
 
 let root = createApp(App);
 
 root.mount('#app')
 

App.vue

 <script setup lang="ts">
 import {computed, ref} from "vue";
 
 ////声明可响应的变量,再进行双向绑定(v-model)
 let name = ref('')
 let math = ref('0')
 let eng = ref('0')
 let mathColor = computed(()=>{
   if (math.value*1>=80){
     return 'blue'
  }else{
     return 'brown'
  }
 })
 </script>
 
 <template>
   <div>
     <div>
       <span>姓名:</span>
       <span>
         <input type="text" v-model="name">
       </span>
     </div>
     <div>
       <span>数学成绩:</span>
       <span>
         <input id="math" type="number" v-model="math">
       </span>
     </div>
     <div>
       <span>英语成绩:</span>
       <span>
         <input id="eng" type="number" v-model="eng">
       </span>
     </div>
     <div>
       <span>总分:{{math*1+eng*1}}</span>
     </div>
     {{mathColor}}
   </div>
 </template>
 
 <style lang="scss" scoped>
  $width:60px;
  $color-primary:#EB04EF;
 
   #math{
     width: $width;
     background: antiquewhite;
     color: v-bind(mathColor);
  }
 
   #eng{
     width: $width;
     background: antiquewhite;
     color: brown;
  }
 </style>
 

3.9 vu3.2- 综合小案例三

main.ts

 import { createApp } from 'vue'
 import App from './App.vue'
 
 let root = createApp(App);
 
 root.mount('#app')
 

App.vue

 <script setup lang="ts">
   import {computed, ref} from "vue";
 
   let boy = ref(0)
   let girl = ref(0)
   let other = ref(0)
 
 
   let boyCss = computed(()=>{
     return Math.round( (boy.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
   let girlCss = computed(()=>{
     return Math.round( (girl.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
   let otherCss = computed(()=>{
     return Math.round( (other.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
 </script>
 
 <template>
   <div>
     <div>
       <span>男生人数:</span>
       <span>
         <input type="text" v-model="boy">
       </span>
     </div>
     <div>
       <span>女生人数:</span>
       <span>
         <input type="text" v-model="girl">
       </span>
     </div>
     <div>
       <span>其它人数:</span>
       <span>
         <input type="text" v-model="other">
       </span>
     </div>
   </div>
 
   <div class="boy" v-if="boy!=0">
     {{boy}}
   </div>
   <div class="girl" v-if="girl!=0">
     {{girl}}
   </div>
   <div class="other" v-if="other!=0">
     {{other}}
   </div>
 </template>
 
 <style lang="scss" scoped>
 $LINE_HEIGHT:40px;
 $ALIGN:center;
 
   .boy{
     width:v-bind(boyCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: aquamarine;
     float:left;
  }
   .girl{
     width:v-bind(girlCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: chocolate;
     float: left;
  }
   .other{
     width:v-bind(otherCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: blueviolet;
     float:left;
  }
 </style>
 

3.10 scss1

1.可以通过v-bind直接访问js中data-->>dom

v-bind生成css的val套用变量的方法,所以不能再进一步计算

20 --->> val(...) 20+'px --->> val(...)px 涉及到计算,又希望动态,那么计算部分还是放在is中完成

2.可以自定定义变量,一般采用$开头且变量是有块作用域

3.支持嵌套

4.import

5.mixin 类似于函数

6.继承

7.if

8.循环等

 

main.ts

 import { createApp } from 'vue'
 import App from './App.vue'
 
 let root = createApp(App);
 
 root.mount('#app')
 

App.vue

 <script setup lang="ts">
   import {computed, ref} from "vue";
 
   let boy = ref(0)
   let girl = ref(0)
   let other = ref(0)
 
 
   let boyCss = computed(()=>{
     return Math.round( (boy.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
   let girlCss = computed(()=>{
     return Math.round( (girl.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
   let otherCss = computed(()=>{
     return Math.round( (other.value*1 / ( (boy.value*1)+(girl.value*1)+(other.value*1)))*500)+'px'
  })
 </script>
 
 <template>
   <div>
     <div>
       <span>男生人数:</span>
       <span>
         <input type="text" v-model="boy">
       </span>
     </div>
     <div>
       <span>女生人数:</span>
       <span>
         <input type="text" v-model="girl">
       </span>
     </div>
     <div>
       <span>其它人数:</span>
       <span>
         <input type="text" v-model="other">
       </span>
     </div>
   </div>
 
   <div class="boy" v-if="boy!=0">
     {{boy}}
   </div>
   <div class="girl" v-if="girl!=0">
     {{girl}}
   </div>
   <div class="other" v-if="other!=0">
     {{other}}
   </div>
 </template>
 
 <style lang="scss" scoped>
 $LINE_HEIGHT:40px;
 $ALIGN:center;
 
   .boy{
     width:v-bind(boyCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: aquamarine;
     float:left;
  }
   .girl{
     width:v-bind(girlCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: chocolate;
     float: left;
  }
   .other{
     width:v-bind(otherCss);
     height:$LINE_HEIGHT;
     text-align: $ALIGN;
     line-height: $LINE_HEIGHT;
     background: blueviolet;
     float:left;
  }
 </style>
 

3.11 scss2

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <style>
     html,body{
         padding: 0px 0px 0px 0px;
         margin: 0px 0px 0px 0px;
         background-color: #F7F8F9;
    }
 
 </style>
 <body>
 
     <div id="myApp"></div>
 
     <script type="module">
 
         import {createApp} from "vue";
         import App from "./src/App.vue";
 
         //创建组件
         let myApp = createApp(App);
 
         myApp.mount('#myApp')
 
     </script>
 </body>
 </html>
 

_myStyle.scss

 $myBlack : #333000;
 $myBgColor : #F7F8F9;
 $myBgColorWhite : #FFFFFF;
 $myRed : #D90013;
 
 @mixin border-radius($length:5px){
   border-radius:$length;
   -ms-border-dadius: $length;
   -moz-border-radius: $length;
   -webkit-border-radius: $length;
 }
 
 

App.vue

 <template>
   <div>
     <!--<div class="c1"></div>
     <div class="c2">12334444</div>
     <div class="c3">
       <h1>111</h1>
       <h2>111</h2>
       <h3>111</h3>
       <p>444</p>
     </div>-->
     <div class="c4"> 5555</div>
     <div class="c5"> 11111</div>
   </div>
 
 </template>
 
 <script setup lang="ts">
   import {ref} from "vue";
   //1、可以通过v-bind直接访问is中data-->>dom
   let width = ref('300px');
   let height = ref('300px');
 </script>
 
 <style lang="scss" scoped>
 
  //2.可以自定定义变量,一般采用$开头且变量是有块作用域
  //定义一个颜色
   /*$mycolor: yellow;
 
  .c1{
    $mycolor: red;
    width: v-bind(width);
    height: v-bind(height);
   
  }
 
  .c2{
    color: $mycolor;
  }
 
  //支持嵌套
  .c3 {
    h1{
      background: aquamarine;
    }
    h2{
      background: blue;
    }
    h3{
      background: crimson;
    }
    p{
      background: chartreuse;
    }
  }*/
 
   @import "myStyle";
 
 
 
   .c4{
     margin: 30px;
     padding: 10px;
     background-color: $myRed;
     width: 100px;
     height: 100px;
     @include border-radius();
  }
   .c5{
     margin: 30px;
     padding: 10px;
     background-color: $myBlack ;
     width: 100px;
     height: 100px;
     @include border-radius(25px);
  }
 </style>
 

3.12 scss3

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <style>
     html,body{
         margin: 0px;
         padding: 0px;
         background-color: #F7F8F9;
    }
 </style>
 <body>
 
     <div id="myApp"></div>
 
     <script type="module">
 
         import {createApp} from "vue";
         import App from "./src/App.vue";
 
         //创建组件
         let myApp = createApp(App);
 
         myApp.mount('#myApp')
 
     </script>
 </body>
 </html>

App.vue

 <template>
   <div>
     <div class="c1">我是黑色1
       <div id="cc1"></div>
     </div>
     <div class="c2">我是黑色2</div>
 
     <div>---------------------</div>
 
     <div class="k1">1</div>
     <div class="k2">2</div>
     <div class="k3">3</div>
 
     <div class="t1">3999</div>
     <div class="t2">3999</div>
     <div class="t3">3999</div>
     <div class="t4">3999</div>
     <div class="t5">3999</div>
 
     <!--循环-->
     <div v-for="item in myData" v-bind:class="'t' + item.a">
       {{item.a}}
     </div>
 
   </div>
 
 </template>
 
 <script setup lang="ts">
   import {ref} from "vue";
 
   const mycolor = ref('red');
 
   //来自后端
   const myData = [
    {a: 1},
    {a: 2},
    {a: 3},
    {a: 4},
    {a: 5},
  ];
 
   setTimeout(()=>{
     mycolor.value = 'blue';
  },5000)
 </script>
 
 <style lang="scss" scoped>
 @import "myStyle";
 
   .c1{
     background: v-bind(mycolor);
     width: $myWidth;
     height: 200px;
     #cc1{
       width: 60px;
       height: 40px;
       background: #333000;
    }
  }
   .c2{
     background: green;
     width: $myWidth;
     height: 200px;
     color: $myBlack;
  }
 
  //继承
   .k1{
     width: $myWidth;
     height: 30px;
    //动态
     @if $myWidth >= 200px{
       background: #00A0E9;
       color: #FFFFFF;
    }
     @else {
       background: bisque;
       color: blueviolet;
    }
 
     @extend .mydiv;
  }
  //import
   .k2{
     width: 50px;
     height: 30px;
     @extend .mydiv;
     @include myShadow();
  }
   .k3{
     width: 200px;
     height: 30px;
     @extend .mydiv;
     @include myShadow(6px);
  }
 
  //循环
   @for $i from 1 through 100{
     .t#{$i}{
       width: 50px * $i;
       @if $i % 2 ==0 {
         background: #00A0E9;
      }
       @else {
         background: #D90013;
      }
    }
  }
 
 </style>
 

3.13 GDP案例

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>GDP案例</title>
 </head>
 <style>
     html,body{
         background: #333000;
         margin: 0px;
         padding: 0px;
         color: #EEEEEE;
    }
 </style>
 <body>
     <div id="myApp"></div>
     <script type="module" src="src/mainb.ts"></script>
 </body>
 </html>

main.ts

 import {createApp} from "vue";
 import App2 from "./App2.vue";
 
 const myApp = createApp(App2);
 myApp.mount("#myApp")
 console.log(123)

App.vue

 <template>
   <div>
     <div class="test">33</div>
     <div v-for="item in showData.c">
       <div :style="{background:item.bgcolor,width:item.width}">{{item.name}}--{{item.gdp}}</div>
     </div>
     <div>{{showData.year}}</div>
   </div>
 </template>
 
 <script setup>
 import {computed, ref} from "vue";
 
 let widthAll = '400px';
 
 let myData = ref([
      {year:1999,c:[{name:'美国',gdp:5,width:'0px',bgcolor:'blue'},{name:'日本',gdp:6,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:4,width:'0px',bgcolor:'green'}]},
      {year:2000,c:[{name:'美国',gdp:6,width:'0px',bgcolor:'blue'},{name:'日本',gdp:7,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:5,width:'0px',bgcolor:'green'}]},
      {year:2001,c:[{name:'美国',gdp:7,width:'0px',bgcolor:'blue'},{name:'日本',gdp:8,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:6,width:'0px',bgcolor:'green'}]},
      {year:2002,c:[{name:'美国',gdp:8,width:'0px',bgcolor:'blue'},{name:'日本',gdp:9,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:7,width:'0px',bgcolor:'green'}]},
      {year:2003,c:[{name:'美国',gdp:9,width:'0px',bgcolor:'blue'},{name:'日本',gdp:10,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:8,width:'0px',bgcolor:'green'}]},
      {year:2004,c:[{name:'美国',gdp:10,width:'0px',bgcolor:'blue'},{name:'日本',gdp:11,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:9,width:'0px',bgcolor:'green'}]},
      {year:2005,c:[{name:'美国',gdp:11,width:'0px',bgcolor:'blue'},{name:'日本',gdp:12,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:10,width:'0px',bgcolor:'green'}]},
      {year:2006,c:[{name:'美国',gdp:12,width:'0px',bgcolor:'blue'},{name:'日本',gdp:13,width:'0px',bgcolor:'yellow'},{name:'中国',gdp:11,width:'0px',bgcolor:'green'}]}
    ]
 )
 
 
 
 const showData = computed(()=>{
   let countGdp = 0;
 
   for(let j = 0;j<myData.value[i.value].c.length;j++){
     countGdp = countGdp + myData.value[i.value].c[j].gdp;
  }
 
   for(let j = 0;j<myData.value[i.value].c.length;j++){
     let widthTmp = myData.value[i.value].c[j].gdp/countGdp*400;
     myData.value[i.value].c[j].width = widthTmp+'px';
  }
 
   return myData.value[i.value]
 })
 
 //不是3秒执行,而是每3秒执行一次
 let i = ref(0);
 
 let myFun = ()=>{
   setTimeout(()=>{
     if(i.value!=7){
       i.value++;
       myFun();
    }
     else {
       console.log('已经到了5,不再调用自己myFun,定时器就结束')
    }
 
  },1500);
 }
 
 myFun();
 
 </script>
 
 <style scoped>
 .test{
   background: #00A0E9;
   width: v-bind(widthAll);
 }
 </style>

 

 

错误异常

IDEA

1、java.lang.NullPointerException: null

空指针异常,说明报错位置缺少需要的数据,数据对不上

新手小白常遇到的异常

解决:在action类找到所有调用方法的对象,把它打印出来看看这个对象是否为空,不为空说明找对对象了,为空看看为什么为空

注解

1、@SpringBootApplication

// 注解 标记这是SpringBoot

2、@Controller @RestController

// 注解:标记这是控制器

3、@RequestMapping("/getCar")

// 注解:标记我的访问地址

4、@ResponseBody

// 注解:将java对象转为json格式的数据

5、 @CrossOrigin

// 跨域

6、@Mapper

//声明身份

7、@Autowired

//自动注入

 

案例:

 

 


 


步骤

1、实体类entity

存放实体,如果用ibatis框架,一般mapping创建在它下面,当然只针对架构mapping也是无意义。

 1、字段
 2、属性

2、dao

dao:主要储存数据库与相关的操作 ,增删改查等完成业务逻辑。 dao数据访问层:就是用来访问数据库实现数据的持久化。

 1、注解:声明身份
 2、增删改查

3、mapper

 

4、action

action为控制层,MVC中充当C角色,用来分配哪个业务来处理用户请求。

Action类是获得Form表单数据,并处理逻辑的类。

 1、注解:控制器
 2、注解:自动注入
 类成员变量
 3、注解:跨域
 4、注解:访问地址
 5、传参到前端

service

service层属于springmvc的service业务层

5、html

 1、放js
 2、

 


案例

注意:做项目之前先检查服务器是否启动

1、所有信息

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 
     //这里的myid等同FInteger id,只是它是交给MyBatis用的
     Book getBookById(@Param("myid") Integer id);
     
     Boolean add(@Param("mybook") Book book);
     
     Boolean delete(@Param("myid")Integer id);
 
     Boolean batDelete (@Param("myids") Integer ids[]);
     
     Boolean update (@Param("myBook") Book book);
 }
 

3.mapper

 <?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="com.nf.dao.BookDao">
 
     <resultMap id="myBook" type="Book">
         <id property="id" column="id"></id>
         <result property="bookName" column="book_name"></result>
     </resultMap>
 
     <select id="getAllBooks" resultMap="myBook">
        select * from book
     </select>
 
     <select id="getBookById" resultMap="myBook">
        select * from book where id=#{myid}
     </select>
 
     <insert id="add">
        insert into book(book_name)
        values (#{mybook.bookName})
     </insert>
 
     <delete id="delete">
        delete from book where id=#{myid}
     </delete>
 
     <!--
     目标:生成动态的这个字符串(3,4,999);
     foreach:遍历
     collection:集合
     item:
     open:开始
     close:结尾
     separator:分隔符
     -->
     <delete id="batDelete">
        delete from book where id in
         <foreach collection="myids" item="id" open="(" close=")" separator=",">
            #{id}
         </foreach>
     </delete>
 
     <update id="update">
        update book set book_name = #{myBook.bookName} where id = #{myBook.id}
     </update>
 </mapper>

4.action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
         return dao.getAllBooks();
    }
 
     /**
      * 传参到前端
      */
     @CrossOrigin
     @RequestMapping("/getBookById")
     public Book getBookById(Integer id){
         System.out.println("获取客户端发送过来的请求");
         System.out.println("参数 id:"+id);
 
         return dao.getBookById(id);
    }
 
     @CrossOrigin
     @RequestMapping("/add")
     public Boolean add(Book book){
         System.out.println("添加:"+book);
         return dao.add(book);
    }
 
     @CrossOrigin
     @RequestMapping("/delete")
     public Boolean delete(Integer id){
         System.out.println("删除id:" + id);
         return dao.delete(id);
    }
 
     @CrossOrigin
     @RequestMapping("/batDelete")
     public Boolean batDelete(Integer ids[]){
         System.out.println("批量删除ids:" + ids);
         for (Integer i:ids ) {
             System.out.println(i);
        }
         return dao.batDelete(ids);
    }
 
     @CrossOrigin
     @RequestMapping("/update")
     public Boolean update(@RequestBody Book book){
         System.out.println("接收到修改的请求");
         System.out.println(book);
         return dao.update(book);
    }
 
 }
 

前端WebStorm

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>增删查改操作</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 
 <body>
     <div id="app">
         <div>{{message}}</div>
 
         <div>一共有{{bookList.length}}本书</div>
 
         <div>
            请输入ID:<input type="text" v-model="queryId"><button @click="query">查询</button>
         </div>
         <!--搜索阿里图库-->
         <div v-if="showLoading">
             <img src="image/loading.gif" width="40px" height="40px">
         </div>
         
         <div>
             <button @click="batDelete">批量删除</button>
         </div>
 
         <table border="1" cellpadding="0" cellspacing="0">
             <tr>
                 <th><input type="checkbox">全选</th>
                 <th>书名</th>
                 <th colspan="3">操作</th>
             </tr>
             <tr v-for="Book in bookList">
                 <td>
                     <span>
                         <input type="checkbox" v-model="deleteIdList" v-bind:value="Book.id"></input>
                     </span>
                 </td>
                 <td>{{Book.bookName}}</td>
                 <td @click="addBtn">添加</td>
                 <td @click="update(Book.id)">编辑</td>
                 <td @click="del(Book.id)" style="color: crimson">删除</td>
 
             </tr>
         </table>
 
         <div v-if="showAddView" style="width: 300px;height: 100px;background: skyblue" >
             <button @click="closeWindow">X</button>
             <div>添加数据</div>
             <div>书名:<input v-model="addBookName" type="text"></div>
                 <button @click="add">确定</button>
         </div>
 
         <div v-if="showEditView" style="width: 300px;height: 100px;background: skyblue" >
             <button @click="closeWindow_edit">X</button>
             <div>修改数据</div>
             <div>书名:<input v-model="toUpdateBook.bookName" type="text"></div>
                 <button @click="updateBtn">修改</button>
         </div>
 
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[],
             queryId:'',
             showAddView:false,
             addBookName:'',
             message:'loading',
             deleteIdList:[],
             showEditView:false,
             toUpdateBook:{},
             showLoading:true
        },
         mounted(){
             this.initData();
        },
         methods:{
             initData(){
                 this.showLoading = true;
                 //var that = this; 指向carList:[]
                 axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径
 
                     //接收内容
                    .then(response=>{
                         let responseData = response.data // 声明变量
                         //that.carList = responseData;
                         this.bookList = responseData;
 
                         /*
                        * Vue MVVM -->最强大的
                            *1.有大量的UI框架支持 (免写大量重复css)
                            * 2.自动 model<--->view
                            * 信仰: 禁止手动操作DOM-->>
                            * 也许没有那么符合人的思维,但是更科学
                        * */ 
                       //操作data(不要操作界面) 
                       this.message = '加载数据完毕'; 
                       this.showLoading = false; 
                  }) 
​ 
               // function(response){} 默认 接收函数 
               // response=>{} 箭头函数 
          }, 
           query(){ 
               console.log(this.queryId); 
               axios.get("http://127.0.0.1:8080/getBookById?id="+this.queryId) //发出请求 
​ 
                  .then(response=>{ 
                       let resData = response.data; 
                       console.log(resData);//控制台输出 
                       alert(resData.bookName);//弹窗 
                  }) 
          }, 
           addBtn(){ 
               this.showAddView = true; 
​ 
          }, 
           closeWindow(){ 
               this.showAddView = false; 
​ 
          }, 
           add(){ 
               axios.get("http://127.0.0.1:8080/add?bookName="+this.addBookName) 
                  .then(response=> { 
                       let resData = response.data; 
                       this.addBookName = ''; 
                       this.showAddView = false; 
                       this.initData(); 
                  }) 
          }, 
           del(id){ 
               axios.get("http://127.0.0.1:8080/delete?id="+id) 
                  .then(response=> { 
                       let resData = response.data; 
                       this.bookList = []; 
                       this.initData(); 
                  }) 
          }, 
           batDelete(){ 
               axios.get("http://127.0.0.1:8080/batDelete?ids="+this.deleteIdList) 
                  .then(response=> { 
                       let resData = response.data; 
​ 
                       //清空旧的数据 
                       this.deleteIdList = []; 
                       this.bookList = []; 
                       //再初始化新的数据 
                       this.initData(); 
                  }) 
​ 
          }, 
           closeWindow_edit(){ 
               this.showEditView = false; 
          }, 
           //显示界面 
           update(id){ 
               this.showEditView = true; 
​ 
               axios.get("http://127.0.0.1:8080/getBookById?id="+id) 
                  .then(response=> { 
                       this.toUpdateBook = response.data; 
                       console.log(this.toUpdateBook); 
                  }) 
​ 
          }, 
           //访问后端修改数据,并且发送整个json对象 
           updateBtn(){ 
               axios({ 
                   //方法 
                   method: 'post', 
                   //访问地址 
                   url: "http://127.0.0.1:8080/update", 
                   //要发送的数据 
                   data: this.toUpdateBook, 
                   header:{ 
                       'Content-Type': 'application/json;charset=UTF-8' 
                  } 
              }).then(response => { 
                   let resData = response.data; 
                   this.showUpdateView = false; 
                   this.initData(); 
              }) 
​ 
          } 
​ 
      } 
  }) 
</script>

2、查询信息

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 
     //这里的myid等同FInteger id,只是它是交给MyBatis用的
     Book getBookById(@Param("myid") Integer id);
 }
 

3.mapper

 <?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="com.nf.dao.BookDao">
 
     <resultMap id="myBook" type="Book">
         <id property="id" column="id"></id>
         <result property="bookName" column="book_name"></result>
     </resultMap>
 
     <select id="getAllBooks" resultMap="myBook">
        select * from book
     </select>
 
     <select id="getBookById" resultMap="myBook">
        select * from book where id=#{myid}
     </select>
 
 </mapper>

 

4.action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         /*try {
             Thread.sleep(3000);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }*/
         return dao.getAllBooks();
    }
 
     /**
      * 传参到前端
      */
     @CrossOrigin
     @RequestMapping("/getBookById")
     public Book getBookById(Integer id){
         System.out.println("获取客户端发送过来的请求");
         System.out.println("参数 id:"+id);
 
         return dao.getBookById(id);
    }
 
 }
 

前端WebStorm

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 
     <!--没有 axios.min.js 则需要网络路径-->
     <!--
     <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
     -->
 
     <!--没有 vue.js 则需要网络路径-->
     <!--
     <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
     -->
 
     <!--有 axios.min.js-->
     <script src="js/axios.min.js"></script>
 
     <!--有 vue.js-->
     <script src="js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <div>一共有{{bookList.length}}本书</div>
         <div>
            请输入ID:<input type="text" v-model="queryId"><button @click="query">查询</button>
         </div>
         <div v-for="Book in bookList">
            书的ID:{{Book.id}}
            书名:{{Book.bookName}}
         </div>
     </div>
 </body>
 </html>
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>查询数据</title>
 
     <script src="js/axios.min.js"></script>
     <script src="js/vue.js"></script>
 </head>
 
 <body>
 <div id="app">
 
     <div>一共有{{bookList.length}}本书</div>
     <div>
        请输入ID:<input type="text" v-model="queryId"><button @click="query">查询</button>
     </div>
 
     <div v-for="Book in bookList">
         <span>书的ID:{{Book.id}} ,书名:{{Book.bookName}}</span>
     </div>
 
 </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[],
             queryId:''
        },
         mounted(){
             this.initData();
        },
         methods:{
             initData(){
                 axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径
                     //接收内容
                    .then(response=>{
                         let responseData = response.data // 声明变量
                         this.bookList = responseData;
 
                    })
            },
             query(){
                 axios.get("http://127.0.0.1:8080/getBookById?id="+this.queryId) //发出请求
                    .then(response=> {
                         let resData = response.data;
                         alert(resData.bookName);//弹窗
                    })
            }
        }
    })
 
 </script>
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[],
             queryId:''
        },
         mounted(){
             console.log(1)
             //var that = this; 指向carList:[]
             axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径
 
                 //接收内容
                .then(response=>{
                     console.log(2)
                     let responseData = response.data // 声明变量
                     console.log(this.bookList)
                     //that.carList = responseData;
 
                     this.bookList = responseData;
                     console.log(responseData)
                })
 
             // function(response){} 默认 接收函数
             // response=>{} 箭头函数
        },
         methods:{
             query(){
                 console.log(this.queryId);
                 axios.get("http://127.0.0.1:8080/getBookById?id="+this.queryId) //发出请求
 
                    .then(response=>{
                         let resData = response.data;
                         console.log(resData);//控制台输出
                         alert(resData.bookName);//弹窗
                    })
            }
        }
    })
 </script>

3、添加信息

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 
     Boolean add(@Param("mybook") Book book);
     
 }
 

3.mapper

<?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="com.nf.dao.BookDao">

    <resultMap id="myBook" type="Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="book_name"></result>
    </resultMap>

    <select id="getAllBooks" resultMap="myBook">
        select * from book
    </select>

    <insert id="add">
        insert into book(book_name)
        values (#{mybook.bookName})
    </insert>

</mapper>

 

4.action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         /*try {
             Thread.sleep(3000);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }*/
         return dao.getAllBooks();
    }
 
     @CrossOrigin
     @RequestMapping("/add")
     public Boolean add(Book book){
         System.out.println("添加:"+book);
         return dao.add(book);
    }
 
 }
 

前端WebStorm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加数据</title>

    <script src="js/axios.min.js"></script>
    <script src="js/vue.js"></script>
</head>

<body>
<div id="app">
    <button @click="addBtn">添加数据</button>
    <div>一共有{{bookList.length}}本书</div>

    <div v-for="Book in bookList">
        <span>书的ID:{{Book.id}} ,书名:{{Book.bookName}}</span>
    </div>

    <div v-if="showAddView" style="width: 400px;height: 180px;background: skyblue" >
        <button @click="closeWindow">X</button>
        <div>添加数据</div>
        <div>书名:<input v-model="addBookName" type="text"></div>
        <button @click="add">确定</button>
    </div>

</div>
</body>
</html>

<script>
    //新建一个Vue对象
    new Vue({
        el:"#app",
        data:{
            bookList:[],
            showAddView:false,
            addBookName:'',
        },
        mounted(){
            this.initData();
        },
        methods:{
            initData(){
                axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径

                    //接收内容
                    .then(response=>{
                        let responseData = response.data // 声明变量
                        this.bookList = responseData;

                    })
            },
            addBtn(){
                this.showAddView = true;
            },
            closeWindow(){
                this.showAddView = false;
            },
            add(){

                axios.get("http://127.0.0.1:8080/add?bookName="+this.addBookName)
                    .then(response=> {
                        let resData = response.data;
                        this.addBookName = '';
                        this.showAddView = false;
                        this.initData();
                    })
            }
        }
    })
</script>

4、修改信息

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 
     Boolean update (@Param("myBook") Book book);
 }
 

3.mapper

 <?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="com.nf.dao.BookDao">
 
     <resultMap id="myBook" type="Book">
         <id property="id" column="id"></id>
         <result property="bookName" column="book_name"></result>
     </resultMap>
 
     <select id="getAllBooks" resultMap="myBook">
        select * from book
     </select>
 
     <update id="update">
        update book set book_name = #{myBook.bookName} where id = #{myBook.id}
     </update>
 </mapper>

 

4.action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
         return dao.getAllBooks();
    }
 
     @CrossOrigin
     @RequestMapping("/update")
     public Boolean update(@RequestBody Book book){
         System.out.println("接收到修改的请求");
         System.out.println(book);
         return dao.update(book);
    }
 
 }
 

前端WebStorm

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>修改操作</title>

  <script src="js/axios.min.js"></script>

  <script src="js/vue.js"></script>
</head>

<body>
<div id="app">
  <div>一共有{{bookList.length}}本书</div>
  <!--搜索阿里图库-->
  <div v-if="showLoading">
    <img src="image/loading.gif" width="40px" height="40px">
  </div>

  <table border="1" cellpadding="0" cellspacing="0">
    <tr>
      <th><input type="checkbox">全选</th>
      <th>书名</th>
      <th>操作</th>
    </tr>
    <tr v-for="Book in bookList">
      <td>
        <span>
          <input type="checkbox" v-model="deleteIdList" v-bind:value="Book.id"></input>
        </span>
      </td>
      <td>{{Book.bookName}}</td>
      <td @click="update(Book.id)">编辑</td>

    </tr>
  </table>

  <div v-if="showEditView" style="width: 300px;height: 100px;background: skyblue" >
    <button @click="closeWindow_edit">X</button>
    <div>修改数据</div>
    <div>书名:<input v-model="toUpdateBook.bookName" type="text"></div>
    <button @click="updateBtn">修改</button>
  </div>

</div>
</body>
</html>

<script>
  //新建一个Vue对象
  new Vue({
    el:"#app",
    data:{
      bookList:[],
      showEditView:false,
      toUpdateBook:{},
      showLoading:true
    },
    mounted(){
      this.initData();
    },
    methods:{
      initData(){
        this.showLoading = true;
        //var that = this; 指向carList:[]
        axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径

                //接收内容
                .then(response=>{
                  let responseData = response.data // 声明变量
                  //that.carList = responseData;
                  this.bookList = responseData;

                  /*
                  * Vue  MVVM -->最强大的
                      *1.有大量的UI框架支持 (免写大量重复css)
                      * 2.自动 model<--->view
                      * 信仰: 禁止手动操作DOM-->>
                      * 也许没有那么符合人的思维,但是更科学
                  * */
                  //操作data(不要操作界面)
                  this.showLoading = false;
                })

        // function(response){} 默认 接收函数
        // response=>{} 箭头函数
      },
      closeWindow_edit(){
        this.showEditView = false;
      },
      //显示界面
      update(id){
        this.showEditView = true;

        axios.get("http://127.0.0.1:8080/getBookById?id="+id)
                .then(response=> {
                  this.toUpdateBook = response.data;
                  console.log(this.toUpdateBook);
                })

      },
      //访问后端修改数据,并且发送整个json对象
      updateBtn(){
        axios({
          //方法
          method: 'post',
          //访问地址
          url: "http://127.0.0.1:8080/update",
          //要发送的数据
          data: this.toUpdateBook,
          header:{
            'Content-Type': 'application/json;charset=UTF-8'
          }
        }).then(response => {
          let resData = response.data;
          this.showUpdateView = false;
          this.initData();
        })

      }

    }
  })
</script>

5、删除信息

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

 package com.nf.dao;
 
 import com.nf.entity.Book;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @Mapper
 public interface BookDao {
 
     List<Book> getAllBooks();
 
     Boolean delete(@Param("myid")Integer id);
 
 }
 

3.mapper

<?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="com.nf.dao.BookDao">

    <resultMap id="myBook" type="Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="book_name"></result>
    </resultMap>

    <select id="getAllBooks" resultMap="myBook">
        select * from book
    </select>

    <delete id="delete">
        delete from book where id=#{myid}
    </delete>
    
</mapper>

 

4.action

package com.nf.action;

import com.nf.dao.BookDao;
import com.nf.entity.Book;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author lxm
 * @create 2023/3/19
 */
@RestController
public class BookAction {
    @Autowired
    private BookDao dao;

    @CrossOrigin
    @RequestMapping("/getAllBooks")
    public List<Book> getAllBooks(){

        /*try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }*/
        return dao.getAllBooks();
    }


    @CrossOrigin
    @RequestMapping("/delete")
    public Boolean delete(Integer id){
        System.out.println("删除id:" + id);
        return dao.delete(id);
    }

}

前端WebStorm

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>删除数据</title>
 
     <script src="js/axios.min.js"></script>
 
     <script src="js/vue.js"></script>
 </head>
 
 <body>
 <div id="app">
     <div>一共有{{bookList.length}}本书</div>
     <!--
         前端收到后端响应过来的数据进行遍历
     -->
     <div v-for="Book in bookList">
         <span>书的ID:{{Book.id}} ,书名:{{Book.bookName}}</span>
         <!--
             拿到到后端响应过来的数据调用方法
         -->
         <span @click="del(Book.id)" style="color: crimson">删除</span>
     </div>
 
 </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[],
        },
         //对bookList进行赋值;界面挂载之后调用初始化数据方法
         mounted(){
             this.initData();
        },
         //在 methods 属性给 Vue 定义方法
         methods:{
             initData(){
                 //获取路径,访问后端
                 axios.get("http://127.0.0.1:8080/getAllBooks")
 
                     //接收内容
                    .then(response=>{
                         // 声明变量,后端响应过来的数据
                         let responseData = response.data;
                         //再把后端响应过来的数据传递给bookList
                         this.bookList = responseData;
 
                    })
            },
             del(id){
                 //获取路径,访问后端顺便传递一个参数交给后端进行做删除操作,
                 //并且做出响应出来之后的前端操作
                 axios.get("http://127.0.0.1:8080/delete?id="+id)
                     /*
                    *后端在action中找@RequestMapping调用delete的方法,
                    *再接收前端传递过来的id交给dao(数据库)完成,dao再调
                    *用方法,用mybatis实现操作,加一个注解声明身份,再打开
                    * mybatis的文件
                    *
                    *
                    * */
 
 
                    .then(response=> {
                         let resData = response.data;
                         //先把数据清空
                         this.bookList = [];
                         //再重新加载数据,要不然界面的数据不是最新状态
                         this.initData();
                    })
            }
        }
    })
 </script>
 
 <!--
 
 -->

6、批量删除

后端IDEA

1.entity

 package com.nf.entity;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 public class Book {
 
     private Integer id;
     private String bookName;
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getBookName() {
         return bookName;
    }
 
     public void setBookName(String bookName) {
         this.bookName = bookName;
    }
 }
 

2.dao

package com.nf.dao;

import com.nf.entity.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author lxm
 * @create 2023/3/19
 */
@Mapper
public interface BookDao {

    List<Book> getAllBooks();

    Boolean batDelete (@Param("ids") Integer ids[]);

}

3.mapper

<?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="com.nf.dao.BookDao">

    <resultMap id="myBook" type="Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="book_name"></result>
    </resultMap>

    <select id="getAllBooks" resultMap="myBook">
        select * from book
    </select>

    <!--
    目标:生成动态的这个字符串(3,4,999);
    foreach:遍历
    collection:集合
    item:
    open:开始
    close:结尾
    separator:分隔符
    -->
    <delete id="batDelete">
        delete from book where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
</mapper>

 

4.action

 package com.nf.action;
 
 import com.nf.dao.BookDao;
 import com.nf.entity.Book;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
 /**
  * @author lxm
  * @create 2023/3/19
  */
 @RestController
 public class BookAction {
     @Autowired
     private BookDao dao;
 
     @CrossOrigin
     @RequestMapping("/getAllBooks")
     public List<Book> getAllBooks(){
 
         /*try {
             Thread.sleep(3000);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }*/
         return dao.getAllBooks();
    }
 
 
     @CrossOrigin
     @RequestMapping("/batDelete")
     public Boolean batDelete(Integer ids[]){
         System.out.println("批量删除ids:" + ids);
         return dao.batDelete(ids);
    }
 
 
 }
 

前端WebStorm

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>批量删除</title>
 
     <script src="js/axios.min.js"></script>
     <script src="js/vue.js"></script>
 </head>
 
 <body>
     <div id="app">
         <div>{{message}}</div>
 
         <div>一共有{{bookList.length}}本书</div>
 
         <div v-for="Book in bookList">
             <!--复选框-->
             <span><input type="checkbox" v-model="deleteIdList" v-bind:value="Book.id"></input></span>
             <span>{{Book.id}}</span>
             <span>{{Book.bookName}}</span>
         </div>
 
         <div>
             <button @click="batDelete">批量删除</button>
         </div>
 
     </div>
 </body>
 </html>
 
 <script>
     //新建一个Vue对象
     new Vue({
         el:"#app",
         data:{
             bookList:[],
             message:'loading',
             deleteIdList:[]
        },
         mounted(){
             this.initData();
        },
         methods:{
             initData(){
 
                 axios.get("http://127.0.0.1:8080/getAllBooks") //获取路径
 
                    .then(response=>{
                         let responseData = response.data
                         this.bookList = responseData;
                         this.message = '加载数据完毕';
 
                    })
            },
             batDelete(){
                 axios.get("http://127.0.0.1:8080/batDelete?ids="+this.deleteIdList)
                    .then(response=> {
                         let resData = response.data;
 
                         //清空旧的数据
                         this.deleteIdList = [];
                         this.bookList = [];
                         //再初始化新的数据
                         this.initData();
                    })
 
            }
        }
    })
 </script>

 

 


ES6 module,箭头函数,promise

 

7、声明函数的几种方法

前端 div + css + 页面逻辑 + 打通与后端的交互 + vuex(前端的数据库)

UI —— view层

js


html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
     <script src="../js/axios.min.js"></script>
 </head>
 <body>
     <script>
         /*
        //声明函数的几种方法
        //第一代,最原始(不建议使用)
        function xx1(参数列表){
            console.log( '我被执行了' );
        }
        //函数可以像对象一样打印出来,还可以执行
        console.log( xx1 );
        console.log( console.log );
        console.log(typeof xx1);//类型
        xx1();//执行
 
        //第二代(使用率比较高的写法)
        //var 是一个变量
        var xx2 = function(){
            console.log( '我被执行了' );
        }
        xx2();//执行
 
        //第三代 —— ES6诞生
        // const 是ES6一个常量
        //let 是ES6的变量
        const xx3 = function () {
            console.log( '我被执行了' );
        }
        xx3();//执行
 
        //第四代 —— ES6 const+箭头函数(参数,代码段)
        //最大的差别是 this 引用不一样
        //1、没有参数
        //const xx4 = ()=>{
 
        //}
 
        //2、1个参数,参数的括号可以省略,代码段只有1行return时,可以省花括号,还可以省略return
        /*
        const xx4 = a => a+1;
        let p = xx4(8);
        console.log(p);
        */
 
 
         //3、2个或2个以上的参数,不能省略括号
         //当代码段只有1行return时,可以省花括号,还可以省略return
         const xx4 = a => function+1;
         //研究对象【推荐大家,如果是声明对象中的函数,建议不要箭头函数】
         //对象里面的函数,用传统function
         //对象里面的函数的里面的函数,用箭头函数
         let p = {
             a:123,
             b(){
                 //对象的方法中,还有方法,就注意啦
                 axios.get('123.json').then(()=>{
                     console.log(this);
                })
            }
        }
         p.b();
 
        /*
        //区别:
        console.log( xx1 );
        console.log( xx2 );
        console.log( xx3 );
        console.log( xx4 );
 
        xx2 = 123;
        console.log( xx2 );
 
        //xx3 = 123;//不可变
        //console.log( xx3 );
        */
 
     </script>
 </body>
 </html>

json

 {
   "a": 123
 }

8、箭头函数

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
     <script src="../js/axios.min.js"></script>
 </head>
 <body>
     <script>
       /*
      //复习
      let a = {
        data:123,
        t(){
            let that = this;
            //function函数
            axios.get('123.json').then(function(){
                console.log(this);//this是系统的变量,会随环境而变
                console.log(that);//that是自己的变量,不会随环境而变
                console.log(that.data);
          })
        }
      }
      a.t();
 
 
 
      let a = {
        data:123,
        t(){
          //箭头函数
          axios.get('123.json').then(()=>{
            console.log(this);//this是系统的变量,会随环境而变
            console.log(this.data);
          })
        }
      }
      a.t();
      */
 
       /*
      setTimeout(()=>{
        console.log('我是定时器');
      },1000)
      let p = axios.get('123.json')
 
      p.then(()=>{
        console.log(123);
      })
      console.log(456);
      console.log( p );
 
      */
 
       //resolve 已成功 —— 用来发送成功通知
       //reject 拒绝 —— 用来发送失败通知
       setTimeout(()=>{
           console.log('我是定时器1');
      },1)
       new Promise((resolve, reject)=>{
         //promise 区域当中的身份,就像局长的身份
           console.log('1');
           setTimeout(()=>{
               reject('我是定时器2');
          },3000)
      }).then(()=>{
           //then区域,微任务,身份就像处长
           console.log('2');
      },()=>{
           console.log('3');
      })
       //最外层这些代码的级别是1
       console.log(4);
     </script>
 
 </body>
 </html>

9、promise

dao

 package com.nf.dao;
 
 public class TestCar {
     private float price;
     private String name;
 
     public float getPrice() {
         return price;
    }
 
     public void setPrice(float price) {
         this.price = price;
    }
 
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 

action

 package com.nf.action;
 
 import com.nf.dao.TestCar;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 public class PromiseAction {
 
     @CrossOrigin
     @RequestMapping("/test")
     public TestCar test(){
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
 
         TestCar testCar = new TestCar();
         testCar.setPrice(60000f);
         testCar.setName("奔驰");
         return testCar;
    }
 }
 

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
     <script src="../js/vue.js"></script>
     <script src="../js/axios.min.js"></script>
 </head>
 <body>
     <div id="app">
         <!--1
         <div>钱1:{{m1}}</div>
         <div>钱2:{{m2}}</div>
         <div>钱3:{{m3}}</div>
         -->
 
         <div>钱:{{m}}</div>
 
 
         <button @click="btn">点我</button>
 
     </div>
 
 </body>
 </html>
 <script>
     new Vue({
         el:'#app',
         data:{
             /*1
            m1:100,
            m2:100,
            m3:100
            */
             m:100
 
 
        },
         methods:{
             btn(){
                 /*1
                this.m1 = 1;
                axios.get('http://127.0.0.1:8080/test').then(()=>{
                    this.m3 = 3;
                })
                this.m2 = 2;
                */
 
                 /*//定时器
                setTimeout(()=>{
                    this.m = 2;
                },200)*/
 
                 this.m = 1;
                 axios.get('http://127.0.0.1:8080/test').then(response=>{
                     this.m = response.data.price;
                }).then(()=>{
 
                     setTimeout(()=>{
                         //期望原来的123显示为125
                         this.m = this.m + 2;
                    },3000)
 
                })
 
 
            }
        }
    })
 
 </script>

10、getM

后端IDEA

1、dao

 package com.nf.dao;
 
 public class TestCar {
     private float price;
     private String name;
 
     public float getPrice() {
         return price;
    }
 
     public void setPrice(float price) {
         this.price = price;
    }
 
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 }
 

2、action

 package com.nf.action;
 
 import com.nf.dao.TestCar;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 public class PromiseAction {
 
     @CrossOrigin
     @RequestMapping("/test")
     public TestCar test(){
         try {
             Thread.sleep(3000);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        }
 
         TestCar testCar = new TestCar();
         testCar.setPrice(60000f);
         testCar.setName("奔驰");
         return testCar;
    }
 }
 

前端webshorm

1、js

 const abc = 123
 
 const commonAccess = function (url){
     return new Promise(resolve => {
         axios.get(url).then(response=>{
             resolve(response.data)
        })
    })
 }
 
 const getM = function (){
     return commonAccess('http://127.0.0.1:8080/test')
 }
 
 export default getM
 //本模块是一个独立的模块,外部不能直接访问本模块
 //但本模块可以提供一个对外的接口getM

2、html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
     <script src="../js/vue.js"></script>
     <script src="../js/axios.min.js"></script>
 </head>
 <body>
     <div id="app">
         <div>钱1:{{m}}</div>
         <div>钱2:{{m}}</div>
         <input type="text" v-model="m">
         <button @click="btn">点我</button>
 
     </div>
 
     <script type="module">
         import getM from "../js/accessRemoteServer.js";
 
         new Vue({
             el:'#app',
             data:{
                 m:100
            },
             methods:{
                 async btn(){
                     this.m = 1;
 
                     let responseData = await getM()
                     this.m = responseData.price
 
                }
            }
        })
     </script>
 </body>
 
 </html>
 

11、module

js

 const abc = 123;
 const a = 1;
 const b = 2;
 const c = 3;
 
 const d = function (){
 
 }
 
 const e = a => a+1;
 
 
 export default e //默认导出一个
 

 

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
 
 </body>
 </html>
 <script type= "module">
     import iii from '../js/module.js'
     console.log(iii(4))
 
     console.log(typeof iii)
 </script>

 

 

12、module_promise

js

 const k = a => {
     return new Promise((resolve, reject)=>{
         resolve('李淼')//传值
    })
 }
 
 
 export default k //默认导出一个
 

 

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </head>
 <body>
 
 </body>
 </html>
 <script type= "module">
     import iii from '../js/module_promise.js'
     iii().then ( result => {
         //不会很快执行(执行需要两个条件:
         // 1.等外面的代码先执行完
         //2.放参数
         console.log('你好,' + result)
    })
 </script>

 

 


ES7 async函数,以及await

 

13、async_await

js

 const k = a => {
     return new Promise((resolve, reject)=>{
         resolve('李淼')//传值
    })
 }
 
 
 export default k //默认导出一个
 

 

html

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
     <script src="../js/vue.js"></script>
 </head>
 <body>
     <div id="app">
         <button @click="pp">点我</button>
     </div>
 </body>
 </html>
 <script type= "module">
     import iii from '../js/async_await.js'
     new Vue({
         el: '#app',
         methods:{
             pp:async ()=>{
                 let result = await iii();
                 console.log('你好,' + result)
            }
        }
    })
 </script>

 


javascript

 ES5: prototype
 
 ES6: class
  箭头函数、promise、module
     各种省略写法
 
 ES7: async函数和await
 
 精通ES6

比较

 

14、java创建实例

entity

 package com.nf.entity;
 
 public class Puppy {
     //属性
     private Integer puppyAge;
 
     //默认的无参构造方法,可写可不写 ——实例创建(new一个对象自动执行)
     public Puppy(){
         System.out.println("实例创建");
    }
 
     //带参的构造函数
     public Puppy(Integer age){
         this.puppyAge = age;
    }
 
     //方法
     public void say(){
         System.out.println(" 外界的声音太杂乱了,听听自己的内心就好了");
    }
 
     public void myAge(){
         System.out.println("我的年龄:" + this.puppyAge);
    }
 
 
 }
 

 

test

 package com.nf;
 
 import com.nf.entity.Puppy;
 
 public class Test {
     public static void main(String[] args) {
 
         Puppy p1 = new Puppy(8);
         p1.say();
         p1.myAge();
         System.out.println(p1);
 
    }
 
 }
 

15、js摸拟java创建实例——ES5

 <!DOCTYPE html>
 <html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>js模仿java创建实例 ——ES5</title>
 </head>
 <body>
 <script>
  var Puppy = function (age){
 
      //this.puppyAge 类似java中的属性
      this.puppyAge = age;
  }
 
  //实例方法
  Puppy.prototype.say = function (){
      console.log("外界的声音太杂乱了,听听自己的内心就好了")
  }
 
 
  //继承以上熟悉、方法
  //声明一个变量
  var p1 = new Puppy(8);
  var p2 = new Puppy(9);
 
  console.log(p1)
  console.log(p2)
  console.log(p2)
 
  //对象的属性 p1.puppyAge
  console.log(p1.puppyAge)
 
  //对象的方法
  p1.say();
 </script>
 </body>
 </html>

 

16、js摸拟java创建实例——ES6

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>js模仿java创建实例 ——ES6</title>
 </head>
 <body>
   <script>
       class Puppy{
           constructor(age){
 
               //this.puppyAge 类似java中的属性
               this.puppyAge = age;
          }
 
           //实例方法
           say(){
               console.log("外界的声音太杂乱了,听听自己的内心就好了")
          }
      }
 
 
 
     //继承以上熟悉、方法
     //声明一个变量
     var p1 = new Puppy(8);
     var p2 = new Puppy(9);
 
     console.log(p1)
     console.log(p2)
     console.log(p2)
 
     //对象的属性 p1.puppyAge
     console.log(p1.puppyAge)
 
     //对象的方法
     p1.say();
   </script>
 </body>
 </html>

17、数学公式演示

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <script id="MathJax-script" async src="../js/tex-mml-chtml.js"></script>
     <title>这是一个数学公式演示页面</title>
 </head>
 <body>
     <div>
         <div>展示:</div>
         <!-- \ 转义符号
         对于整行显示公式,
         使用 $$...$s 括起来
         -->
         <div>勾股定理:\( a^2+b^2=c^2 \)</div>
         <div>勾股定理:$$ a^2+b^2=c^2 $$</div>
         <div>下标:\( c=a1+a2 \)</div>
         <div>下标:\( c=a_1+a_2 \)</div><br>
 
 
         <div>求和公式</div><br>
         <div>
            \( \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6} \)
         </div><br>
         <div>
            $$\ sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6} $$
         </div><br>
 
         <div>希腊字母</div>
         <div>$$ \alpha $$</div>
         <div>$$ \beta $$</div>
         <div>$$ \Delta $$</div>
         <div>$$ \Gamma $$</div>
         <div>$$ \Omega $$</div>
 
         <div>上标^下标_</div>
         <div>$$ \log_2 x $$</div>
         <div>$$ k^3 + k^2 + k $$</div>
 
         <div>分组{}</div>
         <div>$$ 10^10 $$</div>
         <div>$$ 10^{10} $$</div>
         <div>$$ {x^5}^6 $$</div>
 
         <div>括号</div>
         <div>$$ \{123\} $$</div>
         <div>$$ \left( 123 \right) $$</div>
         <div>$$ \left| 123 \right| $$</div>
         <div>$$ \vert 123 \vert $$</div>
         <div>$$ \langle 123 \rangle $$</div>
         <div>$$ \lceil 123 \rceil $$</div>
         <div>$$ \lfloor 123 \rfloor $$</div>
 
 
         <div>求和公式</div>
         <div>$$ \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}   $$</div>
 
         <div>积分符号</div>
         <div>$$ \int   $$</div>
         <div>$$ \iint   $$</div>
         <div>$$ \iiint   $$</div>
 
         <div>分数</div>
         <div>$$ \frac{分子}{分母}   $$</div>
         <div>$$ \frac {ab}c   $$</div>
 
         <div>开方</div>
         <div>$$ \sqrt3 $$</div>
         <div>$$ \sqrt {n^2+3} $$</div>
 
         <div>三角函数</div>
         <div>$$ \sin x $$</div>
         <div>$$ \sin \alpha $$</div>
 
         <div>极限</div>
         <div>$$ \lim_{t\to0}   $$</div>
         <div>$$ \int f(x)=\lim_{t\to0}   $$</div>
     </div>
 </body>
 </html>

18、for 循环

 package com.nf;
 
 import com.nf.entity.Puppy;
 
 public class Test2 {
     public static void main(String[] args) {
 
         int n = 4;
         int result = 0;
         for(int i=0;i<=n;i++){
             System.out.print(i+":");
             System.out.print(i*i);
             System.out.println("");//换行符号
             result += i*i; //自增
        }
         System.out.println(result);
    }
 
 }
 
posted @ 2024-02-28 20:38  一只菜喵程序媛  阅读(120)  评论(0)    收藏  举报