Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:教室信息管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
1.0 项目介绍
开发工具:IDEA、VScode
服务器:Tomcat, JDK 17
项目构建:maven
数据库:mysql 8.0
系统用户前台和管理后台两部分,项目采用前后端分离
前端技术:vue3 + elementUI
服务端技术:springboot + mybatis + redis + mysql
1.1 项目功能
后台功能:
1)登录、退出系统、首页
2)教室管理
(1) 教室管理:添加、修改、删除、查询等功能。
3)教师管理
(1) 教师管理:添加、修改、删除、查询等功能。
4)课程管理
(1) 课程管理:添加、修改、删除、查询等功能。
5)设施管理
(1) 设施管理:添加、修改、删除、查询等功能。
6)教室设施信息
(1) 教室设施信息:添加、修改、删除、查询等功能。
7)课程安排
(1) 课程安排:添加、修改、删除、查询等功能。
8)教室使用记录
(1)教室使用记录:添加、修改、删除、查询等功能。
9)系统管理
用户信息管理
(1)用户信息管理:添加、修改、删除、查询等功能。
角色管理
(2)角色信息管理:添加、修改、删除、查询等功能。
菜单管理
(3)菜单信息管理:添加、修改、删除、查询等功能。
日志管理
(4)日志信息管理:添加、修改、删除、查询等功能。
10)系统监控
查看在先用户、设置定时任务、数据监控、缓存监控、查看缓存列表等。
11)权限管理
(1) 角色信息管理:添加、修改、删除、分配权限等功能。
(2) 资源信息管理:添加、修改、删除等功能。
注意:不一定非要完全符合开发环境,有稍微的差别也是可以开发的。
若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希
望可以帮助到大家!
2.0 用户登录
用户根据正确的用户名、密码且通过正确的校验码进行登录。使用了高质量的背景图片,希
望你喜欢。
整体的主题颜色为:猛男粉
实现了登录校验,还有用户注册功能:
用到了 Spring Security 框架来实现登录、校验、验证等功能。
相关的部分源码:
@RestController public class SysLoginController {@Autowiredprivate SysLoginService loginService;@Autowiredprivate ISysMenuService menuService;@Autowiredprivate SysPermissionService permissionService;/*** 登录方法* * @param loginBody 登录信息* @return 结果*/@PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody){AjaxResult ajax = AjaxResult.success();// 生成令牌String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid());ajax.put(Constants.TOKEN, token);return ajax;}/*** 获取用户信息* * @return 用户信息*/@GetMapping("getInfo")public AjaxResult getInfo(){SysUser user = SecurityUtils.getLoginUser().getUser();// 角色集合Set<String> roles = permissionService.getRolePermission(user);// 权限集合Set<String> permissions = permissionService.getMenuPermission(user);AjaxResult ajax = AjaxResult.success();ajax.put("user", user);ajax.put("roles", roles);ajax.put("permissions", permissions);return ajax;}/*** 获取路由信息* * @return 路由信息*/@GetMapping("getRouters")public AjaxResult getRouters(){Long userId = SecurityUtils.getUserId();List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);return AjaxResult.success(menuService.buildMenus(menus));} }
public String login(String username, String password, String code, String uuid){// 验证码校验validateCaptcha(username, code, uuid);// 登录前置校验loginPreCheck(username, password);// 用户验证Authentication authentication = null;try{UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}finally{AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}
3.0 首页界面
使用了各种各样的统计图表来直观展示数据。
相关的前端源码:
<template><div class="dashboard-container"><div class="chart-container"><div class="chart-header"><h2>教室使用情况统计</h2></div><div class="charts"><div id="barChart" class="chart"></div><div id="pieChart" class="chart"></div><div id="lineChart" class="chart"></div><div id="gaugeChart" class="chart"></div></div></div></div> </template><script> import * as echarts from 'echarts';export default {name: 'Dashboard',mounted() {this.initBarChart();this.initPieChart();this.initLineChart();this.initGaugeChart();},methods: {initBarChart() {const barChart = echarts.init(document.getElementById('barChart'));const option = {title: {text: '各教室使用次数',left: 'center',textStyle: {color: '#fff'}},tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},xAxis: {type: 'category',data: ['教室3B-413', '教室3B-414', '教室3B-415', '教室3B-416', '教室3B-417'],axisLabel: {color: '#fff'}},yAxis: {type: 'value',axisLabel: {color: '#fff'}},series: [{data: [120, 200, 150, 80, 70],type: 'bar',itemStyle: {color: '#FF69B4'}}]};barChart.setOption(option);},initPieChart() {const pieChart = echarts.init(document.getElementById('pieChart'));const option = {title: {text: '教室使用比例',left: 'center',textStyle: {color: '#fff'}},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left',textStyle: {color: '#fff'}},series: [{name: '教室',type: 'pie',radius: '50%',data: [{ value: 335, name: '教室3B-413' },{ value: 310, name: '教室3B-414' },{ value: 234, name: '教室3B-415' },{ value: 135, name: '教室3B-416' },{ value: 1548, name: '教室3B-417' }],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}},itemStyle: {color: function(params) {const colorList = ['#FF69B4', '#FF1493', '#DB7093', '#C71585', '#DA70D6'];return colorList[params.dataIndex];}}}]};pieChart.setOption(option);},initLineChart() {const lineChart = echarts.init(document.getElementById('lineChart'));const option = {title: {text: '教室使用时间趋势',left: 'center',textStyle: {color: '#fff'}},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],axisLabel: {color: '#fff'}},yAxis: {type: 'value',axisLabel: {color: '#fff'}},series: [{data: [120, 200, 150, 80, 70, 110, 130],type: 'line',itemStyle: {color: '#FF69B4'}}]};lineChart.setOption(option);},initGaugeChart() {const gaugeChart = echarts.init(document.getElementById('gaugeChart'));const option = {title: {text: '总使用次数',left: 'center',textStyle: {color: '#fff'}},tooltip: {formatter: '{a} <br/>{b} : {c}'},series: [{name: '使用次数',type: 'gauge',detail: {formatter: '{value}',color: '#fff'},data: [{ value: 2500, name: '总次数' }],axisLabel: {color: '#fff'},axisLine: {lineStyle: {color: [[0.2, '#FF69B4'], [0.8, '#FF1493'], [1, '#DB7093']],width: 12}},pointer: {width: 5},axisTick: {length: 10,lineStyle: {color: 'auto'}},splitLine: {length: 15,lineStyle: {color: 'auto'}}}]};gaugeChart.setOption(option);}} }; </script><style lang="scss"> $theme_color: #FF69B4;.dashboard-container {min-height: 100vh;width: 100%;background-image: url('../../assets/images/6.jpg'); /* 使用占位图片,你可以替换为实际图片 */background-size: cover;background-position: center;display: flex;justify-content: center;align-items: center;.chart-container {background-color: rgba(0, 0, 0, 0.7); /* 半透明背景 */border-radius: 20px;box-shadow: 0 0 40px rgba(0, 0, 0, 0.5);width: 80%;max-width: 1200px;padding: 40px;color: #fff;.chart-header {text-align: center;margin-bottom: 30px;h2 {color: $theme_color;font-weight: bold;}}.charts {display: flex;flex-wrap: wrap;justify-content: space-between;.chart {width: 48%;height: 400px;margin-bottom: 20px;}}} } </style>
4.0 教室管理功能
上传图片使用了第三方接口:x-File-Storage 框架。
相关源码:
@RestController @RequestMapping("/manage/Classrooms") public class ClassroomsController extends BaseController {@Autowiredprivate IClassroomsService classroomsService;/*** 查询教室信息列表*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:list')")@GetMapping("/list")public TableDataInfo list(Classrooms classrooms){startPage();List<Classrooms> list = classroomsService.selectClassroomsList(classrooms);return getDataTable(list);}/*** 导出教室信息列表*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:export')")@Log(title = "教室信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Classrooms classrooms){List<Classrooms> list = classroomsService.selectClassroomsList(classrooms);ExcelUtil<Classrooms> util = new ExcelUtil<Classrooms>(Classrooms.class);util.exportExcel(response, list, "教室信息数据");}/*** 获取教室信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:query')")@GetMapping(value = "/{classroomId}")public AjaxResult getInfo(@PathVariable("classroomId") Long classroomId){return success(classroomsService.selectClassroomsByClassroomId(classroomId));}/*** 新增教室信息*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:add')")@Log(title = "教室信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Classrooms classrooms){return toAjax(classroomsService.insertClassrooms(classrooms));}/*** 修改教室信息*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:edit')")@Log(title = "教室信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Classrooms classrooms){return toAjax(classroomsService.updateClassrooms(classrooms));}/*** 删除教室信息*/@PreAuthorize("@ss.hasPermi('manage:Classrooms:remove')")@Log(title = "教室信息", businessType = BusinessType.DELETE)@DeleteMapping("/{classroomIds}")public AjaxResult remove(@PathVariable Long[] classroomIds){return toAjax(classroomsService.deleteClassroomsByClassroomIds(classroomIds));} }
5.0 教师管理功能
相关源码:
@RestController @RequestMapping("/manage/Teachers") public class TeachersController extends BaseController {@Autowiredprivate ITeachersService teachersService;/*** 查询教师信息列表*/@PreAuthorize("@ss.hasPermi('manage:Teachers:list')")@GetMapping("/list")public TableDataInfo list(Teachers teachers){startPage();List<Teachers> list = teachersService.selectTeachersList(teachers);return getDataTable(list);}/*** 导出教师信息列表*/@PreAuthorize("@ss.hasPermi('manage:Teachers:export')")@Log(title = "教师信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Teachers teachers){List<Teachers> list = teachersService.selectTeachersList(teachers);ExcelUtil<Teachers> util = new ExcelUtil<Teachers>(Teachers.class);util.exportExcel(response, list, "教师信息数据");}/*** 获取教师信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:Teachers:query')")@GetMapping(value = "/{teacherId}")public AjaxResult getInfo(@PathVariable("teacherId") Long teacherId){return success(teachersService.selectTeachersByTeacherId(teacherId));}/*** 新增教师信息*/@PreAuthorize("@ss.hasPermi('manage:Teachers:add')")@Log(title = "教师信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Teachers teachers){return toAjax(teachersService.insertTeachers(teachers));}/*** 修改教师信息*/@PreAuthorize("@ss.hasPermi('manage:Teachers:edit')")@Log(title = "教师信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Teachers teachers){return toAjax(teachersService.updateTeachers(teachers));}/*** 删除教师信息*/@PreAuthorize("@ss.hasPermi('manage:Teachers:remove')")@Log(title = "教师信息", businessType = BusinessType.DELETE)@DeleteMapping("/{teacherIds}")public AjaxResult remove(@PathVariable Long[] teacherIds){return toAjax(teachersService.deleteTeachersByTeacherIds(teacherIds));} }
6.0 课程管理功能
相关源码:
@RestController @RequestMapping("/manage/Courses") public class CoursesController extends BaseController {@Autowiredprivate ICoursesService coursesService;/*** 查询课程信息列表*/@PreAuthorize("@ss.hasPermi('manage:Courses:list')")@GetMapping("/list")public TableDataInfo list(Courses courses){startPage();List<Courses> list = coursesService.selectCoursesList(courses);return getDataTable(list);}/*** 导出课程信息列表*/@PreAuthorize("@ss.hasPermi('manage:Courses:export')")@Log(title = "课程信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Courses courses){List<Courses> list = coursesService.selectCoursesList(courses);ExcelUtil<Courses> util = new ExcelUtil<Courses>(Courses.class);util.exportExcel(response, list, "课程信息数据");}/*** 获取课程信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:Courses:query')")@GetMapping(value = "/{courseId}")public AjaxResult getInfo(@PathVariable("courseId") Long courseId){return success(coursesService.selectCoursesByCourseId(courseId));}/*** 新增课程信息*/@PreAuthorize("@ss.hasPermi('manage:Courses:add')")@Log(title = "课程信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Courses courses){return toAjax(coursesService.insertCourses(courses));}/*** 修改课程信息*/@PreAuthorize("@ss.hasPermi('manage:Courses:edit')")@Log(title = "课程信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Courses courses){return toAjax(coursesService.updateCourses(courses));}/*** 删除课程信息*/@PreAuthorize("@ss.hasPermi('manage:Courses:remove')")@Log(title = "课程信息", businessType = BusinessType.DELETE)@DeleteMapping("/{courseIds}")public AjaxResult remove(@PathVariable Long[] courseIds){return toAjax(coursesService.deleteCoursesByCourseIds(courseIds));} }
7.0 设施管理功能
相关源码:
@RestController @RequestMapping("/manage/Facilities") public class FacilitiesController extends BaseController {@Autowiredprivate IFacilitiesService facilitiesService;/*** 查询教室设施列表*/@PreAuthorize("@ss.hasPermi('manage:Facilities:list')")@GetMapping("/list")public TableDataInfo list(Facilities facilities){startPage();List<Facilities> list = facilitiesService.selectFacilitiesList(facilities);return getDataTable(list);}/*** 导出教室设施列表*/@PreAuthorize("@ss.hasPermi('manage:Facilities:export')")@Log(title = "教室设施", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Facilities facilities){List<Facilities> list = facilitiesService.selectFacilitiesList(facilities);ExcelUtil<Facilities> util = new ExcelUtil<Facilities>(Facilities.class);util.exportExcel(response, list, "教室设施数据");}/*** 获取教室设施详细信息*/@PreAuthorize("@ss.hasPermi('manage:Facilities:query')")@GetMapping(value = "/{facilityId}")public AjaxResult getInfo(@PathVariable("facilityId") Long facilityId){return success(facilitiesService.selectFacilitiesByFacilityId(facilityId));}/*** 新增教室设施*/@PreAuthorize("@ss.hasPermi('manage:Facilities:add')")@Log(title = "教室设施", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Facilities facilities){return toAjax(facilitiesService.insertFacilities(facilities));}/*** 修改教室设施*/@PreAuthorize("@ss.hasPermi('manage:Facilities:edit')")@Log(title = "教室设施", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Facilities facilities){return toAjax(facilitiesService.updateFacilities(facilities));}/*** 删除教室设施*/@PreAuthorize("@ss.hasPermi('manage:Facilities:remove')")@Log(title = "教室设施", businessType = BusinessType.DELETE)@DeleteMapping("/{facilityIds}")public AjaxResult remove(@PathVariable Long[] facilityIds){return toAjax(facilitiesService.deleteFacilitiesByFacilityIds(facilityIds));} }
8.0 教师与设施信息功能
相关源码:
@RestController @RequestMapping("/manage/ClassroomFacilities") public class ClassroomFacilitiesController extends BaseController {@Autowiredprivate IClassroomFacilitiesService classroomFacilitiesService;/*** 查询教室与设施的多对多关系列表*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:list')")@GetMapping("/list")public TableDataInfo list(ClassroomFacilities classroomFacilities){startPage();List<ClassroomFacilities> list = classroomFacilitiesService.selectClassroomFacilitiesList(classroomFacilities);return getDataTable(list);}/*** 导出教室与设施的多对多关系列表*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:export')")@Log(title = "教室与设施的多对多关系", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, ClassroomFacilities classroomFacilities){List<ClassroomFacilities> list = classroomFacilitiesService.selectClassroomFacilitiesList(classroomFacilities);ExcelUtil<ClassroomFacilities> util = new ExcelUtil<ClassroomFacilities>(ClassroomFacilities.class);util.exportExcel(response, list, "教室与设施的多对多关系数据");}/*** 获取教室与设施的多对多关系详细信息*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:query')")@GetMapping(value = "/{classroomFacilitiesId}")public AjaxResult getInfo(@PathVariable("classroomFacilitiesId") Long classroomFacilitiesId){return success(classroomFacilitiesService.selectClassroomFacilitiesByClassroomFacilitiesId(classroomFacilitiesId));}/*** 新增教室与设施的多对多关系*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:add')")@Log(title = "教室与设施的多对多关系", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody ClassroomFacilities classroomFacilities){return toAjax(classroomFacilitiesService.insertClassroomFacilities(classroomFacilities));}/*** 修改教室与设施的多对多关系*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:edit')")@Log(title = "教室与设施的多对多关系", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody ClassroomFacilities classroomFacilities){return toAjax(classroomFacilitiesService.updateClassroomFacilities(classroomFacilities));}/*** 删除教室与设施的多对多关系*/@PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:remove')")@Log(title = "教室与设施的多对多关系", businessType = BusinessType.DELETE)@DeleteMapping("/{classroomFacilitiesIds}")public AjaxResult remove(@PathVariable Long[] classroomFacilitiesIds){return toAjax(classroomFacilitiesService.deleteClassroomFacilitiesByClassroomFacilitiesIds(classroomFacilitiesIds));} }
9.0 课程安排功能
相关源码:
@RestController @RequestMapping("/manage/Schedules") public class SchedulesController extends BaseController {@Autowiredprivate ISchedulesService schedulesService;/*** 查询课程安排列表*/@PreAuthorize("@ss.hasPermi('manage:Schedules:list')")@GetMapping("/list")public TableDataInfo list(Schedules schedules){startPage();List<Schedules> list = schedulesService.selectSchedulesList(schedules);return getDataTable(list);}/*** 导出课程安排列表*/@PreAuthorize("@ss.hasPermi('manage:Schedules:export')")@Log(title = "课程安排", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Schedules schedules){List<Schedules> list = schedulesService.selectSchedulesList(schedules);ExcelUtil<Schedules> util = new ExcelUtil<Schedules>(Schedules.class);util.exportExcel(response, list, "课程安排数据");}/*** 获取课程安排详细信息*/@PreAuthorize("@ss.hasPermi('manage:Schedules:query')")@GetMapping(value = "/{scheduleId}")public AjaxResult getInfo(@PathVariable("scheduleId") Long scheduleId){return success(schedulesService.selectSchedulesByScheduleId(scheduleId));}/*** 新增课程安排*/@PreAuthorize("@ss.hasPermi('manage:Schedules:add')")@Log(title = "课程安排", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Schedules schedules){return toAjax(schedulesService.insertSchedules(schedules));}/*** 修改课程安排*/@PreAuthorize("@ss.hasPermi('manage:Schedules:edit')")@Log(title = "课程安排", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Schedules schedules){return toAjax(schedulesService.updateSchedules(schedules));}/*** 删除课程安排*/@PreAuthorize("@ss.hasPermi('manage:Schedules:remove')")@Log(title = "课程安排", businessType = BusinessType.DELETE)@DeleteMapping("/{scheduleIds}")public AjaxResult remove(@PathVariable Long[] scheduleIds){return toAjax(schedulesService.deleteSchedulesByScheduleIds(scheduleIds));} }
10.0 教室使用记录功能
11.0 SQL 数据库设计
-- 创建教室表 (Classrooms) CREATE TABLE Classrooms (classroom_id INT AUTO_INCREMENT primary key COMMENT '教室唯一标识',building_name VARCHAR(100) NOT NULL COMMENT '所在建筑物名称',img VARCHAR(100) NOT NULL COMMENT '图片',room_number VARCHAR(20) NOT NULL COMMENT '房间号',capacity INT NOT NULL COMMENT '教室容量,即最大容纳人数',status INT NOT NULL COMMENT '教室当前状态:1.可用、2.维护中' ) COMMENT='教室信息表';-- 创建教师表 (Teachers) CREATE TABLE Teachers (teacher_id INT AUTO_INCREMENT primary key COMMENT '教师唯一标识',img VARCHAR(100) NOT NULL COMMENT '图片',name VARCHAR(100) NOT NULL COMMENT '教师姓名',degree VARCHAR(100) NOT NULL COMMENT '学历',specialty VARCHAR(30) COMMENT '专业',honor VARCHAR(30) COMMENT '荣誉',email VARCHAR(100) COMMENT '教师的电子邮件地址' ) COMMENT='教师信息表';-- 创建课程表 (Courses) CREATE TABLE Courses (course_id INT AUTO_INCREMENT primary key COMMENT '课程唯一标识',course_name VARCHAR(100) NOT NULL COMMENT '课程名称',credits INT NOT NULL COMMENT '课程学分',semester VARCHAR(20) COMMENT '开设学期',status INT NOT NULL COMMENT '课程状态,1.开设中、2.已结束',description TEXT COMMENT '课程描述' ) COMMENT='课程信息表';INSERT INTO Courses (course_name, credits, semester, status, description) VALUES ('分子生物学', 3, '2024秋季', 1, '本课程探讨生物分子的结构与功能,包括DNA、RNA及蛋白质的生物合成过程。'), ('数据结构与算法', 4, '2024春季', 1, '深入理解数据结构与算法的基本概念及其在计算机科学中的应用。'), ('医学影像学', 3, '2024秋季', 1, '学习医学影像的基本原理及其在临床中的应用,包括CT、MRI等技术。'), ('国际经济学', 3, '2024春季', 1, '研究国际经济理论及全球市场动态,分析贸易与投资的关键领域。'), ('纳米材料科学', 4, '2024秋季', 1, '探讨纳米材料的特性、合成方法及其在各个领域的应用。');-- 创建设施表 (Facilities) CREATE TABLE Facilities (facility_id INT AUTO_INCREMENT primary key COMMENT '设施唯一标识',facility_name VARCHAR(100) NOT NULL COMMENT '设施名称',facility_type VARCHAR(50) COMMENT '设施类型',description TEXT COMMENT '设施描述' ) COMMENT='教室设施表';INSERT INTO Facilities (facility_name, facility_type, description) VALUES ('计算机实验室', '实验室', '配备先进计算机和软件的实验室,用于计算机科学相关课程的教学和实验。'), ('多功能教室', '教室', '可用于讲座、研讨会和小组活动的多功能教室,配备音响和投影设备。'), ('图书馆', '学习空间', '提供学习和研究资源的图书馆,内部有自习区和阅览区域。'), ('会议室', '会议室', '适用于小型会议和讨论的会议室,配备视频会议设备。'), ('体育馆', '体育设施', '提供篮球、排球等各种体育活动的设施,适合体育课程和课外活动。');-- 创建教室设施关联表 (ClassroomFacilities) CREATE TABLE ClassroomFacilities (classroom_facilities_id INT AUTO_INCREMENT primary key COMMENT '教室设施关联唯一标识',classroom_id INT NOT NULL COMMENT '教室ID,逻辑上关联到Classrooms表的ClassroomID',facility_id INT NOT NULL COMMENT '设施ID,逻辑上关联到Facilities表的FacilityID' ) COMMENT='教室与设施的多对多关系表';-- 创建授课安排表 (Schedules) CREATE TABLE Schedules (schedule_id INT AUTO_INCREMENT primary key COMMENT '排课唯一标识',classroom_id INT NOT NULL COMMENT '教室ID,逻辑上关联到Classrooms表的ClassroomID',course_id INT NOT NULL COMMENT '课程ID,逻辑上关联到Courses表的CourseID',teacher_id INT NOT NULL COMMENT '教师ID,逻辑上关联到Teachers表的TeacherID',weekday INT NOT NULL COMMENT '上课星期几,1表示星期一,2表示星期二,...,5表示星期五',sections INT NOT NULL COMMENT '上课节次,1表示第一节课,2表示第二节课等',in_week INT NOT NULL COMMENT '第几周',schedule_type INT NOT NULL COMMENT '课程安排状态,1.进行中,2.已结束' ) COMMENT='课程安排表';-- 创建使用记录表 (UsageRecords) CREATE TABLE Usage_Records (record_id INT AUTO_INCREMENT primary key COMMENT '使用记录唯一标识',classroom_id INT NOT NULL COMMENT '教室',teacher_id INT NOT NULL COMMENT '预订人',usage_date DATE NOT NULL COMMENT '使用日期',Purpose TEXT COMMENT '使用目的描述' ) COMMENT='教室使用记录表';
若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希
望可以帮助到大家!
相关文章:

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:教室信息管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 1.0 项目介绍 开发工具:IDEA、VScode 服务器:Tomcat, JDK 17 项目构建:maven 数据库:mysql 8.0 系统用户前台和管理…...
第十二篇:linux下socket本地套接字通讯
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。 用途 进程间通信:本地套…...
Spring Boot 2.1.7 数据源自动加载过程详解
在 Spring Boot 中,数据源的自动配置是框架中一个关键功能,本文将以 Spring Boot 2.1.7 版本为例,详细讲解在单数据源情况下数据源是如何自动加载的。我们通过源码分析,追踪整个加载流程。 1. 自动配置类的发现 Spring Boot 使用…...
【Vue.js 3.0】provide 、inject 函数详解
在 Vue 3 中,provide 和 inject 是用于跨组件层次结构进行依赖注入的一对 API。这些 API 主要用于祖先组件和后代组件之间的数据传递,尤其是当这些组件之间没有直接的父子关系时。 1. 示例 1.1 provide provide 函数用于在祖先组件中定义一个值&#…...

JVM(Java虚拟机)的虚拟机栈
JVM(Java虚拟机)的虚拟机栈是Java程序运行时的重要组件,以下是对其的详细解析: 一、概念与功能 概念:虚拟机栈也称为Java栈,是JVM为每个线程分配的一个私有的内存区域。每个线程在创建时都会创建一个虚拟…...

Elasticsearch02-安装7.x
零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch (1)JDK安装 Elasticsearch是基于java开发的,所以需要安装JDK。我们安装的Elasticsearch版本是7.15,对应JDK至少1.8版本以上。也可以不安装jdk,…...

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片
在计算机时代,我们依靠手机来捕捉和存储珍贵的回忆。但是,如果您不小心删除或丢失了手机上的照片怎么办?这真的很令人沮丧和烦恼,不是吗?好吧,如果您在 iPhone 上丢失了照片,您不必担心…...
vba批量化调整word的图和图表标题
vba代码 将图片进行居中操作 Sub ChangePictureFormate()Dim oPara As ParagraphDim oRange As RangeDim i As LongDim beforeIsPicture As BooleanbeforesIsPicture False 确保文档中至少有图片If ActiveDocument.InlineShapes.Count 0 ThenMsgBox "没有找到图片。&qu…...

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...

【C语言的奥秘11】指针知识点总结(续)
目录 一、指针的运算 1、指针与整数相加减 2、指针-指针(地址-地址) 3、指针的关系运算 六、指针和数组 七、二级指针 八、指针数组 一、指针的运算 1、指针与整数相加减 看一下下面的代码: #include<stdio.h> int my_strlen(c…...
excel 列名是数据表 的字段名 ,单元格的值 是数据表对应字段的值,生成sql插入语句
在 Excel 中,按 Alt F11 打开 VBA 编辑器。在菜单栏选择 插入 -> 模块,在新模块中粘贴以下代码。 VBA 代码 Sub GenerateSQLInsertStatementsToFile()Dim ws As WorksheetDim lastRow As Long, lastCol As Long, i As Long, j As LongDim sql As S…...

AI Agent与MEME:技术与文化融合驱动Web3创新
AI Agent如何引领Web3新时代? 随着Web3与区块链技术的迅速发展,AI Agent作为人工智能与区块链的交汇点,正在逐步成为推动去中心化生态的重要力量。同时,MEME文化凭借其强大的社区驱动力和文化渗透力,在链上生态中扮演着…...

IO的入门
目录 1.IO概述1.1流的分类 2.字符流2.1 案例 1.IO概述 IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。 对于java来说输…...
构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...

SpringCloudAlibaba | Sentinel从基础到进阶
一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件,主要用于解决微服务架构中的高可用性和稳定性问题(雪崩问题)。 常见的使用场景有: 流量控制舱壁模式(线程隔离)超时处理熔断降级 二、流量控…...

算法刷题Day18: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...
【信息系统项目管理师-论文真题】2015下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

Windows如何安装go环境,离线安装beego
一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件:分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件,然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...
JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)
一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此, XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...
计算机网络信息系统安全问题及解决策略
目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 (一)计算机网络信息系统研究现状 (二)计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 (一)环境危害引发的安全问…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...