Bläddra i källkod

系统邮箱;车票验证码;token;预发布环境

zoujiajian 2 år sedan
förälder
incheckning
e9c15dc0a8
44 ändrade filer med 1331 tillägg och 118 borttagningar
  1. 5 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 16 0
      netflix-common/src/main/java/com/cyksj/common/util/StringUtil.java
  3. 64 0
      netflix-common/src/main/java/com/cyksj/common/util/TicketCodeCommonUtil.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationLoginCodeRecordMapper.java
  5. 17 0
      netflix-dao/src/main/java/com/cyksj/mapper/sys/SysEmailMapper.java
  6. 44 0
      netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailDetailDto.java
  7. 38 0
      netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailDto.java
  8. 31 0
      netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailResultDto.java
  9. 24 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelationLoginCodeRecord.java
  10. 26 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SysEmail.java
  11. 13 0
      netflix-dao/src/main/resources/mapper/SysEmailMapper.xml
  12. 2 2
      netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java
  13. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  14. 15 0
      netflix-service/src/main/java/com/cyksj/service/mail/CuiQiuMailService.java
  15. 166 0
      netflix-service/src/main/java/com/cyksj/service/mail/impl/CuiQiuMailServiceImpl.java
  16. 3 0
      netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java
  17. 50 0
      netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
  18. 6 1
      netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java
  19. 27 0
      netflix-service/src/main/java/com/cyksj/service/relation/GroupsRelationNetflixService.java
  20. 131 3
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  21. 168 0
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupsRelationNetflixServiceImpl.java
  22. 2 2
      netflix-web/src/main/java/com/cyksj/aspect/LogAspect.java
  23. 4 2
      netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java
  24. 9 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  25. 7 7
      netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java
  26. 2 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  27. 0 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  28. 60 13
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
  29. 0 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java
  30. 24 10
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java
  31. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java
  32. 7 13
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  33. 0 4
      netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java
  34. 0 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  35. 2 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java
  36. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java
  37. 0 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java
  38. 0 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java
  39. 0 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java
  40. 0 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java
  41. 0 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  42. 4 9
      netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/WorkOrderController.java
  43. 327 0
      netflix-web/src/main/java/com/cyksj/web/util/StpAbroadUtil.java
  44. 19 15
      netflix-web/src/main/resources/application-pre.yml

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -146,4 +146,9 @@ public interface Constant {
 	 * 新科手机号
 	 */
 	String XK_PHONE = "17681947535";
+
+	/**
+	 * 电影域名
+	 */
+	String ZHAOJU_MOVIES = "https://zhaoju666.com";
 }

+ 16 - 0
netflix-common/src/main/java/com/cyksj/common/util/StringUtil.java

@@ -11,6 +11,8 @@ import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author  chan 字符串操作辅助类
@@ -491,4 +493,18 @@ public final class StringUtil {
 
 		return "unknown";
 	}
+
+	/**
+	 * 获取账号登录验证码
+	 */
+	public static String getVerifyCodePattern(String code, Integer length) {
+		if (StrUtil.isNotEmpty(code)) {
+			Pattern pattern = Pattern.compile(String.format("\\d{%s,}", length));
+			Matcher matcher = pattern.matcher(code);
+			while (matcher.find()) {
+				return matcher.group();
+			}
+		}
+		return StrUtil.EMPTY;
+	}
 }

+ 64 - 0
netflix-common/src/main/java/com/cyksj/common/util/TicketCodeCommonUtil.java

@@ -0,0 +1,64 @@
+package com.cyksj.common.util;
+
+import cn.hutool.core.util.StrUtil;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: TicketCodeCommonUtil
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 15:31
+ */
+
+public class TicketCodeCommonUtil {
+	/**
+	 * 车票邮箱验证码
+	 */
+	public static String getTicketCodeStr(String body, Long goodsId) {
+		if (StrUtil.isEmpty(body)) {
+			return body;
+		}
+		String str = null;
+		if (goodsId == 33l) {
+			str = "color:#505050; font-family:adobe-clean, Helvetica Neue, Helvetica, Verdana, Arial, sans-serif;";
+		}
+		if (goodsId == 3l) {
+			str = "letter-spacing:4px; line-height:38px; mso-line-height-rule: exactly";
+		}
+		if (StrUtil.isEmpty(str)) {
+			return str;
+		}
+		int index = body.indexOf(str);
+		if (index == -1) {
+			if (goodsId == 33l) {
+				str = "X-Report-Abuse: abuse@adobe.com";
+			}
+			if (goodsId == 3l) {
+				str = "Noto Sans Display', Helvetica, Arial, sans-serif; font-weight: 600;text-align: center;";
+			}
+			index = body.indexOf(str);
+		}
+		String code = StrUtil.subWithLength(body, index, 512);
+		if (StrUtil.isNotBlank(code)) {
+			code = code.replace(str, "");
+		}
+		return code;
+	}
+
+	public static String extractUrl(String body, String prefixUrl) {
+		String urlPattern = "(https?://\\S+)";
+		Pattern pattern = Pattern.compile(urlPattern);
+		Matcher matcher = pattern.matcher(body);
+
+		// 查找匹配的URL
+		while (matcher.find()) {
+			String url = matcher.group();
+			if (url.contains(prefixUrl)) {
+				return url.replaceAll("\"", "");
+			}
+		}
+		return null;
+	}
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationLoginCodeRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GroupsRelationLoginCodeRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GroupsRelationLoginCodeRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/12/4 11:07
+ */
+public interface GroupsRelationLoginCodeRecordMapper extends BaseMapper<GroupsRelationLoginCodeRecord> {
+}

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/sys/SysEmailMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper.sys;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SysEmail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: SysEmailMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/11/14 16:19
+ */
+public interface SysEmailMapper extends BaseMapper<SysEmail> {
+	void batchInsert(@Param("list") List<SysEmail> data);
+}

+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailDetailDto.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CuiQiuEmailDetailDto
+ * 创建者: JavaZou
+ * 创建时间:2024/4/25 16:52
+ */
+@Getter
+@Setter
+public class CuiQiuEmailDetailDto {
+	private Integer code;
+
+	private String msg;
+
+	private ResultData data;
+
+	@Getter
+	@Setter
+	public static class ResultData{
+		private Content content;
+	}
+
+	@Getter
+	@Setter
+	public static class Content {
+		private Integer id;
+
+		private String time;
+
+		private String subject;
+
+		private List<CuiQiuEmailDto.CuiQiuUser> from;
+
+		private List<CuiQiuEmailDto.CuiQiuUser> to;
+
+		private String body;
+	}
+}

+ 38 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailDto.java

@@ -0,0 +1,38 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CuiQiuEmailDto
+ * 创建者: JavaZou
+ * 创建时间:2024/4/25 16:35
+ */
+
+@Getter
+@Setter
+public class CuiQiuEmailDto {
+
+	private Long id;
+
+	private String time;
+
+	private Long timestamp;
+
+	private String subject;
+
+	private List<CuiQiuUser> from;
+
+	private List<CuiQiuUser> to;
+
+	@Getter
+	@Setter
+	public static class CuiQiuUser{
+		private String name;
+
+		private String address;
+	}
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CuiQiuEmailResultDto.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CuiQiuEmailResultDto
+ * 创建者: JavaZou
+ * 创建时间:2024/4/25 16:42
+ */
+@Getter
+@Setter
+public class CuiQiuEmailResultDto {
+	private Integer code;
+
+	private String msg;
+
+	private ResultData data;
+
+	@Getter
+	@Setter
+	public static class ResultData {
+		private Integer total;
+
+		private List<CuiQiuEmailDto> list;
+	}
+
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelationLoginCodeRecord.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GroupsRelationLoginCodeRecord
+ * 创建者: JavaZou
+ * 创建时间:2023/12/4 11:06
+ */
+@Getter
+@Setter
+public class GroupsRelationLoginCodeRecord extends BaseEntity{
+	private Long userId;
+
+	private Long skuId;
+
+	private Long relationId;
+
+	private Long goodsId;
+
+	private String account;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SysEmail.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: SysEmail
+ * 创建者: JavaZou
+ * 创建时间:2023/11/14 16:18
+ */
+@Getter
+@Setter
+public class SysEmail extends BaseEntity{
+	@NotEmpty
+	private String email;
+
+	@NotEmpty
+	private String password;
+
+	@TableLogic(value = "1", delval = "0")
+	private Boolean deleted;
+}

+ 13 - 0
netflix-dao/src/main/resources/mapper/SysEmailMapper.xml

@@ -0,0 +1,13 @@
+<?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.cyksj.mapper.sys.SysEmailMapper">
+
+    <insert id="batchInsert">
+        insert ignore into sys_email(`email`,`password`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.email},#{item.password},now(),now())
+        </foreach>
+    </insert>
+</mapper>

+ 2 - 2
netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java

@@ -38,7 +38,7 @@ public class EnvCommonService {
 		return domain;
 	}
 	public String getPort() {
-		return port = EnvCommonService.active_prd.equals(getEnv()) ? "8081" : "8083";
+		return port = EnvCommonService.active_prd.equals(getEnv()) ? "8081" : EnvCommonService.active.equals(getEnv()) ? "8083" : "8085";
 	}
 
 	public String getApi() {
@@ -64,4 +64,4 @@ public class EnvCommonService {
 		}
 		DISTRIBUTE_DEFAULT_URL_PREFIX += "%s";
 	}
-}
+}

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -632,6 +632,7 @@ public class RedisService {
         USER_BIND_ACCOUNT_INFO_KEY("user_bind_account_info_key:", "用户绑定其他账号key", 10l),
         TASK_RECEIVED_KEY("task_received_key:%s:%s", "领取任务奖励key", 10l),
         EXCHANGE_RATE_KEY("exchange_rate_key","当日汇率",60 * 60 * 4L),
+        NETFLIX_SET_LIMIT_TIME("netflix_set_limit_time", "奈飞设置限制", 30l),
         ;
 
         private String name;

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/mail/CuiQiuMailService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.mail;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CuiQiuMailService
+ * 创建者: JavaZou
+ * 创建时间:2024/4/25 15:55
+ */
+public interface CuiQiuMailService {
+
+	/**
+	 * 获取最新邮箱 返回验证码
+	 */
+	String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync) throws Exception;
+}

+ 166 - 0
netflix-service/src/main/java/com/cyksj/service/mail/impl/CuiQiuMailServiceImpl.java

@@ -0,0 +1,166 @@
+package com.cyksj.service.mail.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.common.util.TicketCodeCommonUtil;
+import com.cyksj.model.dto.CuiQiuEmailDetailDto;
+import com.cyksj.model.dto.CuiQiuEmailDto;
+import com.cyksj.model.dto.CuiQiuEmailResultDto;
+import com.cyksj.service.mail.CuiQiuMailService;
+import com.cyksj.service.relation.GroupsRelationNetflixService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CuiQiuMailServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/4/25 15:57
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CuiQiuMailServiceImpl implements CuiQiuMailService {
+	private final GroupsRelationNetflixService groupsRelationNetflix;
+
+	private final static String CUI_QIU_TOKEN = "4ff0341ebf1747cd89a2d1a5a296b68b";
+
+	//脆球域名id
+	private final static String DOMAIN_ID = "1696913058045050661";
+
+	//代收管理员邮件id
+	private final static String ADMIN_MAIL_ID = "1696913058063659217";
+
+	//PS 验证码官方
+	private final static String PS_ADOBE = "Adobe";
+
+	private final static String DISNEY = "Disney+";
+
+	private final static String NETFLIX = "Netflix";
+
+	@Override
+	public String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync) throws Exception {
+		//获取近二十封邮件
+		String url = "https://domain-open-api.cuiqiu.com/v1/message/list";
+
+		Map<String, Object> params = new HashMap<>();
+
+		//获取近五分钟的代收邮件
+		//维度是天
+		DateTime now = DateTime.now();
+		params.put("token", CUI_QIU_TOKEN);
+		params.put("mail_id", ADMIN_MAIL_ID);
+		params.put("start_time", DateUtil.offsetDay(now, -1).toDateStr());
+		params.put("end_time", DateUtil.offsetDay(now, 1).toDateStr());
+		params.put("to", email);
+		params.put("limit", 20);
+
+		HttpRequest post = HttpUtil.createPost(url);
+		post.form(params);
+		HttpResponse execute = post.execute();
+		CuiQiuEmailResultDto resultDto = Jsons.parseObject(execute.body(), CuiQiuEmailResultDto.class);
+		if (resultDto.getData().getList() == null) {
+			return null;
+		}
+		List<CuiQiuEmailDto> list = resultDto.getData().getList();
+		//获取邮箱对应的邮件
+		list = list.stream().filter(emailInfo -> {
+			CuiQiuEmailDto.CuiQiuUser from = emailInfo.getFrom().get(0);
+			CuiQiuEmailDto.CuiQiuUser cuiQiuUser = emailInfo.getTo().get(0);
+			if (StrUtil.equalsIgnoreCase(cuiQiuUser.getAddress(), email)) {
+				//PS
+				if (goodsId == 33l && StrUtil.equals(from.getName(), PS_ADOBE)) {
+					return true;
+				}
+				//Disney
+				if (goodsId == 3l && StrUtil.equals(from.getName(), DISNEY)) {
+					return true;
+				}
+				if (goodsId == 1l && StrUtil.equals(from.getName(), NETFLIX)) {
+					return true;
+				}
+			}
+			return false;
+		}).collect(Collectors.toList());
+
+		if (CollUtil.isNotEmpty(list)) {
+			for (CuiQiuEmailDto cuiQiuEmailDto : list) {
+				Long messageId = cuiQiuEmailDto.getId();
+				try {
+					String code = getVerifyCodeByEmail(messageId, goodsId, type, sync);
+					if (StrUtil.isNotBlank(code)) {
+						return code;
+					}
+				} catch (Exception e) {
+				}
+			}
+		}
+		return null;
+	}
+
+	public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Boolean sync) throws Exception {
+		String url = "https://domain-open-api.cuiqiu.com/v1/message/detail";
+		Map<String, Object> params = new HashMap<>();
+		params.put("token", CUI_QIU_TOKEN);
+		params.put("mail_id", ADMIN_MAIL_ID);
+		params.put("message_id", messageId);
+		HttpRequest post = HttpUtil.createPost(url);
+		post.form(params);
+		HttpResponse execute = post.execute();
+		String respBody = execute.body();
+		CuiQiuEmailDetailDto cuiQiuEmailDetailDto = Jsons.parseObject(respBody, CuiQiuEmailDetailDto.class);
+		CuiQiuEmailDetailDto.Content content = cuiQiuEmailDetailDto.getData().getContent();
+		String code = null;
+		String body = content.getBody();
+		if (goodsId == 1) {
+			if (type != null && type == 1) {
+				String pre = "NetflixSans-Regular, Helvetica, Roboto, Segoe UI, sans-serif; font-weight";
+				if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录")) {
+					code = StrUtil.subAfter(body, pre, false);
+				}
+				if (StrUtil.isEmpty(code)) {
+					throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
+				}
+			} else {
+				String urlPref = "https://www.netflix.com/account/update-primary-location";
+				String nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
+				if (StrUtil.isEmpty(nfVerifyUrl)) {
+					urlPref = "https://www.netflix.com/account/travel/verify";
+					nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
+					if (StrUtil.isEmpty(nfVerifyUrl)) {
+						throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
+					}
+				}
+				//非点击装置同步更新按钮 直接返回链接
+				if (!sync) return nfVerifyUrl;
+				//失败返回验证链接
+				if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
+					return nfVerifyUrl;
+				}
+				return StrUtil.EMPTY;
+			}
+		}
+		if (StrUtil.isEmpty(code)) {
+			code = TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
+		}
+		int length = 4;
+		if (goodsId == 33l) {
+			length = 6;
+		}
+		return StringUtil.getVerifyCodePattern(code, length);
+	}
+}

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java

