小明:最近我在研究一个校园宿舍管理系统,你觉得这个项目有什么技术难点吗?
小李:挺多的。首先得考虑用户权限管理,比如学生、管理员和宿管员的不同角色,需要做细致的权限控制。
小明:对,那怎么实现呢?有没有什么好的技术方案?
小李:我们可以用Spring Security来处理权限问题,结合JWT令牌进行身份验证,这样安全性更高。
小明:听起来不错。那数据库方面应该怎么做?宿舍信息、学生信息、分配情况都需要存储。
小李:是的,建议使用MySQL作为数据库,设计几个核心表,比如学生表、宿舍表、分配记录表等。
小明:能给我看看具体的代码结构吗?
小李:当然可以,下面是一个简单的示例。
小明:谢谢!那我们先从实体类开始吧。
小李:好的,这是Student实体类:
public class Student {
private Long id;
private String name;
private String studentId;
private String gender;
private String phone;
private Long dormitoryId;
// getters and setters
}
小明:明白了,接下来是Dormitory实体类。
小李:这里是Dormitory实体类:
public class Dormitory {
private Long id;
private String buildingNumber;
private String roomNumber;
private Integer capacity;
private Integer currentOccupants;
// getters and setters
}
小明:然后是分配记录的实体类,用来记录谁住哪个宿舍。
小李:没错,下面是DormitoryAssignment实体类:
public class DormitoryAssignment {
private Long id;
private Long studentId;
private Long dormitoryId;
private LocalDate assignDate;
// getters and setters
}
小明:这些实体类设计得很清晰。接下来是数据库的建表语句,我需要在MySQL中创建这些表。
小李:是的,以下是建表语句:

CREATE TABLE student (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
student_id VARCHAR(50) UNIQUE,
gender VARCHAR(10),
phone VARCHAR(20),
dormitory_id BIGINT,
FOREIGN KEY (dormitory_id) REFERENCES dormitory(id)
);
CREATE TABLE dormitory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
building_number VARCHAR(50),
room_number VARCHAR(50),
capacity INT,
current_occupants INT
);
CREATE TABLE dormitory_assignment (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
student_id BIGINT,
dormitory_id BIGINT,
assign_date DATE,
FOREIGN KEY (student_id) REFERENCES student(id),
FOREIGN KEY (dormitory_id) REFERENCES dormitory(id)
);
小明:这些SQL语句写得非常规范。接下来是Controller层,用来处理HTTP请求。
小李:好的,这里是一个简单的StudentController示例:
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/{id}")
public ResponseEntity
return ResponseEntity.ok(studentService.getStudentById(id));
}
@PostMapping
public ResponseEntity
return ResponseEntity.status(HttpStatus.CREATED).body(studentService.createStudent(student));
}
}
小明:这个Controller看起来很基础,但功能齐全。那Service层是怎么设计的呢?
小李:Service层负责业务逻辑,这里是一个StudentService接口和其实现类:
public interface StudentService {
Student getStudentById(Long id);
Student createStudent(Student student);
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentRepository studentRepository;
@Override
public Student getStudentById(Long id) {
return studentRepository.findById(id).orElseThrow(() -> new RuntimeException("Student not found"));
}
@Override
public Student createStudent(Student student) {
return studentRepository.save(student);
}
}
小明:看来Spring Boot的依赖注入机制用得非常好。那Repository层是怎么写的?
小李:Repository层使用JPA来操作数据库,这里是StudentRepository接口:
public interface StudentRepository extends JpaRepository
}
小明:这样就完成了基本的CRUD操作。接下来是权限管理部分,你是怎么处理的?
小李:我们使用了Spring Security和JWT。首先配置SecurityConfig类,设置登录接口和权限控制。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()

.anyRequest().authenticated()
.and()
.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
小明:这个过滤器的作用是什么?
小李:JwtAuthenticationFilter会检查每个请求中的JWT令牌,验证其有效性,并将用户信息放入SecurityContext中。
小明:那如何生成和验证JWT令牌呢?
小李:我们用了一个工具类,里面包含生成和解析JWT的方法:
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 86400000; // 24小时
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}

}
小明:这个方法很实用,能有效防止未授权访问。那登录接口应该怎么设计?
小李:登录接口接收用户名和密码,验证后返回JWT令牌:
@PostMapping("/login")
public ResponseEntity
if (isValidUser(request.getUsername(), request.getPassword())) {
String token = JwtUtil.generateToken(request.getUsername());
return ResponseEntity.ok(token);
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
小明:这个设计很合理。现在系统已经具备了基本的功能,接下来可以扩展更多模块。
小李:是的,比如宿舍分配算法、学生入住申请、宿舍维修申请等功能都可以逐步添加。
小明:我觉得这个系统非常适合理工大学这样的高校使用,能够提高宿舍管理效率。
小李:没错,而且使用Java和Spring Boot框架,具有良好的可维护性和扩展性。
小明:谢谢你详细的讲解,我对整个系统有了更深入的理解。
小李:不客气,如果你有其他问题,随时可以问我。
