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

运行环境

Java≥8、MySQL≥5.7

开发工具

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

适用

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

功能说明

370023112402

380023112402

390023112402

400023112402

410023112402

420023112402

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

1
2
3
4
5
6
7
管理员
admin 123456

学生
111 123456
222 123456
333 123456

学生可以筛选课程,选课,退选等
管理员可以管理课程,查询选课结果等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
                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();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
return null;
}
}
package cn.gdpu.config.security.handler;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
                if(user == null) throw new UsernameNotFoundException("Username " + username + " not found");
return new SecurityUser(user);
//String role = user.getRole();
//SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role);
}
};
}


}
package cn.gdpu.controller;



/**
* @ClassName SelectableCourseController
*/
@RestController
@RequestMapping("/course")
@Api
public class SelectableCourseController{

@Autowired
SelectableCourseService selectableCourseService;

/**
* 获得全部课程
* @param page
* @param limit
* @param username
* @return
*/
@PostMapping("/getAll")
public Object getAll(@RequestParam(value = "page", defaultValue = "1") int page ,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Autowired
private VerifyCodeFilter verifyCodeFilter;
//访问授权。。 只有登录了 才能访问选课内容。 否则 只能停留在登录页。
//定义授权的规则
@Override
protected void configure(HttpSecurity http) throws Exception{ //配置策略
http.csrf().disable(); //关闭防跨域。。
http.authorizeRequests().
antMatchers("/static/**" ,"/getCode","/login","/logout", "resources").permitAll().anyRequest().authenticated(). //允许静态资源访问
// 登录页面。
and().formLogin().loginPage("/login").failureForwardUrl("/login?error=true").permitAll().
//成功登录时默认跳转页面
successForwardUrl("/success").defaultSuccessUrl("/success")
.successHandler(loginSuccessHandler()) //成功的处理器
//.failureHandler(loginFailureHandler) //失败的处理器

.//登录页面 所有人都可访问
and().logout().logoutSuccessUrl("/login").invalidateHttpSession(true).deleteCookies("JSESSIONID").logoutSuccessHandler(logoutSuccessHandler()).
and().rememberMe().
//以下这句就可以控制单个用户只能创建一个session,也就只能在服务器登录一次
and().sessionManagement().maximumSessions(1).expiredUrl("/login");
http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class); //使每次验证之前必须走验证码过滤器
}

//认证。
//密码编码 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());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
                httpServletResponse.sendRedirect("/login");
}
};
}

@Bean
public SavedRequestAwareAuthenticationSuccessHandler loginSuccessHandler(){ //登入处理
return new SavedRequestAwareAuthenticationSuccessHandler(){
@Override
public void onAuthenticationSuccess(HttpServletRequest request , HttpServletResponse response , Authentication authentication) throws IOException, ServletException{
User userDetails = (User) authentication.getPrincipal();
logger.info("用户 : " + userDetails.getUsername() + " 登录成功! ");
super.onAuthenticationSuccess(request , response , authentication);
}
};
}


@Bean
@Override
public UserDetailsService userDetailsService(){ //用户登录实现
return new UserDetailsService(){
@Autowired
private UserService userService;
@Autowired
private AdminService adminService;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
User user = null;
if("admin".equals(username)){
user = adminService.login(username);
}else{
user = userService.login(username);
}
if(user == null) throw new UsernameNotFoundException("Username " + username + " not found");
return new SecurityUser(user);
//String role = user.getRole();
//SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role);
}
};
}


}
package cn.gdpu.controller;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

//导出学生选课信息
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);
//创建一个内容对象
HSSFRichTextString head2 = new HSSFRichTextString(header[i]);
//将内容对象的文字内容写入到单元格中
cellRow.setCellValue(head2);
}
count++;
//遍历学生数据
for(UserCourse uc : userCourses){


项目链接:
https://javayms.github.io?id=171422282105200cr
https://javayms.pages.dev?id=171422282105200cr