修改login,register逻辑

Change-Id: If07481bce426e50165c4005416fa9911b218aee4
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;
     }
diff --git a/src/main/java/entity/UserInvite.java b/src/main/java/entity/UserInvite.java
new file mode 100644
index 0000000..b9c1c3b
--- /dev/null
+++ b/src/main/java/entity/UserInvite.java
@@ -0,0 +1,29 @@
+package entity;
+
+import java.io.Serializable;
+
+import javax.persistence.*;
+import com.querydsl.core.annotations.QueryEntity;
+
+@QueryEntity
+@Entity
+@Table(name = "UserInvite")
+@IdClass(UserInviteId.class)
+public class UserInvite implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "user_id")
+    public String userId;
+
+    @Id
+    @Column(name = "inviter_email")
+    public String inviterEmail;
+
+    @Column(name = "inviter_registered")
+    public boolean inviterRegistered;
+
+    @ManyToOne
+    @JoinColumn(name = "user_id", insertable = false, updatable = false)
+    public User user;
+}
diff --git a/src/main/java/entity/UserInviteId.java b/src/main/java/entity/UserInviteId.java
new file mode 100644
index 0000000..adf729a
--- /dev/null
+++ b/src/main/java/entity/UserInviteId.java
@@ -0,0 +1,33 @@
+package entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class UserInviteId implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public String userId;
+    public String inviterEmail;
+
+    public UserInviteId() {
+    }
+
+    public UserInviteId(String userId, String inviterEmail) {
+        this.userId = userId;
+        this.inviterEmail = inviterEmail;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        UserInviteId that = (UserInviteId) o;
+        return Objects.equals(userId, that.userId) &&
+               Objects.equals(inviterEmail, that.inviterEmail);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(userId, inviterEmail);
+    }
+}
diff --git a/src/main/java/tracker/DataCaptureProxy.java b/src/main/java/tracker/DataCaptureProxy.java
index 4d2737f..be7d9f6 100644
--- a/src/main/java/tracker/DataCaptureProxy.java
+++ b/src/main/java/tracker/DataCaptureProxy.java
@@ -16,10 +16,12 @@
 
     private final String trackerHost;
     private final int    trackerPort;
+    private final Tracker tracker;
 
     public DataCaptureProxy(String trackerHost, int trackerPort) {
         this.trackerHost = trackerHost;
         this.trackerPort = trackerPort;
+        this.tracker = new Tracker(); // 初始化Tracker实例
     }
 
     @Override
@@ -37,6 +39,27 @@
                 ", passkey=" + passkey
             );
 
+            // 调用Tracker方法更新上传和下载数据
+            if (passkey != null && !passkey.isEmpty()) {
+                try {
+                    if (uploaded != null && !uploaded.isEmpty()) {
+                        int uploadValue = Integer.parseInt(uploaded);
+                        if (uploadValue > 0) {
+                            tracker.AddUpLoad(passkey, uploadValue);
+                        }
+                    }
+                    
+                    if (downloaded != null && !downloaded.isEmpty()) {
+                        int downloadValue = Integer.parseInt(downloaded);
+                        if (downloadValue > 0) {
+                            tracker.AddDownload(passkey, downloadValue);
+                        }
+                    }
+                } catch (NumberFormatException e) {
+                    System.err.println("Error parsing upload/download values: " + e.getMessage());
+                }
+            }
+
             // 构造转发 URL
             String path  = req.getPath().getPath();
             String query = req.getQuery().toString();
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
index e026146..2ae459c 100644
--- a/src/main/resources/META-INF/persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -25,6 +25,7 @@
         <class>entity.PostReply</class>

         <class>entity.TransRecord</class>

         <class>entity.SubmitSeed</class>

+        <class>entity.UserInvite</class>

        <!-- 数据库连接配置 -->

         <properties>

             <property name="javax.persistence.jdbc.url" value="${DB_URL}"/>