用户资料接口添加
Change-Id: Id55e7fef307ec1663bb7a05cfbf7f81e097ac767
diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index d8528db..41d9052 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -14,14 +14,19 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.PostMapping;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import database.Database1;
-import entity.Seed;
import tracker.Tracker;
+import entity.Seed;
+import entity.User;
+
+import java.util.UUID;
@RestController
public class ApiController implements ApiInterface {
@@ -29,6 +34,8 @@
private static Database1 db1;
private static Tracker tracker;
private static ObjectMapper mapper;
+ private static HttpHeaders headers;
+ private static HttpHeaders errorHeaders;
@PostConstruct
public void init() {
@@ -36,6 +43,14 @@
tracker = new Tracker();
mapper = new ObjectMapper();
mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ headers = new HttpHeaders();
+ headers.add("Access-Control-Allow-Origin", "*");
+ headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+ headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+ errorHeaders = new HttpHeaders();
+ errorHeaders.add("Access-Control-Allow-Origin", "*");
+ errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+ errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
}
@Override
@@ -47,42 +62,24 @@
) {
try {
Seed seed = new Seed();
- seed.seedid = "exampleSeedId"; // 示例种子ID
- seed.seeduserid = userid; // 示例用户ID
- seed.title = title; // 示例标题
- seed.seedsize = "1GB"; // 示例种子大小
- seed.seedtag = tag; // 示例标签
+ seed.seedid = UUID.randomUUID().toString(); // 生成唯一的种子ID
+ seed.seeduserid = userid;
+ seed.title = title;
+ seed.seedsize = "1GB";
+ seed.seedtag = tag;
seed.url = "http://example.com/torrent"; // 示例URL
-
+ System.out.println("seed is null? " + (seed == null));
int ret = db1.RegisterSeed(seed);
- // System.out.println("RegisterSeed ret: " + ret);
- // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
-
- // Convert MultipartFile to File
+ if (ret != 0) {
+ // 如果注册种子失败,返回错误状态
+ return new ResponseEntity<>(ret, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
file.transferTo(tempFile);
-
tracker.SaveTorrent(seed.seedid, tempFile);
-
- // Optionally, delete the temp file after saving if not needed
- // tempFile.delete();
-
- // 创建带有 CORS 响应头的 ResponseEntity
- HttpHeaders headers = new HttpHeaders();
- headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问,可以根据需要调整为特定域名
- headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法
- headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头
-
return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
} catch (Exception e) {
e.printStackTrace();
-
- // 创建带有 CORS 响应头的错误 ResponseEntity
- HttpHeaders errorHeaders = new HttpHeaders();
- errorHeaders.add("Access-Control-Allow-Origin", "*");
- errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
- errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
-
return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败
}
}
@@ -90,8 +87,8 @@
@Override
@CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部
public ResponseEntity<Resource> getTorrent(
- @RequestParam("torrentId") String seedid,
- @RequestParam("userId") String userid
+ @RequestParam("torrentId") String seedid,
+ @RequestParam("userId") String userid
) {
File file = tracker.GetTTorent(seedid, userid);
if (file != null) {
@@ -106,31 +103,187 @@
}
}
- //无按标签查询的函数
@Override
public ResponseEntity<String> getSeedListByTag(
@RequestParam("tag") String tag
) {
try {
Seed[] seeds = db1.GetSeedListByTag(tag);
+ if (seeds == null || seeds.length == 0) {
+ return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
+ }
String json = mapper.writeValueAsString(seeds);
- // System.out.println("getSeedListByTag: " + json);
- HttpHeaders headers = new HttpHeaders();
- headers.add("Access-Control-Allow-Origin", "*");
- headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
- headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
return new ResponseEntity<>(json, headers, HttpStatus.OK);
} catch (JsonProcessingException e) {
e.printStackTrace();
- HttpHeaders errorHeaders = new HttpHeaders();
- errorHeaders.add("Access-Control-Allow-Origin", "*");
- errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
- errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Override
+ public ResponseEntity<String> getUserProfile(
+ @RequestParam("userid") String userid
+ ) {
+ try {
+ User user = db1.GetInformation(userid);
+ if (user == null) {
+ return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ String json = mapper.writeValueAsString(user);
+ return new ResponseEntity<>(json, headers, HttpStatus.OK);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @Override
+ @CrossOrigin(origins = "*", allowedHeaders = "*")
+ public ResponseEntity<Integer> changeProfile(
+ @RequestBody String requestBody
+ ) {
+ try {
+ // 解析 JSON 数据
+ com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+
+ // 安全地获取 userid 字段
+ com.fasterxml.jackson.databind.JsonNode useridNode = jsonNode.get("userid");
+ if (useridNode == null) {
+ return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+ }
+ String userid = useridNode.asText();
+
+ // 添加参数验证
+ if (userid == null || userid.trim().isEmpty()) {
+ return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+ }
+
+ // 手动映射前端字段到 User 对象,处理类型转换
+ User user = new User();
+ user.userid = userid;
+
+ // 安全地获取其他字段并进行类型转换
+ if (jsonNode.has("username") && !jsonNode.get("username").isNull()) {
+ user.username = jsonNode.get("username").asText();
+ }
+ if (jsonNode.has("school") && !jsonNode.get("school").isNull()) {
+ user.school = jsonNode.get("school").asText();
+ }
+ if (jsonNode.has("gender") && !jsonNode.get("gender").isNull()) {
+ user.sex = jsonNode.get("gender").asText();
+ }
+ if (jsonNode.has("avatar_url") && !jsonNode.get("avatar_url").isNull()) {
+ user.pictureurl = jsonNode.get("avatar_url").asText();
+ }
+
+ // 处理 account_status 的类型转换(字符串/数字 -> 布尔值)
+ if (jsonNode.has("account_status") && !jsonNode.get("account_status").isNull()) {
+ com.fasterxml.jackson.databind.JsonNode statusNode = jsonNode.get("account_status");
+ if (statusNode.isTextual()) {
+ String statusStr = statusNode.asText();
+ user.accountstate = "1".equals(statusStr) || "封禁".equals(statusStr);
+ } else if (statusNode.isNumber()) {
+ user.accountstate = statusNode.asInt() == 1;
+ } else if (statusNode.isBoolean()) {
+ user.accountstate = statusNode.asBoolean();
+ }
+ }
+
+ // 处理 invite_left 的类型转换(字符串 -> 整数)
+ if (jsonNode.has("invite_left") && !jsonNode.get("invite_left").isNull()) {
+ com.fasterxml.jackson.databind.JsonNode inviteNode = jsonNode.get("invite_left");
+ if (inviteNode.isTextual()) {
+ try {
+ user.invitetimes = Integer.parseInt(inviteNode.asText());
+ } catch (NumberFormatException e) {
+ user.invitetimes = 0; // 默认值
+ }
+ } else if (inviteNode.isNumber()) {
+ user.invitetimes = inviteNode.asInt();
+ }
+ }
+
+ int ret = db1.UpdateInformation(user);
+ if (ret == 0) {
+ return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
+ } else {
+ return new ResponseEntity<>(ret, HttpStatus.INTERNAL_SERVER_ERROR); // 返回其他状态表示失败
+ }
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示处理失败
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @Override
+ public ResponseEntity<String> getUserSeeds(
+ @RequestParam("userid") String userid
+ ) {
+ try {
+ Seed[] seeds = db1.GetSeedListByUser(userid);
+ if (seeds == null || seeds.length == 0) {
+ return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
+ }
+ String json = mapper.writeValueAsString(seeds);
+ return new ResponseEntity<>(json, headers, HttpStatus.OK);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @Override
+ @CrossOrigin(origins = "*", allowedHeaders = "*")
+ public ResponseEntity<Integer> deleteSeed(
+ @RequestBody String requestBody
+ ) {
+ try {
+ // 解析 JSON 数据
+ com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
+ com.fasterxml.jackson.databind.JsonNode seedidNode = jsonNode.get("seedid");
+ if (seedidNode == null) {
+ return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+ }
+ String seedid = seedidNode.asText();
+
+ // 添加参数验证
+ if (seedid == null || seedid.trim().isEmpty()) {
+ return new ResponseEntity<>(1, HttpStatus.BAD_REQUEST);
+ }
+
+ int ret = db1.DeleteSeed(seedid);
+ if (ret == 0) {
+ return new ResponseEntity<>(0, HttpStatus.OK);
+ } else {
+ return new ResponseEntity<>(ret, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new ResponseEntity<>(1, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @Override
+ public ResponseEntity<String> getUserStat(
+ @RequestParam("userid") String userid
+ ) {
+ try {
+ User user = db1.GetInformation(userid);
+ if (user == null) {
+ return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ String json = mapper.writeValueAsString(user);
+ return new ResponseEntity<>(json, headers, HttpStatus.OK);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @Override
public ResponseEntity<String> getTorrentDetail(
@RequestParam("id") String seedid
) {
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index 6859aa6..2b4a3a3 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -8,6 +8,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.RequestBody;
@RestController
@RequestMapping("/api")
@@ -36,4 +37,29 @@
ResponseEntity<String> getTorrentDetail(
@RequestParam("id") String seedid
);
+
+ @GetMapping("user-profile")
+ ResponseEntity<String> getUserProfile(
+ @RequestParam("id") String userid
+ );
+
+ @PostMapping("/change-profile")
+ ResponseEntity<Integer> changeProfile(
+ @RequestBody String requestBody
+ );
+
+ @GetMapping("/user-seeds")
+ ResponseEntity<String> getUserSeeds(
+ @RequestParam("userid") String userid
+ );
+
+ @PostMapping("/delete-seed")
+ ResponseEntity<Integer> deleteSeed(
+ @RequestBody String requestBody
+ );
+
+ @GetMapping("/user-stat")
+ ResponseEntity<String> getUserStat(
+ @RequestParam("userid") String userid
+ );
}
\ No newline at end of file
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index e2fb1fb..1f4b510 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -22,9 +22,11 @@
public Seed GetSeedInformation(String seedid);//返回种子的全部信息;
public int RegisterSeed(Seed seedinfo);//添加一个新的种子,0成功,其他失败信息待定;
public int UpdateSeed(Seed seedinfo);//接收新的种子然后更新其全部属性;
+ public int DeleteSeed(String seedid);//删除一个种子,返回状态:0 success,1 不存在,2其他原因
public Seed[] SearchSeed(String userQ);//传入搜索的关键词或句子,返回搜索到的种子信息(按照公共字符数量排序)
public Seed[] GetSeedListByTag(String tag);//获取某个标签下的种子列表
+ public Seed[] GetSeedListByUser(String userid);//获取某个用户的种子列表
public int AddNotice(Notice notice);//返回状态:0 success,1 重复,2其他原因
public boolean UpdateNotice(Notice notice);//返回状态:0 success,1 重复,2其他原因
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index b89dc18..8c3bbb4 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -130,28 +130,36 @@
if (userinfo.userid == null) {
return 2; // userid为null直接返回错误
}
+
+ entitymanager.getTransaction().begin();
+
JPAQuery<User> query = new JPAQuery<>(entitymanager);
QUser u = QUser.user;
User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
if(updateUser == null){
+ entitymanager.getTransaction().rollback();
return 1;
}
// 只更新需要的字段,避免破坏持久化状态和关联关系
- updateUser.email = userinfo.email;
- updateUser.username = userinfo.username;
- updateUser.password = userinfo.password;
- updateUser.sex = userinfo.sex;
- updateUser.school = userinfo.school;
- updateUser.pictureurl = userinfo.pictureurl;
- updateUser.profile = userinfo.profile;
+ if (userinfo.email != null) updateUser.email = userinfo.email;
+ if (userinfo.username != null) updateUser.username = userinfo.username;
+ if (userinfo.password != null) updateUser.password = userinfo.password;
+ if (userinfo.sex != null) updateUser.sex = userinfo.sex;
+ if (userinfo.school != null) updateUser.school = userinfo.school;
+ if (userinfo.pictureurl != null) updateUser.pictureurl = userinfo.pictureurl;
+ if (userinfo.profile != null) updateUser.profile = userinfo.profile;
updateUser.accountstate = userinfo.accountstate;
updateUser.invitetimes = userinfo.invitetimes;
// 如有其他字段也一并赋值
entitymanager.merge(updateUser);
+ entitymanager.getTransaction().commit();
return 0;
} catch (Exception e) {
e.printStackTrace();
+ if (entitymanager.getTransaction().isActive()) {
+ entitymanager.getTransaction().rollback();
+ }
return 2;
}
@@ -227,6 +235,35 @@
return seeds.toArray(new Seed[0]);
}
+ @Override
+ public Seed[] GetSeedListByUser(String userid){
+ JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+ QSeed s = QSeed.seed;
+ List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
+ return seeds.toArray(new Seed[0]);
+ }
+
+ @Override
+ public int DeleteSeed(String seedid){
+ try {
+ entitymanager.getTransaction().begin();
+ Seed seed = entitymanager.find(Seed.class, seedid);
+ if (seed == null) {
+ entitymanager.getTransaction().rollback();
+ return 1; // 种子不存在
+ }
+ entitymanager.remove(seed);
+ entitymanager.getTransaction().commit();
+ return 0; // 成功删除
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (entitymanager.getTransaction().isActive()) {
+ entitymanager.getTransaction().rollback();
+ }
+ return 2; // 其他错误
+ }
+ }
+
//添加一个新的种子,0成功,其他失败信息待定;
@Override
public int RegisterSeed(Seed seedinfo){
@@ -240,7 +277,7 @@
entitymanager.getTransaction().rollback();
return 2; // 用户不存在
}
- seed.user = user; // 设置种子的用户关联
+ seedinfo.user = user; // 设置种子的用户关联
if (seed != null) {
entitymanager.getTransaction().rollback();
return 1;
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index d2d98c7..0e6dadf 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -138,6 +138,16 @@
}
@Override
+ public Seed[] GetSeedListByUser(String userid) {
+ return new Seed[0];
+ }
+
+ @Override
+ public int DeleteSeed(String seedid) {
+ return 0;
+ }
+
+ @Override
public boolean AddCollect(String userid, String postid) {
return false;
}
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
index f73c868..b53e2e2 100644
--- a/src/main/java/entity/User.java
+++ b/src/main/java/entity/User.java
@@ -13,6 +13,7 @@
import javax.persistence.TemporalType;
import javax.persistence.Transient;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.querydsl.core.annotations.QueryEntity;
@QueryEntity
@@ -29,6 +30,7 @@
@Column(name = "password", length = 255, nullable = false)
public String password;
@Column(name = "gender", nullable = false)
+ @JsonProperty("gender")
public String sex;
@Column(name = "detectedCount", nullable = false)
@@ -50,12 +52,15 @@
@Column(name = "school")
public String school;
@Column(name = "avatar_url")
+ @JsonProperty("avatar_url")
public String pictureurl;
@Column(name = "bio")
public String profile;
@Column(name = "account_status", nullable = false)
+ @JsonProperty("account_status")
public boolean accountstate;
@Column(name = "invite_left", nullable = false)
+ @JsonProperty("invite_left")
public int invitetimes;
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
public UserPT userPT;
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index b4b7ea4..7ef6ab7 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -6,6 +6,7 @@
public static final int BegVote=3;
public static final int CheatTime=5;
// 请根据实际环境修改为可达的地址
+ // public static final String SqlURL = "192.168.5.9:3306";
public static final String SqlURL = "10.126.59.25:3306";
public static final String Database = "pt_database_test";
public static final String TestDatabase = "pt_database_test";
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..bafddce
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=8081
\ No newline at end of file