毕设难度级java项目!(傻瓜版)(万字详解)StudentService

登录方法(login)——“刷校园卡进门”

javascript
复制代码
/** * 登录 */ public Account login(Account account) { Account dbStudent = studentMapper.selectByUsername(account.getUsername()); if (dbStudent == null) { throw new CustomException("账号或密码错误"); } if (!account.getPassword().equals(dbStudent.getPassword())) { throw new CustomException("账号或密码错误"); } return dbStudent; }
  • / ** 登录* /:这是 “功能说明书”!告诉看代码的人:“这个方法是干登录的”,就像遥控器上的 “电源键” 标着 “开机 / 关机”。
  • public Account login(Account account):定义 “刷校园卡” 功能!public表示谁都能调用(比如前端点击登录按钮就会触发);Account是返回值类型(刷成功后返回完整账号信息);login是方法名(一看就知道是登录);Account account是参数(用户输入的用户名密码,像递进来的校园卡)。
  • Account dbStudent = studentMapper.selectByUsername(account.getUsername());:“查档案” 环节!让管理员(studentMapper)按用户名(account.getUsername ())查数据库里有没有这个账号 —— 就像刷校园卡时,系统查后台有没有这个卡号。
  • if (dbStudent == null) { ... }:如果没查到档案(dbStudent 是 null),说明这卡号根本不存在,就用 “小喇叭”(CustomException)喊:“账号或密码错误”—— 为啥不直接说 “账号不存在”?怕坏人试出哪些账号是真的!
  • throw new CustomException("账号或密码错误");:“吹哨报错”!一旦执行这行,方法就停了,不会往下走,就像保安发现卡无效,直接拦住不让进。
  • if (!account.getPassword().equals(dbStudent.getPassword())) { ... }:“核对密码” 环节!用户输入的密码(account.getPassword ())和数据库存的密码(dbStudent.getPassword ())对不上,也用小喇叭喊同样的话(还是为了安全,不告诉坏人错在哪)。
  • return dbStudent;:“放行并返回卡信息”!密码对了,就把数据库里的完整账号信息返回,相当于保安说 “卡有效,进去吧”,还顺便把卡的余额(其他信息)告诉用户。

注册方法(register)——“新生报到

javascript
复制代码
/** * 学生注册 */ public void register(Account account) { Student student = new Student(); student.setUsername(account.getUsername()); student.setPassword(account.getPassword()); this.add(student); }
  • / ** 学生注册* /:功能说明书,写着 “这是新生报到的流程”。
  • public void register(Account account):定义 “新生报到” 功能!void表示报到成功不用返回东西(像报名成功只给个回执,不用把报名表还你);Account account是新生填的简易报名表(只有用户名密码)。
  • Student student = new Student();:“换正式登记表”!Account 太简单,得换成 Student(完整版档案),就像报名时先填简易表,工作人员再换成正式档案表。
  • student.setUsername(account.getUsername());:“抄用户名”!把简易表的用户名抄到正式表上,确保一致。
  • student.setPassword(account.getPassword());:“抄密码”!同理,把密码也抄过去。
  • this.add(student);:“提交档案”!调用本类的 add 方法(下面会讲),把正式档案存到数据库 —— 就像报到最后一步,把填好的表交给管理员存档。

新增方法(add)——“存档新生档案”

javascript
复制代码
public void add(Student student) { Student dbStudent = studentMapper.selectByUsername(student.getUsername()); if (dbStudent != null) { throw new CustomException("账号已存在"); } if (ObjectUtil.isEmpty(student.getName())) { student.setName(student.getUsername()); } student.setRole(RoleEnum.STUDENT.name()); studentMapper.insert(student); }
  • student:你手里的 “新生档案表”(那个刚创建的学生对象)。
  • setRole(...):“设置身份” 的动作 —— 档案表上有个 “身份” 栏,这步就是往里面填内容。
  • RoleEnum.STUDENT:从 “身份模板”(RoleEnum)里拿 “学生” 这个选项 —— 就像模板上有 “学生”“老师”“管理员” 三张贴纸,这里专门选 “学生” 贴纸。
  • .name():把这个选项转换成文字(字符串)—— 贴纸本身是个标记,name()相当于把贴纸内容印成 “学生” 两个字,方便写进档案

为啥非要用RoleEnum?直接写"学生"不行吗?—— 用 “外卖备注” 给你讲透

改一次角色名,全项目 “大搬家”

假设后来学校要求把 “学生” 改成 “本科生”,那麻烦了:

  • 所有写了setRole("学生")的地方(可能有十几个 Service)都要一个个找出来改成"本科生"
  • 万一漏改了一个(比如某个角落的if(role.equals("学生"))),就会出现 “有的地方显示本科生,有的地方还显示学生” 的混乱。

角色值不统一,权限判断 “睁眼瞎”

比如张三写setRole("学生"),李四写setRole("STUDENT")(英文),王五写setRole("01")(用数字代表)。
系统判断 “这个用户是不是学生” 时,得写:

java
复制代码
if(role.equals("学生") || role.equals("STUDENT") || role.equals("01")) { ... }

其他 CRUD 方法 ——“档案的删改查”

javascript
复制代码
public void deleteById(Integer id) { studentMapper.deleteById(id); } public void updateById(Student student) { studentMapper.updateById(student); } public PageInfo<Student> selectPage(Integer pageNum, Integer pageSize, Student student) { PageHelper.startPage(pageNum, pageSize); List<Student> studentList = studentMapper.selectAll(student); return PageInfo.of(studentList); }

我们来重点理解 "执行查询" 这一步为什么能实现分页,这也是 PageHelper 插件的巧妙之处:

java
复制代码
List<Student> studentList = studentMapper.selectAll(student);

表面上看,这行代码是调用 studentMapper.selectAll(student) 方法查询学生列表,看起来像是要查询所有符合条件的学生。

但实际上,因为前面执行了 PageHelper.startPage(pageNum, pageSize);,PageHelper 会做这些事情:

  1. 拦截 SQL:PageHelper 会自动拦截后面执行的 Mapper 方法(这里就是 selectAll

  2. 修改 SQL:它会在原始 SQL 基础上自动添加分页条件。

    • 比如原始 SQL 是:select * from student where name like ?
    • 会被修改为(以 MySQL 为例):select * from student where name like ? limit ?, ?
    • 其中 limit 后面的参数就是根据 pageNum 和 pageSize 计算出来的
  3. 只查当前页数据:执行修改后的 SQL 时,只会查询当前页应该显示的数据,而不是全部数据。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP