Vue+Element-ui+Servlet实现宿舍信息管理系统

一、宿舍信息管理系统介绍

实现对学生信息的增、删、改、查等基本操作,其中可以根据学号、姓名、宿舍号、班级四个字段进行学生查询。数据库连接的MySQL。

前端
Vue+Element-ui
后端
Servlet
在这里插入图片描述
页面预览
登录页面
在这里插入图片描述
主页面
在这里插入图片描述

二、数据库连接

新建数据库以及表

直接在Navicat Premium里面用可视化界面建表,我建的表如下:
在这里插入图片描述

JDBC 连接数据库

// 注册驱动
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/dorm_info?characterEncoding=utf-8";
    static final String USER = "root";
    static final String PASS = "root";
    static Connection conn = null;
    /**
     * 打开数据库连接
     *
     * @return
     */
    public static Connection open() {
        try {
            Class.forName(JDBC_DRIVER);
            System.out.println("连接成功......");
            return DriverManager.getConnection(DB_URL, USER, PASS);
        } catch (Exception e) {
            System.out.println("连接数据库失败....");
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 关闭数据库连接
     *
     * @return
     */
    public static Connection close() {
        if (conn != null) {
            try {
                conn.close();// 关闭数据库
                System.out.println("关闭...");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("数据库关闭失败...");
            }
        }
        return null;
    }

三、后端

后端提供接口

在这里插入图片描述

业务逻辑相关代码

登录模块

在这里插入图片描述

获取所有学生信息

在这里插入图片描述

增加学生信息

servlet层
在这里插入图片描述
service层
Text-to-HTML conversion tool

删除学生信息

servlet层
在这里插入图片描述
service层
在这里插入图片描述

修改学生信息

servlet层
在这里插入图片描述
service层
在这里插入图片描述

查询学生信息(模糊查询)

servlet层
在这里插入图片描述
service层
根据学号查询
在这里插入图片描述
根据姓名查询
在这里插入图片描述
根据班级查询
在这里插入图片描述
根据宿舍号查询
在这里插入图片描述

四、前端

页面代码

<template>
  <div>
    <el-button type="primary" @click="addDialogFormVisible = !addDialogFormVisible"
               style="margin-bottom: 10px; margin-right: 20px; background-color: #70a1ff">添加学生信息
    </el-button>
    <el-dropdown @command="handleCommand">
      <el-button type="primary" style="background-color: #70a1ff">
        {{queryMethod}}<i class="el-icon-arrow-down el-icon--right"></i>
      </el-button>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item command="stuNum">学号</el-dropdown-item>
        <el-dropdown-item command="name">姓名</el-dropdown-item>
        <el-dropdown-item command="dormNum">宿舍号</el-dropdown-item>
        <el-dropdown-item command="className">班级</el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
    <el-input v-model="searchStr" placeholder="查询学生信息" style="width: 50%">
      <el-button type="primary" slot="append" icon="el-icon-search" @click="queryInfo()">查询</el-button>
    </el-input>
    <!--  添加学生信息弹窗  -->
    <el-dialog title="添加学生" :visible.sync="addDialogFormVisible">
      <el-form :model="newStuForm" label-width="80px" :rules="rules">
        <el-form-item label="学号" prop="stuNum">
          <el-input v-model="newStuForm.stuNum" autocomplete="off" placeholder="请输入学号"></el-input>
        </el-form-item>
        <el-form-item label="姓名" prop="name">
          <el-input v-model="newStuForm.name" autocomplete="off" placeholder="请输入姓名"></el-input>
        </el-form-item>
        <el-form-item label="性别" prop="gender">
          <el-select v-model="newStuForm.gender" placeholder="请选择性别">
            <el-option label="" value=""></el-option>
            <el-option label="" value=""></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="宿舍号" prop="dormNum">
          <el-input v-model="newStuForm.dormNum" autocomplete="off" placeholder="例:1b-223/11-223"></el-input>
        </el-form-item>
        <el-form-item label="学院" prop="academy">
          <el-input v-model="newStuForm.academy" autocomplete="off" placeholder="请输入学院简写,例:电智"></el-input>
        </el-form-item>
        <el-form-item label="专业" prop="major">
          <el-input v-model="newStuForm.major" autocomplete="off" placeholder="请输入专业"></el-input>
        </el-form-item>
        <el-form-item label="班级" prop="className">
          <el-input v-model="newStuForm.className" autocomplete="off" placeholder="请输入班级名"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="addDialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="addNewStudent">添 加</el-button>
      </div>
    </el-dialog>
    <!--  修改学生信息弹窗  -->
    <el-dialog title="修改学生" :visible.sync="updateDialogFormVisible">
      <el-form :model="editForm" label-width="80px">
        <el-form-item label="学号" prop="stuNum">
          <el-input v-model="editForm.stuNum" autocomplete="off" placeholder="请输入学号" readonly></el-input>
        </el-form-item>
        <el-form-item label="姓名" prop="name">
          <el-input v-model="editForm.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="性别" prop="gender">
          <el-select v-model="editForm.gender">
            <el-option label="" value=""></el-option>
            <el-option label="" value=""></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="宿舍号" prop="dormNum">
          <el-input v-model="editForm.dormNum" autocomplete="off" placeholder="例:1b-223/11-223"></el-input>
        </el-form-item>
        <el-form-item label="学院" prop="academy">
          <el-input v-model="editForm.academy" autocomplete="off" placeholder="请输入学院简写,例:电智"></el-input>
        </el-form-item>
        <el-form-item label="专业" prop="major">
          <el-input v-model="editForm.major" autocomplete="off" placeholder="请输入专业"></el-input>
        </el-form-item>
        <el-form-item label="班级" prop="className">
          <el-input v-model="editForm.className" autocomplete="off" placeholder="请输入班级名"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="updateDialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="updateStu">保 存</el-button>
      </div>
    </el-dialog>
    <!-- 学生宿舍信息表格   -->
    <el-table
      :data="tableData"
      border
      style="width: 100%">
      <el-table-column
        prop="stuNum"
        label="学号"
        width="120">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="120">
      </el-table-column>
      <el-table-column
        prop="gender"
        label="性别"
        width="120">
      </el-table-column>
      <el-table-column
        prop="dormNum"
        label="宿舍号"
        width="120">
      </el-table-column>
      <el-table-column
        prop="academy"
        label="学院"
        width="120">
      </el-table-column>
      <el-table-column
        prop="major"
        label="专业"
        width="160">
      </el-table-column>
      <el-table-column
        prop="className"
        label="班级"
        width="120">
      </el-table-column>
      <el-table-column
        label="操作"
        width="150">
        <template slot-scope="scope">
          <el-button @click="handleUpdate(scope.row)" type="text" size="small">修改</el-button>
          <el-button type="text" size="small" @click="handleDelete(scope.row, scope.$index)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

逻辑代码

  1. 获取全部学生信息列表
   selectAllStudent () {
      this.tableData = []
      const url = `${baseApiUrl}/student`
      // 获取数据库全部学生列表
      axios.get(url, {
        headers: {
          Authentication: localStorage.getItem('token')
        }
      }).then(rs => {
        if (rs.status === 200) {
          console.log('rs:' + rs.data.data.length)
          rs.data.data.forEach(item => { this.tableData.push(item) })
        }
      }).catch(error => {
        if (error.response.status === 401) {
          this.$message.error(error.response.data.message)
          this.$router.push('/')
        }
      })
    }
  1. 添加学生
    addNewStudent: function () {
      if (this.newStuForm.name && this.newStuForm.gender && this.newStuForm.dormNum && this.newStuForm.academy && this.newStuForm.major) {
        this.$confirm('该操作将添加一个学生数据,是否确定?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          let formData = 'stuNum=' + this.newStuForm.stuNum
          formData = formData.concat('&name=' + this.newStuForm.name)
          formData = formData.concat('&gender=' + this.newStuForm.gender)
          formData = formData.concat('&dormNum=' + this.newStuForm.dormNum)
          formData = formData.concat('&academy=' + this.newStuForm.academy)
          formData = formData.concat('&major=' + this.newStuForm.major)
          formData = formData.concat('&className=' + this.newStuForm.className)
          const url = `${baseApiUrl}/student`
          axios.post(url, formData, {
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
              Authentication: localStorage.getItem('token')
            }
          }).then(rs => {
            console.log('promise-rs:', rs)
            // this.tableData = rs.data.data
            this.$message.success('添加成功')
            this.selectAllStudent()
          }).catch(() => {
            this.$message.error('添加失败')
          })
          this.addDialogFormVisible = false
          this.newStuForm = {}
        })
      } else {
        this.$message.warning('信息不全,请完善后再添加')
      }
    }
  1. 修改学生
    updateStu: function () {
      if (this.editForm.name && this.editForm.gender && this.editForm.dormNum && this.editForm.academy && this.editForm.major) {
        this.$confirm('该操作将修改一个学生数据,是否确定?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          let formData = 'stuNum=' + this.editForm.stuNum
          formData = formData.concat('&name=' + this.editForm.name)
          formData = formData.concat('&gender=' + this.editForm.gender)
          formData = formData.concat('&dormNum=' + this.editForm.dormNum)
          formData = formData.concat('&academy=' + this.editForm.academy)
          formData = formData.concat('&major=' + this.editForm.major)
          formData = formData.concat('&className=' + this.editForm.className)
          const url = `${baseApiUrl}/student?` + formData
          axios.put(url, formData, {
            headers: {
              Authentication: localStorage.getItem('token')
              // 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
            }
          }).then(rs => {
            console.log('promise-rs:', rs)
            // this.tableData = rs.data.data
            this.$message.success('修改成功')
            this.selectAllStudent()
          }).catch(() => {
            this.$message.error('修改失败')
          })
          this.updateDialogFormVisible = false
        })
      } else {
        this.$message.warning('信息不全,请完善后再添加')
      }
    }
  1. 删除学生
    handleDelete: function (row, i) {
      this.$confirm('该操作将删除一个学生数据,是否确定?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        console.log('删除:' + row.stuNum)
        const formData = 'stuNum=' + row.stuNum
        const url = `${baseApiUrl}/student?` + formData
        axios.delete(url, {
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            Authentication: localStorage.getItem('token')
          }
        }).then(rs => {
          console.log('promise-rs:', rs)
          this.tableData.splice(i, 1)
          this.$message.success('删除成功')
        }).catch(() => {
          this.$message.error('删除失败')
        })
      })
    }
  1. 查询学生
    queryInfo () {
      const queryData = this.queryCol + '=' + this.searchStr
      const url = `${baseApiUrl}/student/query?` + queryData
      console.log('url:' + url)
      axios.get(url, {
        headers: {
          Authentication: localStorage.getItem('token')
        }
      }).then((rs) => {
        this.tableData = []
        console.log(rs.data)
        rs.data.data.forEach(item => { this.tableData.push(item) })
      })
    }