@@ -8,6 +8,7 @@ import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.views.CmsUserVO;
 import com.cyksj.model.views.ExpiredAccountDataView;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Date;
 import java.util.List;
@@ -48,4 +49,6 @@ public interface CmsAccountService extends IService<Account> {
 	 * 解析ChatGpt美区APPID账号
 	 */
 	void analysisAmericaAppidAccount(Long goodsId, Long skuId, List<Object> accountList);
+
+	void readFileAndImportEmail(MultipartFile file) throws Exception;
 }

+ 50 - 0
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -2,6 +2,7 @@ package com.cyksj.service.mange.account;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -14,6 +15,7 @@ import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.AccountUpdatePasswordRecordMapper;
 import com.cyksj.mapper.manage.AutoUpdateAccountPwdLogMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.manage.views.AccountView;
@@ -31,7 +33,11 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.*;
 
 /**
@@ -58,6 +64,8 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 
 	private final SysConfigService sysConfigService;
 
+	private final SysEmailMapper sysEmailMapper;
+
 	@Override
 	public IPage<ExpiredAccountDataView> getExpiredAccountView(Boolean isCorpWx, String customerService, Long goodsId, Long skuId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit) {
 		return accountMapper.getExpiredAccountView(isCorpWx, customerService, goodsId, skuId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
@@ -181,6 +189,48 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		insertAccount(goodsId, skuId, accountList);
 	}
 
+	@Override
+	public void readFileAndImportEmail(MultipartFile file) throws Exception {
+		InputStream in = null;
+		BufferedReader br = null;
+		String regex = "----";
+		List<SysEmail> sysEmails = new ArrayList<>();
+		List<String> error = new ArrayList<>();
+		try {
+			in = file.getInputStream();
+			br = new BufferedReader(new InputStreamReader(file.getInputStream()));
+			String content = null;
+			while ((content = br.readLine()) != null) {
+				String[] split = content.split(regex);
+				if (split.length > 1) {
+					String email = split[0];
+					String password = split[1];
+					if (!StrUtil.hasEmpty(email, password)) {
+						SysEmail sysEmail = new SysEmail();
+						sysEmail.setEmail(email);
+						sysEmail.setPassword(password);
+						sysEmails.add(sysEmail);
+					}
+				}else {
+					error.add(split[0]);
+				}
+			}
+			if (CollUtil.isNotEmpty(sysEmails)) {
+				Lists.partition(sysEmails, 1000).forEach(data -> {
+					sysEmailMapper.batchInsert(data);
+				});
+			}
+		} finally {
+			if (br != null) {
+				br.close();
+			}
+			if (in != null) {
+				in.close();
+			}
+		}
+		System.out.println(Jsons.toJson(error));
+	}
+
 	/**
 	 *
 	 * @param goodsId

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -1,6 +1,5 @@
 package com.cyksj.service.relation;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.views.RenewalView;
@@ -22,4 +21,10 @@ public interface GroupRelationFrontService {
 	GroupsRelation getSimilarExpiredGroupRelation(Long skuId, Integer days, Integer months, List<Long> errorsRelationIds);
 
 	Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(Boolean isPayNf, List<Long> filter_goods_id, Integer start, Integer limit);
+
+	/**
+	 * 获取车票账号登录 验证码
+	 */
+	String getAiVerifyCode(Long userId, Long relationId, Integer type, Boolean sync) throws Exception;
+
 }

+ 27 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupsRelationNetflixService.java

@@ -0,0 +1,27 @@
+package com.cyksj.service.relation;
+
+import cn.hutool.json.JSONObject;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GroupsRelationNetflixService
+ * 创建者: JavaZou
+ * 创建时间:2024/6/17 15:44
+ */
+public interface GroupsRelationNetflixService {
+
+	JSONObject setNetflixSeatNum(Integer seatNum, String seatName, String account, String password, Date expiryTime, String code);
+
+	JSONObject setNetflixPin(Long relationId, long userId, String code);
+
+	Integer getPinStatus(String taskId) throws Exception;
+
+	Boolean confirmUpdate(String nfUrl);
+
+	/**
+	 * 定时设置奈飞座位号
+	 */
+	void timingSetNetflix(Integer num, String nickname, String account, String password, Date expiryTime);
+}

