我用的是vscode

首先是文件目录,读者自己创建好相应的文件

读者可以把springboot项目文件夹名称命名为demo2完全照搬

如果自己命名的文件要改相应的import引入

src/
└── main/
    ├── java/
    │   └── com/
    │       └── example/
    │           └── 你的项目名/
    │               ├── controller/       # 控制器类(处理路由)
    │               │   └── GreetingController.java

                     ├── entities/

    │               │   └── user1.java

 

                     ├── config/

    │               │   └── SecurityConfig.java

                     ├── Mapper/

    │               │   └── UserMapper.java

                     ├── service/

                     │   └── userService.java
    │               └── DemoApplication.java   # 启动类
    └── resources/
        ├── static/                       # 静态资源目录(HTML/CSS/JS)
        │   ├── index.html
        │   └── login.html
        ├── templates/                    # 模板引擎文件(如 Thymeleaf)
        └── application.properties        # 配置文件

1.首先是login.html文件(路由 /one)

如果用户用的是idea可以直接运行看相应的效果

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"> <!-- 添加此行 -->
    <title>登录</title>
</head>
<body>
    <h1>登录</h1>
    <form action="/one" method="post">
        <div>
            <label>用户名:</label>
            <input type="text" name="username" required>
        </div>
        <div>
            <label>密码:</label>
            <input type="password" name="password" required>
        </div>
        <button type="submit">登录</button>
    </form>
    <p>没有账号?<a href="/register.html">去注册</a></p>
</body>
</html>

register对应路由two

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"> <!-- 添加此行 -->
    <title>注册</title>
</head>
<body>
    <h1>注册</h1>
    <form action="/two" method="post">
        <div>
            <label>用户名:</label>
            <input type="text" name="username" required>
        </div>
        <div>
            <label>密码:</label>
            <input type="password" name="password" required>
        </div>
        <div>
            <label>邮箱:</label>
            <input type="email" name="email" required>
        </div>
        <button type="submit">注册</button>
    </form>
    <p>已有账号?<a href="/login.html">去登录</a></p>
</body>
</html>

2. 修改你的pom.xml文件加入依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		
		<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
        </dependency>

		<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

		<dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-crypto</artifactId>
        </dependency>

	</dependencies>

3.在pgadmin 4中创建用户表

这里记住你创建表的所在数据库

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4.application.properties的配置

我的端口设置为1234

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres

上面这一行代码注意,如果用户直接打开创建上述的表,那么会储存在默认的postgres中,如果不是请换成你的数据库

spring.datasource.password=后面加你的数据库密码

spring.application.name=demo2
# 服务器配置
server.port=1234


spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=
spring.datasource.driver-class-name=org.postgresql.Driver

#mybatis.mapper-locations=classpath:/*.xml
mybatis.mapper-locations=classpath:/*.xml

# Spring Boot配置
mybatis.type-aliases-package=com.example.demo2.entities

 5.创建实体类entities\user1.java

package com.example.demo2.entities;

import java.time.LocalDateTime;

public class user1 {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private LocalDateTime createdAt;

    // 无参构造方法(MyBatis 反射需要)
    public user1() {}

    // Getters 和 Setters
    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 getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    public LocalDateTime getCreatedAt() { return createdAt; }
    public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }

    // 可选:toString 方法(调试用)
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                ", createdAt=" + createdAt +
                '}';
    }

}

 

6.创建接口Mapper\UserMapper(MyBatis接口)

package com.example.demo2.Mapper;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;

import com.example.demo2.entities.user1;

@Mapper
public interface UserMapper {
    // 注册:插入用户
    @Insert("INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(user1 user);

    // 登录:根据用户名查询用户
    @Select("SELECT * FROM users WHERE username = #{username}")
    user1 selectByUsername(String username);
}

 

7.service\user1Service服务层

package com.example.demo2.service;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.demo2.Mapper.UserMapper;
import com.example.demo2.entities.user1;
@Service
public class user1Service {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private PasswordEncoder passwordEncoder;  // 使用 BCrypt

    // 注册逻辑
    @Transactional
    public void register(user1 user) {
        // 检查用户名是否重复
        user1 existingUser = userMapper.selectByUsername(user.getUsername());
        if (existingUser != null) {
            throw new RuntimeException("用户名已存在");
        }

        // 加密密码
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        userMapper.insertUser(user);
    }

    // 登录逻辑
    public user1 login(String username, String password) {
        user1 user = userMapper.selectByUsername(username);
        if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
            throw new RuntimeException("用户名或密码错误");
        }
        return user;
    }
}

8.控制器controller\GreetingController

 

package com.example.demo2.controller;


import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.demo2.entities.ResterLayer;
import com.example.demo2.entities.User;
import com.example.demo2.entities.user1;
import com.example.demo2.entities.FeatureLayer;
import com.example.demo2.service.*;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@RestController
public class GreetingController {
    @Autowired
    private user1Service user1Service;

    // 登录接口(路由 /one)
    @PostMapping("/one")
    public ResponseEntity<?> login(
        @RequestParam String username,
        @RequestParam String password
    ) {
        try {
            user1 user = user1Service.login(username, password);
            return ResponseEntity.ok("登录成功");
        } catch (RuntimeException e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    // 注册接口(路由 /two)
    @PostMapping("/two")
    public ResponseEntity<?> register(
        @RequestParam String username,
        @RequestParam String password,
        @RequestParam String email
    ) {
        try {
            user1 user = new user1();
            user.setUsername(username);
            user.setPassword(password);
            user.setEmail(email);
            user1Service.register(user);
            return ResponseEntity.ok("注册成功");
        } catch (RuntimeException e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
    
}

 9.config\Security

package com.example.demo2.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 10.在网页栏搜索http://localhost:1234/login.html即可

效果如下,可以自行添加css优化页面

 

我在文件创建步骤时打乱了,如果有报错先不管,最终有问题再逐步解决

三连

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