基于Vue+ElementUI+MySQL+Express的学生管理系统(3)

3.搭建学生考试信息的前端页面

1.在E:\vue\shiyan9目录下用cmd打开命令窗口。输入命令vue init webpack score-manage,创建一个基于webpack模板的项目。

 

图15 创建一个新的vue的脚手架的项目

2.执行cd score-manage,进入目录包下。下载依赖包。命令如下,
npm install。

 

图16 安装依赖包

3.在命令行下输入npm run dev,编译并运行刚刚创建的score-manage项目。

 

图17 编译并运行新建的项目score-manage

访问:http://localhost:8080查看创建的项目的主页。

图18 初始化项目的首页

4.安装elment-ui和axious的依赖包,在score-manage目录下执行命令,npm install element-ui –S和npm install axios –S。

 

图19 安装element和axios的依赖包

5.用VSCode打开刚刚新建的项目,修改src/main.js将下载的element-ui引入。

import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false
Vue.use(ElementUI)
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App },
  render: h => h(App)
}) 

6.删除App.vue自带的代码和HelloWorld.vue。

此时App.vue的代码如下。

<template>
  <div id="app">
    <router-view/>
  </div>
</template>
 
<script>
export default {
  name: 'App'
}
</script>
<style>
</style>

7.src下创建“mixins”的文件夹,并创建index.js公共辅助js文件。代码如下。

export const mixin = {
    methods: {
 
        // 显示提示信息
        notify(title, type) {
            this.$notify({
                title: title,
                type: type
            })
        },
        getUrl(url) {
            return `http://127.0.0.1:8888${url}`
        },
        // 获取要删除列表的id
        handleDelete(id) {
            this.idx = id
            this.delVisible = true
        },
        // 获取批量要删除的列表
        handleSelectionChange(val) {
            this.multipleSelection = val
        },
        // 批量删除
        delAll() {
            for (let item of this.multipleSelection) {
                this.handleDelete(item.stuId)
                this.deleteRow(item.stuId)
            }
            this.multipleSelection = []
        }
 
    }
}

8.在components新建页面scorePage.vue。并输入如下代码。