+ 131 - 3
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -3,21 +3,29 @@ package com.cyksj.service.relation.impl;
 import cn.hutool.core.date.BetweenFormater;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpStatus;
+import cn.hutool.http.HttpUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.common.util.TicketCodeCommonUtil;
 import com.cyksj.enums.GatewayApiCode;
+import com.cyksj.mapper.GroupsRelationLoginCodeRecordMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.UserMapper;
-import com.cyksj.model.entity.CouponUser;
-import com.cyksj.model.entity.GroupsRelation;
-import com.cyksj.model.entity.User;
+import com.cyksj.mapper.sys.SysEmailMapper;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
+import com.cyksj.service.mail.CuiQiuMailService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.relation.GroupRelationFrontService;
+import com.cyksj.service.relation.GroupsRelationNetflixService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
@@ -27,7 +35,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /*
@@ -54,6 +64,17 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final RedisService redisService;
 
+	private final SysEmailMapper sysEmailMapper;
+
+	private final CuiQiuMailService cuiQiuMailService;
+
+	private final GroupsRelationLoginCodeRecordMapper groupsRelationLoginCodeRecordMapper;
+
+	private final GroupsRelationNetflixService groupsRelationNetflixService;
+
+	//脆球邮箱后缀
+	private final static String CUI_QIU_EMAIL_SUFFIX = "@kindvd.com";
+
 	@Override
 	public List<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize) {
 		User u = userMapper.selectById(userId);
@@ -186,4 +207,111 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 	public Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(Boolean isPayNf, List<Long> filter_goods_id, Integer start, Integer limit) {
 		return groupsRelationMapper.getRecommendGoodsViews(new Page<>(start, limit),filter_goods_id, isPayNf);
 	}
+
+	@Override
+	public String getAiVerifyCode(Long userId, Long relationId, Integer type, Boolean sync) throws Exception {
+		List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder().field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
+				.field(RenewalView::getRelationId, relationId).build());
+		if (renewalView == null) {
+			throw BusinessRuntimeException.getInstance("您的车票不存在...");
+		}
+		if (StrUtil.isEmpty(renewalView.getAccount())) {
+			throw BusinessRuntimeException.getInstance("车票未配置账号");
+		}
+		String account = renewalView.getAccount();
+		String password = renewalView.getPassword();
+		if (StrUtil.hasEmpty(account, password)) {
+			throw BusinessRuntimeException.getInstance("您的车票账号密码异常,请联系客服...");
+		}
+		if (renewalView.getAccount().contains(CUI_QIU_EMAIL_SUFFIX)) {
+			return cuiQiuMailService.getVerifyCode(renewalView.getAccount(), renewalView.getGoodsId(), type, sync);
+		}
+		//获取邮箱密码
+		SysEmail sysEmail = sysEmailMapper.selectOne(Wrappers.lambdaQuery(SysEmail.class)
+				.eq(SysEmail::getEmail, account)
+				.last("limit 1"));
+		if (sysEmail == null) {
+			log.info("获取账号:{}验证码异常,未配置对应系统邮箱", account);
+			throw BusinessRuntimeException.getInstance("获取账号验证码异常,请联系客服...");
+		}
+		String url = "http://yinhelx.com/api/controller.php";
+		Map<String, Object> params = new HashMap<>();
+
+		params.put("imap_key", "imap_56568niua@@");
+		params.put("fun", "imap_read");
+		params.put("imap_ip", "yinhelx.com");
+		params.put("port", "143");
+		params.put("username", account);
+		params.put("password", sysEmail.getPassword());
+		params.put("mbox_id", "0");
+		params.put("delete", "0");
+
+		HttpRequest post = HttpUtil.createPost(url);
+		post.form(params);
+		cn.hutool.http.HttpResponse execute = post.execute();
+		if (execute.getStatus() != HttpStatus.HTTP_OK) {
+			throw BusinessRuntimeException.getInstance("获取验证码异常,请联系客服...");
+		}
+		String code = getDifferentGoodsCode(renewalView.getGoodsId(), execute.body(), type, sync);
+		GroupsRelationLoginCodeRecord record = new GroupsRelationLoginCodeRecord();
+		record.setUserId(userId);
+		record.setRelationId(relationId);
+		record.setAccount(renewalView.getAccount());
+		record.setGoodsId(renewalView.getGoodsId());
+		record.setSkuId(renewalView.getSkuId());
+		groupsRelationLoginCodeRecordMapper.insert(record);
+		return code;
+	}
+
+
+	public String getDifferentGoodsCode(Long goodsId, String body, Integer type, Boolean sync) {
+		String code = null;
+		//奈飞
+		if (goodsId == 1) {
+			if (type != null && type == 1) {
+				if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录")) {
+					code = StrUtil.subBetween(body, "輸入此代碼登入", "請在裝置上輸入上");
+					if (StrUtil.isEmpty(code)) {
+						code = StrUtil.subAfter(body, "输入此代码登录", true);
+					}
+				}
+				if (StrUtil.isEmpty(code)) {
+					throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
+				}
+			} else {
+				String urlPref = "https://www.netflix.com/account/update-primary-location";
+				code = StrUtil.subBetween(body, "[" + urlPref, "]");
+				if (StrUtil.isEmpty(code)) {
+					urlPref = "https://www.netflix.com/account/travel/verify";
+					code = StrUtil.subBetween(body, "[" + urlPref, "]");
+					if (StrUtil.isEmpty(code)) {
+						throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
+					}
+				}
+				String url = urlPref + code;
+				//非点击装置同步更新按钮 直接返回链接
+				if (!sync) return url;
+				//失败返回验证链接
+				if (!groupsRelationNetflixService.confirmUpdate(url)) {
+					return url;
+				}
+				return StrUtil.EMPTY;
+			}
+		}
+		//除奈飞
+		if (StrUtil.isEmpty(code)) {
+			code = TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
+		}
+		int length = 4;
+		if (goodsId == 33l) {
+			length = 6;
+		}
+		code = StringUtil.getVerifyCodePattern(code, length);
+		if (!Validator.isNumber(code)) {
+			log.error("获取账号验证码失败:{}", StrUtil.subSufByLength(code, 512));
+			throw BusinessRuntimeException.getInstance("获取验证码失败,请重新获取..");
+		}
+		return code.trim();
+	}
 }

+ 168 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupsRelationNetflixServiceImpl.java

@@ -0,0 +1,168 @@
+package com.cyksj.service.relation.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.IoKit;
+import com.cyksj.common.util.J11HttpC;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.AccountMapper;
+import com.cyksj.mapper.GroupsMapper;
+import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.entity.Account;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.entity.GroupsTrips;
+import com.cyksj.model.entity.User;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.relation.GroupsRelationNetflixService;
+import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.task.JobManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GroupsRelationNetflixServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/6/17 15:45
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class GroupsRelationNetflixServiceImpl implements GroupsRelationNetflixService {
+	private final UserMapper userMapper;
+
+	private final GroupsRelationMapper relationMapper;
+
+	private final GroupsMapper groupsMapper;
+
+	private final AccountMapper accountMapper;
+
+	private final UserBindRelationService userBindRelationService;
+
+	private final RedisService redisService;
+
+	private final JobManager jobManager;
+
+	@Override
+	public JSONObject setNetflixSeatNum(Integer seatNum, String seatName, String account, String password, Date expiryTime, String code) {
+		JSONObject params = new JSONObject();
+		params.putOpt("username", account);
+		params.putOpt("password", password);
+		params.putOpt("seat_name", seatName);
+		params.putOpt("seat_num", seatNum);
+		params.putOpt("seat_time", expiryTime);
+		if (StrUtil.isNotBlank(code)) {
+			params.putOpt("pin_code", code);
+		}
+		//设置座位
+		String url = Constant.ZHAOJU_MOVIES + "/netflix_set/netflix_seat";
+		log.info("设置账号:{} 奈飞用户:{}座位信息", account, seatName);
+		try {
+			HttpResponse<String> res =
+					J11HttpC.custom()
+							.ofPost()
+							.url(url)
+							.headers(J11HttpC.ReqType.raw_json)
+							.body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(params), IoKit.Charsets.UTF_8.getCharset()))
+							.send(HttpResponse.BodyHandlers.ofString());
+			String body = res.body();
+			JSONObject jsonObject = Jsons.parseObject(body, JSONObject.class);
+			JSONObject data = Jsons.parseObject(jsonObject.get("data"), JSONObject.class);
+			Integer status = data.getInt("status");
+			if (status == 2) {
+				log.error("设置用户:{}奈飞座位号失败", seatName);
+			}
+			return data;
+		} catch (Exception e) {
+			log.error("设置用户:{}奈飞座位号错误,msg:{}", seatName, StringUtil.getErrorText(e));
+		}
+		JSONObject jsonObject = new JSONObject();
+		jsonObject.putOpt("status", 2);
+		return jsonObject;
+	}
+
+	@Override
+	public JSONObject setNetflixPin(Long relationId, long userId, String code) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		GroupsRelation relation = relationMapper.selectById(relationId);
+		if (!userIdList.contains(relation.getUserId())) {
+			throw BusinessRuntimeException.getInstance("您车票已失效");
+		}
+		GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+		Account account = accountMapper.selectById(groupsTrips.getAccountId());
+		if (account.getGoodsId() != 1) {
+			throw BusinessRuntimeException.getInstance("系统错误");
+		}
+		User user = userMapper.selectById(relation.getUserId());
+		return setNetflixSeatNum(relation.getNum(), user.getNickname(), account.getAccount(), account.getPassword(), relation.getExpiryTime(), code);
+	}
+
+	@Override
+	public Integer getPinStatus(String taskId) throws Exception {
+		JSONObject params = new JSONObject();
+		params.putOpt("transId", taskId);
+		//查询任务状态
+		String url = Constant.ZHAOJU_MOVIES + "/netflix_set/netflix_task_status";
+		HttpResponse<String> res =
+				J11HttpC.custom()
+						.ofPost()
+						.url(url)
+						.headers(J11HttpC.ReqType.raw_json)
+						.body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(params), IoKit.Charsets.UTF_8.getCharset()))
+						.send(HttpResponse.BodyHandlers.ofString());
+		String body = res.body();
+		JSONObject jsonObject = Jsons.parseObject(body, JSONObject.class);
+		JSONObject data = Jsons.parseObject(jsonObject.get("data"), JSONObject.class);
+		Integer status = data.getInt("status");
+		return status;
+	}
+
+	@Override
+	public Boolean confirmUpdate(String nfUrl) {
+		JSONObject params = new JSONObject();
+		params.putOpt("url", nfUrl);
+		//确认更新点击
+		String url = Constant.ZHAOJU_MOVIES + "/netflix_set/netflix_primary_action";
+		try {
+			cn.hutool.http.HttpResponse execute = HttpUtil
+					.createPost(url)
+					.body(params.toString(), "application/json")
+					.setConnectionTimeout(30000)
+					.setReadTimeout(30000)
+					.execute();
+			JSONObject resp = Jsons.parseObject(execute.body(), JSONObject.class);
+			return resp.getBool("success");
+		} catch (Exception e) {
+		}
+		return false;
+	}
+
+	/**
+	 * 定时设置座位号
+	 * 30s执行一次
+	 */
+	@Override
+	public void timingSetNetflix(Integer num, String nickname, String account, String password, Date expiryTime) {
+		String key = RedisService.key.NETFLIX_SET_LIMIT_TIME.getName();
+		if (!redisService.setNx(key, 1L, 30L)) {
+			jobManager.addJob(30001, () -> {
+				timingSetNetflix(num, nickname, account, password, expiryTime);
+			});
+		} else {
+			setNetflixSeatNum(num, nickname, account, password, expiryTime, null);
+			log.info("当前时间:{}开始调用设置奈飞座位信息接口", DateTime.now());
+		}
+	}
+}

