上传下载种子,上传下载量魔力值
Change-Id: I790145a3d252a55c956e63ef99c862b5da835128
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..8726b47
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,11 @@
+# 使用 OpenJDK 作为基础镜像
+FROM openjdk:11-jre-slim
+
+# 将 JAR 包复制到容器中
+COPY target/PTPlatform-0.0.1-SNAPSHOT.jar /app/myapp.jar
+
+# 配置容器启动时的命令
+ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
+
+# 暴露端口
+EXPOSE 8088
diff --git a/pom.xml b/pom.xml
index 7b65b05..671fec8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -144,6 +144,22 @@
</dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+ <!-- Jakarta Bean Validation API -->
+ <dependency>
+ <groupId>jakarta.validation</groupId>
+ <artifactId>jakarta.validation-api</artifactId>
+ </dependency>
+
+ <!-- Hibernate Validator(实现) -->
+ <dependency>
+ <groupId>org.hibernate.validator</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ </dependency>
+
</dependencies>
<build>
diff --git a/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java b/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
index 3950ee8..46b5b04 100644
--- a/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/InviteCodeController.java
@@ -2,7 +2,7 @@
import com.ptp.ptplatform.entity.INVITE_CODE;
-import com.ptp.ptplatform.entity.User;
+import com.ptp.ptplatform.entity.USER;
import com.ptp.ptplatform.mapper.InviteCodeMapper;
import com.ptp.ptplatform.mapper.UserMapper;
import com.ptp.ptplatform.utils.Result;
@@ -27,7 +27,7 @@
//使用魔力值兑换邀请码
@PostMapping("/generate")
public Result generateInviteCode(HttpServletRequest request) {
- User user = userController.getUserInRequest(request);
+ USER user = userController.getUserInRequest(request);
System.out.println(user.getMagicPoints());
if (user.getMagicPoints() >= 10) {
user.generateInviteCode();
@@ -47,7 +47,7 @@
//用户获取持有的邀请码
@GetMapping("/userInviteCode")
public Result userInviteCode(HttpServletRequest request) {
- User user = userController.getUserInRequest(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 b44bc76..2b18372 100644
--- a/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/TorrentController.java
@@ -1,18 +1,18 @@
package com.ptp.ptplatform.controller;
-import com.ptp.ptplatform.entity.DISCOUNT;
-import com.ptp.ptplatform.entity.TORRENT;
-import com.ptp.ptplatform.entity.User;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ptp.ptplatform.entity.*;
import com.ptp.ptplatform.mapper.DiscountMapper;
import com.ptp.ptplatform.mapper.TorrentMapper;
import com.ptp.ptplatform.mapper.UserMapper;
+import com.ptp.ptplatform.mapper.DownloadTorrentMapper;
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.ptp.ptplatform.utils.SizeCalculation;
import com.turn.ttorrent.bcodec.BDecoder;
import com.turn.ttorrent.bcodec.BEValue;
import com.turn.ttorrent.tracker.TrackedPeer;
@@ -21,8 +21,10 @@
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -33,7 +35,6 @@
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
-import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
@@ -41,8 +42,6 @@
import java.util.UUID;
import java.util.Map;
-import static com.ptp.ptplatform.utils.JwtUtils.getClaimByToken;
-
//实现种子的增删改查
@RestController
@RequestMapping("/torrent")
@@ -56,12 +55,15 @@
@Resource
private UserMapper userMapper;
@Resource
- private UserController userController;
- @Resource
private DiscountMapper discountMapper;
+ @Resource
+ private DownloadTorrentMapper downloadTorrentMapper;
- private TrackerService ts = new TrackerService();
- private ClientService cs = new ClientService();
+ @Resource
+ private UserController userController;
+
+ private TrackerService trackerservice = new TrackerService(new ObjectMapper());
+ private ClientService clientservice = new ClientService();
@GetMapping("/{Id}")
public Result getPost(@PathVariable int Id) {
@@ -141,7 +143,7 @@
@PostConstruct //启动项目时候自动启动tracker服务器
public String startTS() {
try {
- ts.startTracker();
+ trackerservice.startTracker();
System.out.println("成功启动tracker服务器");
return "成功启动tracker服务器";
} catch (Exception e) {
@@ -150,17 +152,28 @@
}
}
+ @PutMapping("/closeTS")
+ public Result closeTS() {
+ try {
+ trackerservice.stopTracker();
+ System.out.println("成功关闭tracker服务器");
+ return Result.ok();
+ } catch (Exception e) {
+ System.out.println("启动失败: " + e.getMessage());
+ return Result.error(500);
+ }
+ }
+
+
//上传、下载、删除操作
//post 要添加数据库 文件和tracker的信息
- @PostMapping
- public Result addTorrent(HttpServletRequest request, @RequestBody TORRENT torrent) throws IOException {
+ //上传torrent
+ @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public Result addTorrent(HttpServletRequest request, @RequestPart("file") MultipartFile file, @RequestPart("body") TORRENT torrent) throws IOException {
+ USER user = userController.getUserInRequest(request);
// 1. 检查源文件
- File file = new File(torrent.getFilePath());
- if (!file.exists() || !file.isFile()) {
- return Result.error(404).data("message", "文件不存在或路径无效");
- }
- if (!file.getName().endsWith(".torrent")) {
+ if (!file.getOriginalFilename().endsWith(".torrent")) {
return Result.error(403).data("message", "仅支持.torrent文件");
}
@@ -172,38 +185,56 @@
return Result.error(404).data("message", "无法创建存储目录");
}
- // 3. 复制文件
- File uploadedFile = new File(torrentsFolder, file.getName());
+ // 3. 获取文件名并创建上传文件路径
+ String originalFilename = file.getOriginalFilename();
+ File uploadedFile = new File(torrentsFolder, originalFilename);
+
+ // 4. 处理文件保存
try {
- Files.copy(file.toPath(), uploadedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ // 如果文件已存在,给文件名加上一个时间戳,避免冲突
+ if (uploadedFile.exists()) {
+ String newFilename = System.currentTimeMillis() + "_" + originalFilename;
+ uploadedFile = new File(torrentsFolder, newFilename);
+ }
+
+ // 复制文件
+ Files.copy(file.getInputStream(), uploadedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件保存成功: " + uploadedFile.getAbsolutePath());
} catch (IOException e) {
- System.out.println("文件复制失败" + e);
+ System.out.println("文件复制失败: " + e);
return Result.error(404).data("message", "文件保存失败: " + e.getMessage());
}
- // 4. 处理Tracker逻辑
+ // 5. 处理Tracker逻辑
try {
- TrackedTorrent tt = ts.addTrackedTorrent(uploadedFile.getAbsolutePath());
- TrackedPeer tp = createTrackedPeer(tt);
- tt.addPeer(tp);
-
long fileSize = getTorrentSizeManual(uploadedFile);
- System.out.println("fileSize" + fileSize);
+ System.out.println("fileSize: " + fileSize);
+ TrackedTorrent tt = trackerservice.addTrackedTorrent(uploadedFile.getAbsolutePath());
- // 5. 数据库操作
+ // 6. 数据库操作
torrent.setHash(tt.getHexInfoHash());
torrent.setSize(fileSize);
- torrent.setUsername(getClaimByToken(request.getHeader("Authorization")).getSubject());
+ torrent.setUsername(user.getUsername());
torrent.setFilePath(uploadedFile.getAbsolutePath());
+ torrent.setCreateTime(LocalDateTime.now());
+ torrentMapper.insertTorrent(torrent);
- if (torrentMapper.insertTorrent(torrent) == 1) {
- return Result.ok().data("message", "上传成功")
- .data("path", uploadedFile.getAbsolutePath());
- }
+ TrackedPeer tp = createTrackedPeer(request, tt, torrent.getId());
+ tp.update(TrackedPeer.PeerState.COMPLETED, fileSize, 0, 0);
+ tt.addPeer(tp);
+
+ // 上传种子本人也上传一个下载记录,计算保种积分
+ DOWNLOAD_TORRENT dt = new DOWNLOAD_TORRENT(user.getUsername(), torrent.getId(), torrent.getSize());
+ downloadTorrentMapper.insertDownloadTorrent(dt);
+ user.updateUpload(torrent.getSize());// 上传不计算折扣
+ userMapper.updateUser(user);
+
+ return Result.ok().data("message", "上传成功")
+ .data("path", uploadedFile.getAbsolutePath());
+
} catch (Exception e) {
- System.out.println("Tracker或数据库操作失败" + e);
+ System.out.println("Tracker或数据库操作失败: " + e);
uploadedFile.delete(); // 回滚:删除已保存的文件
}
@@ -211,83 +242,88 @@
}
//根据本机创建peer对象
- public static TrackedPeer createTrackedPeer(TrackedTorrent torrent) {
- try {
- // 获取本机IP地址
- InetAddress inetAddress = InetAddress.getLocalHost();
- String ip = inetAddress.getHostAddress(); // 本机IP地址
+ public TrackedPeer createTrackedPeer(HttpServletRequest request, TrackedTorrent trackedTorrent, int torrentid) throws UnknownHostException {
+ // 修改为获取request请求的地址
+ //String ip = request.getRemoteAddr();
- // 假设使用一个随机的端口,这个端口可以根据需求调整
- int port = 6881; // 这里使用固定端口,也可以通过动态方式分配
+ //获取本机地址
+ InetAddress inetAddress = InetAddress.getLocalHost();
+ String ip = inetAddress.getHostAddress();
+ USER user = userController.getUserInRequest(request);
- // 创建Peer ID (可以随机生成或从其他地方获取)
- // 这里使用UUID来生成一个随机的 Peer ID
- String peerIdString = UUID.randomUUID().toString();
- ByteBuffer peerId = ByteBuffer.wrap(peerIdString.getBytes());
+ int port = 6881; // 使用固定端口
- // 创建TrackedPeer实例
- TrackedPeer trackedPeer = new TrackedPeer(torrent, ip, port, peerId);
+ // 创建Peer ID
+ String peerIdString = UUID.randomUUID().toString();
+ ByteBuffer peerId = ByteBuffer.wrap(peerIdString.getBytes());
- return trackedPeer;
- } catch (UnknownHostException e) {
- e.printStackTrace();
- return null;
- }
+ // 创建TrackedPeer实例
+ TrackedPeer trackedPeer = new TrackedPeer(trackedTorrent, ip, port, peerId);
+
+// DOWNLOAD_TORRENT uwp = new DOWNLOAD_TORRENT(user.getUsername(), torrentid);
+
+
+ return trackedPeer;
}
//种子下载 根据id获取数据
// 能成功获取到数据
// 能够根据此值,完成对相关数据的修改
- // getDownloadedBytes:3063963
- //getUploadedBytes:0
@GetMapping("/downloadTorrent")
public Result getTorrent(HttpServletRequest request, int id, String downloadPath) throws Exception {
TORRENT torrent = torrentMapper.selectByID(id);
+ USER userDownload = userController.getUserInRequest(request);
+ USER userUpload = userMapper.selectByUsername(torrent.getUsername());
+
+ //检查分享率是否允许下载
+
+ if(!userDownload.allowDownload(torrent.getSize())){
+ return Result.error(409).message("分享率不足下载此资源");
+ }
// 下载完成
// 传入变量:下载种子的id 下载到文件的路径
-// cs.downloadTorrent(torrent.getFilePath(), downloadPath);
-//
-// //管理种子相关数据
-// TorrentStatistic ts = cs.getStatistics(torrent.getFilePath());
+ clientservice.downloadTorrent(torrent.getFilePath(), downloadPath, userDownload.getUsername());
- //修改用户对应的信息
- User downloadUser = userController.getUserInRequest(request);
- User uploadUser = userMapper.selectByUsername(torrent.getUsername());
+ TrackedTorrent tt = trackerservice.getTrackedTorrent(torrent.getHash());
+ TrackedPeer tp = createTrackedPeer(request, tt, torrent.getId());
+ tp.update(TrackedPeer.PeerState.COMPLETED, 0, 0, torrent.getSize());
+ tt.addPeer(tp);
- long up = 30000L;
- long down = 30000L;
+ trackerservice.serTracker();
-// long up = torrent.getSize();
-// long down = up;
+ //更新上传量和下载量
+ userDownload.updateDownload(SizeCalculation.getDownload(torrent.getSize(), discountMapper, torrent.getCreateTime()));
+ userUpload.updateUpload(SizeCalculation.getUpload(torrent.getSize(), discountMapper, torrent.getCreateTime()));
+ userMapper.updateUser(userUpload);
+ userMapper.updateUser(userDownload);
+ DOWNLOAD_TORRENT dt = new DOWNLOAD_TORRENT(userDownload.getUsername(), torrent.getId(), torrent.getSize());
+ downloadTorrentMapper.insertDownloadTorrent(dt);
- // 计算折扣
- DISCOUNT discount = discountMapper.selectCurrentDiscount();
- if (Duration.between(torrent.getCreateTime(), LocalDateTime.now()).toDays() <= 7) {
- up = up * 2;
- down = down / 2;
- }
- if (discount != null) {
- if (discount.getDiscountType().equals("FREE")) {
- down = 0;
- } else if (discount.getDiscountType().equals("HALF")) {
- down = down / 2;
- } else if (discount.getDiscountType().equals("DOUBLE")) {
- up = 2 * up;
+ return Result.ok().data("fileName", torrent.getTorrentName())
+ .data("taskId", torrent.getHash());
+ }
+
+ @GetMapping("/getProgress")
+ public Result getProgress(HttpServletRequest request) throws Exception {
+ USER user = userController.getUserInRequest(request);
+ String username = user.getUsername();
+ List<String[]> tasks = clientservice.getTasks();
+ Map<String, Double> progresses = new HashMap<>();
+
+ for (String[] task : tasks) {
+ if (task[0].equals(username)) {
+ Double progress = 0.0; // 默认进度为0.0
+ try {
+ progress = clientservice.getDownloadProgress(task[1]); // 获取下载进度
+ } catch (IllegalStateException e) {
+ // 如果发生异常,则进度保持为0.0,并继续处理下一个任务
+ progress = 0.0;
+ }
+ progresses.put(task[1], progress);
}
}
-
-
- downloadUser.updateDownload(down);
- uploadUser.updateUpload(up);
-
-// downloadUser.updateDownload(ts.getDownloadedBytes());
-// uploadUser.updateUpload(ts.getDownloadedBytes());
- userMapper.updateUser(downloadUser);
- userMapper.updateUser(uploadUser);
-
-
- return Result.ok().data("torrent", torrent);
+ return Result.ok().data("progresses", progresses);
}
//根据id删除
@@ -378,7 +414,7 @@
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "5") int size) throws Exception {
- User user = userController.getUserInRequest(request);
+ 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());
@@ -392,6 +428,20 @@
.data("total", pageResult.getTotal());
}
+
+ // 测试类
+ @GetMapping("/test")
+ public Result updatePeer(HttpServletRequest request) throws IOException {
+ TORRENT torrent = torrentMapper.selectByID(90);
+ USER user = userController.getUserInRequest(request);
+
+ DOWNLOAD_TORRENT dt = new DOWNLOAD_TORRENT(user.getUsername(), torrent.getId(), torrent.getSize());
+ downloadTorrentMapper.insertDownloadTorrent(dt);
+ user.updateUpload(torrent.getSize());// 上传不计算折扣
+ userMapper.updateUser(user);
+ return Result.ok();
+ }
+
//获取torrent文件大小
public static long getTorrentSizeManual(File torrentFile) throws IOException {
byte[] data = Files.readAllBytes(torrentFile.toPath());
@@ -414,4 +464,5 @@
}
throw new IOException("Invalid torrent file");
}
+
}
\ 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 7dc0a7d..f03af76 100644
--- a/src/main/java/com/ptp/ptplatform/controller/UserController.java
+++ b/src/main/java/com/ptp/ptplatform/controller/UserController.java
@@ -4,6 +4,7 @@
package com.ptp.ptplatform.controller;
import com.ptp.ptplatform.entity.*;
+import com.ptp.ptplatform.mapper.DownloadTorrentMapper;
import com.ptp.ptplatform.mapper.UserMapper;
import com.ptp.ptplatform.mapper.InviteCodeMapper;
import com.ptp.ptplatform.service.UserLevelService;
@@ -13,12 +14,11 @@
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 com.ptp.ptplatform.entity.USER;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
@RestController
@RequestMapping("/user")
@@ -31,23 +31,25 @@
private InviteCodeMapper inviteCodeMapper;
@Autowired
private UserLevelService userLevelService;
+ @Autowired
+ private DownloadTorrentMapper downloadTorrentMapper;
//个人中心获取用户登录信息
@GetMapping("/info") //获取
public Result info(HttpServletRequest request) {
- User user = this.getUserInRequest(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);
+ USER user = userMapper.selectByUsername(username);
// 检查用户是否存在
if (user == null) {
return Result.error(404).setMessage("用户不存在");
}
- if(user.getAuthority() == User.Authority.BAN) {
+ if(user.getAuthority() == USER.Authority.BAN) {
return Result.error(403).setMessage("用户被封禁,禁止登录");
}
@@ -67,7 +69,7 @@
@PostMapping("/regist")
public Result regist(String username, String password, String code) {
- User userCheck = userMapper.selectByUsername(username);
+ USER userCheck = userMapper.selectByUsername(username);
if (userCheck == null) {
//获取邀请码
INVITE_CODE inviteCode = inviteCodeMapper.selectByCode(code);
@@ -76,7 +78,7 @@
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);
@@ -100,7 +102,7 @@
//获取允许下载额度的相关信息
@GetMapping("/allowDownload")
public Result allowDownload(HttpServletRequest request) {
- User user = this.getUserInRequest(request);
+ USER user = this.getUserInRequest(request);
// 总额度 已经使用 剩余 单位是GB
int totalSize = SizeCalculation.byteToGB(user.getUpload());
int usedSize = SizeCalculation.byteToGB(user.getDownload());
@@ -118,7 +120,7 @@
//修改用户密码
@PutMapping("/password")
public Result updatePassword(HttpServletRequest request, @RequestBody Map<String, String> passwordMap) {
- User user = this.getUserInRequest(request);
+ USER user = this.getUserInRequest(request);
String oldPassword = passwordMap.get("oldPassword");
String newPassword = passwordMap.get("newPassword");
@@ -136,12 +138,12 @@
@GetMapping("/searchUser")
public Result searchUser(@RequestParam(value = "key", required = false) String key, HttpServletRequest request) {
// 从请求中获取当前用户
- User user = this.getUserInRequest(request);
+ USER user = this.getUserInRequest(request);
String username = user.getUsername();
// 检查是否提供了搜索关键词
if (key != null && !key.isEmpty()) {
- List<User> searchResults = userMapper.searchUsername(username, key);
+ List<USER> searchResults = userMapper.searchUsername(username, key);
return Result.ok().data("data", searchResults);
} else {
// 如果没有提供关键词,返回默认结果或者一个错误消息
@@ -152,11 +154,12 @@
//获取到全部用户
@GetMapping("/allUser")
public Result getAllUser(){
- List<User> users = userMapper.selectAllUsers();
+ List<USER> users = userMapper.selectAllUsers();
return Result.ok().data("data", users);
}
+
//修改用户权限
// 传入数据 username 要修改到的权限
@PutMapping("/changeAuthority")
@@ -164,8 +167,8 @@
String authority = authorityMap.get("authority");
String changeUsername = authorityMap.get("changeUsername");
- User changeUser = userMapper.selectByUsername(changeUsername);
- changeUser.setAuthority(User.Authority.valueOf(authority));
+ USER changeUser = userMapper.selectByUsername(changeUsername);
+ changeUser.setAuthority(USER.Authority.valueOf(authority));
if(userMapper.updateUser(changeUser) > 0){
return Result.ok().setMessage("修改用户权限成功");
@@ -174,7 +177,7 @@
}
//从http请求中获取到用户
- public User getUserInRequest(HttpServletRequest request) {
+ public USER getUserInRequest(HttpServletRequest request) {
String UserName = JwtUtils.getClaimByToken(request.getHeader("Authorization")).getSubject();
return userMapper.selectByUsername(UserName);
}
@@ -186,4 +189,48 @@
return Result.ok();
}
+ //计算保种积分
+ @GetMapping("/magicPoint")
+ public Result getMagicPoint(HttpServletRequest request) {
+ USER user = this.getUserInRequest(request);
+ List<DOWNLOAD_TORRENT> dts = downloadTorrentMapper.selectByUsername(user.getUsername());
+
+ for (DOWNLOAD_TORRENT dt : dts) {
+ long during = ChronoUnit.DAYS.between(dt.getUpdated(), LocalDateTime.now());
+ double size = SizeCalculation.byteToGB(dt.getFileSize());
+ dt.setUpdated(LocalDateTime.now());
+ user.addMagicPoints((long) (during * size));
+
+ downloadTorrentMapper.updateDT(dt);
+ }
+
+ userMapper.updateUser(user);
+ return Result.ok().data("data", user);
+ }
+
+ //保重积分兑换下载量
+ //1gb资源代表一保重积分
+ @PostMapping("/exchangeUpload")
+ public Result exchangeUpload(
+ HttpServletRequest request,
+ @RequestBody Map<String, Long> requestBody // 接收 JSON 对象
+ ) {
+ USER user = this.getUserInRequest(request);
+ Long magicPoint = requestBody.get("magicPoint"); // 获取字段值
+
+ if (magicPoint == null) {
+ return Result.error(400).message("magicPoint 不能为空");
+ }
+
+ System.out.println("magicPoint" + magicPoint);
+ System.out.println("user magicPoint" + user.getMagicPoints());
+
+ if (user.getMagicPoints() >= magicPoint) {
+ user.reduceMagicPoints(magicPoint);
+ user.updateUpload(SizeCalculation.GBToByte(magicPoint));
+ userMapper.updateUser(user);
+ return Result.ok().message("兑换上传量成功");
+ }
+ return Result.error(409).message("兑换值超出最大魔力值,兑换失败");
+ }
}
diff --git a/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java
new file mode 100644
index 0000000..77bdfcf
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/entity/DOWNLOAD_TORRENT.java
@@ -0,0 +1,33 @@
+package com.ptp.ptplatform.entity;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DOWNLOAD_TORRENT {
+
+ private Integer id;
+ private String username;
+ private Integer torrentid;
+ private boolean finished;
+ private LocalDateTime created;
+ private LocalDateTime updated;
+ private long fileSize;
+
+
+ public DOWNLOAD_TORRENT() {}
+
+ public DOWNLOAD_TORRENT(String username, Integer torrentid, long fileSize) {
+ this.username = username;
+ this.torrentid = torrentid;
+ this.created = LocalDateTime.now();
+ this.updated = this.created;
+ this.fileSize = fileSize;
+ this.finished = false;
+ }
+}
diff --git a/src/main/java/com/ptp/ptplatform/entity/TORRENT.java b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
index 814ba80..ce06e22 100644
--- a/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
+++ b/src/main/java/com/ptp/ptplatform/entity/TORRENT.java
@@ -4,6 +4,9 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.util.JSONPObject;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@@ -15,8 +18,6 @@
@TableName("torrent") // 使用MyBatis-Plus的注解指定表名
public class TORRENT {
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String torrentName; // 文件名
@@ -36,6 +37,10 @@
@TableField(value = "create_time") // 使用@TableField注解处理时间字段
private LocalDateTime createTime; // 创建时间
+ public TORRENT(){
+
+ }
+
// 构造函数
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;
@@ -60,4 +65,11 @@
public int getLikeCount() {
return this.like_count;
}
+
+ public long getSize() {
+ return this.size;
+ }
+ public int getId(){
+ return this.id;
+ }
}
\ 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
similarity index 60%
rename from src/main/java/com/ptp/ptplatform/entity/User.java
rename to src/main/java/com/ptp/ptplatform/entity/USER.java
index ed555c7..9762d88 100644
--- a/src/main/java/com/ptp/ptplatform/entity/User.java
+++ b/src/main/java/com/ptp/ptplatform/entity/USER.java
@@ -2,72 +2,46 @@
// @GeneratedValue(strategy = GenerationType.IDENTITY) 对于一些需要自动生成的主键id进行注解
package com.ptp.ptplatform.entity;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ptp.ptplatform.utils.SizeCalculation;
import jakarta.persistence.*;
+import lombok.Data;
import java.util.Date;
-//@Entity
-//@Table(name = "`user`")
-//public class User {
-//
-// @jakarta.persistence.Id
-// private String username;
-// private String password;
-//
-// @Enumerated(EnumType.STRING)
-// private Authority authority;
-//
-// private int level; // 用户等级0-6
-//
-// @Temporal(TemporalType.DATE)
-// private Date registTime = new Date();
-//
-// @Temporal(TemporalType.DATE)
-// private Date lastLogin;
-//
-// private long upload;
-// private long download;
-// private double shareRate;//分享率 前端展示数据应该为 90.23%这种
-// private long magicPoints;// 魔力值
-//
-// public enum Authority {
-// USER, ADMIN, LIMIT, BAN
-// }
-@TableName("`user`")
-public class User {
+@Data
+@Table(name = "user")
+public class USER {
+ @jakarta.persistence.Id
+ private String username;
+ private String password;
+
+ @Enumerated(EnumType.STRING)
+ private Authority authority;
+
+ private int level; // 用户等级0-6
+
+ @Temporal(TemporalType.DATE)
+ private Date registTime = new Date();
+
+ @Temporal(TemporalType.DATE)
+ private Date lastLogin;
+
+ private long upload;
+ private long download;
+ private double shareRate;//分享率 前端展示数据应该为 90.23%这种
+ private long magicPoints;// 魔力值
+
+ public enum Authority {
+ USER, ADMIN, LIMIT, BAN
+ }
+
+ // 函数
public String getUsername() {
return username;
}
- @TableId
- private String username;
- private String password;
- private int level;
- @TableField("authority")
- private Authority authority;
-
- @TableField("registTime")
- private Date registTime;
- @TableField("lastLogin")
- private Date lastLogin;
-
- @TableField("upload")
- private long upload;
- @TableField("download")
- private long download;
-
- @TableField("shareRate")
- private double shareRate;
- @TableField("magicPoints")
- private long magicPoints;
-
- public enum Authority { USER, ADMIN, LIMIT, BAN }
-
-
public void setUsername(String username) {
this.username = username;
}
@@ -144,16 +118,16 @@
this.magicPoints = magicPoints;
}
- public User() {
+ public USER() {
}
- public User(String username, String password, Authority authority) {
+ public USER(String username, String password, Authority authority) {
this.username = username;
this.password = password;
this.authority = authority;
}
- public User(String username, String password, Date registTime) {
+ public USER(String username, String password, Date registTime) {
this.username = username;
this.registTime = registTime;
@@ -162,8 +136,8 @@
this.authority = Authority.USER;
this.level = 0;
this.lastLogin = null;
- this.upload = 0;
- this.download = 0;
+ this.upload = SizeCalculation.GBToByte(1); //默认有1024mb的下载量
+ this.download = 1;
this.shareRate = 1;
this.magicPoints = 0;
}
@@ -171,22 +145,14 @@
//对上传量下载量的处理 返回更新后的数据结果
public long updateUpload(long addUpload) {
this.upload += addUpload;
- if (this.download == 0) {
- this.shareRate = 1;
- } else {
- this.shareRate = (double) this.upload / this.download;
- }
- return upload;
+ this.shareRate = (double) this.upload / this.download;
+ return this.upload;
}
public long updateDownload(long addDownload) {
this.download += addDownload;
- if (this.download == 0) {
- this.shareRate = 1;
- } else {
- this.shareRate = (double) this.upload / this.download;
- }
- return download;
+ this.shareRate = (double) this.upload / this.download;
+ return this.download;
}
//生成邀请码,魔力值扣除
@@ -196,10 +162,22 @@
// 每天运行的计算魔力值程序
// 添加种子,验证同一用户的全部种子存活与否
- public long updateMagicPoints(long addMagicPoints) {
-
- return 0;
+ // 也是可以读取json文件进行操作
+ public void addMagicPoints(long addMagicPoints) {
+ this.magicPoints += addMagicPoints;
}
+ public void reduceMagicPoints(long reduceMagicPoints) {
+ this.magicPoints -= reduceMagicPoints;
+ }
+
+ //分享率要至少大于0.5
+ public boolean allowDownload(long fileSize) {
+ if (this.upload / (fileSize + this.download) < 0.5) {
+ return false;
+ }
+ return true;
+
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
new file mode 100644
index 0000000..81da1e0
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/mapper/DownloadTorrentMapper.java
@@ -0,0 +1,23 @@
+package com.ptp.ptplatform.mapper;
+
+import com.ptp.ptplatform.entity.DOWNLOAD_TORRENT;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+public interface DownloadTorrentMapper {
+ // 获取对应用户的保种积分
+ @Select("SELECT * FROM download_torrent WHERE username = #{username}")
+ List<DOWNLOAD_TORRENT> selectByUsername(String username);
+
+ // 新建数据
+ @Insert("INSERT INTO download_torrent (username, torrentid, finished, created, updated, fileSize) " +
+ "VALUES (#{username}, #{torrentid}, #{finished}, #{created}, #{updated}, #{fileSize})")
+ int insertDownloadTorrent(DOWNLOAD_TORRENT downloadTorrent);
+
+ @Update("UPDATE download_torrent SET torrentid = #{torrentid}, finished = #{finished}, updated = #{updated}, fileSize = #{fileSize} " +
+ "WHERE id = #{id}")
+ int updateDT(DOWNLOAD_TORRENT downloadTorrent);
+}
diff --git a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
index 5ee4bce..9204b6c 100644
--- a/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
+++ b/src/main/java/com/ptp/ptplatform/mapper/UserMapper.java
@@ -1,32 +1,32 @@
package com.ptp.ptplatform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ptp.ptplatform.entity.User;
+import com.ptp.ptplatform.entity.USER;
import org.apache.ibatis.annotations.*;
import java.util.*;
@Mapper
-public interface UserMapper extends BaseMapper<User> {
+public interface UserMapper extends BaseMapper<USER> {
// 查询
@Select("SELECT * FROM user WHERE username = #{username}")
- User selectByUsername(String username);
+ USER selectByUsername(String username);
@Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}")
- User selectByUsernameAndPassword(String username, String password);
+ USER selectByUsernameAndPassword(String username, String password);
@Select("SELECT * FROM user WHERE username LIKE CONCAT('%', #{key}, '%') AND username != #{username}")
- List<User> searchUsername(String username, String key);
+ List<USER> searchUsername(String username, String key);
@Select("SELECT username, authority, level, registTime, lastLogin, upload, download, shareRate, magicPoints FROM user")
- List<User> selectAllUsers();
+ List<USER> selectAllUsers();
// 注册用户
@Insert("INSERT INTO user (username, password, registTime) " +
"VALUES (#{username}, #{password}, #{registTime})")
- int insertUser(User user);
+ int insertUser(USER user);
// 更新用户信息
@Update("UPDATE user SET " +
@@ -39,6 +39,5 @@
"shareRate = #{shareRate}, " +
"magicPoints = #{magicPoints} " +
"WHERE username = #{username}")
- int updateUser(User user);
-
+ 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
index 39cdc76..daa4544 100644
--- a/src/main/java/com/ptp/ptplatform/service/ClientService.java
+++ b/src/main/java/com/ptp/ptplatform/service/ClientService.java
@@ -1,34 +1,50 @@
package com.ptp.ptplatform.service;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.turn.ttorrent.client.SimpleClient;
import com.turn.ttorrent.common.TorrentStatistic;
import org.springframework.stereotype.Service;
+import java.io.File;
+import java.io.IOException;
import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
@Service
public class ClientService {
SimpleClient client = new SimpleClient();
+ private List<String[]> tasks = new ArrayList<>();
- public boolean downloadTorrent(String torrentFilePath, String outputDirectory) throws Exception {
-
-
- InetAddress address = InetAddress.getLocalHost(); // 使用本地地址
-
+ public boolean downloadTorrent(String torrentFilePath, String outputDirectory, String username) throws Exception {
+ InetAddress address = InetAddress.getLocalHost();
try {
- // 开始下载torrent
- client.downloadTorrent(torrentFilePath, outputDirectory, address);
- System.out.println("下载完成");
+ client.downloadTorrentAsync(torrentFilePath, outputDirectory, address);
+ tasks.add(new String[] {username, torrentFilePath});
return true;
} catch (Exception e) {
- // 下载失败,输出异常信息
e.printStackTrace();
return false;
}
}
public TorrentStatistic getStatistics(String torrentFilePath) throws Exception {
- TorrentStatistic ts = client.getStatistics(torrentFilePath);
- return ts;
+ return client.getStatistics(torrentFilePath);
+ }
+
+ // 修改后的获取下载进度方法
+ public double getDownloadProgress(String torrentFilePath) throws Exception {
+ TorrentStatistic stats = client.getStatistics(torrentFilePath);
+ if (stats == null) {
+ return 0.0;
+ }
+ // 直接使用类中已有的百分比计算方法
+ return stats.getPercentageDownloaded();
+ }
+
+ public List<String[]> getTasks() {
+ return this.tasks;
}
}
\ No newline at end of file
diff --git a/src/main/java/com/ptp/ptplatform/service/TrackerService.java b/src/main/java/com/ptp/ptplatform/service/TrackerService.java
index 29bc95f..5e55dc1 100644
--- a/src/main/java/com/ptp/ptplatform/service/TrackerService.java
+++ b/src/main/java/com/ptp/ptplatform/service/TrackerService.java
@@ -1,5 +1,10 @@
package com.ptp.ptplatform.service;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.ptp.ptplatform.service.serializer.PeerUIDDeserializer;
+import com.ptp.ptplatform.service.serializer.PeerUIDSerializer;
+import com.turn.ttorrent.common.PeerUID;
import com.turn.ttorrent.tracker.TrackedTorrent;
import com.turn.ttorrent.tracker.Tracker;
import jakarta.annotation.PostConstruct;
@@ -15,47 +20,71 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
//封装的对tracker的操作
@Service
public class TrackerService {
-
+ private final ObjectMapper objectMapper;
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 TrackerService(ObjectMapper objectMapper) {
+ this.objectMapper = objectMapper;
+ registerPeerUIDModule(); // 注册 PeerUID 的序列化器
}
- public void stopTracker() {
+ private void registerPeerUIDModule() {
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(PeerUID.class, new PeerUIDSerializer());
+ module.addDeserializer(PeerUID.class, new PeerUIDDeserializer());
+ objectMapper.registerModule(module);
+ }
+
+ public void startTracker() throws Exception {
+ File trackerFile = new File("tracker.json");
+ if (trackerFile.exists()) {
+ try {
+ tracker = objectMapper.readValue(trackerFile, Tracker.class);
+ System.out.println("Tracker loaded from file.");
+ } catch (Exception e) {
+ System.err.println("Failed to load tracker, creating new one: " + e.getMessage());
+ tracker = new Tracker(6969);
+ }
+ } else {
+ tracker = new Tracker(6969);
+ }
+
+ // 加载 .torrent 文件
+ String torrentDirectory = System.getProperty("user.dir") + File.separator + "torrents";
+ File[] torrentFiles = new File(torrentDirectory).listFiles((dir, name) -> name.endsWith(".torrent"));
+
+ if (torrentFiles != null) {
+ for (File file : torrentFiles) {
+ try {
+ TrackedTorrent tt = TrackedTorrent.load(file);
+ tracker.announce(tt);
+ System.out.println("Added torrent: " + file.getName());
+ } catch (Exception e) {
+ System.err.println("Failed to load torrent " + file.getName() + ": " + e.getMessage());
+ }
+ }
+ }
+
+ tracker.setAcceptForeignTorrents(true);
+ tracker.start(true);
+ }
+
+ public void serTracker() throws IOException {
if (tracker != null) {
- tracker.stop();
+ objectMapper.writeValue(new File("tracker.json"), tracker);
+ }
+ }
+
+ public void stopTracker() throws IOException {
+ if (tracker != null) {
+ objectMapper.writeValue(new File("tracker.json"), tracker);
+// tracker.stop();
}
}
diff --git a/src/main/java/com/ptp/ptplatform/service/UserLevelService.java b/src/main/java/com/ptp/ptplatform/service/UserLevelService.java
index d885691..a95dec4 100644
--- a/src/main/java/com/ptp/ptplatform/service/UserLevelService.java
+++ b/src/main/java/com/ptp/ptplatform/service/UserLevelService.java
@@ -11,7 +11,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.ptp.ptplatform.entity.User;
+import com.ptp.ptplatform.entity.USER;
import com.ptp.ptplatform.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
@@ -31,10 +31,10 @@
log.info("===== 开始刷新所有用户等级 =====");
LocalDate today = LocalDate.now();
- List<User> users = userMapper.selectList(null);
+ List<USER> users = userMapper.selectList(null);
log.info(">> 从数据库查到 {} 个用户", users.size());
- for (User u : users) {
+ for (USER u : users) {
double uploadGb = u.getUpload() / BYTES_PER_GB;
long magicPoints = u.getMagicPoints();
log.info("[LevelCheck] 用户={} shareRate={} uploadGB={} magicPoints={}",
@@ -56,7 +56,7 @@
/**
* 根据各项指标和注册时长计算用户等级
*/
- private int calcLevel(User u, LocalDate today) {
+ private int calcLevel(USER u, LocalDate today) {
double shareRate = u.getShareRate(); // 0.9023 表示 90.23%
double uploadGb = u.getUpload() / BYTES_PER_GB;
long magicPoints = u.getMagicPoints();
diff --git a/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDDeserializer.java b/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDDeserializer.java
new file mode 100644
index 0000000..f9def6e
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDDeserializer.java
@@ -0,0 +1,28 @@
+package com.ptp.ptplatform.service.serializer;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.turn.ttorrent.common.PeerUID;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+public class PeerUIDDeserializer extends JsonDeserializer<PeerUID> {
+ @Override
+ public PeerUID deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
+ throws IOException, JsonProcessingException {
+ JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+
+ String torrentHash = node.get("torrentHash").asText();
+
+ JsonNode addressNode = node.get("address");
+ String host = addressNode.get("host").asText();
+ int port = addressNode.get("port").asInt();
+
+ InetSocketAddress address = new InetSocketAddress(host, port);
+ return new PeerUID(address, torrentHash);
+ }
+}
diff --git a/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDSerializer.java b/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDSerializer.java
new file mode 100644
index 0000000..192c9df
--- /dev/null
+++ b/src/main/java/com/ptp/ptplatform/service/serializer/PeerUIDSerializer.java
@@ -0,0 +1,28 @@
+package com.ptp.ptplatform.service.serializer;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.*;
+import com.turn.ttorrent.common.PeerUID;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+public class PeerUIDSerializer extends JsonSerializer<PeerUID> {
+ @Override
+ public void serialize(PeerUID peerUID, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeStringField("torrentHash", peerUID.getTorrentHash());
+
+ // 序列化 InetSocketAddress
+ InetSocketAddress address = peerUID.getAddress();
+ jsonGenerator.writeObjectFieldStart("address");
+ jsonGenerator.writeStringField("host", address.getHostString());
+ jsonGenerator.writeNumberField("port", address.getPort());
+ jsonGenerator.writeEndObject();
+
+ jsonGenerator.writeEndObject();
+ }
+}
+
diff --git a/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java b/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java
index 863e376..5667260 100644
--- a/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java
+++ b/src/main/java/com/ptp/ptplatform/utils/SizeCalculation.java
@@ -1,9 +1,46 @@
package com.ptp.ptplatform.utils;
+import com.ptp.ptplatform.entity.DISCOUNT;
+import com.ptp.ptplatform.mapper.DiscountMapper;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+
//实现将字节大小转化为GB
public class SizeCalculation {
public static int byteToGB(long bytes) {
return (int) (bytes / 1024 / 1024 / 1024);
}
+ public static long GBToByte(long GB) { return (long) (GB * 1024 * 1024 * 1024); }
+
+ public static long getUpload(long uploaded, DiscountMapper discountMapper, LocalDateTime torrentTime) {
+ // 计算折扣
+ DISCOUNT discount = discountMapper.selectCurrentDiscount();
+ if (Duration.between(torrentTime, LocalDateTime.now()).toDays() <= 7) {
+ uploaded = uploaded * 2;
+ }
+ if (discount != null) {
+ if (discount.getDiscountType().equals("DOUBLE")) {
+ uploaded = 2 * uploaded;
+ }
+ }
+
+ return uploaded;
+ }
+
+ public static long getDownload(long downloaded, DiscountMapper discountMapper, LocalDateTime torrentTime) {
+ DISCOUNT discount = discountMapper.selectCurrentDiscount();
+ if (Duration.between(torrentTime, LocalDateTime.now()).toDays() <= 7) {
+ downloaded = downloaded / 2;
+ }
+ if (discount != null) {
+ if (discount.getDiscountType().equals("FREE")) {
+ downloaded = 0;
+ } else if (discount.getDiscountType().equals("HALF")) {
+ downloaded = downloaded / 2;
+ }
+ }
+ return downloaded;
+ }
}
diff --git a/src/test/java/com/ptp/ptplatform/controller/InviteCodeTest.java b/src/test/java/com/ptp/ptplatform/controller/InviteCodeTest.java
index 0a50c00..9ee40b1 100644
--- a/src/test/java/com/ptp/ptplatform/controller/InviteCodeTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/InviteCodeTest.java
@@ -1,7 +1,7 @@
package com.ptp.ptplatform.controller;
import com.ptp.ptplatform.entity.INVITE_CODE;
-import com.ptp.ptplatform.entity.User;
+import com.ptp.ptplatform.entity.USER;
import com.ptp.ptplatform.mapper.InviteCodeMapper;
import com.ptp.ptplatform.mapper.UserMapper;
import com.ptp.ptplatform.utils.Result;
@@ -35,14 +35,14 @@
@InjectMocks
private InviteCodeController inviteCodeController;
- private User testUser;
+ private USER testUser;
private INVITE_CODE testInviteCode;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
- testUser = new User();
+ testUser = new USER();
testUser.setUsername("testUser");
testUser.setMagicPoints(15);
diff --git a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
index d69c4ea..599655e 100644
--- a/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
+++ b/src/test/java/com/ptp/ptplatform/controller/UserControllerTest.java
@@ -1,7 +1,7 @@
package com.ptp.ptplatform.controller;
import com.ptp.ptplatform.entity.INVITE_CODE;
-import com.ptp.ptplatform.entity.User;
+import com.ptp.ptplatform.entity.USER;
import com.ptp.ptplatform.mapper.InviteCodeMapper;
import com.ptp.ptplatform.mapper.UserMapper;
import com.ptp.ptplatform.service.UserLevelService;
@@ -44,14 +44,14 @@
@InjectMocks
private UserController userController;
- private User testUser;
+ private USER testUser;
private INVITE_CODE testInviteCode;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
- testUser = new User();
+ testUser = new USER();
testUser.setUsername("testUser");
testUser.setPassword("testPassword");
testUser.setLastLogin(new Date());
@@ -140,7 +140,7 @@
// Assert
assertTrue(result.isSuccess());
assertEquals("新建用户成功", result.getMessage());
- verify(userMapper, times(1)).insertUser(any(User.class));
+ verify(userMapper, times(1)).insertUser(any(USER.class));
verify(inviteCodeMapper, times(1)).updateCodeUser("VALIDCODE");
}
@@ -281,7 +281,7 @@
when(userMapper.selectByUsername(testUser.getUsername())).thenReturn(testUser);
// Act
- User result = userController.getUserInRequest(request);
+ USER result = userController.getUserInRequest(request);
// Assert
assertEquals(testUser, result);
@@ -299,13 +299,13 @@
mockedJwtUtils.when(() -> JwtUtils.getClaimByToken(anyString())).thenReturn(mockClaims);
// 模拟用户查询
- User mockUser = new User("testUser", "password", User.Authority.USER);
+ USER mockUser = new USER("testUser", "password", USER.Authority.USER);
when(userMapper.selectByUsername("testUser")).thenReturn(mockUser);
// 模拟搜索结果
- List<User> mockResults = Arrays.asList(
- new User("user1", "pass1", User.Authority.USER),
- new User("user2", "pass2", User.Authority.USER)
+ List<USER> mockResults = Arrays.asList(
+ new USER("user1", "pass1", USER.Authority.USER),
+ new USER("user2", "pass2", USER.Authority.USER)
);
when(userMapper.searchUsername("testUser", "zzz")).thenReturn(mockResults);
@@ -329,10 +329,10 @@
@Test
public void testGetAllUser() {
// 模拟返回所有用户
- List<User> mockUsers = Arrays.asList(
- new User("admin", "adminPass", User.Authority.ADMIN),
- new User("user1", "pass1", User.Authority.USER),
- new User("user2", "pass2", User.Authority.USER)
+ List<USER> mockUsers = Arrays.asList(
+ new USER("admin", "adminPass", USER.Authority.ADMIN),
+ new USER("user1", "pass1", USER.Authority.USER),
+ new USER("user2", "pass2", USER.Authority.USER)
);
when(userMapper.selectAllUsers()).thenReturn(mockUsers);
@@ -355,9 +355,9 @@
authorityMap.put("changeUsername", "testUser");
authorityMap.put("authority", "ADMIN");
- User mockUser = new User("testUser", "password", User.Authority.USER);
+ USER mockUser = new USER("testUser", "password", USER.Authority.USER);
when(userMapper.selectByUsername("testUser")).thenReturn(mockUser);
- when(userMapper.updateUser(any(User.class))).thenReturn(1);
+ when(userMapper.updateUser(any(USER.class))).thenReturn(1);
Result successResult = userController.changeAuthority(new MockHttpServletRequest(), authorityMap);
assertEquals(200, successResult.getCode());
diff --git a/temp.txt b/temp.txt
new file mode 100644
index 0000000..76a8b85
--- /dev/null
+++ b/temp.txt
@@ -0,0 +1,52 @@
+pipeline {
+ agent any
+ environment {
+ SERVER_IP = '192.168.5.13' // 目标服务器IP
+ USERNAME = 'p4user' // 服务器用户名
+ DEPLOY_DIR = '/team2' // 远程部署路径
+ }
+ stages {
+ stage('pull') {
+ steps {
+ git branch: 'master', url: 'ssh://jenkins@gerrit.lilingkun.com:29418/G2-ptPlatform-backend'
+ echo '拉取成功'
+ }
+ }
+
+ stage('build') {
+ steps {
+ sh "mvn --version"
+ // 合并构建步骤,避免多次切换目录
+ sh """
+ cd ttorrent-master && mvn clean install -DskipTests
+ cd .. && mvn clean package
+ """
+ echo '构建完成'
+ }
+ }
+
+ stage('Deploy') {
+ steps {
+ script {
+ // 使用 SCP 命令将文件复制到目标服务器
+ sh """
+ scp -r ./build/* ${USERNAME}@${SERVER_IP}:${DEPLOY_DIR}
+ """
+ }
+ }
+ }
+
+ stage('Run Docker') {
+ steps {
+ script {
+ // 使用 Docker 在目标服务器上运行容器
+ sshagent(['your-ssh-credential-id']) {
+ sh """
+ ssh ${USERNAME}@${SERVER_IP} 'docker run -d --name my-app-container ${DEPLOY_DIR}/my-app-image'
+ """
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git "a/torrents/1748241407377_\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent" "b/torrents/1748241407377_\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent"
new file mode 100644
index 0000000..0db6347
--- /dev/null
+++ "b/torrents/1748241407377_\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent"
Binary files differ
diff --git "a/torrents/\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent" "b/torrents/\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent"
new file mode 100644
index 0000000..0db6347
--- /dev/null
+++ "b/torrents/\344\270\244\346\235\206\345\244\247\347\203\237\346\236\252BD\344\270\255\350\213\261\345\217\214\345\255\227.mp4.torrent"
Binary files differ
diff --git a/tracker.json b/tracker.json
new file mode 100644
index 0000000..5475d24
--- /dev/null
+++ b/tracker.json
@@ -0,0 +1 @@
+{"announceUrl":"http://10.60.12.94:6969/announce","announceURI":"http://10.60.12.94:6969/announce","trackedTorrents":[{"announceInterval":10,"peers":{"PeerUID{address=/10.60.12.94:6881, torrent hash='E5FD501A5E6F07FA02777809C83EB2B815A2C3EA'}":{"address":"10.60.12.94:6881","peerId":"Mzg3ZGMxYTgtMzU4Yy00ZDMyLWFhOTctNzQ2MzdhMmMyZDg1","hexPeerId":"33383764633161382D333538632D346433322D616139372D373436333761326332643835","hexInfoHash":null,"uploaded":0,"downloaded":0,"left":3063963,"completed":true,"port":6881,"shortHexPeerId":"..643835","stringPeerId":"387dc1a8-358c-4d32-aa97-74637a2c2d85","hostIdentifier":"/10.60.12.94:6881","ip":"10.60.12.94","peerIdArray":"Mzg3ZGMxYTgtMzU4Yy00ZDMyLWFhOTctNzQ2MzdhMmMyZDg1","rawIp":"CjwMXg=="},"PeerUID{address=/10.60.12.94:6883, torrent hash='E5FD501A5E6F07FA02777809C83EB2B815A2C3EA'}":{"address":"10.60.12.94:6883","peerId":"LVRPMDA0Mi0wYjI5MDQwZDE3MWQ=","hexPeerId":"2D544F303034322D306232393034306431373164","hexInfoHash":null,"uploaded":0,"downloaded":0,"left":3063963,"completed":false,"port":6883,"shortHexPeerId":"..373164","stringPeerId":"-TO0042-0b29040d171d","hostIdentifier":"/10.60.12.94:6883","ip":"10.60.12.94","peerIdArray":"LVRPMDA0Mi0wYjI5MDQwZDE3MWQ=","rawIp":"CjwMXg=="},"PeerUID{address=/10.60.12.94:6882, torrent hash='E5FD501A5E6F07FA02777809C83EB2B815A2C3EA'}":{"address":"10.60.12.94:6882","peerId":"LVRPMDA0Mi0xNWI3N2EwZWViZWY=","hexPeerId":"2D544F303034322D313562373761306565626566","hexInfoHash":null,"uploaded":0,"downloaded":0,"left":3063963,"completed":false,"port":6882,"shortHexPeerId":"..626566","stringPeerId":"-TO0042-15b77a0eebef","hostIdentifier":"/10.60.12.94:6882","ip":"10.60.12.94","peerIdArray":"LVRPMDA0Mi0xNWI3N2EwZWViZWY=","rawIp":"CjwMXg=="}},"hexInfoHash":"E5FD501A5E6F07FA02777809C83EB2B815A2C3EA","infoHash":"5f1QGl5vB/oCd3gJyD6yuBWiw+o="},{"announceInterval":10,"peers":{"PeerUID{address=/10.60.12.94:6882, torrent hash='34D94F184C0DC45372F52DD0FBAEB79AF4BD758E'}":{"address":"10.60.12.94:6882","peerId":"LVRPMDA0Mi0xNWI3N2EwZWViZWY=","hexPeerId":"2D544F303034322D313562373761306565626566","hexInfoHash":null,"uploaded":0,"downloaded":0,"left":1609568975,"completed":false,"port":6882,"shortHexPeerId":"..626566","stringPeerId":"-TO0042-15b77a0eebef","hostIdentifier":"/10.60.12.94:6882","ip":"10.60.12.94","peerIdArray":"LVRPMDA0Mi0xNWI3N2EwZWViZWY=","rawIp":"CjwMXg=="},"PeerUID{address=/10.60.12.94:6881, torrent hash='34D94F184C0DC45372F52DD0FBAEB79AF4BD758E'}":{"address":"10.60.12.94:6881","peerId":"YmI0YzJkYTgtMWRiMy00ODRiLTg0ZDgtNjhkMjAwMzViNzhk","hexPeerId":"62623463326461382D316462332D343834622D383464382D363864323030333562373864","hexInfoHash":null,"uploaded":0,"downloaded":0,"left":1609568975,"completed":false,"port":6881,"shortHexPeerId":"..373864","stringPeerId":"bb4c2da8-1db3-484b-84d8-68d20035b78d","hostIdentifier":"/10.60.12.94:6881","ip":"10.60.12.94","peerIdArray":"YmI0YzJkYTgtMWRiMy00ODRiLTg0ZDgtNjhkMjAwMzViNzhk","rawIp":"CjwMXg=="}},"hexInfoHash":"34D94F184C0DC45372F52DD0FBAEB79AF4BD758E","infoHash":"NNlPGEwNxFNy9S3Q+663mvS9dY4="}]}
\ No newline at end of file
diff --git a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java
index 0ebed92..33f4d49 100644
--- a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java
+++ b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java
@@ -102,10 +102,10 @@
}
/**
- * Returns a File object for created temp directory.
+ * Returns a File object for created temp.txt directory.
* Also stores the value into this object accessed with {@link #getCurrentTempDir()}
*
- * @return a File object for created temp directory
+ * @return a File object for created temp.txt directory
* @throws IOException if directory creation fails.
*/
public final File createTempDir() throws IOException {
diff --git a/uploads/1ed6e86b-955c-4426-b170-73bc7558eca5.png b/uploads/1ed6e86b-955c-4426-b170-73bc7558eca5.png
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/uploads/1ed6e86b-955c-4426-b170-73bc7558eca5.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/69925fae-3c62-460c-a5c1-ee9695bc8ae2.jpg b/uploads/69925fae-3c62-460c-a5c1-ee9695bc8ae2.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/69925fae-3c62-460c-a5c1-ee9695bc8ae2.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/72db8eb6-40f8-445c-a833-43ec6fecebdd.png b/uploads/72db8eb6-40f8-445c-a833-43ec6fecebdd.png
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/uploads/72db8eb6-40f8-445c-a833-43ec6fecebdd.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/uploads/ef17d022-9c80-436b-87cd-227d783baadf.jpg b/uploads/ef17d022-9c80-436b-87cd-227d783baadf.jpg
new file mode 100644
index 0000000..aed2973
--- /dev/null
+++ b/uploads/ef17d022-9c80-436b-87cd-227d783baadf.jpg
@@ -0,0 +1 @@
+
\ No newline at end of file