springboot,vue教务管理系统

2023/9/30 17:33:38

开发工具:IDEA

服务器:Tomcat9.0, jdk1.8

项目构建:maven

数据库:mysql5.7

前端技术:vue +elementUI

服务端技术:springboot+mybatis

本系统拥有三种角色:管理员、教师和学生,项目采用前后端分离

项目功能描述:

1.管理员:登录、首页、班级管理、课程管理、管理员管理、教师管理、学生管理、选课修改、院系管理、专业管理、设置用户权限等

2.教师:登录、首页、成绩录入、教师课表、授课查询等

3.学生:登录、首页,选修课程、学生课程、成绩查询、课表查询、个人信息修改等

管理员截图:

教师截图:

学生截图:

package com.rainng.coursesystem.service.admin;

import com.rainng.coursesystem.manager.admin.CourseManager;
import com.rainng.coursesystem.model.bo.CourseItemBO;
import com.rainng.coursesystem.model.entity.CourseEntity;
import com.rainng.coursesystem.model.vo.response.ResultVO;
import com.rainng.coursesystem.model.vo.response.table.CourseItemVO;
import com.rainng.coursesystem.service.BaseService;
import com.rainng.coursesystem.util.LessonTimeConverter;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class CourseService extends BaseService {
    private final CourseManager manager;
    private final LessonTimeConverter lessonTimeConverter;

    public CourseService(CourseManager manager, LessonTimeConverter lessonTimeConverter) {
        this.manager = manager;
        this.lessonTimeConverter = lessonTimeConverter;
    }

    public ResultVO getPageCount(String departmentName, String majorName, String name) {
        return result(manager.getPageCount(departmentName, majorName, name));
    }

    public ResultVO getPage(Integer index, String departmentName, String majorName, String name) {
        List<CourseItemBO> boList = manager.getPage(index, departmentName, majorName, name);
        List<CourseItemVO> voList = new ArrayList<>(boList.size());

        for (CourseItemBO bo : boList) {
            CourseItemVO vo = new CourseItemVO();
            BeanUtils.copyProperties(bo, vo);
            vo.setTime(lessonTimeConverter.covertTimePart(bo.getTime()));
            voList.add(vo);
        }

        return result(voList);
    }

    public ResultVO get(Integer id) {
        CourseEntity entity = manager.get(id);
        if (entity == null) {
            return failedResult("课程Id: " + id + "不存在!");
        }

        return result(entity);
    }

    public ResultVO update(CourseEntity entity) {
        CourseEntity origin = manager.get(entity.getId());
        if (origin == null) {
            return failedResult("课程Id: " + entity.getId() + "不存在!");
        }
        if (manager.getTeacherById(entity.getTeacherId()) == null) {
            return failedResult("授课教师Id: " + entity.getTeacherId() + "不存在!");
        }

        entity.setSelectedCount(origin.getSelectedCount());

        manager.update(entity);
        return result("更新成功");
    }

    public ResultVO delete(Integer id) {
        if (manager.get(id) == null) {
            return failedResult("课程Id: " + id + "不存在!");
        }
        if (manager.hasStudentCourse(id)) {
            return failedResult("还有学生未退选此课程");
        }

        manager.delete(id);
        return result("删除成功");
    }

    public ResultVO create(CourseEntity entity) {
        if (manager.get(entity.getId()) != null) {
            return failedResult("课程Id: " + entity.getId() + "已存在!");
        }
        if (manager.getTeacherById(entity.getTeacherId()) == null) {
            return failedResult("授课教师Id: " + entity.getTeacherId() + "不存在!");
        }

        manager.create(entity);
        return result("添加成功");
    }

    public ResultVO listName() {
        return result(manager.listName());
    }
}
<template>
<div class="grade-wrap">
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-fa fa-edit"></i> 成绩录入
</el-breadcrumb-item>
</el-breadcrumb>
</div>

<div class="container">
<div class="query-form">
<el-row :gutter="20">
<el-col :offset="15" :span="3">
<el-input
@keyup.enter.native="query"
placeholder="课程名"
v-model="queryForm.courseName"
/>
</el-col>
<el-col :span="3">
<el-input
@keyup.enter.native="query"
placeholder="学生名"
v-model="queryForm.studentName"
/>
</el-col>
<el-col :span="3">
<el-button @click="query" icon="el-icon-search" type="primary"
>搜索
</el-button>
</el-col>
</el-row>
</div>

<el-row justify="center" type="flex">
<el-pagination
:current-page.sync="pageIndex"
:page-size="pageSize"
:total="pageSize * pageCount"
@current-change="getPage"
background
layout="prev, pager, next"
>
</el-pagination>
</el-row>