<template>
    <div class="table">
  <div class="container">
    <h1>学生考试信息管理</h1>
        <div class="handle-box">
            <el-button type="danger" size="mini" class="handle-del mr10" @click="delAll">批量删除</el-button>
             <el-button type="success" size="mini" @click="centerDialogVisible = true">添加学生考试信息</el-button>
            <el-input v-model="select_word" size="mini" placeholder="输入关键词自动筛选" class="handle-input mr10"></el-input>
        </div>
        <el-table size="mini" border style="width: 100%" height="500px" :data="data"
         @selection-change="handleSelectionChange">
         <!-- 选择框 -->
          <el-table-column type="selection" width="60" align="center"></el-table-column>
          <!-- 序号 -->
          <el-table-column  label="序号" width="79" align="center">
            <template slot-scope="scope">
              <div>{{scope.$index+1}}</div>
            </template>
          </el-table-column>
          <!-- 准考证号 -->
          <el-table-column prop="stuId" label="准考证号" width="175" align="center">
            <template slot-scope="scope">
              <div>{{scope.row.stuId}}</div>
            </template>
          </el-table-column>
          <!-- 学生姓名 -->
          <el-table-column prop="stuName" label="学生姓名" width="175" align="center">
            <template slot-scope="scope">
              <div>{{scope.row.stuName}}</div>
            </template>
          </el-table-column>
          <!-- 语文成绩 -->
          <el-table-column prop="ChineseScore" label="语文成绩" width="175" align="center">
            <template slot-scope="scope">
              <div>{{scope.row.ChineseScore }}</div>
            </template>
          </el-table-column>
        <!-- 英语成绩 -->
          <el-table-column prop="EnglishScore" label="英语成绩" width="175" align="center">
            <template slot-scope="scope">
                <div>{{scope.row.EnglishScore}}</div>
            </template>
          </el-table-column>
            <!-- 数学成绩 -->
            <el-table-column prop="MathScore" label="数学成绩" width="175" align="center">
            <template slot-scope="scope">
                <div>{{scope.row.MathScore}}</div>
            </template>
          </el-table-column>
          <!-- 理综成绩 -->
          <el-table-column prop="ScienceScore" label="理综成绩" width="175" align="center">
            <template slot-scope="scope">
              <div>{{scope.row.ScienceScore }}</div>
            </template>
          </el-table-column>
 
          <!-- 删除和修改操作 -->
          <el-table-column label="操作" width="200" align="center">
            <template slot-scope="scope">
                <!-- 编辑按钮 -->
              <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
              <!-- 根据学号进行删除 -->
              <el-button size="mini" type="danger" @click="handleDelete(scope.row.stuId)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- 分页 -->
        <div class="pagination">
          <el-pagination
            @current-change="handleCurrentChange"
            background 
            layout="total, prev, pager, next"
            :current-page="currentPage"
            :page-size="pageSize"
            :total="tableData.length">
          </el-pagination>
        </div>
      </div>
      <!-- 添加考生信息 -->
      <el-dialog title="添加学生考试信息" :visible.sync="centerDialogVisible" width="400px" center>
        <el-form
          :model="registerForm"
          status-icon
          ref="registerForm"
          label-width="80px"
          class="demo-ruleForm"
          >
          <el-form-item prop="stuId" label="准考证号" size="mini">
            <el-input v-model="registerForm.stuId" placeholder="准考证号"></el-input>
          </el-form-item>
          <el-form-item prop="stuName" label="学生姓名" size="mini">
            <el-input v-model="registerForm.stuName" placeholder="学生姓名"></el-input>
          </el-form-item>
          <el-form-item prop="ChineseScore" label="语文成绩" size="mini">
            <el-input v-model="registerForm.ChineseScore" placeholder="语文成绩"></el-input>
          </el-form-item>
          <el-form-item prop="EnglishScore" label="英语成绩" size="mini">
            <el-input v-model="registerForm.EnglishScore" placeholder="英语成绩"></el-input>
          </el-form-item>
          <el-form-item prop="MathScore" label="数学成绩" size="mini">
            <el-input v-model="registerForm.MathScore" placeholder="数学成绩"></el-input>
          </el-form-item>
          <el-form-item prop="ScienceScore" label="理综成绩" size="mini">
            <el-input v-model="registerForm.ScienceScore" placeholder="理综成绩"></el-input>
          </el-form-item>
        
        </el-form>
        <span slot="footer" class="dialog-footer">
          <el-button size="mini" @click="centerDialogVisible = false">取 消</el-button>
          <el-button type="primary" size="mini" @click="addScore">确 定</el-button>
        </span>
      </el-dialog>
      <!-- 编辑弹出框 -->
      <el-dialog title="编辑学生考试信息" :visible.sync="editVisible" width="400px" center>
        <el-form ref="form" :model="form" label-width="70px">
       
          <el-form-item label="准考证号" size="mini">
            <el-input v-model="form.stuId" disabled></el-input>
          </el-form-item>
          <el-form-item label="学生姓名" size="mini">
            <el-input v-model="form.stuName"></el-input>
          </el-form-item>
          
          <el-form-item label="语文成绩" size="mini">
            <el-input v-model="form.ChineseScore"></el-input>
          </el-form-item>
          <el-form-item label="英语成绩" size="mini">
            <el-input v-model="form.EnglishScore"></el-input>
          </el-form-item>
          
          <el-form-item  label="数学成绩" size="mini">
            <el-input v-model="form.MathScore"></el-input>
          </el-form-item>
          <el-form-item  label="理综成绩" size="mini">
            <el-input v-model="form.ScienceScore"></el-input>
          </el-form-item>
        </el-form>
        <span slot="footer" class="dialog-footer">
          <el-button size="mini"  @click="editVisible = false">取 消</el-button>
          <el-button type="primary" size="mini" @click="saveEdit">确 定</el-button>
        </span>
      </el-dialog>
      <!-- 删除提示框 -->
      <el-dialog title="提示" :visible.sync="delVisible" width="300px" center>
        <div class="del-dialog-cnt" align="center">删除不可恢复,是否确定删除?</div>
        <span slot="footer" class="dialog-footer">
          <el-button size="mini" @click="delVisible = false">取 消</el-button>
          <el-button type="primary" size="mini" @click="deleteRow">确 定</el-button>
        </span>
      </el-dialog>
    </div>
  </template>
  <script>
  //导入外部js文件
  import {mixin} from '../mixins/index.js'
  import axios from 'axios';
  
  export default {
    name: 'book-page',
    //注意:以下代码导入mixin中的方法供本组件使用。
    //vue中提供了一种混合机制:mixins,用来更高效的实现组件内容的复用。
    mixins: [mixin],
    data () {
        return {
        registerForm: {
        //  添加框信息
              stuId: '',
              stuName: '',
              ChineseScore: '',
              EnglishScore: '',
              MathScore: '',
              ScienceScore:''
              
        },
        tableData: [],
        tempData: [],
        multipleSelection: [],
        centerDialogVisible: false,
        editVisible: false,
        delVisible: false,
        select_word: '',
          form: {
            // 编辑框信息
            stuId: '',
              stuName: '',
              ChineseScore: '',
              EnglishScore: '',
              MathScore: '',
              ScienceScore:''
        },
        pageSize: 10, // 页数
        currentPage: 1, // 当前页
        idx: -1
      }
    },
    computed: {
      // 计算当前表格中的数据,用于分页。
  data () {
    //slice方法通过索引位置获取并返回一个新的子数组。
    //用法:arrayObj.slice(start,end),其中,arrayObj 为原数组,
  //start设定新数组的起始位置,end设定新数组的结束位置。pro
        return this.tableData.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize)
      }
    },
    watch: {
      //select_word监听数据变化,实现快速实时查询功能
      select_word: function () {
        if (this.select_word === '') {
          this.tableData = this.tempData
        } else {
          this.tableData = []
          for (let item of this.tempData) {
            if (item.stuId.includes(this.select_word)) {
              this.tableData.push(item)
            }
          }
        }
      }
    },
    // 创建vue实例时加载全部数据。
    created () {
      this.getData()
    },
    methods: {
      // 获取当前页
      handleCurrentChange (val) {
        this.currentPage = val
      },         
      
      // 添加学生考试信息
      addScore() {
    
        let stuId=this.registerForm.stuId
        let stuName=this.registerForm.stuName
          let ChineseScore = this.registerForm.ChineseScore
          let EnglishScore=this.registerForm.EnglishScore
        let MathScore=this.registerForm.MathScore
        let ScienceScore=this.registerForm.ScienceScore
        let params ={stuId,stuName,ChineseScore,EnglishScore,MathScore,ScienceScore}          
        console.log(params)
        //通过axios向服务器发出post请求,添加一条学生考试信息记录。
        axios.post('api/score/addScore',params).then(res => {
          console.log(res); 
            if (res.data.affectedRows!=0) {
              this.getData()
              this.registerForm = {}
              this.notify('添加成功', 'success')
            } else {
              this.notify('添加失败', 'error')
            }
          })
          .catch(err => {
            console.log(err)
          })
        this.centerDialogVisible = false
      },
      // 加载全部数据(获取全部歌手信息)。
      getData () {
        this.tableData = []
        this.tempData = []
        //通过axios向服务器发出post请求,获取歌手的所有记录。
        axios.post('api/score/getScores').then(res => {        
          console.log(res);
          this.tableData = res.data
          this.tempData = res.data        
          this.currentPage = 1
        })
      },
      // 编辑
      handleEdit (row) {
        this.editVisible = true
        this.idx = row.stuId
        this.form = {
            stuId:row.stuId,
            stuName: row.stuName,
            ChineseScore: row.ChineseScore,
            EnglishScore: row.EnglishScore,
            MathScore: row.MathScore,
            ScienceScore:row.ScienceScore
        }
      },
      // 保存编辑
      saveEdit() {
        let stuId=this.form.stuId
        let stuName=this.form.stuName
        let ChineseScore=this.form.ChineseScore
        let MathScore=this.form.MathScore
        let EnglishScore=this.form.EnglishScore
        let ScienceScore=this.form.ScienceScore
        let params ={stuName,ChineseScore,EnglishScore,MathScore,ScienceScore,stuId}            
        //通过axios向服务器发出post请求,更新一条歌手记录。
        axios.post('api/score/updateScore',params).then(res => {
          console.log(res); 
          if (res.data.affectedRows!= 0) {
              this.getData()
              this.notify('编辑成功', 'success')
            } else {
              this.notify('编辑失败', 'error')
            }
          })
          .catch(err => {
  
            console.log(err)
          })
        this.editVisible = false
      },
      // 确定删除
      deleteRow () {
        let stuId=this.idx;
        let params={stuId}      
        console.log(params)
        //通过axios向服务器发出post请求,删除一条学生考试信息
        axios.post('api/score/deleteScore',params).then(res => {
        console.log(res.data); 
            if (res) {
              this.getData()
              this.notify('删除成功', 'success')
            } else {
              this.notify('删除失败', 'error')
            }
          })
          .catch(err => {
            console.log(err)
          })
        this.delVisible = false
  }
    }
  }
  </script>
  <style scoped>
  .handle-box {
    margin-bottom: 20px;
  }
  .handle-input {
    width: 300px;
    display: inline-block;
  }
  .singer-img {
    width: 100%;
    height: 80px;
    border-radius: 5px;
    margin-bottom: 5px;
    overflow: hidden;
  }
  .pagination {
    display: flex;
    justify-content: center;
  }
  </style>
  

