无关风月
2024-08-20 f237a61c412870933f47316a011237cd538de9bc
新增需求
9个文件已添加
29个文件已修改
2474 ■■■■ 已修改文件
guns-admin/pom.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/AppUserController.java 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/FindController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/SportsController.java 737 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserController.java 701 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserBlackMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/BlackUserMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CourseMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FitnessPosition.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Package.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserBlack.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserBlackService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserBlackServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpUtilIOS.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/IosPalUtils.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JwsUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/BlackListVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/BuyDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/CourseDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/CourseList.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/PackageListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/pom.xml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/AppUserController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/FitnessController.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/OssController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SysDeptController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SysRoleController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SystemController.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/UserController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/dao/AppUserMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/model/FitnessPosition.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/model/Package.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/FitnessPositionVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/OrderListVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/PackageDetailVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
guns-admin/pom.xml
@@ -16,22 +16,27 @@
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version> <!-- Replace with the latest version -->
        </dependency>
        <dependency>
            <groupId>com.huaweicloud</groupId>
            <artifactId>esdk-obs-java-bundle</artifactId>
            <version>3.23.9</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>com.huaweicloud.sdk</groupId>-->
<!--            <artifactId>huaweicloud-sdk-iam</artifactId>-->
<!--            <version>3.1.88</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.huaweicloud.sdk</groupId>-->
<!--            <artifactId>huaweicloud-sdk-moderation</artifactId>-->
<!--            <version>3.1.87</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-bundle</artifactId>
@@ -44,7 +49,6 @@
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/java-sdk-core-3.2.5.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.mindrot</groupId>
            <artifactId>jbcrypt</artifactId>
@@ -295,6 +299,12 @@
            <artifactId>emoji-java</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
guns-admin/src/main/java/com/stylefeng/guns/modular/api/AppUserController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.huaweicloud.sdk.core.exception.SdkErrorMessage;
import com.stylefeng.guns.core.shiro.ShiroKit;
import com.stylefeng.guns.core.util.JwtTokenUtil;
import com.stylefeng.guns.core.util.MD5Util;
import com.stylefeng.guns.core.util.ToolUtil;
@@ -82,8 +83,12 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public ResultUtil isFirst() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Login userId = loginService.selectOne(new EntityWrapper<Login>()
                .eq("userId", appUserService.getAppUser().getId()));
                .eq("userId", appUser.getId()));
        if (userId == null){
            // 首次登录
            Login login = new Login();
@@ -108,6 +113,9 @@
    public ResultUtil<String> updatePassword(String password, String newPassword,String code) {
        try {
            AppUser appUser = appUserService.getAppUser();
            if (appUser == null){
                return ResultUtil.tokenErr("登录失效");
            }
            if (null == appUser) {
                return ResultUtil.error("请先登录!", "");
            }
@@ -177,15 +185,25 @@
            // 首次注册默认头像
            appUser1.setHeadImg("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/admin/8d9bb8b7fb9a4786a50b88863c7706ab.png");
//            appUser1.setConstellation(zodiacSign);
            appUser1.setName(addAppUserVo.getPhone());
            appUser1.setAccount(addAppUserVo.getPhone());
            appUser1.setCode(UUIDUtil.getRandomCode(6).toUpperCase());
            appUser1.setName("用户-"+appUser1.getCode());
            appUser1.setHeight(155);
            appUser1.setWeight(130D);
            appUser1.setWaistline(100);
            appUser1.setGender(1);
            // 获取当前时间
            Calendar calendar = Calendar.getInstance();
            // 将当前时间向前推30年
            calendar.add(Calendar.YEAR, -30);
            Date date30YearsAgo = calendar.getTime();
            appUser1.setBirthday(date30YearsAgo);
            // 根据邀请码 查询到用户
            if (StringUtils.hasLength(addAppUserVo.getInvitationCode())){
                AppUser code = appUserService.selectOne(new EntityWrapper<AppUser>()
                        .eq("code", addAppUserVo.getInvitationCode()));
                if (code==null){
                    return ResultUtil.errorInvite("邀请码无效",null);
                    return ResultUtil.errorInvite("邀请码无效","");
                }
                appUser1.setInviteUserId(code.getId());
            }
@@ -205,10 +223,10 @@
                // 判断当前手机号 登陆了哪些设备
                List<DeviceLogin> deviceLogins = deviceLoginService.selectList(queryWrapper);
                List<String> collect = deviceLogins.stream().map(DeviceLogin::getDevice).collect(Collectors.toList());
                if (collect.size()>=5 &&!collect.contains(addAppUserVo.getCode2())){
                    // 是一个新的设备登录 返回登陆失败的提示
                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
                }
//                if (collect.size()>=5 &&!collect.contains(addAppUserVo.getCode2())){
//                    // 是一个新的设备登录 返回登陆失败的提示
//                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
//                }
                DeviceLogin deviceLogin1 = deviceLoginService.selectOne(new EntityWrapper<DeviceLogin>()
                        .eq("device", addAppUserVo.getCode2())
                        .eq("userId", appUser1.getId()));
@@ -257,15 +275,27 @@
                return ResultUtil.errorLogin("登录失败,您的账号已被冻结!",null);
            }
            if (StringUtils.hasLength(invitationCode)){
                if (tAppUser.getCode().equals(invitationCode)){
                    return ResultUtil.error("不能绑定自己","");
                }
                if (tAppUser.getInviteUserId()!=null){
                    ResultUtil.error("ss");
                    // 登陆失败
                    return ResultUtil.errorLogin("登录失败,已绑定其他用户",null);
                    return ResultUtil.error("该手机号已绑定其他邀请码",null);
                }else{
                    // 根据邀请码 去查询用户
                    AppUser code3 = appUserService.selectOne(new EntityWrapper<AppUser>()
                            .eq("code", invitationCode));
                    if (code3!=null){
                        if (code3.getInviteUserId().equals(tAppUser.getId())){
                            return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
                        }
                    }
                    // 根据邀请码 去查询用户
                    if (code3 == null){
                        return ResultUtil.errorInvite("邀请码无效",null);
                        return ResultUtil.errorInvite("邀请码无效","");
                    }else{
                        tAppUser.setInviteUserId(code3.getId());
                        appUserService.updateById(tAppUser);
@@ -281,11 +311,11 @@
                // 判断当前手机号 登陆了哪些设备
                List<DeviceLogin> deviceLogins = deviceLoginService.selectList(queryWrapper);
                List<String> collect = deviceLogins.stream().map(DeviceLogin::getDevice).collect(Collectors.toList());
                if (collect.size()>=5 &&!collect.contains(code2)){
                    // 是一个新的设备登录 返回登陆失败的提示
                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
                }
//
//                if (collect.size()>=5 &&!collect.contains(code2)){
//                    // 是一个新的设备登录 返回登陆失败的提示
//                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
//                }
                DeviceLogin deviceLogin1 = deviceLoginService.selectOne(new EntityWrapper<DeviceLogin>()
                        .eq("device", code2)
                        .eq("userId", tAppUser.getId()));
@@ -347,7 +377,10 @@
        }
    }
    public static void main(String[] args) {
        String s = ShiroKit.md5("123456", "SA;d5#");
        System.err.println(s);
    }
    @ResponseBody
    @PostMapping("/base/appUser/loginWeChat")
    @ApiOperation(value = "微信登录", tags = {"APP-登录注册"})
@@ -364,11 +397,21 @@
                tAppUser.setOpenId(loginWeChatVo.getOpenId());
                tAppUser.setPhone(loginWeChatVo.getPhone());
                tAppUser.setPassword(Md5Util.MD5Encode("111111", null));
                tAppUser.setName(loginWeChatVo.getNickname());
                tAppUser.setName("用户-"+s);
                tAppUser.setHeadImg(loginWeChatVo.getHeadimgurl());
                tAppUser.setGender(loginWeChatVo.getSex());
                tAppUser.setState(1);
                tAppUser.setHeadImg("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/admin/8d9bb8b7fb9a4786a50b88863c7706ab.png");
            tAppUser.setHeight(155);
            tAppUser.setWeight(130D);
            tAppUser.setWaistline(100);
            tAppUser.setGender(1);
            // 获取当前时间
            Calendar calendar = Calendar.getInstance();
            // 将当前时间向前推30年
            calendar.add(Calendar.YEAR, -30);
            Date date30YearsAgo = calendar.getTime();
            tAppUser.setBirthday(date30YearsAgo);
                // 获取当前日期
                LocalDate currentDate = LocalDate.now();
                int month = currentDate.getMonthValue();
@@ -399,12 +442,12 @@
            // 判断当前手机号 登陆了哪些设备
            List<DeviceLogin> deviceLogins = deviceLoginService.selectList(queryWrapper);
            List<String> collect = deviceLogins.stream().map(DeviceLogin::getDevice).collect(Collectors.toList());
            if (collect.size()>5){
                if (!collect.contains(loginWeChatVo.getCode2())){
                    // 是一个新的设备登录 返回登陆失败的提示
                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
                }
            }
//            if (collect.size()>5){
//                if (!collect.contains(loginWeChatVo.getCode2())){
//                    // 是一个新的设备登录 返回登陆失败的提示
//                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
//                }
//            }
            DeviceLogin deviceLogin1 = deviceLoginService.selectOne(new EntityWrapper<DeviceLogin>()
                    .eq("device", loginWeChatVo.getCode2())
                    .eq("userId", tAppUser.getId()));
@@ -443,6 +486,10 @@
    })
    public ResultUtil<String> setPhone(String phone, String code, String invitationCode) {
        System.err.println("邀请码"+invitationCode);
        AppUser appUser2 = appUserService.getAppUser();
        if (appUser2 == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if (StringUtils.hasLength(invitationCode)){
            // 根据邀请码查询用户id
            AppUser appUser1 = appUserService.selectOne(new EntityWrapper<AppUser>()
@@ -450,11 +497,13 @@
                    .ne("state", 3));
            if (appUser1==null){
                return ResultUtil.errorInvite("邀请码无效",null);
            }else{
                if (appUser1.getInviteUserId().equals(appUser2.getId())){
                    return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
            }
        }
        AppUser appUser2 = appUserService.getAppUser();
        System.err.println("登录用户id"+appUser2.getId());
        System.err.println("手机号"+phone);
        }
        // 先判断当前电话是否已经被绑定了
        AppUser appUser = appUserService.selectOne(new EntityWrapper<AppUser>()
                .eq("phone", phone)
@@ -473,14 +522,14 @@
        }
        // 判断手机验证码是否相同
        String value = redisUtil.getValue(phone);
        if (!code.equals("123456")){
//        if (!code.equals("123456")){
            if (null == value){
                return ResultUtil.error("验证码无效",null);
            }
            if (!code.equals(value)){
                return ResultUtil.error("验证码错误",null);
            }
        }
//        }
        // 如果绑定的手机号 已经注册过了 同时没有绑定微信id和苹果id 那么把openId修改过去
        AppUser appUser3 = appUserService.selectOne(new EntityWrapper<AppUser>()
                .eq("phone", phone)
@@ -488,74 +537,96 @@
                .isNull("appleId")
                .ne("state", 3));
        // 微信绑定
        if (appUser3!=null && StringUtils.hasLength(appUser3.getOpenId())){
        if (appUser3!=null && StringUtils.hasLength(appUser2.getOpenId())){
            appUser3.setOpenId(appUser2.getOpenId());
            appUserService.updateById(appUser3);
            // 同时删除这条数据
            appUserService.deleteById(appUser2.getId());
            if (StringUtils.hasLength(invitationCode)){
                if (appUser3.getInviteUserId()!=null){
                    return ResultUtil.errorLogin("登录失败,已绑定其他用户",null);
                    return ResultUtil.error("该手机号已绑定其他邀请码",null);
                }
                if (appUser3.getCode().equals(invitationCode)){
                    return ResultUtil.error("不能绑定自己","");
                }
                // 根据邀请码查询用户id
                AppUser appUser1 = appUserService.selectOne(new EntityWrapper<AppUser>()
                        .eq("code", invitationCode)
                        .ne("state", 3));
                if (appUser1==null){
                    return ResultUtil.errorInvite("邀请码无效",null);
                    return ResultUtil.errorInvite("邀请码无效","");
                }else{
                    if (appUser1.getInviteUserId().equals(appUser2.getId())){
                        return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
                    }
                    appUser3.setInviteUserId(appUser1.getId());
                }
            }
            appUserService.updateById(appUser3);
            // 同时删除这条数据
            appUserService.deleteById(appUser2.getId());
            //生成token
            String token = JwtTokenUtil.generateToken(appUser3.getPhone());
            System.err.println("token1111--->" + token);
            //存入缓存中
            addTokenToRedis(token, appUser3.getId());
            return ResultUtil.success(token);
        }else if (appUser3!=null && StringUtils.hasLength(appUser3.getAppleId())){
        }else if (appUser3!=null && StringUtils.hasLength(appUser2.getAppleId())){
            if (appUser3.getCode().equals(invitationCode)){
                return ResultUtil.error("不能绑定自己","");
            }
            // 苹果绑定手机号
            appUser3.setAppleId(appUser2.getAppleId());
            if (!StringUtils.hasLength(appUser3.getName())){
                appUser3.setName(phone);
            if (StringUtils.hasLength(appUser3.getName())){
                // 如果已经有name了不更新
            }else{
                appUser3.setName("用户-"+appUser3.getCode());
                appUser3.setAccount(phone);
            }
            appUserService.updateById(appUser3);
            // 同时删除这条数据
            appUserService.deleteById(appUser2.getId());
            if (StringUtils.hasLength(invitationCode)){
                if (appUser3.getInviteUserId()!=null){
                    return ResultUtil.errorLogin("登录失败,已绑定其他用户",null);
                    return ResultUtil.error("该手机号已绑定其他邀请码",null);
                }
                // 根据邀请码查询用户id
                AppUser appUser1 = appUserService.selectOne(new EntityWrapper<AppUser>()
                        .eq("code", invitationCode)
                        .ne("state", 3));
                if (appUser1==null){
                    return ResultUtil.errorInvite("邀请码无效",null);
                    return ResultUtil.errorInvite("邀请码无效","");
                }else{
                    if (appUser1.getInviteUserId().equals(appUser2.getId())){
                        return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
                    }
                    appUser3.setInviteUserId(appUser1.getId());
                }
            }
            appUserService.updateById(appUser3);
            // 同时删除这条数据
            appUserService.deleteById(appUser2.getId());
            //生成token
            String token = JwtTokenUtil.generateToken(appUser3.getPhone());
            System.err.println("token1111--->" + token);
            //存入缓存中
            addTokenToRedis(token, appUser3.getId());
            return ResultUtil.success(token);
            // 绑定的手机号没有注册过
        }
        appUser2.setPhone(phone);
        appUser2.setAccount(phone);
        if (appUser2.getCode()!=null){
            appUser2.setName("用户-"+appUser2.getCode());
        }
        if (StringUtils.hasLength(invitationCode)){
            if (appUser2.getCode().equals(invitationCode)){
                return ResultUtil.error("不能绑定自己","");
            }
            if (appUser2.getInviteUserId()!=null){
                return ResultUtil.errorLogin("登录失败,已绑定其他用户",null);
                return ResultUtil.errorLogin("该手机号已绑定其他邀请码",null);
            }
            // 根据邀请码查询用户id
            AppUser appUser1 = appUserService.selectOne(new EntityWrapper<AppUser>()
                    .eq("code", invitationCode)
                    .ne("state", 3));
            if (appUser1==null){
                return ResultUtil.errorInvite("邀请码无效",null);
                return ResultUtil.errorInvite("邀请码无效","");
            }else{
                appUser2.setInviteUserId(appUser1.getId());
            }
@@ -568,6 +639,7 @@
        addTokenToRedis(token, appUser2.getId());
        return ResultUtil.success(token);
    }
    @ResponseBody
    @PostMapping("/base/appUser/loginPassword")
    @ApiOperation(value = "账号密码登录", tags = {"APP-登录注册"})
@@ -603,10 +675,10 @@
                // 判断当前手机号 登陆了哪些设备
                List<DeviceLogin> deviceLogins = deviceLoginService.selectList(queryWrapper);
                List<String> collect = deviceLogins.stream().map(DeviceLogin::getDevice).collect(Collectors.toList());
                if (collect.size()>=5 &&!collect.contains(code2)){
                    // 是一个新的设备登录 返回登陆失败的提示
                    return  ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
                }
//                if (collect.size()>=5 &&!collect.contains(code2)){
//                    // 是一个新的设备登录 返回登陆失败的提示
//                    return  ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
//                }
                DeviceLogin deviceLogin1 = deviceLoginService.selectOne(new EntityWrapper<DeviceLogin>()
                        .eq("device", code2)
                        .eq("userId", tAppUser.getId()));
@@ -648,8 +720,8 @@
            // 首次登录注册
            AppUser appUser1 = new AppUser();
            appUser1.setAppleId(appleId);
            appUser1.setName(name);
            appUser1.setAccount(name);
            appUser1.setAccount("用户"+UUIDUtil.getNumberRandom(5));
            appUser1.setPassword(MD5Util.encrypt("111111"));
            appUser1.setState(1);
            // 根据当前月份 填入星座名称
@@ -664,11 +736,22 @@
            appUser1.setHeadImg("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/admin/8d9bb8b7fb9a4786a50b88863c7706ab.png");
            appUser1.setConstellation(zodiacSign);
            appUser1.setCode(UUIDUtil.getRandomCode(6).toUpperCase());
            appUser1.setName("用户-"+appUser1.getCode());
            appUser1.setHeight(155);
            appUser1.setWeight(130D);
            appUser1.setWaistline(100);
            appUser1.setGender(1);
            // 获取当前时间
            Calendar calendar = Calendar.getInstance();
            // 将当前时间向前推30年
            calendar.add(Calendar.YEAR, -30);
            Date date30YearsAgo = calendar.getTime();
            appUser1.setBirthday(date30YearsAgo);
            // 根据邀请码 查询到用户
            if (StringUtils.hasLength(code2)){
                AppUser code3 = appUserService.selectOne(new EntityWrapper<AppUser>()
                        .eq("code", code2));
                if (code==null){
                if (code3==null){
                    return ResultUtil.errorInvite("邀请码无效",null);
                }
                appUser1.setInviteUserId(code3.getId());
@@ -689,10 +772,10 @@
                // 判断当前手机号 登陆了哪些设备
                List<DeviceLogin> deviceLogins = deviceLoginService.selectList(queryWrapper);
                List<String> collect = deviceLogins.stream().map(DeviceLogin::getDevice).collect(Collectors.toList());
                if (collect.size()>=5 &&!collect.contains(code)){
                    // 是一个新的设备登录 返回登陆失败的提示
                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
                }
//                if (collect.size()>=5 &&!collect.contains(code)){
//                    // 是一个新的设备登录 返回登陆失败的提示
//                    return ResultUtil.errorDevice("登录失败,同一账号一年内最多登录五部手机",null);
//                }
                DeviceLogin deviceLogin1 = deviceLoginService.selectOne(new EntityWrapper<DeviceLogin>()
                        .eq("device", code)
                        .eq("userId", appUser1.getId()));
guns-admin/src/main/java/com/stylefeng/guns/modular/api/FindController.java
@@ -63,7 +63,11 @@
    })
    public ResultUtil<List<MessagesVO>> messageList(MessageQuery req) {
        req.setPageNum((req.getPageNum() - 1) * req.getPageSize());
        Integer id = appUserService.getAppUser().getId();
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUser.getId();
        List<MessagesVO> res = messageService.selectMessages(id,req);
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
        for (MessagesVO re : res) {
@@ -100,8 +104,12 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<Integer> messageCount() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        int size = messageService.selectList(new EntityWrapper<Message>()
                .eq("userId", appUserService.getAppUser().getId())
                .eq("userId", appUser.getId())
                .eq("isRead", 0)).size();
        return ResultUtil.success(size);
    }
@@ -119,6 +127,10 @@
            @ApiImplicitParam(name = "content", value = "回复内容", required = true),
    })
    public ResultUtil addComment(Integer findId,Integer pid,Integer replyUserId,String content,Integer replyCommentId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        AuditVO content1 = auditUtil.content(content);
        switch (content1.getType()){
            case "terrorism":
@@ -174,12 +186,17 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil collectCourse(AddFindDTO dto) {
    public ResultUtil collectCourse(AddFindDTO dto) throws InterruptedException {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if (StringUtils.hasLength(dto.getVideo())){
                // 根据id回查
                String id = auditUtil.video(dto.getVideo());
                String audit = auditUtil.audit(id);
                while(audit.equals("running")){
                    Thread.sleep(500);
                    audit = auditUtil.audit(id);
                    System.err.println("未审核完");
                }
@@ -261,6 +278,10 @@
            @ApiImplicitParam(name = "id", value = "动态id", required = true)
    })
    public ResultUtil<FindVO> findDetail(Integer id) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Find find1 = findService.selectById(id);
        FindVO findVO = new FindVO();
        findVO.setId(find1.getId());
@@ -282,7 +303,7 @@
                .eq("findId", find1.getId())
                .eq("isShow", 1)).size();
        findVO.setComment(size);
        AppUser appUser = appUserService.selectById(find1.getUserId());
        findVO.setHeadImg(appUser.getHeadImg());
        findVO.setUserName(appUser.getName());
        findVO.setClockIn(appUser.getClockIn());
@@ -308,6 +329,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<List<CommentVO>> findDetail(CommentQuery query) throws ParseException {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        query.setPageNum((query.getPageNum() - 1) * query.getPageSize());
        // 查询一级评论
        List<CommentVO> one = findCommentService.getCommentOne(query);
@@ -413,6 +438,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<List<CommentVO>> findCommentListOne(CommentQuery query) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        // 查询一级评论
        List<CommentVO> one = findCommentService.getCommentThree(query);
        for (CommentVO commentVO : one) {
@@ -499,6 +528,10 @@
            @ApiImplicitParam(name = "type", value = "类型 1 = 点赞动态 2 = 点赞评论", required = true)
    })
    public ResultUtil cancelLike(Integer id,Integer type) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Like like = likeService.selectOne(new EntityWrapper<Like>()
                .eq("userId", appUserService.getAppUser().getId())
                .eq("type", type)
@@ -518,8 +551,11 @@
            @ApiImplicitParam(name = "type", value = "类型 1 = 点赞动态 2 = 点赞评论", required = true)
    })
    public ResultUtil Like(Integer id,Integer type,Integer findCommentId) {
        // 点赞之后要加入一条消息
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        // 点赞之后要加入一条消息
        Message message = new Message();
        message.setType(2);
        message.setFindId(id);
@@ -601,6 +637,10 @@
            @ApiImplicitParam(name = "type", value = "类型 1 = 举报动态 2 = 举报评论", required = true)
    })
    public ResultUtil report(Integer id,String content,Integer type) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        AuditVO content1 = auditUtil.content(content);
        switch (content1.getType()){
            case "terrorism":
@@ -639,6 +679,8 @@
        return ResultUtil.success("举报成功");
    }
    @Autowired
    private IUserBlackService userBlackService;
    @ResponseBody
    @PostMapping("/base/find/findList")
    @ApiOperation(value = "主页", tags = {"发现"})
@@ -647,13 +689,29 @@
    })
    public ResultUtil<List<FindVO>> findList(FindQuery query) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        EntityWrapper<Find> wrapper = new EntityWrapper<>();
        if (StringUtils.hasLength(query.getUserNameOrTitle())){
            wrapper.like("title",query.getUserNameOrTitle());
        }
        List<FindVO> result = findService.findList(query.getUserNameOrTitle());
        for (FindVO find : result) {
        List<FindVO> res = new ArrayList<>();
        // 被拉黑用户ids
        List<Integer> collect = userBlackService.selectList(new EntityWrapper<UserBlack>()
                .eq("userId", appUser.getId())).stream().map(UserBlack::getBlackUserId).collect(Collectors.toList());
        // todo 2.0新增 被拉黑不查看双方动态
        for (FindVO find : result) {
            // 如果用户拉黑了 那么不展示该条动态
            if (collect.size()>0){
                if (collect.contains(find.getUserId())){
                    // 如果当前动态的发布用户id 是登录用户的黑名单 那过滤掉该条动态
                    continue;
                }
            }
            FindVO temp = new FindVO();
            BeanUtils.copyProperties(find,temp);
            Like like = likeService.selectOne(new EntityWrapper<Like>()
@@ -671,8 +729,9 @@
                    .eq("findId", find.getId())
                    .eq("isShow", 1)).size();
            find.setComment(size);
            res.add(find);
        }
        List<FindVO> testing = testing(result.size(), query.getPageNum(), query.getPageSize(), result);
        List<FindVO> testing = testing(res.size(), query.getPageNum(), query.getPageSize(), res);
        return ResultUtil.success(testing);
    }
    public static List<FindVO> testing(long total, long current, long size, List<FindVO> str){
guns-admin/src/main/java/com/stylefeng/guns/modular/api/SportsController.java
@@ -1,12 +1,26 @@
package com.stylefeng.guns.modular.api;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.security.KeyFactory;
import java.security.PrivilegedAction;
import java.security.PublicKey;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.ECPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.sql.Timestamp;
import java.time.LocalTime;
import java.util.Date;
import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.stylefeng.guns.modular.system.dto.AddUserWatchDTO;
import com.stylefeng.guns.modular.system.model.*;
@@ -16,6 +30,8 @@
import com.stylefeng.guns.modular.system.util.Page;
import com.stylefeng.guns.modular.system.vo.*;
import com.stylefeng.guns.modular.system.dto.CourseQuery;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModelProperty;
@@ -86,6 +102,7 @@
        return "LO" + sdf.format(new Date()) + UUIDUtil.getRandomCode(5);
    }
    @Autowired
    private IRechargeService rechargeService;
    @PostMapping("/iospay")
@@ -153,11 +170,32 @@
                          BigDecimal realMoney) throws Exception {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        BaseWarpper baseWarpper = new BaseWarpper();
        switch (buyType){
            case 1:
                Course course = courseService.selectById(id);
                BigDecimal amount = fitnessPositionService.selectById(course.getPositionId()).getAmount();
                FitnessPosition fitnessPosition = fitnessPositionService.selectById(course.getPositionId());
                BigDecimal amount = new BigDecimal(BigInteger.ZERO);
                    switch (course.getDifficulty()){
                        case 1:
                            amount = fitnessPosition.getAmount();
                            break;
                        case 2:
                            amount = fitnessPosition.getAmount2();
                            break;
                        case 3:
                            amount = fitnessPosition.getAmount3();
                            break;
                        case 4:
                            amount = fitnessPosition.getAmount4();
                            break;
                        case 5:
                            amount = fitnessPosition.getAmount5();
                            break;
                    }
                // 购买课程
                OrderCourse orderCourse = new OrderCourse();
                orderCourse.setCode(this.getOrderNum());
@@ -218,7 +256,68 @@
        }
        return ResultUtil.success();
    }
    /**
     * 购买套餐微信支付回调
     *
     * @param request
     * @param response
     */
    @ResponseBody
    @PostMapping("/base/testApple")
    public void testApple(HttpServletRequest request, HttpServletResponse response) {
        try {
            Map<String, String> params = new HashMap<String, String>();
            System.err.println("请求"+request);
            BufferedReader reader = request.getReader();
            String string1 = reader.toString();
            System.err.println("请求reader"+string1);
            StringBuilder requestBody = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                requestBody.append(line);
            }
            System.err.println("全部请求体"+requestBody);
            org.json.JSONObject jsonObject1 = new org.json.JSONObject(requestBody.toString());
            System.err.println("json串"+jsonObject1);
            String o = jsonObject1.getString("signedPayload");
            JSONObject payload = verifyAndGet(o);
            String notificationType = payload.get("notificationType").toString();
            JSONObject data = payload.getJSONObject("data");
            String signedTransactionInfo = data.get("signedTransactionInfo").toString();
            String environment = data.get("environment").toString();
            JSONObject transactionInfo = verifyAndGet(signedTransactionInfo);
            String transactionId = transactionInfo.get("transactionId").toString();
            String originalTransactionId = transactionInfo.get("originalTransactionId").toString();
            String productId = transactionInfo.get("productId").toString();
            System.err.println("json串"+transactionInfo);
            System.err.println("data"+data);
            // 苹果流水号
            String string = transactionInfo.getString("originalTransactionId");
            System.err.println("苹果流水号"+string);
            Recharge orderNumber = rechargeService.selectOne(new EntityWrapper<Recharge>()
                    .eq("orderNumber", string));
            if (orderNumber!=null){
                if (orderNumber.getState()!=2){
                    // 进入
                    orderNumber.setState(2);
                    orderNumber.setPayTime(new Date());
                    rechargeService.updateById(orderNumber);
                    BigDecimal amount = orderNumber.getAmount();
                    AppUser appUser = appUserService.selectById(orderNumber.getUserId());
                    BigDecimal add = appUser.getBalance().add(amount);
                    appUser.setBalance(add);
                    appUserService.updateById(appUser);
                }
            }
            PrintWriter out = response.getWriter();
            out.write("success");
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 购买套餐微信支付回调
     *
@@ -246,6 +345,67 @@
                order.setPayTime(new Date());
                order.setPayType(1);
                orderService.updateById(order);
                BigDecimal divisor = new BigDecimal("100");
                // 计算提成
                SysSet sysSet = sysSetService.selectById(1);
                // 邀请人可获得被邀请人消费金额比例
                String people = sysSet.getPeople();
                // 团队长可获得团员消费金额比例
                String header = sysSet.getHeader();
                // 邀请人比例
                BigDecimal bigDecimal = new BigDecimal(people).divide(divisor);
                // 获取金额
                BigDecimal multiply = order.getRealMoney().multiply(bigDecimal);
                BigDecimal bigDecimal1 = multiply.setScale(2, BigDecimal.ROUND_DOWN);
                // 如果使用了优惠券将优惠券修改为已消费
                if (order.getCouponId()!=null){
                    CouponReceive couponReceive1 = couponReceiveService.selectById(order.getCouponId());
                    couponReceive1.setState(2);
                    couponReceiveService.updateById(couponReceive1);
                }
                AppUser appUser = appUserService.selectById(order.getUserId());
                // 如果当前用户有邀请人
                if (appUser.getInviteUserId()!=null){
                    if (StringUtils.hasLength(people)){
                        Invite invite = new Invite();
                        invite.setUserId(appUser.getId());
                        invite.setInsertTime(new Date());
                        invite.setAmount(bigDecimal1);
                        invite.setConsume(order.getRealMoney());
                        invite.setGiftUserId(appUser.getInviteUserId());
                        invite.setType(1);
                        inviteService.insert(invite);
                        // 给用户加余额
                        AppUser appUser1 = appUserService.selectById(appUser.getInviteUserId());
                        BigDecimal balance1 = appUser1.getBalance();
                        BigDecimal add = balance1.add(bigDecimal1);
                        appUser1.setBalance(add);
                        appUserService.updateById(appUser1);
                    }
                    if (StringUtils.hasLength(header)){
                        // 先判断当前用户有没有团队长
                        if (appUserService.selectById(appUser.getInviteUserId()).getInviteUserId()!=null){
                            // 有团队长
                            BigDecimal bigDecimal2 = new BigDecimal(header).divide(divisor);
                            BigDecimal multiply1 = order.getRealMoney().multiply(bigDecimal2);
                            BigDecimal bigDecimal3 = multiply1.setScale(2, BigDecimal.ROUND_DOWN);
                            Invite invite = new Invite();
                            invite.setUserId(appUser.getId());
                            invite.setInsertTime(new Date());
                            invite.setAmount(bigDecimal3);
                            invite.setConsume(order.getRealMoney());
                            invite.setGiftUserId(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            invite.setType(2);
                            inviteService.insert(invite);
                            // 给用户加余额
                            AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            BigDecimal balance1 = appUser1.getBalance();
                            BigDecimal add = balance1.add(bigDecimal1);
//                            appUser1.setBalance(add);
                            appUserService.updateById(appUser1);
                        }
                    }
                }
                PrintWriter out = response.getWriter();
                out.write(result);
                out.flush();
@@ -282,6 +442,68 @@
                orderCourse.setPayType(1);
                orderCourse.setPayTime(new Date());
                orderCourseService.updateById(orderCourse);
                // 如果使用了优惠券将优惠券修改为已消费
                if (orderCourse.getCouponId()!=null){
                    CouponReceive couponReceive1 = couponReceiveService.selectById(orderCourse.getCouponId());
                    couponReceive1.setState(2);
                    couponReceiveService.updateById(couponReceive1);
                }
                BigDecimal divisor = new BigDecimal("100");
                // 计算提成
                SysSet sysSet = sysSetService.selectById(1);
                // 邀请人可获得被邀请人消费金额比例
                String people = sysSet.getPeople();
                // 团队长可获得团员消费金额比例
                String header = sysSet.getHeader();
                // 邀请人比例
                BigDecimal bigDecimal = new BigDecimal(people).divide(divisor);
                // 获取金额
                BigDecimal multiply = orderCourse.getRealMoney().multiply(bigDecimal);
                BigDecimal bigDecimal1 = multiply.setScale(2, BigDecimal.ROUND_DOWN);
                AppUser appUser = appUserService.selectById(orderCourse.getUserId());
                // 如果当前用户有邀请人
                if (appUser.getInviteUserId()!=null){
                    if (StringUtils.hasLength(people)){
                        Invite invite = new Invite();
                        invite.setUserId(appUser.getId());
                        invite.setInsertTime(new Date());
                        invite.setAmount(bigDecimal1);
                        invite.setConsume(orderCourse.getRealMoney());
                        invite.setGiftUserId(appUser.getInviteUserId());
                        invite.setType(1);
                        inviteService.insert(invite);
                        // 给用户加余额
                        AppUser appUser1 = appUserService.selectById(appUser.getInviteUserId());
                        BigDecimal balance1 = appUser1.getBalance();
                        BigDecimal add = balance1.add(bigDecimal1);
                        appUser1.setBalance(add);
                        appUserService.updateById(appUser1);
                    }
                    if (StringUtils.hasLength(header)){
                        // 先判断当前用户有没有团队长
                        if (appUserService.selectById(appUser.getInviteUserId()).getInviteUserId()!=null){
                            // 有团队长
                            BigDecimal bigDecimal2 = new BigDecimal(header).divide(divisor);
                            BigDecimal multiply1 = orderCourse.getRealMoney().multiply(bigDecimal2);
                            BigDecimal bigDecimal3 = multiply1.setScale(2, BigDecimal.ROUND_DOWN);
                            Invite invite = new Invite();
                            invite.setUserId(appUser.getId());
                            invite.setInsertTime(new Date());
                            invite.setAmount(bigDecimal3);
                            invite.setConsume(orderCourse.getRealMoney());
                            invite.setGiftUserId(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            invite.setType(2);
                            inviteService.insert(invite);
                            // 给用户加余额
                            AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            BigDecimal balance1 = appUser1.getBalance();
                            BigDecimal add = balance1.add(bigDecimal1);
//                            appUser1.setBalance(add);
                            appUserService.updateById(appUser1);
                        }
                    }
                }
                PrintWriter out = response.getWriter();
                out.write(result);
                out.flush();
@@ -320,7 +542,11 @@
                recharge.setPayTime(new Date());
                recharge.setPayType(1);
                rechargeService.updateById(recharge);
                AppUser appUser = appUserService.selectById(recharge.getUserId());
                BigDecimal balance = appUser.getBalance();
                BigDecimal add = balance.add(recharge.getAmount());
                appUser.setBalance(add);
                appUserService.updateById(appUser);
                PrintWriter out = response.getWriter();
                out.write(result);
                out.flush();
@@ -330,8 +556,90 @@
            e.printStackTrace();
        }
    }
    @ResponseBody
    @PostMapping("/base/applePayResult")
    public void applePayResult(HttpServletRequest request, HttpServletResponse response) {
    }
    @Autowired
    private IInviteService inviteService;
    @ResponseBody
    @PostMapping("/base/sports/payApple")
    @ApiOperation(value = "苹果支付补偿", tags = {"运动"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
            @ApiImplicitParam(name = "id", value = "课程id或者套餐id", required = true),
            @ApiImplicitParam(name = "buyType", value = "购买类型 1=购买课程 2=购买套餐 ", required = true),
            @ApiImplicitParam(name = "transactionReceipt", value = "苹果账单"),
    })
    public ResultUtil payApple(
                          Integer id,
                          Integer buyType,
                          String transactionReceipt) throws Exception {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        switch (buyType){
            case 1:
                Course orderCourse1 = courseService.selectById(id);
                FitnessPosition fitnessPosition = fitnessPositionService.selectById(orderCourse1.getPositionId());
                switch (orderCourse1.getDifficulty()){
                    case 1:
                        fitnessPosition.setAmount(fitnessPosition.getAppleAmount());
                        break;
                    case 2:
                        fitnessPosition.setAmount(fitnessPosition.getAppleAmount2());
                        break;
                    case 3:
                        fitnessPosition.setAmount(fitnessPosition.getAppleAmount3());
                        break;
                    case 4:
                        fitnessPosition.setAmount(fitnessPosition.getAppleAmount4());
                        break;
                    case 5:
                        fitnessPosition.setAmount(fitnessPosition.getAppleAmount5());
                        break;
                }
                Boolean success1 = IosPalUtils.isSuccess(transactionReceipt);
                if (success1){
                    OrderCourse orderCourse = new OrderCourse();
                    orderCourse.setCode(this.getOrderNum());
                    orderCourse.setOrderNumber(this.getOrderNum());
                    orderCourse.setUserId(appUser.getId());
                    orderCourse.setPayTime(new Date());
                    orderCourse.setInsertTime(new Date());
                    orderCourse.setPayType(4);
                    orderCourse.setAmount(fitnessPosition.getAppleAmount());
                    orderCourse.setCouponId(null);
                    orderCourse.setRealMoney(fitnessPosition.getAppleAmount());
                    orderCourse.setState(2);
                    orderCourse.setCourseId(id);
                    orderCourseService.insert(orderCourse);
                }
                break;
            case 2:
                Package orderCourse2 = packageService.selectById(id);
                Boolean success2 = IosPalUtils.isSuccess(transactionReceipt);
                if (success2){
                    Order orderCourse = new Order();
                    orderCourse.setCode(this.getOrderNum());
                    orderCourse.setOrderNumber(this.getOrderNum());
                    orderCourse.setUserId(appUser.getId());
                    orderCourse.setPayTime(new Date());
                    orderCourse.setInsertTime(new Date());
                    orderCourse.setPayType(4);
                    orderCourse.setAmount(orderCourse2.getAppleAmount());
                    orderCourse.setCouponId(null);
                    orderCourse.setRealMoney(orderCourse2.getAppleAmount());
                    orderCourse.setState(2);
                    orderCourse.setPackageId(id);
                    orderService.insert(orderCourse);
                }
                break;
        }
        return ResultUtil.success();
    }
    @ResponseBody
    @PostMapping("/base/sports/pay")
    @ApiOperation(value = "支付", tags = {"运动"})
@@ -351,26 +659,57 @@
                          String transactionIdentifier,
                          BigDecimal orderMoney) throws Exception {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        switch (buyType){
            case 1:
                OrderCourse orderCourse = orderCourseService.selectOne(new EntityWrapper<OrderCourse>()
                        .eq("id",id)
                        .eq("userId",appUser.getId()));
//                if (orderCourse != null){
//                    payType = orderCourse.getPayType();
//                }
                break;
            case 2:
                Order order = orderService.selectOne(new EntityWrapper<Order>()
                        .eq("id",id)
                        .eq("userId",appUser.getId()));
//                if (order!=null){
//                    payType = order.getPayType();
//                }
                break;
            case 3:
                Recharge recharge1 = rechargeService.selectOne(new EntityWrapper<Recharge>()
                        .eq("id",id)
                        .eq("userId",appUser.getId()));
                if (recharge1 != null){
                    if (payType == 4){
                        recharge1.setPayType(3);
                    }else{
                        recharge1.setPayType(payType);
                    }
//                    payType = recharge1.getPayType();
                    recharge1.setOrderNumber(transactionIdentifier);
                    rechargeService.updateById(recharge1);
                }
                break;
        }
        Recharge recharge1 = rechargeService.selectOne(new EntityWrapper<Recharge>()
                .eq("id",id)
                .eq("userId",appUser.getId()));
        OrderCourse orderCourse = orderCourseService.selectOne(new EntityWrapper<OrderCourse>()
        .eq("id",id)
        .eq("userId",appUser.getId()));
        Order order = orderService.selectOne(new EntityWrapper<Order>()
                .eq("id",id)
                .eq("userId",appUser.getId()));
        Recharge recharge1 = rechargeService.selectOne(new EntityWrapper<Recharge>()
                .eq("id",id)
                .eq("userId",appUser.getId()));
        if (recharge1 != null){
            payType = recharge1.getPayType();
        }else if (order!=null){
            payType = order.getPayType();
        } else if (orderCourse != null){
            payType = orderCourse.getPayType();
        }
        switch (payType){
            case 1:
                switch (buyType){
                    case 1:
                        return payMoneyUtil.weixinpay
                                ("购买课程下单支付", "",
                                        id + "_" +buyType+"_"+
@@ -378,6 +717,7 @@
                                        orderCourse.getRealMoney().toString(),
                                        "/base/wxPayBuyCourse", "APP", "");
                    case 2:
                        return payMoneyUtil.weixinpay
                                ("购买套餐下单支付", "",
                                        id + "_" +buyType+"_"+
@@ -385,6 +725,7 @@
                                        order.getRealMoney().toString(),
                                        "/base/wxPayBuyPackage", "APP", "");
                    case 3:
                        return payMoneyUtil.weixinpay
                                ("充值余额下单支付", "",
                                        id + "_" +buyType+"_"+
@@ -494,7 +835,7 @@
                                    AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                                    BigDecimal balance1 = appUser1.getBalance();
                                    BigDecimal add = balance1.add(bigDecimal1);
                                    appUser1.setBalance(add);
//                                    appUser1.setBalance(add);
                                    appUserService.updateById(appUser1);
                                }
                            }
@@ -565,7 +906,7 @@
                                    AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                                    BigDecimal balance5 = appUser1.getBalance();
                                    BigDecimal add = balance5.add(bigDecimal3);
                                    appUser1.setBalance(add);
//                                    appUser1.setBalance(add);
                                    appUserService.updateById(appUser1);
                                }
                            }
@@ -578,57 +919,39 @@
                    // 苹果支付 全部用余额来购买 如果余额不足 提示购买余额
                    case 1:
                        // 购买课程
                        BigDecimal realMoney = orderCourse.getRealMoney();
                        if (appUser.getBalance().compareTo(realMoney)<0) {
                            return ResultUtil.error("余额不足");
                        Boolean success = IosPalUtils.isSuccess(transactionReceipt);
                        if (success){
                            // 购买成功 将支付状态修改为已支付
                            orderCourse.setState(2);
                            orderCourse.setPayTime(new Date());
                            orderCourse.setPayType(4);
                            orderCourseService.updateById(orderCourse);
                        }
                        break;
                    case 2:
                        BigDecimal realMoney1 = order.getRealMoney();
                        if (appUser.getBalance().compareTo(realMoney1)<0) {
                            return ResultUtil.error("余额不足");
                        // 购买课程
                        Boolean success1 = IosPalUtils.isSuccess(transactionReceipt);
                        if (success1){
                            // 购买成功 将支付状态修改为已支付
                            order.setState(2);
                            order.setPayTime(new Date());
                            order.setPayType(4);
                            orderService.updateById(order);
                        }
                        break;
                        // todo 2.0ios取消余额
                    case 3:
                        recharge1.setState(2);
                        recharge1.setPayType(3);
                        rechargeService.updateById(recharge1);
                        BigDecimal amount = recharge1.getAmount();
                        BigDecimal add = appUser.getBalance().add(amount);
                        appUser.setBalance(add);
                        appUserService.updateById(appUser);
                        break;
                        Boolean success3 = IosPalUtils.isSuccess(transactionReceipt);
//                        if (success3){
//                            recharge1.setState(2);
//                            rechargeService.updateById(recharge1);
//                            BigDecimal amount = recharge1.getAmount();
//                            BigDecimal add = appUser.getBalance().add(amount);
//                            appUser.setBalance(add);
//                            appUserService.updateById(appUser);
//                            break;
//                        }
                }
//                if (StringUtils.hasLength(transactionReceipt)){
//                    // 调用苹果 查询支付结果
//                    String verifyResult  = IosVerifyUtil.buyAppVerify(transactionReceipt, 0);
//                    if (verifyResult == null) {
//                        return ResultUtil.error("苹果验证失败,返回数据为空");
//                    }else{
//                        JSONObject appleReturn = JSONObject.parseObject(verifyResult);
//                        String states = appleReturn.getString("status");
//                        //无数据则沙箱环境验证
//                        if ("21007".equals(states)) {
//                            verifyResult = IosVerifyUtil.buyAppVerify(transactionReceipt, 0);
//                            System.err.println("沙盒环境,苹果平台返回JSON:" + verifyResult);;
//                            appleReturn = JSONObject.parseObject(verifyResult);
//                            states = appleReturn.getString("status");
//                        }
//                        if (states.equals("0")) {
//                            String receipt1 = appleReturn.getString("receipt");
//                            JSONObject returnJson = JSONObject.parseObject(receipt1);
//                            String inApp = returnJson.getString("in_app");
//                            List<HashMap> inApps = JSONObject.parseArray(inApp, HashMap.class);
//                            if (inApps!=null) {
//                                // 判断交易列表有没有包含当前订单
//                            }
//                            return ResultUtil.error("未能获取获取到交易列表");
//                        } else {
//                            return ResultUtil.error("支付失败,错误码:" + states);
//                        }
//                    }
//                }
                break;
        }
        return ResultUtil.success();
@@ -718,7 +1041,7 @@
                            AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            BigDecimal balance1 = appUser1.getBalance();
                            BigDecimal add = balance1.add(bigDecimal1);
                            appUser1.setBalance(add);
//                            appUser1.setBalance(add);
                            appUserService.updateById(appUser1);
                        }
                    }
