diff --git a/src/main/java/com/example/g8backend/G8BackendApplication.java b/src/main/java/com/example/g8backend/G8BackendApplication.java
index f94569a..3d297cb 100644
--- a/src/main/java/com/example/g8backend/G8BackendApplication.java
+++ b/src/main/java/com/example/g8backend/G8BackendApplication.java
@@ -2,8 +2,9 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
 
-@SpringBootApplication
+@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
 public class G8BackendApplication {
 
     public static void main(String[] args) {
diff --git a/src/main/java/com/example/g8backend/config/JwtConfig.java b/src/main/java/com/example/g8backend/config/JwtConfig.java
new file mode 100644
index 0000000..f824797
--- /dev/null
+++ b/src/main/java/com/example/g8backend/config/JwtConfig.java
@@ -0,0 +1,24 @@
+package com.example.g8backend.config;
+
+
+import io.jsonwebtoken.security.Keys;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import javax.crypto.SecretKey;
+import java.nio.charset.StandardCharsets;
+
+@Configuration
+public class JwtConfig {
+    private static final String SECRET_KEY = "this-is-a-very-long-256-bit-secret-key-for-JWT"; //
+    private static final long EXPIRATION_MS = 3600_000; // 1小时
+
+    @Bean
+    public SecretKey jwtSecretKey() {
+        return Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
+    }
+
+    public long getExpirationMs() {
+        return EXPIRATION_MS;
+    }
+}
+
diff --git a/src/main/java/com/example/g8backend/config/SecurityConfig.java b/src/main/java/com/example/g8backend/config/SecurityConfig.java
new file mode 100644
index 0000000..d44e6c6
--- /dev/null
+++ b/src/main/java/com/example/g8backend/config/SecurityConfig.java
@@ -0,0 +1,14 @@
+package com.example.g8backend.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+
+@Configuration
+public class SecurityConfig {
+    @Bean
+    public BCryptPasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+}
diff --git a/src/main/java/com/example/g8backend/controller/AuthController.java b/src/main/java/com/example/g8backend/controller/AuthController.java
new file mode 100644
index 0000000..11446f9
--- /dev/null
+++ b/src/main/java/com/example/g8backend/controller/AuthController.java
@@ -0,0 +1,49 @@
+package com.example.g8backend.controller;
+
+import com.example.g8backend.entity.User;
+import com.example.g8backend.service.IUserService;
+import com.example.g8backend.util.JwtUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+
+    @Autowired
+    private JwtUtil jwtUtil;
+
+    // 用户注册
+    @PostMapping("/register")
+    public ResponseEntity<?> register(@RequestBody User user) {
+        if (userService.getUserByName(user.getUserName()) != null) {
+            return ResponseEntity.badRequest().body("用户名已存在");
+        }
+        userService.registerUser(user);
+        return ResponseEntity.ok("注册成功");
+    }
+
+    // 用户登录
+    @PostMapping("/login")
+    public ResponseEntity<?> login(@RequestBody User user) {
+        User existingUser = userService.getUserByEmail(user.getEmail());
+        if (existingUser == null || !passwordEncoder.matches(user.getPassword(), existingUser.getPassword())) {
+            return ResponseEntity.badRequest().body("用户名或密码错误");
+        }
+        String token = jwtUtil.generateToken(existingUser.getUserName());
+        Map<String, String> response = new HashMap<>();
+        response.put("token", token);
+        return ResponseEntity.ok(response);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/g8backend/controller/UserController.java b/src/main/java/com/example/g8backend/controller/UserController.java
index 0bbcdc6..4bffa3c 100644
--- a/src/main/java/com/example/g8backend/controller/UserController.java
+++ b/src/main/java/com/example/g8backend/controller/UserController.java
@@ -34,9 +34,9 @@
 
     // 添加用户
     @PostMapping
-    public boolean addUser(@RequestBody User user) {
-        System.out.println(user);
-        return userService.save(user);
+    public void addUser(@RequestBody User user) {
+//        return userService.save(user);
+        userService.registerUser(user);
     }
 
     // 修改用户
diff --git a/src/main/java/com/example/g8backend/entity/Peer.java b/src/main/java/com/example/g8backend/entity/Peer.java
new file mode 100644
index 0000000..d7d6af5
--- /dev/null
+++ b/src/main/java/com/example/g8backend/entity/Peer.java
@@ -0,0 +1,33 @@
+package com.example.g8backend.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("peers")
+public class Peer {
+    @TableId(type = IdType.AUTO)
+    private Long peerId;
+
+    private Long userId;
+    private Long torrentId;
+    private String ipAddress;
+    private Integer port;
+    private Double uploaded;
+    private Double downloaded;
+
+    @Override
+    public String toString() {
+        return "Peer{" +
+                "peerId=" + peerId +
+                ", userId=" + userId +
+                ", torrentId=" + torrentId +
+                ", ipAddress='" + ipAddress + '\'' +
+                ", port=" + port +
+                ", uploaded=" + uploaded +
+                ", downloaded=" + downloaded +
+                '}';
+    }
+}
diff --git a/src/main/java/com/example/g8backend/entity/Torrent.java b/src/main/java/com/example/g8backend/entity/Torrent.java
new file mode 100644
index 0000000..b1e1985
--- /dev/null
+++ b/src/main/java/com/example/g8backend/entity/Torrent.java
@@ -0,0 +1,35 @@
+package com.example.g8backend.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.sql.Timestamp;
+import lombok.Data;
+
+@Data
+@TableName("torrents")
+public class Torrent {
+    @TableId(type = IdType.AUTO)
+    private Integer torrentId;
+    private Long userId;
+    private String torrentName;
+    private String infoHash;
+    private Double fileSize;
+
+    @TableField("created_at")
+    private Timestamp createdAt;
+
+    @Override
+    public String toString() {
+        return "Torrent{" +
+                "torrentId=" + torrentId +
+                ", userId=" + userId +
+                ", torrentName='" + torrentName + '\'' +
+                ", infoHash='" + infoHash + '\'' +
+                ", fileSize=" + fileSize +
+                ", createdAt=" + createdAt +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/g8backend/entity/User.java b/src/main/java/com/example/g8backend/entity/User.java
index f367a4b..8e28628 100644
--- a/src/main/java/com/example/g8backend/entity/User.java
+++ b/src/main/java/com/example/g8backend/entity/User.java
@@ -1,28 +1,25 @@
 package com.example.g8backend.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 @Data
-@TableName("user")  // 指定数据库表名
+@TableName("users")
 public class User {
     @TableId(type = IdType.AUTO)
-    private Long id;
+    private Long userId;
 
-    @TableField
-    private String name;
-
-    @TableField
+    private String password;
+    private String userName;
     private String email;
 
     @Override
     public String toString() {
         return "User{" +
-                "id=" + id +
-                ", name='" + name + '\'' +
+                "id=" + userId +
+                ", name='" + userName + '\'' +
                 ", email='" + email + '\'' +
                 '}';
     }
diff --git a/src/main/java/com/example/g8backend/mapper/UserMapper.java b/src/main/java/com/example/g8backend/mapper/UserMapper.java
index 65369cd..b389eb7 100644
--- a/src/main/java/com/example/g8backend/mapper/UserMapper.java
+++ b/src/main/java/com/example/g8backend/mapper/UserMapper.java
@@ -7,5 +7,6 @@
 
 @Mapper
 public interface UserMapper extends BaseMapper<User> {
-    User getUserByName(@Param("name") String name);
+    User getUserByName(@Param("userName") String userName);
+    User getUserByEmail(@Param("email") String email);
 }
diff --git a/src/main/java/com/example/g8backend/service/IUserService.java b/src/main/java/com/example/g8backend/service/IUserService.java
index 98b2810..2fb4fc9 100644
--- a/src/main/java/com/example/g8backend/service/IUserService.java
+++ b/src/main/java/com/example/g8backend/service/IUserService.java
@@ -6,4 +6,6 @@
 
 public interface IUserService extends IService<User> {
     User getUserByName(@Param("name") String name);
+    User getUserByEmail(@Param("email") String email);
+    void registerUser(User user);;
 }
diff --git a/src/main/java/com/example/g8backend/service/UserServiceImpl.java b/src/main/java/com/example/g8backend/service/UserServiceImpl.java
index 2347878..a382a89 100644
--- a/src/main/java/com/example/g8backend/service/UserServiceImpl.java
+++ b/src/main/java/com/example/g8backend/service/UserServiceImpl.java
@@ -4,15 +4,31 @@
 import com.example.g8backend.entity.User;
 import com.example.g8backend.mapper.UserMapper;
 import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
+
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
     @Resource
     private UserMapper userMapper; // 手动注入 UserMapper
 
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+
     @Override
-    public User getUserByName(String name) {
-        return userMapper.getUserByName(name); // 调用 UserMapper 的自定义 SQL
+    public User getUserByName(String name) { return userMapper.getUserByName(name);} // 调用 UserMapper 的自定义 SQL
+
+    @Override
+    public User getUserByEmail(String email) { return userMapper.getUserByEmail(email);}
+
+    @Override
+    public void registerUser(User user) {
+        String password = user.getPassword(); // 获取密码
+        String encodedPassword = passwordEncoder.encode(password); // 加密密码
+        user.setPassword(encodedPassword);
+        System.out.println(user.getPassword());
+        userMapper.insert(user); // 调用 UserMapper 的 insert 方法
     }
 }
diff --git a/src/main/java/com/example/g8backend/util/JwtUtil.java b/src/main/java/com/example/g8backend/util/JwtUtil.java
new file mode 100644
index 0000000..972df1c
--- /dev/null
+++ b/src/main/java/com/example/g8backend/util/JwtUtil.java
@@ -0,0 +1,45 @@
+package com.example.g8backend.util;
+
+import io.jsonwebtoken.*;
+import org.springframework.stereotype.Component;
+import javax.crypto.SecretKey;
+import java.util.Date;
+
+@Component
+public class JwtUtil {
+
+    private final SecretKey secretKey;
+    private final long expirationMs;
+
+    public JwtUtil(SecretKey secretKey) {
+        this.secretKey = secretKey;
+        this.expirationMs = 3600_000; // 1小时
+    }
+
+    // 生成 JWT Token
+    public String generateToken(String username) {
+        Date now = new Date();
+        Date expiryDate = new Date(now.getTime() + expirationMs);
+
+        return Jwts.builder()
+                .subject(username)
+                .issuedAt(now)
+                .expiration(expiryDate)
+                .signWith(secretKey, Jwts.SIG.HS256)
+                .compact();
+    }
+
+    // 验证Token并解析用户名
+    public String validateTokenAndGetUsername(String token) {
+        try {
+            Jws<Claims> claims = Jwts.parser()
+                    .verifyWith(secretKey)
+                    .build()
+                    .parseSignedClaims(token);
+
+            return claims.getPayload().getSubject();
+        } catch (JwtException e) {
+            throw new RuntimeException("Token无效或过期", e);
+        }
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e912ce2..6e7d6ce 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,6 +1,7 @@
-spring.datasource.password=050301
+spring.datasource.password=12345678
 spring.datasource.username=root
 spring.datasource.url=jdbc:mysql://localhost:3306/g8backend
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.sql.init.mode=always
 
-mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
\ No newline at end of file
+mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
index e8ffb26..314c087 100644
--- a/src/main/resources/mapper/UserMapper.xml
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -4,6 +4,9 @@
 
 <mapper namespace="com.example.g8backend.mapper.UserMapper">
     <select id="getUserByName" resultType="com.example.g8backend.entity.User">
-        SELECT * FROM user WHERE name = #{name}
+        SELECT * FROM users WHERE user_name = #{userName}
+    </select>
+    <select id="getUserByEmail" resultType="com.example.g8backend.entity.User">
+        SELECT * FROM users WHERE email = #{email}
     </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
new file mode 100644
index 0000000..2bd7010
--- /dev/null
+++ b/src/main/resources/schema.sql
@@ -0,0 +1,28 @@
+CREATE TABLE IF NOT EXISTS `users` (
+  user_id INT AUTO_INCREMENT PRIMARY KEY,
+  user_name VARCHAR(255) NOT NULL,
+  password VARCHAR(255) NOT NULL,
+  email VARCHAR(255) NOT NULL UNIQUE
+);
+
+CREATE TABLE IF NOT EXISTS `torrents` (
+    torrent_id INT AUTO_INCREMENT PRIMARY KEY,
+    user_id INT NOT NULL,
+    torrent_name VARCHAR(255) NOT NULL,
+    info_hash VARCHAR(255) NOT NULL,
+    file_size FLOAT NOT NULL,
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    FOREIGN KEY (user_id) REFERENCES users(user_id)
+);
+
+CREATE TABLE IF NOT EXISTS `peers` (
+  user_id INT NOT NULL,
+  torrent_id INT NOT NULL,
+  peer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  ip_address VARCHAR(128) NOT NULL,
+  port INT NOT NULL,
+  uploaded FLOAT NOT NULL,
+  downloaded FLOAT NOT NULL,
+  FOREIGN KEY (user_id) REFERENCES users(user_id),
+  FOREIGN KEY (torrent_id) REFERENCES torrents(torrent_id)
+);
diff --git a/src/test/java/com/example/g8backend/G8BackendApplicationTests.java b/src/test/java/com/example/g8backend/G8BackendApplicationTests.java
index 7fb10ca..19230d8 100644
--- a/src/test/java/com/example/g8backend/G8BackendApplicationTests.java
+++ b/src/test/java/com/example/g8backend/G8BackendApplicationTests.java
@@ -1,13 +1,11 @@
 package com.example.g8backend;
 
 import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
 
-@SpringBootTest
+
 class G8BackendApplicationTests {
 
     @Test
     void contextLoads() {
     }
-
-}
+}
\ No newline at end of file
