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