@@ -814,7 +1137,7 @@
                            AppUser appUser1 = appUserService.selectById(appUserService.selectById(appUser.getInviteUserId()).getInviteUserId());
                            BigDecimal balance1 = appUser1.getBalance();
                            BigDecimal add = balance1.add(bigDecimal1);
                            appUser1.setBalance(add);
//                            appUser1.setBalance(add);
                            appUserService.updateById(appUser1);
                        }
                    }
@@ -878,6 +1201,10 @@
            @ApiImplicitParam(value = "订单id", name = "orderId", dataType = "int", required = true),
    })
    public ResultUtil<CouponVO> success(Integer orderId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        CouponVO couponVO = new CouponVO();
        // 查询后台有没有配置首次下单赠送奖品
        SysSet sysSet = sysSetService.selectById(1);
@@ -1099,6 +1426,10 @@
            @ApiImplicitParam(value = "课程id", name = "courseId", dataType = "int", required = true)
    })
    public ResultUtil<BuyDetailVO> buyCourse(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        BuyDetailVO buyDetailVO = new BuyDetailVO();
        buyDetailVO.setId(courseId);
        // 查询课程
@@ -1108,8 +1439,29 @@
        FitnessPosition fitnessPosition = fitnessPositionService.selectById(positionId);
        FitnessType fitnessType = fitnessTypeService.selectById(fitnessPosition.getTypeId());
        if (fitnessPosition!=null && fitnessType!=null){
            typeName.append(fitnessType.getName()+"|"+fitnessPosition.getName());
            typeName.append(fitnessType.getName()+"|"+fitnessPosition.getName()+"|H"+course.getDifficulty());
            switch (course.getDifficulty()){
                case 1:
            buyDetailVO.setAmount(fitnessPosition.getAmount());
                    buyDetailVO.setAppleAmount(fitnessPosition.getAppleAmount());
                    break;
                case 2:
                    buyDetailVO.setAmount(fitnessPosition.getAmount2());
                    buyDetailVO.setAppleAmount(fitnessPosition.getAppleAmount2());
                    break;
                case 3:
                    buyDetailVO.setAmount(fitnessPosition.getAmount3());
                    buyDetailVO.setAppleAmount(fitnessPosition.getAppleAmount3());
                    break;
                case 4:
                    buyDetailVO.setAmount(fitnessPosition.getAmount4());
                    buyDetailVO.setAppleAmount(fitnessPosition.getAppleAmount4());
                    break;
                case 5:
                    buyDetailVO.setAmount(fitnessPosition.getAmount5());
                    buyDetailVO.setAppleAmount(fitnessPosition.getAppleAmount5());
                    break;
            }
        }
        buyDetailVO.setTypeName(typeName.toString());
        int size = courseService.selectList(new EntityWrapper<Course>()
@@ -1119,7 +1471,7 @@
        // 查询和这个课程同类型同部位的课程数量
        buyDetailVO.setCount(size);
        // 查询可选套餐列表 查询包含当前购买部位的课程的套餐
        List<PackageListVO> packageListVOS = new ArrayList<PackageListVO>();
        List<PackageListVO> packageListVOS = new ArrayList<>();
        List<Package> packages = packageService.selectList(new EntityWrapper<Package>()
                .eq("state", 1));
        for (Package aPackage : packages) {
@@ -1131,8 +1483,10 @@
                    packageListVO.setPackageName(aPackage.getName());
                    if (aPackage.getAmount()!=null){
                        packageListVO.setAmount(aPackage.getAmount());
                        packageListVO.setAppleAmount(aPackage.getAppleAmount());
                    }else{
                        packageListVO.setAmount(aPackage.getTotal());
                        packageListVO.setAmount(new BigDecimal(0));
                    }
                    packageListVO.setPrice(aPackage.getPrice());
                    packageListVO.setIds(aPackage.getPositions());
@@ -1151,11 +1505,12 @@
                FitnessPosition fitnessPosition1 = fitnessPositionService.selectById(Integer.valueOf(s));
                FitnessType fitnessType1 = fitnessTypeService.selectById(fitnessPosition1.getTypeId());
                if (fitnessPosition1!=null && fitnessType1!=null){
                    temp.append(fitnessType1.getName()+"|"+fitnessPosition1.getName());
                    temp.append(fitnessType1.getName()+"|"+fitnessPosition1.getName()+"|H"+course.getDifficulty());
                }
                courseVO.setTypeName(temp.toString());
                List<Course> courses = courseService.selectList(new EntityWrapper<Course>()
                        .eq("state", 1)
                        .eq("difficulty", course.getDifficulty())
                        .eq("positionId", Integer.valueOf(s)));
//                Integer tem = 0;
//                for (Course cours : courses) {
@@ -1171,7 +1526,6 @@
        }
        buyDetailVO.setPackageListVOList(packageListVOS);
        // 查询可以使用的优惠券列表
        AppUser appUser = appUserService.getAppUser();
        List<CouponReceive> couponReceives = couponReceiveService.selectList
                (new EntityWrapper<CouponReceive>()
                .eq("userId", appUser.getId())
@@ -1247,6 +1601,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public ResultUtil<StartVO> riskInfo() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        String riskInfo = sysSetService.selectById(1).getRiskInfo();
        StartVO startVO = new StartVO();
        startVO.setRiskInfo(riskInfo);
@@ -1269,6 +1627,10 @@
            @ApiImplicitParam(name = "courseId", value = "课程id", required = true)
    })
    public ResultUtil<StartTrainVO> startTrain(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        StartTrainVO startTrainVO = new StartTrainVO();
        // 根据课程id和用户id 查询用户上次播放位置
        Integer id = appUserService.getAppUser().getId();
@@ -1286,6 +1648,11 @@
        List<CourseVideo> courseVideos = courseVideoService.selectList(new EntityWrapper<CourseVideo>()
                .eq("courseId", courseId)
                .eq("isDelete", 0));
        for (CourseVideo courseVideo : courseVideos) {
            String courseVideo1 = courseVideo.getCourseVideo();
            String replace = courseVideo1.replace("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/", "http://cdn.jkcyl.cn/");
            courseVideo.setCourseVideo(replace);
        }
        int totalTime = courseVideos.stream()
                .mapToInt(CourseVideo::getTime)
                .sum();
@@ -1297,7 +1664,10 @@
                startTrainVO.setBeforeTime(0);
                startTrainVO.setBeforeVideoId(courseVideos.get(0).getId());
                startTrainVO.setRealTime(0);
                startTrainVO.setCourseVideo(courseVideos.get(0).getCourseVideo());
                // 手动替换为cdn域名
                String courseVideo = courseVideos.get(0).getCourseVideo();
                String replace = courseVideo.replace("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/", "http://cdn.jkcyl.cn/");
                startTrainVO.setCourseVideo(replace);
                startTrainVO.setVideoName(courseVideos.get(0).getVideoName());
                startTrainVO.setVideos(courseVideos);
                startTrainVO.setPosition("1/"+courseVideos.size());
@@ -1309,7 +1679,8 @@
            CourseVideo courseVideo = courseVideoService.selectById(beforeVideoId);
            if (courseVideo!=null){
                startTrainVO.setTime(courseVideo.getTime());
                startTrainVO.setCourseVideo(courseVideo.getCourseVideo());
                String replace = courseVideo.getCourseVideo().replace("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/", "http://cdn.jkcyl.cn/");
                startTrainVO.setCourseVideo(replace);
                startTrainVO.setVideoName(courseVideo.getVideoName());
                startTrainVO.setBeforeTime(beforeTime);
                startTrainVO.setBeforeVideoId(beforeVideoId);
@@ -1317,7 +1688,8 @@
            }else{
                // 如果为空 那么定位到课程下的第一条视频的0秒处
                startTrainVO.setTime(courseVideos.get(0).getTime());
                startTrainVO.setCourseVideo(courseVideos.get(0).getCourseVideo());
                String replace = courseVideos.get(0).getCourseVideo().replace("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/", "http://cdn.jkcyl.cn/");
                startTrainVO.setCourseVideo(replace);
                startTrainVO.setVideoName(courseVideos.get(0).getVideoName());
                startTrainVO.setBeforeTime(0);
                startTrainVO.setBeforeVideoId(courseVideos.get(0).getId());
@@ -1343,6 +1715,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public ResultUtil exit(AddUserWatchDTO dto) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        Integer courseId = dto.getCourseId();
        UserWatch userWatches = userWatchService.selectOne(new EntityWrapper<UserWatch>()
@@ -1377,6 +1753,10 @@
            @ApiImplicitParam(name = "courseId", value = "课程id", required = true)
    })
    public ResultUtil<CompeleteVO> clockIn(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer isFree = courseService.selectById(courseId).getIsFree();
        CompeleteVO compeleteVO = new CompeleteVO();
        Integer id = appUserService.getAppUser().getId();
@@ -1385,7 +1765,6 @@
                .eq("userId", id));
        userWatches.setClockTime(new Date());
        userWatchService.updateById(userWatches);
        AppUser appUser = appUserService.getAppUser();
        // 查询优惠券列表是否有打卡赠送 且未过期的优惠券
        List<Coupon> coupons = couponService.selectList(new EntityWrapper<Coupon>()
                .eq("grantType", 1)
@@ -1634,6 +2013,10 @@
            @ApiImplicitParam(name = "courseId", value = "课程id", required = true)
    })
    public ResultUtil<CompeleteVO> completeInfo(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Date compeleteTime = appUserService.getAppUser().getCompeleteTime();
        if (compeleteTime!=null){
            Date date = new Date();
@@ -1641,13 +2024,11 @@
            if (format.format(date).equals(format.format(compeleteTime))) {
                // 同一天那么不计算坚持运动天数
            }else{
                AppUser appUser = appUserService.getAppUser();
                appUser.setCompeleteTime(new Date());
                appUser.setTime(appUser.getTime()+1);
                appUserService.updateById(appUser);
            }
        }else{
            AppUser appUser = appUserService.getAppUser();
            appUser.setTime(appUser.getTime()+1);
            appUser.setCompeleteTime(new Date());
            appUserService.updateById(appUser);
@@ -1657,9 +2038,28 @@
                .eq("courseId", courseId)
                .eq("userId", id));
        if (userWatches!=null){
            // 打卡后 将观看记录初始化
            // 将观看记录初始化
            userWatches.setBeforeTime(0);
            userWatches.setRealTime(0);
            // 获取上次播放到的视频id
//            Integer beforeVideoId = userWatches.getBeforeVideoId();
            List<CourseVideo> courseVideos = courseVideoService.selectList(new EntityWrapper<CourseVideo>()
                    .eq("courseId", courseId)
                    .eq("isDelete", 0));
//            int index = 0;
//            for (CourseVideo courseVideo : courseVideos) {
//                if (courseVideo.getId().equals(beforeVideoId)){
//                    // 如果courseVieo不是最后一条数据 那么将courseVieo的下一条数据设置为beforeVideoId
//                    if (index<courseVideos.size()-1){
//                        userWatches.setBeforeVideoId(courseVideos.get(index+1).getId());
//                    }else{
//                        // 如果courseVieo是最后一条数据 那么设置为从第一节开始播放
//                        userWatches.setBeforeVideoId(courseVideos.get(0).getId());
//                    }
//                }
//                index++;
//            }
            userWatches.setBeforeVideoId(courseVideos.get(0).getId());
            userWatchService.updateById(userWatches);
        }else{
            UserWatch userWatch = new UserWatch();
@@ -1674,7 +2074,7 @@
            userWatch.setRealTime(0);
            userWatchService.insert(userWatch);
        }
        AppUser appUser = appUserService.getAppUser();
        // 返回页面内容
        Course course = courseService.selectById(courseId);
        CompeleteVO compeleteVO = new CompeleteVO();
@@ -1697,6 +2097,10 @@
            @ApiImplicitParam(value = "课程id", name = "courseId", dataType = "int", required = true)
    })
    public ResultUtil collectCourse(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        // 先判断用户是否收藏了该课程
        UserCollect userCollect1 = collectService.selectOne(new EntityWrapper<UserCollect>()
@@ -1724,6 +2128,12 @@
            @ApiImplicitParam(value = "课程id", name = "courseId", dataType = "int", required = true)
    })
    public ResultUtil<CourseDetailVO> courseDetail(Integer courseId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        // 推荐课程3个 相同类型 相同难度 按sort排序
        Course course = courseService.selectById(courseId);
        Integer userId = appUserService.getAppUser().getId();
        CourseDetailVO res = new CourseDetailVO();
        List<Integer> list = new ArrayList<>();
@@ -1761,7 +2171,8 @@
        if (res.getIsBuy()!=1){
            for (Order aPackage : packages) {
                Integer packageId = aPackage.getPackageId();
                String positions = packageService.selectById(packageId).getPositions();
                Package aPackage1 = packageService.selectById(packageId);
                String positions = aPackage1.getPositions();
                if (StringUtils.hasLength(positions)){
                    String[] split = positions.split(",");
                    // 通过部位ids 获取到课程ids
@@ -1770,19 +2181,26 @@
                            .collect(Collectors.toList());
                    if (positionId.contains(courseId)){
                        res.setIsBuy(1);
                        break;
                        // todo 新增需求 套餐设置指定难度 需要再判断一次难度
//                        Integer difficulty = course.getDifficulty();
//                        if (difficulty.equals(aPackage1.getDifficulty())){
//                            break;
//                       }
                    }
                }
            }
        }
        // 推荐课程3个 相同类型 相同难度 按sort排序
        if (res.getIsBuy() != 1){
            // 先查询出和这个课程同类型同部位
            Course course1 = courseService.selectById(courseId);
            // 相同的课程id
            // 相同的课程id 部位和难度相同
            List<Integer> positionId = courseService.selectList(new EntityWrapper<Course>()
                    .eq("positionId", course1.getPositionId())).stream().map(Course::getId).collect(Collectors.toList());
                    .eq("positionId", course1.getPositionId())
                    .eq("difficulty",course1.getDifficulty())
            ).stream().map(Course::getId).collect(Collectors.toList());
            // 查询下用户有没有购买其他相同部位和类型的课程 如果有 那么就算已购买
            // 查询下用户有没有购买其他相同部位和类型和难度的课程 如果有 那么就算已购买
            // 查询用户已购买的课程
            List<OrderCourse> orderCourses = orderCourseService.selectList(new EntityWrapper<OrderCourse>()
                    .eq("userId", appUserService.getAppUser().getId())
@@ -1794,8 +2212,7 @@
        }
        // 推荐课程3个 相同类型 相同难度 按sort排序
        Course course = courseService.selectById(courseId);
        Integer difficulty = course.getDifficulty();
        Integer typeId = course.getTypeId();
        List<String> strings = new ArrayList<>();
@@ -1814,6 +2231,10 @@
        List<CourseVideo> courseVideos = courseVideoService.selectList(new EntityWrapper<CourseVideo>()
                .eq("courseId", courseId)
                .eq("isDelete", 0));
        for (CourseVideo courseVideo : courseVideos) {
            String replace = courseVideo.getCourseVideo().replace("https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/", "http://cdn.jkcyl.cn/");
            courseVideo.setCourseVideo(replace);
        }
        res.setVideos(courseVideos);
        return ResultUtil.success(res);
@@ -1828,6 +2249,10 @@
    })
    public ResultUtil<List<CourseList>> myCourse(CourseQuery req) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        req.setUserId(appUser.getId());
        if (StringUtils.hasLength(req.getTime())){
            for (String s : req.getTime().split(",")) {
@@ -1888,12 +2313,18 @@
        List<Integer> list = new ArrayList<>();
        // 根据套餐ids 查询课程ids
        for (Integer integer : collect) {
            String positions = packageService.selectById(integer).getPositions();
            Package aPackage = packageService.selectById(integer);
            String positions = aPackage.getPositions();
            String difficulty = aPackage.getDifficulty();
            if (StringUtils.hasLength(positions)){
                String[] split = positions.split(",");
                // 难度ids
                String[] split1 = difficulty.split(",");
                // 通过部位ids 获取到课程ids
                List<Integer> positionId = courseService.selectList(new EntityWrapper<Course>()
                        .in("positionId", split)).stream().map(Course::getId)
                        .in("positionId", split)
                        .in("difficulty", split1)
                        ).stream().map(Course::getId)
                        .collect(Collectors.toList());
                list.addAll(positionId);
            }
@@ -1918,7 +2349,9 @@
                    // 和当前课程同类型同部位的课程
                    List<Integer> collect1 = courseService.selectList(new EntityWrapper<Course>()
                            .eq("state", 1)
                            .eq("positionId", positionId)).stream().map(Course::getId).collect(Collectors.toList());
                            .eq("positionId", positionId)
                            .eq("difficulty", course.getDifficulty())
                    ).stream().map(Course::getId).collect(Collectors.toList());
                    if (collect1.size()>0){
                        list1.addAll(collect1);
                    }
@@ -1981,6 +2414,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<List<CourseList>> courseSearch(CourseQuery req) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        req.setPageNum((req.getPageNum() - 1) * req.getPageSize());
        if (StringUtils.hasLength(req.getTime())){
            for (String s : req.getTime().split(",")) {
@@ -2044,6 +2481,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<List<Banner>> getBanner() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        List<String> strings = new ArrayList<>();
        strings.add("sort");
        List<Banner> state = bannerService.selectList(new EntityWrapper<Banner>()
@@ -2059,6 +2500,9 @@
    })
    public ResultUtil<SearchList> getList() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        // 查询用户有哪些课程购买了的
        List<OrderCourse> orderCourses = orderCourseService.selectList(new EntityWrapper<OrderCourse>()
@@ -2080,17 +2524,29 @@
            for (Order order1 : order) {
                for (String s : packageService.selectById(order1.getPackageId())
                        .getPositions().split(",")) {
                    List<Integer> positionId = courseService.selectList(new EntityWrapper<Course>()
                            .eq("positionId", s)).stream().map(Course::getId)
                    List<Integer> cId = courseService.selectList(new EntityWrapper<Course>()
                            .eq("positionId", s)
                                    .eq("state",1)).stream().map(Course::getId)
                            .collect(Collectors.toList());
                    packages.addAll(positionId);
                    packages.addAll(cId);
                }
            }
             packages = packages.stream().distinct().collect(Collectors.toList());
        }
        course.addAll(packages);
        if (packages.size()==0){
            packages.add(-1);
        }
        List<Integer> collect5 = courseService.selectList(new EntityWrapper<Course>()
                        .eq("state", 1)
                        .in("id", packages)).stream().map(Course::getId)
                .collect(Collectors.toList());
        course.addAll(collect5);
        if (course.isEmpty()){
            course.add(-1);
        }
        // 所有用户的课程ids
        List<Integer> collect = course.stream().distinct().collect(Collectors.toList());
        // 查询包含的类型和部位
        List<Integer> collect1 = courseService.selectList(new EntityWrapper<Course>()
                .in("id", collect).eq("state", 1)).stream().map(Course::getPositionId)
@@ -2099,6 +2555,12 @@
                .in("id", collect).eq("state", 1)).stream().map(Course::getTypeId)
                .collect(Collectors.toList());
        List<String> strings = new ArrayList<>();
        for (Integer i : collect1) {
            FitnessPosition fitnessPosition = fitnessPositionService.selectById(i);
            if (!strings.contains(fitnessPosition.getName())){
                strings.add(fitnessPosition.getName());
            }
        }
        List<FitnessPosition> fitnessPositions = new ArrayList<>();
        List<DifficultyVO> d = new ArrayList<>();
        List<DifficultyVO> t = new ArrayList<>();
@@ -2123,17 +2585,12 @@
        for (FitnessPosition position : positions) {
            position.setIsUse(0);
            if (strings.contains(position.getName())){
                continue;
                position.setIsUse(1);
                fitnessPositions.add(position);
            }else{
                strings.add(position.getName());
                fitnessPositions.add(position);
            }
            for (Integer integer : collect1) {
                if (position.getId().equals(integer)){
                    position.setIsUse(1);
                    break;
                }
            }
        }
        List<FitnessType> types = fitnessTypeService.selectList(new EntityWrapper<FitnessType>()
                .eq("isDelete", 0));
@@ -2153,7 +2610,7 @@
                .eq("state", 1)
                .in("id", collect));
        // 获取所有课程的时间
        List<String> collect4 = courses.stream().map(Course::getTime).distinct().collect(Collectors.toList());
        List<String> collect4 = courses.stream().map(Course::getTime).collect(Collectors.toList());
        for (String s : collect4) {
            Integer integer = Integer.valueOf(s);
            if (integer>1200){
@@ -2176,7 +2633,7 @@
            }
        }
        // 获取所有的难度
        List<Integer> collect3 = courses.stream().map(Course::getDifficulty).distinct().collect(Collectors.toList());
        List<Integer> collect3 = courses.stream().map(Course::getDifficulty).collect(Collectors.toList());
        if (collect3.contains(1)){
            DifficultyVO difficultyVO = new DifficultyVO();
            difficultyVO.setIsUse(1);
@@ -2245,15 +2702,91 @@
        searchList.setDifficulty(d);
        searchList.setTime(t);
        searchList.setFitnessPosition(fitnessPositions);
        Map<String, FitnessPosition> resultMap = new HashMap<>();
        for (FitnessPosition position : fitnessPositions) {
            if (resultMap.containsKey(position.getName())) {
                FitnessPosition existingPosition = resultMap.get(position.getName());
                if (existingPosition.getIsUse() == 0 && position.getIsUse() == 1) {
                    existingPosition.setIsUse(1);
                }
            } else {
                resultMap.put(position.getName(), position);
            }
        }
        List<FitnessPosition> resultPositions = new ArrayList<>(resultMap.values());
        searchList.setFitnessPosition(resultPositions);
        searchList.setFitnessType(types);
        return ResultUtil.success(searchList);
    }
    public static void main(String[] args) throws Exception {
        BigDecimal divisor = new BigDecimal("100");
        BigDecimal res = new BigDecimal("0.8");
        BigDecimal bigDecimal = res.divide(divisor);
        System.err.println(bigDecimal);
    public static void main(String[] args) {
        String t= "{\"signedPayload\":\"eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdBd0lCQWdJUWZUbGZkMGZOdkZXdnpDMVlJQU5zWGpBS0JnZ3Foa2pPUFFRREF6QjFNVVF3UWdZRFZRUURERHRCY0hCc1pTQlhiM0pzWkhkcFpHVWdSR1YyWld4dmNHVnlJRkpsYkdGMGFXOXVjeUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURUxNQWtHQTFVRUN3d0NSell4RXpBUkJnTlZCQW9NQ2tGd2NHeGxJRWx1WXk0eEN6QUpCZ05WQkFZVEFsVlRNQjRYRFRJek1Ea3hNakU1TlRFMU0xb1hEVEkxTVRBeE1URTVOVEUxTWxvd2daSXhRREErQmdOVkJBTU1OMUJ5YjJRZ1JVTkRJRTFoWXlCQmNIQWdVM1J2Y21VZ1lXNWtJR2xVZFc1bGN5QlRkRzl5WlNCU1pXTmxhWEIwSUZOcFoyNXBibWN4TERBcUJnTlZCQXNNSTBGd2NHeGxJRmR2Y214a2QybGtaU0JFWlhabGJHOXdaWElnVW1Wc1lYUnBiMjV6TVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Rc3dDUVlEVlFRR0V3SlZVekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCRUZFWWUvSnFUcXlRdi9kdFhrYXVESENTY1YxMjlGWVJWLzB4aUIyNG5DUWt6UWYzYXNISk9OUjVyMFJBMGFMdko0MzJoeTFTWk1vdXZ5ZnBtMjZqWFNqZ2dJSU1JSUNCREFNQmdOVkhSTUJBZjhFQWpBQU1COEdBMVVkSXdRWU1CYUFGRDh2bENOUjAxREptaWc5N2JCODVjK2xrR0taTUhBR0NDc0dBUVVGQndFQkJHUXdZakF0QmdnckJnRUZCUWN3QW9ZaGFIUjBjRG92TDJObGNuUnpMbUZ3Y0d4bExtTnZiUzkzZDJSeVp6WXVaR1Z5TURFR0NDc0dBUVVGQnpBQmhpVm9kSFJ3T2k4dmIyTnpjQzVoY0hCc1pTNWpiMjB2YjJOemNEQXpMWGQzWkhKbk5qQXlNSUlCSGdZRFZSMGdCSUlCRlRDQ0FSRXdnZ0VOQmdvcWhraUc5Mk5rQlFZQk1JSCtNSUhEQmdnckJnRUZCUWNDQWpDQnRneUJzMUpsYkdsaGJtTmxJRzl1SUhSb2FYTWdZMlZ5ZEdsbWFXTmhkR1VnWW5rZ1lXNTVJSEJoY25SNUlHRnpjM1Z0WlhNZ1lXTmpaWEIwWVc1alpTQnZaaUIwYUdVZ2RHaGxiaUJoY0hCc2FXTmhZbXhsSUhOMFlXNWtZWEprSUhSbGNtMXpJR0Z1WkNCamIyNWthWFJwYjI1eklHOW1JSFZ6WlN3Z1kyVnlkR2xtYVdOaGRHVWdjRzlzYVdONUlHRnVaQ0JqWlhKMGFXWnBZMkYwYVc5dUlIQnlZV04wYVdObElITjBZWFJsYldWdWRITXVNRFlHQ0NzR0FRVUZCd0lCRmlwb2RIUndPaTh2ZDNkM0xtRndjR3hsTG1OdmJTOWpaWEowYVdacFkyRjBaV0YxZEdodmNtbDBlUzh3SFFZRFZSME9CQllFRkFNczhQanM2VmhXR1FsekUyWk9FK0dYNE9vL01BNEdBMVVkRHdFQi93UUVBd0lIZ0RBUUJnb3Foa2lHOTJOa0Jnc0JCQUlGQURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTh5Uk5kc2twNTA2REZkUExnaExMSndBdjVKOGhCR0xhSThERXhkY1BYK2FCS2pqTzhlVW85S3BmcGNOWVVZNVlBakFQWG1NWEVaTCtRMDJhZHJtbXNoTnh6M05uS20rb3VRd1U3dkJUbjBMdmxNN3ZwczJZc2xWVGFtUllMNGFTczVrPSIsIk1JSURGakNDQXB5Z0F3SUJBZ0lVSXNHaFJ3cDBjMm52VTRZU3ljYWZQVGp6Yk5jd0NnWUlLb1pJemowRUF3TXdaekViTUJrR0ExVUVBd3dTUVhCd2JHVWdVbTl2ZENCRFFTQXRJRWN6TVNZd0pBWURWUVFMREIxQmNIQnNaU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURVRNQkVHQTFVRUNnd0tRWEJ3YkdVZ1NXNWpMakVMTUFrR0ExVUVCaE1DVlZNd0hoY05NakV3TXpFM01qQXpOekV3V2hjTk16WXdNekU1TURBd01EQXdXakIxTVVRd1FnWURWUVFERER0QmNIQnNaU0JYYjNKc1pIZHBaR1VnUkdWMlpXeHZjR1Z5SUZKbGJHRjBhVzl1Y3lCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVMTUFrR0ExVUVDd3dDUnpZeEV6QVJCZ05WQkFvTUNrRndjR3hsSUVsdVl5NHhDekFKQmdOVkJBWVRBbFZUTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVic1FLQzk0UHJsV21aWG5YZ3R4emRWSkw4VDBTR1luZ0RSR3BuZ24zTjZQVDhKTUViN0ZEaTRiQm1QaENuWjMvc3E2UEYvY0djS1hXc0w1dk90ZVJoeUo0NXgzQVNQN2NPQithYW85MGZjcHhTdi9FWkZibmlBYk5nWkdoSWhwSW80SDZNSUgzTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFBd0h3WURWUjBqQkJnd0ZvQVV1N0Rlb1ZnemlKcWtpcG5ldnIzcnI5ckxKS3N3UmdZSUt3WUJCUVVIQVFFRU9qQTRNRFlHQ0NzR0FRVUZCekFCaGlwb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxXRndjR3hsY205dmRHTmhaek13TndZRFZSMGZCREF3TGpBc29DcWdLSVltYUhSMGNEb3ZMMk55YkM1aGNIQnNaUzVqYjIwdllYQndiR1Z5YjI5MFkyRm5NeTVqY213d0hRWURWUjBPQkJZRUZEOHZsQ05SMDFESm1pZzk3YkI4NWMrbGtHS1pNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVFCZ29xaGtpRzkyTmtCZ0lCQkFJRkFEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQkFYaFNxNUl5S29nTUNQdHc0OTBCYUI2NzdDYUVHSlh1ZlFCL0VxWkdkNkNTamlDdE9udU1UYlhWWG14eGN4ZmtDTVFEVFNQeGFyWlh2TnJreFUzVGtVTUkzM3l6dkZWVlJUNHd4V0pDOTk0T3NkY1o0K1JHTnNZRHlSNWdtZHIwbkRHZz0iLCJNSUlDUXpDQ0FjbWdBd0lCQWdJSUxjWDhpTkxGUzVVd0NnWUlLb1pJemowRUF3TXdaekViTUJrR0ExVUVBd3dTUVhCd2JHVWdVbTl2ZENCRFFTQXRJRWN6TVNZd0pBWURWUVFMREIxQmNIQnNaU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURVRNQkVHQTFVRUNnd0tRWEJ3YkdVZ1NXNWpMakVMTUFrR0ExVUVCaE1DVlZNd0hoY05NVFF3TkRNd01UZ3hPVEEyV2hjTk16a3dORE13TVRneE9UQTJXakJuTVJzd0dRWURWUVFEREJKQmNIQnNaU0JTYjI5MElFTkJJQzBnUnpNeEpqQWtCZ05WQkFzTUhVRndjR3hsSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUk13RVFZRFZRUUtEQXBCY0hCc1pTQkpibU11TVFzd0NRWURWUVFHRXdKVlV6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpqcEx6MUFjcVR0a3lKeWdSTWMzUkNWOGNXalRuSGNGQmJaRHVXbUJTcDNaSHRmVGpqVHV4eEV0WC8xSDdZeVlsM0o2WVJiVHpCUEVWb0EvVmhZREtYMUR5eE5CMGNUZGRxWGw1ZHZNVnp0SzUxN0lEdll1VlRaWHBta09sRUtNYU5DTUVBd0hRWURWUjBPQkJZRUZMdXczcUZZTTRpYXBJcVozcjY5NjYvYXl5U3JNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01RQ0Q2Y0hFRmw0YVhUUVkyZTN2OUd3T0FFWkx1Tit5UmhIRkQvM21lb3locG12T3dnUFVuUFdUeG5TNGF0K3FJeFVDTUcxbWloREsxQTNVVDgyTlF6NjBpbU9sTTI3amJkb1h0MlFmeUZNbStZaGlkRGtMRjF2TFVhZ002QmdENTZLeUtBPT0iXX0.eyJub3RpZmljYXRpb25UeXBlIjoiT05FX1RJTUVfQ0hBUkdFIiwibm90aWZpY2F0aW9uVVVJRCI6IjhmMzFkZjhiLWJiNzMtNDY0NC05ODY3LWYwMzYzZWFiMjRkZSIsImRhdGEiOnsiYXBwQXBwbGVJZCI6NjQ5OTEyMzYyNywiYnVuZGxlSWQiOiJjb20uc2luYXRhLkpLRml0bmVzcyIsImJ1bmRsZVZlcnNpb24iOiIxMyIsImVudmlyb25tZW50IjoiU2FuZGJveCIsInNpZ25lZFRyYW5zYWN0aW9uSW5mbyI6ImV5SmhiR2NpT2lKRlV6STFOaUlzSW5nMVl5STZXeUpOU1VsRlRVUkRRMEUzWVdkQmQwbENRV2RKVVdaVWJHWmtNR1pPZGtaWGRucERNVmxKUVU1eldHcEJTMEpuWjNGb2EycFBVRkZSUkVGNlFqRk5WVkYzVVdkWlJGWlJVVVJFUkhSQ1kwaENjMXBUUWxoaU0wcHpXa2hrY0ZwSFZXZFNSMVl5V2xkNGRtTkhWbmxKUmtwc1lrZEdNR0ZYT1hWamVVSkVXbGhLTUdGWFduQlpNa1l3WVZjNWRVbEZSakZrUjJoMlkyMXNNR1ZVUlV4TlFXdEhRVEZWUlVOM2QwTlNlbGw0UlhwQlVrSm5UbFpDUVc5TlEydEdkMk5IZUd4SlJXeDFXWGswZUVONlFVcENaMDVXUWtGWlZFRnNWbFJOUWpSWVJGUkplazFFYTNoTmFrVTFUbFJGTVUweGIxaEVWRWt4VFZSQmVFMVVSVFZPVkVVeFRXeHZkMmRhU1hoUlJFRXJRbWRPVmtKQlRVMU9NVUo1WWpKUloxSlZUa1JKUlRGb1dYbENRbU5JUVdkVk0xSjJZMjFWWjFsWE5XdEpSMnhWWkZjMWJHTjVRbFJrUnpsNVdsTkNVMXBYVG14aFdFSXdTVVpPY0ZveU5YQmliV040VEVSQmNVSm5UbFpDUVhOTlNUQkdkMk5IZUd4SlJtUjJZMjE0YTJReWJHdGFVMEpGV2xoYWJHSkhPWGRhV0VsblZXMVdjMWxZVW5CaU1qVjZUVkpOZDBWUldVUldVVkZMUkVGd1FtTklRbk5hVTBKS1ltMU5kVTFSYzNkRFVWbEVWbEZSUjBWM1NsWlZla0phVFVKTlIwSjVjVWRUVFRRNVFXZEZSME5EY1VkVFRUUTVRWGRGU0VFd1NVRkNSVVpGV1dVdlNuRlVjWGxSZGk5a2RGaHJZWFZFU0VOVFkxWXhNamxHV1ZKV0x6QjRhVUl5Tkc1RFVXdDZVV1l6WVhOSVNrOU9ValZ5TUZKQk1HRk1ka28wTXpKb2VURlRXazF2ZFhaNVpuQnRNalpxV0ZOcVoyZEpTVTFKU1VOQ1JFRk5RbWRPVmtoU1RVSkJaamhGUVdwQlFVMUNPRWRCTVZWa1NYZFJXVTFDWVVGR1JEaDJiRU5PVWpBeFJFcHRhV2M1TjJKQ09EVmpLMnhyUjB0YVRVaEJSME5EYzBkQlVWVkdRbmRGUWtKSFVYZFpha0YwUW1kbmNrSm5SVVpDVVdOM1FXOVphR0ZJVWpCalJHOTJUREpPYkdOdVVucE1iVVozWTBkNGJFeHRUblppVXprelpESlNlVnA2V1hWYVIxWjVUVVJGUjBORGMwZEJVVlZHUW5wQlFtaHBWbTlrU0ZKM1QyazRkbUl5VG5walF6Vm9ZMGhDYzFwVE5XcGlNakIyWWpKT2VtTkVRWHBNV0dReldraEtiazVxUVhsTlNVbENTR2RaUkZaU01HZENTVWxDUmxSRFEwRlNSWGRuWjBWT1FtZHZjV2hyYVVjNU1rNXJRbEZaUWsxSlNDdE5TVWhFUW1kbmNrSm5SVVpDVVdORFFXcERRblJuZVVKek1VcHNZa2RzYUdKdFRteEpSemwxU1VoU2IyRllUV2RaTWxaNVpFZHNiV0ZYVG1oa1IxVm5XVzVyWjFsWE5UVkpTRUpvWTI1U05VbEhSbnBqTTFaMFdsaE5aMWxYVG1wYVdFSXdXVmMxYWxwVFFuWmFhVUl3WVVkVloyUkhhR3hpYVVKb1kwaENjMkZYVG1oWmJYaHNTVWhPTUZsWE5XdFpXRXByU1VoU2JHTnRNWHBKUjBaMVdrTkNhbUl5Tld0aFdGSndZakkxZWtsSE9XMUpTRlo2V2xOM1oxa3lWbmxrUjJ4dFlWZE9hR1JIVldkalJ6bHpZVmRPTlVsSFJuVmFRMEpxV2xoS01HRlhXbkJaTWtZd1lWYzVkVWxJUW5sWlYwNHdZVmRPYkVsSVRqQlpXRkpzWWxkV2RXUklUWFZOUkZsSFEwTnpSMEZSVlVaQ2QwbENSbWx3YjJSSVVuZFBhVGgyWkROa00weHRSbmRqUjNoc1RHMU9kbUpUT1dwYVdFb3dZVmRhY0ZreVJqQmFWMFl4WkVkb2RtTnRiREJsVXpoM1NGRlpSRlpTTUU5Q1FsbEZSa0ZOY3poUWFuTTJWbWhYUjFGc2VrVXlXazlGSzBkWU5FOXZMMDFCTkVkQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlVVSm5iM0ZvYTJsSE9USk9hMEpuYzBKQ1FVbEdRVVJCUzBKblozRm9hMnBQVUZGUlJFRjNUbTlCUkVKc1FXcEZRVGg1VWs1a2MydHdOVEEyUkVaa1VFeG5hRXhNU25kQmRqVktPR2hDUjB4aFNUaEVSWGhrWTFCWUsyRkNTMnBxVHpobFZXODVTM0JtY0dOT1dWVlpOVmxCYWtGUVdHMU5XRVZhVEN0Uk1ESmhaSEp0YlhOb1RuaDZNMDV1UzIwcmIzVlJkMVUzZGtKVWJqQk1kbXhOTjNad2N6SlpjMnhXVkdGdFVsbE1OR0ZUY3pWclBTSXNJazFKU1VSR2FrTkRRWEI1WjBGM1NVSkJaMGxWU1hOSGFGSjNjREJqTW01MlZUUlpVM2xqWVdaUVZHcDZZazVqZDBObldVbExiMXBKZW1vd1JVRjNUWGRhZWtWaVRVSnJSMEV4VlVWQmQzZFRVVmhDZDJKSFZXZFZiVGwyWkVOQ1JGRlRRWFJKUldONlRWTlpkMHBCV1VSV1VWRk1SRUl4UW1OSVFuTmFVMEpFV2xoS01HRlhXbkJaTWtZd1lWYzVkVWxGUmpGa1IyaDJZMjFzTUdWVVJWUk5Ra1ZIUVRGVlJVTm5kMHRSV0VKM1lrZFZaMU5YTldwTWFrVk1UVUZyUjBFeFZVVkNhRTFEVmxaTmQwaG9ZMDVOYWtWM1RYcEZNMDFxUVhwT2VrVjNWMmhqVGsxNldYZE5la1UxVFVSQmQwMUVRWGRYYWtJeFRWVlJkMUZuV1VSV1VWRkVSRVIwUW1OSVFuTmFVMEpZWWpOS2MxcElaSEJhUjFWblVrZFdNbHBYZUhaalIxWjVTVVpLYkdKSFJqQmhWemwxWTNsQ1JGcFlTakJoVjFwd1dUSkdNR0ZYT1hWSlJVWXhaRWRvZG1OdGJEQmxWRVZNVFVGclIwRXhWVVZEZDNkRFVucFplRVY2UVZKQ1owNVdRa0Z2VFVOclJuZGpSM2hzU1VWc2RWbDVOSGhEZWtGS1FtZE9Wa0pCV1ZSQmJGWlVUVWhaZDBWQldVaExiMXBKZW1vd1EwRlJXVVpMTkVWRlFVTkpSRmxuUVVWaWMxRkxRemswVUhKc1YyMWFXRzVZWjNSNGVtUldTa3c0VkRCVFIxbHVaMFJTUjNCdVoyNHpUalpRVkRoS1RVVmlOMFpFYVRSaVFtMVFhRU51V2pNdmMzRTJVRVl2WTBkalMxaFhjMHcxZGs5MFpWSm9lVW8wTlhnelFWTlFOMk5QUWl0aFlXODVNR1pqY0hoVGRpOUZXa1ppYm1sQllrNW5Xa2RvU1dod1NXODBTRFpOU1VnelRVSkpSMEV4VldSRmQwVkNMM2RSU1UxQldVSkJaamhEUVZGQmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZWMU4wUmxiMVpuZW1sS2NXdHBjRzVsZG5JemNuSTVja3hLUzNOM1VtZFpTVXQzV1VKQ1VWVklRVkZGUlU5cVFUUk5SRmxIUTBOelIwRlJWVVpDZWtGQ2FHbHdiMlJJVW5kUGFUaDJZakpPZW1ORE5XaGpTRUp6V2xNMWFtSXlNSFppTWs1NlkwUkJla3hYUm5kalIzaHNZMjA1ZG1SSFRtaGFlazEzVG5kWlJGWlNNR1pDUkVGM1RHcEJjMjlEY1dkTFNWbHRZVWhTTUdORWIzWk1NazU1WWtNMWFHTklRbk5hVXpWcVlqSXdkbGxZUW5kaVIxWjVZakk1TUZreVJtNU5lVFZxWTIxM2QwaFJXVVJXVWpCUFFrSlpSVVpFT0hac1EwNVNNREZFU20xcFp6azNZa0k0TldNcmJHdEhTMXBOUVRSSFFURlZaRVIzUlVJdmQxRkZRWGRKUWtKcVFWRkNaMjl4YUd0cFJ6a3lUbXRDWjBsQ1FrRkpSa0ZFUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV2UVVSQ2JFRnFRa0ZZYUZOeE5VbDVTMjluVFVOUWRIYzBPVEJDWVVJMk56ZERZVVZIU2xoMVpsRkNMMFZ4V2tka05rTlRhbWxEZEU5dWRVMVVZbGhXV0cxNGVHTjRabXREVFZGRVZGTlFlR0Z5V2xoMlRuSnJlRlV6Vkd0VlRVa3pNM2w2ZGtaV1ZsSlVOSGQ0VjBwRE9UazBUM05rWTFvMEsxSkhUbk5aUkhsU05XZHRaSEl3YmtSSFp6MGlMQ0pOU1VsRFVYcERRMEZqYldkQmQwbENRV2RKU1V4aldEaHBUa3hHVXpWVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhkYWVrVmlUVUpyUjBFeFZVVkJkM2RUVVZoQ2QySkhWV2RWYlRsMlpFTkNSRkZUUVhSSlJXTjZUVk5aZDBwQldVUldVVkZNUkVJeFFtTklRbk5hVTBKRVdsaEtNR0ZYV25CWk1rWXdZVmM1ZFVsRlJqRmtSMmgyWTIxc01HVlVSVlJOUWtWSFFURlZSVU5uZDB0UldFSjNZa2RWWjFOWE5XcE1ha1ZNVFVGclIwRXhWVVZDYUUxRFZsWk5kMGhvWTA1TlZGRjNUa1JOZDAxVVozaFBWRUV5VjJoalRrMTZhM2RPUkUxM1RWUm5lRTlVUVRKWGFrSnVUVkp6ZDBkUldVUldVVkZFUkVKS1FtTklRbk5hVTBKVFlqSTVNRWxGVGtKSlF6Qm5VbnBOZUVwcVFXdENaMDVXUWtGelRVaFZSbmRqUjNoc1NVVk9iR051VW5CYWJXeHFXVmhTY0dJeU5HZFJXRll3WVVjNWVXRllValZOVWsxM1JWRlpSRlpSVVV0RVFYQkNZMGhDYzFwVFFrcGliVTExVFZGemQwTlJXVVJXVVZGSFJYZEtWbFY2UWpKTlFrRkhRbmx4UjFOTk5EbEJaMFZIUWxOMVFrSkJRV2xCTWtsQlFrcHFjRXg2TVVGamNWUjBhM2xLZVdkU1RXTXpVa05XT0dOWGFsUnVTR05HUW1KYVJIVlhiVUpUY0ROYVNIUm1WR3BxVkhWNGVFVjBXQzh4U0RkWmVWbHNNMG8yV1ZKaVZIcENVRVZXYjBFdlZtaFpSRXRZTVVSNWVFNUNNR05VWkdSeFdHdzFaSFpOVm5wMFN6VXhOMGxFZGxsMVZsUmFXSEJ0YTA5c1JVdE5ZVTVEVFVWQmQwaFJXVVJXVWpCUFFrSlpSVVpNZFhjemNVWlpUVFJwWVhCSmNWb3pjalk1TmpZdllYbDVVM0pOUVRoSFFURlZaRVYzUlVJdmQxRkdUVUZOUWtGbU9IZEVaMWxFVmxJd1VFRlJTQzlDUVZGRVFXZEZSMDFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMVJRMFEyWTBoRlJtdzBZVmhVVVZreVpUTjJPVWQzVDBGRldreDFUaXQ1VW1oSVJrUXZNMjFsYjNsb2NHMTJUM2RuVUZWdVVGZFVlRzVUTkdGMEszRkplRlZEVFVjeGJXbG9SRXN4UVROVlZEZ3lUbEY2TmpCcGJVOXNUVEkzYW1Ka2IxaDBNbEZtZVVaTmJTdFphR2xrUkd0TVJqRjJURlZoWjAwMlFtZEVOVFpMZVV0QlBUMGlYWDAuZXlKMGNtRnVjMkZqZEdsdmJrbGtJam9pTWpBd01EQXdNRFkyTXpRM05qY3lOaUlzSW05eWFXZHBibUZzVkhKaGJuTmhZM1JwYjI1SlpDSTZJakl3TURBd01EQTJOak0wTnpZM01qWWlMQ0ppZFc1a2JHVkpaQ0k2SW1OdmJTNXphVzVoZEdFdVNrdEdhWFJ1WlhOeklpd2ljSEp2WkhWamRFbGtJam9pWTI5dExtcHJabWwwYm1WemN5NWhMbkJ5YVdObExqRWlMQ0p3ZFhKamFHRnpaVVJoZEdVaU9qRTNNakUyTlRBM056SXdNREFzSW05eWFXZHBibUZzVUhWeVkyaGhjMlZFWVhSbElqb3hOekl4TmpVd056Y3lNREF3TENKeGRXRnVkR2wwZVNJNk1Td2lkSGx3WlNJNklrTnZibk4xYldGaWJHVWlMQ0pwYmtGd2NFOTNibVZ5YzJocGNGUjVjR1VpT2lKUVZWSkRTRUZUUlVRaUxDSnphV2R1WldSRVlYUmxJam94TnpJeE5qVXdOemt4TWpRM0xDSmxiblpwY205dWJXVnVkQ0k2SWxOaGJtUmliM2dpTENKMGNtRnVjMkZqZEdsdmJsSmxZWE52YmlJNklsQlZVa05JUVZORklpd2ljM1J2Y21WbWNtOXVkQ0k2SWtOSVRpSXNJbk4wYjNKbFpuSnZiblJKWkNJNklqRTBNelEyTlNJc0luQnlhV05sSWpvNU9EQXdNQ3dpWTNWeWNtVnVZM2tpT2lKRFRsa2lmUS5ES3JibWNYZkNGSDBadlJBNlZXWGkzLWN6cC03WHptTjhIM25PRUs4UnZxUFRXZ3VFYThqWUxhWHU5dHBLc1lQWlNvV0d4NHFXUy1nVXFMVFV1bXNlZyJ9LCJ2ZXJzaW9uIjoiMi4wIiwic2lnbmVkRGF0ZSI6MTcyMTY1MDc5MTI2OX0.imD544tZ0FLw4lPrcpRB279O_SpRab_6z5aUJRoPoe_3CzhT4pwonOmM74PYItQQwpMYwB79SCQaCVVLMsPV1w\"}";
        org.json.JSONObject jsonObject = new org.json.JSONObject(t);
        System.err.println(jsonObject.getString("signedPayload"));
    }
//    public static void main(String[] args) throws CertificateException {
//        try {
//            JSONObject payload = verifyAndGet("eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFTURDQ0E3YWdBd0lCQWdJUWZUbGZkMGZOdkZXdnpDMVlJQU5zWGpBS0JnZ3Foa2pPUFFRREF6QjFNVVF3UWdZRFZRUURERHRCY0hCc1pTQlhiM0pzWkhkcFpHVWdSR1YyWld4dmNHVnlJRkpsYkdGMGFXOXVjeUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURUxNQWtHQTFVRUN3d0NSell4RXpBUkJnTlZCQW9NQ2tGd2NHeGxJRWx1WXk0eEN6QUpCZ05WQkFZVEFsVlRNQjRYRFRJek1Ea3hNakU1TlRFMU0xb1hEVEkxTVRBeE1URTVOVEUxTWxvd2daSXhRREErQmdOVkJBTU1OMUJ5YjJRZ1JVTkRJRTFoWXlCQmNIQWdVM1J2Y21VZ1lXNWtJR2xVZFc1bGN5QlRkRzl5WlNCU1pXTmxhWEIwSUZOcFoyNXBibWN4TERBcUJnTlZCQXNNSTBGd2NHeGxJRmR2Y214a2QybGtaU0JFWlhabGJHOXdaWElnVW1Wc1lYUnBiMjV6TVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Rc3dDUVlEVlFRR0V3SlZVekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCRUZFWWUvSnFUcXlRdi9kdFhrYXVESENTY1YxMjlGWVJWLzB4aUIyNG5DUWt6UWYzYXNISk9OUjVyMFJBMGFMdko0MzJoeTFTWk1vdXZ5ZnBtMjZqWFNqZ2dJSU1JSUNCREFNQmdOVkhSTUJBZjhFQWpBQU1COEdBMVVkSXdRWU1CYUFGRDh2bENOUjAxREptaWc5N2JCODVjK2xrR0taTUhBR0NDc0dBUVVGQndFQkJHUXdZakF0QmdnckJnRUZCUWN3QW9ZaGFIUjBjRG92TDJObGNuUnpMbUZ3Y0d4bExtTnZiUzkzZDJSeVp6WXVaR1Z5TURFR0NDc0dBUVVGQnpBQmhpVm9kSFJ3T2k4dmIyTnpjQzVoY0hCc1pTNWpiMjB2YjJOemNEQXpMWGQzWkhKbk5qQXlNSUlCSGdZRFZSMGdCSUlCRlRDQ0FSRXdnZ0VOQmdvcWhraUc5Mk5rQlFZQk1JSCtNSUhEQmdnckJnRUZCUWNDQWpDQnRneUJzMUpsYkdsaGJtTmxJRzl1SUhSb2FYTWdZMlZ5ZEdsbWFXTmhkR1VnWW5rZ1lXNTVJSEJoY25SNUlHRnpjM1Z0WlhNZ1lXTmpaWEIwWVc1alpTQnZaaUIwYUdVZ2RHaGxiaUJoY0hCc2FXTmhZbXhsSUhOMFlXNWtZWEprSUhSbGNtMXpJR0Z1WkNCamIyNWthWFJwYjI1eklHOW1JSFZ6WlN3Z1kyVnlkR2xtYVdOaGRHVWdjRzlzYVdONUlHRnVaQ0JqWlhKMGFXWnBZMkYwYVc5dUlIQnlZV04wYVdObElITjBZWFJsYldWdWRITXVNRFlHQ0NzR0FRVUZCd0lCRmlwb2RIUndPaTh2ZDNkM0xtRndjR3hsTG1OdmJTOWpaWEowYVdacFkyRjBaV0YxZEdodmNtbDBlUzh3SFFZRFZSME9CQllFRkFNczhQanM2VmhXR1FsekUyWk9FK0dYNE9vL01BNEdBMVVkRHdFQi93UUVBd0lIZ0RBUUJnb3Foa2lHOTJOa0Jnc0JCQUlGQURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTh5Uk5kc2twNTA2REZkUExnaExMSndBdjVKOGhCR0xhSThERXhkY1BYK2FCS2pqTzhlVW85S3BmcGNOWVVZNVlBakFQWG1NWEVaTCtRMDJhZHJtbXNoTnh6M05uS20rb3VRd1U3dkJUbjBMdmxNN3ZwczJZc2xWVGFtUllMNGFTczVrPSIsIk1JSURGakNDQXB5Z0F3SUJBZ0lVSXNHaFJ3cDBjMm52VTRZU3ljYWZQVGp6Yk5jd0NnWUlLb1pJemowRUF3TXdaekViTUJrR0ExVUVBd3dTUVhCd2JHVWdVbTl2ZENCRFFTQXRJRWN6TVNZd0pBWURWUVFMREIxQmNIQnNaU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURVRNQkVHQTFVRUNnd0tRWEJ3YkdVZ1NXNWpMakVMTUFrR0ExVUVCaE1DVlZNd0hoY05NakV3TXpFM01qQXpOekV3V2hjTk16WXdNekU1TURBd01EQXdXakIxTVVRd1FnWURWUVFERER0QmNIQnNaU0JYYjNKc1pIZHBaR1VnUkdWMlpXeHZjR1Z5SUZKbGJHRjBhVzl1Y3lCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVMTUFrR0ExVUVDd3dDUnpZeEV6QVJCZ05WQkFvTUNrRndjR3hsSUVsdVl5NHhDekFKQmdOVkJBWVRBbFZUTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVic1FLQzk0UHJsV21aWG5YZ3R4emRWSkw4VDBTR1luZ0RSR3BuZ24zTjZQVDhKTUViN0ZEaTRiQm1QaENuWjMvc3E2UEYvY0djS1hXc0w1dk90ZVJoeUo0NXgzQVNQN2NPQithYW85MGZjcHhTdi9FWkZibmlBYk5nWkdoSWhwSW80SDZNSUgzTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFBd0h3WURWUjBqQkJnd0ZvQVV1N0Rlb1ZnemlKcWtpcG5ldnIzcnI5ckxKS3N3UmdZSUt3WUJCUVVIQVFFRU9qQTRNRFlHQ0NzR0FRVUZCekFCaGlwb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxXRndjR3hsY205dmRHTmhaek13TndZRFZSMGZCREF3TGpBc29DcWdLSVltYUhSMGNEb3ZMMk55YkM1aGNIQnNaUzVqYjIwdllYQndiR1Z5YjI5MFkyRm5NeTVqY213d0hRWURWUjBPQkJZRUZEOHZsQ05SMDFESm1pZzk3YkI4NWMrbGtHS1pNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVFCZ29xaGtpRzkyTmtCZ0lCQkFJRkFEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQkFYaFNxNUl5S29nTUNQdHc0OTBCYUI2NzdDYUVHSlh1ZlFCL0VxWkdkNkNTamlDdE9udU1UYlhWWG14eGN4ZmtDTVFEVFNQeGFyWlh2TnJreFUzVGtVTUkzM3l6dkZWVlJUNHd4V0pDOTk0T3NkY1o0K1JHTnNZRHlSNWdtZHIwbkRHZz0iLCJNSUlDUXpDQ0FjbWdBd0lCQWdJSUxjWDhpTkxGUzVVd0NnWUlLb1pJemowRUF3TXdaekViTUJrR0ExVUVBd3dTUVhCd2JHVWdVbTl2ZENCRFFTQXRJRWN6TVNZd0pBWURWUVFMREIxQmNIQnNaU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURVRNQkVHQTFVRUNnd0tRWEJ3YkdVZ1NXNWpMakVMTUFrR0ExVUVCaE1DVlZNd0hoY05NVFF3TkRNd01UZ3hPVEEyV2hjTk16a3dORE13TVRneE9UQTJXakJuTVJzd0dRWURWUVFEREJKQmNIQnNaU0JTYjI5MElFTkJJQzBnUnpNeEpqQWtCZ05WQkFzTUhVRndjR3hsSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUk13RVFZRFZRUUtEQXBCY0hCc1pTQkpibU11TVFzd0NRWURWUVFHRXdKVlV6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpqcEx6MUFjcVR0a3lKeWdSTWMzUkNWOGNXalRuSGNGQmJaRHVXbUJTcDNaSHRmVGpqVHV4eEV0WC8xSDdZeVlsM0o2WVJiVHpCUEVWb0EvVmhZREtYMUR5eE5CMGNUZGRxWGw1ZHZNVnp0SzUxN0lEdll1VlRaWHBta09sRUtNYU5DTUVBd0hRWURWUjBPQkJZRUZMdXczcUZZTTRpYXBJcVozcjY5NjYvYXl5U3JNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01RQ0Q2Y0hFRmw0YVhUUVkyZTN2OUd3T0FFWkx1Tit5UmhIRkQvM21lb3locG12T3dnUFVuUFdUeG5TNGF0K3FJeFVDTUcxbWloREsxQTNVVDgyTlF6NjBpbU9sTTI3amJkb1h0MlFmeUZNbStZaGlkRGtMRjF2TFVhZ002QmdENTZLeUtBPT0iXX0.eyJub3RpZmljYXRpb25UeXBlIjoiT05FX1RJTUVfQ0hBUkdFIiwibm90aWZpY2F0aW9uVVVJRCI6ImFkMGEyODJiLWI0ZmEtNGE5ZS05YTk3LWEzYjZiNTQ2NWQ1OCIsImRhdGEiOnsiYXBwQXBwbGVJZCI6NjQ5OTEyMzYyNywiYnVuZGxlSWQiOiJjb20uc2luYXRhLkpLRml0bmVzcyIsImJ1bmRsZVZlcnNpb24iOiIxMyIsImVudmlyb25tZW50IjoiU2FuZGJveCIsInNpZ25lZFRyYW5zYWN0aW9uSW5mbyI6ImV5SmhiR2NpT2lKRlV6STFOaUlzSW5nMVl5STZXeUpOU1VsRlRVUkRRMEUzWVdkQmQwbENRV2RKVVdaVWJHWmtNR1pPZGtaWGRucERNVmxKUVU1eldHcEJTMEpuWjNGb2EycFBVRkZSUkVGNlFqRk5WVkYzVVdkWlJGWlJVVVJFUkhSQ1kwaENjMXBUUWxoaU0wcHpXa2hrY0ZwSFZXZFNSMVl5V2xkNGRtTkhWbmxKUmtwc1lrZEdNR0ZYT1hWamVVSkVXbGhLTUdGWFduQlpNa1l3WVZjNWRVbEZSakZrUjJoMlkyMXNNR1ZVUlV4TlFXdEhRVEZWUlVOM2QwTlNlbGw0UlhwQlVrSm5UbFpDUVc5TlEydEdkMk5IZUd4SlJXeDFXWGswZUVONlFVcENaMDVXUWtGWlZFRnNWbFJOUWpSWVJGUkplazFFYTNoTmFrVTFUbFJGTVUweGIxaEVWRWt4VFZSQmVFMVVSVFZPVkVVeFRXeHZkMmRhU1hoUlJFRXJRbWRPVmtKQlRVMU9NVUo1WWpKUloxSlZUa1JKUlRGb1dYbENRbU5JUVdkVk0xSjJZMjFWWjFsWE5XdEpSMnhWWkZjMWJHTjVRbFJrUnpsNVdsTkNVMXBYVG14aFdFSXdTVVpPY0ZveU5YQmliV040VEVSQmNVSm5UbFpDUVhOTlNUQkdkMk5IZUd4SlJtUjJZMjE0YTJReWJHdGFVMEpGV2xoYWJHSkhPWGRhV0VsblZXMVdjMWxZVW5CaU1qVjZUVkpOZDBWUldVUldVVkZMUkVGd1FtTklRbk5hVTBKS1ltMU5kVTFSYzNkRFVWbEVWbEZSUjBWM1NsWlZla0phVFVKTlIwSjVjVWRUVFRRNVFXZEZSME5EY1VkVFRUUTVRWGRGU0VFd1NVRkNSVVpGV1dVdlNuRlVjWGxSZGk5a2RGaHJZWFZFU0VOVFkxWXhNamxHV1ZKV0x6QjRhVUl5Tkc1RFVXdDZVV1l6WVhOSVNrOU9ValZ5TUZKQk1HRk1ka28wTXpKb2VURlRXazF2ZFhaNVpuQnRNalpxV0ZOcVoyZEpTVTFKU1VOQ1JFRk5RbWRPVmtoU1RVSkJaamhGUVdwQlFVMUNPRWRCTVZWa1NYZFJXVTFDWVVGR1JEaDJiRU5PVWpBeFJFcHRhV2M1TjJKQ09EVmpLMnhyUjB0YVRVaEJSME5EYzBkQlVWVkdRbmRGUWtKSFVYZFpha0YwUW1kbmNrSm5SVVpDVVdOM1FXOVphR0ZJVWpCalJHOTJUREpPYkdOdVVucE1iVVozWTBkNGJFeHRUblppVXprelpESlNlVnA2V1hWYVIxWjVUVVJGUjBORGMwZEJVVlZHUW5wQlFtaHBWbTlrU0ZKM1QyazRkbUl5VG5walF6Vm9ZMGhDYzFwVE5XcGlNakIyWWpKT2VtTkVRWHBNV0dReldraEtiazVxUVhsTlNVbENTR2RaUkZaU01HZENTVWxDUmxSRFEwRlNSWGRuWjBWT1FtZHZjV2hyYVVjNU1rNXJRbEZaUWsxSlNDdE5TVWhFUW1kbmNrSm5SVVpDVVdORFFXcERRblJuZVVKek1VcHNZa2RzYUdKdFRteEpSemwxU1VoU2IyRllUV2RaTWxaNVpFZHNiV0ZYVG1oa1IxVm5XVzVyWjFsWE5UVkpTRUpvWTI1U05VbEhSbnBqTTFaMFdsaE5aMWxYVG1wYVdFSXdXVmMxYWxwVFFuWmFhVUl3WVVkVloyUkhhR3hpYVVKb1kwaENjMkZYVG1oWmJYaHNTVWhPTUZsWE5XdFpXRXByU1VoU2JHTnRNWHBKUjBaMVdrTkNhbUl5Tld0aFdGSndZakkxZWtsSE9XMUpTRlo2V2xOM1oxa3lWbmxrUjJ4dFlWZE9hR1JIVldkalJ6bHpZVmRPTlVsSFJuVmFRMEpxV2xoS01HRlhXbkJaTWtZd1lWYzVkVWxJUW5sWlYwNHdZVmRPYkVsSVRqQlpXRkpzWWxkV2RXUklUWFZOUkZsSFEwTnpSMEZSVlVaQ2QwbENSbWx3YjJSSVVuZFBhVGgyWkROa00weHRSbmRqUjNoc1RHMU9kbUpUT1dwYVdFb3dZVmRhY0ZreVJqQmFWMFl4WkVkb2RtTnRiREJsVXpoM1NGRlpSRlpTTUU5Q1FsbEZSa0ZOY3poUWFuTTJWbWhYUjFGc2VrVXlXazlGSzBkWU5FOXZMMDFCTkVkQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlVVSm5iM0ZvYTJsSE9USk9hMEpuYzBKQ1FVbEdRVVJCUzBKblozRm9hMnBQVUZGUlJFRjNUbTlCUkVKc1FXcEZRVGg1VWs1a2MydHdOVEEyUkVaa1VFeG5hRXhNU25kQmRqVktPR2hDUjB4aFNUaEVSWGhrWTFCWUsyRkNTMnBxVHpobFZXODVTM0JtY0dOT1dWVlpOVmxCYWtGUVdHMU5XRVZhVEN0Uk1ESmhaSEp0YlhOb1RuaDZNMDV1UzIwcmIzVlJkMVUzZGtKVWJqQk1kbXhOTjNad2N6SlpjMnhXVkdGdFVsbE1OR0ZUY3pWclBTSXNJazFKU1VSR2FrTkRRWEI1WjBGM1NVSkJaMGxWU1hOSGFGSjNjREJqTW01MlZUUlpVM2xqWVdaUVZHcDZZazVqZDBObldVbExiMXBKZW1vd1JVRjNUWGRhZWtWaVRVSnJSMEV4VlVWQmQzZFRVVmhDZDJKSFZXZFZiVGwyWkVOQ1JGRlRRWFJKUldONlRWTlpkMHBCV1VSV1VWRk1SRUl4UW1OSVFuTmFVMEpFV2xoS01HRlhXbkJaTWtZd1lWYzVkVWxGUmpGa1IyaDJZMjFzTUdWVVJWUk5Ra1ZIUVRGVlJVTm5kMHRSV0VKM1lrZFZaMU5YTldwTWFrVk1UVUZyUjBFeFZVVkNhRTFEVmxaTmQwaG9ZMDVOYWtWM1RYcEZNMDFxUVhwT2VrVjNWMmhqVGsxNldYZE5la1UxVFVSQmQwMUVRWGRYYWtJeFRWVlJkMUZuV1VSV1VWRkVSRVIwUW1OSVFuTmFVMEpZWWpOS2MxcElaSEJhUjFWblVrZFdNbHBYZUhaalIxWjVTVVpLYkdKSFJqQmhWemwxWTNsQ1JGcFlTakJoVjFwd1dUSkdNR0ZYT1hWSlJVWXhaRWRvZG1OdGJEQmxWRVZNVFVGclIwRXhWVVZEZDNkRFVucFplRVY2UVZKQ1owNVdRa0Z2VFVOclJuZGpSM2hzU1VWc2RWbDVOSGhEZWtGS1FtZE9Wa0pCV1ZSQmJGWlVUVWhaZDBWQldVaExiMXBKZW1vd1EwRlJXVVpMTkVWRlFVTkpSRmxuUVVWaWMxRkxRemswVUhKc1YyMWFXRzVZWjNSNGVtUldTa3c0VkRCVFIxbHVaMFJTUjNCdVoyNHpUalpRVkRoS1RVVmlOMFpFYVRSaVFtMVFhRU51V2pNdmMzRTJVRVl2WTBkalMxaFhjMHcxZGs5MFpWSm9lVW8wTlhnelFWTlFOMk5QUWl0aFlXODVNR1pqY0hoVGRpOUZXa1ppYm1sQllrNW5Xa2RvU1dod1NXODBTRFpOU1VnelRVSkpSMEV4VldSRmQwVkNMM2RSU1UxQldVSkJaamhEUVZGQmQwaDNXVVJXVWpCcVFrSm5kMFp2UVZWMU4wUmxiMVpuZW1sS2NXdHBjRzVsZG5JemNuSTVja3hLUzNOM1VtZFpTVXQzV1VKQ1VWVklRVkZGUlU5cVFUUk5SRmxIUTBOelIwRlJWVVpDZWtGQ2FHbHdiMlJJVW5kUGFUaDJZakpPZW1ORE5XaGpTRUp6V2xNMWFtSXlNSFppTWs1NlkwUkJla3hYUm5kalIzaHNZMjA1ZG1SSFRtaGFlazEzVG5kWlJGWlNNR1pDUkVGM1RHcEJjMjlEY1dkTFNWbHRZVWhTTUdORWIzWk1NazU1WWtNMWFHTklRbk5hVXpWcVlqSXdkbGxZUW5kaVIxWjVZakk1TUZreVJtNU5lVFZxWTIxM2QwaFJXVVJXVWpCUFFrSlpSVVpFT0hac1EwNVNNREZFU20xcFp6azNZa0k0TldNcmJHdEhTMXBOUVRSSFFURlZaRVIzUlVJdmQxRkZRWGRKUWtKcVFWRkNaMjl4YUd0cFJ6a3lUbXRDWjBsQ1FrRkpSa0ZFUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV2UVVSQ2JFRnFRa0ZZYUZOeE5VbDVTMjluVFVOUWRIYzBPVEJDWVVJMk56ZERZVVZIU2xoMVpsRkNMMFZ4V2tka05rTlRhbWxEZEU5dWRVMVVZbGhXV0cxNGVHTjRabXREVFZGRVZGTlFlR0Z5V2xoMlRuSnJlRlV6Vkd0VlRVa3pNM2w2ZGtaV1ZsSlVOSGQ0VjBwRE9UazBUM05rWTFvMEsxSkhUbk5aUkhsU05XZHRaSEl3YmtSSFp6MGlMQ0pOU1VsRFVYcERRMEZqYldkQmQwbENRV2RKU1V4aldEaHBUa3hHVXpWVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhkYWVrVmlUVUpyUjBFeFZVVkJkM2RUVVZoQ2QySkhWV2RWYlRsMlpFTkNSRkZUUVhSSlJXTjZUVk5aZDBwQldVUldVVkZNUkVJeFFtTklRbk5hVTBKRVdsaEtNR0ZYV25CWk1rWXdZVmM1ZFVsRlJqRmtSMmgyWTIxc01HVlVSVlJOUWtWSFFURlZSVU5uZDB0UldFSjNZa2RWWjFOWE5XcE1ha1ZNVFVGclIwRXhWVVZDYUUxRFZsWk5kMGhvWTA1TlZGRjNUa1JOZDAxVVozaFBWRUV5VjJoalRrMTZhM2RPUkUxM1RWUm5lRTlVUVRKWGFrSnVUVkp6ZDBkUldVUldVVkZFUkVKS1FtTklRbk5hVTBKVFlqSTVNRWxGVGtKSlF6Qm5VbnBOZUVwcVFXdENaMDVXUWtGelRVaFZSbmRqUjNoc1NVVk9iR051VW5CYWJXeHFXVmhTY0dJeU5HZFJXRll3WVVjNWVXRllValZOVWsxM1JWRlpSRlpSVVV0RVFYQkNZMGhDYzFwVFFrcGliVTExVFZGemQwTlJXVVJXVVZGSFJYZEtWbFY2UWpKTlFrRkhRbmx4UjFOTk5EbEJaMFZIUWxOMVFrSkJRV2xCTWtsQlFrcHFjRXg2TVVGamNWUjBhM2xLZVdkU1RXTXpVa05XT0dOWGFsUnVTR05HUW1KYVJIVlhiVUpUY0ROYVNIUm1WR3BxVkhWNGVFVjBXQzh4U0RkWmVWbHNNMG8yV1ZKaVZIcENVRVZXYjBFdlZtaFpSRXRZTVVSNWVFNUNNR05VWkdSeFdHdzFaSFpOVm5wMFN6VXhOMGxFZGxsMVZsUmFXSEJ0YTA5c1JVdE5ZVTVEVFVWQmQwaFJXVVJXVWpCUFFrSlpSVVpNZFhjemNVWlpUVFJwWVhCSmNWb3pjalk1TmpZdllYbDVVM0pOUVRoSFFURlZaRVYzUlVJdmQxRkdUVUZOUWtGbU9IZEVaMWxFVmxJd1VFRlJTQzlDUVZGRVFXZEZSMDFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMVJRMFEyWTBoRlJtdzBZVmhVVVZreVpUTjJPVWQzVDBGRldreDFUaXQ1VW1oSVJrUXZNMjFsYjNsb2NHMTJUM2RuVUZWdVVGZFVlRzVUTkdGMEszRkplRlZEVFVjeGJXbG9SRXN4UVROVlZEZ3lUbEY2TmpCcGJVOXNUVEkzYW1Ka2IxaDBNbEZtZVVaTmJTdFphR2xrUkd0TVJqRjJURlZoWjAwMlFtZEVOVFpMZVV0QlBUMGlYWDAuZXlKMGNtRnVjMkZqZEdsdmJrbGtJam9pTWpBd01EQXdNRFkyTXpNMU5ESXlPQ0lzSW05eWFXZHBibUZzVkhKaGJuTmhZM1JwYjI1SlpDSTZJakl3TURBd01EQTJOak16TlRReU1qZ2lMQ0ppZFc1a2JHVkpaQ0k2SW1OdmJTNXphVzVoZEdFdVNrdEdhWFJ1WlhOeklpd2ljSEp2WkhWamRFbGtJam9pWTI5dExtcHJabWwwYm1WemN5NWhMbkJ5YVdObExqRWlMQ0p3ZFhKamFHRnpaVVJoZEdVaU9qRTNNakUyTkRVNE1qWXdNREFzSW05eWFXZHBibUZzVUhWeVkyaGhjMlZFWVhSbElqb3hOekl4TmpRMU9ESTJNREF3TENKeGRXRnVkR2wwZVNJNk1Td2lkSGx3WlNJNklrTnZibk4xYldGaWJHVWlMQ0pwYmtGd2NFOTNibVZ5YzJocGNGUjVjR1VpT2lKUVZWSkRTRUZUUlVRaUxDSnphV2R1WldSRVlYUmxJam94TnpJeE5qUTFPRFF5TkRnNExDSmxiblpwY205dWJXVnVkQ0k2SWxOaGJtUmliM2dpTENKMGNtRnVjMkZqZEdsdmJsSmxZWE52YmlJNklsQlZVa05JUVZORklpd2ljM1J2Y21WbWNtOXVkQ0k2SWtOSVRpSXNJbk4wYjNKbFpuSnZiblJKWkNJNklqRTBNelEyTlNJc0luQnlhV05sSWpvNU9EQXdNQ3dpWTNWeWNtVnVZM2tpT2lKRFRsa2lmUS5nTC1UVThvRV9NY2Q5TGpQb2g0LWxuT3JZek04N1FOY1RxYXFqZ05KT3VSWHMxZGpKQ1VnSVR0Vmd5cWdvMXozVGpGc3BYd1RpYklQeVN1NFg3QUd5dyJ9LCJ2ZXJzaW9uIjoiMi4wIiwic2lnbmVkRGF0ZSI6MTcyMTY0NTg0MjUwNn0.bQeSZOF1IDCD--iN3i711ADUVwhrIoqCLklkBUHsebpFPgTH5TtAJjaeSFkmrqCXzZYLb_m-5acirt5xnWMubQ");
//            String notificationType = payload.get("notificationType").toString();
//            JSONObject data = payload.getJSONObject("data");
//            String signedTransactionInfo = data.get("signedTransactionInfo").toString();
//            String environment = data.get("environment").toString();
//            JSONObject transactionInfo = verifyAndGet(signedTransactionInfo);
//            String transactionId = transactionInfo.get("transactionId").toString();
//            String originalTransactionId = transactionInfo.get("originalTransactionId").toString();
//            String productId = transactionInfo.get("productId").toString();
//            System.err.println("json串"+transactionInfo);
//            System.err.println("data"+data);
//            if ("DID_RENEW".equals(notificationType)) {
//                // todo 处理订阅续期业务逻辑
//
//            } else if ("REFUND".equals(notificationType)) {
//                // todo 处理退款业务逻辑
//
//            } else {
//            }
//
//        } catch (CertificateException e) {
//        }
//
//
//    }
    public static JSONObject verifyAndGet(String jws) throws CertificateException {
        DecodedJWT decodedJWT = JWT.decode(jws);
        // 拿到 header 中 x5c 数组中第一个
        String header = new String(java.util.Base64.getDecoder().decode(decodedJWT.getHeader()));
        String x5c = JSONObject.parseObject(header).getJSONArray("x5c").getString(0);
        // 获取公钥
        PublicKey publicKey = getPublicKeyByX5c(x5c);
        // 验证 token
        Algorithm algorithm = Algorithm.ECDSA256((ECPublicKey) publicKey, null);
        try {
            algorithm.verify(decodedJWT);
        } catch (SignatureVerificationException e) {
            throw new RuntimeException("签名验证失败");
        }
        // 解析数据
        return JSONObject.parseObject(new String(java.util.Base64.getDecoder().decode(decodedJWT.getPayload())));
    }
    /**
     * 获取公钥
     * @param x5c
     * @return
     * @throws
     */
    private static PublicKey getPublicKeyByX5c(String x5c) throws CertificateException {
        byte[] x5c0Bytes = java.util.Base64.getDecoder().decode(x5c);
        CertificateFactory fact = CertificateFactory.getInstance("X.509");
        X509Certificate cer = (X509Certificate) fact.generateCertificate(new ByteArrayInputStream(x5c0Bytes));
        return cer.getPublicKey();
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserController.java
@@ -5,6 +5,7 @@
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.stylefeng.guns.modular.system.dao.UserBlackMapper;
import com.stylefeng.guns.modular.system.dto.*;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
@@ -20,6 +21,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.spring.web.paths.AbstractPathProvider;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -86,9 +88,12 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public ResultUtil<PeopleListVO> peopleList() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        PeopleListVO peopleListVO = new PeopleListVO();
        peopleListVO.setUserName(appUserService.getAppUser().getName());
        AppUser appUser = appUserService.getAppUser();
        Integer inviteUserId = appUser.getInviteUserId();
        if (inviteUserId!=null){
            AppUser appUser1 = appUser.selectById(inviteUserId);
@@ -127,14 +132,22 @@
    })
    public ResultUtil getBindingUserName(String code) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if (code.equals(appUser.getCode())){
            return ResultUtil.errorInvite("不能绑定自己",null);
            return ResultUtil.errorInvite("不能绑定自己","");
        }
        AppUser code1 = appUserService.selectOne(new EntityWrapper<AppUser>()
                .eq("code", code));
        if (code1 == null){
            return ResultUtil.errorInvite("邀请码无效",null);
            return ResultUtil.errorInvite("邀请码无效","");
        }
//        else{
//            if (code1.getInviteUserId().equals(appUser.getId())){
//                return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
//            }
//        }
        return ResultUtil.success(code1.getName());
    }
    @ResponseBody
