fix:更改项目结构

Change-Id: Ie016cb16e71b5d2539cdd19c835d1a38a6442ee4
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivity.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivity.java
new file mode 100644
index 0000000..ce2f706
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivity.java
@@ -0,0 +1,27 @@
+package com.ruoyi.authentication.domain;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SysActivity extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long activityId;
+    private String activityName;
+    private Integer rewardBonus;
+    private String conditionValue; // 上传:如“100GB”,下载:torrent_id
+    private Date startTime;
+    private Date endTime;
+    private Integer status; // 1=进行中,0=已结束
+    private String activityType; // UPLOAD, DOWNLOAD
+
+    @Data
+    public static class LeaderboardEntry {
+        private Long userId;
+        private String userName;
+        private Integer score;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivityRecord.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivityRecord.java
new file mode 100644
index 0000000..6a85303
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysActivityRecord.java
@@ -0,0 +1,17 @@
+package com.ruoyi.authentication.domain;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SysActivityRecord extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long recordId;
+    private Long activityId;
+    private Long userId;
+    private Integer rewardBonus;
+    private Date completeTime;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserInvite.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserInvite.java
similarity index 85%
rename from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserInvite.java
rename to ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserInvite.java
index 3432587..984f485 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserInvite.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/SysUserInvite.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.domain;
+package com.ruoyi.authentication.domain;
 
 import com.ruoyi.common.core.domain.BaseEntity;
 import lombok.Data;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java
index f7049d1..eb60ec5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/domain/UserScore.java
@@ -1,11 +1,11 @@
 package com.ruoyi.authentication.domain;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
 
 /**
  * 【请填写功能名称】对象 user_score
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityMapper.java
new file mode 100644
index 0000000..5716e95
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityMapper.java
@@ -0,0 +1,13 @@
+package com.ruoyi.authentication.mapper;
+
+import com.ruoyi.authentication.domain.SysActivity;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface SysActivityMapper {
+    List<SysActivity> selectActivityList(SysActivity activity);
+    SysActivity selectActivityById(Long activityId);
+    List<SysActivity.LeaderboardEntry> selectLeaderboard();
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityRecordMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityRecordMapper.java
new file mode 100644
index 0000000..87cf1a2
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysActivityRecordMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.authentication.mapper;
+
+import com.ruoyi.authentication.domain.SysActivityRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysActivityRecordMapper {
+    SysActivityRecord checkParticipation(Long activityId, Long userId);
+    int insertActivityRecord(SysActivityRecord record);
+    int checkTorrentDownload(Long userId, String torrentId);
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserInviteMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserInviteMapper.java
new file mode 100644
index 0000000..93f1af0
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/SysUserInviteMapper.java
@@ -0,0 +1,10 @@
+package com.ruoyi.authentication.mapper;
+
+import com.ruoyi.authentication.domain.SysUserInvite;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserInviteMapper {
+    SysUserInvite selectInviteByUserId(Long userId);
+    SysUserInvite selectInviteByCode(String code);
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java
index 4c15e5e..6a704a5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/mapper/UserScoreMapper.java
@@ -1,7 +1,9 @@
 package com.ruoyi.authentication.mapper;
 
-import java.util.List;
 import com.ruoyi.authentication.domain.UserScore;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * 【请填写功能名称】Mapper接口
@@ -9,6 +11,7 @@
  * @author ruoyi
  * @date 2025-04-25
  */
+@Mapper
 public interface UserScoreMapper 
 {
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysActivityService.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysActivityService.java
new file mode 100644
index 0000000..985fa28
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysActivityService.java
@@ -0,0 +1,12 @@
+package com.ruoyi.authentication.service;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.authentication.domain.SysActivity;
+
+import java.util.List;
+
+public interface ISysActivityService {
+    List<SysActivity> selectActivityList(SysActivity activity);
+    AjaxResult participateActivity(Long activityId, Long userId);
+    List<SysActivity.LeaderboardEntry> getLeaderboard();
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserInviteService.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserInviteService.java
new file mode 100644
index 0000000..bb71552
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/ISysUserInviteService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.authentication.service;
+
+import com.ruoyi.authentication.domain.SysUserInvite;
+
+public interface ISysUserInviteService {
+    SysUserInvite getInviteCode(Long userId);
+    SysUserInvite getUserByInviteCode(String code);
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java
index b93e41e..b8fce0e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/IUserScoreService.java
@@ -1,9 +1,9 @@
 package com.ruoyi.authentication.service;
 
-import java.util.List;
-
 import com.ruoyi.authentication.domain.UserScore;
 
+import java.util.List;
+
 /**
  * 【请填写功能名称】Service接口
  * 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysActivityServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysActivityServiceImpl.java
new file mode 100644
index 0000000..fe82294
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysActivityServiceImpl.java
@@ -0,0 +1,141 @@
+package com.ruoyi.authentication.service.impl;
+
+import com.ruoyi.authentication.domain.UserScore;
+import com.ruoyi.authentication.service.IUserScoreService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.authentication.domain.SysActivity;
+import com.ruoyi.authentication.domain.SysActivityRecord;
+import com.ruoyi.system.domain.SysUserMessage;
+import com.ruoyi.authentication.mapper.SysActivityMapper;
+import com.ruoyi.authentication.mapper.SysActivityRecordMapper;
+import com.ruoyi.authentication.service.ISysActivityService;
+import com.ruoyi.system.service.ISysUserMessageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class SysActivityServiceImpl implements ISysActivityService {
+    @Autowired
+    private SysActivityMapper activityMapper;
+    @Autowired
+    private SysActivityRecordMapper activityRecordMapper;
+    @Autowired
+    private IUserScoreService userScoreService;
+    @Autowired
+    private ISysUserMessageService messageService;
+
+    @Override
+    public List<SysActivity> selectActivityList(SysActivity activity) {
+        return activityMapper.selectActivityList(activity);
+    }
+
+    @Override
+    @Transactional
+    public AjaxResult participateActivity(Long activityId, Long userId) {
+        SysActivity activity = activityMapper.selectActivityById(activityId);
+        if (activity == null || activity.getStatus() == 0) {
+            return AjaxResult.error("活动不存在或已结束");
+        }
+        if (activity.getEndTime() != null && activity.getEndTime().before(new Date())) {
+            return AjaxResult.error("活动已过期");
+        }
+        if (activityRecordMapper.checkParticipation(activityId, userId) != null) {
+            return AjaxResult.error("已参与过该活动");
+        }
+
+        // 验证任务完成
+        boolean completed = checkTaskCompletion(activity, userId);
+        if (!completed) {
+            return AjaxResult.error("未满足任务条件");
+        }
+
+        // 记录参与
+        SysActivityRecord record = new SysActivityRecord();
+        record.setActivityId(activityId);
+        record.setUserId(userId);
+        record.setRewardBonus(activity.getRewardBonus());
+        activityRecordMapper.insertActivityRecord(record);
+
+        // 更新积分(仅更新 bonus,score 由生成列自动计算)
+        UserScore userScore = userScoreService.selectUserScoreByUserId(userId);
+        if (userScore != null) {
+            userScore.setBonus(userScore.getBonus() + activity.getRewardBonus().longValue()); // Integer 转 Long
+            userScoreService.updateUserScore(userScore);
+        } else {
+            userScore = new UserScore();
+            userScore.setUserId(userId);
+            userScore.setUploaded("0"); // String 类型
+            userScore.setDownloaded("0"); // String 类型
+            userScore.setBonus(activity.getRewardBonus().longValue()); // Integer 转 Long
+            userScoreService.insertUserScore(userScore);
+        }
+
+        // 发送通知
+        SysUserMessage message = new SysUserMessage();
+        message.setSenderId(0L); // 系统用户
+        message.setReceiverId(userId);
+        message.setContent("您完成了活动[" + activity.getActivityName() + "],获得" + activity.getRewardBonus() + "积分!");
+        messageService.sendMessage(message);
+
+        return AjaxResult.success("任务完成,获得" + activity.getRewardBonus() + "积分");
+    }
+
+    @Override
+    public List<SysActivity.LeaderboardEntry> getLeaderboard() {
+        return activityMapper.selectLeaderboard();
+    }
+
+    private boolean checkTaskCompletion(SysActivity activity, Long userId) {
+        UserScore userScore = userScoreService.selectUserScoreByUserId(userId);
+        if (userScore == null) return false;
+
+        if ("UPLOAD".equals(activity.getActivityType())) {
+            long conditionValue = parseDataSize(activity.getConditionValue());
+            long uploadedValue = parseUserDataSize(userScore.getUploaded());
+            return uploadedValue >= conditionValue; // long 与 long 比较
+        } else if ("DOWNLOAD".equals(activity.getActivityType())) {
+            return checkTorrentDownload(userId, activity.getConditionValue());
+        }
+        return false;
+    }
+
+    private long parseDataSize(String data) {
+        if (data == null || data.isEmpty()) return 0;
+        try {
+            data = data.toUpperCase();
+            long value = Long.parseLong(data.replaceAll("[^0-9]", ""));
+            if (data.endsWith("KB")) return value * 1024;
+            if (data.endsWith("MB")) return value * 1024 * 1024;
+            if (data.endsWith("GB")) return value * 1024 * 1024 * 1024;
+            return value;
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+    }
+
+    private long parseUserDataSize(String data) {
+        if (data == null || data.isEmpty()) return 0;
+        try {
+            // 支持格式:纯数字(如 "1073741824")或带单位(如 "1GB")
+            data = data.toUpperCase();
+            if (data.matches("\\d+")) {
+                return Long.parseLong(data); // 纯数字,视为字节数
+            }
+            long value = Long.parseLong(data.replaceAll("[^0-9]", ""));
+            if (data.endsWith("KB")) return value * 1024;
+            if (data.endsWith("MB")) return value * 1024 * 1024;
+            if (data.endsWith("GB")) return value * 1024 * 1024 * 1024;
+            return value;
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+    }
+
+    private boolean checkTorrentDownload(Long userId, String torrentId) {
+        return activityRecordMapper.checkTorrentDownload(userId, torrentId) > 0;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserInviteServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserInviteServiceImpl.java
new file mode 100644
index 0000000..1e63a0d
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/SysUserInviteServiceImpl.java
@@ -0,0 +1,49 @@
+package com.ruoyi.authentication.service.impl;
+
+import com.ruoyi.authentication.domain.UserScore;
+import com.ruoyi.authentication.service.IUserScoreService;
+import com.ruoyi.authentication.domain.SysUserInvite;
+import com.ruoyi.authentication.mapper.SysUserInviteMapper;
+import com.ruoyi.authentication.service.ISysUserInviteService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class SysUserInviteServiceImpl implements ISysUserInviteService {
+    @Autowired
+    private SysUserInviteMapper inviteMapper;
+
+    @Autowired
+    private IUserScoreService userScoreService;
+
+    @Override
+    public SysUserInvite getInviteCode(Long userId) {
+        return inviteMapper.selectInviteByUserId(userId);
+    }
+
+    @Override
+    @Transactional
+    public SysUserInvite getUserByInviteCode(String code) {
+        SysUserInvite invite = inviteMapper.selectInviteByCode(code);
+        if (invite != null) {
+            // 更新邀请人的积分
+            UserScore userScore = userScoreService.selectUserScoreByUserId(invite.getUserId());
+            if (userScore != null) {
+                userScore.setBonus(userScore.getBonus() + 10);
+                userScore.setScore(userScore.getScore() + 10);
+                userScoreService.updateUserScore(userScore);
+            } else {
+                // 如果没有积分记录,创建新记录
+                userScore = new UserScore();
+                userScore.setUserId(invite.getUserId());
+                userScore.setUploaded("0");
+                userScore.setDownloaded("0");
+                userScore.setBonus(10L);
+                userScore.setScore(10L);
+                userScoreService.insertUserScore(userScore);
+            }
+        }
+        return invite;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java
index 4a41923..ca846a8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/authentication/service/impl/UserScoreServiceImpl.java
@@ -1,12 +1,12 @@
 package com.ruoyi.authentication.service.impl;
 
-import java.util.List;
-
 import com.ruoyi.authentication.domain.UserScore;
 import com.ruoyi.authentication.mapper.UserScoreMapper;
+import com.ruoyi.authentication.service.IUserScoreService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.authentication.service.IUserScoreService;
+
+import java.util.List;
 
 /**
  * 【请填写功能名称】Service业务层处理
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysActivityController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysActivityController.java
new file mode 100644
index 0000000..e78085c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysActivityController.java
@@ -0,0 +1,41 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.authentication.domain.SysActivity;
+import com.ruoyi.authentication.service.ISysActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/system/activity")
+public class SysActivityController extends BaseController {
+    @Autowired
+    private ISysActivityService activityService;
+
+    @PreAuthorize("@ss.hasPermi('system:activity:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysActivity activity) {
+        startPage();
+        List<SysActivity> list = activityService.selectActivityList(activity);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('system:activity:participate')")
+    @PostMapping("/participate/{activityId}")
+    public AjaxResult participate(@PathVariable Long activityId) {
+        return activityService.participateActivity(activityId, getUserId());
+    }
+
+    @PreAuthorize("@ss.hasPermi('system:activity:leaderboard')")
+    @GetMapping("/leaderboard")
+    public TableDataInfo leaderboard() {
+        startPage();
+        List<SysActivity.LeaderboardEntry> list = activityService.getLeaderboard();
+        return getDataTable(list);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserInviteController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserInviteController.java
index eb22abd..7ef246d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserInviteController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserInviteController.java
@@ -2,8 +2,8 @@
 
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.system.domain.SysUserInvite;
-import com.ruoyi.system.service.ISysUserInviteService;
+import com.ruoyi.authentication.domain.SysUserInvite;
+import com.ruoyi.authentication.service.ISysUserInviteService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
diff --git a/ruoyi-admin/src/main/resources/mapper/system/SysActivityMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/SysActivityMapper.xml
new file mode 100644
index 0000000..c09494d
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/SysActivityMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.authentication.mapper.SysActivityMapper">
+    <resultMap id="ActivityMap" type="com.ruoyi.authentication.domain.SysActivity">
+        <id property="activityId" column="activity_id"/>
+        <result property="activityName" column="activity_name"/>
+        <result property="rewardBonus" column="reward_bonus"/>
+        <result property="conditionValue" column="condition_value"/>
+        <result property="startTime" column="start_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="status" column="status"/>
+        <result property="activityType" column="activity_type"/>
+    </resultMap>
+
+    <resultMap id="LeaderboardMap" type="com.ruoyi.authentication.domain.SysActivity$LeaderboardEntry">
+        <result property="userId" column="user_id"/>
+        <result property="userName" column="user_name"/>
+        <result property="score" column="score"/>
+    </resultMap>
+
+    <select id="selectActivityList" resultMap="ActivityMap">
+        select activity_id, activity_name, reward_bonus, condition_value, start_time, end_time, status, activity_type
+        from activity
+        where 1=1
+        <if test="activityType != null and activityType != ''">and activity_type = #{activityType}</if>
+        <if test="status != null">and status = #{status}</if>
+    </select>
+
+    <select id="selectActivityById" resultMap="ActivityMap">
+        select activity_id, activity_name, reward_bonus, condition_value, start_time, end_time, status, activity_type
+        from activity
+        where activity_id = #{activityId}
+    </select>
+
+    <select id="selectLeaderboard" resultMap="LeaderboardMap">
+        select u.user_id, u.user_name, s.score
+        from sys_user u
+                 join user_score s on u.user_id = s.user_id
+        order by s.score desc
+            limit 100
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/system/SysActivityRecordMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/SysActivityRecordMapper.xml
new file mode 100644
index 0000000..f260cd1
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/SysActivityRecordMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.authentication.mapper.SysActivityRecordMapper">
+    <resultMap id="ActivityRecordMap" type="com.ruoyi.authentication.domain.SysActivityRecord">
+        <id property="recordId" column="record_id"/>
+        <result property="activityId" column="activity_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="rewardBonus" column="reward_bonus"/>
+        <result property="completeTime" column="complete_time"/>
+    </resultMap>
+
+    <select id="checkParticipation" resultMap="ActivityRecordMap">
+        select record_id, activity_id, user_id, reward_bonus, complete_time
+        from activity_record
+        where activity_id = #{activityId} and user_id = #{userId}
+    </select>
+
+    <insert id="insertActivityRecord">
+        insert into activity_record (activity_id, user_id, reward_bonus, complete_time)
+        values (#{activityId}, #{userId}, #{rewardBonus}, sysdate())
+    </insert>
+
+    <select id="checkTorrentDownload" resultType="int">
+        select count(*) from torrent_download
+        where user_id = #{userId} and torrent_id = #{torrentId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserInviteMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/SysUserInviteMapper.xml
similarity index 88%
rename from ruoyi-system/src/main/resources/mapper/system/SysUserInviteMapper.xml
rename to ruoyi-admin/src/main/resources/mapper/system/SysUserInviteMapper.xml
index 82da470..5059af0 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserInviteMapper.xml
+++ b/ruoyi-admin/src/main/resources/mapper/system/SysUserInviteMapper.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.SysUserInviteMapper">
-    <resultMap id="SysUserInviteMap" type="com.ruoyi.system.domain.SysUserInvite">
+    <resultMap id="SysUserInviteMap" type="com.ruoyi.authentication.domain.SysUserInvite">
         <id property="codeId" column="code_id"/>
         <result property="code" column="code"/>
         <result property="userId" column="user_id"/>
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index a10ba16..d2a2482 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -47,6 +47,7 @@
             <scope>provided</scope>
         </dependency>
 
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserInviteMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserInviteMapper.java
deleted file mode 100644
index b0239ca..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserInviteMapper.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ruoyi.system.mapper;
-
-import com.ruoyi.system.domain.SysUserInvite;
-
-public interface SysUserInviteMapper {
-    SysUserInvite selectInviteByUserId(Long userId);
-    SysUserInvite selectInviteByCode(String code);
-}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserInviteService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserInviteService.java
deleted file mode 100644
index d5b04f4..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserInviteService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.domain.SysUserInvite;
-
-public interface ISysUserInviteService {
-    SysUserInvite getInviteCode(Long userId);
-    SysUserInvite getUserByInviteCode(String code);
-}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserInviteServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserInviteServiceImpl.java
deleted file mode 100644
index e499a5a..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserInviteServiceImpl.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.ruoyi.system.domain.SysUserInvite;
-import com.ruoyi.system.mapper.SysUserInviteMapper;
-import com.ruoyi.system.service.ISysUserInviteService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class SysUserInviteServiceImpl implements ISysUserInviteService {
-    @Autowired
-    private SysUserInviteMapper inviteMapper;
-
-    @Override
-    public SysUserInvite getInviteCode(Long userId) {
-        return inviteMapper.selectInviteByUserId(userId);
-    }
-
-    @Override
-    public SysUserInvite getUserByInviteCode(String code) {
-        return inviteMapper.selectInviteByCode(code);
-    }
-}
\ No newline at end of file