一、 需求分析
教师管理主要针对充值教师进行管理,首先开发教师管理模块中的列表功能,包含条件查询、下拉框、日期功能、 数据列表、分页。
二、?教师数据列表
1 nodejs 添加数据列表接口,去node文件,在创建一个teacher.js,创建教师的一个规则:
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test') //和test数据库创建连接
module.exports = mongoose.model('Teacher', { //数据库的规则
jobnumber: {
type: String,
required: true
},
name: {
type: String,
required: true
},
role: {
type: String,
required: true
},
entrydate: {
type: String,
required: true
},
phone: {
type: String,
required: true
}
})
2.让路由管理一下他,在router.js中引入
let Teacher = require('./teacher.js')
3.然后在下面写一个接口,在这之前,先把数据存到数据库中,创建出Teacher这个表,打开mongoose
mongo
use 数据库名称
db.createCollection("teachers")
2(教师) 1(班主任) 工号?? ?姓名?? ?职务?? ?入职时间?? ??? ?电话
db.teachers.insert([{'jobnumber':'001','name':'申秀莲','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'002','name':'周蛋挞','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'003','name':'千瑞珍','role':'2','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'004','name':'吴允熙','role':'2','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'005','name':'夏博士','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'006','name':'杨狗蛋','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'007','name':'麻辣烫','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'008','name':'闵雪雅','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'009','name':'周锡京','role':'2','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'0010','name':'夏恩星','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'0011','name':'下线','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'0012','name':'泡菜小锅','role':'2','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'0013','name':'周周','role':'1','entrydate':'2015-11-11','phone':'15022221111'},{'jobnumber':'0014','name':'下班','role':'1','entrydate':'2015-11-11','phone':'15022221111'}])
db.teachers.find()
4.写一个接口,在router.js中添加获取教师列表方法
// 查询所有---获取教师列表
router.get("/teacher/list", (req, res) => {
Teacher.find({
// token: body.token
}, (err, data) => {
if (err) {
return res.status(500).json({ //如果err,就是错误就是数据库中没有
code: 3000,
flag: false,
message: "服务器后台错误"
})
}
let content = data.length
return res.status(200).json({
"code": 2000,
"flag": true,
"message": "查询成功",
"data": {
content,
"rows": data
} //把数据返回出去
})
})
})
三、?Api 调用接口
1. 在 src/api 下创建 teacher.js , 调用接口代码如下:?
import request from "@/utils/request.js"
export default {
getList() {
return request({
url: "/teacher/list",
method: "get",
})
},
}
2. 在 src\views\teacher\index.vue 中, 添加 JS 代码如下:?
<script>
import teacherApi from "@/api/teacher.js";
export default {
data() {
return { };
},
methods: {
queryList() {
teacherApi.getList().then((res) => {
console.log(res);
});
},
},
created() {
this.queryList();
},
};
</script>
3.点击教师的时候,能拿到下图数据
四、列表模板
?1. 修改 src\views\teacher\index.vue ,编写模板代码:
<template>
<div>
<el-table :data="list" height="400" border style="width: 100%">
<el-table-column type="index" label="序号"> </el-table-column>
<el-table-column prop="jobnumber" label="工号"> </el-table-column>
<el-table-column prop="name" label="姓名"> </el-table-column>
<el-table-column prop="role" label="职务"></el-table-column>
<el-table-column prop="entrydate" label="入职时间"> </el-table-column>
<el-table-column prop="phone" label="电话"> </el-table-column>
</el-table>
</div>
</template>
<script>
import teacherApi from "@/api/teacher.js";
export default {
data() {
return {list: [] };
},
methods: {
queryList() {
teacherApi.getList().then((res) => {
this.list = res.data.data.rows;
});
},
},
created() {
this.queryList();
},
};
</script>
<style scoped>
h1 {
text-align: center;
}
</style>
五、解决CSS问题
之前的页面有些问题,下面改正:
1.去App.vue
<template>
<div id="app" v-cloak>
<router-view />
</div>
</template>
<style >
body,
html {
margin: 0 auto;
width: 100%;
height: 100%;
}
#app {
width: 100%;
height: 100%;
overflow: hidden;
}
[v-cloak] {
display: none;
}
</style>
2.layout.vue:
<template>
<div class="layout">
<app-header />
<app-main />
<app-navbar />
</div>
</template>
<script>
import AppHeader from "./AppHeader/index.vue";
import AppMain from "./AppMain/index.vue";
import AppNavbar from "./AppNavbar/index.vue";
export default {
components: {
AppHeader,
AppMain,
AppNavbar,
},
};
</script>
<style scoped>
.layout {
width: 100%;
height: 100%;
}
</style>
3AppHeader的index.vue:
<style scoped>
.header {
position: absolute;
line-height: 50px;
background-color: cornflowerblue;
padding: 0;
top: 0;
width: 100%;
}
.logo {
vertical-align: middle;
width: 30px;
padding: 0 10px 0 50px;
}
.company {
position:absolute;
color: white;
}
a {
text-decoration: none;
}
.el-dropdown {
float: right;
margin-right: 40px;
cursor: pointer;
color: white;
}
</style>
4.AppNavbar的index.vue:
<style scoped>
.navbar {
position: absolute;
top: 50px;
width: 16%;
left: 0;
background-color: darkseagreen;
overflow: hidden;
}
5.AppMain的index.vue:
<style scoped>
.main {
position: absolute;
top: 50px;
left: 16%;
width: 80%;
padding: 10px;
background-color: pink;
overflow: hidden;
/* z-index: 99; */
}
六、过滤器实现数据转换?
1. 用过滤器在teacher的index.vue中,添加一个规则,然后去组件当中去使用,由于他只需要在当前组件中使用,所以写局部的一个:
<script>
import teacherApi from "@/api/teacher.js";
let roleOptions = [
{ type: "1", name: "班主任" },
{ type: "2", name: "教师" },
];
export default {
data() {
return { list: [] };
},
methods: {
queryList() {
teacherApi.getList().then((res) => {
this.list = res.data.data.rows;
});
},
},
created() {
this.queryList();
},
filters: {
roleFilter(type) {
let obj = roleOptions.find((item) => {
return item.type === type;
});
return obj ? obj.name : null;
},
},
};
</script>
2.修改 模板代码
<el-table-column prop="role" label="职务">
<template slot-scope="scope">
<span>{{ scope.row.role | roleFilter }}</span> ? ? ?
</template>
</el-table-column>
3.在“电话”后添加删除和修改:
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)"
>删除</el-button
>
</template>
</el-table-column>
4.在方法里添加:
handleEdit(index, row) {
console.log(index, row);
},
handleDelete(index, row) {
console.log(index, row);
},
七、分页功能实现
1.为列表数据添加分页功能,使用分页组件完成分页功能,去node文件的router.js中,添加分页模拟接口
// 分页
router.post("/teacher/list", (req, res) => {
let page = req.body.page || 1; //页数
let size = req.body.size || 10; //一页显示多少条
let searchMap = req.body.searchMap || {}
console.log(page, size, searchMap);
})
2.?Api 调用接口,修改 src\api 下的 teacher.js , 在导出的默认对象中,增加分页查询方法?
search(page, size, searchMap) {
return request({
url: "/teacher/list",
method: "post",
data: {
page,
size,
searchMap
}
})
}
3.在 src\views\teacher\index.vue 中,?在“操作”之后,添加 JS 代码如下:
<el-pagination
@size-change="getList"
@current-change="getList"
:current-page="currentPage4"
:page-sizes="[5, 10, 15, 20]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
4.在export?default的data里:
data() {
return { list: [], currentPage4: 1, pageSize: 10,total:0,searchMap:{} };
}
5.声明分页属性, 调用 getList 改为调用 search 方法,在methods和created里,把queryList()?方法注释上,?写上getList方法:
getList() {
teacherApi.search(this.currentPage4,this.pageSize,this.searchMap).then(res=>{
let resArr=res.data
this.total=resArr.data.content
this.list=resArr.data.rows
}).catch(err=>{
console.log("err",err);
});
},
created() {
// this.queryList();
this. getList()
},
6.在node终端能拿到页码数,然后在node的router.js中:
// 分页
router.post("/teacher/list", (req, res) => {
let page = req.body.page || 1; //页数
let size = req.body.size || 10; //一页显示多少条
let searchMap = req.body.searchMap || {}
// console.log(page, size, searchMap);
let obj = {}
Teacher.find(obj, (err, data) => {
if (err) {
return res.status(500).json({
code: 3000,
flag: false,
message: "服务器后台错误"
})
}
let content = data.length
//skip跳过多少条,limit查询多少个,exec当前面的代码,执行完毕后,产生的回调
Teacher.find(obj).skip((page - 1) * parseInt(size)).limit(parseInt(size)).exec((err, data) => {
if (err) {
return res.status(500).json({
code: 3000,
flag: false,
message: "服务器后台错误"
})
}
return res.status(200).json({
"code": 2000,
"flag": true,
"message": "查询成功",
"data": {
content,
"rows": data
}
})
})
})
})
7.运行效果:
八、解决动态页码和当前页?
问题:上面当你改变页码后,请求URL的 {page}/{size} 不会变,一直是初始值,那是因为没有监听到改变的值。
解决:1. 将 @size-change 和 @current-change 事件处理的函数名改变为 handleSizeChange 和handleCurrentChange
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage4"
2. 在 methods 中添加函数,
handleSizeChange(val) {
this.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.currentPage = val;
this.getList();
},
3. 测试可通过。
九、条件查询实现-----在列表上方添加查询功能。
1. 修改 src\views\teacher\index.vue ,增加条件查询模板代码:?
|