diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c1c2a99 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 42e64c7..f365e64 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,5 +1,8 @@ + + @@ -29,7 +37,11 @@ \ No newline at end of file diff --git a/backend/pom.xml b/backend/pom.xml index 6ac14a8..db6b7d8 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -21,7 +21,11 @@ org.springframework.boot spring-boot-starter-web - + + org.springframework.security + spring-security-core + 5.8.0 + org.springframework.boot spring-boot-starter-mail diff --git a/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeController.java b/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeController.java new file mode 100644 index 0000000..2a59c16 --- /dev/null +++ b/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeController.java @@ -0,0 +1,29 @@ +package com.flyingpig.kclassrollcall.init; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.sql.DataSource; + + +@Slf4j(topic = "Initialize") +@RestController +@RequiredArgsConstructor +public class InitializeController { + + private final DataSource dataSource; + + @GetMapping("/initialize/application") + public void initializeDispatcherServletAndDataSource() { + log.info("开始初始化DispatcherServlet和数据源"); + try { + log.info("初始化DispatcherServlet和数据源成功"); + dataSource.getConnection().createStatement().execute("SELECT 1"); + } catch (Exception e) { + log.error("初始化DispatcherServlet和数据源失败", e); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeDispatcherServletController.java b/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeDispatcherServletController.java deleted file mode 100644 index 8279b2b..0000000 --- a/backend/src/main/java/com/flyingpig/kclassrollcall/init/InitializeDispatcherServletController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.flyingpig.kclassrollcall.init; - - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - - -@Slf4j(topic = "Initialize DispatcherServlet") -@RestController -public final class InitializeDispatcherServletController { - - @GetMapping("/initialize/dispatcher-servlet") - public void initializeDispatcherServlet() { - log.info("Initialized the dispatcherServlet to improve the first response time of the interface..."); - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/StudentServiceImpl.java b/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/StudentServiceImpl.java index 3c00f31..cefa9fd 100644 --- a/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/StudentServiceImpl.java +++ b/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/StudentServiceImpl.java @@ -52,48 +52,32 @@ public class StudentServiceImpl extends ServiceImpl impl if (!mode.equals(RollCallMode.EQUAL)) { return Result.success(rollBackStudentBaseScore()); } else { - return Result.success(selectStudentByTeacherId().get(new Random().nextInt(count()) - 1)); + List students = this.baseMapper.selectList(new LambdaQueryWrapper() + .eq(Student::getTeacherId, UserContext.getUser())); + return Result.success(students.get(new Random().nextInt(students.size()))); } } private List selectStudentByTeacherId() { - List cachedList = listCacheUtil.safeGetWithLock( - RedisConstant.STUDENT_LIST_KEY + UserContext.getUser(), - StudentInfoInCache.class, // 使用具体的 StudentInfoInCache.class 作为类型 + return listCacheUtil.safeGetWithLock( + RedisConstant.STUDENT_LIST_KEY + UserContext.getUser(), // Redis Key + Student.class, () -> { - // 查询学生的逻辑,转换为 StudentInfoInCache 列表 + // 查询学生ID的逻辑 return this.baseMapper.selectList(new LambdaQueryWrapper() - .eq(Student::getTeacherId, UserContext.getUser())).stream() - .map(student -> new StudentInfoInCache(student.getId(), student.getName(), student.getNo(), student.getMajor())) - .collect(Collectors.toList()); + .eq(Student::getTeacherId, UserContext.getUser())); }, - 30L, + 30L, // 缓存时间 TimeUnit.MINUTES ); - List students = new ArrayList<>(); - for (StudentInfoInCache studentInfo : cachedList) { - Student newStudent = new Student(); - BeanUtil.copyProperties(studentInfo, newStudent); - newStudent.setScore(stringCacheUtil.safeGetWithLock( - RedisConstant.STUDENT_SCORE_KEY + studentInfo.getId(), - Double.class, // 传入正确的类型 - () -> { - return this.getBaseMapper().selectById(studentInfo.getId()).getScore(); - }, - 30L, - TimeUnit.MINUTES - )); - newStudent.setTeacherId(Long.parseLong(UserContext.getUser())); - students.add(newStudent); - } - return students; } private Student rollBackStudentBaseScore() { // 获取符合条件的学生列表 - List students = selectStudentByTeacherId(); + List students = this.baseMapper.selectList(new LambdaQueryWrapper() + .eq(Student::getTeacherId, UserContext.getUser())); // 计算权重 double totalWeight = 0; Map weightMap = new HashMap<>(); diff --git a/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/TeacherServiceImpl.java b/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/TeacherServiceImpl.java index 47bf1c0..5f2d07a 100644 --- a/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/TeacherServiceImpl.java +++ b/backend/src/main/java/com/flyingpig/kclassrollcall/service/impl/TeacherServiceImpl.java @@ -11,6 +11,7 @@ import com.flyingpig.kclassrollcall.service.ITeacherService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.flyingpig.kclassrollcall.util.JwtUtil; import org.apache.catalina.User; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; /** @@ -28,11 +29,10 @@ public class TeacherServiceImpl extends ServiceImpl impl @Override public Result login(LoginReq loginReq) { Teacher teacher = this.getOne(new LambdaQueryWrapper() - .eq(Teacher::getUsername, loginReq.getUsername()) - .eq(Teacher::getPassword, loginReq.getPassword())); - if(teacher == null){ + .eq(Teacher::getUsername, loginReq.getUsername())); + if (teacher == null || !new BCryptPasswordEncoder().matches(loginReq.getPassword(), teacher.getPassword())) { return Result.error("账号或密码错误"); - }else { + } else { return Result.success(new LoginResp(teacher.getName(), JwtUtil.createJWT(teacher.getId().toString()))); } } @@ -40,9 +40,9 @@ public class TeacherServiceImpl extends ServiceImpl impl @Override public Result register(Teacher teacher) { try { - save(teacher); + save(teacher.setPassword(new BCryptPasswordEncoder().encode(teacher.getPassword()))); return Result.success("注册成功"); - }catch (Exception e){ + } catch (Exception e) { log.error(e.getMessage()); return Result.error("注册失败,可能存在用户名已被注册等问题"); } diff --git a/backend/src/test/java/com/flyingpig/kclassrollcall/StudentServiceImplTest.java b/backend/src/test/java/com/flyingpig/kclassrollcall/StudentServiceImplTest.java deleted file mode 100644 index c85ea3e..0000000 --- a/backend/src/test/java/com/flyingpig/kclassrollcall/StudentServiceImplTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.flyingpig.kclassrollcall; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.flyingpig.kclassrollcall.common.RedisConstant; -import com.flyingpig.kclassrollcall.common.Result; -import com.flyingpig.kclassrollcall.common.RollCallMode; -import com.flyingpig.kclassrollcall.dto.resp.StudentInfoInCache; -import com.flyingpig.kclassrollcall.entity.Student; -import com.flyingpig.kclassrollcall.filter.UserContext; -import com.flyingpig.kclassrollcall.mapper.StudentMapper; -import com.flyingpig.kclassrollcall.service.impl.StudentServiceImpl; -import com.flyingpig.kclassrollcall.util.cache.ListCacheUtil; -import com.flyingpig.kclassrollcall.util.cache.StringCacheUtil; -import com.google.common.cache.CacheLoader; -import org.apache.poi.ss.formula.functions.T; -import org.junit.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.*; -import static org.mockito.ArgumentMatchers.any; - -@ExtendWith(MockitoExtension.class) -public class StudentServiceImplTest { - - @Mock - private StudentMapper studentMapper; - - @Mock - private ListCacheUtil listCacheUtil; - - @Mock - private StringCacheUtil stringCacheUtil; - - - - @InjectMocks - private StudentServiceImpl studentService; - - @Test - public - - void testRollCall() { - // 模拟依赖方法 - // 调用依赖方法方法 - Mockito.doReturn(Result.success()).when(studentService).rollCall(RollCallMode.EQUAL); - List mockStudents = Arrays.asList( - new Student(1L, "Alice", 1, "Math", 50.0, 100L), - new Student(2L, "Bob", 2, "Science", 0.0, 100L) - ); - when(studentMapper.selectList(new LambdaQueryWrapper().eq(Student::getTeacherId, any()))).thenReturn(mockStudents); - // 模拟 rollCall 调用 - Result result = studentService.rollCall(RollCallMode.EQUAL); - - // 验证返回结果 - assertNotNull(result); - assertTrue(mockStudents.contains(result.getData())); // 随机选择一个学生 - } -} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 26364b7..9971929 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,11 +1,11 @@ { - "name": "k-class-roll-call", + "name": "k-calss-rall-call", "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "k-class-roll-call", + "name": "k-calss-rall-call", "version": "0.1.0", "dependencies": { "axios": "^1.5.1",