<div class="table">
<el-table :data="tableData" stripe>
<el-table-column label="选课Id" prop="studentCourseId" />
<el-table-column label="课程名" prop="courseName" />
<el-table-column label="学生姓名" prop="studentName" />
<el-table-column label="日常分" prop="dailyScore" />
<el-table-column label="笔试分" prop="examScore" />
<el-table-column label="成绩" prop="score" />
<el-table-column align="center" label="操作" width="200px">
<template slot-scope="scope">
<el-button
@click="edit(scope.row.studentCourseId)"
size="mini"
type="success"
>打分
</el-button>
</template>
</el-table-column>
</el-table>
</div>

<el-dialog :visible.sync="editing" title="编辑" width="30%">
<el-form :model="entityForm" label-width="70px" ref="form">
<el-form-item label="选课Id">
<el-input
disabled
type="number"
v-model="entityForm.studentCourseId"
></el-input>
</el-form-item>
<el-form-item label="日常成绩">
<el-input type="number" v-model="entityForm.dailyScore"></el-input>
</el-form-item>
<el-form-item label="笔试成绩">
<el-input type="number" v-model="entityForm.examScore"></el-input>
</el-form-item>
<el-form-item label="总成绩">
<el-input type="number" v-model="entityForm.score"></el-input>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="save" type="primary">确 定</el-button>
<el-button @click="editing = false">取 消</el-button>
</span>
</el-dialog>
</div>
</div>
</template>

<script>
import * as api from "../../api/teacher/grade";

export default {
name: "TeacherGrade",
data() {
return {
queryForm: {
courseName: "",
studentName: ""
},
entityForm: {},
tableData: [],
pageSize: api.pageSize,
pageCount: 1,
pageIndex: 1,
editing: false
};
},
methods: {
query() {
api
.getPageCount(this.queryForm.courseName, this.queryForm.studentName)
.then(res => {
this.pageCount = res;
this.pageIndex = 1;
this.getPage(1);
});
},
getPage(pageIndex) {
api
.getPage(
pageIndex,
this.queryForm.courseName,
this.queryForm.studentName
)
.then(res => {
this.tableData = res;
});
},
edit(id) {
api.get(id).then(res => {
this.entityForm = res;
this.editing = true;
});
},
save() {
api.update(this.entityForm).then(() => {
this.$message.success("成功");
this.getPage(this.pageIndex);
this.editing = false;
});
}
},
created() {
this.query();
}
};
</script>

<style scoped></style>

http://www.jnnr.cn/a/273005.html

相关文章

RL笔记:动态规划(1): 策略估计和策略提升

目录 0. 前言 (4.1)策略估计&#xff0c;Policy Evaluation(Prediction) Example 4.1 (python代码) Exercise 4.1 Exercise 4.2 Exercise 4.3 (4.2)Policy Improvement 0. 前言 Sutton-book第4章&#xff08;动态规划&#xff09;学习笔记。本文是关于其中4.1节&#xf…

fpga图像处理(sobel算子)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 关于sobel算子,前面已经讲过计算方法了。一种是上下的sobel算子,一种是左右的sobel算子,两者都相当于prewitt算子的进一步拓展。当然,之前的实现方法都是基于python和opencv实现…

Cadence PCB仿真 使用 Allegro PCB SI 为电源网络分配电压并选择仿真的电源网络的方法图文教程

🏡《总目录》   🏡《分目录》 目录 1,概述2,分配电压3,选择仿真网络4,总结1,概述 进行电源分配网络PDN的仿真前,需要进行一些准备工作。首先需要为电源网络分配适合的电压,并选择需要进行PDN分析的网络。本文介绍其具体方法。 2,分配电压 第1步:执行Analyze→P…

TensorFlow Serving模型部署

7.7 TensorFlow Serving模型部署 学习目标 目标 无应用 应用TensorFlow Serving完成模型服务运行 7.7.1 TensorFlow Serving TensorFlow Serving是一种灵活的高性能服务系统&#xff0c;适用于机器学习模型&#xff0c;专为生产环境而设计。TensorFlow Serving可以轻松部署新…

OpenGL | OpenGL 绘制其他图形

一、绘制点GL_POINTSOpenGL默认绘制的点大小是1px&#xff0c;可以使用glPointSize()来改变点的大小&#xff0c;但是要注意&#xff1a;glPointSize()不能放在glBegin()和glEnd()之间&#xff0c;要放在glBegin()之前。1.代码void Draw() {glClearColor(1, 1, 1, 1.0f); //白…

大数据之HBase基础

文章目录前言一、HBase基础简介&#xff08;一&#xff09;基础介绍&#xff08;二&#xff09;应用场景&#xff08;三&#xff09;特点二、数据模型&#xff08;一&#xff09;行键&#xff08;row key&#xff09;&#xff08;二&#xff09;列&#xff08;三&#xff09;列…

(深度学习快速入门)第四章第三节:卷积层详解1

文章目录一&#xff1a;什么是卷积运算&#xff08;了解&#xff09;二&#xff1a;从全连接层到卷积层&#xff08;1&#xff09;解决空间不变性&#xff08;2&#xff09;解决参数爆炸-稀疏连接和权值共享三&#xff1a;CNN中的图像卷积卷积层&#xff1a;卷积层是CNN中的核心…