@@ -146,13 +159,21 @@
    })
    public ResultUtil updateBankCard(String code) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        AppUser code1 = appUserService.selectOne(new EntityWrapper<AppUser>()
                .eq("code", code));
        if (code1 == null){
            return ResultUtil.errorInvite("邀请码无效",null);
            return ResultUtil.errorInvite("邀请码无效","");
        }
        if (code.equals(appUser.getCode())){
            return ResultUtil.error("不能绑定自己");
        }
        if (code1.getInviteUserId()!=null){
            if (code1.getInviteUserId().equals(appUser.getId())){
                return ResultUtil.error("邀请失败,当前邀请用户为您的邀请人", null);
            }
        }
        appUser.setInviteUserId(code1.getId());
        appUserService.updateById(appUser);
@@ -169,6 +190,9 @@
    })
    public ResultUtil Withdrawal(BigDecimal money) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if (!StringUtils.hasLength(appUser.getBankCard())){
            return ResultUtil.error("提现失败 请先绑定银行卡");
        }
@@ -203,6 +227,9 @@
    public ResultUtil updateBankCard(String accountName, String bankCard,String bankName,String bankPhone,String bankCardImg) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        appUser.setBankCard(bankCard);
        appUser.setAccountName(accountName);
        appUser.setBankName(bankName);
