#1.0.1 登录注册
This commit is contained in:
parent
2ba0e5c6a7
commit
6454f5291f
102
pom.xml
102
pom.xml
@ -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>
|
||||
|
||||
65
readme.md
65
readme.md
@ -32,4 +32,67 @@ INSERT INTO user (username, password, role) VALUES
|
||||
('teacher1', 'teacher123', 'TEACHER');
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
-- 在已有的数据库基础上,添加考勤相关表
|
||||
|
||||
-- 考勤记录表
|
||||
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');
|
||||
@ -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";
|
||||
}
|
||||
}
|
||||
@ -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) {
|
||||
studentService.add(student);
|
||||
return "success";
|
||||
public Map<String, Object> add(@RequestBody Student student) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
try {
|
||||
studentService.add(student);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
@ -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>
|
||||
Loading…
Reference in New Issue
Block a user