课程管理平台 SSM 技术栈:Java EE、Mysql-5.6、Spring、SpringMVC、Mybatis、JavaScript、TomCat9.0、JDK11.0、Shiro、LayUI、EasyUI、Maven、IDEA 项目包括:项目源码、数据库、开发文档PPT、运行须知等 、配运行环境、问题等 系统介绍:本管理系统面向教务处、院、系教师和全校学生,实现学籍管理、课表管理、成绩管理、教学质量监控等功能。 本系统最大的特色就是能够通过log日志记录用户每次操作信息。 实现功能 1、教务管理系统中,管理员、教师和学生都可以查询成绩,但是权限不同,登录成功后,管理员可以查看全校各专业学生各学期成绩,教师可以查看所带班级学生各学期成绩并且任课老师可自行选择平时成绩的组成项、汇总某门课程的平时成绩和关于某门课程的平时成绩可导出Excel表,学生只可以查看自己各门课程各学期成绩和评价教师。 2、管理员登录成功后,需要录入课表,根据各班级排课情况录入课表,供学生和教师查询,方便教务工作 3、成绩由教师来录入,所以教师登录教务管理系统后,点击录入成绩,根据表格内容,录入各学生各门课的成绩,供其他用户查询。 4、学生可以对代课教师进行教学质量评价,输入自己的用户名和密码登录成功后,点击教学质量评价,屏幕显示该学生的各专业教师,选择评价描述后的优良中,提交后,即可进行教学质量评价。 5、只有管理员可以方便修改学生成绩,管理员可以通过数据库直接修改某一学生成绩,也可以登录系统后,点击修改成绩,输入学生学号,修改相应成绩。 6、学生信息和教师信息由管理员录入,管理员登录成功后,点击录入学生信息,根据屏幕显示表格,录入学生姓名、学号、班级和专业。 7、教务管理系统面对的用户是管理员、教师和学生,因此要求用户界面间接整齐,美观大方,用户体验度较好。 8、在使用教务管理系统时,有频繁的大量的数据查询,因此要求服务器能积极及时的响应大批量的用户请求。 9、软件方面要求系统整体使用起来流畅度高。 10、安全方面,要求能完整保存用户数据而不容易被泄露。 项目截图

最近在搞一个基于SSM框架的教务管理系统,把Java EE那套东西玩了个遍。这系统最有趣的是用AOP切面实现了操作日志记录,用户每个动作都能被精准捕获。今天重点说说几个核心模块的实现,顺手贴点实战代码。

权限控制这块用Shiro玩得飞起。用户登录时动态加载角色权限,这里有个自定义Realm的骚操作:
java
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 动态查库加载角色权限
Set<String> roles = userService.findRoles(username);
info.setRoles(roles);
info.setStringPermissions(userService.findPermissions(username));
return info;
}
}
通过@RequiresRoles注解控制方法访问权限,比如学生评价功能只允许student角色访问。这种动态权限加载比硬编码灵活得多,改数据库就能调整权限。

日志记录模块用Spring AOP实现,在Controller层埋点:
java
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.jwxt.annotation.OperLog)")
public void logPointCut() {}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
// 记录操作描述
OperLog operLog = method.getAnnotation(OperLog.class);
String operation = operLog.value();
// 获取请求参数
Object[] args = point.getArgs();
String params = JSON.toJSONString(args[0]);
// 执行目标方法
Object result = point.proceed();
// 记录日志到数据库
SysLog sysLog = new SysLog();
sysLog.setOperation(operation);
sysLog.setParams(params);
//...其他字段填充
logService.save(sysLog);
return result;
}
}
这样在需要监控的方法上加个@OperLog("成绩录入")注解,操作流水就自动入库了,审计功能轻松搞定。

