diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index b02f4a6..0c4dc7d 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -1,13 +1,17 @@
 package database;
 
 import entity.BegInfo;
+import entity.BegSeedDetail;
 import entity.Notice;
 import entity.Post;
 import entity.Profile;
 import entity.Seed;
 import entity.User;
 import entity.UserPT;
+import entity.UserStar;
 import entity.PostReply;
+import entity.SeedWithVotes;
+import java.io.File;
 public interface DataManagerInterface{
 //DB1
 
@@ -38,7 +42,9 @@
 
     public boolean AddCollect(String userid,String seedid);//添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     public boolean DeleteCollect(String userid,String seedid);//删除一个收藏，返回状态：0 success，1 不存在,2其他原因
-    
+    public UserStar[] GetUserStarList(String userid);//获取用户的收藏列表
+
+    public int CheckAdmin(String userid);//检查用户是否为管理员，返回状态：0 success，1 不存在,2其他原因
 
 
 // ----------------------------------------------------------------------------------------------------
@@ -50,6 +56,11 @@
     public int VoteSeed(String begId, String seedId, String userId);//求种结果投票，返回状态：0 success，1 重复，2其他原因
     public int SubmitSeed(String begid,Seed seed);//提交种子，返回状态：0 success，1 重复，2其他原因
     public void SettleBeg();//结算所有求种信息，求种信息中需要增加Beg截止日期，默认14天，期间投票>的则Beg成功，否则Beg失败，并发放对应奖励
+    public BegSeedDetail[] GetBegList();//获取所有求种信息（包含BegSeed表内容和BegInfo的Info字段）
+    public BegInfo GetBegDetail(String begid);//获取一个求种信息的详细信息
+    public BegSeedDetail GetBegSeedDetail(String begid);//获取一个求种信息的详细信息（包含BegSeed表数据和BegInfo表的Info字段）
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid);//获取一个求种信息下的种子列表（包含投票信息）
+    public int SubmitBegSeed(String begid, String seedid, String userid);//提交一个种子到求种信息中，返回状态：0 success，1 重复，2其他原因
 
     public Post[] SearchPost(String userQ);//传入搜索的关键词或句子，返回搜索到的帖子信息（按照公共字符数量排序）
     public Post[] GetPostList();//获取用户的帖子列表
@@ -72,5 +83,7 @@
     public Profile GetTransmitProfile(String profileid);//获取迁移信息
     public boolean ExamTransmitProfile(String profileid,boolean result);//审核迁移信息,0成功，1失败
     public Profile[] GetTransmitProfileList();//获取所有迁移信息
-
+    public int InviteNewUser(String inviterid, String invitedemail);//邀请新用户，返回状态：0 success，1 重复，2其他原因
+    public int UploadMigration(String userid, File file);
+    public int createBagSeed(BegInfo begInfo, String userid, String info);
 }   
\ No newline at end of file
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index b91e471..26ddc29 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -4,8 +4,14 @@
 import java.util.UUID;
 import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -17,10 +23,14 @@
 import com.querydsl.core.Tuple;
 
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Notice;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.SeedWithVotes;
+import entity.QAdmin;
 import entity.QBegInfo;
 import entity.QNotice;
 import entity.QProfile;
@@ -40,6 +50,12 @@
 import entity.PostReply;
 import entity.QPostReply;
 import entity.UserInvite;
+import entity.QAdmin;
+import entity.UserStar;
+import entity.QUserStar;
+import entity.SubmitSeed;
+import entity.SubmitSeedId;
+
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -210,8 +226,16 @@
     @Override
     public UserPT GetInformationPT(String userid){
         EntityManager entitymanager = createEntityManager();
-        UserPT userPT = entitymanager.find(UserPT.class, userid);
-        return userPT;
+        try {
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return null; // 用户PT信息不存在
+            }
+            return userPT;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null; // 出现异常，返回null
+        }
     }
 
     //返回状态：0 success，1 邮箱重复，2其他原因
@@ -527,8 +551,8 @@
     //邀请用户，返回状态：0 success，1 剩余次数不足，2,3其他原因
     @Override
     public int InviteUser(String inviterid,String inviteemail){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -537,61 +561,88 @@
                 return 1;
             }
             user.invitetimes -= 1;
+            entitymanager.getTransaction().begin();
             entitymanager.merge(user);
