diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index 2304567..b92d18d 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -31,8 +31,8 @@
     public int GetUserAvailableInviteTimes(String userid);//获取用户的剩余邀请次数
     public int InviteUser(String inviterid,String inviteemail);//邀请用户，返回状态：0 success，1 重复，2其他原因
 
-    public boolean AddCollect(String userid,String postid);//添加一个收藏，返回状态：0 success，1 不存在,2其他原因
-    public boolean DeleteCollect(String userid,String postid);//删除一个收藏，返回状态：0 success，1 不存在,2其他原因
+    public boolean AddCollect(String userid,String seedid);//添加一个收藏，返回状态：0 success，1 不存在,2其他原因
+    public boolean DeleteCollect(String userid,String seedid);//删除一个收藏，返回状态：0 success，1 不存在,2其他原因
     
 
 
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 9304fa5..ae1fe94 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -1,5 +1,474 @@
 package database;
 
-// public class Database1 implements DataManagerInterface {
+// import java.lang.invoke.TypeDescriptor;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import com.querydsl.jpa.impl.JPAQuery;
+
+import entity.BegInfo;
+import entity.Notice;
+import entity.Post;
+import entity.Profile;
+import entity.QNotice;
+import entity.QSeed;
+import entity.QUser;
+import entity.QUserPT;
+import entity.QUserStar;
+import entity.Seed;
+import entity.User;
+import entity.UserPT;
+import entity.UserStar;
+
+public class Database1 implements DataManagerInterface {
+    @PersistenceContext
+    private EntityManager entitymanager;
+
+    // 返回状态：0 success，1 邮箱重复，2其他原因
+    @Override
+    public int RegisterUser(User userinfo){
+        try{
+            JPAQuery<String> query = new JPAQuery<>(entitymanager);
+            QUser u = QUser.user;
+            List<String> allEmails = query.select(u.email).from(u).fetch();
+
+            if(allEmails.contains(userinfo.email)){
+                return 1;
+            }
+            entitymanager.persist(userinfo);
+            return 0;
+
+        }catch(Exception e){
+            e.printStackTrace();
+            return 2;
+        }
+        
+    }
+
+    // 返回状态：0 success，1 不存在，2其他原因
+    @Override
+    public int UpdateInformation(User userinfo){
+        try {
+            if (userinfo.userid == null) {
+                return 2; // userid为null直接返回错误
+            }
+            JPAQuery<User> query = new JPAQuery<>(entitymanager);
+            QUser u = QUser.user;
+            User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
+
+            if(updateUser == null){
+                return 1;
+            }
+            // 只更新需要的字段，避免破坏持久化状态和关联关系
+            updateUser.email = userinfo.email;
+            updateUser.username = userinfo.username;
+            updateUser.password = userinfo.password;
+            updateUser.sex = userinfo.sex;
+            updateUser.school = userinfo.school;
+            updateUser.pictureurl = userinfo.pictureurl;
+            updateUser.profile = userinfo.profile;
+            updateUser.accountstate = userinfo.accountstate;
+            updateUser.invitetimes = userinfo.invitetimes;
+            // 如有其他字段也一并赋值
+            entitymanager.merge(updateUser);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+        
+    }
+
+    // 返回用户的全部基本信息
+    @Override
+    public User GetInformation(String userid){
+        User user = entitymanager.find(User.class, userid);
+        return user;
+    }
+
+    //返回用户的全部pt站信息
+    @Override
+    public UserPT GetInformationPT(String userid){
+        UserPT userPT = entitymanager.find(UserPT.class, userid);
+        return userPT;
+    }
+
+    //返回状态：0 success，1 邮箱重复，2其他原因
+    @Override
+    public int UpdateInformationPT(UserPT userinfo){
+        try{
+            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
+            QUserPT u = QUserPT.userPT;
+            UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
+        
+            if(userPT == null){
+                return 1;
+            }
+            userPT = userinfo;
+            entitymanager.merge(userPT);
+            return 0;
+
+        }catch(Exception e){
+            e.printStackTrace();
+            return 2;
+        }
+    }
+
+    //返回状态：0 success，1 id重复，2其他原因
+    @Override
+    public int RegisterUserPT(UserPT userinfo){
+        try {
+            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
+            QUserPT u = QUserPT.userPT;
+            UserPT checkUserPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
+            if (checkUserPT != null) {
+                return 1;
+            }
+            entitymanager.persist(userinfo);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+    }
+
+    //返回种子的全部信息
+    @Override
+    public Seed GetSeedInformation(String seedid){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
+        return seed;
+    }
+
+    //添加一个新的种子，0成功，其他失败信息待定;
+    @Override
+    public int RegisterSeed(Seed seedinfo){
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+            QSeed s = QSeed.seed;
+            Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
+            if (seed != null) {
+                return 1;
+            }
+            entitymanager.persist(seedinfo);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+    }
+
+    //接收新的种子然后更新其全部属性
+    @Override
+    public int UpdateSeed(Seed seedinfo){
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+            QSeed s = QSeed.seed;
+            Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
+            if (seed == null) {
+                return 1;
+            }
+            seed = seedinfo;
+            entitymanager.merge(seed);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+    }
+
+    //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
+    @Override
+    public Seed[] SearchSeed(String userQ){
+        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        List<Seed> seeds = query.select(s).from(s).fetch();
+
+        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+            return seeds.toArray(new Seed[0]);
+        }
+
+        String processedQuery = userQ.toLowerCase().trim();
+        Map<Seed, Integer> seedCountMap = new HashMap<>();
+        for(Seed seed : seeds){
+            String title = seed.title.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            seedCountMap.put(seed, count);
+        }
+        seeds.sort((s1, s2) -> {
+            int count1 = seedCountMap.getOrDefault(s1, 0);
+            int count2 = seedCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return seeds.toArray(new Seed[0]);
+    }
+
+    //计算字符串公共字符数量
+    private int countCommonCharacter(String str1, String str2){
+        Map<Character, Integer> map1 = new HashMap<>();
+        Map<Character, Integer> map2 = new HashMap<>();
+
+        for(char c : str1.toCharArray()){
+            if (!Character.isWhitespace(c)) {
+                map1.put(c, map1.getOrDefault(c, 0) + 1);
+            }
+        }
+
+        for(char c : str2.toCharArray()){
+            if (!Character.isWhitespace(c)) {
+                map2.put(c, map2.getOrDefault(c, 0) + 1);
+            }
+        }
+
+        int res = 0;
+        for(char c : map1.keySet()){
+            if (map2.containsKey(c)) {
+                res += Math.min(map1.get(c), map2.get(c));
+            }
+            
+        }
+        return res;
+    }
+
+    //返回状态：0 success，1 重复，2其他原因
+    @Override
+    public int AddNotice(Notice notice){
+        try {
+            JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
+            QNotice n = QNotice.notice;
+            Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
+            if (checkNotice != null) {
+                return 1;
+            }
+            
+            entitymanager.persist(notice);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+        
+    }
+
+    //返回状态：0 success，1 不存在，2其他原因
+    @Override
+    public boolean UpdateNotice(Notice notice){
+        try {
+            Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
+            if (oldNotice == null) {
+                return false;
+            }
+            oldNotice = notice;
+            entitymanager.merge(oldNotice);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    //删除公告，返回状态：0 success，1 不存在，2其他原因
+    @Override
+    public boolean DeleteNotice(String noticeid){
+        try {
+            Notice notice = entitymanager.find(Notice.class, noticeid);
+            if (notice == null) {
+                return false;
+            }
+            entitymanager.remove(notice);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        
+    }
+
+    //获取用户的剩余邀请次数
+    public int GetUserAvailableInviteTimes(String userid){
+        try {
+            JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
+            QUser u = QUser.user;
+            int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
+            
+            return invite_left;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+        
+    }
+
+    //邀请用户，返回状态：0 success，1 剩余次数不足，2,3其他原因
+    @Override
+    public int InviteUser(String inviterid,String inviteemail){
+        try {
+            User user = entitymanager.find(User.class, inviterid);
+            if (user == null || !user.email.equals(inviteemail)) {
+                return 3;
+            }
+            if (user.invitetimes <= 0) {
+                return 1;
+            }
+            user.invitetimes -= 1;
+            entitymanager.merge(user);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        }
+        
+    }
+
+    //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
+    @Override
+    public boolean AddCollect(String userid,String seedid){
+        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)) {
+            return false;
+        }
+        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){
+        try {
+            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.remove(userStar);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        
+    }
+
+    @Override
+    public int AddBegSeed(BegInfo info){
+        return 0;
+    }
+
+    @Override
+    public int UpdateBegSeed(BegInfo info){
+        return 0;
+    }
+
+    @Override
+    public int DeleteBegSeed(String begid){
+        return 0;
+    }
+
+    @Override
+    public int VoteSeed(String begId, String seedId, String userId){
+        return 0;
+    }
+
+    @Override
+    public int SubmitSeed(String begid,Seed seed){
+        return 0;
+    }
+
+    @Override
+    public void SettleBeg(){
+        
+    }
+
+    @Override
+    public int AddPost(Post post){
+        return 0;
+    }
+
+    @Override
+    public int UpdatePost(Post post){
+        return 0;
+    }
+
+    @Override
+    public int DeletePost(String postid){
+        return 0;
+    }
+
+    @Override
+    public int AddComment(String postid, String userid, String comment){
+        return 0;
+    }
+
+    @Override
+    public int DeleteComment(String postid,String commentid){
+        return 0;
+    }
+
+    @Override
+    public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量，返回状态：0 success，1 不存在,2其他原因
+    {
+        return true;
+    }
     
-// }
+    @Override
+    public boolean ExchangeMagicToDownload(String userid,int magic)
+    {
+        return true;
+    }//将魔力值兑换为下载量，返回状态：0 success，1 不存在,2其他原因
+
+    @Override
+    public boolean ExchangeMagicToVip(String userid,int magic){
+        return true;
+    }
+    //将魔力值兑换为VIP次数，返回状态：0 success，1 不存在,2其他原因
+
+    @Override
+    public boolean UploadTransmitProfile(Profile profile){
+        return true;
+    }
+
+    @Override
+    public Profile GetTransmitProfile(String profileid){
+        Profile profile = new Profile();
+        return profile;
+    }
+    //获取迁移信息
+    
+    @Override
+    public boolean ExamTransmitProfile(String profileid,boolean result){
+        return true;
+    }
+    //审核迁移信息,0成功，1失败
+    @Override
+    public Profile[] GetTransmitProfileList(){
+        return new Profile[0];
+    }
+    //获取所有迁移信息
+
+}
+
