#1.0.1 登录注册

This commit is contained in:
root 2025-12-04 16:15:16 +08:00
parent 2ba0e5c6a7
commit 6454f5291f
9 changed files with 317 additions and 78 deletions

102
pom.xml
View File

@ -6,22 +6,28 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.campus</groupId>
<artifactId>campus-attendance</artifactId>
<artifactId>student-attendance</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.3.23</spring.version>
<mybatis.version>3.5.11</mybatis.version>
<mybatis.spring.version>2.0.7</mybatis.spring.version> <!-- 修正后的行 -->
<mybatis.spring.version>2.1.1</mybatis.spring.version>
<mysql.version>8.0.33</mysql.version>
<druid.version>1.2.15</druid.version>
<servlet.version>4.0.1</servlet.version>
<jstl.version>1.2</jstl.version>
<jackson.version>2.14.2</jackson.version>
<slf4j.version>2.0.7</slf4j.version>
<logback.version>1.4.7</logback.version>
</properties>
<dependencies>
<!-- Spring -->
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
@ -37,6 +43,11 @@
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MyBatis -->
<dependency>
@ -50,73 +61,86 @@
<version>${mybatis.spring.version}</version>
</dependency>
<!-- 数据库 -->
<!-- Database -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
<version>${druid.version}</version>
</dependency>
<!-- Servlet API -->
<!-- Servlet & JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- JSON -->
<!-- JSON Processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
<version>${jackson.version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- Testing (可选) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>campus-attendance</finalName>
<finalName>student-attendance</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- 用于将依赖包复制到lib目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
<!-- 新增 JDK 17 编译参数 -->
<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>

View File

@ -33,3 +33,66 @@ INSERT INTO user (username, password, role) VALUES
![img.png](img.png)
-- 在已有的数据库基础上,添加考勤相关表
-- 考勤记录表
CREATE TABLE attendance_record (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL,
course_name VARCHAR(100) NOT NULL,
attendance_date DATE NOT NULL,
attendance_time TIME,
status VARCHAR(20) NOT NULL DEFAULT 'PRESENT', -- PRESENT/ABSENT/LATE
remarks VARCHAR(500),
created_by VARCHAR(50), -- 记录创建人(教师用户名)
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (student_id) REFERENCES student(student_id) ON DELETE CASCADE
);
-- 创建索引提高查询效率
CREATE INDEX idx_student_date ON attendance_record(student_id, attendance_date);
CREATE INDEX idx_date_status ON attendance_record(attendance_date, status);
-- 课程表(可选)
CREATE TABLE course (
id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL,
teacher_id INT, -- 关联user表的id
class_name VARCHAR(50),
schedule_time VARCHAR(100), -- 上课时间描述
status INT DEFAULT 1 -- 1启用0停用
);
-- 添加更多测试数据到数据库
-- 添加更多学生
INSERT INTO student (name, student_id, class, major) VALUES
('王五', '2023003', '计算机1班', '计算机科学与技术'),
('赵六', '2023004', '软件1班', '软件工程'),
('钱七', '2023005', '网络1班', '网络工程'),
('孙八', '2023006', '计算机1班', '计算机科学与技术');
-- 添加更多用户密码都是123456经过MD5加盐加密后的值
-- 实际密码需要加密存储,这里先用明文,系统会自动加密
INSERT INTO user (username, password, role) VALUES
('2023001', '123456', 'STUDENT'),
('2023002', '123456', 'STUDENT'),
('2023003', '123456', 'STUDENT'),
('teacher2', '123456', 'TEACHER'),
('admin','123456','ADMIN'),
('student1', '123456', 'STUDENT');
-- 添加考勤测试数据
INSERT INTO attendance_record (student_id, course_name, attendance_date, attendance_time, status, remarks, created_by) VALUES
('2023001', '高等数学', DATE_SUB(CURDATE(), INTERVAL 3 DAY), '08:30:00', 'PRESENT', '', 'teacher1'),
('2023002', '高等数学', DATE_SUB(CURDATE(), INTERVAL 3 DAY), '08:35:00', 'LATE', '迟到5分钟', 'teacher1'),
('2023001', '大学英语', DATE_SUB(CURDATE(), INTERVAL 2 DAY), '10:00:00', 'PRESENT', '', 'teacher1'),
('2023003', '高等数学', DATE_SUB(CURDATE(), INTERVAL 3 DAY), '08:30:00', 'ABSENT', '请假', 'teacher1'),
('2023001', '数据结构', DATE_SUB(CURDATE(), INTERVAL 1 DAY), '14:00:00', 'PRESENT', '', 'teacher1'),
('2023002', '数据结构', DATE_SUB(CURDATE(), INTERVAL 1 DAY), '14:00:00', 'PRESENT', '', 'teacher1');

View File

@ -1,8 +1,13 @@
// com/campus/controller/PageController.java
package com.campus.controller;
import com.campus.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpSession;
@Controller
public class PageController {
@ -15,4 +20,44 @@ public class PageController {
public String studentList() {
return "student_list";
}
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/register")
public String register() {
return "register";
}
@GetMapping("/admin")
public String adminPage(HttpSession session, Model model) {
User user = (User) session.getAttribute("currentUser");
if (user == null || !"ADMIN".equals(user.getRole())) {
return "redirect:/login";
}
model.addAttribute("user", user);
return "admin";
}
@GetMapping("/teacher")
public String teacherPage(HttpSession session, Model model) {
User user = (User) session.getAttribute("currentUser");
if (user == null || !"TEACHER".equals(user.getRole())) {
return "redirect:/login";
}
model.addAttribute("user", user);
return "teacher";
}
@GetMapping("/student")
public String studentPage(HttpSession session, Model model) {
User user = (User) session.getAttribute("currentUser");
if (user == null || !"STUDENT".equals(user.getRole())) {
return "redirect:/login";
}
model.addAttribute("user", user);
return "student";
}
}

View File

@ -1,3 +1,4 @@
// com/campus/controller/StudentController.java
package com.campus.controller;
import com.campus.entity.Student;
@ -5,9 +6,10 @@ import com.campus.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// StudentController.java
@RestController
@RequestMapping("/student")
public class StudentController {
@ -19,9 +21,67 @@ public class StudentController {
return studentService.listAll();
}
@GetMapping("/{studentId}")
public Map<String, Object> getByStudentId(@PathVariable String studentId) {
Map<String, Object> result = new HashMap<>();
Student student = studentService.getByStudentId(studentId);
if (student != null) {
result.put("success", true);
result.put("student", student);
} else {
result.put("success", false);
result.put("message", "学生不存在");
}
return result;
}
@PostMapping("/add")
public String add(@RequestBody Student student) {
public Map<String, Object> add(@RequestBody Student student) {
Map<String, Object> result = new HashMap<>();
try {
studentService.add(student);
return "success";
result.put("success", true);
result.put("message", "添加成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "添加失败:" + e.getMessage());
}
return result;
}
@PutMapping("/update")
public Map<String, Object> update(@RequestBody Student student) {
Map<String, Object> result = new HashMap<>();
try {
studentService.update(student);
result.put("success", true);
result.put("message", "更新成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "更新失败:" + e.getMessage());
}
return result;
}
@DeleteMapping("/delete/{id}")
public Map<String, Object> delete(@PathVariable Integer id) {
Map<String, Object> result = new HashMap<>();
try {
studentService.delete(id);
result.put("success", true);
result.put("message", "删除成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "删除失败:" + e.getMessage());
}
return result;
}
}

View File

@ -1,41 +1,28 @@
// com/campus/entity/User.java
package com.campus.entity;
// User.java
public class User {
private Integer id;
private String username;
private String password;
private String role; // ADMIN/TEACHER/STUDENT
public Integer getId() {
return id;
}
// 新增构造方法
public User() {}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
public User(String username, String password, String role) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
// 已有的getter和setter方法...
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getRole() { return role; }
public void setRole(String role) { this.role = role; }
}

View File

@ -1,7 +1,9 @@
// com/campus/mapper/StudentMapper.java
package com.campus.mapper;
import com.campus.entity.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -11,4 +13,7 @@ public interface StudentMapper {
void insert(Student student);
void update(Student student);
void delete(Integer id);
// 新增根据学号查询学生
Student selectByStudentId(@Param("studentId") String studentId);
}

View File

@ -1,3 +1,4 @@
// com/campus/service/StudentService.java
package com.campus.service;
import com.campus.entity.Student;
@ -7,7 +8,6 @@ import org.springframework.stereotype.Service;
import java.util.List;
// StudentService.java
@Service
public class StudentService {
@Autowired
@ -20,4 +20,19 @@ public class StudentService {
public void add(Student student) {
studentMapper.insert(student);
}
// 添加新方法根据学号查询学生
public Student getByStudentId(String studentId) {
return studentMapper.selectByStudentId(studentId);
}
// 添加更新方法
public void update(Student student) {
studentMapper.update(student);
}
// 添加删除方法
public void delete(Integer id) {
studentMapper.delete(id);
}
}

View File

@ -3,20 +3,39 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.campus.mapper.StudentMapper">
<select id="selectAll" resultType="com.campus.entity.Student">
<resultMap id="studentMap" type="com.campus.entity.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="studentId" column="student_id"/>
<result property="class_" column="class"/>
<result property="major" column="major"/>
</resultMap>
<select id="selectAll" resultMap="studentMap">
SELECT * FROM student
</select>
<!-- 修改 insert 和 update 语句中的 class 字段 -->
<insert id="insert" parameterType="com.campus.entity.Student">
INSERT INTO student(name, student_id, `class`, major) <!-- 新增反引号 -->
<select id="selectByStudentId" parameterType="string" resultMap="studentMap">
SELECT * FROM student WHERE student_id = #{studentId}
</select>
<insert id="insert" parameterType="com.campus.entity.Student" useGeneratedKeys="true" keyProperty="id">
INSERT INTO student(name, student_id, `class`, major)
VALUES(#{name}, #{studentId}, #{class_}, #{major})
</insert>
<update id="update" parameterType="com.campus.entity.Student">
UPDATE student
SET name = #{name}, student_id = #{studentId}, `class` = #{class_}, major = #{major} <!-- 新增反引号 -->
SET name = #{name},
student_id = #{studentId},
`class` = #{class_},
major = #{major}
WHERE id = #{id}
</update>
<delete id="delete" parameterType="java.lang.Integer">
DELETE FROM student WHERE id = #{id}
</delete>
</mapper>

View File

@ -13,7 +13,6 @@
<!-- 扫描 Controller -->
<context:component-scan base-package="com.campus.controller"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
@ -27,4 +26,26 @@
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<bean class="com.campus.interceptor.AuthInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
</beans>