@@ -212,6 +239,71 @@
            return ResultUtil.success(appUser);
        }
        appUserService.updateById(appUser);
        return ResultUtil.success();
    }
    @Autowired
    private UserBlackMapper userBlackMapper;
    @ResponseBody
    @PostMapping("/base/appUser/blackList")
    @ApiOperation(value = "拉黑列表", tags = {"2.0新增"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", dataType = "int"),
    })
    public ResultUtil<List<BlackListVO>> blackList(Integer pageNum,Integer pageSize) {
        List<BlackListVO> res = new ArrayList<>();
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        List<UserBlack> userId = userBlackService.selectList(new EntityWrapper<UserBlack>()
                .eq("userId", appUser.getId()));
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        for (UserBlack userBlack : userId) {
            AppUser appUser1 = appUserService.selectById(userBlack.getBlackUserId());
            if (appUser1 != null){
                BlackListVO blackListVO = new BlackListVO();
                blackListVO.setId(appUser1.getId());
                blackListVO.setHeadImg(appUser1.getHeadImg());
                blackListVO.setName(appUser1.getName());
                String format = simpleDateFormat.format(userBlack.getInsertTime());
                res.add(blackListVO);
            }
        }
        List<BlackListVO> findVOS = testing4(res.size(), pageNum, pageSize, res);
        return ResultUtil.success(findVOS);
    }
    @Autowired
    private IUserBlackService userBlackService;
    @ResponseBody
    @PostMapping("/base/appUser/black")
    @ApiOperation(value = "拉黑/取消拉黑操作", tags = {"2.0新增"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
            @ApiImplicitParam(value = "被拉黑用户id", name = "id", dataType = "string" ),
    })
    public ResultUtil black(Integer id) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        UserBlack userBlack = userBlackService.selectOne(new EntityWrapper<UserBlack>()
                .eq("userId", appUser.getId())
                .eq("blackUserId", id));
        // 执行取消拉黑操作
        if (userBlack!=null){
            userBlackService.deleteById(userBlack.getId());
        }else{
            // 执行新增拉黑操作
            userBlack = new UserBlack();
            userBlack.setInsertTime(new Date());
            userBlack.setUserId(appUser.getId());
            userBlack.setBlackUserId(id);
            userBlackService.insert(userBlack);
        }
        return ResultUtil.success();
    }
