[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-fLHT6xiE":3,"public-project-articles-fLHT6xiE":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},32,"fLHT6xiE",26,"15. 开发成绩管理功能","\n# SQL\n\n```sql\nCREATE TABLE `grade` (\n  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `course_id` int(11) DEFAULT NULL COMMENT '课程ID',\n  `student_id` int(11) DEFAULT NULL COMMENT '学生ID',\n  `score` double(10,1) DEFAULT NULL COMMENT '分数',\n  `comment` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评语',\n  `feedback` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学生反馈',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成绩';\n```\n\n# 打分弹窗\n\n```vue\n\u003Cel-dialog width=\"35%\" v-model=\"data.formVisible\" title=\"成绩信息\">\n  \u003Cel-form :model=\"data.gradeForm\" label-width=\"100px\" label-position=\"right\" style=\"padding-right: 40px\">\n    \u003Cel-form-item label=\"课程名称\">\n      \u003Cel-input v-model=\"data.gradeForm.name\" autocomplete=\"off\" disabled \u002F>\n    \u003C\u002Fel-form-item>\n    \u003Cel-form-item label=\"分数\">\n      \u003Cel-input v-model=\"data.gradeForm.score\" autocomplete=\"off\" \u002F>\n    \u003C\u002Fel-form-item>\n    \u003Cel-form-item label=\"评语\">\n      \u003Cel-input type=\"textarea\" v-model=\"data.gradeForm.comment\" autocomplete=\"off\" \u002F>\n    \u003C\u002Fel-form-item>\n  \u003C\u002Fel-form>\n  \u003Ctemplate #footer>\n    \u003Cspan class=\"dialog-footer\">\n      \u003Cel-button @click=\"data.formVisible = false\">取 消\u003C\u002Fel-button>\n      \u003Cel-button type=\"primary\" @click=\"save\">保 存\u003C\u002Fel-button>\n    \u003C\u002Fspan>\n  \u003C\u002Ftemplate>\n\u003C\u002Fel-dialog>\n```\n\n# 成绩查询的逻辑\n\n注意要写 **studentName、courseName** Getter 和 Setter 方法\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\u003C!DOCTYPE mapper\n        PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Mapper 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-mapper.dtd\">\n\u003Cmapper namespace=\"com.example.mapper.GradeMapper\">\n\n    \u003Cselect id=\"selectAll\" resultType=\"com.example.entity.Grade\">\n        select grade.*, student.name as studentName, course.name as courseName\n        from grade\n        left join student\n        on grade.student_id = student.id\n        left join course\n        on grade.course_id = course.id\n        \u003Cwhere>\n            \u003Cif test=\"studentName != null\">and student.name like concat('%', #{studentName}, '%')\u003C\u002Fif>\n            \u003Cif test=\"courseName != null\">and course.name like concat('%', #{courseName}, '%')\u003C\u002Fif>\n            \u003Cif test=\"studentId != null\">and grade.student_id = #{studentId}\u003C\u002Fif>\n        \u003C\u002Fwhere>\n        order by id desc\n    \u003C\u002Fselect>\n\n\u003C\u002Fmapper>\n```\n\n# 成绩编辑的弹窗\n\n```vue\n\u003Cel-dialog width=\"35%\" v-model=\"data.formVisible\" title=\"反馈信息\">\n  \u003Cel-form :model=\"data.form\" label-width=\"100px\" label-position=\"right\" style=\"padding-right: 40px\">\n    \u003Cel-form-item label=\"评分\" v-if=\"data.user.role === 'ADMIN'\">\n      \u003Cel-input v-model=\"data.form.score\" autocomplete=\"off\" \u002F>\n    \u003C\u002Fel-form-item>\n    \u003Cel-form-item label=\"评语\" v-if=\"data.user.role === 'ADMIN'\">\n      \u003Cel-input type=\"textarea\" v-model=\"data.form.comment\" autocomplete=\"off\" \u002F>\n    \u003C\u002Fel-form-item>\n    \u003Cel-form-item label=\"反馈\" v-if=\"data.user.role === 'STUDENT'\">\n      \u003Cel-input type=\"textarea\" v-model=\"data.form.feedback\" autocomplete=\"off\" \u002F>\n    \u003C\u002Fel-form-item>\n  \u003C\u002Fel-form>\n  \u003Ctemplate #footer>\n    \u003Cspan class=\"dialog-footer\">\n      \u003Cel-button @click=\"data.formVisible = false\">取 消\u003C\u002Fel-button>\n      \u003Cel-button type=\"primary\" @click=\"save\">保 存\u003C\u002Fel-button>\n    \u003C\u002Fspan>\n  \u003C\u002Ftemplate>\n\u003C\u002Fel-dialog>\n```\n\n# 成绩操作按钮需要判断角色\n\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1700750841530-9d6ee6d0-5ee1-41a7-ad9f-f6d2833fe222.png#averageHue=%23302c2b&clientId=u4f4c7e8a-4eaa-4&from=paste&height=437&id=uaa360376&originHeight=546&originWidth=1294&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=101673&status=done&style=none&taskId=u79bcd317-0d31-4920-a8b1-de86c867f2b&title=&width=1035.2)\n\n# 在管理员打分的时候要做个判断提醒\n\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1700750725306-b145b37f-11a0-44a4-b701-ff2c99d1856b.png#averageHue=%232d2c2c&clientId=u4f4c7e8a-4eaa-4&from=paste&height=255&id=uac9037c8&originHeight=319&originWidth=866&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=36667&status=done&style=none&taskId=uccd6a2cb-502e-4c7c-9827-76c45a8a85b&title=&width=692.8)\n\n```java\n@Select(\"select * from grade where student_id = #{studentId} and course_id = #{courseId}\")\nGrade selectByCondition(Grade grade);\n```\n\n# 完整的成绩页面\n\n```vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Cdiv class=\"card\" style=\"margin-bottom: 10px\">\n      \u003Cel-input style=\"width: 260px; margin-right: 10px\" v-model=\"data.courseName\" placeholder=\"请输入课程名称查询\"\n                :prefix-icon=\"Search\"\u002F>\n      \u003Cel-input style=\"width: 260px; margin-right: 10px\" v-model=\"data.studentName\" placeholder=\"请输入学生名称查询\"\n                :prefix-icon=\"Search\"\u002F>\n      \u003Cel-button type=\"primary\" style=\"margin-left: 10px\" @click=\"load\">查询\u003C\u002Fel-button>\n      \u003Cel-button type=\"info\" @click=\"reset\">重置\u003C\u002Fel-button>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\" style=\"margin-bottom: 10px\">\n\n      \u003Cdiv>\n        \u003Cel-table :data=\"data.tableData\" style=\"width: 100%\">\n          \u003Cel-table-column prop=\"id\" label=\"序号\" width=\"70\"\u002F>\n          \u003Cel-table-column prop=\"courseName\" label=\"课程名称\"\u002F>\n          \u003Cel-table-column prop=\"studentName\" label=\"学生名称\"\u002F>\n          \u003Cel-table-column prop=\"score\" label=\"分数\"\u002F>\n          \u003Cel-table-column prop=\"comment\" label=\"评语\"\u002F>\n          \u003Cel-table-column prop=\"feedback\" label=\"反馈\"\u002F>\n          \u003Cel-table-column label=\"操作\" width=\"180\">\n            \u003Ctemplate #default=\"scope\">\n              \u003Cel-button type=\"primary\" @click=\"handleEdit(scope.row)\" v-if=\"data.user.role === 'ADMIN'\">编辑\u003C\u002Fel-button>\n              \u003Cel-button type=\"danger\" @click=\"del(scope.row.id)\" v-if=\"data.user.role === 'ADMIN'\">删除\u003C\u002Fel-button>\n              \u003Cel-button type=\"primary\" @click=\"handleEdit(scope.row)\" v-if=\"data.user.role === 'STUDENT'\">反馈\u003C\u002Fel-button>\n            \u003C\u002Ftemplate>\n          \u003C\u002Fel-table-column>\n        \u003C\u002Fel-table>\n      \u003C\u002Fdiv>\n\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cel-pagination v-model:current-page=\"data.pageNum\" v-model:page-size=\"data.pageSize\"\n                     @current-change=\"handelCurrentChange\"\n                     background layout=\"prev, pager, next\" :total=\"data.total\"\u002F>\n    \u003C\u002Fdiv>\n\n    \u003Cel-dialog width=\"35%\" v-model=\"data.formVisible\" title=\"反馈信息\">\n      \u003Cel-form :model=\"data.form\" label-width=\"100px\" label-position=\"right\" style=\"padding-right: 40px\">\n        \u003Cel-form-item label=\"评分\" v-if=\"data.user.role === 'ADMIN'\">\n          \u003Cel-input v-model=\"data.form.score\" autocomplete=\"off\" \u002F>\n        \u003C\u002Fel-form-item>\n        \u003Cel-form-item label=\"评语\" v-if=\"data.user.role === 'ADMIN'\">\n          \u003Cel-input type=\"textarea\" v-model=\"data.form.comment\" autocomplete=\"off\" \u002F>\n        \u003C\u002Fel-form-item>\n        \u003Cel-form-item label=\"反馈\" v-if=\"data.user.role === 'STUDENT'\">\n          \u003Cel-input type=\"textarea\" v-model=\"data.form.feedback\" autocomplete=\"off\" \u002F>\n        \u003C\u002Fel-form-item>\n      \u003C\u002Fel-form>\n      \u003Ctemplate #footer>\n        \u003Cspan class=\"dialog-footer\">\n          \u003Cel-button @click=\"data.formVisible = false\">取 消\u003C\u002Fel-button>\n          \u003Cel-button type=\"primary\" @click=\"save\">保 存\u003C\u002Fel-button>\n        \u003C\u002Fspan>\n      \u003C\u002Ftemplate>\n    \u003C\u002Fel-dialog>\n\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport {reactive} from \"vue\"\nimport {Search} from '@element-plus\u002Ficons-vue'\nimport request from \"@\u002Futils\u002Frequest\";\nimport {ElMessage, ElMessageBox} from \"element-plus\";\n\nconst data = reactive({\n  form: {},\n  courseName: '',\n  studentName: '',\n  tableData: [],\n  total: 0,\n  pageNum: 1,  \u002F\u002F 当前的页码\n  pageSize: 5,  \u002F\u002F 每页的个数\n  user: JSON.parse(localStorage.getItem('student-user') || '{}'),\n  formVisible: false\n})\n\nconst load = () => {\n  let params = {\n    pageNum: data.pageNum,\n    pageSize: data.pageSize,\n    courseName: data.courseName,\n    studentName: data.studentName\n  }\n  if (data.user.role === 'STUDENT') {  \u002F\u002F 如果当前登录的是学生，那就查询自己的选课记录\n    params.studentId = data.user.id\n  }\n  request.get('\u002Fgrade\u002FselectPage', {\n    params: params\n  }).then(res => {\n    data.tableData = res.data?.list || []\n    data.total = res.data?.total || 0\n  })\n}\n\u002F\u002F 调用方法获取后台数据\nload()\n\nconst handelCurrentChange = () => {\n  \u002F\u002F 当翻页的时候重新加载数据即可\n  load()\n}\n\nconst reset = () => {\n  data.courseName = ''\n  data.studentName = ''\n  load()\n}\n\nconst del = (id) => {\n  ElMessageBox.confirm('删除数据后无法恢复，您确认删除吗？', '删除确认', { type: 'warning' }).then(res => {\n    request.delete('\u002Fgrade\u002Fdelete\u002F' + id).then(res => {\n      if (res.code === '200') {\n        load()    \u002F\u002F 重新获取数据\n        ElMessage.success(\"操作成功\")\n      } else {\n        ElMessage.error(res.msg)\n      }\n    })\n  }).catch(res => {})\n}\n\n\u002F\u002F 打分\nconst handleEdit = (row) => {\n  data.form = JSON.parse(JSON.stringify(row))  \u002F\u002F 拷贝行数据到表单对象\n  data.formVisible = true\n}\n\nconst save = () => {\n  request.put('\u002Fgrade\u002Fupdate', data.form).then(res => {\n    if (res.code === '200') {\n      load()\n      data.formVisible = false  \u002F\u002F 关闭弹窗\n      ElMessage.success(\"操作成功\")\n    } else {\n      ElMessage.error(res.msg)\n    }\n  })\n}\n\u003C\u002Fscript>\n```\n\n# 完整的成绩接口\n\n```java\npackage com.example.controller;\n\nimport com.example.common.Result;\nimport com.example.entity.Grade;\nimport com.example.service.GradeService;\nimport com.github.pagehelper.PageInfo;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\n\n\u002F**\n * 成绩接口\n *\u002F\n@RestController\n@RequestMapping(\"\u002Fgrade\")\npublic class GradeController {\n\n    @Resource\n    GradeService gradeService;\n\n\n    @PostMapping(\"\u002Fadd\")\n    public Result add(@RequestBody Grade grade) {\n        gradeService.add(grade);\n        return Result.success();\n    }\n\n    @PutMapping(\"\u002Fupdate\")\n    public Result update(@RequestBody Grade grade) {\n        gradeService.update(grade);\n        return Result.success();\n    }\n\n    \u002F**\n     * 删除成绩\n     *\u002F\n    @DeleteMapping(\"\u002Fdelete\u002F{id}\")\n    public Result delete(@PathVariable Integer id) {\n        gradeService.deleteById(id);\n        return Result.success();\n    }\n\n    \u002F**\n     * 分页条件查询课程\n     *\u002F\n    @GetMapping(\"\u002FselectPage\")\n    public Result selectPage(@RequestParam(defaultValue = \"1\") Integer pageNum,\n                             @RequestParam(defaultValue = \"5\") Integer pageSize,\n                             Grade grade) {   \u002F\u002F ?name=xx&no=xx\n        PageInfo\u003CGrade> pageInfo = gradeService.selectPage(pageNum, pageSize, grade);\n        return Result.success(pageInfo);\n    }\n\n}\n\n```\n","coding",1,1253,33,"2024-04-16 02:35:54","2026-05-03 22:49:02","SpringBoot+Vue3的学生成绩管理系统","student-performance",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,27,33,39,45,51,57,63,68,74,80,86,92,98,103,104],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":14,"project_title":15,"project_slug":16},18,"7r0zrxqF","01. 学生成绩管理系统介绍",3753,19,"2025-01-09 10:22:30",{"id":25,"uuid":28,"project_id":6,"title":29,"type":9,"status":10,"public_enabled":10,"views":30,"sort":31,"created_at":32,"updated_at":14,"project_title":15,"project_slug":16},"h5U5WN1A","02. 脚手架介绍",3957,20,"2025-01-09 10:22:49",{"id":31,"uuid":34,"project_id":6,"title":35,"type":9,"status":10,"public_enabled":10,"views":36,"sort":37,"created_at":38,"updated_at":14,"project_title":15,"project_slug":16},"aKzqZqzY","03. 实现登录功能",3607,21,"2024-04-16 02:36:48",{"id":37,"uuid":40,"project_id":6,"title":41,"type":9,"status":10,"public_enabled":10,"views":42,"sort":43,"created_at":44,"updated_at":14,"project_title":15,"project_slug":16},"xve1cq5m","04. 开发课程管理页面",1907,22,"2024-04-16 02:36:40",{"id":43,"uuid":46,"project_id":6,"title":47,"type":9,"status":10,"public_enabled":10,"views":48,"sort":49,"created_at":50,"updated_at":14,"project_title":15,"project_slug":16},"KUfmmtjB","05. 开发课程分页查询接口",1303,23,"2024-04-16 02:36:36",{"id":49,"uuid":52,"project_id":6,"title":53,"type":9,"status":10,"public_enabled":10,"views":54,"sort":55,"created_at":56,"updated_at":14,"project_title":15,"project_slug":16},"5aLIaQCP","06. 开发课程前后台数据对接",1040,24,"2024-04-16 02:36:32",{"id":55,"uuid":58,"project_id":6,"title":59,"type":9,"status":10,"public_enabled":10,"views":60,"sort":61,"created_at":62,"updated_at":14,"project_title":15,"project_slug":16},"dTwkIyqR","07. 开发课程新增和编辑功能",990,25,"2024-04-16 02:36:27",{"id":61,"uuid":64,"project_id":6,"title":65,"type":9,"status":10,"public_enabled":10,"views":66,"sort":6,"created_at":67,"updated_at":14,"project_title":15,"project_slug":16},"NlyNo5n8","08. 开发课程管理删除功能",666,"2024-04-16 02:36:23",{"id":6,"uuid":69,"project_id":6,"title":70,"type":9,"status":10,"public_enabled":10,"views":71,"sort":72,"created_at":73,"updated_at":14,"project_title":15,"project_slug":16},"dDLZGpA4","09. 开发学生登录功能",1019,27,"2024-04-16 02:36:20",{"id":72,"uuid":75,"project_id":6,"title":76,"type":9,"status":10,"public_enabled":10,"views":77,"sort":78,"created_at":79,"updated_at":14,"project_title":15,"project_slug":16},"5qCBv54l","10. 开发学生注册功能",811,28,"2024-04-16 02:36:15",{"id":78,"uuid":81,"project_id":6,"title":82,"type":9,"status":10,"public_enabled":10,"views":83,"sort":84,"created_at":85,"updated_at":14,"project_title":15,"project_slug":16},"smeYDA8N","11. 开发学生管理功能",1060,29,"2024-04-16 02:36:10",{"id":84,"uuid":87,"project_id":6,"title":88,"type":9,"status":10,"public_enabled":10,"views":89,"sort":90,"created_at":91,"updated_at":14,"project_title":15,"project_slug":16},"eji2Bt8v","12. 开发文件上传下载功能",914,30,"2024-04-16 02:36:07",{"id":90,"uuid":93,"project_id":6,"title":94,"type":9,"status":10,"public_enabled":10,"views":95,"sort":96,"created_at":97,"updated_at":14,"project_title":15,"project_slug":16},"BkumMnOk","13. 开发个人资料功能",980,31,"2024-04-16 02:36:03",{"id":96,"uuid":99,"project_id":6,"title":100,"type":9,"status":10,"public_enabled":10,"views":101,"sort":4,"created_at":102,"updated_at":14,"project_title":15,"project_slug":16},"C7ux2BRH","14. 开发学生选课功能",1221,"2024-04-16 02:35:58",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":105,"uuid":106,"project_id":6,"title":107,"type":9,"status":10,"public_enabled":10,"views":108,"sort":109,"created_at":110,"updated_at":111,"project_title":15,"project_slug":16},56,"k3gvEqlV","基于SpringBoot+Vue3的学生成绩管理系统资料汇总",355,100,"2024-12-26 16:23:07","2026-05-07 15:36:12.649662+00"]