用户类完善 商城功能
Change-Id: I2fa4cecee4203114998d7f9f24e956660a2da5ec
diff --git a/pom.xml b/pom.xml
index ea99d5b..b6b889b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,17 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.4</version>
- <relativePath/> <!-- lookup parent from repository -->
+ <relativePath/>
+ <!-- lookup parent from repository -->
</parent>
<groupId>com.pt5</groupId>
<artifactId>PT-houduan</artifactId>
<version>0.0.1-SNAPSHOT</version>
-<!-- <packaging>pom</packaging>-->
+ <!-- <packaging>pom</packaging> -->
<name>PT-houduan</name>
<description>PT-houduan</description>
<url/>
@@ -31,27 +30,25 @@
<java.version>17</java.version>
</properties>
<dependencies>
-<!-- <dependency>-->
-<!-- <groupId>com.turn</groupId>-->
-<!-- <artifactId>ttorrent-client</artifactId>-->
-<!-- <version>1.3.0-SNAPSHOT</version>-->
-<!-- </dependency>-->
-<!-- <dependency>-->
-<!-- <groupId>com.turn</groupId>-->
-<!-- <artifactId>ttorrent-tracker</artifactId>-->
-<!-- <version>1.3.0-SNAPSHOT</version>-->
-<!-- </dependency>-->
-<!-- <dependency>-->
-<!-- <groupId>com.turn</groupId>-->
-<!-- <artifactId>ttorrent</artifactId>-->
-<!-- <version>1.3.0-SNAPSHOT</version>-->
-<!-- </dependency>-->
-
-
-<!-- <dependency>-->
-<!-- <groupId>org.springframework.boot</groupId>-->
-<!-- <artifactId>spring-boot-starter-data-jpa</artifactId>-->
-<!-- </dependency>-->
+ <!-- <dependency> -->
+ <!-- <groupId>com.turn</groupId> -->
+ <!-- <artifactId>ttorrent-client</artifactId> -->
+ <!-- <version>1.3.0-SNAPSHOT</version> -->
+ <!-- </dependency> -->
+ <!-- <dependency> -->
+ <!-- <groupId>com.turn</groupId> -->
+ <!-- <artifactId>ttorrent-tracker</artifactId> -->
+ <!-- <version>1.3.0-SNAPSHOT</version> -->
+ <!-- </dependency> -->
+ <!-- <dependency> -->
+ <!-- <groupId>com.turn</groupId> -->
+ <!-- <artifactId>ttorrent</artifactId> -->
+ <!-- <version>1.3.0-SNAPSHOT</version> -->
+ <!-- </dependency> -->
+ <!-- <dependency> -->
+ <!-- <groupId>org.springframework.boot</groupId> -->
+ <!-- <artifactId>spring-boot-starter-data-jpa</artifactId> -->
+ <!-- </dependency> -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
@@ -66,8 +63,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
-
- <!-- 这边开始是tracker的-->
+ <!-- 这边开始是tracker的 -->
<dependency>
<groupId>com.turn</groupId>
<artifactId>tracker</artifactId>
@@ -75,7 +71,7 @@
<scope>system</scope>
<systemPath>${project.basedir}/lib/ttorrent-tracker-1.3.0-SNAPSHOT.jar</systemPath>
<exclusions>
- <!-- 排除旧版本的 simpleframework -->
+ <!-- 排除旧版本的 simpleframework -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
@@ -111,27 +107,27 @@
</exclusion>
</exclusions>
</dependency>
-<!-- <dependency>-->
-<!-- <groupId>com.turn</groupId>-->
-<!-- <artifactId>cli</artifactId>-->
-<!-- <version>1.3.0-SNAPSHOT</version>-->
-<!-- <scope>system</scope>-->
-<!-- <systemPath>${project.basedir}/lib/ttorrent-cli-1.3.0-SNAPSHOT.jar</systemPath>-->
-<!-- <exclusions>-->
-<!-- <exclusion>-->
-<!-- <groupId>org.slf4j</groupId>-->
-<!-- <artifactId>*</artifactId>-->
-<!-- </exclusion>-->
-<!-- <exclusion>-->
-<!-- <groupId>log4j</groupId>-->
-<!-- <artifactId>*</artifactId>-->
-<!-- </exclusion>-->
-<!-- <exclusion>-->
-<!-- <groupId>ch.qos.logback</groupId>-->
-<!-- <artifactId>*</artifactId>-->
-<!-- </exclusion>-->
-<!-- </exclusions>-->
-<!-- </dependency>-->
+ <!-- <dependency> -->
+ <!-- <groupId>com.turn</groupId> -->
+ <!-- <artifactId>cli</artifactId> -->
+ <!-- <version>1.3.0-SNAPSHOT</version> -->
+ <!-- <scope>system</scope> -->
+ <!-- <systemPath>${project.basedir}/lib/ttorrent-cli-1.3.0-SNAPSHOT.jar</systemPath> -->
+ <!-- <exclusions> -->
+ <!-- <exclusion> -->
+ <!-- <groupId>org.slf4j</groupId> -->
+ <!-- <artifactId>*</artifactId> -->
+ <!-- </exclusion> -->
+ <!-- <exclusion> -->
+ <!-- <groupId>log4j</groupId> -->
+ <!-- <artifactId>*</artifactId> -->
+ <!-- </exclusion> -->
+ <!-- <exclusion> -->
+ <!-- <groupId>ch.qos.logback</groupId> -->
+ <!-- <artifactId>*</artifactId> -->
+ <!-- </exclusion> -->
+ <!-- </exclusions> -->
+ <!-- </dependency> -->
<dependency>
<groupId>com.turn</groupId>
<artifactId>bencode</artifactId>
@@ -195,21 +191,22 @@
</exclusion>
</exclusions>
</dependency>
-<!-- <dependency>-->
-<!-- <groupId>org.simpleframework</groupId>-->
-<!-- <artifactId>simple-http</artifactId>-->
-<!-- <version>6.0.1</version>-->
-<!-- </dependency>-->
-<!-- <dependency>-->
-<!-- <groupId>org.simpleframework</groupId>-->
-<!-- <artifactId>simple-transport</artifactId>-->
-<!-- <version>6.0.1</version> <!– 使用最新稳定版本 –>-->
-<!-- </dependency>-->
- <!-- 替换现有的 simple-transport 依赖 -->
+ <!-- <dependency> -->
+ <!-- <groupId>org.simpleframework</groupId> -->
+ <!-- <artifactId>simple-http</artifactId> -->
+ <!-- <version>6.0.1</version> -->
+ <!-- </dependency> -->
+ <!-- <dependency> -->
+ <!-- <groupId>org.simpleframework</groupId> -->
+ <!-- <artifactId>simple-transport</artifactId> -->
+ <!-- <version>6.0.1</version> <!– 使用最新稳定版本 –> -->
+ <!-- </dependency> -->
+ <!-- 替换现有的 simple-transport 依赖 -->
<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple</artifactId>
- <version>5.1.6</version> <!-- 与 ttorrent 兼容的版本 -->
+ <version>5.1.6</version>
+ <!-- 与 ttorrent 兼容的版本 -->
<exclusions>
<exclusion>
<groupId>*</groupId>
@@ -217,8 +214,7 @@
</exclusion>
</exclusions>
</dependency>
-
- <!-- MyBatis-Plus -->
+ <!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
@@ -229,8 +225,6 @@
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
-
-
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
@@ -257,20 +251,24 @@
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
-<!-- <dependency>-->
-<!-- <groupId>log4j</groupId>-->
-<!-- <artifactId>log4j</artifactId>-->
-<!-- <version>1.2.17</version>-->
-<!-- </dependency>-->
+ <!-- <dependency> -->
+ <!-- <groupId>log4j</groupId> -->
+ <!-- <artifactId>log4j</artifactId> -->
+ <!-- <version>1.2.17</version> -->
+ <!-- </dependency> -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-mail</artifactId>
+ </dependency>
</dependencies>
-
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
- <includeSystemScope>true</includeSystemScope> <!-- 包含system范围的依赖 -->
+ <includeSystemScope>true</includeSystemScope>
+ <!-- 包含system范围的依赖 -->
<executable>true</executable>
<layers>
<enabled>true</enabled>
@@ -295,7 +293,8 @@
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
- <includeScope>system</includeScope> <!-- 专门复制system范围的依赖 -->
+ <includeScope>system</includeScope>
+ <!-- 专门复制system范围的依赖 -->
<excludeTransitive>true</excludeTransitive>
</configuration>
</execution>
@@ -328,9 +327,7 @@
</resource>
</resources>
</build>
-
-<!-- <modules>-->
-<!-- <module>ttorrent</module>-->
-<!-- </modules>-->
-
-</project>
+ <!-- <modules> -->
+ <!-- <module>ttorrent</module> -->
+ <!-- </modules> -->
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/controller/ShopController.java b/src/main/java/com/pt5/pthouduan/controller/ShopController.java
new file mode 100644
index 0000000..dfb38b2
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/ShopController.java
@@ -0,0 +1,28 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.User;
+import com.pt5.pthouduan.service.InviteService;
+import com.pt5.pthouduan.service.ShopService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/shop")
+public class ShopController {
+ @Autowired
+ private ShopService shopService;
+ @PostMapping("/soldDecoration")
+ public Map<String, Object> soldDecoration(@RequestParam String buyername,@RequestParam String decoration,@RequestParam int price) {
+ return shopService.buyDecoration(buyername,decoration,price);
+ }
+ @PostMapping("/soldUpload")
+ public Map<String, Object> soldUpload(@RequestParam String buyername,@RequestParam int price,@RequestParam int upload) {
+ return shopService.buyUpload(buyername,price,upload);
+ }
+ @PostMapping("/soldInvite")
+ public Map<String, Object> soldInvite(@RequestParam String buyername,@RequestParam int price) {
+ return shopService.setbuyername(buyername,price);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/controller/UserController.java b/src/main/java/com/pt5/pthouduan/controller/UserController.java
index 82ac9fd..9198708 100644
--- a/src/main/java/com/pt5/pthouduan/controller/UserController.java
+++ b/src/main/java/com/pt5/pthouduan/controller/UserController.java
@@ -23,8 +23,8 @@
private UserService userService;
@PostMapping("/register")
- public Map<String, Object> register(@RequestBody User user,@RequestParam String code) {
- return userService.register(user,code);
+ public Map<String, Object> register(@RequestBody User user,@RequestParam String code,@RequestParam String emailcode) {//code是邀请码,emailcode是验证码
+ return userService.register(user,code,emailcode);
}
@PostMapping("/login")
@@ -46,7 +46,7 @@
@PostMapping("/changeimage")
public Map<String, Object> changeimage(@RequestParam String username,
- @RequestParam String image) {
+ @RequestParam String image) {
return userService.changeImage(username,image);
}
@@ -57,8 +57,24 @@
return userService.changePassword(username,oldpassword,newpassword);
}
- @GetMapping("/info")
- public Map<String, Object> getUserInfo(@RequestParam(required = false) String username) {
- return userService.login(username, "");
+ @PostMapping("/sendCode")
+ public Map<String, Object> sendCode(@RequestParam String email) {
+ return userService.sendCode(email);
}
+
+ @GetMapping("/Info")
+ public Map<String, Object> getuser(@RequestParam String username) {
+ return userService.UserInfo(username);
+ }
+
+ @PostMapping("/creatUser")
+ public Map<String, Object> creatUser(@RequestBody User user) {
+ return userService.CreateUser(user);
+ }
+
+ @PostMapping("/DeleteUser")
+ public Map<String, Object> DeleteUser(@RequestParam String username) {
+ return userService.DeleteUser(username);
+ }
+
}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Shop.java b/src/main/java/com/pt5/pthouduan/entity/Shop.java
new file mode 100644
index 0000000..3340ee6
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/entity/Shop.java
@@ -0,0 +1,64 @@
+package com.pt5.pthouduan.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+//商城订单类 注意这个表没建哈 暂时没什么用 以后如果用到也可以再建
+@TableName("Shop")
+public class Shop implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId("ShoppingId")
+ private Long ShoppingId;//订单id
+
+ private String buyername;//购买人用户名
+
+ private int type;//订单类型 1表示外观类订单 2表示上传量类订单 3表示邀请码类订单
+
+ private int info;//表示的是订单信息 如果是外观订单它就是外观编号,如果是邀请码订单就是邀请码,如果是上传量订单就是上传量值
+
+
+ public Long getShoppingId() {
+ return ShoppingId;
+ }
+
+ public void setShoppingId(Long shoppingId) {
+ ShoppingId = shoppingId;
+ }
+
+ public String getBuyername() {
+ return buyername;
+ }
+
+ public void setBuyername(String buyername) {
+ this.buyername = buyername;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ @Override
+ public String toString() {
+ return "Shop{" +
+ "ShoppingId=" + ShoppingId +
+ ", buyername='" + buyername + '\'' +
+ ", type=" + type +
+ ", info=" + info +
+ '}';
+ }
+
+ public int getInfo() {
+ return info;
+ }
+
+ public void setInfo(int info) {
+ this.info = info;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/entity/User.java b/src/main/java/com/pt5/pthouduan/entity/User.java
index b1128be..7fc13e7 100644
--- a/src/main/java/com/pt5/pthouduan/entity/User.java
+++ b/src/main/java/com/pt5/pthouduan/entity/User.java
@@ -8,7 +8,7 @@
/**
* <p>
- *
+ *
* </p>
*
* @author ljx
@@ -48,6 +48,10 @@
private String email;
+ private String decoration;//用户外观
+
+ private String permission;//用户权限 1表示普通用户 0表示管理员
+
// 构造函数
public User(Long id, String name) {
this.userid = id;
@@ -158,25 +162,6 @@
this.privacy = privacy;
}
- @Override
- public String toString() {
- return "User{" +
- "username = " + username +
- ", password = " + password +
- ", userUpload = " + userUpload +
- ", userDownload = " + userDownload +
- ", credit = " + credit +
- ", image = " + image +
- ", sex = " + sex +
- ", userid = " + userid +
- ", gradeId = " + gradeId +
- ", passkey = " + passkey +
- ", ratio = " + ratio +
- ", age = " + age +
- ", privacy = " + privacy + ", email = " + email +
- "}";
- }
-
public String getEmail() {
return email;
}
@@ -184,4 +169,42 @@
public void setEmail(String email) {
this.email = email;
}
+
+ public String getDecoration() {
+ return decoration;
+ }
+
+ public void setDecoration(String decoration) {
+ this.decoration = decoration;
+ }
+
+ public String getPermission() {
+ return permission;
+ }
+
+ public void setPermission(String permission) {
+ this.permission = permission;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "username='" + username + '\'' +
+ ", password='" + password + '\'' +
+ ", userUpload=" + userUpload +
+ ", userDownload=" + userDownload +
+ ", credit=" + credit +
+ ", image='" + image + '\'' +
+ ", sex='" + sex + '\'' +
+ ", userid=" + userid +
+ ", gradeId=" + gradeId +
+ ", passkey='" + passkey + '\'' +
+ ", ratio=" + ratio +
+ ", age=" + age +
+ ", privacy=" + privacy +
+ ", email='" + email + '\'' +
+ ", decoration='" + decoration + '\'' +
+ ", permission='" + permission + '\'' +
+ '}';
+ }
}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/ShopMapper.java b/src/main/java/com/pt5/pthouduan/mapper/ShopMapper.java
new file mode 100644
index 0000000..dc09493
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/mapper/ShopMapper.java
@@ -0,0 +1,17 @@
+package com.pt5.pthouduan.mapper;
+
+import com.pt5.pthouduan.entity.Invites;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pt5.pthouduan.entity.User;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ShopMapper extends BaseMapper<Invites> {
+//
+// @Insert("INSERT INTO shop(username, info, type) VALUES(#{username}, #{decoration}, 1)")
+// int firstshop(
+// @Param("username") String username,
+// @Param("decoration") String decoration
+// );
+}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java b/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
index 2f96180..ebd150f 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
@@ -21,6 +21,9 @@
@Insert("INSERT INTO user(username, password, email, passkey) VALUES(#{username}, #{password}, #{email}, #{passkey})")
int insert(User user);
+ @Delete("DELETE FROM user_behavior WHERE user_id = (SELECT user_id FROM User WHERE username = #{username})")
+ int deleteByUsername(@Param("username") String username);
+
@Select("SELECT * FROM User WHERE username = #{username}")
User selectByUsername(String username);
@@ -57,4 +60,7 @@
String getUsernameByPasskey(String passkey);
List<PeerInfo> findSeedersByInfoHash(@Param("infoHash") String infoHash);
+
+ @Select("SELECT passkey FROM user WHERE userid = #{userid}")
+ String selectPasskeyByUserid(Long userid);
}
diff --git a/src/main/java/com/pt5/pthouduan/service/EmailService.java b/src/main/java/com/pt5/pthouduan/service/EmailService.java
new file mode 100644
index 0000000..492ade0
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/EmailService.java
@@ -0,0 +1,75 @@
+package com.pt5.pthouduan.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+@Service
+public class EmailService {
+
+ @Autowired
+ private JavaMailSender mailSender;
+
+ // 存储邮箱和验证码的映射(实际项目中应该用Redis等缓存)
+ private final Map<String, String> emailCodeMap = new HashMap<>();
+
+ /**
+ * 发送验证码到指定邮箱
+ * @param email 目标邮箱
+ * @return 是否发送成功
+ */
+ public boolean sendVerificationCode(String email) {
+ // 生成6位随机验证码
+ String code = generateRandomCode(6);
+
+ // 存储验证码(5分钟有效)
+ emailCodeMap.put(email, code);
+
+ try {
+ SimpleMailMessage message = new SimpleMailMessage();
+ message.setFrom("zhutai940@163.com"); // 发件人
+ message.setTo(email); // 收件人
+ message.setSubject("您的注册验证码"); // 主题
+ message.setText("您的验证码是: " + code + ",5分钟内有效。"); // 内容
+
+ mailSender.send(message);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 验证邮箱和验证码是否匹配
+ * @param email 邮箱
+ * @param code 验证码
+ * @return 是否验证通过
+ */
+ public boolean verifyCode(String email, String code) {
+ String storedCode = emailCodeMap.get(email);
+ return storedCode != null && storedCode.equals(code);
+ }
+
+ /**
+ * 生成随机验证码
+ * @param length 验证码长度
+ * @return 验证码字符串
+ */
+ private String generateRandomCode(int length) {
+ String numbers = "0123456789";
+ Random random = new Random();
+ StringBuilder sb = new StringBuilder();
+
+ for (int i = 0; i < length; i++) {
+ sb.append(numbers.charAt(random.nextInt(numbers.length())));
+ }
+
+ return sb.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/service/ShopService.java b/src/main/java/com/pt5/pthouduan/service/ShopService.java
new file mode 100644
index 0000000..a85b5ef
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/ShopService.java
@@ -0,0 +1,78 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Invites;
+import com.pt5.pthouduan.mapper.InvitesMapper;
+import com.pt5.pthouduan.mapper.ShopMapper;
+import com.pt5.pthouduan.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class ShopService {
+ @Autowired
+ private InvitesMapper invitesMapper;
+ @Autowired
+ private UserMapper userMapper;
+ //外观类订单
+ public Map<String, Object> buyDecoration(String buyername,String decoration,int price){//decoration指的是外观编号或id
+ Map<String, Object> result = new HashMap<>();
+ //首先查询用户是否拥有足够的保种积分
+ int credit=userMapper.getcreditByUsername(buyername);
+ if(credit<price){
+ result.put("success", false);
+ result.put("message", "余额不足");
+ return result;
+ }
+ //更新用户保种积分
+ userMapper.deductCreditByUsername(buyername,price);
+ //更新用户数据库
+ userMapper.appendUserDecoration(buyername,decoration);
+ //更新订单数据库 To do...
+ result.put("success", true);
+ result.put("message", "外观购买成功");
+ return result;
+ }
+ //上传量类订单
+ public Map<String, Object> buyUpload(String buyername,int price,int upload){
+ Map<String, Object> result = new HashMap<>();
+ //首先查询用户是否拥有足够的保种积分
+ int credit=userMapper.getcreditByUsername(buyername);
+ if(credit<price){
+ result.put("success", false);
+ result.put("message", "余额不足");
+ return result;
+ }
+ //更新用户保种积分
+ userMapper.deductCreditByUsername(buyername,price);
+ //更新用户上传量
+ userMapper.increaseUploadByUsername(buyername,upload);
+ result.put("success", true);
+ result.put("message", "上传量购买成功");
+ return result;
+ }
+ //购买邀请码
+ public Map<String, Object> setbuyername(String buyername,int price){
+ Map<String, Object> result = new HashMap<>();
+ //首先查询用户是否拥有足够的保种积分
+ int credit=userMapper.getcreditByUsername(buyername);
+ if(credit<price){
+ result.put("success", false);
+ result.put("message", "余额不足");
+ return result;
+ }
+ //更新用户保种积分
+ userMapper.deductCreditByUsername(buyername,price);
+ Invites invite=invitesMapper.selectFirstEmptyBuyername();
+ invitesMapper.updatebuyer(invite.getCode(),buyername);
+ result.put("success", true);
+ result.put("invitecode", invite.getCode());
+ result.put("message", "邀请码购买成功");
+ return result;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/pt5/pthouduan/service/UserService.java b/src/main/java/com/pt5/pthouduan/service/UserService.java
index 365580f..59865c2 100644
--- a/src/main/java/com/pt5/pthouduan/service/UserService.java
+++ b/src/main/java/com/pt5/pthouduan/service/UserService.java
@@ -19,8 +19,18 @@
private UserMapper userMapper;
@Autowired
private InvitesMapper invitesMapper;
+ @Autowired
+ private EmailService emailService;
+ //发送验证码
+ public Map<String, Object> sendCode(String email){
+ Map<String, Object> result = new HashMap<>();
+ emailService.sendVerificationCode(email);
+ result.put("success", true);
+ result.put("message", "验证码发送成功");
+ return result;
+ }
// 注册业务
- public Map<String, Object> register(User user,String code) {
+ public Map<String, Object> register(User user,String code,String emailcode) {
Map<String, Object> result = new HashMap<>();
// 参数校验
@@ -61,8 +71,12 @@
result.put("message","邀请码已被使用");
return result;
}
- //邮箱发送验证码验证
- //To do... ..
+ //邮箱验证码验证
+ if (!emailService.verifyCode(user.getEmail(), emailcode)) {
+ result.put("success", false);
+ result.put("message","验证码错误");
+ return result;
+ }
//生成passkey
SecureRandom random = new SecureRandom();
user.setPasskey(String.valueOf(10000000 + random.nextInt(90000000)));
@@ -73,6 +87,7 @@
result.put("message", "注册成功");
return result;
}
+ //
// 登录业务
public Map<String, Object> login(String username, String password) {
@@ -156,4 +171,30 @@
result.put("message", "密码重置成功");
return result;
}
+ //获取用户信息(前端)
+ public Map<String, Object> UserInfo(String username){
+ Map<String, Object> result = new HashMap<>();
+ User user = userMapper.selectByUsername(username);
+ result.put("success", true);
+ result.put("message", "用户信息获取成功");
+ result.put("user", user);
+ return result;
+ }
+ //直接创建用户
+ public Map<String, Object> CreateUser(User user){
+ Map<String, Object> result = new HashMap<>();
+ userMapper.insert(user);
+ result.put("success", true);
+ result.put("message", "用户创建成功");
+ return result;
+ }
+ //直接删除用户
+ public Map<String, Object> DeleteUser(String username){
+ Map<String, Object> result = new HashMap<>();
+ userMapper.deleteByUsername(username);
+ result.put("success", true);
+ result.put("message", "用户删除成功");
+ return result;
+ }
+
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 749faf7..cb8a7cc 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,14 +1,8 @@
spring.application.name=PT-houduan
spring.datasource.url=jdbc:mysql://localhost:3306/pt?useSSL=false&serverTimezone=Asia/Shanghai
-#spring.datasource.url=jdbc:mysql://host.docker.internal:3306/pt?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-# application.properties
-#spring.datasource.url=jdbc:mysql://202.205.102.121:3306/1group5?useSSL=false&serverTimezone=Asia/Shanghai
-#spring.datasource.username=team5
-#spring.datasource.password=Team5001#
-#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
hikari.maximum-pool-size = 20
hikari.minimum-idle = 5
hikari.idle-timeout = 30000
@@ -23,13 +17,20 @@
#logging.level.root=DEBUG
mybatis-plus.mapper-locations=classpath:mapper/xml/*.xml
mybatis-plus.type-aliases-package=com.pt5.pthouduan.entity
-
uploadDirectory= ./uploads/files # ????????
torrent-dir= ./uploads/torrents # ????????
# ??????
pt.storage.torrent-path=/var/pt/torrents
pt.storage.temp-path=/var/pt/temp
# application.properties ??
+# ????
+spring.mail.host=smtp.163.com # ?163????
+spring.mail.username=zhutai940@163.com
+spring.mail.password=Cmr2005#
+spring.mail.properties.mail.smtp.auth=true
+spring.mail.properties.mail.smtp.starttls.enable=true
+spring.mail.properties.mail.smtp.starttls.required=true
+
tracker.url=http://localhost:6969/announce
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
index 00c8354..18707e2 100644
--- a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
@@ -1,5 +1,4 @@
package com.pt5.pthouduan.ControllerTest;
-
import com.pt5.pthouduan.controller.UserController;
import com.pt5.pthouduan.entity.User;
import com.pt5.pthouduan.service.UserService;
@@ -14,7 +13,8 @@
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;
class UserControllerTest {
@@ -30,193 +30,103 @@
MockitoAnnotations.openMocks(this);
}
- // 注册测试
+ // 测试注册功能
@Test
- void register_ShouldCallServiceWithCorrectParameters() {
- // 准备测试数据
- User testUser = new User(1L,"");
- testUser.setUsername("testUser");
- String testCode = "123456";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", true);
- expectedResponse.put("message", "注册成功");
+ void register_ShouldReturnSuccess() {
+ User user = new User(0L,"1");
+ user.setUsername("testUser");
+ Map<String, Object> expected = new HashMap<>();
+ expected.put("status", "success");
- // 模拟服务行为
- when(userService.register(any(User.class), anyString())).thenReturn(expectedResponse);
+ when(userService.register(any(User.class), anyString(), anyString()))
+ .thenReturn(expected);
- // 执行测试
- Map<String, Object> actualResponse = userController.register(testUser, testCode);
+ Map<String, Object> result = userController.register(user, "INVITE123", "EMAIL456");
- // 验证行为
- verify(userService, times(1)).register(testUser, testCode);
-
- // 验证结果
- assertEquals(expectedResponse, actualResponse);
+ assertEquals(expected, result);
+ verify(userService, times(1)).register(any(), anyString(), anyString());
}
- // 登录测试
+ // 测试登录功能
@Test
- void login_ShouldReturnSuccessWhenCredentialsAreValid() {
- // 准备测试数据
- String username = "testUser";
- String password = "correctPassword";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", true);
- expectedResponse.put("token", "sampleToken");
+ void login_ShouldReturnToken() {
+ Map<String, Object> expected = new HashMap<>();
+ expected.put("token", "mockToken123");
- // 模拟服务行为
- when(userService.login(eq(username), eq(password))).thenReturn(expectedResponse);
+ when(userService.login("testUser", "password123"))
+ .thenReturn(expected);
- // 执行测试
- Map<String, Object> actualResponse = userController.login(username, password);
+ Map<String, Object> result = userController.login("testUser", "password123");
- // 验证行为
- verify(userService, times(1)).login(username, password);
-
- // 验证结果
- assertEquals(expectedResponse, actualResponse);
- assertTrue((Boolean) actualResponse.get("success"));
- assertNotNull(actualResponse.get("token"));
+ assertEquals(expected, result);
+ assertNotNull(result.get("token"));
}
- // 计算等级测试
+ // 测试获取用户信息
@Test
- void calgrade_ShouldReturnUserGrade() {
- // 准备测试数据
- String username = "testUser";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("grade", 5);
- expectedResponse.put("exp", 1200);
+ void getUserInfo_ShouldReturnUserData() {
+ Map<String, Object> expected = new HashMap<>();
+ expected.put("username", "testUser");
+ expected.put("email", "test@example.com");
- // 模拟服务行为
- when(userService.CalGrade(eq(username))).thenReturn(expectedResponse);
+ when(userService.UserInfo("testUser"))
+ .thenReturn(expected);
- // 执行测试
- Map<String, Object> actualResponse = userController.calgrade(username);
+ Map<String, Object> result = userController.getuser("testUser");
- // 验证行为
- verify(userService, times(1)).CalGrade(username);
-
- // 验证结果
- assertEquals(5, actualResponse.get("grade"));
- assertEquals(1200, actualResponse.get("exp"));
+ assertEquals("testUser", result.get("username"));
+ assertEquals("test@example.com", result.get("email"));
}
- // 修改性别测试
+ // 测试修改密码
@Test
- void changesex_ShouldUpdateUserSex() {
- // 准备测试数据
- String username = "testUser";
- String newSex = "male";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", true);
- expectedResponse.put("message", "性别更新成功");
+ void changePassword_ShouldHandleSuccess() {
+ Map<String, Object> expected = new HashMap<>();
+ expected.put("message", "Password updated");
- // 模拟服务行为
- when(userService.changesex(eq(username), eq(newSex))).thenReturn(expectedResponse);
+ when(userService.changePassword("testUser", "oldPass", "newPass"))
+ .thenReturn(expected);
- // 执行测试
- Map<String, Object> actualResponse = userController.changsex(username, newSex);
+ Map<String, Object> result = userController.changePassword(
+ "testUser", "oldPass", "newPass");
- // 验证行为
- verify(userService, times(1)).changesex(username, newSex);
-
- // 验证结果
- assertTrue((Boolean) actualResponse.get("success"));
- assertEquals("性别更新成功", actualResponse.get("message"));
+ assertEquals("Password updated", result.get("message"));
}
- // 修改头像测试
+ // 测试异常情况
@Test
- void changeimage_ShouldUpdateUserImage() {
- // 准备测试数据
- String username = "testUser";
- String newImage = "newImageUrl";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", true);
- expectedResponse.put("message", "头像更新成功");
+ void login_ShouldHandleFailure() {
+ when(userService.login("wrongUser", "wrongPass"))
+ .thenThrow(new RuntimeException("Invalid credentials"));
- // 模拟服务行为
- when(userService.changeImage(eq(username), eq(newImage))).thenReturn(expectedResponse);
-
- // 执行测试
- Map<String, Object> actualResponse = userController.changeimage(username, newImage);
-
- // 验证行为
- verify(userService, times(1)).changeImage(username, newImage);
-
- // 验证结果
- assertTrue((Boolean) actualResponse.get("success"));
- assertEquals("头像更新成功", actualResponse.get("message"));
+ assertThrows(RuntimeException.class, () -> {
+ userController.login("wrongUser", "wrongPass");
+ });
}
- // 修改密码测试
+ // 测试空参数情况
@Test
- void changePassword_ShouldReturnSuccessWhenOldPasswordIsCorrect() {
- // 准备测试数据
- String username = "testUser";
- String oldPassword = "correctOldPassword";
- String newPassword = "newSecurePassword";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", true);
- expectedResponse.put("message", "密码修改成功");
+ void getUserInfo_ShouldHandleNullUsername() {
+ when(userService.UserInfo(null))
+ .thenReturn(Map.of("error", "Username required"));
- // 模拟服务行为
- when(userService.changePassword(eq(username), eq(oldPassword), eq(newPassword)))
- .thenReturn(expectedResponse);
+ Map<String, Object> result = userController.getuser(null);
- // 执行测试
- Map<String, Object> actualResponse = userController.changePassword(username, oldPassword, newPassword);
-
- // 验证行为
- verify(userService, times(1)).changePassword(username, oldPassword, newPassword);
-
- // 验证结果
- assertTrue((Boolean) actualResponse.get("success"));
- assertEquals("密码修改成功", actualResponse.get("message"));
+ assertEquals("Username required", result.get("error"));
}
- // 获取用户信息测试
+ // 测试创建用户
@Test
- void getUserInfo_ShouldReturnUserInfo() {
- // 准备测试数据
- String username = "testUser";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("username", username);
- expectedResponse.put("email", "test@example.com");
+ void createUser_ShouldReturnUserId() {
+ User newUser = new User(0L,"1");
+ newUser.setUsername("newUser");
+ Map<String, Object> expected = Map.of("userId", 123);
- // 模拟服务行为
- when(userService.login(eq(username), eq(""))).thenReturn(expectedResponse);
+ when(userService.CreateUser(any(User.class)))
+ .thenReturn(expected);
- // 执行测试
- Map<String, Object> actualResponse = userController.getUserInfo(username);
+ Map<String, Object> result = userController.creatUser(newUser);
- // 验证行为
- verify(userService, times(1)).login(username, "");
-
- // 验证结果
- assertEquals(username, actualResponse.get("username"));
- assertEquals("test@example.com", actualResponse.get("email"));
- }
-
- // 异常情况测试
- @Test
- void login_ShouldReturnFailureWhenCredentialsAreInvalid() {
- // 准备测试数据
- String username = "testUser";
- String wrongPassword = "wrongPassword";
- Map<String, Object> expectedResponse = new HashMap<>();
- expectedResponse.put("success", false);
- expectedResponse.put("message", "用户名或密码错误");
-
- // 模拟服务行为
- when(userService.login(eq(username), eq(wrongPassword))).thenReturn(expectedResponse);
-
- // 执行测试
- Map<String, Object> actualResponse = userController.login(username, wrongPassword);
-
- // 验证结果
- assertFalse((Boolean) actualResponse.get("success"));
- assertEquals("用户名或密码错误", actualResponse.get("message"));
+ assertEquals(123, result.get("userId"));
}
}