@@ -241,6 +333,10 @@
    })
    public ResultUtil<AppUser> updateBankCard() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        return ResultUtil.success(appUserService.getAppUser());
    }
@@ -254,6 +350,9 @@
        List<CouponVO> res = new ArrayList<>();
        req.setPageNum((req.getPageNum() - 1) * req.getPageSize());
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        req.setUserId(appUser.getId());
        List<CouponReceive> couponReceives = couponReceiveService.getList(req);
        for (CouponReceive couponReceive : couponReceives) {
@@ -286,6 +385,9 @@
    })
    public ResultUtil<List<WithdtawalVO>> withdrawal(Integer year,Integer month,Integer pageNum,Integer pageSize) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        List<WithdtawalVO> withdtawalVOS = new ArrayList<>();
        Wrapper<Withdrawal> eq1 = new EntityWrapper<Withdrawal>()
                .eq("userId", appUser.getId());
@@ -357,6 +459,10 @@
    public ResultUtil<WalletVO> wallet(Integer year,Integer month,Integer pageNum,Integer pageSize) {
        WalletVO walletVO = new WalletVO();
        List<UserDetailVO> detail = new ArrayList<>();
        AppUser appUser3 = appUserService.getAppUser();
        if (appUser3 == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        BigDecimal balance = appUserService.getAppUser().getBalance();
        walletVO.setBalance(balance);
@@ -509,6 +615,484 @@
        walletVO.setDetails(testing);
        return ResultUtil.success(walletVO);
    }
    @ResponseBody
    @PostMapping("/base/appUser/appleWallet")
    @ApiOperation(value = "苹果佣金列表(提现 好友消费 佣金 充值 平台红包)", tags = {"我的"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
            @ApiImplicitParam(value = "年", name = "year", dataType = "int"),
            @ApiImplicitParam(value = "月", name = "month", dataType = "int"),
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", dataType = "int"),
            @ApiImplicitParam(value = "类型 1=提现 2=好友消费 3=佣金 4=充值 5=平台红包", name = "type"),
    })
    public ResultUtil<WalletVO> appleWallet(Integer year,Integer month,Integer pageNum,Integer pageSize,String type) {
        WalletVO walletVO = new WalletVO();
        List<UserDetailVO> detail = new ArrayList<>();
        AppUser appUser3 = appUserService.getAppUser();
        if (appUser3 == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        BigDecimal balance = appUserService.getAppUser().getBalance();
        walletVO.setBalance(balance);
        if (!StringUtils.hasLength(type)){
            // 查询全部
            Wrapper<Recharge> eq1 = new EntityWrapper<Recharge>()
                    .eq("userId", id)
                    .eq("state", 2);
            // 如果传递了年份和月份,则添加时间条件
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq1.ge("insertTime", startDate).le("insertTime", endDate);
            }
            // 查询充值记录
            List<Recharge> recharges = rechargeService.selectList(eq1);
            for (Recharge recharge : recharges) {
                UserDetailVO userDetailVO = new UserDetailVO();
                userDetailVO.setAmount("+"+recharge.getAmount().toString());
                userDetailVO.setType("充值");
                userDetailVO.setInsertTime1(recharge.getInsertTime());
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                String format1 = format.format(recharge.getInsertTime());
                userDetailVO.setInsertTime(format1);
                detail.add(userDetailVO);
            }
            // 查询购课记录 只查询钱包支付的
            Wrapper<OrderCourse> eq2 = new EntityWrapper<OrderCourse>()
                    .eq("userId", id)
//                .eq("payType", 3)
                    .eq("state", 2);
            // 如果传递了年份和月份,则添加时间条件
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq2.ge("insertTime", startDate).le("insertTime", endDate);
            }
//        List<OrderCourse> orderCourses = orderCourseService.selectList(eq2);
//        for (OrderCourse orderCours : orderCourses) {
//            UserDetailVO userDetailVO = new UserDetailVO();
//            userDetailVO.setAmount("-"+orderCours.getRealMoney());
//            userDetailVO.setType("购买课程");
//            userDetailVO.setInsertTime1(orderCours.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(orderCours.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
            Wrapper<Order> eq = new EntityWrapper<Order>()
                    .eq("userId", id)
//                .eq("payType", 3)
                    .eq("state", 2);
            // 如果传递了年份和月份,则添加时间条件
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq.ge("insertTime", startDate).le("insertTime", endDate);
            }
//        List<Order> orders = orderService.selectList(eq);
            // 查询购买套餐记录 只查询钱包支付的
//        for (Order order : orders) {
//            UserDetailVO userDetailVO = new UserDetailVO();
//            userDetailVO.setAmount("-"+order.getRealMoney());
//            userDetailVO.setType("购买套餐");
//            userDetailVO.setInsertTime1(order.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(order.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
            // 查询提现记录
            Wrapper<Withdrawal> eq3 = new EntityWrapper<Withdrawal>()
                    .eq("userId", id);
            // 如果传递了年份和月份,则添加时间条件
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq3.ge("insertTime", startDate).le("insertTime", endDate);
            }
            List<Withdrawal> withdrawals = withdrawalService.selectList(eq3);
            for (Withdrawal withdrawal : withdrawals) {
                UserDetailVO userDetailVO = new UserDetailVO();
                switch (withdrawal.getState()){
                    case 1:
                        userDetailVO.setAmount("-"+withdrawal.getAmount());
                        userDetailVO.setType("提现");
                        break;
                    case 2:
                        userDetailVO.setAmount("-"+withdrawal.getAmount());
                        userDetailVO.setType("提现");
                        break;
                    case 3:
                        userDetailVO.setAmount("+"+withdrawal.getAmount());
                        userDetailVO.setType("提现失败");
                        break;
                }
                userDetailVO.setInsertTime1(withdrawal.getInsertTime());
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                String format1 = format.format(withdrawal.getInsertTime());
                userDetailVO.setInsertTime(format1);
                detail.add(userDetailVO);
            }
            // 查询是否有邀请过用户 获得消费奖励
            Wrapper<Invite> eq4 = new EntityWrapper<Invite>()
                    .eq("giftUserId", id);
            // 如果传递了年份和月份,则添加时间条件
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq4.ge("insertTime", startDate).le("insertTime", endDate);
            }
            eq4.eq("type",1);
            List<Invite> giftUserId = inviteService.selectList(eq4);
            for (Invite invite : giftUserId) {
                UserDetailVO userDetailVO = new UserDetailVO();
                userDetailVO.setAmount("+"+invite.getAmount());
                AppUser appUser = appUserService.selectById(invite.getUserId());
                userDetailVO.setType("好友消费:("+appUser.getName()+"消费了"+invite.getConsume()+"元)");
                userDetailVO.setInsertTime1(invite.getInsertTime());
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                String format1 = format.format(invite.getInsertTime());
                userDetailVO.setInsertTime(format1);
                detail.add(userDetailVO);
            }
            // 查询红包发放记录
            Wrapper<RedPackage> eq5 = new EntityWrapper<RedPackage>();
            if (year != null && month != null) {
                LocalDate startDate = LocalDate.of(year, month, 1);
                LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                eq5.ge("insertTime", startDate).le("insertTime", endDate);
            }
            List<RedPackage> redPackages = redPackageService.selectList(eq5);
            for (RedPackage redPackage : redPackages) {
                if (appUserService.getAppUser().getInsertTime().compareTo(redPackage.getInsertTime())>0){
                    continue;
                }
                UserDetailVO userDetailVO = new UserDetailVO();
                userDetailVO.setAmount("+"+redPackage.getAmount());
                userDetailVO.setType("平台红包");
                userDetailVO.setInsertTime1(redPackage.getInsertTime());
                SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                String format1 = format.format(redPackage.getInsertTime());
                userDetailVO.setInsertTime(format1);
                detail.add(userDetailVO);
            }
            List<UserDetailVO> sortedList = detail.stream()
                    .sorted(Comparator.comparing(UserDetailVO::getInsertTime1).reversed())
                    .collect(Collectors.toList());
            List<UserDetailVO> testing = testing(sortedList.size(), pageNum, pageSize, sortedList);
            walletVO.setDetails(testing);
            return ResultUtil.success(walletVO);
        }else{
            String[] split = type.split(",");
            List<String> collect = Arrays.stream(split).collect(Collectors.toList());
            if (collect.contains("1")){
                // 查询提现记录
                Wrapper<Withdrawal> eq3 = new EntityWrapper<Withdrawal>()
                        .eq("userId", id);
                // 如果传递了年份和月份,则添加时间条件
                if (year != null && month != null) {
                    LocalDate startDate = LocalDate.of(year, month, 1);
                    LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                    eq3.ge("insertTime", startDate).le("insertTime", endDate);
                }
                List<Withdrawal> withdrawals = withdrawalService.selectList(eq3);
                for (Withdrawal withdrawal : withdrawals) {
                    UserDetailVO userDetailVO = new UserDetailVO();
                    switch (withdrawal.getState()){
                        case 1:
                            userDetailVO.setAmount("-"+withdrawal.getAmount());
                            userDetailVO.setType("提现");
                            break;
                        case 2:
                            userDetailVO.setAmount("-"+withdrawal.getAmount());
                            userDetailVO.setType("提现");
                            break;
                        case 3:
                            userDetailVO.setAmount("+"+withdrawal.getAmount());
                            userDetailVO.setType("提现失败");
                            break;
                    }
                    userDetailVO.setInsertTime1(withdrawal.getInsertTime());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                    String format1 = format.format(withdrawal.getInsertTime());
                    userDetailVO.setInsertTime(format1);
                    detail.add(userDetailVO);
                }
            }
            if (collect.contains("2")){
                // 查询是否有邀请过用户 获得消费奖励
                Wrapper<Invite> eq4 = new EntityWrapper<Invite>()
                        .eq("giftUserId", id);
                // 如果传递了年份和月份,则添加时间条件
                if (year != null && month != null) {
                    LocalDate startDate = LocalDate.of(year, month, 1);
                    LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                    eq4.ge("insertTime", startDate).le("insertTime", endDate);
                }
                eq4.eq("type",1);
                List<Invite> giftUserId = inviteService.selectList(eq4);
                for (Invite invite : giftUserId) {
                    UserDetailVO userDetailVO = new UserDetailVO();
                    userDetailVO.setAmount("+"+invite.getAmount());
                    AppUser appUser = appUserService.selectById(invite.getUserId());
                    userDetailVO.setType("好友消费:("+appUser.getName()+"消费了"+invite.getConsume()+"元)");
                    userDetailVO.setInsertTime1(invite.getInsertTime());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                    String format1 = format.format(invite.getInsertTime());
                    userDetailVO.setInsertTime(format1);
                    detail.add(userDetailVO);
                }
            }
            if (collect.contains("3")){
// 查询是否有邀请过用户 获得消费奖励
                Wrapper<Invite> eq4 = new EntityWrapper<Invite>()
                        .eq("giftUserId", id);
                // 如果传递了年份和月份,则添加时间条件
                if (year != null && month != null) {
                    LocalDate startDate = LocalDate.of(year, month, 1);
                    LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                    eq4.ge("insertTime", startDate).le("insertTime", endDate);
                }
                eq4.eq("type",1);
                List<Invite> giftUserId = inviteService.selectList(eq4);
                for (Invite invite : giftUserId) {
                    UserDetailVO userDetailVO = new UserDetailVO();
                    userDetailVO.setAmount("+"+invite.getAmount());
                    AppUser appUser = appUserService.selectById(invite.getUserId());
                    userDetailVO.setType("好友消费:("+appUser.getName()+"消费了"+invite.getConsume()+"元)");
                    userDetailVO.setInsertTime1(invite.getInsertTime());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                    String format1 = format.format(invite.getInsertTime());
                    userDetailVO.setInsertTime(format1);
                    detail.add(userDetailVO);
                }
            }
            if (collect.contains("4")){
                Wrapper<Recharge> eq1 = new EntityWrapper<Recharge>()
                        .eq("userId", id)
                        .eq("state", 2);
                // 如果传递了年份和月份,则添加时间条件
                if (year != null && month != null) {
                    LocalDate startDate = LocalDate.of(year, month, 1);
                    LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                    eq1.ge("insertTime", startDate).le("insertTime", endDate);
                }
                // 查询充值记录
                List<Recharge> recharges = rechargeService.selectList(eq1);
                for (Recharge recharge : recharges) {
                    UserDetailVO userDetailVO = new UserDetailVO();
                    userDetailVO.setAmount("+"+recharge.getAmount().toString());
                    userDetailVO.setType("充值");
                    userDetailVO.setInsertTime1(recharge.getInsertTime());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                    String format1 = format.format(recharge.getInsertTime());
                    userDetailVO.setInsertTime(format1);
                    detail.add(userDetailVO);
                }
            }
            if (collect.contains("5")){
                // 查询红包发放记录
                Wrapper<RedPackage> eq5 = new EntityWrapper<RedPackage>();
                if (year != null && month != null) {
                    LocalDate startDate = LocalDate.of(year, month, 1);
                    LocalDate endDate = startDate.plusMonths(1).minusDays(1);
                    eq5.ge("insertTime", startDate).le("insertTime", endDate);
                }
                List<RedPackage> redPackages = redPackageService.selectList(eq5);
                for (RedPackage redPackage : redPackages) {
                    if (appUserService.getAppUser().getInsertTime().compareTo(redPackage.getInsertTime())>0){
                        continue;
                    }
                    UserDetailVO userDetailVO = new UserDetailVO();
                    userDetailVO.setAmount("+"+redPackage.getAmount());
                    userDetailVO.setType("平台红包");
                    userDetailVO.setInsertTime1(redPackage.getInsertTime());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
                    String format1 = format.format(redPackage.getInsertTime());
                    userDetailVO.setInsertTime(format1);
                    detail.add(userDetailVO);
                }
            }
            List<UserDetailVO> sortedList = detail.stream()
                    .sorted(Comparator.comparing(UserDetailVO::getInsertTime1).reversed())
                    .collect(Collectors.toList());
            List<UserDetailVO> testing = testing(sortedList.size(), pageNum, pageSize, sortedList);
            walletVO.setDetails(testing);
            return ResultUtil.success(walletVO);
        }
    }
    @ResponseBody
    @PostMapping("/base/appUser/appleWalletCourse")
    @ApiOperation(value = "苹果购课、购买套餐列表", tags = {"我的"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
            @ApiImplicitParam(value = "年", name = "year", dataType = "int"),
            @ApiImplicitParam(value = "月", name = "month", dataType = "int"),
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "pageSize", dataType = "int"),
    })
    public ResultUtil<WalletVO> appleWalletCourse(Integer year,Integer month,Integer pageNum,Integer pageSize) {
        WalletVO walletVO = new WalletVO();
        List<UserDetailVO> detail = new ArrayList<>();
        AppUser appUser3 = appUserService.getAppUser();
        if (appUser3 == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        BigDecimal balance = appUserService.getAppUser().getBalance();
        walletVO.setBalance(balance);
        Wrapper<Recharge> eq1 = new EntityWrapper<Recharge>()
                .eq("userId", id)
                .eq("state", 2);
        // 如果传递了年份和月份,则添加时间条件
        if (year != null && month != null) {
            LocalDate startDate = LocalDate.of(year, month, 1);
            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
            eq1.ge("insertTime", startDate).le("insertTime", endDate);
        }
        // 查询充值记录
//        List<Recharge> recharges = rechargeService.selectList(eq1);
//        for (Recharge recharge : recharges) {
//            UserDetailVO userDetailVO = new UserDetailVO();
//            userDetailVO.setAmount("+"+recharge.getAmount().toString());
//            userDetailVO.setType("充值");
//            userDetailVO.setInsertTime1(recharge.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(recharge.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
        // 查询购课记录 只查询钱包支付的
        Wrapper<OrderCourse> eq2 = new EntityWrapper<OrderCourse>()
                .eq("userId", id)
//                .eq("payType", 3)
                .eq("state", 2);
        // 如果传递了年份和月份,则添加时间条件
        if (year != null && month != null) {
            LocalDate startDate = LocalDate.of(year, month, 1);
            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
            eq2.ge("insertTime", startDate).le("insertTime", endDate);
        }
        List<OrderCourse> orderCourses = orderCourseService.selectList(eq2);
        for (OrderCourse orderCours : orderCourses) {
            UserDetailVO userDetailVO = new UserDetailVO();
            userDetailVO.setAmount("-"+orderCours.getRealMoney());
            userDetailVO.setType("购买课程");
            userDetailVO.setInsertTime1(orderCours.getInsertTime());
            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
            String format1 = format.format(orderCours.getInsertTime());
            userDetailVO.setInsertTime(format1);
            detail.add(userDetailVO);
        }
        Wrapper<Order> eq = new EntityWrapper<Order>()
                .eq("userId", id)
//                .eq("payType", 3)
                .eq("state", 2);
        // 如果传递了年份和月份,则添加时间条件
        if (year != null && month != null) {
            LocalDate startDate = LocalDate.of(year, month, 1);
            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
            eq.ge("insertTime", startDate).le("insertTime", endDate);
        }
        List<Order> orders = orderService.selectList(eq);
        // 查询购买套餐记录 只查询钱包支付的
        for (Order order : orders) {
            UserDetailVO userDetailVO = new UserDetailVO();
            userDetailVO.setAmount("-"+order.getRealMoney());
            userDetailVO.setType("购买套餐");
            userDetailVO.setInsertTime1(order.getInsertTime());
            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
            String format1 = format.format(order.getInsertTime());
            userDetailVO.setInsertTime(format1);
            detail.add(userDetailVO);
        }
        // 查询提现记录
//        Wrapper<Withdrawal> eq3 = new EntityWrapper<Withdrawal>()
//                .eq("userId", id);
//        // 如果传递了年份和月份,则添加时间条件
//        if (year != null && month != null) {
//            LocalDate startDate = LocalDate.of(year, month, 1);
//            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
//            eq3.ge("insertTime", startDate).le("insertTime", endDate);
//        }
//        List<Withdrawal> withdrawals = withdrawalService.selectList(eq3);
//        for (Withdrawal withdrawal : withdrawals) {
//            UserDetailVO userDetailVO = new UserDetailVO();
//            switch (withdrawal.getState()){
//                case 1:
//                    userDetailVO.setAmount("-"+withdrawal.getAmount());
//                    userDetailVO.setType("提现");
//                    break;
//                case 2:
//                    userDetailVO.setAmount("-"+withdrawal.getAmount());
//                    userDetailVO.setType("提现");
//                    break;
//                case 3:
//                    userDetailVO.setAmount("+"+withdrawal.getAmount());
//                    userDetailVO.setType("提现失败");
//                    break;
//            }
//            userDetailVO.setInsertTime1(withdrawal.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(withdrawal.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
        // 查询是否有邀请过用户 获得消费奖励
//        Wrapper<Invite> eq4 = new EntityWrapper<Invite>()
//                .eq("giftUserId", id);
//        // 如果传递了年份和月份,则添加时间条件
//        if (year != null && month != null) {
//            LocalDate startDate = LocalDate.of(year, month, 1);
//            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
//            eq4.ge("insertTime", startDate).le("insertTime", endDate);
//        }
//        eq4.eq("type",1);
//        List<Invite> giftUserId = inviteService.selectList(eq4);
//        for (Invite invite : giftUserId) {
//            UserDetailVO userDetailVO = new UserDetailVO();
//            userDetailVO.setAmount("+"+invite.getAmount());
//            AppUser appUser = appUserService.selectById(invite.getUserId());
//            userDetailVO.setType("好友消费:("+appUser.getName()+"消费了"+invite.getConsume()+"元)");
//            userDetailVO.setInsertTime1(invite.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(invite.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
        // 查询红包发放记录
//        Wrapper<RedPackage> eq5 = new EntityWrapper<RedPackage>();
//        if (year != null && month != null) {
//            LocalDate startDate = LocalDate.of(year, month, 1);
//            LocalDate endDate = startDate.plusMonths(1).minusDays(1);
//            eq5.ge("insertTime", startDate).le("insertTime", endDate);
//        }
//        List<RedPackage> redPackages = redPackageService.selectList(eq5);
//        for (RedPackage redPackage : redPackages) {
//            if (appUserService.getAppUser().getInsertTime().compareTo(redPackage.getInsertTime())>0){
//                continue;
//            }
//            UserDetailVO userDetailVO = new UserDetailVO();
//            userDetailVO.setAmount("+"+redPackage.getAmount());
//            userDetailVO.setType("平台红包");
//            userDetailVO.setInsertTime1(redPackage.getInsertTime());
//            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
//            String format1 = format.format(redPackage.getInsertTime());
//            userDetailVO.setInsertTime(format1);
//            detail.add(userDetailVO);
//        }
        List<UserDetailVO> sortedList = detail.stream()
                .sorted(Comparator.comparing(UserDetailVO::getInsertTime1).reversed())
                .collect(Collectors.toList());
        List<UserDetailVO> testing = testing(sortedList.size(), pageNum, pageSize, sortedList);
        walletVO.setDetails(testing);
        return ResultUtil.success(walletVO);
    }
    public static List<UserDetailVO> testing(long total, long current, long size, List<UserDetailVO> str){
        List<UserDetailVO> result = new ArrayList<>();
        //获取初始化分页结构
@@ -540,6 +1124,9 @@
    })
    public ResultUtil changeConstellation(String consName ) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        appUser.setConstellation(consName);
        appUserService.updateById(appUser);
        return ResultUtil.success();
