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> &lt;!&ndash; 使用最新稳定版本 &ndash;&gt;-->
-<!--        </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> &lt;!&ndash; 使用最新稳定版本 &ndash;&gt; -->
+        <!--         </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 47dcfc9..c3bc827 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/UserMapper.java
@@ -22,6 +22,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);
 
@@ -86,4 +89,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 e817f91..f1c382a 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,7 +17,6 @@
 #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 # ????????
 # ??????
@@ -41,6 +34,14 @@
 spring.web.resources.static-locations=file:./postimgs/
 
 # 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"));
     }
 }