道路病害识别监测系统 CNN网络

道路病害识别监测系统通过CNN网络深度学习算法&#xff0c;道路病害识别监测对巡检车上实时监控道路影像数据进行分析&#xff0c;输出道路病害裂缝巡检报告并落图展示。在CNN出现之前&#xff0c;对于图像的处理一直都是一个很大的问题&#xff0c;一方面因为图像处理的数据量…

mybatis plus 更新时间 创建时间自动填充失效的情况和解决方案

问题描述&#xff1a; 调用mybatisplus的IService接口中的update(Wrapper updateWrapper)&#xff0c;update_time没有自动填充。 spuService.update(updateWrapper); 解决方案&#xff1a; 不使用update(wrapper xxx)方法&#xff0c;使用以下方法替代&#xff1a; 1.boole…

Traffic Signs Recognition with 95% Accuracy using CNNKeras

Traffic Signs Recognition 导读 本文采用CNN模型和Keras库 使用GTSRB数据集 构建模型可以分为四部分&#xff1a;1、先探索数据集 2、构建CNN模型 3、训练和验证模型 4、使用测试数据测试模型 保存模型并使用Python自带包tkinter实现GUI 一、数据集 下载完数据后&#xff0c;可…

使用redisson实现分布式锁

在微服务项目中使用redisson实现一个分布式锁 一、引入依赖 spring-boot版本2.3.12.RELEASE <dependencies><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.6.5</version></dep…

【HTML】HTML 标签 ② ( 排版标签 | 标题标签 | 段落标签 | 水平线标签 | 换行标签 | div 标签 | span 标签 )

文章目录一、排版标签1、标题标签2、段落标签3、水平线标签4、换行标签5、div 标签 和 span 标签HTML 常用的标签有如下类型 : 排版标签文本格式化标签图像标签链接标签 , 其中 链接涉及到 相对路径 与 绝对路径问题 ; 一、排版标签 排版标签 是 网页布局 中 , 最常用的标签 …

Anaconda搭建TensorFlow2.x(win环境)

本篇文章介绍如何使用Anaconda快速搭建Python环境下的TensorFlow2.x开发框架 Anaconda搭建TensorFlow2.x过程 关于 Anaconda Anaconda就是可以便捷获取包且对包能够进行管理&#xff0c;同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包…

【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp

穿过迷宫的最少移动次数【LC1210】 你还记得那条风靡全球的贪吃蛇吗&#xff1f; 我们在一个 n*n 的网格上构建了新的迷宫地图&#xff0c;蛇的长度为 2&#xff0c;也就是说它会占去两个单元格。蛇会从左上角&#xff08;(0, 0) 和 (0, 1)&#xff09;开始移动。我们用 0 表示…

Mysql高级部分学习笔记(四)——锁理论

一、MVCC 1. 概念 多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来&#xff0c;这样读锁就和写锁不冲突了&#xff0c;不同的事务session会看到自己特定版本的数据&#xff0c;版本链。 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有 乐观…

【谷粒商城高级篇】商品服务 商品上架

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建Elasticsearch项目简介与分布式概念&#xff08;第一、二章&#xff09;Elasticsearch&#xff1a;全文检索&#xff08;第一章&#xff09;基础环境搭建&#xff08;第三章&#xff09;商品服务开发整…

node\npm问题

一、npm问题 解决办法: 0、有必要可以考虑先清理一下&#xff1a; npm cache clean --force 1、先执行 npm config set registry http://registry.cnpmjs.org 2、再执行 npm install 成功解决 二、出现问题 gulp : 无法将“gulp”项识别为 cmdlet、函数、脚本文件或可运行…

Java面试Web篇

目录 一、JavaWeb基础 1.jsp 2.servlet 二、JavaWeb框架 1.Spring #SpringMVC的工作流程&#xff1f; 三、Mybatis 今天给大家分享 JavaWeb篇的面试题&#xff0c;小编给大家稍微整理了一下&#xff0c;希望即将面试的朋友们看了后能有帮助。 一、JavaWeb基础 1.jsp 指令…

《从0开始学大数据》之知名大厂大数据平台介绍

今天我们来看一下淘宝、美团和滴滴的大数据平台&#xff0c;一方面进一步学习大厂大数据平台的架构&#xff0c;另一方面也学习大厂的工程师如何画架构图。通过大厂的这些架构图&#xff0c;你就会发现&#xff0c;不但这些知名大厂的大数据平台设计方案大同小异&#xff0c;架…

MySQL数据库索引并没有你想的那么难之第一节

从今天开始我将会为大家讲解MySQL的数据库索引&#xff0c;通过对行存储结构&#xff0c;数据页结构的理论学习&#xff0c;彻底掌握索引结构存储。为索引优化提供扎实的理论基础。 下面是我将要讲解的内容如下&#xff1a; 行存储结构数据页结构索引结构索引的优化查找案例 …
最新文章