CGB2107-Day08-前后端项目实现
1. Axios 学习(重点知识)
1.1 Axios-GET/DELETE
1.1.1 请求方式说明
- http://localhost:8090/findUser?id=xxx&name=xxx
- 利用对象的方式进行数据封装 axios.get(url,{params: 封装的对象})
- RestFul的参数提交方式.
1.1.2 Axios-GET-RestFul
1.1.2.1 编辑页面JS
/*
案例三: 利用restFul实现数据获取
需求: 根据name/sex查询数据
模板字符串: 语法ES7的写法 一对反引号进行数据拼接,通过${} 获取变量
*/
let name = "黑熊精"
let sex = "男"
//let url3 = "http://localhost:8090/axios/user/"+name+"/"+sex
let url3 = `http://localhost:8090/axios/user/${name}/${sex}`
axios.get(url3)
.then(function(promise){
console.log(promise.data)
})
1.1.2.2 URL请求路径
1.1.2.3 编辑AxiosController
/**
* 业务说明: 接收restFul请求
* URL:http://localhost:8090/axios/user/${name}/${sex}
* 参数: name/sex
* 结果: List<User>
*/
@GetMapping("/user/{name}/{sex}")
public List<User> findUserByNS(User user){
return userService.findUserByNS(user);
}
1234567891011
1.1.2.4 编辑AxiosService
1.UserService接口
List<User> findUserByNS(User user);
2.UserServiceImpl实现类
@Override
public List<User> findUserByNS(User user) {
return userMapper.findUserByNS(user);
}
1.1.2.5 编辑UserMapper
@Select("select * from demo_user where name=#{name} and sex=#{sex}")
List<User> findUserByNS(User user);
1.2 Axios-POST/PUT
1.2.1 编辑JS
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Post请求练习</title>
</head>
<body>
<h1>Ajax项目前测试-POST</h1>
<!-- 导入js jar包 -->
<script src="../js/axios.js"></script>
<script>
/**
* 业务: 实现post请求入库操作 实现入库用户
* 知识点:
* 1.post请求中的参数 axios.post(url,user)
*
*/
let url = "http://localhost:8090/axios/saveUser"
let user = {
name: "国庆快乐",
age: 72,
sex: "女"
}
axios.post(url,user)
.then(function(promise){
console.log(promise.data)
})
</script>
</body>
</html>
1.2.2 检查请求路径
参数在http协议中传输时,变成了json串.
1.2.3 编辑AxiosController
/**
* 业务:实现用户的新增
* URL: http://localhost:8090/axios/saveUser
* 参数: {"name":"国庆快乐","age":72,"sex":"女"} JSON串
* 返回值: String 新增成功
* 知识点: post请求传递对象时,传递的数据是一个json串.不能直接为User对象赋值.
* 解决方案:
* 1.对象转化为JSON @ResponseBody
* 2.JSON转化为对象 @RequestBody
*
*/
@PostMapping("/saveUser")
public String saveUser(@RequestBody User user){
System.out.println(user);
userService.saveUser(user);
return "用户入库成功!!!";
}
1.2.4 编辑AxiosService
//框架整合mybatis之后,数据自动提交.
@Override
public void saveUser(User user) {
userMapper.saveUser(user);
}
12345
1.2.5 编辑AxiosMapper
@Insert("insert into demo_user value(null,#{name},#{age},#{sex})")
void saveUser(User user);
1.2.6 Axios简化操作
1.2.6.1 指定请求的前缀
说明: 由于项目中会有大量的Ajax请求,如果每个请求将路径写全,则较为繁琐.不方便扩展
例子:
1.http://www.jd.com/axios/saveUser
2.http://localhost:8090/axios/getUser
解决方案:
/* 指定公共的请求前缀 */
axios.defaults.baseURL = "http://localhost:8090"
axios.post("/axios/saveUser",user)
.then(function(promise){
console.log(promise.data)
})
1.2.6.2 async-await 关键字
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>简化</title>
</head>
<body>
<h1>async-await写法</h1>
<!-- 导入js jar包 -->
<script src="../js/axios.js"></script>
<script>
//1.指定请求前缀
axios.defaults.baseURL = "http://localhost:8090"
/**
* 需求: 要求ajax请求在一行完成!
* 解决方案: async-await
* 语法说明:
* 1.async 必须标识函数方法
* 2.await 必须标识ajax请求
* 实际意义:
* 解决了ajax中的头号难题, "回调地狱"问题
*/
//1.定义函数
async function getUser(){
let promise = await axios.get("/getUser")
console.log(promise.data)
//解构赋值 固定写法 死记硬背
let {data: result} = await axios.get("/getUser")
console.log(result)
}
//2.调用函数
getUser()
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>简化</title>
</head>
<body>
<h1>async-await写法</h1>
<!-- 导入js jar包 -->
<script src="../js/axios.js"></script>
<script>
//1.指定请求前缀
axios.defaults.baseURL = "http://localhost:8090"
/**
* 需求: 要求ajax请求在一行完成!
* 解决方案: async-await
* 语法说明:
* 1.async 必须标识函数方法
* 2.await 必须标识ajax请求
* 实际意义:
* 解决了ajax中的头号难题, "回调地狱"问题
*/
//1.定义函数
async function getUser(){
let promise = await axios.get("/getUser")
console.log(promise.data)
//解构赋值 固定写法 死记硬背
let {data: result} = await axios.get("/getUser")
console.log(result)
}
//2.调用函数
getUser()
</script>
</body>
</html>
1.3 前后端项目调用案例
1.3.1 案例功能说明
1.3.2 用户列表展现
1.3.2.1 需求说明
要求:用户只要一访问页面,就要发起Ajax请求,访问后端服务器获取用户列表数据.
1.3.2.2 编辑页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户列表展现案例</title>
</head>
<body>
<div id="app">
<div align="center">
<h3 align="center">用户新增</h3><br>
<p>
用户名称: <input type="text" name="name"/>
用户年龄: <input type="text" name="age"/>
用户性别: <input type="text" name="sex"/>
<button>新增</button>
</p>
</div>
<hr />
<div align="center">
<h3 align="center">用户修改操作</h3><br>
<p>
用户ID号: <input type="text" name="id" disabled/>
用户名称: <input type="text" name="name"/>
用户年龄: <input type="text" name="age"/>
用户性别: <input type="text" name="sex"/>
<button>修改</button>
</p>
</div>
<h1 align="center">用户列表展现案例</h1>
<table align="center" border="1px" width="80%">
<tr align="center">
<td>ID编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>操作</td>
</tr>
<tr align="center" v-for="user in userList">
<td v-text="user.id"></td>
<td v-text="user.name"></td>
<td v-text="user.age"></td>
<td v-text="user.sex"></td>
<td>
<button>修改</button>
<button>删除</button>
</td>
</tr>
</table>
</div>
<script src="../js/axios.js"></script>
<script src="../js/vue.js"></script>
<script>
//为axios执行前缀
axios.defaults.baseURL="http://localhost:8090"
const app = new Vue({
el: "#app",
data: {
//3.定义数据列表
userList: []
},
methods: {
//2.定义获取列表数据的函数
async getUserList(){
let {data: result} = await axios.get("/axios/findAll")
//console.log(result)
//将ajax返回值传递给Vue
this.userList = result
}
},
mounted(){
//1利用生命周期函数调用getUser函数
this.getUserList()
}
})
</script>
</body>
</html>
1.3.2.3 编辑AxiosController
/**
* 需求:获取user全部列表
* URL: /axios/findAll
* 参数: 没有
* 返回值: List<User>
*/
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
1.3.2.4 页面效果展现
1.3.3 用户新增
1.3.3.1 编辑页面html
<div align="center">
<h3 align="center">用户新增</h3><br>
<p>
<!-- 看到input框架 第一时间想到双向数据绑定 -->
用户名称: <input type="text" name="name" v-model="addUser.name"/>
用户年龄: <input type="text" name="age" v-model="addUser.age" />
用户性别: <input type="text" name="sex" v-model="addUser.sex" />
<button @click="addUserBtn">新增</button>
</p>
</div>
- JS封装属性
- JS方法实现
1.3.4 用户修改
1.3.4.1 数据回显
- 编辑按钮点击事件
- 定义更新对象
1.3.4.2 数据更新
- 添加修改点击事件
- 编辑修改函数
1.3.5 修改后端实现
1.3.5.1 编辑AxiosController
/**
* 业务: 实现用户更新
* URL: /axios/updateUser
* 参数: json串
* 返回值: 提示信息
*/
@PutMapping("updateUser")
public String updateUser(@RequestBody User user){
userService.updateUser(user);
return "更新操作成功!";
}
1.3.5.2 编辑UserService
1.定义接口
2.编辑实现类
@Override
public void updateUser(User user) {
userMapper.updateUser(user);
}
12345
1.3.5.3 编辑UserMapper
@Update("update demo_user set name=#{name},age=#{age},sex=#{sex} where id=#{id}")
void updateUser(User user);
12
2. 京淘项目前端项目搭建
2.1 node.js 安装
说明: 根据博客文章安装node.js/ui工具.最终的效果如图即可
2.2 导入前端项目
2.2.1 前端资源文件
注意事项: 下载的文件一定是一个zip包文件.
路径:
2.2.2 解压文件
将资源文件的zip包 解压到第三阶段的课程项目路径下.
2.2.3 导入项目
2.2.4 项目运行
项目最终效果