9.在config的index.js文件中找到proxyTable并替换为如下的代码,用于解决跨域的问题。

proxyTable: {
        '/api': {
            target: 'http://127.0.0.1:8888/api/',//不要写localhost
            changeOrigin: true,//true允许跨域
            pathRewrite: {
                '^/api': ''  //需要rewrite重写的, 如果在服务器端做了处理则可以不要这段
            }
        }
    },

10.修改路由表信息。找到src/router/index.js文件,并把代码替换为如下代码。

import Vue from 'vue'
import Router from 'vue-router'
import scorePage from '@/components/scorePage.vue'
 
Vue.use(Router)
 
export default new Router({
  routes: [
    {
      path: '/',
      component: scorePage
    }
  ]
}) 

11.修改index.html,修改title属性为“学生考试信息管理系统”,具体的代码如下。

<!DOCTYPE html>
<html>
 
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>学生考试信息管理系统</title>
  </head>
 
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
 
</html>

12.用VSCode的终端,分别在score-manage目录和score-server目录下输入,npm run dev,node index。启动完成后访问:http://localhost:8080/,效果图如图22所示。

图21 VSCode终端下启动前端页面

 

图22 VSCode终端下启动Express Web服务器

 

图23 学生考试信息管理系统主页

13.增加一条学生的考试信息:点击”添加学生考试信息“,显示的界面如图23所示。在”添加学生考试界面“添加一条新数据,具体输入的数据如图24所示,点击”确定“之后页面多出一条刚刚添加的数据,底部的分页的数目以及界面中的序号等都会发生变化,效果图如图25所示。

