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 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"));
     }
 }
