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
{
    @Autowired
    private SysLoginService loginService;
 
    @Autowired
    private ISysMenuService menuService;
 
    @Autowired
    private 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.loadUserByUsername
            authentication = 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());
        // 生成token
        return 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Classrooms classrooms)
    {
        return toAjax(classroomsService.insertClassrooms(classrooms));
    }

    /**
     * 修改教室信息
     */
    @PreAuthorize("@ss.hasPermi('manage:Classrooms:edit')")
    @Log(title = "教室信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Teachers teachers)
    {
        return toAjax(teachersService.insertTeachers(teachers));
    }

    /**
     * 修改教师信息
     */
    @PreAuthorize("@ss.hasPermi('manage:Teachers:edit')")
    @Log(title = "教师信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Courses courses)
    {
        return toAjax(coursesService.insertCourses(courses));
    }

    /**
     * 修改课程信息
     */
    @PreAuthorize("@ss.hasPermi('manage:Courses:edit')")
    @Log(title = "课程信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Facilities facilities)
    {
        return toAjax(facilitiesService.insertFacilities(facilities));
    }

    /**
     * 修改教室设施
     */
    @PreAuthorize("@ss.hasPermi('manage:Facilities:edit')")
    @Log(title = "教室设施", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody ClassroomFacilities classroomFacilities)
    {
        return toAjax(classroomFacilitiesService.insertClassroomFacilities(classroomFacilities));
    }

    /**
     * 修改教室与设施的多对多关系
     */
    @PreAuthorize("@ss.hasPermi('manage:ClassroomFacilities:edit')")
    @Log(title = "教室与设施的多对多关系", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Schedules schedules)
    {
        return toAjax(schedulesService.insertSchedules(schedules));
    }

    /**
     * 修改课程安排
     */
    @PreAuthorize("@ss.hasPermi('manage:Schedules:edit')")
    @Log(title = "课程安排", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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 私信给我,我每天都有查看消息的,感谢大家支持,希

望可以帮助到大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars&#xff08;九&#xff09; 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时&#xff0c;经常需要修改窗口标题、更改软…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

Pytorch | 从零构建GoogleNet对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集GoogleNet网络结构特点网络整体架构特征图尺寸变化应用与影响 GoogleNet结构代码详解结构代码代码详解Inception 类初始化方法前向传播 forward GoogleNet 类初始化方法前向传播 forward 训练和测试训练代码train.py测试代…

简单了解一下 Go 语言的构建约束?

​构建约束是一种在 Go 语言中控制源文件编译条件的方法&#xff0c;它可以让您指定某些文件只在特定的操作系统、架构、编译器或 Go 版本下编译&#xff0c;而在其他环境中自动忽略。这样可以方便您针对不同的平台或场景编写不同的代码&#xff0c;实现条件编译的功能。 构建…

12.17双向链表,循环链表

循环单向链表 1.头文件test.h #ifndef __TEST_H_ #define __TEST_H_#include<stdio.h> #include<stdlib.h>typedef struct node {union{int len;int data;};struct node *next; }looplink,*looplinkPtr;//创建 looplinkPtr create();//判空 int empty(); //申请…

图的最小生成树(C++实现图【3】)

目录 1.最小生成树 1.1 Kruskal算法 代码部分 1.2 Prim算法 代码部分 1.最小生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一…

解决电脑网速慢问题:硬件检查与软件设置指南

电脑网速慢是许多用户在使用过程中常见的问题&#xff0c;它不仅会降低工作效率&#xff0c;还可能影响娱乐体验。导致电脑网速慢的原因多种多样&#xff0c;包括硬件问题、软件设置和网络环境等。本文将从不同角度分析这些原因&#xff0c;并提供提高电脑网速的方法。 一、检查…

Python-基于Pygame的小游戏(贪吃蛇)(一)

前言:贪吃蛇是一款经典的电子游戏&#xff0c;最早可以追溯到1976年的街机游戏Blockade。随着诺基亚手机的普及&#xff0c;贪吃蛇游戏在1990年代变得广为人知。它是一款休闲益智类游戏&#xff0c;适合所有年龄段的玩家&#xff0c;其最初为单机模式&#xff0c;后来随着技术发…

MySQL表的增删改查(2)

1.数据库约束 1)约束类型 not null指定某列不能存储null值unique保证某列的每一行必须有唯一值default规定没有给列赋值时的默认值primary keynot null和unique的结合,一张表里只能有一个,作为身份标识的数据foreign key保证一个表的数据匹配另一个表中的值的参照完整性check…

职场人如何提升职业技能?

职场人如何提升职业技能&#xff1f; 在职场中&#xff0c;每个人都像是一名航行在广阔大海上的水手&#xff0c;面对着不断变化的风浪和挑战。要想在这片职场海洋中稳步前行&#xff0c;甚至脱颖而出&#xff0c;提升职业技能是必不可少的。那么&#xff0c;职场人究竟该如何…

IVE Model 2.0.2运行报错:Error launching application × could not locate Java runtime

在windows电脑上运行IVE Model 2.0.2程序的时候弹窗报错: could not locate Java runtime 一、原因分析 第一次安装的时候,很确定自己的JDK环境安装是没有问题,但是运行仍然会报错,由于软件没有说明使用什么版本的JDK只能挨个尝试,换了几个版本仍然不行,忽然想到,这个软…

模型训练篇 | 关于常见的10种数据标注工具介绍

前言:Hello大家好,我是小哥谈。数据标注工具是一种用于标记和分类数字图像、音频、视频或文本等数据集的工具。数据标注工具可以自动或手动标记数据集中的对象、人脸、物体、文字等,以便机器学习模型能够理解和识别这些数据。数据标注工具通常由开发者或数据标注团队开发和使…

Linux应用开发————mysql数据库

数据库概述 什么是数据库(database)? 数据库是一种数据管理的管理软件&#xff0c;它的作用是为了有效管理数据&#xff0c;形成一个尽可能无几余的数据集合&#xff0c;并能提供接口&#xff0c;方便用户使用。 数据库能用来干什么? 顾名思义&#xff0c;仓库就是用来保存东…

c++理解(三)

本文主要探讨c相关知识。 模板是对类型参数化 函数模板特化不是模板函数重载 allocator(空间配置器):内存开辟释放,对象构造析构 优先调用对象成员方法实现的运算符重载函数,其次全局作用域找 迭代器遍历访问元素,调用erase&#xff0c;insert方法后&#xff0c;当前位置到容器…

动态规划——最长公共子序列

文章目录 概要整体流程问题描述递推公式由来两个序列的最后一位相等两个序列的最后一位不等左图右图 表格填写dp 表格定义递推公式填表过程填表过程解析最终结果 小结 概要 动态规划相关知识 求解最长的公共子序列 整体流程 问题定义与区分&#xff1a;理解最长公共子串与最…

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础&#xff0c;总结的还行&#xff1b; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

arXiv-2024 | NavAgent:基于多尺度城市街道视图融合的无人机视觉语言导航

作者&#xff1a;Youzhi Liu, Fanglong Yao*, Yuanchang Yue, Guangluan Xu, Xian Sun, Kun Fu 单位&#xff1a;中国科学院大学电子电气与通信工程学院&#xff0c;中国科学院空天信息创新研究院网络信息系统技术重点实验室 原文链接&#xff1a;NavAgent: Multi-scale Urba…

易语言鼠标轨迹算法(游戏防检测算法)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Three.js材质纹理扩散过渡

Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10