课程管理平台 SSM 技术栈:Java EE、Mysql-5.6、Spring、SpringMVC、Mybatis、JavaScript、TomCat9.0、JDK11.0、Shiro、LayUI、EasyUI、Maven、IDEA 项目包括:项目源码、数据库、开发文档PPT、运行须知等 、配运行环境、问题等 系统介绍:本管理系统面向教务处、院、系教师和全校学生,实现学籍管理、课表管理、成绩管理、教学质量监控等功能。 本系统最大的特色就是能够通过log日志记录用户每次操作信息。 实现功能 1、教务管理系统中,管理员、教师和学生都可以查询成绩,但是权限不同,登录成功后,管理员可以查看全校各专业学生各学期成绩,教师可以查看所带班级学生各学期成绩并且任课老师可自行选择平时成绩的组成项、汇总某门课程的平时成绩和关于某门课程的平时成绩可导出Excel表,学生只可以查看自己各门课程各学期成绩和评价教师。 2、管理员登录成功后,需要录入课表,根据各班级排课情况录入课表,供学生和教师查询,方便教务工作 3、成绩由教师来录入,所以教师登录教务管理系统后,点击录入成绩,根据表格内容,录入各学生各门课的成绩,供其他用户查询。 4、学生可以对代课教师进行教学质量评价,输入自己的用户名和密码登录成功后,点击教学质量评价,屏幕显示该学生的各专业教师,选择评价描述后的优良中,提交后,即可进行教学质量评价。 5、只有管理员可以方便修改学生成绩,管理员可以通过数据库直接修改某一学生成绩,也可以登录系统后,点击修改成绩,输入学生学号,修改相应成绩。 6、学生信息和教师信息由管理员录入,管理员登录成功后,点击录入学生信息,根据屏幕显示表格,录入学生姓名、学号、班级和专业。 7、教务管理系统面对的用户是管理员、教师和学生,因此要求用户界面间接整齐,美观大方,用户体验度较好。 8、在使用教务管理系统时,有频繁的大量的数据查询,因此要求服务器能积极及时的响应大批量的用户请求。 9、软件方面要求系统整体使用起来流畅度高。 10、安全方面,要求能完整保存用户数据而不容易被泄露。 项目截图

成绩导出功能用POI玩得贼溜。教师端点击导出时,后台动态生成Excel:
java
@RequestMapping("/exportScore")
public void exportScore(HttpServletResponse response, String courseId) {
// 查数据
List<Score> list = scoreService.findByCourse(courseId);
// 创建HSSFWorkbook
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("成绩单");
// 设置表头
String[] headers = {"学号","姓名","平时成绩","期末成绩","总评"};
HSSFRow row = sheet.createRow(0);
for(int i=0;i<headers.length;i++){
row.createCell(i).setCellValue(headers[i]);
}
// 填充数据
int rowNum = 1;
for(Score score : list){
HSSFRow dataRow = sheet.createRow(rowNum++);
dataRow.createCell(0).setCellValue(score.getStuNo());
dataRow.createCell(1).setCellValue(score.getStuName());
//...其他字段填充
}
// 设置下载头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename="+URLEncoder.encode("课程成绩.xls","UTF-8"));
workbook.write(response.getOutputStream());
}
前端用LayUI的table组件渲染数据,配合这个导出接口,教师能秒出带格式的Excel文件,教务处小姐姐直呼内行。

系统在性能优化上也有小心思。MyBatis二级缓存+Redis做热点数据缓存,查询频率高的课表数据缓存30分钟:
xml
<cache eviction="LRU" flushInterval="1800000" size="1024"/>
遇到高并发查询时,用ThreadLocal做分页参数隔离,防止分页参数互相覆盖的坑。数据库连接池用Druid,配合SQL监控功能,慢查询直接现原形。

安全方面除了Shiro,还在数据库层面搞事情。用户密码用MD5+盐值加密存储,连DBA都看不到明文:
java
String salt = UUID.randomUUID().toString().substring(0,6);
String encryptedPwd = new Md5Hash(password, salt, 2).toString();
遇到个坑是EasyUI的datagrid组件在分页时会全量加载数据,后来改成后端物理分页,性能直接翻倍。前端用LayUI的form模块做验证,防止憨憨用户乱输数据。

这项目最爽的是解决实际教学管理痛点,比如动态权限控制让不同角色各司其职,日志追溯让误操作无所遁形。虽然SSM现在不算新潮,但用来练手企业级开发确实香,特别是MyBatis的动态SQL写复杂查询时,比JPA灵活不是一星半点。