@@ -585,6 +1172,9 @@
        int month = currentDate.getMonthValue();
        int day = currentDate.getDayOfMonth();
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if (!StringUtils.hasLength(appUser.getConstellation())){
            // 根据月份和日期确定星座
            consName = getZodiacSign(month, day);
@@ -609,6 +1199,10 @@
            @ApiImplicitParam(value = "动态id", name = "findId", dataType = "int"),
    })
    public ResultUtil feedBack(Integer findId) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Find find = findService.selectById(findId);
        find.setIsDelete(1);
        findService.updateById(find);
@@ -624,8 +1218,12 @@
            @ApiImplicitParam(value = "页条数", name = "pageSize", dataType = "int")
    })
    public ResultUtil<List<FindVO>> myFind(Integer pageNum,Integer pageSize) {
        Integer id = appUserService.getAppUser().getId();
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        List<String> strings = new ArrayList<>();
        strings.add("insertTime");
        List<Find> finds = findService.selectList(new EntityWrapper<Find>()
@@ -649,6 +1247,27 @@
        }
        List<FindVO> findVOS = testing3(res.size(), pageNum, pageSize, res);
        return ResultUtil.success(findVOS);
    }
    public static List<BlackListVO> testing4(long total, long current, long size, List<BlackListVO> str){
        List<BlackListVO> result = new ArrayList<>();
        //获取初始化分页结构
        com.stylefeng.guns.modular.system.util.Page<BlackListVO> page = new Page().getPage(total, size, current - 1);
        //获取集合下标初始值
        long startIndex = page.getStartIndex();
        //获取集合下标结束值
        long endInddex = 0;
        if(startIndex + page.getCurrent() >= total || size > total){
            endInddex = total;
        }else {
            endInddex = Math.min(startIndex + page.getSize(), total);
        }
        //如果输入的开始查询下标大于集合大小,则查询为空值
        if(startIndex > total){
            result = Collections.emptyList();
        }else{
            result = str.subList((int)startIndex,(int)endInddex);
        }
        return result;
    }
    public static List<FindVO> testing3(long total, long current, long size, List<FindVO> str){
        List<FindVO> result = new ArrayList<>();
@@ -679,6 +1298,10 @@
            @ApiImplicitParam(name = "title", value = "标题"),
    })
    public ResultUtil<List<UseGuide>> useGuide(String title) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        EntityWrapper<UseGuide> wrapper = new EntityWrapper<>();
        List<String> strings = new ArrayList<>();
        strings.add("sort");