五、项目源码

有需要参考的朋友可以看我上传GitHub的源码哟

后端代码:https://github.com/Cassie-8910/Servlet
前端代码:https://github.com/Cassie-8910/dorm_management_system

  • 12
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
实现多文件上传的方式有很多种,下面我将介绍一种基于 Vue 和 Spring Boot 的实现方式,使用的是 Element UI 的上传组件 el-upload。 前端实现: 1. 在 Vue 组件中引入 Element UI 的 el-upload 组件。 ```vue <template> <el-upload class="upload-demo" action="/api/upload" :multiple="true" :on-change="handleUploadChange" :on-remove="handleUploadRemove" :file-list="fileList"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> ``` 2. 在 Vue 组件中定义 fileList 数组,用于存储上传的文件列表。 ```vue <script> export default { data() { return { fileList: [] } }, methods: { handleUploadChange(file, fileList) { this.fileList = fileList }, handleUploadRemove(file, fileList) { this.fileList = fileList } } } </script> ``` 3. 在 Vue 组件中定义 handleUploadChange 和 handleUploadRemove 方法,用于监听上传文件的变化和删除文件的操作,更新 fileList 数组。 后端实现: 1. 在 Spring Boot 项目中定义上传文件的接口。 ```java @RestController @RequestMapping("/api") public class FileUploadController { @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile[] files) { // TODO: 处理上传的文件 return ResponseEntity.ok("上传成功"); } } ``` 2. 在接口中使用 @RequestParam 注解接收上传的文件,可以使用 MultipartFile 类型的数组来接收多个文件。接收到文件后,可以根据需要进行处理,例如保存到本地磁盘或上传到云存储服务。 3. 在 application.properties 文件中配置文件上传的相关参数。 ```properties # 文件上传配置 spring.servlet.multipart.max-file-size=500KB spring.servlet.multipart.max-request-size=100MB spring.servlet.multipart.enabled=true ``` 其中,max-file-size 和 max-request-size 分别设置了单个文件和总文件大小的最大值,enabled 表示是否启用文件上传功能。 以上就是基于 Vue 和 Spring Boot 的多文件上传实现方式,希望能对你有所帮助。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值