Ver código fonte

优化tg用户注册逻辑 以及后端tg用户列表查询逻辑

xudm 2 meses atrás
pai
commit
0f7e8899fe
19 arquivos alterados com 340 adições e 404 exclusões
  1. 22 0
      continew-appapi/src/main/java/top/continew/admin/controller/DistributionController.java
  2. 3 3
      continew-appapi/src/main/java/top/continew/admin/controller/LoginController.java
  3. 10 0
      continew-module-coin-core/src/main/java/top/continew/admin/distribution/service/DistributionService.java
  4. 34 0
      continew-module-coin-core/src/main/java/top/continew/admin/distribution/service/impl/DistributionServiceImpl.java
  5. 7 0
      continew-module-coin-core/src/main/java/top/continew/admin/user/model/entity/TgUser.java
  6. 23 0
      continew-module-coin-core/src/main/java/top/continew/admin/user/service/AppLoginService.java
  7. 0 8
      continew-module-coin-core/src/main/java/top/continew/admin/user/service/ITgUserService.java
  8. 84 0
      continew-module-coin-core/src/main/java/top/continew/admin/user/service/Impl/AppLoginServiceImpl.java
  9. 0 58
      continew-module-coin-core/src/main/java/top/continew/admin/user/service/Impl/TgUserServiceImpl.java
  10. 50 6
      continew-module-coin-core/src/main/java/top/continew/admin/utils/InviteCodeGenerator.java
  11. 1 1
      continew-module-coin-core/src/main/java/top/continew/admin/utils/MyGenerator.java
  12. 38 39
      continew-module-coin-core/src/main/resources/mapper/TgUserMapper.xml
  13. 6 0
      continew-module-system/src/main/java/top/continew/admin/business/mapper/TgUserMapper.java
  14. 2 0
      continew-module-system/src/main/java/top/continew/admin/business/model/entity/TgUser.java
  15. 0 234
      continew-module-system/src/main/java/top/continew/admin/business/model/resp/TgUserResp.java
  16. 16 0
      continew-module-system/src/main/java/top/continew/admin/business/service/IInviteRewardsFetchRecordService.java
  17. 16 0
      continew-module-system/src/main/java/top/continew/admin/business/service/IInviteRewardsRuleService.java
  18. 3 55
      continew-module-system/src/main/java/top/continew/admin/business/service/Impl/TgUserServiceImpl.java
  19. 25 0
      continew-module-system/src/main/resources/mapper/TgUserMapper.xml

+ 22 - 0
continew-appapi/src/main/java/top/continew/admin/controller/DistributionController.java

@@ -0,0 +1,22 @@
+package top.continew.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import top.continew.admin.distribution.service.DistributionService;
+
+@RestController
+@RequestMapping("/distribution")
+@Tag(name = "分销模块api", description = "分销模块api")
+@AllArgsConstructor
+public class DistributionController {
+    private final DistributionService distributionService;
+
+    @RequestMapping("/getShareCode")
+    @Operation(summary = "获取分销邀请码", description = "获取分销邀请码")
+    public String getShareCode() {
+        return distributionService.getInviteCode();
+    }
+}

+ 3 - 3
continew-appapi/src/main/java/top/continew/admin/controller/LoginController.java

@@ -11,7 +11,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import top.continew.admin.common.context.UserExtraContext;
 import top.continew.admin.user.model.req.AppLoginReq;
-import top.continew.admin.user.service.ITgUserService;
+import top.continew.admin.user.service.AppLoginService;
 
 @RestController()
 @AllArgsConstructor