+            entitymanager.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
-        
     }
 
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
-        QUser u2 = QUser.user;
-        User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
-        if (user == null) {
-            return false;
-        }
-        JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
-        QSeed p = QSeed.seed;
-        Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
-        if (seed == null) {
-            return false;
-        }
-        JPAQuery<String> query = new JPAQuery<>(entitymanager);
-        QUserStar u = QUserStar.userStar;
-        List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
+        try {
+            JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
+            QUser u2 = QUser.user;
+            User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
+            if (user == null) {
+                return false;
+            }
+            JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
+            QSeed p = QSeed.seed;
+            Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
+            if (seed == null) {
+                return false;
+            }
+            JPAQuery<String> query = new JPAQuery<>(entitymanager);
+            QUserStar u = QUserStar.userStar;
+            List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
 
-        if (allSeedId.contains(seedid)) {
+            if (allSeedId.contains(seedid)) {
+                return false;
+            }
+            UserStar userStar = new UserStar();
+            userStar.userid = userid;
+            userStar.seedid = seedid;
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userStar);
+            entitymanager.getTransaction().commit();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
-        UserStar userStar = new UserStar();
-        userStar.userid = userid;
-        userStar.seedid = seedid;
-        entitymanager.persist(userStar);
-        return true;
     }
 
     //删除一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean DeleteCollect(String userid,String seedid){
+    public boolean DeleteCollect(String userid, String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
             if (userStar == null) {
                 return true; // 收藏不存在
             }
+            entitymanager.getTransaction().begin();
             entitymanager.remove(userStar);
+            entitymanager.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
         
     }
@@ -1199,7 +1250,7 @@
 
             // 1:1兑换，直接加上魔力值（假设单位是MB）
             userPT.magic -= magic;
-            userPT.upload += magic;
+            userPT.upload += magic * 10000000;
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1216,6 +1267,7 @@
             if (tx != null && tx.isActive()) {
                 tx.rollback();
             }
+            e.printStackTrace();
             logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
             return false;
         } finally {
@@ -1254,7 +1306,7 @@
 
             // 1:1兑换，直接减去魔力值对应的下载量（假设单位是MB）
             userPT.magic -= magic;
-            userPT.download = Math.max(0, userPT.download - magic);
+            userPT.download = Math.max(0, userPT.download - magic * 10000000);
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1308,7 +1360,7 @@
 
             // 1:1兑换VIP下载次数
             userPT.magic -= magic;
-            userPT.viptime += magic;
+            userPT.viptime += magic / 100;
 
             em.merge(userPT);
             tx.commit();
@@ -1456,10 +1508,13 @@
                     profile.uploadgived = String.valueOf(uploadToGive);
 
                     em.merge(userPT);
+                    em.merge(profile);
                 }
+            } else {
+                // 如果审核不通过，删除迁移申请
+                em.remove(profile);
+                logger.info("迁移申请 {} 审核不通过，已删除", profileid);
             }
-
-            em.merge(profile);
             tx.commit();
 
             logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
