学生教师关系管理系统 API 文档 - StudentTeacherRelationController

该控制器类提供学生选题、教师审核、论文评分等功能的接口定义。

1. 类定义

@RequestMapping("/studentTeacherRelation")
@Controller
public class StudentTeacherRelationController {
    private static final Logger LOG = LoggerFactory.getLogger(StudentTeacherRelationController.class);

    @Autowired
    private StudentTeacherRelationService studentTeacherRelationService;

    @Autowired
    private StudentInfoService studentInfoService;

    @Autowired
    private InitService initService;

    @Autowired
    private ThesisInfoService thesisInfoService;

    @Autowired
    private TeacherInfoService teacherInfoService;

    @Autowired
    private NoPassThesisService noPassThesisService;

    @Autowired
    private MailUtils mailUtils;

    private final String AGREE = '1';

    private final String DISAGREE = '2';

    private final String MAIL_TITLE = '论文选题教师处理结果';

    @Value("${mail.from.account}")
    private String mailFromAccount;

    /**
     * 学生选题
     *
     * @param thesisId
     * @param request
     * @return
     */
    @RequestMapping("/getStudentSelectThesisResult")
    @ResponseBody
    @Transactional
    public Object getInfoByStudentNo(String thesisId, HttpServletRequest request) {
        User u = (User) request.getSession().getAttribute('user');
        int studentNum;
        try {
            Init init = initService.getInitData();
            studentNum = init.getStudentNum();
            StudentInfo studentInfo = studentInfoService.getInfo(u.getId());
            LOG.info('==================开始根据学生学号查询学生选题信息,学生学号:{}==================', studentInfo.getStudentNo());
            List<StudentTeacherRelation> res = studentTeacherRelationService.getInfoByStudentNo(studentInfo.getStudentNo());
            LOG.info('==================根据学生学号查询学生选题信息完成,数据:{}==================', res);
            // 选题数量达到了系统设定值
            if (res.size() >= studentNum) {
                return ResultUtil.success('选题数已经达到最大值,不能再选!');
            }
            ThesisInfo thesisInfo = thesisInfoService.selectById(thesisId);
            if (thesisInfo.getSelectNum() != 0) {
                return ResultUtil.success('该选题已经被选,不能选择该选题!');
            }
            StudentTeacherRelation studentTeacherRelation = new StudentTeacherRelation();
            studentTeacherRelation.setStudentName(studentInfo.getStudentName());
            studentTeacherRelation.setStudentNo(studentInfo.getStudentNo());
            studentTeacherRelation.setStudentClass(studentInfo.getStudentClass());
            studentTeacherRelation.setTeacherName(thesisInfo.getTeacherName());
            studentTeacherRelation.setTeacherNo(thesisInfo.getTeacherNo());
            studentTeacherRelation.setThesisNo(thesisInfo.getId().toString());
            studentTeacherRelation.setThesisTitle(thesisInfo.getThesisTitle());
            studentTeacherRelationService.insert(studentTeacherRelation);
            LOG.info('==================选题成功==================');
            // 选题成功,论文被选择数累加
            thesisInfo.setSelectNum(thesisInfo.getSelectNum() + 1);
            thesisInfoService.updateById(thesisInfo);
            return ResultUtil.success('选题成功');
        } catch (Exception e) {
            LOG.error('==================根据学生学号查询学生选题信息异常,e={}==================', e);
            return ResultUtil.error('根据学生学号查询学生选题信息异常');
        }
    }

    /**
     * 根据学号查询学生选题信息
     */
    @RequestMapping("/getStudentSelectThesisByStudentNo")
    @ResponseBody
    public Object getStudentSelectThesisByStudentNo(HttpServletRequest request) {
        User u = (User) request.getSession().getAttribute('user');
        try {
            StudentInfo studentInfo = studentInfoService.getInfo(u.getId());
            LOG.info('==================开始根据学号查询学生选题信息,学号:{}==================', studentInfo.getStudentNo());
            List<StudentTeacherRelation> res = studentTeacherRelationService.getInfoByStudentNo(studentInfo.getStudentNo());
            res.forEach(item -> {
                item.setOpinionFlagStr(item.getOpinionFlag() == null ? '未审核' : (item.getOpinionFlag() == 1 ? '同意' : '未审核'));
                item.setTeacherOpinion(item.getTeacherOpinion() == null ? '' : item.getTeacherOpinion());
            });
            LOG.info('==================根据学号查询学生选题信息完成,选题信息:{}==================', res);
            return ResultUtil.success(res);
        } catch (Exception e) {
            LOG.error('==================查询学生选题信息异常==================');
            return ResultUtil.error('查询学生选题信息异常');
        }
    }