@@ -699,6 +1322,9 @@
    })
    public ResultUtil setUnit(Integer type) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        appUser.setUnit(type);
        appUserService.updateById(appUser);
        return ResultUtil.success("设置成功");
@@ -714,6 +1340,9 @@
    public ResultUtil setWeight(Integer type ,Double weight) {
        Double temp = 0.0;
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        switch (appUser.getUnit()){
            case 1:
                temp = weight;
@@ -771,6 +1400,10 @@
            @ApiImplicitParam(name = "img", value = "图片地址,多张逗号隔开")
    })
    public ResultUtil feedBack(String content,String img) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        AuditVO content1 = auditUtil.content(content);
        switch (content1.getType()){
            case "terrorism":
@@ -805,6 +1438,9 @@
    public ResultUtil<UserInfoVO> userInfo() {
        UserInfoVO userInfoVO = new UserInfoVO();
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        userInfoVO.setConstellation(appUser.getConstellation());
        BeanUtils.copyProperties(appUser,userInfoVO);
        if (appUser.getConstellation() == null){
@@ -1033,12 +1669,7 @@
        return temp;
    }
    public static void main(String[] args) {
        UserInfoVO userInfoVO = new UserInfoVO();
        BMIVO bmi = getBMI(userInfoVO, 160, 2, 58D);
        System.err.println(bmi);
    }
    private static BMIVO getBMI(UserInfoVO userInfoVO, Integer height,Integer gender, Double temp) {
        String url = "http://apis.juhe.cn/fapig/calculator/weight";
        Map<String, String> params = new HashMap<String, String>();
@@ -1111,8 +1742,14 @@
        }
        return null;
    }
    public static void main(String[] args) {
        UserInfoVO userInfoVO = new UserInfoVO();
        String index = getIndex(80, 1, 3d, 3L);
        System.err.println(index);
    }
    // 获取健康指数
    private String getIndex(Integer height,Integer gender, Double temp,Long age) {
    private static String getIndex(Integer height,Integer gender, Double temp,Long age) {
        String url = "http://apis.juhe.cn/fapig/healthy/bmr";
        Map<String, String> params = new HashMap<String, String>();
        params.put("key", "c28bcb61589b8943ea35887e4fd35afe"); // 在个人中心->我的数据,接口名称上方查看
@@ -1388,6 +2025,10 @@
    })
    public ResultUtil<List<CourseList>> collectCourse(CourseQuery req) {
        req.setPageNum((req.getPageNum() - 1) * req.getPageSize());
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        // 查询用户已收藏的课程ids
        List<Integer> courseIds = collectService.selectList(new EntityWrapper<UserCollect>()
@@ -1397,6 +2038,17 @@
            courseIds.add(-1);
        }
        req.setCourseIds(courseIds);
        List<String> strings = new ArrayList<>();
        if (req.getPositionName1()!=null){
            String positionName1 = req.getPositionName1();
            if (!positionName1.equals("全部")){
                strings.add(req.getPositionName1());
                req.setPositionName(strings);
            }else{
                req.setPositionName(new ArrayList<String>());
            }
        }
        // 查询出收藏的课程 并且将免费的展示在最前面
        List<CourseList> res = courseService.courseSearch(req);
        for (CourseList re : res) {
@@ -1433,6 +2085,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil updateUserInfo(UpdateAppUserDTO dto) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        if(StringUtils.hasLength(dto.getHeadImg())){
            AuditVO image = auditUtil.image(dto.getHeadImg());
            switch (image.getType()){
@@ -1475,7 +2131,7 @@
            }
        }
        AppUser appUser = appUserService.getAppUser();
        // 根据当前用户所选择的单位 将weight置换成公斤存储
        if (dto.getWeight()!=null){
            // 本次体重
@@ -1532,6 +2188,9 @@
    public ResultUtil<UserInfoVO> getUserInfo() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        UserInfoVO userInfoVO = new UserInfoVO();
        BeanUtils.copyProperties(appUser,userInfoVO);
        if (appUser.getHeight()!=null && appUser.getGender()!=null &&appUser.getWeight()!=null ){
@@ -1541,6 +2200,7 @@
            System.err.println(appUser.getWeight());
            BMIVO bmi = getBMI(userInfoVO,appUser.getHeight(),appUser.getGender(),appUser.getWeight());
            userInfoVO.setBMI(bmi.getBmi());
            userInfoVO.setBMIInfo(bmi.getMsg());
        }else{
            userInfoVO.setBMI("0");
        }
@@ -1602,6 +2262,10 @@
            @ApiImplicitParam(name = "code", value = "邀请码"),
    })
    public ResultUtil updatePhone(String phone, String code) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        // 原手机号码
        String phone1 = appUserService.getAppUser().getPhone();
        // 判断手机验证码是否匹配
@@ -1631,7 +2295,7 @@
        if (appUsers.size()>0){
            return ResultUtil.error("该手机号已注册");
        }
        AppUser appUser = appUserService.getAppUser();
        appUser.setPhone(phone);
        appUser.setAccount(phone);
        appUserService.updateById(appUser);
@@ -1647,6 +2311,9 @@
    })
    public ResultUtil deleteAppUser( ) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        appUser.setState(3);
        appUserService.updateById(appUser);
        // 清除token
