成绩管理功能 #7

Merged
pyia8e6p9 merged 1 commits from grade_guan into master 2 years ago

@ -0,0 +1,54 @@
package com.example.controller;
import com.example.common.Result;
import com.example.entity.Grade;
import com.example.service.GradeService;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
*
*/
@RestController
@RequestMapping("/grade")
public class GradeController {
@Resource
GradeService gradeService;
@PostMapping("/add")
public Result add(@RequestBody Grade grade) {
gradeService.add(grade);
return Result.success();
}
@PutMapping("/update")
public Result update(@RequestBody Grade grade) {
gradeService.update(grade);
return Result.success();
}
/**
*
*/
@DeleteMapping("/delete/{id}")
public Result delete(@PathVariable Integer id) {
gradeService.deleteById(id);
return Result.success();
}
/**
*
*/
@GetMapping("/selectPage")
public Result selectPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "5") Integer pageSize,
Grade grade) { // ?name=xx&no=xx
PageInfo<Grade> pageInfo = gradeService.selectPage(pageNum, pageSize, grade);
return Result.success(pageInfo);
}
}

@ -0,0 +1,77 @@
package com.example.entity;
public class Grade {
private Integer id;
private Integer courseId;
private Integer studentId;
private Double score;
private String comment;
private String feedback;
private String studentName;
private String courseName;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCourseId() {
return courseId;
}
public void setCourseId(Integer courseId) {
this.courseId = courseId;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getFeedback() {
return feedback;
}
public void setFeedback(String feedback) {
this.feedback = feedback;
}
}

@ -0,0 +1,27 @@
package com.example.mapper;
import com.example.entity.Grade;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface GradeMapper {
@Insert("insert into grade (course_id, student_id, score, comment, feedback) " +
"values (#{courseId}, #{studentId}, #{score}, #{comment}, #{feedback})")
void insert(Grade grade);
List<Grade> selectAll(Grade grade); // 关联查询
@Update("update grade set score = #{score}, comment = #{comment}, feedback = #{ feedback } where id = #{id}")
void update(Grade grade);
@Select("select * from grade where student_id = #{studentId} and course_id = #{courseId}")
Grade selectByCondition(Grade grade);
@Delete("delete from grade where id = #{id}")
void deleteById(Integer id);
}

@ -0,0 +1,40 @@
package com.example.service;
import com.example.entity.Grade;
import com.example.exception.CustomException;
import com.example.mapper.GradeMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class GradeService {
@Resource
GradeMapper gradeMapper;
public void add(Grade grade) {
Grade dbGrade = gradeMapper.selectByCondition(grade);
if (dbGrade != null) { // 打过分了
throw new CustomException("您已打过分了");
}
gradeMapper.insert(grade);
}
public PageInfo<Grade> selectPage(Integer pageNum, Integer pageSize, Grade grade) {
PageHelper.startPage(pageNum, pageSize);
List<Grade> list = gradeMapper.selectAll(grade);
return PageInfo.of(list);
}
public void update(Grade grade) {
gradeMapper.update(grade);
}
public void deleteById(Integer id) {
gradeMapper.deleteById(id);
}
}

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.GradeMapper">
<select id="selectAll" resultType="com.example.entity.Grade">
select grade.*, student.name as studentName, course.name as courseName
from grade
left join student
on grade.student_id = student.id
left join course
on grade.course_id = course.id
<where>
<if test="studentName != null">and student.name like concat('%', #{studentName}, '%')</if>
<if test="courseName != null">and course.name like concat('%', #{courseName}, '%')</if>
<if test="studentId != null">and grade.student_id = #{studentId}</if>
</where>
order by id desc
</select>
</mapper>

@ -15,6 +15,7 @@ const router = createRouter({
{ path: 'courseList', name: 'CourseList', component: () => import('@/views/manager/CourseList.vue')},
{ path: 'studentCourse', name: 'StudentCourse', component: () => import('@/views/manager/StudentCourse.vue')},
{ path: 'person', name: 'Person', component: () => import('@/views/manager/Person.vue')},
{ path: 'grade', name: 'Grade', component: () => import('@/views/manager/Grade.vue')},
]
},
{ path: '/login', name: 'Login', component: () => import('@/views/Login.vue'),},

@ -43,7 +43,17 @@
<span>选课记录</span>
</el-menu-item>
</el-sub-menu>
<el-sub-menu index="3" v-if="user.role === 'ADMIN'">
<el-sub-menu index="3">
<template #title>
<el-icon><Memo /></el-icon>
<span>成绩信息</span>
</template>
<el-menu-item index="/grade">
<el-icon><Document /></el-icon>
<span>学生成绩</span>
</el-menu-item>
</el-sub-menu>
<el-sub-menu index="4" v-if="user.role === 'ADMIN'">
<template #title>
<el-icon><User /></el-icon>
<span>用户管理</span>

@ -0,0 +1,142 @@
<template>
<div>
<div class="card" style="margin-bottom: 10px">
<el-input style="width: 260px; margin-right: 10px" v-model="data.courseName" placeholder="请输入课程名称查询"
:prefix-icon="Search"/>
<el-input style="width: 260px; margin-right: 10px" v-model="data.studentName" placeholder="请输入学生名称查询"
:prefix-icon="Search"/>
<el-button type="primary" style="margin-left: 10px" @click="load"></el-button>
<el-button type="info" @click="reset"></el-button>
</div>
<div class="card" style="margin-bottom: 10px">
<div>
<el-table :data="data.tableData" style="width: 100%">
<el-table-column prop="id" label="序号" width="70"/>
<el-table-column prop="courseName" label="课程名称"/>
<el-table-column prop="studentName" label="学生名称"/>
<el-table-column prop="score" label="分数"/>
<el-table-column prop="comment" label="评语"/>
<el-table-column prop="feedback" label="反馈"/>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button type="primary" @click="handleEdit(scope.row)" v-if="data.user.role === 'ADMIN'"></el-button>
<el-button type="danger" @click="del(scope.row.id)" v-if="data.user.role === 'ADMIN'"></el-button>
<el-button type="primary" @click="handleEdit(scope.row)" v-if="data.user.role === 'STUDENT'"></el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="card">
<el-pagination v-model:current-page="data.pageNum" v-model:page-size="data.pageSize"
@current-change="handelCurrentChange"
background layout="prev, pager, next" :total="data.total"/>
</div>
<el-dialog width="35%" v-model="data.formVisible" title="反馈信息">
<el-form :model="data.form" label-width="100px" label-position="right" style="padding-right: 40px">
<el-form-item label="评分" v-if="data.user.role === 'ADMIN'">
<el-input v-model="data.form.score" autocomplete="off" />
</el-form-item>
<el-form-item label="评语" v-if="data.user.role === 'ADMIN'">
<el-input type="textarea" v-model="data.form.comment" autocomplete="off" />
</el-form-item>
<el-form-item label="反馈" v-if="data.user.role === 'STUDENT'">
<el-input type="textarea" v-model="data.form.feedback" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="data.formVisible = false"> </el-button>
<el-button type="primary" @click="save"> </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {reactive} from "vue"
import {Search} from '@element-plus/icons-vue'
import request from "@/utils/request";
import {ElMessage, ElMessageBox} from "element-plus";
const data = reactive({
form: {},
courseName: '',
studentName: '',
tableData: [],
total: 0,
pageNum: 1, //
pageSize: 5, //
user: JSON.parse(localStorage.getItem('student-user') || '{}'),
formVisible: false
})
const load = () => {
let params = {
pageNum: data.pageNum,
pageSize: data.pageSize,
courseName: data.courseName,
studentName: data.studentName
}
if (data.user.role === 'STUDENT') { //
params.studentId = data.user.id
}
request.get('/grade/selectPage', {
params: params
}).then(res => {
data.tableData = res.data?.list || []
data.total = res.data?.total || 0
})
}
//
load()
const handelCurrentChange = () => {
//
load()
}
const reset = () => {
data.courseName = ''
data.studentName = ''
load()
}
const del = (id) => {
ElMessageBox.confirm('删除数据后无法恢复,您确认删除吗?', '删除确认', { type: 'warning' }).then(res => {
request.delete('/grade/delete/' + id).then(res => {
if (res.code === '200') {
load() //
ElMessage.success("操作成功")
} else {
ElMessage.error(res.msg)
}
})
}).catch(res => {})
}
//
const handleEdit = (row) => {
data.form = JSON.parse(JSON.stringify(row)) //
data.formVisible = true
}
const save = () => {
request.put('/grade/update', data.form).then(res => {
if (res.code === '200') {
load()
data.formVisible = false //
ElMessage.success("操作成功")
} else {
ElMessage.error(res.msg)
}
})
}
</script>

@ -26,6 +26,25 @@
@current-change = "handleCurrentChange"
background layout="prev, pager, next" :total="data.total" />
</div>
<el-dialog width="35%" v-model="data.formVisible" title="成绩信息">
<el-form :model="data.gradeForm" label-width="100px" label-position="right" style="padding-right: 40px">
<el-form-item label="课程名称">
<el-input v-model="data.gradeForm.name" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="分数">
<el-input v-model="data.gradeForm.score" autocomplete="off" />
</el-form-item>
<el-form-item label="评语">
<el-input type="textarea" v-model="data.gradeForm.comment" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="data.formVisible = false"> </el-button>
<el-button type="primary" @click="save"> </el-button>
</span>
</template>
</el-dialog>
</div>
@ -43,7 +62,9 @@ const data = reactive({
total:0,
pageSize:5,//
pageNum: 1, //
user:JSON.parse(localStorage.getItem('student-user') || '{}')
user:JSON.parse(localStorage.getItem('student-user') || '{}'),
gradeForm: {},
formVisible: false
})
const load =()=>{
let params = {
@ -92,6 +113,20 @@ const del = (id) => {
//
const addGrade = () => {
//
data.formVisible = true
data.gradeForm.name = row.name
data.gradeForm.courseId = row.courseId
data.gradeForm.studentId = row.studentId
}
const save = () => {
request.post('/grade/add', data.gradeForm).then(res => {
if (res.code === '200') {
data.formVisible = false //
ElMessage.success("操作成功")
} else {
ElMessage.error(res.msg)
}
})
}
</script>
Loading…
Cancel
Save