@@ -19,13 +19,13 @@ import top.continew.admin.user.service.ITgUserService;
 @RequestMapping("/login")
 @Slf4j
 public class LoginController {
-    private final ITgUserService userService;
+    private final AppLoginService loginService;
 
     @SaIgnore
     @GetMapping("/coinLogin")
     @Operation(summary = "tg账号登录", description = "根据tg用户id进行登录")
     public SaTokenInfo coinLogin(@Validated AppLoginReq req) {
-        return userService.tgLogin(req);
+        return loginService.tgLogin(req);
     }
 
     @RequestMapping("/getUserExtraContext")

+ 10 - 0
continew-module-coin-core/src/main/java/top/continew/admin/distribution/service/DistributionService.java

@@ -0,0 +1,10 @@
+package top.continew.admin.distribution.service;
+
+public interface DistributionService {
+    /**
+     * 获取邀请码
+     *
+     * @return
+     */
+    String getInviteCode();
+}

+ 34 - 0
continew-module-coin-core/src/main/java/top/continew/admin/distribution/service/impl/DistributionServiceImpl.java

@@ -0,0 +1,34 @@
+package top.continew.admin.distribution.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import top.continew.admin.distribution.service.DistributionService;
+import top.continew.admin.user.model.entity.TgUser;
+import top.continew.admin.user.service.ITgUserService;
+import top.continew.admin.utils.InviteCodeGenerator;
+import top.continew.starter.core.validation.CheckUtils;
+
+import java.io.Serializable;
+
+@Service
+public class DistributionServiceImpl implements DistributionService {
+    @Resource
+    private ITgUserService userService;
+
+    @Override
+    public String getInviteCode() {
+        Object loginId = StpUtil.getLoginId();
+        TgUser user = userService.getById((Serializable) loginId);
+        CheckUtils.throwIfNull(user, "该账号未登录!");
+        String inviteCode = user.getInviteCode();
+        if (StrUtil.isBlank(inviteCode)) {
+            inviteCode = InviteCodeGenerator.generateInviteCode();
+            user.setInviteCode(inviteCode);
+            userService.updateById(user);
+            return inviteCode;
+        }
+        return inviteCode;
+    }
+}

+ 7 - 0
continew-module-coin-core/src/main/java/top/continew/admin/user/model/entity/TgUser.java

@@ -137,6 +137,13 @@ public class TgUser extends Model<TgUser> {
     @TableField("channel")
     private Integer channel;
 
+    /**
+     * 客流途径 1 新增 2 邀请
+     */
+    @TableField("passenger_flow_way")
+    private Integer passengerFlowWay;
+
+
     /**
      * 用户授权telegram登录后的唯一标识
      */

+ 23 - 0
continew-module-coin-core/src/main/java/top/continew/admin/user/service/AppLoginService.java

@@ -0,0 +1,23 @@
+package top.continew.admin.user.service;
+
+import cn.dev33.satoken.stp.SaTokenInfo;
+import top.continew.admin.user.model.entity.TgUser;
+import top.continew.admin.user.model.req.AppLoginReq;
+
+public interface AppLoginService {
+    /**
+     * tg小程序登录
+     *
+     * @param loginReq 用户信息
+     * @return
+     */
+    SaTokenInfo tgLogin(AppLoginReq loginReq);
+
+    /**
+     * 注册tg用户到到系统
+     *
+     * @param loginReq
+     * @return
+     */
+    TgUser registerToSys(AppLoginReq loginReq);
+}

+ 0 - 8
continew-module-coin-core/src/main/java/top/continew/admin/user/service/ITgUserService.java

@@ -15,13 +15,5 @@ import top.continew.admin.user.model.resp.AppLoginResp;
  * @since 2024-12-14
  */
 public interface ITgUserService extends IService<TgUser> {
-    /**
-     * tg小程序用户登录
-     *
-     * @param appLoginReq
-     * @return
-     */
-    SaTokenInfo tgLogin(AppLoginReq appLoginReq);
-
 
 }

+ 84 - 0
continew-module-coin-core/src/main/java/top/continew/admin/user/service/Impl/AppLoginServiceImpl.java

@@ -0,0 +1,84 @@
+package top.continew.admin.user.service.Impl;
+
+import cn.dev33.satoken.stp.SaLoginConfig;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import top.continew.admin.common.context.UserContext;
+import top.continew.admin.common.context.UserContextHolder;
+import top.continew.admin.common.context.UserExtraContext;
+import top.continew.admin.user.model.entity.TgUser;
+import top.continew.admin.user.model.req.AppLoginReq;
+import top.continew.admin.user.service.AppLoginService;
+import top.continew.admin.user.service.ITgUserService;
+import top.continew.admin.utils.InviteCodeGenerator;
+import top.continew.starter.web.util.SpringWebUtils;
+
+import java.time.LocalDateTime;
+
+@Service
+@AllArgsConstructor
+public class AppLoginServiceImpl implements AppLoginService {
+
+    private final ITgUserService userService;
+
+    @Override
+    public SaTokenInfo tgLogin(AppLoginReq loginReq) {
+        LambdaQueryWrapper<TgUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TgUser::getTgId, loginReq.getId());
+        TgUser user = userService.getOne(queryWrapper);
+        if (ObjUtil.isNull(user)) {
+            user = registerToSys(loginReq);
+        }
+        return this.login(user, loginReq);
+    }
+
+    @Override
+    public TgUser registerToSys(AppLoginReq loginReq) {
+        TgUser user = TgUser.builder()
+                .tgAccount(loginReq.getUsername())
+                .tgId(loginReq.getId())
+                .avatar(loginReq.getPhotoUrl())
+                .firstName(loginReq.getFirstName())
+                .lastName(loginReq.getLastName())
+                //注册时指定用户的唯一邀请码
+                .inviteCode(InviteCodeGenerator.generateInviteCode())
+                .languageCode(loginReq.getLanguageCode())
+                .createdTime(LocalDateTime.now())
+                .updatedTime(LocalDateTime.now())
+                .build();
+        if (StrUtil.isNotBlank(loginReq.getAge_limit())) {
+            user.setAgeLimit(Integer.parseInt(loginReq.getAge_limit()));
+        }
+        if (StrUtil.isNotBlank(loginReq.getShare_code())) {
+            //如邀请码不为空 则写入邀请人信息
+            LambdaQueryWrapper<TgUser> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(TgUser::getInviteCode, loginReq.getShare_code());
+            TgUser inviteUser = userService.getOne(queryWrapper);
+            if (ObjUtil.isNotNull(inviteUser)) {
+                user.setReferrerId(String.valueOf(inviteUser.getId()));
+            }
+            user.setPassengerFlowWay(2);
+        }
+        userService.save(user);
+        return user;
+    }
+
+    private SaTokenInfo login(TgUser user, AppLoginReq loginReq) {
+        Long userId = user.getId();
+        UserContext userContext = new UserContext();
+        userContext.setId(userId);
+        userContext.setUsername(user.getTgAccount());
+        // 登录并缓存用户信息
+        StpUtil.login(userId, SaLoginConfig.setExtraData(BeanUtil
+                .beanToMap(new UserExtraContext(SpringWebUtils.getRequest()))));
+        UserContextHolder.setContext(userContext);
+        //TODO 记录登录时间以及ip等信息
+        return StpUtil.getTokenInfo();
+    }
+}

+ 0 - 58
continew-module-coin-core/src/main/java/top/continew/admin/user/service/Impl/TgUserServiceImpl.java

@@ -41,62 +41,4 @@ import java.util.concurrent.CompletableFuture;
 @Service
 public class TgUserServiceImpl extends ServiceImpl<TgUserMapper, TgUser> implements ITgUserService {
 
-
-    @Override
-    public SaTokenInfo tgLogin(AppLoginReq loginReq) {
-        LambdaQueryWrapper<TgUser> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(TgUser::getTgId, loginReq.getId());
-        TgUser user = getOne(queryWrapper);
-        if (ObjUtil.isNull(user)) {
-            user = registerToSys(loginReq);
-        }
-        return this.login(user, loginReq);
-    }
-
-    /**
-     * 注册用户到系统中
-     *
-     * @param loginReq
-     * @return
-     */
-    private TgUser registerToSys(AppLoginReq loginReq) {
-        TgUser user = TgUser.builder()
-                .tgAccount(loginReq.getUsername())
-                .tgId(loginReq.getId())
-                .avatar(loginReq.getPhotoUrl())
-                .firstName(loginReq.getFirstName())
-                .lastName(loginReq.getLastName())
-                //注册时指定用户的唯一邀请码
-                .inviteCode(InviteCodeGenerator.generateInviteCode())
-                .languageCode(loginReq.getLanguageCode())
-                .ageLimit(Integer.parseInt(loginReq.getAge_limit()))
-                .createdTime(LocalDateTime.now())
-                .updatedTime(LocalDateTime.now())
-                .build();
-        if (StrUtil.isNotBlank(loginReq.getShare_code())) {
-            //如邀请码不为空 则写入邀请人信息
-            LambdaQueryWrapper<TgUser> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(TgUser::getInviteCode, user.getId());
-            TgUser inviteUser = getOne(queryWrapper);
-            if (ObjUtil.isNotNull(inviteUser)) {
-                user.setReferrerId(String.valueOf(inviteUser.getId()));
-            }
-        }
-        this.save(user);
-        return user;
-    }
-
-    private SaTokenInfo login(TgUser user, AppLoginReq loginReq) {
-        Long userId = user.getId();
-        UserContext userContext = new UserContext();
-        userContext.setId(userId);
-        userContext.setUsername(user.getTgAccount());
-        // 登录并缓存用户信息
-        StpUtil.login(userId, SaLoginConfig.setExtraData(BeanUtil
-                .beanToMap(new UserExtraContext(SpringWebUtils.getRequest()))));
-        UserContextHolder.setContext(userContext);
-        return StpUtil.getTokenInfo();
-    }
-
-
 }

+ 50 - 6
continew-module-coin-core/src/main/java/top/continew/admin/utils/InviteCodeGenerator.java

@@ -1,21 +1,65 @@
 package top.continew.admin.utils;
 
+import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.crypto.digest.MD5;
+
+import javax.xml.bind.DatatypeConverter;
 import java.security.SecureRandom;
 import java.util.Random;
 
 public class InviteCodeGenerator {
-    private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-    private static final int CODE_LENGTH = 8; // 邀请码长度
+    private static final int CODE_LENGTH = 32; // 邀请码长度
+    private static final int RANDOM_CODE_LENGTH = 8; // 随机码长度
+    private static final SecureRandom RANDOM = new SecureRandom();
+
+    private static final String[] CHARACTERS = new String[]{"a", "b", "c", "d", "e", "f", "g", "h",
+            "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+            "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
+            "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+            "U", "V", "W", "X", "Y", "Z"
+    };
+
 
     public static String generateInviteCode() {
-        Random random = new SecureRandom();
         StringBuilder code = new StringBuilder();
+        StringBuilder randomCode = new StringBuilder();
 
         for (int i = 0; i < CODE_LENGTH; i++) {
-            int index = random.nextInt(CHARACTERS.length());
-            code.append(CHARACTERS.charAt(index));
+            int index = RANDOM.nextInt(CHARACTERS.length);
+            code.append(CHARACTERS[index]);
+        }
+        for (int i = 0; i < RANDOM_CODE_LENGTH; i++) {
+            int index = RANDOM.nextInt(CHARACTERS.length);
+            randomCode.append(CHARACTERS[index]);
         }
-        return code.toString();
+
+        //邀请码+随机码组成一个字符
+        String tempCode = code.toString() + randomCode.toString();
+        byte[] digest = DigestUtil.md5(tempCode);
+        String sMD5EncryptResult = DatatypeConverter.printHexBinary(digest).toUpperCase();
+        String[] resUrl = new String[4];
+        //得到 4组短链接字符串
+        for (int i = 0; i < 4; i++) {
+            // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
+            String sTempSubString = sMD5EncryptResult.substring(i * 8, i * 8 + 8);
+            // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用 long ,则会越界
+            long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
+            String outChars = "";
+            //循环获得每组6位的字符串
+            for (int j = 0; j < 6; j++) {
+                // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引(具体需要看chars数组的长度   以防下标溢出,注意起点为0)
+                long index = 0x0000003D & lHexLong;
+                // 把取得的字符相加
+                outChars += CHARACTERS[(int) index];
+                // 每次循环按位右移 5 位
+                lHexLong = lHexLong >> 5;
+            }
+            // 把字符串存入对应索引的输出数组
+            resUrl[i] = outChars;
+        }
+
+        return resUrl[0];
     }
 
     public static void main(String[] args) {

+ 1 - 1
continew-module-coin-core/src/main/java/top/continew/admin/utils/MyGenerator.java

@@ -56,7 +56,7 @@ public class MyGenerator {
 
     public static void main(String[] args) {
         // 项目名 例如app  web
-        generatorByBusinessModule("user", new String[]{"b_tg_user"});
+        generatorByBusinessModule("coin", new String[]{"b_invite_rewards_fetch_record", "b_invite_rewards_rule"});
     }
 
     /**

+ 38 - 39
continew-module-coin-core/src/main/resources/mapper/TgUserMapper.xml

@@ -1,51 +1,50 @@
 <?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="top.continew.admin.user.mapper.TgUserMapper">
-
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="top.continew.admin.user.model.entity.TgUser">
-        <id column="id" property="id" />
-        <result column="tg_id" property="tgId" />
-        <result column="tg_account" property="tgAccount" />
-        <result column="first_name" property="firstName" />
-        <result column="last_name" property="lastName" />
-        <result column="nickname" property="nickname" />
-        <result column="real_name" property="realName" />
-        <result column="avatar" property="avatar" />
-        <result column="language_code" property="languageCode" />
-        <result column="wallet_address" property="walletAddress" />
-        <result column="age_limit" property="ageLimit" />
-        <result column="old_user" property="oldUser" />
-        <result column="check_language" property="checkLanguage" />
-        <result column="login_ip" property="loginIp" />
-        <result column="login_time" property="loginTime" />
-        <result column="ip_address_convert" property="ipAddressConvert" />
-        <result column="disable_flag" property="disableFlag" />
-        <result column="channel" property="channel" />
-        <result column="login_telegram" property="loginTelegram" />
-        <result column="coin_address" property="coinAddress" />
-        <result column="password" property="password" />
-        <result column="mobile" property="mobile" />
-        <result column="sex" property="sex" />
-        <result column="invite_code" property="inviteCode" />
-        <result column="referrer_id" property="referrerId" />
-        <result column="invite_reward" property="inviteReward" />
-        <result column="new_user_flag" property="newUserFlag" />
-        <result column="history_key" property="historyKey" />
-        <result column="key_num" property="keyNum" />
-        <result column="airdrop_coin" property="airdropCoin" />
-        <result column="gold_coin_amount" property="goldCoinAmount" />
-        <result column="gold_coin_total_his" property="goldCoinTotalHis" />
-        <result column="development_gold_coin" property="developmentGoldCoin" />
-        <result column="online_time" property="onlineTime" />
-        <result column="user_amount" property="userAmount" />
-        <result column="created_time" property="createdTime" />
-        <result column="updated_time" property="updatedTime" />
+        <id column="id" property="id"/>
+        <result column="tg_id" property="tgId"/>
+        <result column="tg_account" property="tgAccount"/>
+        <result column="first_name" property="firstName"/>
+        <result column="last_name" property="lastName"/>
+        <result column="nickname" property="nickname"/>
+        <result column="real_name" property="realName"/>
+        <result column="avatar" property="avatar"/>
+        <result column="language_code" property="languageCode"/>
+        <result column="wallet_address" property="walletAddress"/>
+        <result column="age_limit" property="ageLimit"/>
+        <result column="old_user" property="oldUser"/>
+        <result column="check_language" property="checkLanguage"/>
+        <result column="login_ip" property="loginIp"/>
+        <result column="login_time" property="loginTime"/>
+        <result column="ip_address_convert" property="ipAddressConvert"/>
+        <result column="disable_flag" property="disableFlag"/>
+        <result column="channel" property="channel"/>
+        <result column="passenger_flow_way" property="passengerFlowWay"/>
+        <result column="login_telegram" property="loginTelegram"/>
+        <result column="coin_address" property="coinAddress"/>
+        <result column="password" property="password"/>
+        <result column="mobile" property="mobile"/>
+        <result column="sex" property="sex"/>
+        <result column="invite_code" property="inviteCode"/>
+        <result column="referrer_id" property="referrerId"/>
+        <result column="invite_reward" property="inviteReward"/>
+        <result column="new_user_flag" property="newUserFlag"/>
+        <result column="history_key" property="historyKey"/>
+        <result column="key_num" property="keyNum"/>
+        <result column="airdrop_coin" property="airdropCoin"/>
+        <result column="gold_coin_amount" property="goldCoinAmount"/>
+        <result column="gold_coin_total_his" property="goldCoinTotalHis"/>
+        <result column="development_gold_coin" property="developmentGoldCoin"/>
+        <result column="online_time" property="onlineTime"/>
+        <result column="user_amount" property="userAmount"/>
+        <result column="created_time" property="createdTime"/>
+        <result column="updated_time" property="updatedTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, tg_id, tg_account, first_name, last_name, nickname, real_name, avatar, language_code, wallet_address, age_limit, old_user, check_language, login_ip, login_time, ip_address_convert, disable_flag, channel, login_telegram, coin_address, password, mobile, sex, invite_code, referrer_id, invite_reward, new_user_flag, history_key, key_num, airdrop_coin, gold_coin_amount, gold_coin_total_his, development_gold_coin, online_time, user_amount, created_time, updated_time
     </sql>
-
 </mapper>

+ 6 - 0
continew-module-system/src/main/java/top/continew/admin/business/mapper/TgUserMapper.java

@@ -1,7 +1,12 @@
 package top.continew.admin.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import top.continew.admin.business.model.entity.TgUser;
+import top.continew.admin.business.model.req.TgUserReq;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,5 @@ import top.continew.admin.business.model.entity.TgUser;
  */
 public interface TgUserMapper extends BaseMapper<TgUser> {
 
+    List<TgUser> getTgUserOfPage(@Param("query") TgUserReq query, Page page);
 }

+ 2 - 0
continew-module-system/src/main/java/top/continew/admin/business/model/entity/TgUser.java

@@ -256,6 +256,8 @@ public class TgUser extends Model<TgUser> {
     @TableField("updated_time")
     private LocalDateTime updatedTime;
 
+    @TableField(exist = false)
+    private String referrerName;
 
     @Override
     public Serializable pkVal() {

+ 0 - 234
continew-module-system/src/main/java/top/continew/admin/business/model/resp/TgUserResp.java

@@ -1,234 +0,0 @@
-package top.continew.admin.business.model.resp;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-@Data
-@Schema(description = "tg用户信息")
-public class TgUserResp implements Serializable {
-    /**
-     * id
-     */
-    @Schema(description = "主键")
-    private Long id;
-
-    /**
-     * tg小程序id
-     */
-    @Schema(description = "tg小程序id")
-    private String tgId;
-
-    /**
-     * tg账号
-     */
-    @Schema(description = "tg账号")
-    private String tgAccount;
-
-    /**
-     * 名
-     */
-    @Schema(description = "名")
-    private String firstName;
-
-    /**
-     * 姓
-     */
-    @Schema(description = "姓")
-    private String lastName;
-
-    /**
-     * 昵称
-     */
-    @Schema(description = "昵称")
-    private String nickname;
-
-    /**
-     * 真实姓名
-     */
-    @Schema(description = "真实姓名")
-    private String realName;
-
-    /**
-     * 头像
-     */
-    @Schema(description = "头像")
-    private String avatar;
-
-    /**
-     * 用户的语言的编码
-     */
-    @Schema(description = "用户的语言的编码")
-    private String languageCode;
-
-    /**
-     * 钱包地址
-     */
-    @Schema(description = "钱包地址")
-    private String walletAddress;
-
-    /**
-     * 年限
-     */
-    @Schema(description = "年限")
-    private Integer ageLimit;
-
-    /**
-     * 是否老用户
-     */
-    @Schema(description = "是否老用户")
-    private Integer oldUser;
-
-    /**
-     * 选择的语言
-     */
-    @Schema(description = "选择的语言")
-    private String checkLanguage;
-
-    /**
-     * 最后登录的IP
-     */
-    @Schema(description = "最后登录的IP")
-    private String loginIp;
-
-    /**
-     * 最后登录时间
-     */
-    @Schema(description = "最后登录时间")
-    private LocalDateTime loginTime;
-
-    /**
-     * ip转换实际地址
-     */
-    @Schema(description = "ip转换实际地址")
-    private String ipAddressConvert;
-
-    /**
-     * 是否禁用: [0=否, 1=是]
-     */
-    @Schema(description = "否禁用: [0=否, 1=是]")
-    private Integer disableFlag;
-
-    /**
-     * 注册渠道: [1-微信小程序 2-微信公众号 3-手机H5 4-电脑PC 5-苹果APP 6-安卓APP]
-     */
-    @Schema(description = "注册渠道: [1-微信小程序 2-微信公众号 3-手机H5 4-电脑PC 5-苹果APP 6-安卓APP]")
-    private Integer channel;
-
-    /**
-     * 用户授权telegram登录后的唯一标识
-     */
-    @Schema(description = "用户授权telegram登录后的唯一标识")
-    private String loginTelegram;
-
-    /**
-     * 币账户进入的唯一标识地址
-     */
-    @Schema(description = "币账户进入的唯一标识地址")
-    private String coinAddress;
-
-    /**
-     * 用户密码
-     */
-    @Schema(description = "用户密码")
-    private String password;
-
-    /**
-     * 用户电话
-     */
-    @Schema(description = "用户电话")
-    private String mobile;
-
-    /**
-     * 用户性别: [1=男, 2=女]
-     */
-    @Schema(description = "用户性别: [1=男, 2=女]")
-    private String sex;
-
-    /**
-     * 邀请码
-     */
-    @Schema(description = "邀请码")
-    private String inviteCode;
-
-    /**
-     * 介绍人_id
-     */
-    @Schema(description = "介绍人_id")
-    private String referrerId;
-
-    /**
-     * 0单独可奖励1已经奖励
-     */
-    @Schema(description = "0单独可奖励1已经奖励")
-    private Integer inviteReward;
-
-    /**
-     * 是否是新注册用户: [1-是, 0-否]
-     */
-    @Schema(description = "是否是新注册用户: [1-是, 0-否]")
-    private Integer newUserFlag;
-
-    /**
-     * 历史钥匙数量
-     */
-    @Schema(description = "历史钥匙数量")
-    private Integer historyKey;
-
-    /**
-     * 钥匙数量
-     */
-    @Schema(description = "钥匙数量")
-    private Integer keyNum;
-
-    /**
-     * 空投数量
-     */
-    @Schema(description = "空投数量")
-    private Integer airdropCoin;
-
-    /**
-     * 金币余额
-     */
-    @Schema(description = "金币余额")
-    private BigDecimal goldCoinAmount;
-
-    /**
-     * 金币总数量
-     */
-    @Schema(description = "金币总数量")
-    private BigDecimal goldCoinTotalHis;
-
-    /**
-     * 该用户每10s生产的金币数量
-     */
-    @Schema(description = "该用户每10s生产的金币数量")
-    private Integer developmentGoldCoin;
-
-    /**
-     * 在线时间 单位秒
-     */
-    @Schema(description = "在线时间 单位秒")
-    private Integer onlineTime;
-
-    /**
-     * 用户余额
-     */
-    @Schema(description = "用户余额")
-    private BigDecimal userAmount;
-
-    /**
-     * 创建时间
-     */
-    @Schema(description = "创建时间")
-    private LocalDateTime createdTime;
-
-    /**
-     * 更新时间
-     */
-    @Schema(description = "更新时间")
-    private LocalDateTime updatedTime;
-}

+ 16 - 0
continew-module-system/src/main/java/top/continew/admin/business/service/IInviteRewardsFetchRecordService.java

@@ -0,0 +1,16 @@
+package top.continew.admin.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import top.continew.admin.coin.model.entity.InviteRewardsFetchRecord;
+
+/**
+ * <p>
+ * 邀请用户金币奖励领取记录 服务类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-15
+ */
+public interface IInviteRewardsFetchRecordService extends IService<InviteRewardsFetchRecord> {
+
+}

+ 16 - 0
continew-module-system/src/main/java/top/continew/admin/business/service/IInviteRewardsRuleService.java

@@ -0,0 +1,16 @@
+package top.continew.admin.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import top.continew.admin.coin.model.entity.InviteRewardsRule;
+
+/**
+ * <p>
+ * 邀请用户金币奖励规则 服务类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-15
+ */
+public interface IInviteRewardsRuleService extends IService<InviteRewardsRule> {
+
+}

+ 3 - 55
continew-module-system/src/main/java/top/continew/admin/business/service/Impl/TgUserServiceImpl.java

@@ -1,16 +1,5 @@
 package top.continew.admin.business.service.Impl;
 
-import cn.dev33.satoken.stp.SaLoginConfig;
-import cn.dev33.satoken.stp.SaTokenInfo;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.util.ObjUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
@@ -18,19 +7,8 @@ import top.continew.admin.business.mapper.TgUserMapper;
 import top.continew.admin.business.model.entity.TgUser;
 import top.continew.admin.business.model.req.TgUserReq;
 import top.continew.admin.business.service.ITgUserService;
-import top.continew.admin.common.context.UserContext;
-import top.continew.admin.common.context.UserContextHolder;
-import top.continew.admin.common.context.UserExtraContext;
-import top.continew.starter.data.mp.base.BaseMapper;
 import top.continew.starter.extension.crud.model.resp.PageResp;
-import top.continew.starter.web.util.SpringWebUtils;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -49,38 +27,8 @@ public class TgUserServiceImpl extends ServiceImpl<TgUserMapper, TgUser> impleme
         page.setCurrent(queryVo.getPage() != 0 ? queryVo.getPage() : 1);
         page.setSize(queryVo.getSize() != 0 ? queryVo.getSize() : 10);
 
-        LambdaQueryWrapper<TgUser> queryWrapper = new LambdaQueryWrapper<>();
-        String userName = queryVo.getUserName();
-        if (StrUtil.isNotBlank(userName)) {
-            queryWrapper.and(w -> {
-                w.like(StrUtil.isNotBlank(userName), TgUser::getFirstName, userName)
-                        .or()
-                        .like(StrUtil.isNotBlank(userName), TgUser::getLastName, userName)
-                        .or()
-                        .like(StrUtil.isNotBlank(userName), TgUser::getTgAccount, userName);
-            });
-        }
-        // 处理时间范围查询
-        try {
-            List<Date> times = queryVo.getTime();
-            if (CollUtil.isNotEmpty(times) && times.size() == 2) {
-                Date startime = times.get(0);
-                Date endtime = times.get(1);
-
-                LocalDateTime startDateTime = LocalDateTime.ofInstant(startime.toInstant(), ZoneId.systemDefault());
-                queryWrapper.ge(TgUser::getCreatedTime, startDateTime);
-
-                LocalDateTime endDateTime = LocalDateTime.ofInstant(endtime.toInstant(), ZoneId.systemDefault());
-                queryWrapper.le(TgUser::getCreatedTime, endDateTime);
-            }
-
-        } catch (DateTimeParseException e) {
-            throw new RuntimeException("日期格式错误,正确格式为:yyyy-MM-dd HH:mm:ss");
-        }
-
-        queryWrapper.orderByDesc(TgUser::getCreatedTime);
-        page = page(page, queryWrapper);
-        PageResp<TgUser> pageResp = PageResp.build(page, TgUser.class);
-        return pageResp;
+        List<TgUser> tgUserOfPage = getBaseMapper().getTgUserOfPage(queryVo, page);
+        page.setRecords(tgUserOfPage);
+        return PageResp.build(page, TgUser.class);
     }
 }

+ 25 - 0
continew-module-system/src/main/resources/mapper/TgUserMapper.xml

@@ -41,10 +41,35 @@
         <result column="user_amount" property="userAmount"/>
         <result column="created_time" property="createdTime"/>
         <result column="updated_time" property="updatedTime"/>
+        <result column="referrerName" property="referrerName"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, tg_id, tg_account, first_name, last_name, nickname, real_name, avatar, language_code, wallet_address, age_limit, old_user, check_language, login_ip, login_time, ip_address_convert, disable_flag, channel,passenger_flow_way, login_telegram, coin_address, password, mobile, sex, invite_code, referrer_id, invite_reward, new_user_flag, history_key, key_num, airdrop_coin, gold_coin_amount, gold_coin_total_his, development_gold_coin, online_time, user_amount, created_time, updated_time
     </sql>
+
+    <select id="getTgUserOfPage" resultMap="BaseResultMap">
+        select tu.*,
+        case
+        when ru.first_name IS NOT NULL or ru.last_name IS NOT NULL
+        then concat(ru.first_name, ' ', ru.last_name)
+        else ru.tg_account
+        end as referrerName
+        from b_tg_user tu
+        left join b_tg_user ru on tu.referrer_id=ru.id
+        <where>
+            <if test="query.userName != null and query.userName != ''">
+                AND (
+                tu.tg_account LIKE CONCAT('%', #{query.userName}, '%')
+                OR tu.first_name LIKE CONCAT('%', #{query.userName}, '%')
+                OR tu.last_name LIKE CONCAT('%', #{query.userName}, '%')
+                )
+            </if>
+            <if test="query.time != null and query.time.size() == 2">
+                AND tu.created_time BETWEEN #{query.time[0]} AND #{query.time[1]}
+            </if>
+        </where>
+        order by tu.created_time desc
+    </select>
 </mapper>