remove @springbootTest

Change-Id: Iea186ebd05298d2804b7c6b418581e2cc935fab7
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);
+        }
+    }
+}