基于javaweb+mysql的springboot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)

基于javaweb+mysql的springboot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的SpringBoot在线选课系统(java+springboot+html+thymeleaf+ssm+redis+maven+mysql)

基于javaweb+SpringBoot的在线选课系统(java+SpringBoot+semanticUI+thymeleaf+ssm+redis+maven+mysql)

项目介绍

后端技术包含springboot+mybatis+spring security+mysql+redis

前端技术包含 semanticUI + thymeleaf模板引擎

使用教程

  1. 下载项目之后 等待maven安装对应jar包 2. 自行下载redis 并按照资源包下的application.yml要求进行配置

  2. 自行安装MySQL数据库 执行资源包下的sql文件

使用说明

  1. 运行redis服务器 2. 启动项目 3. 访问localhost:8080

  2. 用户名:admin 密码:admin

注意事项

若导出信息时报错,则需要设置mysql,设置方式如下: SELECT @@sql_mode; 查看是否包含ONLY_FULL_GROUP_BY;若包含,则执行以下命令: SET GLOBAL sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’; SET SESSION sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’; 执行完成后,再通过SELECT @@sql_mode; 来查看;

注意:该方法仅用于临时修改,重启mysql后,以上设置失效。

    @Autowired
    UserDAO userDAO;
    @Autowired
    SelectableCourseDAO selectableCourseDAO;
    @Autowired
    UserCourseDAO userCourseDAO;

    //用户登录
    public User login(String username){
        return adminDAO.login(username);
    }

    //导出学生选课信息
    public void excelOut(HttpServletResponse response) throws IOException{
        int count = 0;
        //表头数据
        String[] header = {"学生id" , "姓名" , "学号" , "专业" };
        //学生数据
        List<User> users = userDAO.selectAll();
        //已被选择的课程数据
        List<SelectableCourse> courses = selectableCourseDAO.selectedCourses();
        //学生的选课数据.
        List<UserCourse> userCourses = userCourseDAO.selectAll();
        //声明一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //生成一个表格,设置表格名称为"学生表"
        HSSFSheet sheet = workbook.createSheet("学生选课表");
        //设置表格列宽度为10个字节
        sheet.setDefaultColumnWidth(10);

        for(SelectableCourse cours : courses){

            //创建第一行表头
            HSSFRow headrow = sheet.createRow(count);
            //创建一个单元格
            HSSFCell cell = headrow.createCell(0);
            //创建一个内容对象 (课程名称)
            HSSFRichTextString text = new HSSFRichTextString("课程名称:"+cours.getCourseName()+"  任课老师:"+cours.getTeacher()+"  上课时间:"+cours.getAddress());
            //将内容对象的文字内容写入到单元格中
            cell.setCellValue(text);
            count++;
            //遍历添加表头(下面模拟遍历学生,也是同样的操作过程)
            //创建第2行表头
            HSSFRow row = sheet.createRow(count);
            for(int i = 0 ; i < header.length ; i++){
                //创建一个单元格
                HSSFCell cellRow = row.createCell(i);
    }

    @GetMapping("/getCode")
    @ResponseBody
    public Object getCode(HttpServletRequest request) {

        /* 生成验证码字符串 */
        String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
        String uuid = UUIDUtil.GeneratorUUIDOfSimple();
        
        HttpSession session = request.getSession();
        session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
        System.out.println("生成的验证码为:" + verifyCode);

        int width = 111,height = 36;

        try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
            VerifyCodeUtil.outputImage(width, height, stream, verifyCode);
            return Msg.msg("data",new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public User getUser() { //为了session从获取用户信息,可以配置如下
        User user = new User();
        SecurityContext ctx = SecurityContextHolder.getContext();
        Authentication auth = ctx.getAuthentication();
        if (auth.getPrincipal() instanceof UserDetails) user = (User) auth.getPrincipal();
        return user;
    }

    public HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }
}


/**
 * @ClassName AdminController
 */
@Controller
@Api
public class LoginController{
    
    @Autowired
    AdminService adminService;
    @Autowired
    UserService userService;

    @RequestMapping("/login")
    public String login(){
        return "login";
        //八进制输出流
        response.setContentType("application/octet-stream");

        //这后面可以设置导出Excel的名称,此例中名为student.xls
        response.setHeader("Content-disposition" , "attachment;filename=student.xls");

        //刷新缓冲
        response.flushBuffer();

        //workbook将Excel写入到response的输出流中,供页面下载
        workbook.write(response.getOutputStream());
    }

}

/**
 * @ClassName UserCourseController
 */
@RestController
@RequestMapping("usercourse")
@Api
public class UserCourseController{
                            @RequestParam("courseType")String courseType,
                            @RequestParam("collegeId")Integer collegeId,
                            @RequestParam("teacher")String teacher,
                            @RequestParam("score")Integer score,
                            @RequestParam("stock")Integer stock,
                            @RequestParam("address")String address,
                            @RequestParam(value = "description",defaultValue = "")String description){
        try{
            return selectableCourseService.addCourse(courseName,collegeId,courseType,teacher,score,stock,address,description);
        }catch(Exception e){
            e.printStackTrace();
            return Msg.msg("出现异常,添加课程失败!");
        }
    }
}

/**
 * @ClassName AdminService
 */
@Service
public class AdminService{

    @Autowired
    AdminDAO adminDAO;
    @Autowired
    UserDAO userDAO;
    @Autowired
    SelectableCourseDAO selectableCourseDAO;
    @Autowired
    UserCourseDAO userCourseDAO;

    //用户登录
    public User login(String username){
        return adminDAO.login(username);
    @PreAuthorize("hasAuthority('student')")
    public Object chooseCourse(@RequestParam("courseId") Integer courseId ,
                               @RequestParam("username") String username){
        Map<String,Object> map = new HashMap<>();
        try{
            return userCourseService.chooseCourse(courseId , username);
        }catch(Exception e){
            if(e instanceof DataIntegrityViolationException){
                map.put("msg","该课程已经被抢完啦。");
            }else{
                map.put("msg","出现其他异常,选课失败!");
            }
            map.put("flag",false);
            return JSON.toJSON(map);
        }
    }

    /**
     * 退课
     * @param courseId
     * @param username
     * @return
     */
    @PostMapping("cancel")
    @PreAuthorize("hasAuthority('student')")
    public Object cancelCourse(@RequestParam("courseId") Integer courseId ,
                               @RequestParam("username") String username){
        return userCourseService.cancelCourse(courseId,username);
    }

    /**
     * 获取学生所选全部课程
     * @param page
     * @param limit
     * @param username
     * @return
     */
    @PostMapping("studentInfo")
    @PreAuthorize("hasAuthority('admin') or hasAuthority('student')")
    public Object studentInfo(@RequestParam(value = "page", defaultValue = "1") int page ,
                              @RequestParam(value = "limit", defaultValue = "10") int limit ,
                              @RequestParam("username")String username){
        try{
            Map<String,Object> map = new HashMap<>();
            PageHelper.startPage(page , limit);

/**
 * 一种成功的身份验证策略,通过ExceptionTranslationFilter,默认将DefaultSavedRequest
 * 存储在session中
 *
 * 当这样的请求被截获并需要身份验证时,在身份验证过程开始之前存储请求数据以记录原始目的地(url)
 * 并允许在重定向到相同的URL时重键请求,如果合适的话,这个类负责执行到原始URL的重定向。
 *
 * 在成功进行验证之后,它根据以下场景确定重定向目标:
 *
 * 1. 如果alwaysUseDefaultTargetUrl属性设置为true,则defaultTargetUrl将用于目标.
 * 会话中存储的任何defaultSavedRequest将被删除。
 * 2. 如果在请求中设置了targetUrlParameter,则该值将用作目标。defaultTargetUrl将再次被删除
 * 3. 如果在RequestCache中找到SavedRequest(由ExceptionTranslationFilter所设置,在验证过程
 * 开始之前记录原始目的地),将对原始目的地的Url执行重定向。当收到重定向请求时,SavedRequest对象
 * 将保持缓存状态并被拾取(请参阅SavedRequestAwareWrapper)
 * 4.如果找不到SavedRequest它将委托给基类(父类)。
 *
 * @since Jun 25, 2019 01:41:57 AM
 */
@Component
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {

        // 会帮我们跳转到上一次请求的页面上
        //super.onAuthenticationSuccess(request, response, authentication);
        
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
        //PrintWriter writer = response.getWriter();
        //writer.write("登录成功");
        //writer.flush();
        //writer.close();
    }

}

    public Object getCode(HttpServletRequest request) {

        /* 生成验证码字符串 */
        String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
        String uuid = UUIDUtil.GeneratorUUIDOfSimple();
        
        HttpSession session = request.getSession();
        session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
        System.out.println("生成的验证码为:" + verifyCode);

        int width = 111,height = 36;

        try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
            VerifyCodeUtil.outputImage(width, height, stream, verifyCode);
            return Msg.msg("data",new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public User getUser() { //为了session从获取用户信息,可以配置如下
        User user = new User();
        SecurityContext ctx = SecurityContextHolder.getContext();
        Authentication auth = ctx.getAuthentication();
        if (auth.getPrincipal() instanceof UserDetails) user = (User) auth.getPrincipal();
        return user;
    }

    public HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }
}


}

/**
 * @ClassName UserController
 */
@RestController
@RequestMapping("user")
@Api
public class UserController{

    @Autowired
    UserService userService;

    /**
     * 获取全部用户
     * @param page
     * @param limit
     * @return
     */
    @PostMapping("getUsers")
    @PreAuthorize("hasAuthority('admin')")
    //认证。
    //密码编码 passwordEncoder 
    //springboot security 新增了很多加密方法 且默认是需要密码加密的。也可设置不需要加密。
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
        //从数据库读去 用户及用户对应的权限。
        auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); //对密码加密
        auth.eraseCredentials(false);
        //auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public TokenBasedRememberMeServices tokenBasedRememberMeServices(){
        return new TokenBasedRememberMeServices("springRocks" , userDetailsService());
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){ //密码加密
        return new BCryptPasswordEncoder(4);
    }

    public static void main(String[] args) {
        System.out.println(new BCryptPasswordEncoder(4).encode("123456"));
    }

    @Bean
    public LogoutSuccessHandler logoutSuccessHandler(){ //登出处理
        return new LogoutSuccessHandler(){
            @Override
            public void onLogoutSuccess(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Authentication authentication) throws IOException, ServletException{
                try{
                    SecurityUser user = (SecurityUser) authentication.getPrincipal();
                    logger.info("用户 : {} 登出成功 ! " , user.getUsername());
                }catch(Exception e){
                    logger.error("printStackTrace" , e);
                }
                httpServletResponse.sendRedirect("/login");
            }
        };
    }
    AdminService adminService;
    @Autowired
    UserService userService;

    @RequestMapping("/login")
    public String login(){
        return "login";
    }

    @GetMapping("/")
    public String index() {
        return "success";
    }
    
    
    @GetMapping("/manager")
    @PreAuthorize("hasAuthority('admin')")
    public String manager(){
        return "manager";
    }
    //@RequestMapping("/error")
    //public String error(){
    //    return "error";
    //}
    
    @GetMapping("/info")
    @PreAuthorize("hasAuthority('student')")
    public String info(){
        return "studentInfo";
    }

    @GetMapping("/getCode")
    @ResponseBody
    public Object getCode(HttpServletRequest request) {

        /* 生成验证码字符串 */
        String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
        String uuid = UUIDUtil.GeneratorUUIDOfSimple();
        
        HttpSession session = request.getSession();
        session.setAttribute(uuid,verifyCode); //将验证码与生成的uuid绑定在一起
        System.out.println("生成的验证码为:" + verifyCode);

        int width = 111,height = 36;

        try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
                String dbPath = "/img/" + uploadFileName + "." + uploadFileSuffix;
                stream = new BufferedOutputStream(new FileOutputStream(new File(
                        path , uploadFileName + "." + uploadFileSuffix))); //指定存入地址。。

                byte[] bytes = file.getBytes();
                stream.write(bytes , 0 , bytes.length);
                logger.debug("文件上传成功 " + uploadFileName);

                return dbPath;

            }catch(Exception e){
                e.printStackTrace();
            }finally{
                try{
                    if(stream != null){
                        stream.close();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

/**
        Map<String,Object> map = new HashMap<>();
        try{
            selectableCourseDAO.updateMinCourseStock(1);
            return true;
        }catch(Exception e){
            if(e instanceof DataIntegrityViolationException){
                map.put("msg","该课程已经被抢完啦。");
            }else{
                map.put("msg","出现其他异常,选课失败!");
            }
            map.put("flag",false);
            return JSON.toJSON(map);
        }
    }
}

/**
 * @ClassName AdminController
 */
            //创建第2行表头
            HSSFRow row = sheet.createRow(count);
            for(int i = 0 ; i < header.length ; i++){
                //创建一个单元格
                HSSFCell cellRow = row.createCell(i);
                //创建一个内容对象
                HSSFRichTextString head2 = new HSSFRichTextString(header[i]);
                //将内容对象的文字内容写入到单元格中
                cellRow.setCellValue(head2);
            }
            count++;
            //遍历学生数据
            for(UserCourse uc : userCourses){
                for(User user : users){
                    if(uc.getCourseId().equals(cours.getCourseId())){
                        if(uc.getUsername().equals(user.getUsername())){
                            HSSFRow stuRow = sheet.createRow(count);
                            HSSFCell stuCell = stuRow.createCell(0);
                            HSSFRichTextString stuText = new HSSFRichTextString(user.getUserId().toString());
                            stuCell.setCellValue(stuText);

                            HSSFCell stuCell2 = stuRow.createCell(1);
                            HSSFRichTextString stuText2 = new HSSFRichTextString(user.getStudentName());
                            stuCell2.setCellValue(stuText2);

                            HSSFCell stuCell3 = stuRow.createCell(2);
                            HSSFRichTextString stuText3 = new HSSFRichTextString(user.getUsername());
                            stuCell3.setCellValue(stuText3);

                            HSSFCell stuCell4 = stuRow.createCell(3);
                            HSSFRichTextString stuText4 = new HSSFRichTextString(user.getObject());
                            stuCell4.setCellValue(stuText4);
                            count++;
                            break;
                        }
                    }
                }
            }
            HSSFRow newRow = sheet.createRow(count);
            count++;
            HSSFRow newRow2 = sheet.createRow(count);
            count++;
        }
        
        //准备将Excel的输出流通过response输出到页面下载
        //八进制输出流
        response.setContentType("application/octet-stream");


/**
 * @ClassName UploadImage  上传图片工具类
 */
public class UploadImage{

    private static Logger logger = LoggerFactory.getLogger(UploadImage.class);
    
    //上传图片
    public static String uploadImage(HttpServletRequest request , MultipartFile file){
        BufferedOutputStream stream = null;
        if(!file.isEmpty()){
            try{
                String uploadFilePath = file.getOriginalFilename(); //获取文件原名称 C:\Users\ttaurus\Pictures\222.jpg

                // 截取上传文件的文件名
                String uploadFileName = System.currentTimeMillis() + "";
                //System.out.println("multiReq.getFile()文件名为:" + uploadFileName);

                // 截取上传文件的后缀
                String uploadFileSuffix = uploadFilePath.substring(
                        uploadFilePath.indexOf('.') + 1 , uploadFilePath.length());
                //System.out.println("uploadFileSuffix:文件后缀名为" + uploadFileSuffix);

                //防止文件名重复 然后导致覆盖 使用字符串
                String uuid = UUID.randomUUID().toString().replace("-" , "");
                uploadFileName = uploadFileName + "_" + uuid;

                String path = request.getServletContext().getRealPath("/img");
                new File(path).mkdirs();

                String dbPath = "/img/" + uploadFileName + "." + uploadFileSuffix;
                stream = new BufferedOutputStream(new FileOutputStream(new File(
                        path , uploadFileName + "." + uploadFileSuffix))); //指定存入地址。。

                byte[] bytes = file.getBytes();
                stream.write(bytes , 0 , bytes.length);
                logger.debug("文件上传成功 " + uploadFileName);

                return dbPath;

            }catch(Exception e){
                e.printStackTrace();
            }finally{
                try{
                    if(stream != null){
                        stream.close();

/**
 * @ClassName UploadImage  上传图片工具类
 */
public class UploadImage{

    private static Logger logger = LoggerFactory.getLogger(UploadImage.class);
    
    //上传图片
    public static String uploadImage(HttpServletRequest request , MultipartFile file){
        BufferedOutputStream stream = null;
        if(!file.isEmpty()){
            try{
                String uploadFilePath = file.getOriginalFilename(); //获取文件原名称 C:\Users\ttaurus\Pictures\222.jpg

                // 截取上传文件的文件名
                String uploadFileName = System.currentTimeMillis() + "";
                //System.out.println("multiReq.getFile()文件名为:" + uploadFileName);

                // 截取上传文件的后缀
                String uploadFileSuffix = uploadFilePath.substring(
                        uploadFilePath.indexOf('.') + 1 , uploadFilePath.length());
                //System.out.println("uploadFileSuffix:文件后缀名为" + uploadFileSuffix);

                //防止文件名重复 然后导致覆盖 使用字符串
                String uuid = UUID.randomUUID().toString().replace("-" , "");
                uploadFileName = uploadFileName + "_" + uuid;

                String path = request.getServletContext().getRealPath("/img");
                new File(path).mkdirs();

                String dbPath = "/img/" + uploadFileName + "." + uploadFileSuffix;
                stream = new BufferedOutputStream(new FileOutputStream(new File(
                        path , uploadFileName + "." + uploadFileSuffix))); //指定存入地址。。

                byte[] bytes = file.getBytes();
                stream.write(bytes , 0 , bytes.length);
                logger.debug("文件上传成功 " + uploadFileName);

                return dbPath;

            }catch(Exception e){

/**
 * @ClassName UserCourseController
 */
@RestController
@RequestMapping("usercourse")
@Api
public class UserCourseController{

    @Autowired
    UserCourseService userCourseService;
    @Autowired
    SelectableCourseDAO selectableCourseDAO;

    /**
     * 选课
     * @param courseId
     * @param username
     * @return
     */
    @PostMapping("choose")
    @PreAuthorize("hasAuthority('student')")
    public Object chooseCourse(@RequestParam("courseId") Integer courseId ,
                               @RequestParam("username") String username){
        Map<String,Object> map = new HashMap<>();
        try{
            return userCourseService.chooseCourse(courseId , username);
        }catch(Exception e){
            if(e instanceof DataIntegrityViolationException){

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值