@@ -1662,6 +2329,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil setAddress(Recipient dto) {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        Recipient userId = recipientService.selectOne(new EntityWrapper<Recipient>()
                .eq("userId", id));
@@ -1684,6 +2355,10 @@
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header")
    })
    public ResultUtil<Recipient> getAddress() {
        AppUser appUser = appUserService.getAppUser();
        if (appUser == null){
            return ResultUtil.tokenErr("登录失效");
        }
        Integer id = appUserService.getAppUser().getId();
        Recipient userId = recipientService.selectOne(new EntityWrapper<Recipient>()
                .eq("userId", id));
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserBlackMapper.java
New file
@@ -0,0 +1,17 @@
package com.stylefeng.guns.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.model.AppUser;
import com.stylefeng.guns.modular.system.model.UserBlack;
/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author 无关风月
 * @since 2024-02-06
 */
public interface UserBlackMapper extends BaseMapper<UserBlack> {
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/BlackUserMapper.xml
New file
@@ -0,0 +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.stylefeng.guns.modular.system.dao.UserBlackMapper">
</mapper>
guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CourseMapper.xml
@@ -20,9 +20,10 @@
    <sql id="Base_Column_List">
        id, courseName, coverImg, introduce, type, difficulty, time, isFree, sort, state
    </sql>
    <select id="courseSearch" resultType="com.stylefeng.guns.modular.system.vo.CourseList">
        select t1.id,t1.courseName,t1.allTime as `time`,t1.isFree,t1.difficulty,t1.coverImg,
        CONCAT(t3.name,'|',t2.name) as typeName
        CONCAT(t3.name,'|',t2.name) as typeName,t2.appleAmount
        from t_course t1
        left join t_fitness_position t2 on t1.positionId = t2.id
        left join t_fitness_type t3 on t2.typeId = t3.id
@@ -30,8 +31,11 @@
        <if test="null != req.courseName and '' != req.courseName">
            and t1.courseName like CONCAT('%', #{req.courseName}, '%')
        </if>
        <if test="null != req.positionName1 and '' != req.positionName1">
            and t2.name like CONCAT('%', #{req.positionName1}, '%')
        <if test="null != req.positionName and req.positionName.size()>0" >
            and t2.name in
            <foreach collection="req.positionName" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        <if test="null != req.time">
            and (t1.time between #{req.startTime} and #{req.endTime}
@@ -67,7 +71,7 @@
    </select>
    <select id="courseSearch1" resultType="com.stylefeng.guns.modular.system.vo.CourseList">
        select t1.id,t1.courseName,t1.allTime as `time`,t1.isFree,t1.difficulty,t1.coverImg,t1.introduce,
        t2.amount as price,
        t2.amount as price,t2.appleAmount,
        CONCAT(t3.name,'|',t2.name) as typeName
        from t_course t1
        left join t_fitness_position t2 on t1.positionId = t2.id
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/FitnessPosition.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@@ -37,11 +38,43 @@
     */
    private Integer typeId;
    private Integer isDelete;
    private Integer isUse;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H1")
    private BigDecimal amount;
    private Integer isUse;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H2")
    private BigDecimal amount2;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H3")
    private BigDecimal amount3;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H4")
    private BigDecimal amount4;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H5")
    private BigDecimal amount5;
    @ApiModelProperty(value = "ios用 苹果价格H1")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "ios用 苹果价格H2")
    private BigDecimal appleAmount2;
    @ApiModelProperty(value = "ios用 苹果价格H3")
    private BigDecimal appleAmount3;
    @ApiModelProperty(value = "ios用 苹果价格H4")
    private BigDecimal appleAmount4;
    @ApiModelProperty(value = "ios用 苹果价格H5")
    private BigDecimal appleAmount5;
    public Integer getId() {
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Package.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@@ -38,10 +39,13 @@
     * 原价
     */
    private BigDecimal amount;
    private BigDecimal appleAmount;
    /**
     * 优惠价
     */
    private BigDecimal price;
    @ApiModelProperty(value = "选择部位的难度 和部位ids一一对应")
    private String difficulty;
    public Integer getId() {
guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserBlack.java
New file
@@ -0,0 +1,42 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * <p>
 * banner
 * </p>
 *
 * @author 无关风月
 * @since 2024-02-06
 */
@TableName("t_user_black")
@Data
public class UserBlack extends Model<UserBlack> {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "拉黑时间")
    private Date insertTime;
    @ApiModelProperty(value = "用户id")
    private Integer userId;
    @ApiModelProperty(value = "被拉黑用户id")
    private Integer blackUserId;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserBlackService.java
New file
@@ -0,0 +1,19 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.AppUser;
import com.stylefeng.guns.modular.system.model.UserBlack;
/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author 无关风月
 * @since 2024-02-06
 */
public interface IUserBlackService extends IService<UserBlack> {
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserBlackServiceImpl.java
New file
@@ -0,0 +1,30 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.AppUserMapper;
import com.stylefeng.guns.modular.system.dao.UserBlackMapper;
import com.stylefeng.guns.modular.system.model.AppUser;
import com.stylefeng.guns.modular.system.model.UserBlack;
import com.stylefeng.guns.modular.system.service.IAppUserService;
import com.stylefeng.guns.modular.system.service.IUserBlackService;
import com.stylefeng.guns.modular.system.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author 无关风月
 * @since 2024-02-06
 */
@Service
public class UserBlackServiceImpl extends ServiceImpl<UserBlackMapper, UserBlack> implements IUserBlackService {
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpUtilIOS.java
New file
@@ -0,0 +1,76 @@
package com.stylefeng.guns.modular.system.util;
import net.sf.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
public class HttpUtilIOS {
    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url
     *            发送请求的 URL
     * @param param
     *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static  synchronized String sendPosturl(String url, JSONObject param) {
        StringBuilder sb = new StringBuilder();
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            sb = new StringBuilder();
            while ((line = in.readLine()) != null)
            {
                sb.append(line);
            }
        } catch (Exception e) {
           // System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        System.out.print(sb.toString());
        return sb.toString();
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/IosPalUtils.java
New file
@@ -0,0 +1,105 @@
package com.stylefeng.guns.modular.system.util;
import net.sf.json.JSONObject;
/**
 * 苹果支付
 */
public  class IosPalUtils {
    /*public static String buyAppVerify(String receipt, String environment) {
        String url = null;
        if(environment.equals("0")) {
            url = "https://buy.itunes.apple.com/verifyReceipt";  // 生产环境
        }
        if (environment.equals("1")) {
            url = "https://sandbox.itunes.apple.com/verifyReceipt";  // 沙盒测试
        }
        try {
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());
            URL console = new URL(url);
            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
            conn.setSSLSocketFactory(sc.getSocketFactory());
            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-type", "application/json");
            conn.setDoInput(true);
            conn.setDoOutput(true);
            BufferedOutputStream hurlBufOus = new BufferedOutputStream(
                    conn.getOutputStream());
            String newReceipt = receipt.replace(" ", "+");
            String str = String.format("{\"receipt-data\":\"" + newReceipt + "\"}");
            hurlBufOus.write(str.getBytes());
            hurlBufOus.flush();
            InputStream is = conn.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }*/
    public static void main(String[] args) {
        Boolean success = isSuccess("MIIUMQYJKoZIhvcNAQcCoIIUIjCCFB4CAQExDzANBglghkgBZQMEAgEFADCCA2cGCSqGSIb3DQEHAaCCA1gEggNUMYIDUDAKAgEIAgEBBAIWADAKAgEUAgEBBAIMADALAgEBAgEBBAMCAQAwCwIBAwIBAQQDDAExMAsCAQsCAQEEAwIBADALAgEPAgEBBAMCAQAwCwIBEAIBAQQDAgEAMAsCARkCAQEEAwIBAzAMAgEKAgEBBAQWAjQrMAwCAQ4CAQEEBAICAOUwDQIBDQIBAQQFAgMCmaAwDQIBEwIBAQQFDAMxLjAwDgIBCQIBAQQGAgRQMzAyMBgCAQQCAQIEEK4EIRao3YO/HUKcetIVyhwwGwIBAAIBAQQTDBFQcm9kdWN0aW9uU2FuZGJveDAcAgEFAgEBBBRY5FnvMfJY7IeyOScGta2mK4EmSDAeAgECAgEBBBYMFGNvbS5zaW5hdGEuSktGaXRuZXNzMB4CAQwCAQEEFhYUMjAyNC0wNC0yNFQxMDoyNjo0MFowHgIBEgIBAQQWFhQyMDEzLTA4LTAxVDA3OjAwOjAwWjAyAgEHAgEBBConwLAkFwp7XhLD8GVxce+idO3f5cTVhbhZKhNH/Oo81C5RDmAiOae16XYwRwIBBgIBAQQ/25TkhZvX6zym89mlW1/u+tDzQ91o12AoiAm8/QFTrjJ/kxqsMjAsjupXnxJppFPIN9cySHw+hG5ppz5Z8ElzMIIBagIBEQIBAQSCAWAxggFcMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEBMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMAwCAga6AgEBBAMCAQAwGwICBqcCAQEEEgwQMjAwMDAwMDU4MDQ2MTI4MDAbAgIGqQIBAQQSDBAyMDAwMDAwNTgwNDYxMjgwMB8CAgaoAgEBBBYWFDIwMjQtMDQtMjRUMTA6MjY6NDBaMB8CAgaqAgEBBBYWFDIwMjQtMDQtMjRUMTA6MjY6NDBaMCICAgamAgEBBBkMF2NvbS5qa2ZpdG5lc3MuYS5wcmljZS4woIIO4jCCBcYwggSuoAMCAQICEBXnn85SVQplAXyR3+Tus1kwDQYJKoZIhvcNAQELBQAwdTFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxCzAJBgNVBAsMAkc1MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0yMjA5MDIxOTEzNTdaFw0yNDEwMDExOTEzNTZaMIGJMTcwNQYDVQQDDC5NYWMgQXBwIFN0b3JlIGFuZCBpVHVuZXMgU3RvcmUgUmVjZWlwdCBTaWduaW5nMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8RM4LrWowdq/ACQw0ehlh770gDfX6Q54T9azzPJMO12WbdMJaNydU8I7NRjqCzHW/EuALKe5Ya6DnQir3hwCfosypIuZt6A3nyw/00GRbs7+NY83Cm2KwKdfewKONrRuk+Oto23OGLl/MuyF9a7g4bqvvIoNIE/ZEoqRGnOVi7HQ7fzeUonZqiCF7BHyh07Oe4jVtp46PsONl1sgzH06OigPs6b3MH7Wnho4E8JDvuiGObZJicsGJ0Jj+41XJVsY0dP70HppDcGF9fobCed1Qdd0IsOSotXo2fZf8+UkgHecSYqhl2jwWWP4mUY+Reas9W7v5LtM7UgcYMOd/D5jvAgMBAAGjggI7MIICNzAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFBmLl41KW2F4V/SlXDUSijkI47B1MHAGCCsGAQUFBwEBBGQwYjAtBggrBgEFBQcwAoYhaHR0cDovL2NlcnRzLmFwcGxlLmNvbS93d2RyZzUuZGVyMDEGCCsGAQUFBzABhiVodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHJnNTA1MIIBHwYDVR0gBIIBFjCCARIwggEOBgoqhkiG92NkBQYBMIH/MDcGCCsGAQUFBwIBFitodHRwczovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuYXBwbGUuY29tL3d3ZHJnNS5jcmwwHQYDVR0OBBYEFCLJPHtjE4W+OjvFM6m0+rGwgpMXMA4GA1UdDwEB/wQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAPEbuz6g8uP2eg8tR8PaoUfziBx2CJNzukoob6k2o6jtPhzKaOTnbW/hb2k2NzfsJSguxzZoZb07H/WhbO9z5V4+TJEqEdI2gJGd3OYI5DY8vfIGBD+3rW/h1tPzz3pSRvUyFHH3RjmdkSIIGCrBhJMTwUCtWWq7NbsB3gGHPCPKgUeVz+QGRE2cy/zNxMzswT0swBXwtszlr3yZdr3y5dga5rgsfZVBVAc2hs085cQQxxkh1FSY/St8q5ILKjhhl6WCwjobi1krUc5kkrU4VTm1FSGvGA7t3NEadR9ekaPcPdEBCN3iEKL4CKwoOjN5WSZpQzQJ5O4zQOqivmRzKgTCCBFUwggM9oAMCAQICFDt+gAru0wKh5uzbl9nKrCic8WmUMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0yMDEyMTYxOTM4NTZaFw0zMDEyMTAwMDAwMDBaMHUxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQswCQYDVQQLDAJHNTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfXdof+/q80EsiPMfWJvoX9/SfHj5kEWaa716+qzS9qiwhbtYelCGFLHTBDhBhqjxjSn5K48h11s/CnAhIe2q5KbHJZv3IihbRsgQ8grqAbOL/CnLrrP47b0i+nosRTZV9snuQLwIcTvxJvtdvtU++eMba3rLNydlmETta6QlFc4lQ1E7iaAV+2nWcSwGu2uPPbXRN3lPQ1Ro4gjrQneNdKXuxgeopJwv7YHyGEvvwYk8G50zRH9ltnu1z2nghDZ1w2UZXkF9nhMFzdwqoYmK2rnCGu3Ujia159uak1P2DJjIKOySSWyChnNEvgBib3TwL57X97IBXDxeePyuHJ7v3AgMBAAGjge8wgewwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAGGKGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYXBwbGVyb290Y2EwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwHQYDVR0OBBYEFBmLl41KW2F4V/SlXDUSijkI47B1MA4GA1UdDwEB/wQEAwIBBjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAWsQ1otnmCp5SogCCInfNci+Q+SKvFCXMqgpCYJLCvXUd60zKFeV+a0AQXvtbRXQN8Hp9iJHO3mOLQonSGN9Bs1ieBgiHSN1AryPV7essYOXrpH8c6ZyD1pRfTGI5ik6uE419Q7jcXqy+GEDy5g8sXROT8XtlqMJoSN7/tJabDPsyNp6eDZVfOAqLltISbLeLC47XPuxvAarOTUVg24RxZmLlGWUwzYr/RVP7bvuId0PDSGP591Gzcl554lbPvLuEuThaeK4RSFK7DTWLlN7MdJpo9UlglKzyqLMVhpDQzDBDhtPlcAJRtIHAqJfU6uqwjAlA7ziTss0iA+tnQ2XIRTCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs/j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP/Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn+9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t+2Mm9zzd5vydtJ3ME/BH4WDhRuZPUc38qmbQI4s1LGQEti+9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb+aTwpr/yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q/Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy/5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU+12TZ/wYdV2aeZuTJC+9jVcZ5+oVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAbUwggGxAgEBMIGJMHUxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQswCQYDVQQLDAJHNTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCEBXnn85SVQplAXyR3+Tus1kwDQYJYIZIAWUDBAIBBQAwDQYJKoZIhvcNAQEBBQAEggEAOlEzT7vQc8xJvYHyuAKyevnV1lEb+iN0/55jvD4YmX3C/W8ceJQq9806jHx6hsYMeaEnq90LDQds+R45bUoXxdFD/0GftEcLh4X3h8uKIc0gy8RsnYkua0Q3m+CsuuC6av30ksea+QWvhdjM2WFUBCgf0Sce6IwDgJr+wb1jiQ2G2YdbNV5hOvLlHiO0cY7iXozdLlOaIQSzoqqQLbol83IW0Hb93lLMIcKFXWK8RVaoPm2OMAsnp7Q7dDMmuafef+Vw7aE7puOmll2qj22YvK1dXQhmU0cwYSWrZYyjIcyIDzdaD+eVnXBWApQoCrdBvhnbPG/1c5s3QkzSn3Efqg==");
        System.err.println(success);
    }
    /**
     * @param key  支付Id第三方返回的orderId
     */
    public  static Boolean isSuccess(String key) {
        try {
            System.out.println("!!!!!!!!!!!"+key+"!!!!!!!!!!!");
            Boolean ok=false;
            if (key!=null) {
                key = key.replace(" ", "+");
                System.out.println("!!!!!!!!!!!"+key+"!!!!!!!!!!!");
                JSONObject data = JSONObject.fromObject("{\"receipt-data\":\"" + key + "\"}");
                String score = HttpUtilIOS.sendPosturl("https://buy.itunes.apple.com/verifyReceipt", data);
                // 将String 转化为json
                JSONObject json = JSONObject.fromObject(score);
                System.out.print("!!!!!!!!!!!"+json+"!!!!!!!!!!!");
                if (!json.getString("status").equals("0")) {
                    JSONObject data1 = JSONObject.fromObject("{\"receipt-data\":\"" + key + "\"}");
                    String score1 = HttpUtilIOS.sendPosturl("https://sandbox.itunes.apple.com/verifyReceipt", data1);
                    // 将String 转化为json
                    JSONObject json1 = JSONObject.fromObject(score1);
                    if (json1.getString("status").equals("0")) {
                        String receipt = json1.getString("receipt");
                        JSONObject jsons = JSONObject.fromObject(receipt);
                        String m3 = jsons.getString("in_app");
                        String m4 = m3.replace("[", "");
                        String m5 = m4.replace("]", "");
                        if(m5!=null){
                            ok=true;
                        }
                    }
                }else {
                    if (json.getString("status").equals("0")) {
                        String receipt = json.getString("receipt");
                        JSONObject jsons = JSONObject.fromObject(receipt);
                        String m3 = jsons.getString("in_app");
                        String m4 = m3.replace("[", "");
                        String m5 = m4.replace("]", "");
                        if(m5!=null){
                            ok=true;
                        }
                    }
                }
            }
            return ok;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JwsUtil.java
New file
@@ -0,0 +1,52 @@
package com.stylefeng.guns.modular.system.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Base64;
@Component
public class JwsUtil {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public Jws<Claims> verifyJWT(String x5c, String jws){
        try {
            X509Certificate cert = getCert(x5c);
            if (!cert.getSubjectDN().getName().contains("Apple Inc")){
                logger.info("not apple cert . name = {}", cert.getIssuerX500Principal().getName());
                return null;
            }
            return Jwts.parser().setSigningKey(cert.getPublicKey()).parseClaimsJws(jws);
        }catch (JwtException exc){
            logger.info("jws verify failure.", exc);
            return null;
        } catch (Exception exc){
            logger.info("jws verify error.", exc);
            return null;
        }
    }
    public static X509Certificate getCert(String x5c) throws CertificateException {
        String stripped = x5c.replaceAll("-----BEGIN (.*)-----", "");
        stripped = stripped.replaceAll("-----END (.*)----", "");
        stripped = stripped.replaceAll("\r\n", "");
        stripped = stripped.replaceAll("\n", "");
        stripped.trim();
        byte[] keyBytes = Base64.getDecoder().decode(stripped);
        CertificateFactory fact = CertificateFactory.getInstance("X.509");
        return (X509Certificate) fact.generateCertificate(new ByteArrayInputStream(keyBytes));
    }
    public static void main(String[] args) {
    }
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PayMoneyUtil.java
@@ -58,13 +58,13 @@
    private String smid = "2088330203191220";//平台支付宝商户号...
    private String appid = "wx41d32f362ba0f911";//微信appid
    private String appid = "wxe376c3189895ec7e";//微信appid
    private String appSecret = "cf0ebf950f5926a69041a0e2bbe20f3e";
    private String appSecret = "bd3ce1f17193b702ac13c9eeae2a2ca0";
    private String mchId = "1501481761";//微信商户号
    private String mchId = "1682142091";//微信商户号
    private String key = "6f5e0c2dcabfa9c27b5da5836a362fef";//微信商户号
    private String key = "dkebm3GJaryQYjdEiT6TSAa09p5CZJSw";//密钥
    private String callbackPath = "https://jkcyl.cn/app";//支付回调网关地址
@@ -405,6 +405,7 @@
                String result_code = map.get("result_code");
                if ("SUCCESS".equals(result_code)) {
                    Map<String, String> map1 = new HashedMap();
                    map1.put("nonce_str", map.get("nonce_str"));
                    map1.put("out_trade_no", map.get("out_trade_no"));//存储的订单code
                    map1.put("attach", map.get("attach"));//存储订单id
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/BlackListVO.java
New file
@@ -0,0 +1,21 @@
package com.stylefeng.guns.modular.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@ApiModel(value = "拉黑列表返回VO")
public class BlackListVO {
    @ApiModelProperty(value = "被拉黑用户id")
    private Integer id;
    @ApiModelProperty(value = "用户头像")
    private String headImg;
    @ApiModelProperty(value = "用户名称")
    private String name;
}
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/BuyDetailVO.java
@@ -18,6 +18,8 @@
    private String typeName;
    @ApiModelProperty(value = "支付价格")
    private BigDecimal amount;
    @ApiModelProperty(value = "苹果支付价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "包含课程数")
    private Integer count;
    @ApiModelProperty(value = "可选套餐列表")
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/CourseDetailVO.java
@@ -34,6 +34,8 @@
    private String introduce;
    @ApiModelProperty(value = "价格")
    private BigDecimal price;
    @ApiModelProperty(value = "苹果价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "课程视频")
    private List<CourseVideo> videos;
    @ApiModelProperty(value = "推荐课程")
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/CourseList.java
@@ -33,6 +33,8 @@
    private String coverImg;
    @ApiModelProperty(value = "价格")
    private BigDecimal price;
    @ApiModelProperty(value = "苹果价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "页码,首页1", required = true)
    private Integer pageNum;
    @ApiModelProperty(value = "页条数", required = true)
guns-admin/src/main/java/com/stylefeng/guns/modular/system/vo/PackageListVO.java
@@ -20,6 +20,8 @@
    private BigDecimal amount;
    @ApiModelProperty(value = "套餐价格(和原价相等的话 没有优惠)")
    private BigDecimal price;
    @ApiModelProperty(value = "苹果支付价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "套餐包含的部位ids 前端忽略")
    private String ids;
    @ApiModelProperty(value = "部位")
guns-management/pom.xml
@@ -16,6 +16,19 @@
            <version>3.23.9</version>
        </dependency>
        <dependency>
            <groupId>com.huawei.apigateway</groupId>
            <artifactId>java-sdk-core</artifactId>
            <version>3.2.5</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/java-sdk-core-3.2.5.jar</systemPath>
        </dependency>
        <!--华为云的obs-->
        <dependency>
            <groupId>com.huaweicloud</groupId>
            <artifactId>esdk-obs-java</artifactId>
            <version>3.19.5</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
@@ -43,13 +56,7 @@
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.huawei.apigateway</groupId>
            <artifactId>java-sdk-core</artifactId>
            <version>3.2.5</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/java-sdk-core-3.2.5.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.stylefeng</groupId>
            <artifactId>guns-core</artifactId>
@@ -58,12 +65,7 @@
            <groupId>com.stylefeng</groupId>
            <artifactId>guns-generator</artifactId>
        </dependency>
        <!--华为云的obs-->
        <dependency>
            <groupId>com.huaweicloud</groupId>
            <artifactId>esdk-obs-java</artifactId>
            <version>3.19.5</version>
        </dependency>
        <!--spring boot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/AppUserController.java
@@ -234,7 +234,8 @@
        BigDecimal friendMoney = new BigDecimal("0");
        // 查询消费金额
        List<BigDecimal> userId = inviteService.selectList(new EntityWrapper<Invite>()
                .eq("userId", id)).stream().map(Invite::getAmount).collect(Collectors.toList());
                .eq("giftUserId", id)
        .eq("type",1)).stream().map(Invite::getAmount).collect(Collectors.toList());
         friendMoney = userId.stream()
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        res.setFriendMoney(friendMoney);
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/FitnessController.java
@@ -81,7 +81,6 @@
    @ResponseBody
    @PostMapping("/addOrUpdateType")
    @ApiOperation(value = "健身类型添加/编辑", tags = {"健身类型管理"})
    public ResultUtil addCoupon(FitnessType fitnessType) {
        if (fitnessType.getId()==null){
            // 添加
@@ -132,30 +131,51 @@
        packageDetailVO.setTotal(aPackage.getTotal());
        packageDetailVO.setAmount(aPackage.getAmount());
        packageDetailVO.setPrice(aPackage.getPrice());
        packageDetailVO.setAppleAmount(aPackage.getAppleAmount());
        if (StringUtils.hasLength(aPackage.getPositions())){
            String[] split = aPackage.getPositions().split(",");
            String[] split1 = aPackage.getDifficulty().split(",");
            // 遍历部位ids
            for (String s : aPackage.getPositions().split(",")) {
            for (int i = 0; i < split.length; i++) {
                FitnessPositionVO fitnessPositionVO = new FitnessPositionVO();
                // 查询部位
                FitnessPosition fitnessPosition = fitnessPositionService.selectById(Integer.valueOf(s));
                FitnessPosition fitnessPosition = fitnessPositionService.selectById(Integer.valueOf(split[i]));
                if (fitnessPosition!=null){
                    fitnessPositionVO.setId(fitnessPosition.getId());
                if (fitnessPosition.getIsDelete() == 1){
                    continue;
                }
                if (fitnessPosition!=null){
                    fitnessPositionVO.setName(fitnessPosition.getName());
                    // 查询部位名称
                    FitnessType fitnessType = fitnessTypeService.selectById(fitnessPosition.getTypeId());
                    if (fitnessType!=null){
                    if (fitnessType.getIsDelete() == 1){
                        continue;
                    }
                    if (fitnessType!=null){
                        fitnessPositionVO.setTypeName(fitnessType.getName());
                    }
                    switch (split1[i]){
                        case "0":
                    fitnessPositionVO.setAmount(fitnessPosition.getAmount());
                            break;
                        case "1":
                            fitnessPositionVO.setAmount(fitnessPosition.getAppleAmount2());
                            break;
                        case "2":
                            fitnessPositionVO.setAmount(fitnessPosition.getAmount3());
                            break;
                        case "3":
                            fitnessPositionVO.setAmount(fitnessPosition.getAmount4());
                            break;
                        case "4":
                            fitnessPositionVO.setAmount(fitnessPosition.getAmount5());
                            break;
                }
                fitnessPositionVO.setId(fitnessPosition.getId());
                }
                fitnessPositionVOS.add(fitnessPositionVO);
            }
        }
        packageDetailVO.setTypes(fitnessPositionVOS);
        return ResultUtil.success(packageDetailVO);
@@ -165,8 +185,56 @@
    @ApiOperation(value = "选择部位", tags = {"健身套餐管理"})
    public ResultUtil<PageInfo<FitnessPositionVO> > selectPosition(FitnessPositionQuery req) {
        List<FitnessPositionVO> res = packageService.selectPosition(req);
        List<FitnessPositionVO> fitnessPositionVOS = new ArrayList<>();
        for (FitnessPositionVO re : res) {
            FitnessPositionVO fitnessPositionVO = new FitnessPositionVO();
            fitnessPositionVO.setId(re.getId());
            fitnessPositionVO.setName(re.getName());
            fitnessPositionVO.setTypeName(re.getTypeName());
            fitnessPositionVO.setTypeId(re.getTypeId());
            fitnessPositionVO.setDifficulty("1");
            fitnessPositionVO.setAmount(re.getAmount());
            fitnessPositionVO.setAppleAmount(re.getAppleAmount());
            fitnessPositionVOS.add(fitnessPositionVO);
            FitnessPositionVO fitnessPositionVO2 = new FitnessPositionVO();
            fitnessPositionVO2.setId(re.getId());
            fitnessPositionVO2.setName(re.getName());
            fitnessPositionVO2.setTypeName(re.getTypeName());
            fitnessPositionVO2.setTypeId(re.getTypeId());
            fitnessPositionVO2.setDifficulty("2");
            fitnessPositionVO2.setAmount(re.getAmount2());
            fitnessPositionVO2.setAppleAmount(re.getAppleAmount2());
            fitnessPositionVOS.add(fitnessPositionVO2);
            FitnessPositionVO fitnessPositionVO3 = new FitnessPositionVO();
            fitnessPositionVO3.setId(re.getId());
            fitnessPositionVO3.setName(re.getName());
            fitnessPositionVO3.setTypeName(re.getTypeName());
            fitnessPositionVO3.setTypeId(re.getTypeId());
            fitnessPositionVO3.setDifficulty("3");
            fitnessPositionVO3.setAmount(re.getAmount3());
            fitnessPositionVO3.setAppleAmount(re.getAppleAmount3());
            fitnessPositionVOS.add(fitnessPositionVO3);
            FitnessPositionVO fitnessPositionVO4 = new FitnessPositionVO();
            fitnessPositionVO4.setId(re.getId());
            fitnessPositionVO4.setName(re.getName());
            fitnessPositionVO4.setTypeName(re.getTypeName());
            fitnessPositionVO4.setTypeId(re.getTypeId());
            fitnessPositionVO4.setDifficulty("4");
            fitnessPositionVO4.setAmount(re.getAmount4());
            fitnessPositionVO4.setAppleAmount(re.getAppleAmount4());
            fitnessPositionVOS.add(fitnessPositionVO4);
            FitnessPositionVO fitnessPositionVO5 = new FitnessPositionVO();
            fitnessPositionVO5.setId(re.getId());
            fitnessPositionVO5.setName(re.getName());
            fitnessPositionVO5.setTypeName(re.getTypeName());
            fitnessPositionVO5.setTypeId(re.getTypeId());
            fitnessPositionVO5.setDifficulty("5");
            fitnessPositionVO5.setAmount(re.getAmount5());
            fitnessPositionVO5.setAppleAmount(re.getAppleAmount5());
            fitnessPositionVOS.add(fitnessPositionVO5);
        }
//        PageHelper.startPage(req.getPageNum(),req.getPageSize());
        PageInfo<FitnessPositionVO> info=new PageInfo<>(res);
        PageInfo<FitnessPositionVO> info=new PageInfo<>(fitnessPositionVOS);
        return ResultUtil.success(info);
    }
@@ -183,7 +251,6 @@
    @PostMapping("/addOrUpdatePosition")
    @ApiOperation(value = "健身部位添加/编辑", tags = {"健身部位管理"})
    public ResultUtil addCoupon(FitnessPosition fitnessPosition) {
        if (fitnessPosition.getId()==null){
            if (fitnessPosition.getName().equals("全身")){
                // 勾选的全身 判断这个类型是否已经有名为全身的部位了
@@ -271,7 +338,6 @@
        fitnessPosition.setIsDelete(1);
        fitnessTypeService.updateById(fitnessPosition);
        return ResultUtil.success("删除成功");
    }
    @ResponseBody
    @PostMapping("/deletePackage")
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/OssController.java
@@ -26,6 +26,7 @@
        String s = ObsUploadUtil.obsUpload(file);
        return s;
    }
    @PostMapping("/uploadVideo")
    @ApiOperation(value = "视频上传",tags = "文件上传")
    public String uploadVideo(@RequestParam("file") MultipartFile file) throws Exception {
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SysDeptController.java
@@ -72,7 +72,6 @@
    public List<Dept> tree() {
        List<ZTreeNode> tree = this.deptService.tree();
        tree.add(ZTreeNode.createParent());
   return     deptService.selectList(null);
//        return tree;
    }
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SysRoleController.java
@@ -54,7 +54,6 @@
    @ApiOperation(value = "列表", tags = {"后台-角色管理"})
    @ResponseBody
    public ResultUtil<PageInfo<Map>> list(DeptQuery req) {
//        PageHelper.startPage(req.getPageNum(),req.getPageSize());
        List<Map<String, Object>> roles = this.roleService.selectRoles(req.getDeptName());
        PageInfo<Map> info=new PageInfo<>(roles);
        return ResultUtil.success(info);
@@ -170,22 +169,22 @@
        Role role = roleService.selectById(roleId);
        return ResultUtil.success("分配成功");
    }
    private List<ZTreeNode> getParent(List<ZTreeNode> roleTreeListByUserId,List<ZTreeNode> parent){
        List<ZTreeNode> result = new ArrayList<>();
        for (ZTreeNode zTreeNode : parent) {
            List<ZTreeNode> children = roleTreeListByUserId.stream().filter(e -> e.getpId().equals(zTreeNode.getId())).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(children)){
                zTreeNode.setChildren(children);
            }else {
                getParent(roleTreeListByUserId,children);
            }
            ZTreeNode zTreeNode1 = new ZTreeNode();
            BeanUtils.copyProperties(zTreeNode,zTreeNode1);
            result.add(zTreeNode1);
        }
        return result;
    }
//    private List<ZTreeNode> getParent(List<ZTreeNode> roleTreeListByUserId,List<ZTreeNode> parent){
//        List<ZTreeNode> result = new ArrayList<>();
//        for (ZTreeNode zTreeNode : parent) {
//
//            List<ZTreeNode> children = roleTreeListByUserId.stream().filter(e -> e.getpId().equals(zTreeNode.getId())).collect(Collectors.toList());
//            if(CollectionUtils.isEmpty(children)){
//                zTreeNode.setChildren(children);
//            }else {
//                getParent(roleTreeListByUserId,children);
//            }
//            ZTreeNode zTreeNode1 = new ZTreeNode();
//            BeanUtils.copyProperties(zTreeNode,zTreeNode1);
//            result.add(zTreeNode1);
//        }
//        return result;
//    }
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/SystemController.java
@@ -106,7 +106,7 @@
    @ResponseBody
    @PostMapping("/agreement")
    @ApiOperation(value = "协议", tags = {"协议管理"})
    @ApiOperation(value = " ", tags = {"协议管理"})
    @ApiImplicitParams({
            @ApiImplicitParam(value = "类型1=用户协议 2=隐私协议 3=注销协议 4=关于我们", name = "type", required = true),
            @ApiImplicitParam(value = "内容(该字段不传的时候为查看,传了为修改)", name = "content"),
@@ -265,28 +265,28 @@
    })
    public ResultUtil addRedPackage(BigDecimal amount) {
        // 添加发放红包记录
        RedPackage redPackage = new RedPackage();
        redPackage.setAmount(amount);
        redPackage.setInsertUserId(Objects.requireNonNull(ShiroKit.getUser()).id);
        redPackage.setInsertTime(new Date());
        redPackageService.insert(redPackage);
        // 给每个用户的余额增加响应的金额
        List<AppUser> users = appUserService.selectList(new EntityWrapper<AppUser>()
                .eq("state", 1));
        for (AppUser user : users) {
            BigDecimal balance = user.getBalance();
            BigDecimal add = balance.add(amount);
            user.setBalance(add);
            appUserService.updateById(user);
            // 给用户发消息
            Message message = new Message();
            message.setUserId(user.getId());
            message.setType(1);
            message.setContent("系统发送红包¥"+amount+"到账至您的余额");
            message.setInsertTime(new Date());
            message.setIsRead(0);
            messageService.insert(message);
        }
//        RedPackage redPackage = new RedPackage();
//        redPackage.setAmount(amount);
//        redPackage.setInsertUserId(Objects.requireNonNull(ShiroKit.getUser()).id);
//        redPackage.setInsertTime(new Date());
//        redPackageService.insert(redPackage);
//        // 给每个用户的余额增加响应的金额
//        List<AppUser> users = appUserService.selectList(new EntityWrapper<AppUser>()
//                .eq("state", 1));
//        for (AppUser user : users) {
//            BigDecimal balance = user.getBalance();
//            BigDecimal add = balance.add(amount);
//            user.setBalance(add);
//            appUserService.updateById(user);
//            // 给用户发消息
//            Message message = new Message();
//            message.setUserId(user.getId());
//            message.setType(1);
//            message.setContent("系统发送红包¥"+amount+"到账至您的余额");
//            message.setInsertTime(new Date());
//            message.setIsRead(0);
//            messageService.insert(message);
//        }
        return ResultUtil.success("发放成功");
    }
}
guns-management/src/main/java/com/stylefeng/guns/modular/code/controller/UserController.java
@@ -3,13 +3,11 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stylefeng.guns.core.base.tips.ErrorTip;
import com.stylefeng.guns.core.common.annotion.BussinessLog;
import com.stylefeng.guns.core.common.constant.Const;
import com.stylefeng.guns.core.common.constant.dictmap.UserDict;
import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
import com.stylefeng.guns.core.exception.GunsException;
import com.stylefeng.guns.core.log.LogManager;
@@ -24,7 +22,6 @@
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.UserMapper;
import com.stylefeng.guns.modular.system.dto.TreeBean;
import com.stylefeng.guns.modular.system.factory.UserFactory;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.transfer.UserDto;
@@ -40,19 +37,16 @@
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import sun.security.util.Password;
import javax.naming.NoPermissionException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.xml.crypto.Data;
import java.util.*;
import static com.stylefeng.guns.core.support.HttpKit.getIp;
@@ -305,7 +299,6 @@
        ShiroKit.getSession().setAttribute("sessionFlag", true);
        System.out.println(ShiroKit.getUser().getName());
        List<TreeBean> root = new ArrayList<>();
guns-management/src/main/java/com/stylefeng/guns/modular/system/controller/LoginLogController.java
@@ -4,8 +4,6 @@
import com.baomidou.mybatisplus.plugins.Page;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.common.annotion.BussinessLog;
import com.stylefeng.guns.core.common.annotion.Permission;
import com.stylefeng.guns.core.common.constant.Const;
import com.stylefeng.guns.core.common.constant.factory.PageFactory;
import com.stylefeng.guns.core.mutidatasource.annotion.DataSource;
import com.stylefeng.guns.modular.system.model.LoginLog;
guns-management/src/main/java/com/stylefeng/guns/modular/system/dao/AppUserMapper.java
@@ -6,6 +6,7 @@
import com.stylefeng.guns.modular.system.model.AppUser;
import com.stylefeng.guns.modular.system.vo.InviteUserVO;
import com.stylefeng.guns.modular.system.vo.TeamDetailVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
guns-management/src/main/java/com/stylefeng/guns/modular/system/model/FitnessPosition.java
@@ -44,10 +44,39 @@
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格")
    @ApiModelProperty(value = "基础价格H1")
    private BigDecimal amount;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H2")
    private BigDecimal amount2;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H3")
    private BigDecimal amount3;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H4")
    private BigDecimal amount4;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H5")
    private BigDecimal amount5;
    @ApiModelProperty(value = "ios用 苹果价格H1")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "ios用 苹果价格H2")
    private BigDecimal appleAmount2;
    @ApiModelProperty(value = "ios用 苹果价格H3")
    private BigDecimal appleAmount3;
    @ApiModelProperty(value = "ios用 苹果价格H4")
    private BigDecimal appleAmount4;
    @ApiModelProperty(value = "ios用 苹果价格H5")
    private BigDecimal appleAmount5;
    public Integer getId() {
        return id;
guns-management/src/main/java/com/stylefeng/guns/modular/system/model/Package.java
@@ -51,7 +51,13 @@
     */
    @ApiModelProperty(value = "套餐价")
    private BigDecimal price;
    /**
     * 优惠价
     */
    @ApiModelProperty(value = "ios用 苹果的价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "选择部位的难度 和部位ids一一对应")
    private String difficulty;
    public Integer getId() {
        return id;
guns-management/src/main/java/com/stylefeng/guns/modular/system/util/ObsUploadUtil.java
@@ -16,6 +16,7 @@
    public static String accessKeySecret = "CustHR4B9XKdT7hGcEYEpV9UVUoc4pmUhnHckU9h";
    public static String bucketName = "jkjianshen";
    public static String oss_domain = "https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/";
//    public static String oss_domain = "http://cdn.jkcyl.cn/";
    // 创建ObsClient实例
    public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
@@ -27,7 +28,14 @@
            ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
            meta.setContentLength(file.getSize());  // 必须设置ContentLength
            String originalFilename = file.getOriginalFilename();
            if (originalFilename.contains("apk")){
                fileName = "bf2fe5c5499341e5bc0d56c0c7d5fb2e.apk";
                System.err.println("apk");
            }else{
            fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
            }
            obsClient.putObject(bucketName,"admin/"+fileName,content,meta);// 上传Object.
            if(fileName != null && !"".equals(fileName)){
                System.out.println(fileName);
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/FitnessPositionVO.java
@@ -27,8 +27,44 @@
    private String typeName;
    @ApiModelProperty(value = "所属类型id")
    private Integer typeId;
    @ApiModelProperty(value = "基础价格")
    @ApiModelProperty(value = "难度 H1 H2。。。")
    private String difficulty;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H1")
    private BigDecimal amount;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H2")
    private BigDecimal amount2;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H3")
    private BigDecimal amount3;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H4")
    private BigDecimal amount4;
    /**
     * 基础价格
     */
    @ApiModelProperty(value = "基础价格H5")
    private BigDecimal amount5;
    @ApiModelProperty(value = "ios用 苹果价格H1")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "ios用 苹果价格H2")
    private BigDecimal appleAmount2;
    @ApiModelProperty(value = "ios用 苹果价格H3")
    private BigDecimal appleAmount3;
    @ApiModelProperty(value = "ios用 苹果价格H4")
    private BigDecimal appleAmount4;
    @ApiModelProperty(value = "ios用 苹果价格H5")
    private BigDecimal appleAmount5;
    @Override
    protected Serializable pkVal() {
        return null;
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/OrderListVO.java
@@ -3,7 +3,7 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import sun.awt.image.BufferedImageGraphicsConfig;
import java.math.BigDecimal;
import java.util.Date;
guns-management/src/main/java/com/stylefeng/guns/modular/system/vo/PackageDetailVO.java
@@ -30,6 +30,8 @@
    private BigDecimal amount;
    @ApiModelProperty(value = "套餐价格")
    private BigDecimal price;
    @ApiModelProperty(value = "ios用 苹果的价格")
    private BigDecimal appleAmount;
    @ApiModelProperty(value = "选择类型")
    private List<FitnessPositionVO> types;