+ 2 - 2
netflix-web/src/main/java/com/cyksj/aspect/LogAspect.java

@@ -1,6 +1,6 @@
 package com.cyksj.aspect;
 
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.servlet.ServletUtil;
@@ -68,7 +68,7 @@ public class LogAspect {
 	private void handleLog(JoinPoint joinPoint, Log controllerLog, Exception e, Object jsonResult) {
 		try {
 			// 获取当前的用户
-			CmsUser cmsUser = cmsUserManager.getUser(StpUtil.getLoginIdAsLong());
+			CmsUser cmsUser = cmsUserManager.getUser(StpAbroadUtil.getLoginIdAsLong());
 			SysLog sysLog = new SysLog();
 			sysLog.setOperateIp(ServletUtil.getClientIP(request));
 			sysLog.setOperateUrl(request.getRequestURI());

+ 4 - 2
netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java

@@ -2,6 +2,7 @@ package com.cyksj.config;
 
 import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
 import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import com.cyksj.web.util.StpAbroadUtil;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -19,7 +20,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
 	// 注册拦截器
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(new SaRouteInterceptor())
+		registry.addInterceptor(new SaRouteInterceptor((request, response, handle) -> StpAbroadUtil.checkLogin()))
 				.addPathPatterns(List.of("/manage/**", "/manager/**", "/sys/update", "/sys/delete/**"))
 				.excludePathPatterns(List.of("/manage/admin/login",
 						"/manage/admin/get/loginInfo",
@@ -41,7 +42,8 @@ public class SaTokenConfigure implements WebMvcConfigurer {
 						"/manage/account/put/account",
 						"/manage/coupon/get/classificationList",
 						"/manage/coupon/get/couponList",
-						"manage/order/wx/refund/notify"));
+						"manage/order/wx/refund/notify",
+						"/manage/user/get/abroad/token"));
 		//注解权限校验
 		registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
 	}

+ 9 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -518,4 +518,13 @@ public class GroupRelationController {
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(page);
     }
+
+    /**
+     * 读取车票账号登录验证码
+     */
+    @GetMapping("/get/verifyCode/{relationId}")
+    public Result<String> getAiVerifyCode(@PathVariable Long relationId, Integer type, @RequestParam(defaultValue = "0") Boolean sync) throws Exception {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        return GatewayResponse.SUCCESS.newBuilder().toResult(groupRelationFrontService.getAiVerifyCode(userId, relationId, type, sync));
+    }
 }

+ 7 - 7
netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java

