当前位置: 首页 > news >正文

学习进度4/14

第七步:编写 Service 业务层(com.demo.service 包,包含登录安全业务 + 2.8 培训模块完整业务,严格不简化需求)

  1. 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);
}

}

http://www.jsqmd.com/news/798321/

相关文章:

  • YOLOv11 改进 - 注意力机制 ContextAggregation上下文聚合模块:多尺度上下文信息融合机制,增强小目标特征判别力
  • 别再死记硬背了!用Wireshark抓包实战,带你一步步拆解5G手机的注册与PDU会话建立流程
  • YOLOv11 改进 - 注意力机制 CoordAttention坐标注意力:嵌入位置信息破解通道注意力局限,增强目标空间感知
  • 在树莓派上部署YoloV4-Tiny:用PyTorch Mobile实现边缘端实时目标检测
  • 别再只怪芯片了!拆解一个智能家居产品,看它的EMC静电防护设计到底哪里出了问题
  • 跨越平台鸿沟:ACM LaTeX模板的实战部署与字体兼容性攻坚
  • Windows 10 任务管理器打开后自动退出(点详细信息崩溃)完整排查记录
  • 知网AI率30%50%80%哪个最难降?比话降AI知网专精方案!
  • 牛客:字符串展开
  • 2026年4月市面上比较好的店铺设计装修批发厂家口碑推荐,服装店设计装修/店铺设计装修,店铺设计装修定制厂家推荐 - 品牌推荐师
  • 3分钟解锁QQ音乐加密格式:qmc-decoder音频解密工具完全指南
  • 从‘创建’到‘销毁’:一个RDMA Queue Pair的完整生命周期实战与状态机避坑指南
  • Spring Boot + JWT 实现无状态认证
  • VideoDownloadHelper:3步实现全网视频下载的智能工具
  • Matlab实战:基于EGM2008模型与球谐函数解析全球重力梯度场
  • 学习进度4/10
  • 深度解析:如何构建广谱注入Chromium/V8的通用修改器
  • YOLOv11 改进 - 注意力机制 ACmix自注意力与卷积混合模型:轻量级设计融合双机制优势,实现高效特征提取与推理加速
  • 别再只用Speedtest了!用群晖Docker部署Homebox,打造你的专属内网万兆测速站
  • 健康管理PPT风格描述提示词
  • Java面试跳槽需要提前准备什么内容?
  • 计算机毕业设计:Python医疗文本挖掘与可视化决策平台 Flask框架 随机森林 机器学习 疾病数据 智慧医疗 深度学习(建议收藏)✅
  • Sonos家庭影院音频设置指南:微调设置,提升音质与沉浸感!
  • 07 二叉树的最小深度
  • FanControl深度解析:如何为Windows打造智能静音散热系统
  • 5月重磅|2026苏州GEO优化公司TOP5实力盘点+GEO攻略+GEO优化 - 一网推GEO招财兔
  • 深度解析React核心机制:从组件到虚拟DOM的全面指南
  • H3C WA5320云AP瘦转胖实战:从BootWare升级到固件刷写的完整避坑指南
  • 梯度下降变体:SGD、Adam、RMSProp 对比实验
  • 数字的长征:从蒸汽机到智能体——可计算化革命的底层演进脉络