图24 添加学生考试信息界面

 

图25 输入框中输入要添加的学生的信息

图26 添加数据后的界面

14.修改一条学生的考试信息:当点击图25中所示的“编辑”就会对当前的学生的考试信息进行编辑(默认准考证号不能改)。假设将赵六的英语成绩110分改为120分。图26所示的为“赵六”的考试信息,可以发现“准考证号”不能被修改,其余的字段可以进行修改。“赵六”的考试成绩修改成功后的界面如图27所示。

图27 编辑状态下的“赵六”的考试信息

图28  修改成功后的“赵六”的考试成绩

15.删除一条学生的考试信息:当点击图27中所示的删除按钮就会删除一条学生的考试信息。例如,删除“王五”的考试信息。当点击删除按钮的时候会出现如图29所示的提示框,当选择“确定”后,“王五”的考试信息就会被删除,删除后的界面如图30所示,发现界面中“王五”的信息消失并且底部的页的记录会-1。

 

图29 删除前的界面

 

图30 点击删除后的提示框

 

图31 删除“王五”后的界面

16.批量删除学生的考试信息:当点击图30所示的复选框可以勾选删除多条信息。例如,删除“张三”和“赵六”考试信息。勾选复选框的界面如图31所示,点击“批量删除”,删除后的界面如图32所示,筛选后的页面的条数信息也会跟着变化。

图32 勾选复选框的界面

 

图33 批量删除后的界面

17.模糊查询更新界面数据:实例,筛选并查看准考证号尾数为270的学生的考试信息。只需要在输入框中输入270,就会出现图34所示的界面,与图33中显示的信息相比,图34仅显示筛选出来的准考证号尾数为270的学生的信息。

 

图34 根据学号进行模糊查询

 

图35 筛选准考证号尾数为270的学生的考试信息

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单点了

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值