    /**
     * 根据教师id查询
     *
     * @param page
     * @param rows
     * @param request
     * @return
     */
    @RequestMapping("/getStudentSelectThesisByTeacherNo")
    @ResponseBody
    public Object getStudentSelectThesisByTeacherNo(int page, int rows, HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute('user');
        TeacherInfo teacherInfo = teacherInfoService.getInfo(user.getId());
        try {
            LOG.info('==================开始根据教师编号查询学生选题信息==================');
            Map<String, Object> res = studentTeacherRelationService.getInfoByTeacherNo(page, rows, teacherInfo.getTeacherNo());
            LOG.info('==================根据教师id查询学生选题信息完成,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('==================根据教师id查询学生选题信息失败,e={}==================', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    /**
     * @param opinionFlag    意见标识1:同意,2:不同意
     * @param teacherOpinion 老师意见
     * @param thesisNo       论文id
     * @return
     */
    @RequestMapping("/operate")
    @ResponseBody
    @Transactional
    public Object operate(String opinionFlag, String teacherOpinion, String thesisNo) {
        LOG.info('==================开始处理论文意见==================');
        StudentTeacherRelation studentTeacherRelation = studentTeacherRelationService.getInfoByThesisNo(thesisNo);
        StringBuilder sb = new StringBuilder();
        try {
            // 教师同意选题
            if ('1'.equals(opinionFlag)) {
                // 根据论文id更新关系表
                studentTeacherRelationService.updateByThesisNo(thesisNo, opinionFlag, teacherOpinion);
                // 发送邮件通知学生
                try {
                    mailUtils.sendEmail(mailFromAccount, studentTeacherRelation.getStudentEmail(), MAIL_TITLE,
                            '您选取的论文已经被教师审核通过!');
                    sb.append('邮件发送成功!');
                } catch (MailException e) {
                    LOG.error('==================邮件发送失败==================');
                    sb.append('邮件发送失败!');
                }
            } else {
                // 教师不同意选题
                // 删除关系表对应数据
                Integer[] thesisNos = {Integer.parseInt(thesisNo)};
                studentTeacherRelationService.deleteByThesisId(thesisNos);
                // 插入新数据到不通过论文信息表
                NoPassThesis noPassThesis = new NoPassThesis();
                studentTeacherRelation.setTeacherOpinion(teacherOpinion);
                BeanUtils.copyProperties(studentTeacherRelation, noPassThesis);
                noPassThesisService.insert(noPassThesis);
                // 更新论文信息表,设置论文选题数量-1
                ThesisInfo thesisInfo = thesisInfoService.selectById(studentTeacherRelation.getThesisNo());
                thesisInfo.setSelectNum(thesisInfo.getSelectNum() - 1);
                thesisInfoService.updateById(thesisInfo);
                // 发送邮件通知学生
                try {
                    mailUtils.sendEmail(mailFromAccount, studentTeacherRelation.getStudentEmail(), MAIL_TITLE, '很遗憾,你选择的论文审核未通过,请及时处理');
                    sb.append('邮件发送成功!');
                } catch (MailException e) {
                    LOG.error('==================邮件发送失败,e={}==================', e);
                    sb.append('邮件发送失败!');
                }
            }
            return ResultUtil.success('操作成功!' + sb.toString());
        } catch (Exception e) {
            LOG.error('==================操作失败,e={}==================', e);
            return ResultUtil.error('操作失败');
        }
    }

    @RequestMapping("/getAgreeThesisByTeacherId")
    @ResponseBody
    public Object getAgreeThesisByTeacherId(int page, int rows, HttpServletRequest request) {
        LOG.info('==================开始查询审核通过的论文信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            TeacherInfo teacherInfo = teacherInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.getAgreeThesisByTeacherId(page, rows, teacherInfo.getId());
            LOG.info('==================查询审核通过的论文信息结束,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('查询审核通过的论文信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/selectStudentScore")
    @ResponseBody
    public Object selectStudentScore(int page, int rows, HttpServletRequest request) {
        LOG.info('==================老师开始查询论文评分信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            TeacherInfo teacherInfo = teacherInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.selectStudentScore(page, rows, teacherInfo.getId());
            LOG.info('==================老师查询论文评分信息结束:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('老师查询论文评分信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/selectScore")
    @ResponseBody
    public Object selectScore(int page, int rows, HttpServletRequest request) {
        LOG.info('==================学生开始查询论文评分信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            StudentInfo studentInfo = studentInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.selectScore(page, rows, studentInfo.getId());
            LOG.info('==================学生查询论文评分信息结束:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('学生查询论文评分信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/getFinalThesisByTeacherId")
    @ResponseBody
    public Object getFinalThesisByTeacherId(int page, int rows, HttpServletRequest request) {
        LOG.info('==================开始查询需要评分的论文信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            TeacherInfo teacherInfo = teacherInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.getFinalThesisByTeacherId(page, rows, teacherInfo.getId());
            LOG.info('==================查询需要评分的论文信息结束,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('查询需要评分的论文信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/reply")
    @ResponseBody
    public Object reply(Reply reply, int page, int rows) {
        LOG.info('==================开始查询批复列表==================');
        try {
            Map<String, Object> res = studentTeacherRelationService.selectAllReply(reply, page, rows);
            LOG.info('==================开始查询批复列表完成,列表:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('==================开始查询批复列表异常==================');
        }
        return ResultUtil.dataGridEmptyResult();
    }

    @RequestMapping("/list")
    @ResponseBody
    public Object list(UploadWord uploadWord, int page, int rows) {
        LOG.info('==================开始查询论文列表==================');
        try {
            Map<String, Object> res = studentTeacherRelationService.selectAllWord(uploadWord, page, rows);
            LOG.info('==================开始查询批复列表完成,列表:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('==================开始查询批复列表异常==================');
        }
        return ResultUtil.dataGridEmptyResult();
    }

    @RequestMapping("/getAgreeThesisByTeacherNo")
    @ResponseBody
    public Object getAgreeThesisByTeacherNo(int page, int rows, HttpServletRequest request) {
        LOG.info('==================开始查询审核通过的论文信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            TeacherInfo teacherInfo = teacherInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.getAgreeThesisByTeacherNo(page, rows, teacherInfo.getTeacherNo());
            LOG.info('==================查询审核通过的论文信息结束,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('查询审核通过的论文信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/getAgreeThesisByStudentNo")
    @ResponseBody
    public Object getAgreeThesisByStudentNo(int page, int rows, HttpServletRequest request) {
        LOG.info('==================开始查询审核通过的论文信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            StudentInfo studentInfo = studentInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.getAgreeThesisByStudentNo(page, rows, studentInfo.getStudentNo());
            LOG.info('==================查询审核通过的论文信息结束,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('查询审核通过的论文信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/getAgreeThesisByStudentId")
    @ResponseBody
    public Object getAgreeThesisByStudentId(int page, int rows, HttpServletRequest request) {
        LOG.info('==================开始查询审核通过的论文信息==================');
        User user = (User) request.getSession().getAttribute('user');
        try {
            StudentInfo studentInfo = studentInfoService.getInfo(user.getId());
            Map<String, Object> res = studentTeacherRelationService.getAgreeThesisById(page, rows, studentInfo.getId());
            LOG.info('==================查询审核通过的论文信息结束,信息:{}==================', res);
            return res;
        } catch (Exception e) {
            LOG.error('查询审核通过的论文信息异常,e={}', e);
            return ResultUtil.dataGridEmptyResult();
        }
    }

    @RequestMapping("/getThesisInfoDetail")
    @ResponseBody
    public Object getThesisInfoDetail(StudentTeacherRelation studentTeacherRelation, int page, int rows) {
        LOG.info('==================开始查询论文情况信息==================');
        try {
            return studentTeacherRelationService.getThesisInfoDetail(studentTeacherRelation, page, rows);
        } catch (Exception e) {
            LOG.error('==================查询论文情况信息异常,e={}==================', e);
        }
        return ResultUtil.dataGridEmptyResult();
    }

    @RequestMapping("/getEchartData")
    @ResponseBody
    public Object getEchartData() {
        //['选题审核通过','选题未审核','选题未通过']

        DataAnalysis dataAnalysis = new DataAnalysis();
        try {
            LOG.info('==================开始查询图标数据==================');
            int passNum = studentTeacherRelationService.selectPassNum();
            dataAnalysis.setPassNum(passNum);

            dataAnalysis.setUnderPassNum(studentTeacherRelationService.selectUnderPassNumAndPassNum() - passNum);

            dataAnalysis.setNoPassNum(studentTeacherRelationService.selectNoPassNum());
        } catch (Exception e) {
            LOG.error('==================查询图表数据异常,e={}==================', e);
        }
        return ResultUtil.success(dataAnalysis);
    }
}

2. 代码解释

  1. @RequestMapping("/studentTeacherRelation"): 声明该类的请求路径为/studentTeacherRelation。所有该类中方法的请求路径都会以/studentTeacherRelation作为前缀。
  2. @Controller: 声明该类为控制器类,表示该类负责处理来自客户端的请求。
  3. private static final Logger LOG = LoggerFactory.getLogger(StudentTeacherRelationController.class): 声明一个日志记录器,用于记录程序运行时的日志信息。
  4. @Autowired: 自动注入依赖的组件。该注解会自动将spring容器中与该属性类型匹配的组件注入到该属性中。
  5. private StudentTeacherRelationService studentTeacherRelationService: 声明一个名为studentTeacherRelationService的依赖,该依赖是StudentTeacherRelationService类型。
  6. @Value("${mail.from.account}") private String mailFromAccount: 从配置文件中读取名为mail.from.account的属性值,并赋值给mailFromAccount变量。
  7. @RequestMapping("/getStudentSelectThesisResult"): 声明该方法的请求路径为/getStudentSelectThesisResult
  8. @ResponseBody: 声明该方法的返回值将直接作为响应体返回。
  9. @Transactional: 声明该方法需要进行事务管理。该注解会将该方法内的操作包装在一个事务中,保证所有操作要么全部成功,要么全部失败。
  10. User u = (User) request.getSession().getAttribute('user'): 从Session中获取名为user的属性值,并将其强制转换为User类型。该代码用于获取当前登录的用户的信息。
  11. @RequestMapping("/getStudentSelectThesisByStudentNo"): 声明该方法的请求路径为/getStudentSelectThesisByStudentNo
  12. @RequestMapping("/getStudentSelectThesisByTeacherNo"): 声明该方法的请求路径为/getStudentSelectThesisByTeacherNo
  13. @RequestMapping("/operate"): 声明该方法的请求路径为/operate
  14. @RequestMapping("/getAgreeThesisByTeacherId"): 声明该方法的请求路径为/getAgreeThesisByTeacherId
  15. @RequestMapping("/selectStudentScore"): 声明该方法的请求路径为/selectStudentScore
  16. @RequestMapping("/selectScore"): 声明该方法的请求路径为/selectScore
  17. @RequestMapping("/getFinalThesisByTeacherId"): 声明该方法的请求路径为/getFinalThesisByTeacherId
  18. @RequestMapping("/reply"): 声明该方法的请求路径为/reply
  19. @RequestMapping("/list"): 声明该方法的请求路径为/list
  20. @RequestMapping("/getAgreeThesisByTeacherNo"): 声明该方法的请求路径为/getAgreeThesisByTeacherNo
  21. @RequestMapping("/getAgreeThesisByStudentNo"): 声明该方法的请求路径为/getAgreeThesisByStudentNo
  22. @RequestMapping("/getAgreeThesisByStudentId"): 声明该方法的请求路径为/getAgreeThesisByStudentId
  23. @RequestMapping("/getThesisInfoDetail"): 声明该方法的请求路径为/getThesisInfoDetail
  24. @RequestMapping("/getEchartData"): 声明该方法的请求路径为/getEchartData

3. 接口说明

该控制器类提供以下接口:

  • /studentTeacherRelation/getStudentSelectThesisResult: 学生选题
  • /studentTeacherRelation/getStudentSelectThesisByStudentNo: 根据学号查询学生选题信息
  • /studentTeacherRelation/getStudentSelectThesisByTeacherNo: 根据教师id查询学生选题信息
  • /studentTeacherRelation/operate: 教师处理论文意见
  • /studentTeacherRelation/getAgreeThesisByTeacherId: 查询审核通过的论文信息(教师视角)
  • /studentTeacherRelation/selectStudentScore: 查询论文评分信息(教师视角)
  • /studentTeacherRelation/selectScore: 查询论文评分信息(学生视角)
  • /studentTeacherRelation/getFinalThesisByTeacherId: 查询需要评分的论文信息(教师视角)
  • /studentTeacherRelation/reply: 查询批复列表
  • /studentTeacherRelation/list: 查询论文列表
  • /studentTeacherRelation/getAgreeThesisByTeacherNo: 查询审核通过的论文信息(教师视角)
  • /studentTeacherRelation/getAgreeThesisByStudentNo: 查询审核通过的论文信息(学生视角)
  • /studentTeacherRelation/getAgreeThesisByStudentId: 查询审核通过的论文信息(学生视角)
  • /studentTeacherRelation/getThesisInfoDetail: 查询论文情况信息
  • /studentTeacherRelation/getEchartData: 查询图标数据

每个接口的具体参数和返回值请参考代码中的注释。

4. 注意事项

  • 该 API 文档仅供参考,具体功能实现请参考代码。
  • 该 API 文档可能存在更新,请及时关注最新版本。
  • 使用该 API 前请先进行登录认证。

5. 代码解释

  1. private final String AGREE = '1';: 定义一个常量,表示同意选题。
  2. private final String DISAGREE = '2';: 定义一个常量,表示不同意选题。
  3. private final String MAIL_TITLE = '论文选题教师处理结果';: 定义一个常量,表示邮件标题。
  4. @Value("${mail.from.account}") private String mailFromAccount;: 从配置文件中读取名为 mail.from.account 的属性值,并赋值给 mailFromAccount 变量。该变量用于发送邮件时的发件人地址。
  5. User u = (User) request.getSession().getAttribute('user');: 从 Session 中获取名为 user 的属性值,并将其强制转换为 User 类型。该代码用于获取当前登录的用户的信息。
  6. LOG.info('==================开始根据学生学号查询学生选题信息,学生学号:{}==================', studentInfo.getStudentNo());: 使用 LOG 对象记录信息,方便调试和排查问题。
  7. if ('1'.equals(opinionFlag)) { ... }: 判断教师是否同意选题。如果同意,则更新关系表,并发送邮件通知学生。
  8. else { ... }: 如果教师不同意选题,则删除关系表对应数据,插入新数据到不通过论文信息表,更新论文信息表,并发送邮件通知学生。
  9. mailUtils.sendEmail(mailFromAccount, studentTeacherRelation.getStudentEmail(), MAIL_TITLE, '您选取的论文已经被教师审核通过!');: 使用 mailUtils 对象发送邮件。
  10. BeanUtils.copyProperties(studentTeacherRelation, noPassThesis);: 使用 BeanUtils 类将 studentTeacherRelation 对象中的属性复制到 noPassThesis 对象中。
  11. return ResultUtil.success('操作成功!' + sb.toString());: 返回操作结果,包括操作成功信息和邮件发送结果。
  12. return ResultUtil.error('操作失败');: 返回操作失败信息。
  13. return ResultUtil.dataGridEmptyResult();: 返回空数据表格信息。
  14. return ResultUtil.success(dataAnalysis);: 返回图标数据。

6. 总结

该控制器类提供了一系列接口,用于实现学生选题、教师审核、论文评分等功能。代码中使用了 Spring 的注解、日志记录、邮件发送等功能,并对异常进行了处理,保证了系统功能的稳定性和可靠性。


原文地址: https://www.cveoy.top/t/topic/kSuz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录