@@ -1,6 +1,6 @@
 package com.cyksj.web.controller.manage;
 
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
@@ -92,7 +92,7 @@ public class AdminController {
 
     @PostMapping("/post")
     public Result<String> saveAdmin(@RequestBody @Validated Admin admin) throws Exception {
-        Long adminId = StpUtil.getLoginIdAsLong();
+        Long adminId = StpAbroadUtil.getLoginIdAsLong();
         Admin exist = adminService.getById(adminId);
         if (exist == null) {
             throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -128,7 +128,7 @@ public class AdminController {
      */
     @DeleteMapping("/delete/{id}")
     public Result<String> deleteAdminById(@PathVariable Long id) {
-        Long adminId = StpUtil.getLoginIdAsLong();
+        Long adminId = StpAbroadUtil.getLoginIdAsLong();
         Admin exist = adminService.getById(adminId);
         if (exist == null) {
             throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -148,7 +148,7 @@ public class AdminController {
      */
     @PutMapping("/put")
     public Result<String> editAdmin(@RequestBody Admin admin) throws Exception {
-        Long adminId = StpUtil.getLoginIdAsLong();
+        Long adminId = StpAbroadUtil.getLoginIdAsLong();
         Admin exist = adminService.getById(adminId);
         if (exist == null) {
             throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -179,7 +179,7 @@ public class AdminController {
         }
         adminService.saveOrUpdate(admin);
         if (flag) {
-            StpUtil.logoutByLoginId(admin.getId());
+            StpAbroadUtil.logoutByLoginId(admin.getId());
         }
 
         return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
@@ -215,9 +215,9 @@ public class AdminController {
         }
         // 生成token
 
-        StpUtil.login(admin.getId());
+        StpAbroadUtil.login(admin.getId());
 
-        String token = StpUtil.getTokenValue();
+        String token = StpAbroadUtil.getTokenValue();
 
         admin.setPassWord("");
 

+ 2 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -1,7 +1,7 @@
 package com.cyksj.web.controller.manage;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
@@ -88,7 +88,6 @@ public class CmsOrderController {
 
 
 	@GetMapping("/get")
-	@SaCheckPermission("order:view")
 	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (channelId != null) {
@@ -158,7 +157,6 @@ public class CmsOrderController {
 	 * 订单导出
 	 */
 	@GetMapping("/export")
-	@SaCheckPermission("order:export")
 	@Log(module = "订单管理/导出订单", businessType = BusinessType.EXPORT, isSaveRequestData = true)
 	public void exportOrders(HttpServletResponse response) {
 		List<ExcelOrderDonData> list = beanSearcher.searchAll(ExcelOrderDonData.class, MapUtils.flatBuilder(request.getParameterMap()).build());
@@ -250,7 +248,6 @@ public class CmsOrderController {
 	 * 用户购买实物商品意愿列表
 	 */
 	@GetMapping("/get/realGooods/interest/users")
-	@SaCheckPermission("interest:view")
 	public Result<SearchResult> getInterestUserList(RealGoodsInterestUser.Status interestStatus, HttpServletRequest request) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		SearchResult<RealGoodsInterestUserView> search;
@@ -474,7 +471,7 @@ public class CmsOrderController {
 	@PutMapping("/kickOut")
 	@NoSubmit
 	public Result<String> kickOut(@RequestBody @Validated ClickOutReq req) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		cmsOrderDonService.kickOutRelationId(adminId, req);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}

+ 0 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
@@ -63,7 +62,6 @@ public class CmsUserController{
     private final OrderDonMapper orderDonMapper;
 
     @GetMapping("/get")
-    @SaCheckPermission("user:view")
     public Result<SearchResult<UserView>> get(String otherPhone, Long sharedId, String userid, Long businessId, String sort, String order) {
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         String otherSql = StrUtil.EMPTY;
@@ -102,7 +100,6 @@ public class CmsUserController{
      * 修改用户的拉黑状态
      */
     @PutMapping("/put/black/status/{id}")
-    @SaCheckPermission("user:black")
     public Result<String> putBlackStatus(@PathVariable Long id) {
         User user = userMapper.selectById(id);
         Optional.ofNullable(user).ifPresent(u -> {

+ 60 - 13
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -1,7 +1,6 @@
 package com.cyksj.web.controller.manage.account;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -21,6 +20,7 @@ import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelDoubleVerifyAccountData;
 import com.cyksj.model.excel.ExcelImportAccountData;
@@ -47,7 +47,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -100,8 +102,9 @@ public class CmsAccountController {
 
 	private final RedisService redisService;
 
+	private final SysEmailMapper sysEmailMapper;
+
 	@GetMapping("/get")
-	@SaCheckPermission("account:view")
 	public Result<SearchResult<AccountView>> get(Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths) {
 		MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
 		if (StrUtil.isNotEmpty(expiryStartTime) || StrUtil.isNotEmpty(expiryEndTime)) {
@@ -184,7 +187,6 @@ public class CmsAccountController {
      * 导出账号
      */
     @GetMapping("/export/account")
-    @SaCheckPermission("account:export")
     @Log(module = "平台管理/导出账号", businessType = BusinessType.EXPORT, isSaveRequestData = true)
     public void exportAccount(Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths, HttpServletResponse response) {
         MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
@@ -244,7 +246,6 @@ public class CmsAccountController {
      * 下载批量修改密码模板
      */
     @GetMapping("/get/account/template")
-    @SaCheckPermission("account:batchUpdatePwd")
     public void getAccountTemplate(HttpServletResponse response) {
         EasyExcelUtils.createTemplateExcel(response, ExcelImportAccountData.class, "账号批量修改密码模板", "账号批量修改密码模板", ExcelTypeEnum.XLSX, null);
     }
@@ -254,7 +255,7 @@ public class CmsAccountController {
 	 */
 	@PostMapping("/import/account")
 	public Result<String> importAccount(Long goodsId, MultipartFile file) throws Exception {
-		long userId = StpUtil.getLoginIdAsLong();
+		long userId = StpAbroadUtil.getLoginIdAsLong();
 		EasyExcel.read(file.getInputStream(), ExcelImportAccountData.class, new AnalysisEventListener<ExcelImportAccountData>() {
 			@SneakyThrows
 			@Override
@@ -340,7 +341,6 @@ public class CmsAccountController {
     @PostMapping("/post")
     @NoSubmit
     @Transactional(rollbackFor = Throwable.class)
-    @SaCheckPermission("account:add")
     @Log(module = "平台管理/新增账号", businessType = BusinessType.POST, isSaveRequestData = true)
     public Result<String> add(@RequestBody Account account){
 		account.setAccount(account.getAccount().trim());
@@ -426,7 +426,6 @@ public class CmsAccountController {
 	}
 
     @PutMapping("/update")
-    @SaCheckPermission("account:update")
     @Log(module = "平台管理/编辑账号", businessType = BusinessType.PUT, isSaveRequestData = true)
     public Result<String> update(@RequestBody Account account){
 	    Account db = accountService.getById(account.getId());
@@ -435,7 +434,7 @@ public class CmsAccountController {
 	    }
 	    Boolean isClear = false;
 	    String dbAccount = db.getAccount();
-	    long userId = StpUtil.getLoginIdAsLong();
+	    long userId = StpAbroadUtil.getLoginIdAsLong();
 	    if (!db.getPassword().equals(account.getPassword())) {
 		    account.setCustomerServiceId(0l);
 		    accountService.saveRecord(userId, account.getId(), db.getPassword(), account.getPassword(), "操作编辑");
@@ -516,7 +515,7 @@ public class CmsAccountController {
 	@PutMapping("/update/pwd")
 	@Log(module = "平台管理/批量修改密码", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> updatePwdAndSendMsg(@RequestBody List<Account> accounts) throws Exception {
-		long userId = StpUtil.getLoginIdAsLong();
+		long userId = StpAbroadUtil.getLoginIdAsLong();
 		accounts.forEach(account -> {
 			Account db = accountService.getById(account.getId());
 			if (db != null) {
@@ -586,7 +585,6 @@ public class CmsAccountController {
 
 
 	@DeleteMapping("/delete/{id}")
-	@SaCheckPermission("account:delete")
 	@Log(module = "平台管理/删除账号", businessType = BusinessType.DELETE, isSaveRequestData = true)
 	public Result<String> update(@PathVariable Long id){
 	    //是否关联了车队
@@ -599,7 +597,6 @@ public class CmsAccountController {
     }
 
     @PutMapping("/update/expiryTime")
-    @SaCheckPermission("account:addExpiryTime")
     public Result<String> updateExpiryTime(@RequestBody ReqAccountIncrExpiryTime incrExpiryTime){
         incrExpiryTime.getAccounts().forEach((accountId)->{
             Account account = accountService.getById(accountId);
@@ -726,7 +723,7 @@ public class CmsAccountController {
 	 */
 	@GetMapping("/get/updatePwd/num")
 	public Result<CustomerServiceUpdatePwdDetail> updatePwdDetails() {
-		long userId = StpUtil.getLoginIdAsLong();
+		long userId = StpAbroadUtil.getLoginIdAsLong();
 		CmsUser user = cmsUserManager.getUser(userId);
 		MapBuilder builder = MapUtils.builder();
 		if (user != null && user.getRoleNames() != null && user.getRoleNames().contains("客服")) {
@@ -873,4 +870,54 @@ public class CmsAccountController {
 		List<DoubleVerifyClickRefreshRecord> search = beanSearcher.searchAll(DoubleVerifyClickRefreshRecord.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+	/**
+	 * 批量导入系统邮箱
+	 */
+	@PostMapping("/batch/import/email")
+	public Result<String> batchImportEmail(MultipartFile file) throws Exception {
+		accountService.readFileAndImportEmail(file);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 系统邮箱列表
+	 */
+	@GetMapping("/get/email")
+	public Result<SearchResult<SysEmail>> getEmail() {
+		SearchResult<SysEmail> search = beanSearcher.search(SysEmail.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(SysEmail::getDeleted, 1)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 新增邮箱
+	 */
+	@PostMapping("/post/email")
+	public Result postEmail(@RequestBody @Validated SysEmail sysEmail) {
+		try {
+			sysEmailMapper.insert(sysEmail);
+		} catch (DuplicateKeyException e) {
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 修改系统邮箱
+	 */
+	@PutMapping("/update/email")
+	public Result updateEmail(@RequestBody SysEmail sysEmail) {
+		sysEmailMapper.updateById(sysEmail);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除系统邮箱
+	 */
+	@DeleteMapping("/delete/email/{id}")
+	public Result deleteEmail(@PathVariable Long id) {
+		sysEmailMapper.deleteById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 0 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.channel;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
@@ -50,7 +49,6 @@ public class CmsChannelPopularizeController {
     private final ChannelPopularizeVisitMapper visitMapper;
 
     @GetMapping
-    @SaCheckPermission("promotion:view")
     public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime) {
         SearchResult<ChannelPopularizeView> searchResult = beanSearcher.search(ChannelPopularizeView.class,
                 MapUtils.flatBuilder(request.getParameterMap())

+ 24 - 10
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -1,6 +1,6 @@
 package com.cyksj.web.controller.manage.cms;
 
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -97,7 +97,7 @@ public class CmsAdminUserController {
 	@Log(module = "用户管理/新增用户", businessType = BusinessType.POST, isSaveRequestData = true)
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> saveAdmin(@RequestBody @Validated CmsUserReq cmsUserReq) throws Exception {
-		Long adminId = StpUtil.getLoginIdAsLong();
+		Long adminId = StpAbroadUtil.getLoginIdAsLong();
 		CmsUser exist = cmsUserMapper.selectById(adminId);
 		if (exist == null) {
 			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -135,7 +135,7 @@ public class CmsAdminUserController {
 	@DeleteMapping("/delete/{id}")
 	@Log(module = "用户管理/删除用户", businessType = BusinessType.DELETE)
 	public Result<String> deleteAdminById(@PathVariable Long id) throws Exception {
-		Long adminId = StpUtil.getLoginIdAsLong();
+		Long adminId = StpAbroadUtil.getLoginIdAsLong();
 		CmsUser exist = cmsUserMapper.selectById(adminId);
 		if (exist == null) {
 			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -163,7 +163,7 @@ public class CmsAdminUserController {
 		cmsUserManager.delUserRoleRelation(id);
 		cmsUserMapper.deleteById(id);
 		//删除用户,将上线的用户踢下
-		StpUtil.logoutByLoginId(id);
+		StpAbroadUtil.logoutByLoginId(id);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
 	}
 
@@ -173,7 +173,7 @@ public class CmsAdminUserController {
 	@PutMapping("/put")
 	@Log(module = "用户管理/编辑用户", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> editAdmin(@RequestBody CmsUserReq cmsUserReq) throws Exception {
-		Long adminId = StpUtil.getLoginIdAsLong();
+		Long adminId = StpAbroadUtil.getLoginIdAsLong();
 		CmsUser exist = cmsUserMapper.selectById(adminId);
 		if (exist == null) {
 			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
@@ -209,7 +209,7 @@ public class CmsAdminUserController {
 		user.setModifiedBy(exist.getNickname());
 		cmsUserMapper.updateById(user);
 		if (flag) {
-			StpUtil.logoutByLoginId(cmsUserReq.getId());
+			StpAbroadUtil.logoutByLoginId(cmsUserReq.getId());
 		}
 		//是不是客服
 		CmsUserVO isCustomer = beanSearcher.searchFirst(CmsUserVO.class, MapUtils.builder()
@@ -236,7 +236,7 @@ public class CmsAdminUserController {
 		cmsUserMapper.updateById(cmsUser);
 		if (!cmsUser.getStatus()) {
 			//状态为禁用时,将上线的用户下线
-			StpUtil.logoutByLoginId(cmsUser.getId());
+			StpAbroadUtil.logoutByLoginId(cmsUser.getId());
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult("用户状态变更成功");
 	}
@@ -280,9 +280,9 @@ public class CmsAdminUserController {
 		}
 		// 生成token
 
-		StpUtil.login(admin.getId());
+		StpAbroadUtil.login(admin.getId());
 
-		String token = StpUtil.getTokenValue();
+		String token = StpAbroadUtil.getTokenValue();
 
 		admin.setPassword("");
 
@@ -303,7 +303,7 @@ public class CmsAdminUserController {
 
 	@GetMapping("/get/list")
 	public Result<SearchResult<CmsUserVO>> list(String roleNames) {
-		long userId = StpUtil.getLoginIdAsLong();
+		long userId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (StrUtil.isNotEmpty(roleNames) && roleNames.contains("客服")) {
 			CmsUser user = cmsUserManager.getUser(userId);
@@ -314,4 +314,18 @@ public class CmsAdminUserController {
 		SearchResult<CmsUserVO> search = beanSearcher.search(CmsUserVO.class, builder.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+	/**
+	 * 获取token
+	 */
+	@GetMapping("/get/abroad/token")
+	public Result<String> getAbroadToken(String phone) {
+		CmsUser cmsUser = cmsUserMapper.selectOne(Wrappers.lambdaQuery(CmsUser.class).eq(CmsUser::getPhone, phone).last("limit 1"));
+		if (cmsUser == null) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		StpAbroadUtil.login(cmsUser.getId());
+		String token = StpAbroadUtil.getTokenValue();
+		return GatewayResponse.SUCCESS.newBuilder().toResult(token);
+	}
 }

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java

@@ -1,6 +1,6 @@
 package com.cyksj.web.controller.manage.cms;
 
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -102,7 +102,7 @@ public class CmsMenuController {
 
 	@GetMapping("/get/self/menu")
 	public Result<List<CmsMenuVO>> getSelfMenuList() {
-		List<CmsMenuVO> allSelf = cmsMenuMapper.getSelfCmsMenusList(StpUtil.getLoginIdAsLong());
+		List<CmsMenuVO> allSelf = cmsMenuMapper.getSelfCmsMenusList(StpAbroadUtil.getLoginIdAsLong());
 		Map<Long, List<CmsMenuVO>> idMenusMap = allSelf.stream().collect(Collectors.groupingBy(CmsMenu::getParentId));
 		List<CmsMenuVO> list = allSelf.stream().filter(vo -> vo.getParentId() == 0).collect(Collectors.toList());
 		for (CmsMenuVO cmsMenuVO : list) {

+ 7 - 13
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -1,7 +1,6 @@
 package com.cyksj.web.controller.manage.distribute;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -97,7 +96,6 @@ public class DistributeController {
 	 * 添加固定推广者
 	 */
 	@PostMapping
-	@SaCheckPermission("distribute:add")
 	@Log(module = "分销管理/增加推广者", businessType = BusinessType.POST, isSaveRequestData = true)
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> saveDistributes(@RequestBody @NotNull UserDistributeReq userDistributeReq) {
@@ -116,7 +114,6 @@ public class DistributeController {
 	 * 删除固定推广者
 	 */
 	@DeleteMapping("/del/{id}")
-	@SaCheckPermission("distribute:delete")
 	@Log(module = "分销管理/删除推广者", businessType = BusinessType.DELETE, isSaveRequestData = true)
 	public Result<String> deleteDistributesById(@PathVariable Long id) {
 		if (id == null || id < 1) {
@@ -130,7 +127,6 @@ public class DistributeController {
 	 * 推广者编辑
 	 */
 	@PutMapping
-	@SaCheckPermission("distribute:update")
 	@Log(module = "分销管理/编辑推广者", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> editDistribute(@RequestBody UserDistributeReq userDistributeReq) {
 		distributeService.editDistribute(userDistributeReq);
@@ -153,7 +149,7 @@ public class DistributeController {
 	 */
 	@GetMapping
 	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
 		if (userBusinessRateService.isBusiness(adminId)) {
@@ -313,7 +309,6 @@ public class DistributeController {
 	 * 提现列表
 	 */
 	@GetMapping("/get/applyMoney/list")
-	@SaCheckPermission("distribute:applyView")
 	public Result<SearchResult<DistributeMoneyApplyView>> applyMoneyList() {
 		SearchResult<DistributeMoneyApplyView> search = beanSearcher.search(DistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
@@ -409,7 +404,7 @@ public class DistributeController {
 	 */
 	@GetMapping("/get/business/list")
 	public Result<SearchResult<DistributeBusinessView>> getDistributeBusinessView() {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		DateTime beginOfMonth = DateUtil.beginOfMonth(DateTime.now());
 		String thisMonth = beginOfMonth.toString("yyyy-MM");
@@ -431,7 +426,7 @@ public class DistributeController {
 	 */
 	@GetMapping("/get/businessList")
 	public Result<List<DistributeBusinessListVo>> getBusinessList() {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
 		if (userBusinessRateService.isBusiness(adminId)) {
@@ -446,7 +441,7 @@ public class DistributeController {
 	 */
 	@GetMapping("/get/takeMoney/detail")
 	public Result<SearchResult<BusinessTakeMoneyDetail>> getTakeMoneyDetail(String firstMonthDate, String secondMonthDate) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
 		if (userBusinessRateService.isBusiness(adminId)) {
@@ -480,7 +475,7 @@ public class DistributeController {
 	 */
 	@GetMapping("/get/business/headData")
 	public Result<BusinessTakeMoneyHeadView> getTakeMoneyHeadDetail(String firstMonthDate, String secondMonthDate) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
 		if (userBusinessRateService.isBusiness(adminId)) {
@@ -651,9 +646,8 @@ public class DistributeController {
 	 * 商务人员数据表
 	 */
 	@GetMapping("/get/business/data")
-	@SaCheckPermission("business:dataView")
 	public Result<SearchResult<BusinessDistributesDataView>> getBusinessDistributesData(String startTime, String endTime) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		String time1Sql = StrUtil.EMPTY;
 		String time2Sql = StrUtil.EMPTY;

+ 0 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.exchange;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.cyksj.common.annotation.Log;
@@ -46,7 +45,6 @@ public class ExchangeCodeController {
 	 * 生成兑换码 并导出
 	 */
 	@GetMapping("/createAndExport")
-	@SaCheckPermission("exchangeCode:add")
 	@Log(module = "兑换码/生成兑换码", businessType = BusinessType.POST, isSaveRequestData = true)
 	public void createAndExportCode(ExchangeCodeReq exchangeCodeReq, HttpServletResponse response) {
 		if (ObjectUtil.hasEmpty(exchangeCodeReq.getGoodsId(), exchangeCodeReq.getSkuId(), exchangeCodeReq.getNumber())) {
@@ -60,7 +58,6 @@ public class ExchangeCodeController {
 	 * 兑换码列表
 	 */
 	@GetMapping("/get")
-	@SaCheckPermission("exchangeCode:view")
 	public Result<SearchResult<ExchangeCodeView>> getExchangeCodeView() {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(beanSearcher.search(ExchangeCodeView.class, MapUtils.flat(request.getParameterMap())));
 	}
@@ -69,7 +66,6 @@ public class ExchangeCodeController {
 	 * 导出兑换码
 	 */
 	@GetMapping("/export")
-	@SaCheckPermission("exchangeCode:export")
 	public void exportExchangeCode(HttpServletResponse response) {
 		List<ExcelExchangeCodeData> data = beanSearcher.searchAll(ExcelExchangeCodeData.class, MapUtils.flat(request.getParameterMap()));
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelExchangeCodeData.class, data, "银河兑换码","银河兑换码", ExcelTypeEnum.XLSX, null);

+ 0 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.goods;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
@@ -93,7 +92,6 @@ public class CmsGoodsDonController {
      * 新增 商品spu
      */
     @PostMapping(value = "/post")
-    @SaCheckPermission("platform:add")
     @Log(module = "平台管理/新增平台", businessType = BusinessType.POST, isSaveRequestData = true)
     public Result<Long> spuInsert(@Validated @RequestBody ReqGoodsSpuInsert spu) throws Exception {
         // 新增商品
@@ -114,7 +112,6 @@ public class CmsGoodsDonController {
      * 修改 商品spu
      */
     @PutMapping(value = "/update")
-    @SaCheckPermission("platform:update")
     @Log(module = "平台管理/编辑平台", businessType = BusinessType.PUT, isSaveRequestData = true)
     public Result<String> spuUpdate(@Validated @RequestBody ReqGoodsSpuInsert spu) throws Exception{
         GoodsDon goods = new GoodsDon();
@@ -153,7 +150,6 @@ public class CmsGoodsDonController {
 
 
     @PutMapping("/put/status/{id}")
-    @SaCheckPermission("platform:updateStatus")
     @Log(module = "平台管理/平台上下架", businessType = BusinessType.PUT, isSaveRequestData = true, isSaveResponseData = true)
     public Result<Boolean> updateStatus(@PathVariable Long id) {
         GoodsDon goods = goodsDonService.getById(id);
@@ -168,7 +164,6 @@ public class CmsGoodsDonController {
     }
 
     @DeleteMapping("/delete/{id}")
-    @SaCheckPermission("platform:delete")
     @Log(module = "平台管理/删除平台", businessType = BusinessType.DELETE, isSaveRequestData = true, isSaveResponseData = true)
     public Result<Long> deleteById(@PathVariable Long id) {
         GoodsDon goods = goodsDonService.getById(id);

+ 2 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java

@@ -1,7 +1,6 @@
 package com.cyksj.web.controller.manage.group;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.thread.ThreadUtil;
@@ -65,7 +64,6 @@ public class CmsGroupController {
     private final UserMapper userMapper;
 
     @GetMapping("/get")
-    @SaCheckPermission("group:view")
     public Result<SearchResult<GroupsTrips>> get(String account, Long userId, String showId, String nickName, String submitAccount, Boolean isEmpty) {
         MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
         if (StrUtil.isNotBlank(showId)) {
@@ -100,7 +98,6 @@ public class CmsGroupController {
 
     @PostMapping("/post")
     @NoSubmit
-    @SaCheckPermission("group:add")
     @Log(module = "发布车票/新增车队", businessType = BusinessType.POST, isSaveRequestData = true)
     public Result<GroupsTrips> add(@RequestBody GroupsTrips groups){
 
@@ -179,7 +176,7 @@ public class CmsGroupController {
      */
     @PutMapping("/account/replace")
     public Result<String> replaceTripsAccount(@RequestBody ReplaceTripsAccountReq req) {
-        long adminId = StpUtil.getLoginIdAsLong();
+        long adminId = StpAbroadUtil.getLoginIdAsLong();
         req.setAdminId(adminId);
         groupService.replaceTripsAccount(req);
         return GatewayResponse.SUCCESS.newBuilder().toResult("车队替换账号成功");

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java

@@ -1,6 +1,6 @@
 package com.cyksj.web.controller.manage.group;
 
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
@@ -91,7 +91,7 @@ public class CmsGroupRelationController {
     @PostMapping("/set/recharge")
     @Transactional(rollbackFor = Throwable.class)
     public Result<String> updateRechargeStatus(@RequestBody GroupsRelationRechargeView rechargeView) {
-        long adminId = StpUtil.getLoginIdAsLong();
+        long adminId = StpAbroadUtil.getLoginIdAsLong();
         Long relationId = rechargeView.getRelationId();
         GroupsRelation relation = groupsRelationMapper.selectById(relationId);
         Assert.notNull(relation, "代充车票不存在");

+ 0 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.market;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -92,7 +91,6 @@ public class LuckyDrawController {
 	 * 奖品列表
 	 */
 	@GetMapping("/get")
-	@SaCheckPermission("raffle:view")
 	public Result<SearchResult<LuckyDrawView>> get(HttpServletRequest request) {
 		SearchResult<LuckyDrawView> search = beanSearcher.search(LuckyDrawView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.build());

+ 0 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.market;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -111,7 +110,6 @@ public class TaskController {
 	 * 任务列表
 	 */
 	@GetMapping("/get")
-	@SaCheckPermission("sign:view")
 	public Result<SearchResult<TaskView>> getTask(HttpServletRequest request) {
 		DateTime now = DateTime.now();
 		DateTime beginOfDay = DateUtil.beginOfDay(now);

+ 0 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.manage.register;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
@@ -64,7 +63,6 @@ public class CmsRegisterController {
     private final SpotifySendMsgService spotifySendMsgService;
 
     @GetMapping("/get")
-    @SaCheckPermission("sign:view")
     public Result<SearchResult<RegisterOrderDon>> get(Boolean appleIsAutoType) {
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         if (appleIsAutoType != null) {
@@ -137,7 +135,6 @@ public class CmsRegisterController {
      * 微信订单退款
      */
     @PostMapping("/wx/refund")
-    @SaCheckPermission("sign:refund")
     public Result<String> wxRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
         RegisterOrderDon registerOrderDon = registerOrderDonService.getById(refundReq.getOrderId());
         if (registerOrderDon==null) throw BusinessRuntimeException.getInstance("");

+ 0 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java

@@ -36,7 +36,6 @@ public class ShopConfigController {
     private final ChannelService channelService;
 
     @GetMapping
-    @SaCheckPermission("merchant:view")
     public Result<SearchResult<ShopConfig>> get(){
         SearchResult<ShopConfig> searchResult = beanSearcher.search(ShopConfig.class, MapUtils.flatBuilder(request.getParameterMap()).build());
         searchResult.getDataList().forEach((shopConfig)->{

+ 0 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -91,7 +91,6 @@ public class StatisticsDataController {
 	 * 查询统计数据
 	 */
 	@GetMapping
-	@SaCheckPermission("statics:view")
 	public Result<BackgroundDataView> getStatisticsByCondition(Long startTime, Long endTime) throws InterruptedException {
 		return statisticsDataService.getStatisticsByCondition(startTime, endTime);
 	}
@@ -100,7 +99,6 @@ public class StatisticsDataController {
 	 * 导出订单统计数据
 	 */
 	@GetMapping("/export")
-	@SaCheckPermission("statics:export")
 	public void exportStatisticsData(Integer type, Long startTime, Long endTime, HttpServletResponse response) {
 		if (startTime == null || endTime == null) {
 			throw BusinessRuntimeException.getInstance("请选择导出的时间");
@@ -127,7 +125,6 @@ public class StatisticsDataController {
 	 * 有效子账号数列表
 	 */
 	@GetMapping("/expired/account")
-	@SaCheckPermission("validAccount:view")
 	public Result<IPage<ExpiredAccountDataView>> getExpiredAccountView(Boolean isCorpWx, String customerService, Long goodsId, Long skuId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, Long startTime, Long endTime, @RequestParam(required = false, defaultValue = "1") Long start, @RequestParam(required = false, defaultValue = "10") Long limit) {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(statisticsDataService.getExpiredAccountView(isCorpWx, customerService, goodsId, skuId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, start, limit));
 	}
@@ -169,7 +166,6 @@ public class StatisticsDataController {
 	 */
 	@PutMapping("/renewTime/up")
 	@Transactional(rollbackFor = Throwable.class)
-	@SaCheckPermission("validAccount:addTime")
 	@Log(module = "有效子账号管理/增加时长", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> addRenewTime(@RequestBody @Validated RenewTimeUpReq renewTimeUpReq) {
 		GroupsRelation relation = groupsRelationMapper.selectById(renewTimeUpReq.getRelationId());
@@ -409,7 +405,6 @@ public class StatisticsDataController {
 	 * 批量分配客服
 	 */
 	@PostMapping("/batch/service")
-	@SaCheckPermission("validAccount:distributeServices")
 	public Result<String> batchService(@RequestBody List<BatchServiceReq> batchServices) {
 		batchServices.forEach(service -> {
 			if (StrUtil.isEmpty(service.getCustomerService())) {

+ 4 - 9
netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/WorkOrderController.java

@@ -1,7 +1,6 @@
 package com.cyksj.web.controller.manage.sys;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
+import com.cyksj.web.util.StpAbroadUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -61,7 +60,6 @@ public class WorkOrderController {
 	private final UserMapper userMapper;
 
 	@GetMapping("/get")
-	@SaCheckPermission("workOrder:view")
 	public Result<SearchResult<WorkOrderView>> getWorkOrderList(String nickname, Integer feedbackNum, Long customerServiceId) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (feedbackNum != null) {
@@ -97,9 +95,8 @@ public class WorkOrderController {
 	 * 修改工单状态
 	 */
 	@PutMapping("/put")
-	@SaCheckPermission("workOrder:updateStatus")
 	public Result<String> putWorkOrderStatus(@RequestBody WorkOrder dto) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		Long id = dto.getId();
 		WorkOrder.Status status = dto.getStatus();
 		String remark = dto.getRemark();
@@ -124,7 +121,6 @@ public class WorkOrderController {
 	 * 查看聊天
 	 */
 	@GetMapping("/get/chat/history")
-	@SaCheckPermission("workOrder:detail")
 	public Result<SearchResult<WorkOrderChatHistoryView>> getChatHistoryById() {
 		SearchResult<WorkOrderChatHistoryView> search = beanSearcher.search(WorkOrderChatHistoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data->{
@@ -138,10 +134,9 @@ public class WorkOrderController {
 	 * 客服回复用户工单
 	 */
 	@PostMapping("/customer/reply")
-	@SaCheckPermission("workOrder:reply")
 	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> customerReplyWorkOrder(@RequestBody @Validated WorkOrderChatHistory history) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		//回复内容字数
 		Long workOrderId = history.getWorkOrderId();
 		WorkOrder workOrder = workOrderMapper.selectById(workOrderId);
@@ -182,7 +177,7 @@ public class WorkOrderController {
 	 */
 	@GetMapping("/export")
 	public void export(String nickname, String ids, HttpServletResponse response) {
-		long adminId = StpUtil.getLoginIdAsLong();
+		long adminId = StpAbroadUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是不是客服
 		CmsUserVO isCustomer = beanSearcher.searchFirst(CmsUserVO.class, MapUtils.builder()

+ 327 - 0
netflix-web/src/main/java/com/cyksj/web/util/StpAbroadUtil.java

@@ -0,0 +1,327 @@
+package com.cyksj.web.util;
+
+import cn.dev33.satoken.fun.SaFunction;
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpLogic;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2021/10/12 下午5:59
+ */
+@Component
+public class StpAbroadUtil {
+	public static final String TYPE = "abroad";
+
+	// 使用匿名子类 重写`stpLogic对象`的一些方法
+	public static StpLogic stpLogic = new StpLogic("abroad") {
+		// 重写 StpLogic 类下的 `splicingKeyTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
+		@Override
+		public String splicingKeyTokenName() {
+			return super.splicingKeyTokenName() + "-abroad";
+		}
+		// 同理你可以按需重写一些其它方法 ...
+	};
+
+	public StpAbroadUtil() {
+	}
+
+	public static String getLoginType() {
+		return stpLogic.getLoginType();
+	}
+
+	public static String getTokenName() {
+		return stpLogic.getTokenName();
+	}
+
+	public static void setTokenValue(String tokenValue, int cookieTimeout) {
+		stpLogic.setTokenValue(tokenValue, cookieTimeout);
+	}
+
+	public static String getTokenValue() {
+		return stpLogic.getTokenValue();
+	}
+
+	public static SaTokenInfo getTokenInfo() {
+		return stpLogic.getTokenInfo();
+	}
+
+	public static void login(Object id) {
+		stpLogic.login(id);
+	}
+
+	public static void login(Object id, String device) {
+		stpLogic.login(id, device);
+	}
+
+	public static void login(Object id, boolean isLastingCookie) {
+		stpLogic.login(id, isLastingCookie);
+	}
+
+	public static void login(Object id, SaLoginModel loginModel) {
+		stpLogic.login(id, loginModel);
+	}
+
+	public static void logout() {
+		stpLogic.logout();
+	}
+
+	public static void logoutByTokenValue(String tokenValue) {
+		stpLogic.logoutByTokenValue(tokenValue);
+	}
+
+	public static void logoutByLoginId(Object loginId) {
+		stpLogic.logoutByLoginId(loginId);
+	}
+
+	public static void logoutByLoginId(Object loginId, String device) {
+		stpLogic.logoutByLoginId(loginId, device);
+	}
+
+	public static boolean isLogin() {
+		return stpLogic.isLogin();
+	}
+
+	public static void checkLogin() {
+		stpLogic.checkLogin();
+	}
+
+	public static Object getLoginId() {
+		return stpLogic.getLoginId();
+	}
+
+	public static <T> T getLoginId(T defaultValue) {
+		return stpLogic.getLoginId(defaultValue);
+	}
+
+	public static Object getLoginIdDefaultNull() {
+		return stpLogic.getLoginIdDefaultNull();
+	}
+
+	public static String getLoginIdAsString() {
+		return stpLogic.getLoginIdAsString();
+	}
+
+	public static int getLoginIdAsInt() {
+		return stpLogic.getLoginIdAsInt();
+	}
+
+	public static long getLoginIdAsLong() {
+		return stpLogic.getLoginIdAsLong();
+	}
+
+	public static Object getLoginIdByToken(String tokenValue) {
+		return stpLogic.getLoginIdByToken(tokenValue);
+	}
+
+	public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
+		return stpLogic.getSessionByLoginId(loginId, isCreate);
+	}
+
+	public static SaSession getSessionBySessionId(String sessionId) {
+		return stpLogic.getSessionBySessionId(sessionId);
+	}
+
+	public static SaSession getSessionByLoginId(Object loginId) {
+		return stpLogic.getSessionByLoginId(loginId);
+	}
+
+	public static SaSession getSession(boolean isCreate) {
+		return stpLogic.getSession(isCreate);
+	}
+
+	public static SaSession getSession() {
+		return stpLogic.getSession();
+	}
+
+	public static SaSession getTokenSessionByToken(String tokenValue) {
+		return stpLogic.getTokenSessionByToken(tokenValue);
+	}
+
+	public static SaSession getTokenSession() {
+		return stpLogic.getTokenSession();
+	}
+
+	public static void checkActivityTimeout() {
+		stpLogic.checkActivityTimeout();
+	}
+
+	public static void updateLastActivityToNow() {
+		stpLogic.updateLastActivityToNow();
+	}
+
+	public static long getTokenTimeout() {
+		return stpLogic.getTokenTimeout();
+	}
+
+	public static long getSessionTimeout() {
+		return stpLogic.getSessionTimeout();
+	}
+
+	public static long getTokenSessionTimeout() {
+		return stpLogic.getTokenSessionTimeout();
+	}
+
+	public static long getTokenActivityTimeout() {
+		return stpLogic.getTokenActivityTimeout();
+	}
+
+	public static boolean hasRole(Object loginId, String role) {
+		return stpLogic.hasRole(loginId, role);
+	}
+
+	public static boolean hasRole(String role) {
+		return stpLogic.hasRole(role);
+	}
+
+	public static void checkRole(String role) {
+		stpLogic.checkRole(role);
+	}
+
+	public static void checkRoleAnd(String... roleArray) {
+		stpLogic.checkRoleAnd(roleArray);
+	}
+
+	public static void checkRoleOr(String... roleArray) {
+		stpLogic.checkRoleOr(roleArray);
+	}
+
+	public static boolean hasPermission(Object loginId, String permission) {
+		return stpLogic.hasPermission(loginId, permission);
+	}
+
+	public static boolean hasPermission(String permission) {
+		return stpLogic.hasPermission(permission);
+	}
+
+	public static void checkPermission(String permission) {
+		stpLogic.checkPermission(permission);
+	}
+
+	public static void checkPermissionAnd(String... permissionArray) {
+		stpLogic.checkPermissionAnd(permissionArray);
+	}
+
+	public static void checkPermissionOr(String... permissionArray) {
+		stpLogic.checkPermissionOr(permissionArray);
+	}
+
+	public static String getTokenValueByLoginId(Object loginId) {
+		return stpLogic.getTokenValueByLoginId(loginId);
+	}
+
+	public static String getTokenValueByLoginId(Object loginId, String device) {
+		return stpLogic.getTokenValueByLoginId(loginId, device);
+	}
+
+	public static List<String> getTokenValueListByLoginId(Object loginId) {
+		return stpLogic.getTokenValueListByLoginId(loginId);
+	}
+
+	public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
+		return stpLogic.getTokenValueListByLoginId(loginId, device);
+	}
+
+	public static String getLoginDevice() {
+		return stpLogic.getLoginDevice();
+	}
+
+	public static List<String> searchTokenValue(String keyword, int start, int size) {
+		return stpLogic.searchTokenValue(keyword, start, size);
+	}
+
+	public static List<String> searchSessionId(String keyword, int start, int size) {
+		return stpLogic.searchSessionId(keyword, start, size);
+	}
+
+	public static List<String> searchTokenSessionId(String keyword, int start, int size) {
+		return stpLogic.searchTokenSessionId(keyword, start, size);
+	}
+
+	public static void disable(Object loginId, long disableTime) {
+		stpLogic.disable(loginId, disableTime);
+	}
+
+	public static boolean isDisable(Object loginId) {
+		return stpLogic.isDisable(loginId);
+	}
+
+	public static long getDisableTime(Object loginId) {
+		return stpLogic.getDisableTime(loginId);
+	}
+
+	public static void untieDisable(Object loginId) {
+		stpLogic.untieDisable(loginId);
+	}
+
+	public static void switchTo(Object loginId) {
+		stpLogic.switchTo(loginId);
+	}
+
+	public static void endSwitch() {
+		stpLogic.endSwitch();
+	}
+
+	public static boolean isSwitch() {
+		return stpLogic.isSwitch();
+	}
+
+	public static void switchTo(Object loginId, SaFunction function) {
+		stpLogic.switchTo(loginId, function);
+	}
+
+	public static void openSafe(long safeTime) {
+		stpLogic.openSafe(safeTime);
+	}
+
+	public static boolean isSafe() {
+		return stpLogic.isSafe();
+	}
+
+	public static void checkSafe() {
+		stpLogic.checkSafe();
+	}
+
+	public static long getSafeTime() {
+		return stpLogic.getSafeTime();
+	}
+
+	public static void closeSafe() {
+		stpLogic.closeSafe();
+	}
+
+	/** @deprecated */
+	@Deprecated
+	public static String getLoginKey() {
+		return stpLogic.getLoginType();
+	}
+
+	/** @deprecated */
+	@Deprecated
+	public static void setLoginId(Object loginId) {
+		stpLogic.login(loginId);
+	}
+
+	/** @deprecated */
+	@Deprecated
+	public static void setLoginId(Object loginId, String device) {
+		stpLogic.login(loginId, device);
+	}
+
+	/** @deprecated */
+	@Deprecated
+	public static void setLoginId(Object loginId, boolean isLastingCookie) {
+		stpLogic.login(loginId, isLastingCookie);
+	}
+
+	/** @deprecated */
+	@Deprecated
+	public static void setLoginId(Object loginId, SaLoginModel loginModel) {
+		stpLogic.login(loginId, loginModel);
+	}
+
+}

+ 19 - 15
netflix-web/src/main/resources/application-pre.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8082
+  port: 8085
   undertow:
     buffer-size: 1024
     direct-buffers: true
@@ -11,7 +11,7 @@ spring:
       max-file-size: 50MB
   #国际化
   messages:
-    basename: i18n.yhlx
+    basename: i18n/yhlx
   mail:
     host: smtp.163.com
     username: yinheluxiangju@163.com
@@ -25,9 +25,9 @@ spring:
     default-encoding: utf-8
   datasource:
     type: com.zaxxer.hikari.HikariDataSource
-    url: jdbc:mysql://172.17.0.17:3306/yhlxj?useAffectedRows=true
+    url: jdbc:mysql://172.19.16.7:33306/yhlxj_pre?useAffectedRows=true
     username: yhlxj
-    password: yhlxj123
+    password: netflix_123
     platform: mysql
     continue-on-error: false
     driver-class-name: com.mysql.cj.jdbc.Driver
@@ -67,8 +67,8 @@ spring:
         maintainTimeStats: false,
       }
   redis:
-    # Redis数据库索引(默认为 0)
-    database: 0
+    # Redis数据库索引(默认为 0)预发布
+    database: 2
     # Redis服务器地址
     host: 127.0.0.1
     # Redis服务器连接端口
@@ -126,7 +126,7 @@ wechat:
   oldAppid: wxd58016eee53b6558
   appid: wx6cbc2de2a55e5579
   secret: 2ab6340e7787ab24de9f29094dee9d24
-  domain: https://nf.video/8081/api/
+  domain: https://galaxydvd.com/8085/api/
   #默认微信商户
   shopid: 1634772026
   shopKey: p2B8BAKi2V3PgMDSSez82V67aIvMKBt5
@@ -135,11 +135,11 @@ wechat:
 wx-login:
   appid: wx7c5494c38c6a78bd
   secret: 95c7c542a583b42840765d758ec49bf5
-  redirectUri: https://nf.video/8082/api/auth/wx/authLogin/baseRedirect
-  loginUrl: https://nf.video
-  cpsRedirectUri: https://nf.video/8082/api/cps/manage/wx/authLogin/baseRedirect
-  cpsLoginUrl: https://cps.nf.video/yinhe/cps/loginNexte
-  baRedirectUrl: https://nf.video/8082/api/applets/market/task/bind/wx/baseRedirect
+  redirectUri: https://galaxydvd.com/8085/api/auth/wx/authLogin/baseRedirect
+  loginUrl: https://galaxydvd.com
+  cpsRedirectUri: https://galaxydvd.com/8085/api/cps/manage/wx/authLogin/baseRedirect
+  cpsLoginUrl: https://cps.galaxydvd.com/yinhe/cps/loginNexte
+  baRedirectUrl: https://galaxydvd.com/8085/api/applets/market/task/bind/wx/baseRedirect
   remark: 银河录像网页微信登录
 
 yhlx:
@@ -147,7 +147,7 @@ yhlx:
   corpSecret: Ov0mlArSItBrs9EuOMt5Ou_faGdplDDIvPgIhgup51E
   encodingAESKey: bqoACJutQEgW7KOgBoezuQkk7y2HQSyRp1sQ8qnAi6C
   token: 2e0aWIfBewWNN5BNMq9cBeLf9x
-  domain: https://nf.video/8081/api/
+  domain: https://galaxydvd.com/8085/api/
 
 #银河录像局小程序
 yhmini:
@@ -160,7 +160,7 @@ advertisement:
   secret: 19b5f5121bc7cc1bc010ee7c4ac509e9
   shopId: 1644299849
   shopKey: 5y5ZScTJGm0q0umHQOD4r3EfjRvCioUx
-  notify: https://nf.video/8081/api/
+  notify: https://galaxydvd.com/8085/api/
 
 #广告投放公众号
 advertisementwxapp:
@@ -174,7 +174,11 @@ google:
   clientId: 371004574299-hhj668e7g9mbvh3o4dentfniinmu6kfk.apps.googleusercontent.com
   clientSecret: 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
 
+feedback:
+  mail: lvsinco@gmail.com
+
+
 cryptomus:
   shopId: 15d39001-dec3-4949-8872-69b241825c5d
   shopKey: zk4alqQNueK2RiWH2YM3auEEDbCxYZGh2XsJQv3AdoJYASQkUxvaGR0ID81xIg1sm0H3ZMeWgDzIFlqMYJeqrBvQeFRHceEH83PABCiAYBeGp75XfqoUN8Oa1No1UYas
-  host: https://nf.video/8081/api/
+  host: https://galaxydvd.com/8085/api/