@@ -1509,19 +1564,35 @@
     @Override
     public Post[] GetPostList() {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
-        return posts.toArray(new Post[0]);
+        try{
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
+            return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
     public Post GetPost(String postid) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
-        return post;
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
+            return post;
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post();
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
@@ -1536,28 +1607,408 @@
     @Override
     public Post[] SearchPost(String postQ) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
 
-        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+                return posts.toArray(new Post[0]);
+            }
+
+            String processedQuery = postQ.toLowerCase().trim();
+            Map<Post, Integer> postCountMap = new HashMap<>();
+            for(Post post : posts){
+                String title = post.posttitle.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                postCountMap.put(post, count);
+            }
+            posts.sort((s1, s2) -> {
+                int count1 = postCountMap.getOrDefault(s1, 0);
+                int count2 = postCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("搜索帖子时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post search completed successfully.");
         }
-
-        String processedQuery = postQ.toLowerCase().trim();
-        Map<Post, Integer> postCountMap = new HashMap<>();
-        for(Post post : posts){
-            String title = post.posttitle.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            postCountMap.put(post, count);
-        }
-        posts.sort((s1, s2) -> {
-            int count1 = postCountMap.getOrDefault(s1, 0);
-            int count2 = postCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return posts.toArray(new Post[0]);
     }
-}
 
+    @Override
+    public int CheckAdmin(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<String> query = new JPAQuery<>(entitymanager);
+        QAdmin a = QAdmin.admin;
+        String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
+        if (adminId == null) {
+            logger.warn("用户 {} 不是管理员", userid);
+            return 1; // 用户不是管理员
+        } else {
+            logger.info("用户 {} 是管理员", userid);
+            return 0; // 用户是管理员
+        }
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            User user = entitymanager.find(User.class, inviterid);
+            if (user == null) {
+                return 3;
+            }
+            if (user.invitetimes <= 0) {
+                return 1;
+            }
+            user.invitetimes -= 1;
+
+            UserInvite invite = new UserInvite();
+            invite.userId = inviterid;
+            invite.inviterEmail = invitedemail;
+            invite.inviterRegistered = false;
+            invite.user = user;
+
+            entitymanager.getTransaction().begin();
+            entitymanager.merge(user);
+            entitymanager.persist(invite);
+            entitymanager.getTransaction().commit();
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return 2;
+        }
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return new UserStar[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
+            QUserStar us = QUserStar.userStar;
+            List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
+            return stars.toArray(new UserStar[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return new UserStar[0];
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file) {
+        if (userid == null || userid.isEmpty() || file == null) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+
+        try {
+            // 检查用户是否存在
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+
+            // 创建迁移记录
+            Profile migration = new Profile();
+            migration.profileurl = java.util.UUID.randomUUID().toString();
+            migration.userid = userid;
+            migration.uploadtogive = "0"; // 初始上传量为0
+            migration.magictogive = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.uploadgived = "0"; // 初始上传量为0
+            migration.magicgived = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.exampass = false; // 初始审核状态为未通过
+            migration.user = user;
+            Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = file.getName();
+            Path target = storageDir.resolve(migration.profileurl + "_" + filename);
+            Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+            migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(migration);
+            entitymanager.getTransaction().commit();
+
+            return 0; // 成功
+
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return new BegSeedDetail[0];
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            return begDetail;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return new SeedWithVotes[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            QSeed s = QSeed.seed;
+
+            List<Tuple> results = query.select(s, ss.votes)
+                    .from(ss)
+                    .join(ss.seed, s)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .fetch();
+
+            List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
+            for (Tuple result : results) {
+                Seed seed = result.get(s);
+                Integer votes = result.get(ss.votes);
+                seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
+            }
+
+            return seedsWithVotes.toArray(new SeedWithVotes[0]);
+        } catch (Exception e) {
+            return new SeedWithVotes[0];
+        } finally {
+            entitymanager.close();
+        }
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        EntityTransaction tx = entitymanager.getTransaction();
+
+        try {
+            tx.begin();
+            
+            // 检查种子信息是否存在
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if (seed == null || !seed.seeduserid.equals(userid)) {
+                return 1;
+            }
+
+            // int ret = SubmitSeed(begid, seed);
+            BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
+            if (begInfo == null) {
+                return 2;
+            }
+
+            // 检查种子是否已提交过
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
+                    .select(ss)
+                    .from(ss)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .where(ss.seed.seedid.eq(seed.seedid))
+                    .fetchOne();
+
+            submitSeed = new SubmitSeed();
+            submitSeed.begInfo = begInfo;
+            submitSeed.seed = seed;
+            submitSeed.votes = 0; // 初始投票数为0
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            if (begInfoDetail == null) {
+                return 1;
+            }
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(submitSeed);
+            entitymanager.getTransaction().commit();
+
+            // 创建提交记录
+            entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
+                    .setParameter(1, begid)
+                    .setParameter(2, seed.seedid)
+                    .executeUpdate();
+            return 0;
+
+        } catch (Exception e) {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            return 3; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+            if (begInfoDetail != null) {
+                return 1; // 已存在
+            }
+
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 2; // 用户不存在
+            }
+
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return 2; // 用户PT信息不存在
+            }
+
+            if (userPT.magic < begInfo.magic) {
+                return 3; // 魔力值不足
+            }
+
+            begInfoDetail = new BegInfoDetail();
+            begInfoDetail.begId = begInfo.begid;
+            begInfoDetail.info = info;
+            begInfoDetail.userId = userid;
+            begInfoDetail.user = user;
+            userPT.magic -= begInfo.magic; // 扣除魔力值
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userPT);
+            entitymanager.persist(begInfo);
+            entitymanager.persist(begInfoDetail);
+            entitymanager.getTransaction().commit();
+
+            return 0;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index 0166081..91dc8ff 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -3,9 +3,11 @@
 import java.util.Calendar;
 import java.util.UUID;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
 import java.util.HashMap;
+import java.io.File;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -25,9 +27,13 @@
 import entity.config;
 import entity.Notice;
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.UserStar;
+import entity.SeedWithVotes;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1121,4 +1127,108 @@
     public Post[] SearchPost(String userQ) {
         return null;
     }
+
+    @Override
+    public int CheckAdmin(String userid) {
+        return 0;
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        return 0;
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        return new UserStar[0];
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file){
+        return 0;
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            JPAQuery<BegInfo> query = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            logger.error("Error getting BegList: {}", e.getMessage(), e);
+            return new BegSeedDetail[0];
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        return null;
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            logger.error("Error getting BegSeedDetail: {}", e.getMessage(), e);
+            return null;
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        return new SeedWithVotes[0];
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        return 0;
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        return 0;
+    }
 }
\ No newline at end of file
