本文已参与「新人创作礼」活动,一起开启掘金创作之路
前端部分
1、创建vue初始化项目
打开终端,切换到要创建项目的目录,输入下面的语句,然后根据自己的需要进行选择
(install vue-router一定要选择yes,会免去后面很多不必要的麻烦,use eslint这一项选择了yes的话会帮你代码规范,你的代码少了一个空格他都会给你揪出来,我就直接选no了)
vue init webpack 项目名
创建完成后目录结构如下:
在src下新建一个pages文件,并添加四个vue文件
2、设置路由跳转
在router下的index.js中添加语句,完整代码如下:
import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/pages/Home'
import Find from '@/pages/Find'
import One from '@/pages/One'
import Two from '@/pages/Two'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: '主页',
component: Home
},
{
path: '/find',
name: '查询学生',
component: Find
},
{
path: '/One',
name: '添加学生',
component: One
},
{
path: '/Two',
name: '修改学生',
component: Two
}
]
})
3、导入elementUI,axios
在终端输入以下语句来安装elementUI和axios(解决跨域的问题)
npm i element-ui -S
npm install axios -S
在main.js中添加语句
import './plugins/axios'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI)
完整代码如下:
import Vue from 'vue'
import App from './App'
import router from './router'
import './plugins/axios'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.config.productionTip = false
Vue.use(ElementUI)
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
在elementUI中选择需要的组件添加到自己的代码中
找到自己需要的布局容器后点击显示代码,将代码复制App.vue中,根据自己的需要做一点修改
App.vue完整代码如下:
<template>
<div id="app">
<el-container style="height: 500px; border: 1px solid #eee">
<el-aside width="200px" style="background-color: rgb(238, 241, 246)">
<el-menu router>
<el-submenu >
<template slot="title"><i class="el-icon-message"></i>学生管理</template>
//从我们设置的路由路径中遍历,动态显示在左侧的导航栏中
<el-menu-item v-for="item in $router.options.routes" :key="item" :index="item.path" :class="$route.path==item.path?'is-active':''">{{item.name}}</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<el-container>
<el-header style="text-align: right; font-size: 12px"></el-header>
<el-main>
//这里加上了路由才能渲染出页面
<router-view/>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
export default {
name: 'App',
data() {}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
.el-header {
background-color: #B3C0D1;
color: #333;
line-height: 60px;
}
.el-aside {
color: #333;
}
</style>
编写Home.vue主页面
这里就随便写一点东西显示在主页面上,完整代码如下:
<template>
<div>
this is home
</div>
</template>
<script>
export default {
name: 'Home'
}
</script>
<style>
</style>
编写Find.vue查询页面
找一个table表格组件,复制到Find.vue文件中,根据自己的需要做一点修改
完整Find.vue代码如下:
<template>
<div>
<el-table :data="student" border style="width: 100%">
<el-table-column fixed prop="studentId" label="学号" width="120"></el-table-column>
<el-table-column prop="studentName" label="姓名" width="120"></el-table-column>
<el-table-column prop="studentSex" label="性别" width="120"></el-table-column>
<el-table-column prop="studentClass" label="班级" width="120"></el-table-column>
<el-table-column prop="studentPhone" label="联系方式" width="120"></el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template slot-scope="scope">
<el-button @click="edit(scope.row)" type="text" size="small">修改</el-button>
<el-button @click="deleteStudent(scope.row)" type="text" size="small">删除</el-button>
</template>
</el-table-column>
</el-table>
//分页功能的实现
<el-pagination background layout="prev, pager, next" :page-size="2" :total="10" @current-change="page"></el-pagination>
</div>
</template>
<script>
export default {
name: 'Find',
methods: {
edit(row) {
this.$router.push({
path: '/Two',
//点击修改时,把studentId传给修改页面
query: {
studentId: row.studentId
}
})
},
deleteStudent(row){
const _this =this
//调用后端的接口
axios.post('http://localhost:8080/delete/'+row.studentId).then(function(resp){
_this.$alert('delete!!!' , 'message',{
confirmButtonText: 'yes',
//回调函数,操作完成后刷新该页面
callback: action => {
window.location.reload()
}
})
})
},
page(currentPage){
alert(currentPage)
}
},
data(){
return{
student:[]
}
},
//进入这个页面后自动加载我们生成的数据
created(){
const _this = this
//调用后端的接口
axios.get('http://localhost:8080/getAll').then(function(resp){
_this.student = resp.data
})
}
}
</script>
<style scoped>
</style>
编写One.vue添加页面
找一个表单组件,复制到One.vue文件中,根据自己的需要做一点修改,这个表单验证组件还可以进行数据的检验
完整One.vue代码如下:
<template>
<div>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" >
<el-form-item label="学号" prop="studentId">
<el-input v-model="ruleForm.studentId"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="studentName">
<el-input v-model="ruleForm.studentName"></el-input>
</el-form-item>
<el-form-item label="性别" prop="studentSex">
<el-input v-model="ruleForm.studentSex"></el-input>
</el-form-item>
<el-form-item label="班级" prop="studentClass">
<el-input v-model="ruleForm.studentClass"></el-input>
</el-form-item>
<el-form-item label="联系方式" prop="studentPhone">
<el-input v-model="ruleForm.studentPhone"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
<el-button @click="test">test</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'One',
data() {
return {
ruleForm: {
studentId: '',
studentName: '',
studentSex: '',
studentClass: '',
studentPhone: ''
},
//校验规则
rules: {
studentId: [
{ required: true, message: '请输入学号', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
studentName: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
],
studentSex: [
{ required: true, message: '请输入性别', trigger: 'blur' }
],
studentClass: [
{ required: true, message: '请输入班级', trigger: 'blur' }
],
studentPhone: [
{ required: true, message: '请输入电话', trigger: 'blur' }
],
}
};
},
methods: {
submitForm(formName) {
const _this = this
this.$refs[formName].validate((valid) => {
if (valid) {
alert('submit!');
//调用后端的接口
axios.post('http://localhost:8080/addStudent',this.ruleForm).then(function(resp){
_this.$alert('add!!!' , 'message',{
confirmButtonText: 'yes',
//回调函数,操作完成后自动转入查找页面
callback: action => {
_this.$router.push('/Find')
}
})
})
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
test(){
console.log(this.ruleForm)
}
}
}
</script>
<style>
</style>
编写Two.vue修改页面
逻辑与One.vue页面相似,完整代码如下:
<template>
<div>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" >
<el-form-item label="学号" prop="studentId">
<el-input v-model="ruleForm.studentId"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="studentName">
<el-input v-model="ruleForm.studentName"></el-input>
</el-form-item>
<el-form-item label="性别" prop="studentSex">
<el-input v-model="ruleForm.studentSex"></el-input>
</el-form-item>
<el-form-item label="班级" prop="studentClass">
<el-input v-model="ruleForm.studentClass"></el-input>
</el-form-item>
<el-form-item label="联系方式" prop="studentPhone">
<el-input v-model="ruleForm.studentPhone"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">修改</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
<el-button @click="test">test</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'two',
data() {
return {
ruleForm: {
studentId: '',
studentName: '',
studentSex: '',
studentClass: '',
studentPhone: ''
},
rules: {
studentId: [
{ required: true, message: '请输入学号', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
studentName: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
],
studentSex: [
{ required: true, message: '请输入性别', trigger: 'blur' }
],
studentClass: [
{ required: true, message: '请输入班级', trigger: 'blur' }
],
studentPhone: [
{ required: true, message: '请输入电话', trigger: 'blur' }
],
}
};
},
created(){
const _this = this
//调用后端接口,获取查找页面点击修改时传过来的studentId
axios.get('http://localhost:8080/findById/'+this.$route.query.studentId).then(function(resp){
_this.ruleForm = resp.data
})
},
methods: {
submitForm(formName) {
const _this = this
this.$refs[formName].validate((valid) => {
if (valid) {
_this.$alert('successbefore')
_this.$alert(this.ruleForm)
//调用后端接口
axios.post('http://localhost:8080/updateStudent',this.ruleForm).then(function(resp){
_this.$alert('change!!!' , 'message',{
confirmButtonText: 'yes',
//回调函数,执行完毕返回查询页面
callback: action => {
_this.$router.push('/Find')
}
})
})
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
test(){
console.log(this.ruleForm)
}
}
}
</script>
<style>
</style>
四、效果展示
1、首页
2、查询
3、添加
自动校验功能
添加成功
4、修改
点击修改表单会自动添加相应的信息
通过这个案例能够大致体会到前后端分离究竟是怎么一回事了