diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index e737daa..e2fb1fb 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -11,6 +11,7 @@
 //DB1
 
     public int RegisterUser(User userinfo);// 返回状态：0 success，1 邮箱重复，2其他原因
+    public String LoginUser(User userinfo);
     public int UpdateInformation(User userinfo);// 返回状态：0 success，1 不存在，2其他原因
     public User GetInformation(String userid);// 返回用户的全部基本信息
 
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index ed64717..b89dc18 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -19,6 +19,7 @@
 import entity.QUser;
 import entity.QUserPT;
 import entity.QUserStar;
+import entity.QUserInvite;
 import entity.Seed;
 import entity.User;
 import entity.UserPT;
@@ -38,23 +39,85 @@
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
         this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
     }
+    @Override
+    public String LoginUser(User userinfo){
+        try {
+            // 检查传入的参数是否合法
+            if (userinfo == null || userinfo.password == null) {
+                return null;
+            }
+            
+            // 用户名和邮箱应该有且仅有一个不为空
+            boolean hasUsername = userinfo.username != null && !userinfo.username.isEmpty();
+            boolean hasEmail = userinfo.email != null && !userinfo.email.isEmpty();
+            
+            // 如果两个都为空或两个都不为空，返回null
+            if ((!hasUsername && !hasEmail) || (hasUsername && hasEmail)) {
+                return null;
+            }
+            
+            JPAQuery<User> query = new JPAQuery<>(entitymanager);
+            QUser u = QUser.user;
+            User foundUser = null;
+            
+            if (hasUsername) {
+                // 通过用户名和密码查找
+                foundUser = query.select(u)
+                    .from(u)
+                    .where(u.username.eq(userinfo.username)
+                        .and(u.password.eq(userinfo.password)))
+                    .fetchOne();
+            } else {
+                // 通过邮箱和密码查找
+                foundUser = query.select(u)
+                    .from(u)
+                    .where(u.email.eq(userinfo.email)
+                        .and(u.password.eq(userinfo.password)))
+                    .fetchOne();
+            }
+            
+            // 如果找到匹配的用户则返回用户ID，否则返回null
+            return foundUser != null ? foundUser.userid : null;
+            
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
 
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
     public int RegisterUser(User userinfo){
         try{
+            // 首先检查该邮箱是否在UserInvite表中被邀请过
+            JPAQuery<String> inviteQuery = new JPAQuery<>(entitymanager);
+            QUserInvite ui = QUserInvite.userInvite;
+            List<String> invitedEmails = inviteQuery.select(ui.inviterEmail).from(ui).fetch();
+
+            // 如果邮箱不在被邀请列表中，拒绝注册
+            if(!invitedEmails.contains(userinfo.email)){
+                return 2; // 未被邀请
+            }
+
+            // 检查邮箱是否已在User表中存在
             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;
+                return 1; // 邮箱重复
             }
+            
+            entitymanager.getTransaction().begin();
             entitymanager.persist(userinfo);
-            return 0;
+            entitymanager.getTransaction().commit();
+            return 0; // 注册成功
 
         }catch(Exception e){
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
         
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index 5152e47..d2d98c7 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -53,6 +53,11 @@
     }
 
     @Override
+    public String LoginUser(User userinfo){
+        return null;
+    }
+
+    @Override
     public int RegisterUser(User userinfo) {
         return 0;
     }
