项目结构参考

详细代码
UserController
package com.itheima.controller;
import com.itheima.entity.User;
import com.itheima.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
// 默认管理员
private final String adminUser = " "; // ********************输入你自己的账户信息
private final String adminPass = "111";
// 登录页面
@GetMapping("/")
public String showLoginPage() {
return "login";
}
// 登录逻辑
@PostMapping("/login")
public String login(@RequestParam String username,
@RequestParam String password,
Model model) {
// 管理员登录
if ("xy".equals(username) && "111".equals(password)) {
model.addAttribute("username", username); // ✅ 添加用户名到模型
return "success";
}
// 普通用户登录
User user = userRepository.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
model.addAttribute("username", user.getUsername()); // ✅ 添加用户名
return "success";
}
model.addAttribute("error", "用户名或密码错误!");
return "login";
}
// 注册页面
@GetMapping("/register")
public String showRegisterPage() {
return "register";
}
// 注册逻辑
@PostMapping("/register")
public String register(@RequestParam String username,
@RequestParam String password,
Model model) {
if (username.equals(adminUser)) {
model.addAttribute("error", "管理员账号不可注册!");
return "register";
}
if (userRepository.findByUsername(username) != null) {
model.addAttribute("error", "该用户名已存在!");
return "register";
}
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(password);
userRepository.save(newUser);
model.addAttribute("msg", "注册成功,请返回登录!");
return "register";
}
}
User
package com.itheima.entity;
import jakarta.persistence.*; // JPA 注解,用于定义实体类和数据库映射
import lombok.Data; // Lombok 注解,自动生成 getter/setter/toString 等方法
/**
* 用户实体类,对应数据库中的 users 表
*/
@Data // 自动生成 getter、setter、toString、equals、hashCode 等方法
@Entity // 标记这是一个 JPA 实体类,Spring Boot 会将其映射到数据库表
@Table(name = "users") // 指定对应的数据库表名为 "users"
public class User {
@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增策略,数据库自动生成主键
private Long id; // 用户ID,唯一标识
@Column(nullable = false, unique = true) // 映射到数据库列,不能为空且唯一
private String username; // 用户名
@Column(nullable = false) // 映射到数据库列,不能为空
private String password; // 用户密码
}
UserRepository
package com.itheima.repository;
import com.itheima.entity.User; // 导入User实体类
import org.springframework.data.jpa.repository.JpaRepository; // 导入Spring Data JPA的Repository接口
/**
* 用户仓库接口,用于操作数据库中的 users 表
* JpaRepository 提供了常用的增删改查方法
* 泛型 <User, Long> 表示操作的实体类是 User,主键类型是 Long
*/
public interface UserRepository extends JpaRepository<User, Long> {
/**
* 根据用户名查找用户
* Spring Data JPA 会根据方法名自动生成对应的查询语句
*
* @param username 用户名
* @return User 对象,如果找不到返回 null
*/
User findByUsername(String username);
}
login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>用户登录</title>
<style>
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #6a11cb, #2575fc); /* 渐变背景 */
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
margin: 0;
}
.login-box {
background-color: rgba(255, 255, 255, 0.95);
padding: 40px;
border-radius: 12px;
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
text-align: center;
width: 320px;
}
h2 {
margin-bottom: 30px;
color: #333;
font-size: 28px;
}
input {
width: 90%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 6px;
font-size: 16px;
}
button {
width: 95%;
padding: 10px;
margin: 10px 0;
border: none;
border-radius: 6px;
background-color: #2575fc;
color: white;
font-size: 16px;
cursor: pointer;
transition: 0.3s;
}
button:hover {
background-color: #6a11cb;
}
.register-btn {
background-color: #fff;
color: #2575fc;
border: 1px solid #2575fc;
}
.register-btn:hover {
background-color: #2575fc;
color: white;
}
.error {
color: red;
font-size: 14px;
}
</style>
</head>
<body>
<div class="login-box">
<h2>用户登录</h2>
<form th:action="@{/login}" method="post">
<input type="text" name="username" placeholder="用户名" required/><br/>
<input type="password" name="password" placeholder="密码" required/><br/>
<button type="submit">登录</button>
</form>
<form th:action="@{/register}" method="get">
<button type="submit" class="register-btn">注册</button>
</form>
<p th:text="${error}" class="error"></p>
</div>
</body>
</html>
success.html
<!--<!DOCTYPE html>-->
<!--<html>-->
<!--<head>-->
<!-- <title>登录成功</title>-->
<!-- <style>-->
<!-- body { text-align: center; font-family: Arial, sans-serif; margin-top: 100px; }-->
<!-- h1 { font-size: 32px; color: green; }-->
<!-- </style>-->
<!--</head>-->
<!--<body>-->
<!--<h1>🎉 恭喜你!登录成功 🎉</h1>-->
<!--</body>-->
<!--</html>-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录成功</title>
<style>
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #6a11cb, #2575fc);
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
margin: 0;
}
.success-box {
background-color: rgba(255, 255, 255, 0.95);
padding: 40px;
border-radius: 12px;
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
text-align: center;
}
h2 {
color: green;
font-size: 28px;
}
</style>
</head>
<body>
<div class="success-box">
<h2>🎉🎉恭喜你,<span th:text="${username}"></span>,登录成功!🎉🎉</h2>
</div>
</body>
</html>
实现效果参考


696

被折叠的 条评论
为什么被折叠?



