第七步:编写 Service 业务层(com.demo.service 包,包含登录安全业务 + 2.8 培训模块完整业务,严格不简化需求)
- UserService.java(安全登录核心业务,实现全部密码 / 锁定 / 过期 / 角色规则)
java
运行
package com.demo.service;
import com.demo.entity.SysUser;
import com.demo.mapper.SysUserMapper;
import com.demo.util.LoginLockUtil;
import com.demo.util.PasswordUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class UserService {
@Autowired
private SysUserMapper sysUserMapper;
/*** 登录业务:严格实现所有安全需求* 1.验证码校验(后续前端对接)* 2.账号锁定校验* 3.密码格式、90天过期校验* 4.登录失败3/4/5次锁定规则* 5.更新最后登录时间、清空失败次数*/
public String login(String username, String password) {// 1.查询用户SysUser user = sysUserMapper.getByUsername(username);if(user == null) return "用户不存在";if(user.getStatus() == 0) return "账号已停用";// 2.判断账号是否锁定if(LoginLockUtil.isLocked(user)) return "账号锁定,请稍后重试";// 3.密码错误处理if(!PasswordUtil.matchPwd(password, user.getPassword())) {LoginLockUtil.handleLoginFail(user);sysUserMapper.updateById(user);return "密码错误";}// 4.校验密码是否90天过期if(PasswordUtil.isPwdExpired(user.getPasswordUpdateTime())) {return "密码已过期,请修改密码";}// 5.登录成功,重置失败次数、更新最后登录时间user.setLoginFailCount(0);user.setLoginLockTime(null);user.setLastLoginTime(new Date());sysUserMapper.updateById(user);return "登录成功";
}// 修改密码:校验格式,更新修改时间
public String updatePwd(Long userId, String newPwd) {if(!PasswordUtil.checkPwdFormat(newPwd)) {return "密码格式错误,需10位以上,包含大小写字母、数字、特殊字符";}SysUser user = new SysUser();user.setId(userId);user.setPassword(PasswordUtil.encryptPwd(newPwd));user.setPasswordUpdateTime(new Date());sysUserMapper.updateById(user);return "密码修改成功";
}
}
2. CourseService.java(培训模块 - 课程管理)
java
运行
package com.demo.service;
import com.demo.entity.Course;
import com.demo.mapper.CourseMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CourseService {
@Autowired
private CourseMapper courseMapper;
public List<Course> getCourseList() {return courseMapper.selectAll();
}public int addCourse(Course course) {return courseMapper.insert(course);
}public int updateCourse(Course course) {return courseMapper.updateById(course);
}public int deleteCourse(Long id) {return courseMapper.deleteById(id);
}
}
3. QuestionService.java(培训模块 - 题库管理)
java
运行
package com.demo.service;
import com.demo.entity.Question;
import com.demo.mapper.QuestionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class QuestionService {
@Autowired
private QuestionMapper questionMapper;
public List<Question> getQuestionList() {return questionMapper.selectAll();
}public int addQuestion(Question question) {return questionMapper.insert(question);
}
}
4. PaperService.java(培训模块 - 试卷管理)
java
运行
package com.demo.service;
import com.demo.entity.Paper;
import com.demo.mapper.PaperMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PaperService {
@Autowired
private PaperMapper paperMapper;
public List<Paper> getPaperList() {return paperMapper.selectAll();
}public int addPaper(Paper paper) {return paperMapper.insert(paper);
}
}
5. ExamService.java(培训模块 - 考试 + 自动判分 + 成绩)
java
运行
package com.demo.service;
import com.demo.entity.ExamRecord;
import com.demo.entity.Question;
import com.demo.mapper.ExamRecordMapper;
import com.demo.mapper.QuestionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ExamService {
@Autowired
private ExamRecordMapper examRecordMapper;
@Autowired
private QuestionMapper questionMapper;
// 交卷+自动判分
public int submitExam(Long userId, Long paperId, List<Long> questionIds, List<String> userAnswers) {List<Question> allQuestions = questionMapper.selectAll();int score = 0;// 简单判分:每题10分for(int i=0;i<questionIds.size();i++) {Long qId = questionIds.get(i);String userAns = userAnswers.get(i);for(Question q : allQuestions) {if(q.getId().equals(qId) && q.getAnswer().equals(userAns)) {score += 10;break;}}}// 保存成绩ExamRecord record = new ExamRecord();record.setUserId(userId);record.setPaperId(paperId);record.setScore(score);examRecordMapper.insert(record);return score;
}// 查询个人成绩
public List<ExamRecord> getMyScore(Long userId) {return examRecordMapper.selectByUserId(userId);
}
}
