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);
+ }
+ }
+}
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