复习
- *小目标列表
- 新增
- 按键修饰符绑定enter键按下
- 通过v-model获取到输入的待办事项的内容
- 转换成一个待办列表项,放入待办列表中
- 删除
- 在组件内部点击事件,触发一个_自定义事件_del,附带一个待办事项
- 通过事件冒泡,将要删除的待办事项传递给了外部,外部监听自定义事件del,分派给处理函数,附带的待办事项就是处理函数的参数
- 处理函数内部,删除待办列表中的该待办事项
- 分状态列表展示
- 计算属性,根据选择的状态,筛选展示的数据 Array.filter(筛选函数)
- 页面展示的是计算属性
- 分状态统计
- 计算属性:根据状态筛选计算
- 勾选改变状态
- 在组件内部更新状态
- 修改内容
- html属性 contenteditable
- 获得焦点 focus 存原始数据
- 失去焦点 blur 保存修改
- 按键esc 重置数据为原始数据
- Vue编程的一大特点:做数据处理,不涉及DOM操作
- 新增
- 插槽 ```html
Vue.component(‘submit-button’,{ template:`
`
})
Vue.component(‘base-layout’,{ template:`
一个组件对外的接口有哪些?
- props 属性
- 自定义事件
- slot 插槽
3. elementui的使用
- 导入链接:
- 样式
- vue.js
- elementui.js
- 看文档
- 示例代码
- 属性 事件 slot method 文档
- 布局 24栏
- el-row el-col
- span属性 offset偏移
- 响应式 xs sm md lg xl
- container
- el-container el-header el-main el-footer el-aside
- form table 走马灯 dialog message ....
Q&A:
1. 前后端传值
1. 使用get方法,{params:{k:v}}
1. 使用post方法,跟对象 直接用this.form @RequestBody接受
1. 回调函数用箭头函数,解决this绑定问题,this指向vue实例
1. 回调函数的返回值的结构 response.data<=>返回的result
2. 格式化 状态 日期
```html
<!-- 格式化器 -->
<el-table-column
prop="state"
:formatter="stateFormatter"
label="状态">
</el-table-column>
methods:{
stateFormatter(row, column, cellValue, index){
switch(cellValue){
case 'wait': return '待审核';
case 'normal': return '审核通过';
case 'fail': return '审核失败';
default : console.error("错误的状态"+cellValue+",无法格式化");
}
},
..
}
spring:
mvc:
format:
date-time: yyyy-MM-dd HH:mm:ss
jackson:
date-format: yyyy-MM-dd HH:mm:ss
- 根据条件显示按钮
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- 引入样式 -->
<link
rel="stylesheet"
href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
/>
<title>Document</title>
</head>
<body>
<div id="app">
<el-container>
<el-header>
<el-menu default-active="1" class="el-menu-demo" mode="horizontal">
<el-menu-item index="1">处理中心</el-menu-item>
<el-submenu index="2">
<template slot="title">我的工作台</template>
<el-menu-item index="2-1">选项1</el-menu-item>
<el-menu-item index="2-2">选项2</el-menu-item>
<el-menu-item index="2-3">选项3</el-menu-item>
<el-submenu index="2-4">
<template slot="title">选项4</template>
<el-menu-item index="2-4-1">选项1</el-menu-item>
<el-menu-item index="2-4-2">选项2</el-menu-item>
<el-menu-item index="2-4-3">选项3</el-menu-item>
</el-submenu>
</el-submenu>
<el-menu-item index="3" disabled>消息中心</el-menu-item>
<el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item>
</el-menu>
</el-header>
<el-main>
<el-form :inline="true" :model="searchForm" class="demo-form-inline">
<el-form-item label="教师姓名">
<el-input v-model="searchForm.teacherName" placeholder="教师姓名"></el-input>
</el-form-item>
<el-form-item label="审核状态">
<el-select clearable v-model="searchForm.state" placeholder="审核状态">
<el-option label="待审核" value="wait"></el-option>
<el-option label="审核通过" value="normal"></el-option>
<el-option label="审核失败" value="fail"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button type="success" @click="addTeacherDialogVisible=true" icon="el-icon-plus" circle></el-button>
</el-form-item>
</el-form>
<el-row>
<el-col >
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="teacherId"
label="教师ID"
width="180">
</el-table-column>
<el-table-column
prop="teacherName"
label="教师姓名"
width="180">
</el-table-column>
<!-- 格式化器 -->
<el-table-column
prop="state"
:formatter="stateFormatter"
label="状态">
</el-table-column>
<el-table-column
prop="email"
label="邮箱">
</el-table-column>
<el-table-column
label="操作">
<template slot-scope='scope'>
<el-button v-if='scope.row.state=="wait"' @click="audit(scope.row,true)" type="text" size="small">审核通过</el-button>
<el-button v-if='scope.row.state=="wait"' @click="audit(scope.row,false)" type="text" size="small">审核失败</el-button>
<el-button v-if='scope.row.state=="normal"' @click="fire(scope.row)" type="text" size="small">开除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
layout="prev, pager, next,sizes"
:total="page.total"
:current-page='page.current'
:page-size='page.size'
@current-change='search'
>
</el-pagination>
</el-col>
</el-row>
</el-main>
</el-container>
<el-dialog title="新增讲师" :visible.sync="addTeacherDialogVisible">
<el-form :model="addTeacherForm">
<el-row>
<el-col :span='15'>
<el-form-item label="讲师姓名" label-width="180px">
<el-input v-model="addTeacherForm.teacherName" autocomplete="off"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span='15'>
<el-form-item label="生日" label-width="180px">
<el-date-picker
v-model="addTeacherForm.birthday"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择生日">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="email" label-width="180px">
<el-input v-model="addTeacherForm.email" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addTeacherDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="addTeacher">新增</el-button>
</div>
</el-dialog>
</div>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
let app = new Vue({
el:'#app',
data:{
page:{
total:0,
current:1,
size:10
},
searchForm:{
teacherName:'',
state:''
},
formLabelWidth:"80px",
addTeacherForm: {
teacherName: '',
email:'',
birthday:''
},
addTeacherDialogVisible:false,
tableData:[]
},
mounted(){
this.search(1);
},
methods:{
addTeacher(){
console.log(this.addTeacherForm)
axios.post('http://localhost:8000/addNewTeacher',this.addTeacherForm)
.then(resp=>{
this.$message({message:"新增成功",type:"success"});
this.search(1);
this.addTeacherDialogVisible=false;
}).catch(resp=>{
this.$message({message:"操作失败",type:"warning"});
this.addTeacherDialogVisible=false;
})
},
stateFormatter(row, column, cellValue, index){
switch(cellValue){
case 'wait': return '待审核';
case 'normal': return '审核通过';
case 'fail': return '审核失败';
default : console.error("错误的状态"+cellValue+",无法格式化");
}
},
audit(row,pass){
console.log(row,pass);
axios.post('http://localhost:8000/audit',{"teacherId":row.teacherId,"pass":pass})
.then(resp=>{
this.$message({message:"审核操作完成",type:"success"});
this.search(1);
}).catch(resp=>{
this.$message({message:"操作失败",type:"warning"});
})
},
fire(row){
},
handleClick(row){
console.log(row);
this.dialogFormVisible=true;
// this.$message({message:'你查看成功了',type:'warning'});
},
search(current){
//发请求到后端,搜索数据
let param = this.searchForm;
param.pageIndex=current;
param.pageSize=this.page.size;
axios.get('http://localhost:8000/queryTeacher',{
params:param
})
.then(resp=>{
if(resp.status=200&&resp.data.success){
let data = resp.data.data;
this.tableData=data.records;
//将后端返回的数据绑定到分页条上
this.page.total=data.total;
this.page.current=data.current;
this.page.size=data.size;
}else{
this.$message({
message:'查询失败,'+resp.data.message,
type:'warning'
})
}
})
.catch(error=>{
this.$message({
message:'查询失败,'+error.message,
type:'error'
})
})
}
}
});
</script>
</body>
</html>
分页
<el-pagination
background
layout="prev, pager, next,sizes"
:total="page.total" 总条数
:current-page='page.current' 当前页
:page-size='page.size' 页容量
@current-change='search' 当前页码改变时间,回传改变后的页码
>
</el-pagination>
search(current){
//发请求到后端,搜索数据
let param = this.searchForm;
param.pageIndex=current;
param.pageSize=this.page.size;
axios.get('http://localhost:8000/queryTeacher',{
params:param
})
.then(resp=>{
if(resp.status=200&&resp.data.success){
let data = resp.data.data;
this.tableData=data.records;
//将后端返回的数据绑定到分页条上
this.page.total=data.total;
this.page.current=data.current;
this.page.size=data.size;
}else{
this.$message({
message:'查询失败,'+resp.data.message,
type:'warning'
})
}
})
.catch(error=>{
this.$message({
message:'查询失败,'+error.message,
type:'error'
})
})
}
}
JS发展
nodejs js运行时环境 让js脱离浏览器,在电脑上运行
- 后端代码,创建httpserver,接受http请求,并且响应;可以访问数据库;可以创建文件读取文件
- 框架 express / sequelize
- 桌面端应用程序
- 框架 electron
- 移动端应用程序
- react-native
- vue -> uniapp / weex
npm nodejs 自带的包管理器,功能类似于maven的依赖管理
webpack 打包工具,类似于Maven的构建流程
html => pug模板,简化html的编写
css => sass / less css拓展语言
js => typescript / coffeescript 升级
安装Node环境
- nodejs 自带npm
https://nodejs.org/zh-cn/
安装,下一步,下一步
- 测试
node -v
npm -v
- 编写一个例子
# 编写一个helloworld.js,内容如下
console.log("hello world");
# 通过node命令运行
node helloworld.js
```javascript var mysql = require(‘mysql’); var http = require(‘http’);npm init
npm install mysql
# 编写index.js,内容如下
# 运行
node index.js
# 访问 localhost:8888 即可在控制台看到数据
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
var connection = mysql.createConnection({
host: 'localhost',
port:3306,
user: 'root',
password: 'root123',
database: 'edu_56'
});
connection.connect();
connection.query('SELECT * from edu_teacher', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
// 发送响应数据 "Hello World"
response.end(results);
});
}).listen(8888);
// 终端打印如下信息 console.log(‘Server running at http://127.0.0.1:8888/‘);
4. 安装taobao的npm源
```bash
npm i -g cnpm --registry=https://registry.npm.taobao.org
vue-cli
安装
cnpm install -g @vue/cli
vue -V
创建项目
# cmd
vue create my-project
# 界面
vue ui
cd vue56
npm run serve
# 访问 IP:8080 看到界面
作业
- 完成讲师管理练习,新增一个修改讲师的功能,点击修改则弹窗,修改完成后刷新列表
- 创建并运行一个vue脚手架项目