tracker
Change-Id: I8f8ac81f9c4d7c7650cd64d2dade701dc6c11dce
diff --git a/src/main/java/com/ptp/ptplatform/config/WebConfig.java b/src/main/java/com/ptp/ptplatform/config/WebConfig.java
index d0fdb8e..bb81631 100644
--- a/src/main/java/com/ptp/ptplatform/config/WebConfig.java
+++ b/src/main/java/com/ptp/ptplatform/config/WebConfig.java
@@ -18,4 +18,4 @@
.allowCredentials(true); // 是否允许携带凭证
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java b/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
index cf482c6..4a4e625 100644
--- a/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
@@ -1,4 +1,58 @@
package com.ptp.ptplatform.controller;
+
+import com.ptp.ptplatform.entity.INVITE_CODE;
+import com.ptp.ptplatform.entity.USER;
+import com.ptp.ptplatform.mapper.InviteCodeMapper;
+import com.ptp.ptplatform.mapper.UserMapper;
+import com.ptp.ptplatform.utils.JwtUtils;
+import com.ptp.ptplatform.utils.Result;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/invitecode")
public class InviteCodeController {
+ //mapper和controller
+ @Resource
+ private InviteCodeMapper inviteCodeMapper;
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private UserController userController;
+
+ //使用魔力值兑换邀请码
+ @PostMapping("/generate")
+ public Result generateInviteCode(HttpServletRequest request) {
+ USER user = userController.getUserInRequest(request);
+ System.out.println(user.getMagicPoints());
+ if (user.getMagicPoints() >= 10) {
+ user.generateInviteCode();
+ INVITE_CODE inviteCode = new INVITE_CODE(user.getUsername());
+
+ inviteCodeMapper.insertInviteCode(inviteCode);
+ userMapper.updateUser(user);
+
+ return Result.ok().data("inviteCode", inviteCode);
+
+ } else {
+ return Result.error(404).setMessage("兑换邀请码失败,魔力值不足。");
+ }
+
+ }
+
+ //用户获取持有的邀请码
+ @GetMapping("/userInviteCode")
+ public Result userInviteCode(HttpServletRequest request) {
+ USER user = userController.getUserInRequest(request);
+
+ List<INVITE_CODE> inviteCode = inviteCodeMapper.selectByUser(user.getUsername());
+ return Result.ok().data("inviteCode", inviteCode);
+ }
+
}
diff --git a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
index 3c71ba1..436ecdd 100644
--- a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
@@ -1,121 +1,359 @@
-package com.ptp.ptplatform.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.ptp.ptplatform.entity.TorrentComment;
-import com.ptp.ptplatform.entity.Torrent;
-import com.ptp.ptplatform.service.TorrentCommentService;
-import com.ptp.ptplatform.service.TorrentService;
-import com.ptp.ptplatform.utils.Result;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@RestController
-@RequestMapping("/torrent")
-@AllArgsConstructor
-public class TorrentController {
- private final TorrentService postService;
- private final TorrentCommentService commentService;
-
- // 创建帖子
- @PostMapping
- public Result createTorrent(@RequestBody Torrent torrent) {
- postService.save(torrent);
- return Result.ok().data("post", torrent);
- }
-
- // 列表分页
- @GetMapping
- public Result listPosts(@RequestParam(defaultValue = "1") int page,
- @RequestParam(defaultValue = "5") int size) {
- IPage<Torrent> ipage = postService.page(
- new Page<>(page, size),
- new QueryWrapper<Torrent>().orderByDesc("create_time")
- );
- return Result.ok()
- .data("records", ipage.getRecords())
- .data("total", ipage.getTotal());
- }
-
- @GetMapping("/{Id}")
- public Result getPost(@PathVariable int Id) {
- Torrent torrent = postService.getById(Id);
- if (torrent == null) {
- return Result.error(404).setMessage("种子不存在"); // 明确设置404状态码
- }
-
- // 获取所有评论(按创建时间排序)
- List<TorrentComment> allComments = commentService.list(
- new QueryWrapper<TorrentComment>()
- .eq("post_id", Id)
- .orderByAsc("create_time")
- );
-
- // 构建评论树形结构
- List<TorrentComment> rootComments = new ArrayList<>();
- Map<Integer, TorrentComment> commentMap = new HashMap<>();
-
- // 第一遍:初始化所有评论到map中
- for (TorrentComment comment : allComments) {
- comment.setReplies(new ArrayList<>()); // 初始化replies列表
- commentMap.put(comment.getId(), comment);
- }
-
- // 第二遍:构建父子关系
- for (TorrentComment comment : allComments) {
- if (comment.getParentId() == 0) {
- rootComments.add(comment);
- } else {
- TorrentComment parent = commentMap.get(comment.getParentId());
- if (parent != null) {
- parent.getReplies().add(comment);
- }
- }
- }
-
- return Result.ok()
- .data("torrent", torrent)
- .data("comments", rootComments);
- }
-
- // 点赞帖子
- @PostMapping("/{Id}/like")
- public Result likePost(@PathVariable int Id) {
- postService.incrementLike(Id);
- return Result.ok();
- }
-
- @PostMapping("/{Id}/comments")
- public Result comment(@PathVariable int Id,
- @RequestBody TorrentComment comment) {
- // 设置评论信息
- comment.setPostId(Id);
- comment.setCreateTime(LocalDateTime.now());
- comment.setLikeCount(0); // 初始化点赞数
- comment.setParentId(0); // 默认父评论ID
- comment.setReplyTo(null); // 主评论 replyTo=null
-
- // 保存评论
- boolean saved = commentService.save(comment);
- if (!saved) {
- return Result.error(404).setMessage("评论保存失败");
- }
-
- // 更新回复数
- postService.incrementReplyCount(Id);
-
- // 获取更新后的完整评论(包含数据库生成的ID和时间)
- TorrentComment newComment = commentService.getById(comment.getId());
-
- return Result.ok()
- .data("comment", newComment) // 返回完整评论数据
- .data("newReplyCount", postService.getById(Id).getReplyCount());
- }
+package com.ptp.ptplatform.controller;
+
+import com.ptp.ptplatform.entity.TORRENT;
+import com.ptp.ptplatform.entity.USER;
+import com.ptp.ptplatform.mapper.TorrentMapper;
+import com.ptp.ptplatform.mapper.UserMapper;
+import com.ptp.ptplatform.service.ClientService;
+import com.ptp.ptplatform.service.TrackerService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ptp.ptplatform.entity.TorrentComment;
+import com.ptp.ptplatform.service.TorrentCommentService;
+import com.ptp.ptplatform.service.TorrentService;
+import com.ptp.ptplatform.utils.Result;
+import com.turn.ttorrent.common.TorrentStatistic;
+import com.turn.ttorrent.tracker.TrackedPeer;
+import com.turn.ttorrent.tracker.TrackedTorrent;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+import java.util.Map;
+
+import static com.ptp.ptplatform.utils.JwtUtils.getClaimByToken;
+
+//实现种子的增删改查
+@RestController
+@RequestMapping("/torrent")
+@AllArgsConstructor
+public class TorrentController {
+ private final TorrentService postService;
+ private final TorrentCommentService commentService;
+
+ @Resource
+ private TorrentMapper torrentMapper;
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private UserController userController;
+
+ private TrackerService ts = new TrackerService();
+ private ClientService cs = new ClientService();
+
+ @GetMapping("/{Id}")
+ public Result getPost(@PathVariable int Id) {
+ TORRENT torrent = postService.getById(Id);
+ if (torrent == null) {
+ return Result.error(404).setMessage("种子不存在"); // 明确设置404状态码
+ }
+
+ // 获取所有评论(按创建时间排序)
+ List<TorrentComment> allComments = commentService.list(
+ new QueryWrapper<TorrentComment>()
+ .eq("post_id", Id)
+ .orderByAsc("create_time")
+ );
+
+ // 构建评论树形结构
+ List<TorrentComment> rootComments = new ArrayList<>();
+ Map<Integer, TorrentComment> commentMap = new HashMap<>();
+
+ // 第一遍:初始化所有评论到map中
+ for (TorrentComment comment : allComments) {
+ comment.setReplies(new ArrayList<>()); // 初始化replies列表
+ commentMap.put(comment.getId(), comment);
+ }
+
+ // 第二遍:构建父子关系
+ for (TorrentComment comment : allComments) {
+ if (comment.getParentId() == 0) {
+ rootComments.add(comment);
+ } else {
+ TorrentComment parent = commentMap.get(comment.getParentId());
+ if (parent != null) {
+ parent.getReplies().add(comment);
+ }
+ }
+ }
+
+ return Result.ok()
+ .data("torrent", torrent)
+ .data("comments", rootComments);
+ }
+
+ // 点赞帖子
+ @PostMapping("/{Id}/like")
+ public Result likePost(@PathVariable int Id) {
+ postService.incrementLike(Id);
+ return Result.ok();
+ }
+
+ @PostMapping("/{Id}/comments")
+ public Result comment(@PathVariable int Id,
+ @RequestBody TorrentComment comment) {
+ // 设置评论信息
+ comment.setPostId(Id);
+ comment.setCreateTime(LocalDateTime.now());
+ comment.setLikeCount(0); // 初始化点赞数
+ comment.setParentId(0); // 默认父评论ID
+ comment.setReplyTo(null); // 主评论 replyTo=null
+
+ // 保存评论
+ boolean saved = commentService.save(comment);
+ if (!saved) {
+ return Result.error(404).setMessage("评论保存失败");
+ }
+
+ // 更新回复数
+ postService.incrementReplyCount(Id);
+
+ // 获取更新后的完整评论(包含数据库生成的ID和时间)
+ TorrentComment newComment = commentService.getById(comment.getId());
+
+ return Result.ok()
+ .data("comment", newComment) // 返回完整评论数据
+ .data("newReplyCount", postService.getById(Id).getReplay_count());
+ }
+
+ @PostConstruct //启动项目时候自动启动tracker服务器
+ public String startTS() {
+ try {
+ ts.startTracker();
+ System.out.println("成功启动tracker服务器");
+ return "成功启动tracker服务器";
+ } catch (Exception e) {
+ System.out.println("启动失败: " + e.getMessage());
+ return "启动失败: " + e.getMessage();
+ }
+ }
+
+ //上传、下载、删除操作
+ //post 要添加数据库 文件和tracker的信息
+ @PostMapping
+ public Result addTorrent(HttpServletRequest request, @RequestBody TORRENT torrent) throws IOException {
+
+ // 1. 检查源文件
+ File file = new File(torrent.getFilePath());
+ if (!file.exists() || !file.isFile()) {
+ return Result.error(404).data("message", "文件不存在或路径无效");
+ }
+ if (!file.getName().endsWith(".torrent")) {
+ return Result.error(404).data("message", "仅支持.torrent文件");
+ }
+
+ // 2. 确定存储目录(改为项目根目录下的torrents文件夹)
+ String projectRoot = System.getProperty("user.dir");
+ String uploadDir = projectRoot + File.separator + "torrents";
+ File torrentsFolder = new File(uploadDir);
+ if (!torrentsFolder.exists() && !torrentsFolder.mkdirs()) {
+ return Result.error(404).data("message", "无法创建存储目录");
+ }
+
+ // 3. 复制文件
+ File uploadedFile = new File(torrentsFolder, file.getName());
+ try {
+ Files.copy(file.toPath(), uploadedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ System.out.println("文件保存成功: " + uploadedFile.getAbsolutePath());
+ } catch (IOException e) {
+ System.out.println("文件复制失败" + e);
+ return Result.error(404).data("message", "文件保存失败: " + e.getMessage());
+ }
+
+ // 4. 处理Tracker逻辑
+ try {
+ TrackedTorrent tt = ts.addTrackedTorrent(uploadedFile.getAbsolutePath());
+ TrackedPeer tp = createTrackedPeer(tt);
+ tt.addPeer(tp);
+
+ // 5. 数据库操作
+ torrent.setHash(tt.getHexInfoHash());
+ torrent.setSize(uploadedFile.length());
+ torrent.setUsername(getClaimByToken(request.getHeader("Authorization")).getSubject());
+ torrent.setFilePath(uploadedFile.getAbsolutePath());
+
+ if (torrentMapper.insertTorrent(torrent) == 1) {
+ return Result.ok().data("message", "上传成功")
+ .data("path", uploadedFile.getAbsolutePath());
+ }
+ } catch (Exception e) {
+ System.out.println("Tracker或数据库操作失败" + e);
+ uploadedFile.delete(); // 回滚:删除已保存的文件
+ }
+
+ return Result.error(404).data("message", "上传失败");
+ }
+
+ //根据本机创建peer对象
+ public static TrackedPeer createTrackedPeer(TrackedTorrent torrent) {
+ try {
+ // 获取本机IP地址
+ InetAddress inetAddress = InetAddress.getLocalHost();
+ String ip = inetAddress.getHostAddress(); // 本机IP地址
+
+ // 假设使用一个随机的端口,这个端口可以根据需求调整
+ int port = 6881; // 这里使用固定端口,也可以通过动态方式分配
+
+ // 创建Peer ID (可以随机生成或从其他地方获取)
+ // 这里使用UUID来生成一个随机的 Peer ID
+ String peerIdString = UUID.randomUUID().toString();
+ ByteBuffer peerId = ByteBuffer.wrap(peerIdString.getBytes());
+
+ // 创建TrackedPeer实例
+ TrackedPeer trackedPeer = new TrackedPeer(torrent, ip, port, peerId);
+
+ return trackedPeer;
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ //种子下载 根据id获取数据
+ // 能成功获取到数据
+ // 能够根据此值,完成对相关数据的修改
+ // getDownloadedBytes:3063963
+ //getUploadedBytes:0
+ @GetMapping("/downloadTorrent")
+ public Result getTorrent(HttpServletRequest request,int id ,String downloadPath) throws Exception {
+ TORRENT torrent = torrentMapper.selectByID(id);
+
+ // 下载完成
+ // 传入变量:下载种子的id 下载到文件的路径
+ cs.downloadTorrent(torrent.getFilePath(), downloadPath);
+
+ //管理种子相关数据
+ TorrentStatistic ts = cs.getStatistics(torrent.getFilePath());
+
+ //修改用户对应的信息
+ USER downloadUser = userController.getUserInRequest(request);
+ USER uploadUser = userMapper.selectByUsername(torrent.getUsername());
+
+ downloadUser.updateDownload(ts.getDownloadedBytes());
+ uploadUser.updateUpload(ts.getDownloadedBytes());
+
+ userMapper.updateUser(downloadUser);
+ userMapper.updateUser(uploadUser);
+
+
+ return Result.ok().data("torrent", torrent);
+ }
+
+ //根据id删除
+ @DeleteMapping("/deleteTorrent/{id}")
+ public Result deleteTorrent(HttpServletRequest request,@PathVariable("id")int id) throws Exception {
+ TORRENT torrent = torrentMapper.selectByID(id);
+
+ String filePath = torrent.getFilePath();
+ try {
+ // 检查文件是否存在
+ if (Files.exists(Paths.get(filePath))) {
+ Files.delete(Paths.get(filePath)); // 删除文件
+ torrentMapper.deleteTorrent(id);
+
+ return Result.ok().message("种子文件删除成功");
+ } else {
+ throw new IOException("File not found: " + filePath);
+ }
+ } catch (IOException e) {
+ // 异常处理
+ e.printStackTrace();
+ // 返回失败结果或其他处理逻辑
+ return Result.error(404).setMessage("种子文件删除失败");
+ }
+ }
+
+ // Controller
+ @GetMapping
+ public Result listPosts(@RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "5") int size) {
+ int offset = (page - 1) * size;
+ List<TORRENT> pagedList = torrentMapper.selectAllTorrentWithPage(offset, size);
+ int total = torrentMapper.countAllTorrent();
+
+ Page<TORRENT> pageResult = new Page<>(page, size);
+ pageResult.setRecords(pagedList);
+ pageResult.setTotal(total);
+
+ return Result.ok()
+ .data("records", pageResult.getRecords())
+ .data("total", pageResult.getTotal());
+ }
+
+ // 获取特定分区下的种子(分页版)
+ @GetMapping("/get/torrentByCategory/{category}")
+ public Result getTorrentByCategory(
+ @PathVariable("category") String category,
+ @RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "5") int size) {
+
+ int offset = (page - 1) * size;
+ List<TORRENT> pagedList = torrentMapper.selectTorrentByCategoryWithPage(category, offset, size);
+ int total = torrentMapper.countByCategory(category);
+
+ Page<TORRENT> pageResult = new Page<>(page, size);
+ pageResult.setRecords(pagedList);
+ pageResult.setTotal(total);
+
+ return Result.ok()
+ .data("records", pageResult.getRecords())
+ .data("total", pageResult.getTotal());
+ }
+
+ // 搜索种子关键字(分页版)
+ @GetMapping("/get/torrentByKey/{key}")
+ public Result getTorrentByKey(
+ @PathVariable("key") String key,
+ @RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "5") int size) {
+
+ int offset = (page - 1) * size;
+ List<TORRENT> pagedList = torrentMapper.selectTorrentByKeyWithPage(key, offset, size);
+ int total = torrentMapper.countByKey(key);
+
+ Page<TORRENT> pageResult = new Page<>(page, size);
+ pageResult.setRecords(pagedList);
+ pageResult.setTotal(total);
+
+ return Result.ok()
+ .data("records", pageResult.getRecords())
+ .data("total", pageResult.getTotal());
+ }
+
+ // 获取对应用户种子(分页版)
+ @GetMapping("/get/torrentMyself")
+ public Result getTorrentByKey(
+ HttpServletRequest request,
+ @RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "5") int size) throws Exception {
+
+ USER user = userController.getUserInRequest(request);
+ int offset = (page - 1) * size;
+ List<TORRENT> pagedList = torrentMapper.selectTorrentByUsernameWithPage(user.getUsername(), offset, size);
+ int total = torrentMapper.countByUsername(user.getUsername());
+
+ Page<TORRENT> pageResult = new Page<>(page, size);
+ pageResult.setRecords(pagedList);
+ pageResult.setTotal(total);
+
+ return Result.ok()
+ .data("records", pageResult.getRecords())
+ .data("total", pageResult.getTotal());
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/controller/UserController.java b/src/main/java/com/ptp/ptplatform/controller/UserController.java
index 9265ce7..4587abc 100644
--- a/src/main/java/com/ptp/ptplatform/controller/UserController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/UserController.java
@@ -6,47 +6,58 @@
import com.ptp.ptplatform.entity.*;
import com.ptp.ptplatform.mapper.UserMapper;
import com.ptp.ptplatform.mapper.InviteCodeMapper;
+import com.ptp.ptplatform.utils.SizeCalculation;
import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ptp.ptplatform.utils.Result;
import com.ptp.ptplatform.utils.JwtUtils;
import com.ptp.ptplatform.entity.USER;
+
import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
@RestController
@RequestMapping("/user")
@CrossOrigin //启用跨域
public class UserController {
- @Resource
+ @Autowired
private UserMapper userMapper;
- @Resource
+ @Autowired
private InviteCodeMapper inviteCodeMapper;
+
+ //个人中心获取用户登录信息
@GetMapping("/info") //获取
- public Result info(String token) {
- String username = JwtUtils.getClaimByToken(token).getSubject();
- return Result.ok().data("name", username);
+ public Result info(HttpServletRequest request) {
+ USER user = this.getUserInRequest(request);
+ return Result.ok().data("info", user);
}
@PostMapping("/login") //用户登录
public Result login(String username, String password) {
USER user = userMapper.selectByUsername(username);
- if (user != null) {
- // 将用户输入的密码进行哈希处理
- String hashedPassword = user.hashPassword(password);
-
- // 比较用户输入的密码哈希值和数据库中的密码哈希值
- if (hashedPassword.equals(user.getPassword())) {
- String token = JwtUtils.generateToken(user.getUsername());
- return Result.ok().data("token", token); // 返回令牌给前端
- } else {
- return Result.error(404).setMessage("密码错误");
- }
- } else {
+ // 检查用户是否存在
+ if (user == null) {
return Result.error(404).setMessage("用户不存在");
}
+
+ System.out.println("password" + user.getPassword());
+
+ // 比较用户输入密码值是否正确
+ if (user.getPassword().equals(password)) {
+ String token = JwtUtils.generateToken(user.getUsername());
+
+ user.setLastLogin(new Date());
+ userMapper.updateUser(user);
+ return Result.ok().data("token", token); // 返回令牌给前端
+ } else {
+ return Result.error(404).setMessage("密码错误");
+ }
}
@PostMapping("/regist")
@@ -55,12 +66,12 @@
if (userCheck == null) {
//获取邀请码
INVITE_CODE inviteCode = inviteCodeMapper.selectByCode(code);
- if(inviteCode != null){
+ if (inviteCode != null) {
System.out.println(inviteCode.getIsUsed());
- if(!inviteCode.getIsUsed()){
+ if (!inviteCode.getIsUsed()) {
Date time = new Date();
- USER user = new USER(username, password, time) ;
+ USER user = new USER(username, password, time);
userMapper.insertUser(user);
inviteCodeMapper.updateCodeUser(code);
@@ -81,9 +92,46 @@
}
- @PostMapping("/logout")
- public Result logout(String token) {
- return Result.ok();
+ //获取允许下载额度的相关信息
+ @GetMapping("/allowDownload")
+ public Result allowDownload(HttpServletRequest request) {
+ USER user = this.getUserInRequest(request);
+ // 总额度 已经使用 剩余 单位是GB
+ int totalSize = SizeCalculation.byteToGB(user.getUpload());
+ int usedSize = SizeCalculation.byteToGB(user.getDownload());
+ int leftSize = totalSize - usedSize;
+
+ // 将变量封装成Map
+ Map<String, Object> dataMap = new HashMap<>();
+ dataMap.put("totalSize", totalSize);
+ dataMap.put("usedSize", usedSize);
+ dataMap.put("leftSize", leftSize);
+
+ return Result.ok().data(dataMap);
+ }
+
+ //修改用户密码
+ @PutMapping("/password")
+ public Result updatePassword(HttpServletRequest request, @RequestBody Map<String, String> passwordMap) {
+ USER user = this.getUserInRequest(request);
+
+ String oldPassword = passwordMap.get("oldPassword");
+ String newPassword = passwordMap.get("newPassword");
+
+ if (user.getPassword().equals(oldPassword)) {
+ user.setPassword(newPassword);
+ userMapper.updateUser(user);
+
+ return Result.ok().setMessage("修改密码成功");
+ }
+ return Result.error(404).setMessage("原密码不正确");
+ }
+
+
+ //从http请求中获取到用户
+ public USER getUserInRequest(HttpServletRequest request) {
+ String UserName = JwtUtils.getClaimByToken(request.getHeader("Authorization")).getSubject();
+ return userMapper.selectByUsername(UserName);
}
}
diff --git a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java
new file mode 100644
index 0000000..3743f4e
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_RECORD.java
@@ -0,0 +1,23 @@
+package com.ptp.ptplatform.entity;
+
+import java.time.LocalDateTime;
+
+public class DOWNLOAD_RECORD {
+
+ private int id; // 下载记录ID
+ private int userId; // 下载用户ID
+ private int torrentId; // 请求的种子资源ID
+ private String status; // 下载状态(成功、失败、终止)
+ private LocalDateTime downloadTime; // 下载时间
+ private String downloadPath; // 下载路径
+
+ // 构造方法、getter和setter省略
+
+ public DOWNLOAD_RECORD(int userId, int torrentId, String status, LocalDateTime downloadTime, String downloadPath) {
+ this.userId = userId;
+ this.torrentId = torrentId;
+ this.status = status;
+ this.downloadTime = downloadTime;
+ this.downloadPath = downloadPath;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/INVITE_CODE.java b/src/main/java/com/ptp/ptplatform/entity/INVITE_CODE.java
index d0a5a53..a35dd89 100644
--- a/src/main/java/com/ptp/ptplatform/entity/INVITE_CODE.java
+++ b/src/main/java/com/ptp/ptplatform/entity/INVITE_CODE.java
@@ -4,6 +4,7 @@
import jakarta.persistence.*;
import java.io.Serializable;
+import java.util.UUID;
@Table(name = "invite_code")
public class INVITE_CODE {
@@ -43,8 +44,10 @@
// Constructor (optional)
public INVITE_CODE() {}
- public INVITE_CODE(String code, String generateUser) {
- this.code = code;
+ //code是10位随机生成密码
+ public INVITE_CODE(String generateUser) {
+ String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+ this.code = uuid.substring(0, 8);
this.generateUser = generateUser;
this.isUsed = false;
}
diff --git a/src/main/java/com/ptp/ptplatform/entity/TORRENT.java b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
new file mode 100644
index 0000000..afbb264
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
@@ -0,0 +1,62 @@
+package com.ptp.ptplatform.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 jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import lombok.Data;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+@TableName("torrent") // 使用MyBatis-Plus的注解指定表名
+public class TORRENT {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private String torrentName; // 文件名
+ private String description; // 描述
+ private String category; // 分类
+ private String region; // 地区
+ private String resolution; // 分辨率
+ private String subtitle; // 字幕状态
+
+ private Long size; // 种子对应文件大小
+ private String hash; // torrent编码
+ private String username; // 创建用户
+ private String filePath;
+ private int like_count;
+ private int replay_count;
+
+ @TableField(value = "create_time") // 使用@TableField注解处理时间字段
+ private Date createTime; // 创建时间
+
+ // 构造函数
+ public TORRENT(String hash, String torrentName, String description, String category, String region, String resolution, String subtitle, Long size, String username, String filePath) {
+ this.hash = hash;
+ this.torrentName = torrentName;
+ this.description = description;
+ this.category = category;
+ this.region = region;
+ this.resolution = resolution;
+ this.subtitle = subtitle;
+ this.size = size;
+ this.username = username;
+ this.filePath = filePath;
+ this.like_count = 0;
+ this.replay_count = 0;
+ }
+
+ public void setLikeCount(int like_count) {
+ this.like_count = like_count;
+ }
+
+ public int getLikeCount() {
+ return this.like_count;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/Torrent.java b/src/main/java/com/ptp/ptplatform/entity/Torrent.java
deleted file mode 100644
index 2c6c6d3..0000000
--- a/src/main/java/com/ptp/ptplatform/entity/Torrent.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.ptp.ptplatform.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;
-import java.time.LocalDateTime;
-
-@Data
-@TableName("torrent")
-public class Torrent {
- @TableId(value = "id", type = IdType.AUTO)
- private Integer id;
-
- @TableField("torrentName") // 明确指定数据库列名
- private String torrentName;
-
- private String description;
- private String category;
- private String region;
- private String resolution;
- private String subtitle;
- private Long size;
- private String hash;
-
- private LocalDateTime createTime;
-
- private String username;
-
- @TableField("filePath") // 明确指定数据库列名
- private String filePath;
-
- private Integer likeCount;
- private Integer replyCount;
-
-
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/USER.java b/src/main/java/com/ptp/ptplatform/entity/USER.java
index a33847c..ac51eb4 100644
--- a/src/main/java/com/ptp/ptplatform/entity/USER.java
+++ b/src/main/java/com/ptp/ptplatform/entity/USER.java
@@ -27,10 +27,10 @@
@Temporal(TemporalType.DATE)
private Date lastLogin;
- private int upload;
- private int download;
- private int shareRate;
- private int magicPoints;
+ private long upload;
+ private long download;
+ private double shareRate;//分享率 前端展示数据应该为 90.23%这种
+ private long magicPoints;// 魔力值
public enum Authority {
USER, ADMIN, LIMIT, BAN
@@ -86,23 +86,23 @@
this.lastLogin = lastLogin;
}
- public int getUpload() {
+ public long getUpload() {
return upload;
}
- public void setUpload(int upload) {
+ public void setUpload(long upload) {
this.upload = upload;
}
- public int getDownload() {
+ public long getDownload() {
return download;
}
- public void setDownload(int download) {
+ public void setDownload(long download) {
this.download = download;
}
- public int getShareRate() {
+ public double getShareRate() {
return shareRate;
}
@@ -110,8 +110,8 @@
this.shareRate = shareRate;
}
- public int getMagicPoints() {
- return magicPoints;
+ public long getMagicPoints() {
+ return this.magicPoints;
}
public void setMagicPoints(int magicPoints) {
@@ -125,32 +125,41 @@
this.username = username;
this.registTime = registTime;
- this.password = hashPassword(password);;
+ this.password = password;
this.authority = Authority.USER;
this.level = 0;
this.lastLogin = null;
this.upload = 0;
this.download = 0;
- this.shareRate = 100;
+ this.shareRate = 1;
this.magicPoints = 0;
}
- public String hashPassword(String password) {
- try {
- // 使用SHA-256算法
- MessageDigest digest = MessageDigest.getInstance("SHA-256");
- byte[] hashBytes = digest.digest(password.getBytes());
-
- // 将字节数组转换为十六进制字符串
- StringBuilder hexString = new StringBuilder();
- for (byte b : hashBytes) {
- hexString.append(String.format("%02x", b));
- }
-
- return hexString.toString();
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("Error hashing password", e);
- }
+ //对上传量下载量的处理 返回更新后的数据结果
+ public long updateUpload(long addUpload) {
+ this.upload += addUpload;
+ this.shareRate = (double) this.upload / this.download;
+ return upload;
}
+
+ public long updateDownload(long addDownload) {
+ this.download += addDownload;
+ this.shareRate = (double) this.upload / this.download;
+ return download;
+ }
+
+ //生成邀请码,魔力值扣除
+ public void generateInviteCode() {
+ this.magicPoints -= 10;
+ }
+
+ // 每天运行的计算魔力值程序
+ // 添加种子,验证同一用户的全部种子存活与否
+ public long updateMagicPoints(long addMagicPoints) {
+
+ return 0;
+ }
+
+
}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/entity/testdata.java b/src/main/java/com/ptp/ptplatform/entity/testdata.java
deleted file mode 100644
index 7d6d88e..0000000
--- a/src/main/java/com/ptp/ptplatform/entity/testdata.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// model类 负责管理数据库数据和sb的映射
-
-package com.ptp.ptplatform.entity;
-
-public class testdata {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java b/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java
new file mode 100644
index 0000000..4cb8c90
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/DownloadRecordMapper.java
@@ -0,0 +1,10 @@
+package com.ptp.ptplatform.mapper;
+
+import com.ptp.ptplatform.entity.DOWNLOAD_RECORD;
+import org.apache.ibatis.annotations.Insert;
+
+public interface DownloadRecordMapper {
+ @Insert("INSERT INTO download_record (username, torrent_id, status, download_time, download_path) " +
+ "VALUES (#{username}, #{torrentId}, #{status}, #{downloadTime}, #{downloadPath})")
+ void insertDownloadRecord(DOWNLOAD_RECORD downloadRecord);
+}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/InviteCodeMapper.java b/src/main/java/com/ptp/ptplatform/mapper/InviteCodeMapper.java
index 612c7fb..b58e01b 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/InviteCodeMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/InviteCodeMapper.java
@@ -2,17 +2,27 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ptp.ptplatform.entity.INVITE_CODE;
+import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.web.service.annotation.PutExchange;
+import java.util.List;
+
@Mapper
public interface InviteCodeMapper extends BaseMapper<INVITE_CODE> {
//查询
@Select("SELECT * FROM invite_code WHERE code = #{code}")
INVITE_CODE selectByCode(String code);
+ @Select("SELECT * FROM invite_code WHERE generateUser = #{username}")
+ List<INVITE_CODE> selectByUser(String username);
+
@Update("UPDATE invite_code SET isused = true WHERE code = #{code}")
int updateCodeUser(String code);
+
+ // 插入新数据
+ @Insert("INSERT INTO invite_code (code, generateUser, isUsed) VALUES (#{code}, #{generateUser}, #{isUsed})")
+ int insertInviteCode(INVITE_CODE inviteCode);
}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
index ff612b3..b4ec407 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/TorrentMapper.java
@@ -1,8 +1,76 @@
package com.ptp.ptplatform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ptp.ptplatform.entity.Torrent;
-import org.apache.ibatis.annotations.Mapper;
+import com.ptp.ptplatform.entity.TORRENT;
+import org.apache.ibatis.annotations.*;
-@Mapper
-public interface TorrentMapper extends BaseMapper<Torrent> {}
\ No newline at end of file
+import java.util.List;
+
+public interface TorrentMapper extends BaseMapper<TORRENT> {
+ // 根据hash查询Torrent
+ @Select("SELECT * FROM torrent WHERE hash = #{hash}")
+ TORRENT selectByHash(String hash);
+
+ @Select("SELECT * FROM torrent WHERE id = #{id}")
+ TORRENT selectByID(int id);
+
+ // Mapper接口
+ @Select("SELECT * FROM torrent ORDER BY create_time DESC LIMIT #{offset}, #{size}")
+ List<TORRENT> selectAllTorrentWithPage(@Param("offset") int offset, @Param("size") int size);
+
+ @Select("SELECT COUNT(*) FROM torrent")
+ int countAllTorrent();
+
+ @Select("SELECT * FROM torrent WHERE category = #{category}")
+ List<TORRENT> selectTorrentByCategory(String category);
+
+ @Select("SELECT * FROM torrent WHERE torrentName LIKE CONCAT('%', #{key}, '%')")
+ List<TORRENT> selectTorrentByKey(String key);
+
+ @Select("SELECT * FROM torrent WHERE username = #{username}")
+ List<TORRENT> selectTorrentByUsername(String username);
+
+ //分页查询部分
+ // 在TorrentMapper.java中添加以下方法
+
+ // 分页查询特定分类
+ @Select("SELECT * FROM torrent WHERE category = #{category} ORDER BY create_time DESC LIMIT #{offset}, #{size}")
+ List<TORRENT> selectTorrentByCategoryWithPage(@Param("category") String category,
+ @Param("offset") int offset,
+ @Param("size") int size);
+
+ @Select("SELECT COUNT(*) FROM torrent WHERE category = #{category}")
+ int countByCategory(@Param("category") String category);
+
+ // 分页搜索关键字
+ @Select("SELECT * FROM torrent WHERE torrentName LIKE CONCAT('%',#{key},'%') OR description LIKE CONCAT('%',#{key},'%') ORDER BY create_time DESC LIMIT #{offset}, #{size}")
+ List<TORRENT> selectTorrentByKeyWithPage(@Param("key") String key,
+ @Param("offset") int offset,
+ @Param("size") int size);
+
+ @Select("SELECT COUNT(*) FROM torrent WHERE torrentName LIKE CONCAT('%',#{key},'%') OR description LIKE CONCAT('%',#{key},'%')")
+ int countByKey(@Param("key") String key);
+
+ // 分页查询用户种子
+ @Select("SELECT * FROM torrent WHERE username = #{username} ORDER BY create_time DESC LIMIT #{offset}, #{size}")
+ List<TORRENT> selectTorrentByUsernameWithPage(@Param("username") String username,
+ @Param("offset") int offset,
+ @Param("size") int size);
+
+ @Select("SELECT COUNT(*) FROM torrent WHERE username = #{username}")
+ int countByUsername(@Param("username") String username);
+
+ // 插入Torrent
+ @Insert("INSERT INTO torrent (torrentName, description, category, region, resolution, subtitle, size, hash, username, create_time, filePath) " +
+ "VALUES (#{torrentName}, #{description}, #{category}, #{region}, #{resolution}, #{subtitle}, #{size}, #{hash}, #{username}, CURRENT_TIMESTAMP, #{filePath})")
+ int insertTorrent(TORRENT torrent);
+
+ // 更新Torrent信息
+ @Update("UPDATE torrent SET torrentName = #{torrentName}, description = #{description}, category = #{category}, " +
+ "tags = #{tags}, size = #{size}, username = #{username} WHERE hash = #{hash}")
+ int updateTorrent(TORRENT torrent);
+
+ // 删除Torrent
+ @Delete("DELETE FROM torrent WHERE id = #{id}")
+ int deleteTorrent(int id);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
index 024807e..f17d0dd 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
@@ -6,6 +6,7 @@
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
@Mapper
public interface UserMapper extends BaseMapper<USER> {
@@ -20,4 +21,17 @@
@Insert("INSERT INTO user (username, password, registTime) " +
"VALUES (#{username}, #{password}, #{registTime})")
int insertUser(USER user);
+
+ // 更新用户信息
+ @Update("UPDATE user SET " +
+ "password = #{password}, " +
+ "authority = #{authority}, " +
+ "level = #{level}, " +
+ "lastLogin = #{lastLogin}, " +
+ "upload = #{upload}, " +
+ "download = #{download}, " +
+ "shareRate = #{shareRate}, " +
+ "magicPoints = #{magicPoints} " +
+ "WHERE username = #{username}")
+ int updateUser(USER user);
}
diff --git a/src/main/java/com/ptp/ptplatform/service/ClientService.java b/src/main/java/com/ptp/ptplatform/service/ClientService.java
new file mode 100644
index 0000000..39cdc76
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/ClientService.java
@@ -0,0 +1,34 @@
+package com.ptp.ptplatform.service;
+
+import com.turn.ttorrent.client.SimpleClient;
+import com.turn.ttorrent.common.TorrentStatistic;
+import org.springframework.stereotype.Service;
+
+import java.net.InetAddress;
+
+@Service
+public class ClientService {
+ SimpleClient client = new SimpleClient();
+
+ public boolean downloadTorrent(String torrentFilePath, String outputDirectory) throws Exception {
+
+
+ InetAddress address = InetAddress.getLocalHost(); // 使用本地地址
+
+ try {
+ // 开始下载torrent
+ client.downloadTorrent(torrentFilePath, outputDirectory, address);
+ System.out.println("下载完成");
+ return true;
+ } catch (Exception e) {
+ // 下载失败,输出异常信息
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public TorrentStatistic getStatistics(String torrentFilePath) throws Exception {
+ TorrentStatistic ts = client.getStatistics(torrentFilePath);
+ return ts;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/TorrentService.java b/src/main/java/com/ptp/ptplatform/service/TorrentService.java
index f3d0222..1891067 100644
--- a/src/main/java/com/ptp/ptplatform/service/TorrentService.java
+++ b/src/main/java/com/ptp/ptplatform/service/TorrentService.java
@@ -1,10 +1,10 @@
package com.ptp.ptplatform.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.ptp.ptplatform.entity.Torrent;
+import com.ptp.ptplatform.entity.TORRENT;
-public interface TorrentService extends IService<Torrent> {
- Torrent getTorrentById(Integer id); // Add this method
+public interface TorrentService extends IService<TORRENT> {
+ TORRENT getTorrentById(Integer id); // Add this method
void incrementLike(int postId);
void incrementReplyCount(int postId);
diff --git a/src/main/java/com/ptp/ptplatform/service/TrackerService.java b/src/main/java/com/ptp/ptplatform/service/TrackerService.java
new file mode 100644
index 0000000..29bc95f
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/TrackerService.java
@@ -0,0 +1,74 @@
+package com.ptp.ptplatform.service;
+
+import com.turn.ttorrent.tracker.TrackedTorrent;
+import com.turn.ttorrent.tracker.Tracker;
+import jakarta.annotation.PostConstruct;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+//封装的对tracker的操作
+@Service
+public class TrackerService {
+
+ private Tracker tracker;
+
+ public void startTracker() throws Exception {
+ // 创建一个Tracker对象,监听端口6969
+ tracker = new Tracker(6969);
+
+ // 过滤目录下的.torrent文件
+ FilenameFilter filter = new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".torrent");
+ }
+ };
+
+ // 获取当前项目根目录的路径并拼接torrents文件夹路径
+ String torrentDirectory = System.getProperty("user.dir") + File.separator + "torrents";
+ System.out.println("文件路径: " + torrentDirectory);
+
+ // 遍历目录中的所有torrent文件,传递给tracker
+ for (File file : new File(torrentDirectory).listFiles(filter)) {
+
+ TrackedTorrent tt = tracker.announce(TrackedTorrent.load(file));
+ System.out.println("种子文件: " + tt);
+ }
+
+ // 设置允许接收外部torrent
+ tracker.setAcceptForeignTorrents(true);
+
+ // 启动tracker服务
+ tracker.start(true);
+
+ }
+
+ public void stopTracker() {
+ if (tracker != null) {
+ tracker.stop();
+ }
+ }
+
+ public Collection<TrackedTorrent> getTrackedTorrents() {
+ return tracker.getTrackedTorrents();
+ }
+
+ public TrackedTorrent getTrackedTorrent(String hash) {
+ return tracker.getTrackedTorrent(hash);
+ }
+
+ public TrackedTorrent addTrackedTorrent(String filePath) throws IOException {
+ File file = new File(filePath);
+ return tracker.announce(TrackedTorrent.load(file));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java b/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
index a6eba54..3281d83 100644
--- a/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
+++ b/src/main/java/com/ptp/ptplatform/service/impl/TorrentServiceImpl.java
@@ -1,24 +1,24 @@
package com.ptp.ptplatform.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ptp.ptplatform.entity.Torrent;
+import com.ptp.ptplatform.entity.TORRENT;
import com.ptp.ptplatform.mapper.TorrentMapper;
import com.ptp.ptplatform.service.TorrentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
-public class TorrentServiceImpl extends ServiceImpl<TorrentMapper, Torrent> implements TorrentService {
+public class TorrentServiceImpl extends ServiceImpl<TorrentMapper, TORRENT> implements TorrentService {
@Override
- public Torrent getTorrentById(Integer id) {
+ public TORRENT getTorrentById(Integer id) {
return this.getById(id); // 直接调用 MyBatis-Plus 提供的 getById 方法
}
@Override
@Transactional
public void incrementLike(int postId) {
this.update(null,
- new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<Torrent>()
+ new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<TORRENT>()
.eq("id", postId)
.setSql("like_count = like_count + 1")
);
@@ -28,7 +28,7 @@
@Transactional
public void incrementReplyCount(int postId) {
this.update(null,
- new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<Torrent>()
+ new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<TORRENT>()
.eq("id", postId)
.setSql("reply_count = reply_count + 1")
);
diff --git a/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java b/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
index 57bff31..0728819 100644
--- a/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
+++ b/src/main/java/com/ptp/ptplatform/utils/JwtUtils.java
@@ -1,13 +1,21 @@
package com.ptp.ptplatform.utils;
+import com.ptp.ptplatform.entity.USER;
+import com.ptp.ptplatform.mapper.UserMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
import javax.xml.crypto.Data;
import java.util.Date;
+
public class JwtUtils {
+
private static long expire = 36000;
private static String secret = "abcdefgg";
diff --git a/src/main/java/com/ptp/ptplatform/utils/Result.java b/src/main/java/com/ptp/ptplatform/utils/Result.java
index 0bda7eb..527fc42 100644
--- a/src/main/java/com/ptp/ptplatform/utils/Result.java
+++ b/src/main/java/com/ptp/ptplatform/utils/Result.java
@@ -2,6 +2,7 @@
import java.util.HashMap;
import java.util.Map;
+//AAAAAAAAAAAAAaaaaa
public class Result {
private Boolean success;
private Integer code;
@@ -74,4 +75,8 @@
this.setData(map);
return this;
}
+
+ public boolean isSuccess(){
+ return success;
+ }
}
diff --git a/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java b/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java
new file mode 100644
index 0000000..863e376
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java
@@ -0,0 +1,9 @@
+package com.ptp.ptplatform.utils;
+
+//实现将字节大小转化为GB
+public class SizeCalculation {
+
+ public static int byteToGB(long bytes) {
+ return (int) (bytes / 1024 / 1024 / 1024);
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 730af5c..70338d3 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -26,4 +26,12 @@
# MyBatis-Plus properties
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
-mybatis-plus.type-aliases-package=com.example.demo.model
\ No newline at end of file
+mybatis-plus.type-aliases-package=com.example.demo.model
+
+# Tracker??
+bittorrent.tracker.torrent-dir=./torrents
+
+# ??????
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.max-file-size=10MB
+spring.servlet.multipart.max-request-size=10MB
\ No newline at end of file