Jelajahi Sumber

镜像店铺后台

zoujiajian 1 tahun lalu
induk
melakukan
56fad82104

+ 7 - 0
netflix-service/src/main/java/com/cyksj/config/wxlogin/BaseWxOpenPlatConfig.java

@@ -44,5 +44,12 @@ public class BaseWxOpenPlatConfig {
 	 */
 	private String baRedirectUrl;
 
+	/**
+	 * 镜像店铺跳转url
+	 */
+	private String userMirrorShopRedirectUri;
+
+	private String userMirrorShopLoginUrl;
+
 	private String remark;
 }

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

@@ -848,6 +848,8 @@ public class RedisService {
         NF_SET_TIME_LIMIT("nf_set_time_limit:", "设置pin码", 60l),
         NF_KICKOUT_TIME_LIMIT("nf_kickout_time_limit:", "踢出奈飞设备", 60l),
         GOODS_WHOLESALE_KEY("yh_home_paghe_cache:wholesale_key", "平台批发", 60 * 60 * 4L),
+        USER_MIRROR_SHOP_BACK_LOGIN_KEY("user_mirror_shop_back_login:", "镜像店铺主后台key", 3 * 60),
+        USER_MIRROR_SHOP_AUTH_SUCCESS_KEY("user_mirror_shop_auth_success_key:%s", "镜像店铺主后台微信授权", 60 * 10),
         ;
 
         private String name;

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/CmsUserMirrorShopService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.mirrorshop;
+
+import com.cyksj.model.entity.User;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopService
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:07
+ */
+public interface CmsUserMirrorShopService {
+	void getLoginCode(Integer type, String login, Integer cid);
+
+	String yhShopManageRedirect(long userId);
+
+	User login(Integer type, String login, String code);
+}

+ 149 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/impl/CmsUserMirrorShopServiceImpl.java

@@ -0,0 +1,149 @@
+package com.cyksj.service.mirrorshop.impl;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.SmsUtil;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserMirrorShop;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mail.MailService;
+import com.cyksj.service.mirrorshop.CmsUserMirrorShopService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:07
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CmsUserMirrorShopServiceImpl implements CmsUserMirrorShopService {
+	private final UserMapper userMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final MailService mailService;
+
+	private final RedisService redisService;
+
+	@Override
+	public void getLoginCode(Integer type, String login, Integer cid) {
+		if (type > 2) {
+			throw BusinessRuntimeException.getInstance("");
+		}
+		if (cid == null) {
+			cid = 86;
+		}
+		String phone = null;
+		String email = null;
+		if (type == 1) phone = login;
+		else if (type == 2) email = login;
+		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+				.eq(StrUtil.isNotBlank(phone), User::getLoginPhone, phone)
+				.eq(StrUtil.isNotBlank(email), User::getEmail, email).last("limit 1"));
+		if (user == null) throw BusinessRuntimeException.getInstance("登录信息不存在");
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, user.getId()).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+
+		if (!shop.getStatus()) {
+			throw BusinessRuntimeException.getInstance("您的店铺已被禁用");
+		}
+
+		String CACHE_LOGIN_KEY = RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getName()  + login;
+		Object o = redisService.get(CACHE_LOGIN_KEY);
+		Long expire = redisService.getExpire(CACHE_LOGIN_KEY);
+		if (o != null && expire >= 3 * 60 - 10) {
+			throw BusinessRuntimeException.getInstance("获取验证码过于频繁");
+		}
+		String code = StringUtil.getRandomCodeStr(6);
+		if (type == 1) {
+			if (StrUtil.isEmpty(login) || (86 == cid && !Validator.isMobile(phone))) {
+				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			}
+			SmsUtil.sendTencent(cid, login, code);
+		} else if (type == 2) {
+			if (!Validator.isEmail(login)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+			}
+			mailService.sendLoginCodeEmailToPeople(code, login);
+		}
+		redisService.set(CACHE_LOGIN_KEY, code, RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getTimeout());
+	}
+
+	@Override
+	public String yhShopManageRedirect(long userId) {
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, userId).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+
+		if (!shop.getStatus()) {
+			throw BusinessRuntimeException.getInstance("您的店铺已被禁用");
+		}
+		return null;
+	}
+
+	@Override
+	public User login(Integer type, String login, String code) {
+		String phone = null;
+		String email = null;
+		if (type == null) {
+			type = 1;
+		}
+		if (type > 2) {
+			throw BusinessRuntimeException.getInstance("");
+		}
+		if (type == 1) phone = login;
+		if (type == 2) email = login;
+		if (StrUtil.isEmpty(code)) {
+			throw BusinessRuntimeException.getInstance("请输入验证码");
+		}
+		String CACHE_LOGIN_KEY = RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getName();
+		if (type == 1) {
+			if (StrUtil.isEmpty(phone)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			}
+			CACHE_LOGIN_KEY += phone;
+		} else if (type == 2) {
+			if (!Validator.isEmail(email)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+			}
+			CACHE_LOGIN_KEY += email;
+		}
+		String cache_code = String.valueOf(redisService.get(CACHE_LOGIN_KEY));
+		if (StrUtil.isBlank(cache_code) || !cache_code.equals(code)) {
+			throw BusinessRuntimeException.getInstance("验证码错误");
+		}
+		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+				.eq(StrUtil.isNotBlank(phone), User::getLoginPhone, phone)
+				.eq(StrUtil.isNotBlank(email), User::getEmail, email).last("limit 1"));
+		if (user == null) throw BusinessRuntimeException.getInstance("用户不存在");
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, user.getId()).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+
+		if (!shop.getStatus()) {
+			throw BusinessRuntimeException.getInstance("您的店铺已被禁用");
+		}
+		redisService.del(CACHE_LOGIN_KEY);
+		return user;
+	}
+}

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorAdvertiseController.java

@@ -0,0 +1,10 @@
+package com.cyksj.web.controller.manage.mirrorshop.manage;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorAdvertiseController
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:04
+ */
+public class CmsUserMirrorAdvertiseController {
+}

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorShopDataController.java

@@ -0,0 +1,10 @@
+package com.cyksj.web.controller.manage.mirrorshop.manage;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopDataController
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:03
+ */
+public class CmsUserMirrorShopDataController {
+}

+ 175 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorShopLoginController.java

@@ -0,0 +1,175 @@
+package com.cyksj.web.controller.manage.mirrorshop.manage;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.dto.AuthRedirect;
+import com.cyksj.model.dto.AuthToken;
+import com.cyksj.model.dto.CpsAuthDto;
+import com.cyksj.model.dto.GzhOAuth2UserInfo;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserMirrorShop;
+import com.cyksj.model.request.LoginReq;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.authorization.AuthorizationService;
+import com.cyksj.service.mirrorshop.CmsUserMirrorShopService;
+import com.cyksj.service.wechat.WeChatService;
+import com.cyksj.web.util.StpUserMirrorShopManageUser;
+import com.cyksj.web.util.StpUserUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopLoginController
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:03
+ */
+@RestController
+@RequestMapping("/mirrorShop/manage")
+@RequiredArgsConstructor
+public class CmsUserMirrorShopLoginController {
+	private final CmsUserMirrorShopService cmsUserMirrorShopService;
+
+	private final RedisService redisService;
+
+	private final static Sequence SEQUENCE = new Sequence(0);
+
+	private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
+
+	private final AuthorizationService authorizationService;
+
+	private final WeChatService weChatService;
+
+	private final UserMapper userMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	/**
+	 * 获取登录验证码
+	 */
+	@GetMapping("/get/LoginCode")
+	@NoSubmit
+	public Result getLoginCode(@RequestParam(defaultValue = "1") Integer type, String login, Integer cid) {
+		cmsUserMirrorShopService.getLoginCode(type, login, cid);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 跳转店铺后台 是否是店铺主
+	 */
+	@GetMapping("/redirect")
+	public void yhShopManageRedirect(String redirectUrl, HttpServletResponse response) throws IOException {
+		//银河官网token值
+		long userId = StpUserUtil.getLoginIdAsLong();
+		cmsUserMirrorShopService.yhShopManageRedirect(userId);
+		//校验通过重定向
+		StpUserMirrorShopManageUser.login(userId);
+		response.sendRedirect(redirectUrl.contains("?") ? redirectUrl + "&t=" + StpUserMirrorShopManageUser.getTokenValue() : redirectUrl + "?t=" + StpUserMirrorShopManageUser.getTokenValue());
+	}
+
+
+	/**
+	 * 手机号、邮箱登录
+	 */
+	@PostMapping("/login")
+	public Result login(@RequestBody LoginReq loginReq) {
+		User user = cmsUserMirrorShopService.login(loginReq.getType(), loginReq.getLogin(), loginReq.getCode());
+		StpUserMirrorShopManageUser.login(user.getId());
+		String yhShopToken = StpUserMirrorShopManageUser.getTokenValue();
+		JSONObject re = new JSONObject();
+		re.putOpt("satoken-ump", yhShopToken);
+		re.putOpt("img", user.getHeadimgurl());
+		re.putOpt("nickname", user.getNickname());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(re.toString());
+	}
+
+	/**
+	 * 小店后台微信授权登录
+	 */
+	@GetMapping("/wx/authLogin")
+	public Result<CpsAuthDto> wxAuthorize() throws Exception {
+		Object authUrlObj = redisService.get(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("ump", wxOpenPlatYHLXLoginConfig.getAppId()));
+		if (authUrlObj != null) {
+			CpsAuthDto cpsAuthDto = Jsons.parseObject(authUrlObj.toString(), CpsAuthDto.class);
+			return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
+		}
+		CpsAuthDto cpsAuthDto = new CpsAuthDto();
+		Long mappingId = SEQUENCE.nextId();
+		String authState = mappingId.toString();
+		redisService.set(authState, authState, 60 * 60 * 24L);
+		AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+		String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
+		String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getUserMirrorShopRedirectUri());
+		cpsAuthDto.setAuthUrl(wxAuthUrl);
+		cpsAuthDto.setAuthState(authState);
+		redisService.set(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("ump", wxOpenPlatYHLXLoginConfig.getAppId()), Jsons.toJson(cpsAuthDto), RedisService.key.WX_LOGIN_AUTH_URI.getTimeout());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
+	}
+
+	/**
+	 * 网页微信授权后跳转
+	 */
+	@GetMapping("/wx/authLogin/baseRedirect")
+	public void wxAuthLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
+		if (StrUtil.isEmpty(state)) throw BusinessRuntimeException.getInstance("授权错误,请重新授权");
+		String json = Codec.DoBase64.custom().setData(state).decodeAsText();
+		AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
+		AuthToken token = weChatService.getAuthToken(code, wxOpenPlatYHLXLoginConfig.getAppId());
+		GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
+		String unionId = userinfo.getUnionid();
+		String openId = userinfo.getOpenid();
+		User user = Optional.ofNullable(
+						userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUnionid, unionId)
+								.orderByAsc(User::getId)
+								.last("limit 1")))
+				.orElseGet(() -> userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId)
+						.orderByAsc(User::getId)
+						.last("limit 1")));
+		if (user == null) throw BusinessRuntimeException.getInstance("用户信息不存在");
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, user.getId()).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+		if (!shop.getStatus()) {
+			throw BusinessRuntimeException.getInstance("您的店铺已被禁用");
+		}
+		JSONObject res = new JSONObject();
+		StpUserMirrorShopManageUser.login(user.getId());
+		String cpsToken = StpUserMirrorShopManageUser.getTokenValue();
+		res.putOpt("satoken-ump", cpsToken);
+		res.putOpt("img", user.getHeadimgurl());
+		res.putOpt("nickname", user.getNickname());
+		redisService.set(RedisService.key.USER_MIRROR_SHOP_AUTH_SUCCESS_KEY.getNameFormat(re.getMappingId()), res.toString(), RedisService.key.USER_MIRROR_SHOP_AUTH_SUCCESS_KEY.getTimeout());
+		response.sendRedirect(wxOpenPlatYHLXLoginConfig.getUserMirrorShopLoginUrl());
+	}
+
+	/**
+	 * 店铺用户是否已授权
+	 */
+	@GetMapping("/get/userInfo")
+	public Result<String> getCpsUserInfo(String authState) {
+		String key = RedisService.key.USER_MIRROR_SHOP_AUTH_SUCCESS_KEY.getNameFormat(authState);
+		Object o = redisService.get(key);
+		if (o == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
+		redisService.del(key);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(o.toString());
+	}
+}

+ 324 - 0
netflix-web/src/main/java/com/cyksj/web/util/StpUserMirrorShopManageUser.java

@@ -0,0 +1,324 @@
+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 java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: StpUserMirrorShopManageUser
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:13
+ */
+public class StpUserMirrorShopManageUser {
+	// 使用匿名子类 重写`stpLogic对象`的一些方法
+	public static StpLogic stpLogic = new StpLogic("ump") {
+		// 重写 StpLogic 类下的 `splicingKeyTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
+		@Override
+		public String splicingKeyTokenName() {
+			return super.splicingKeyTokenName() + "-ump";
+		}
+		// 同理你可以按需重写一些其它方法 ...
+	};
+
+	public StpUserMirrorShopManageUser() {
+	}
+
+	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);
+	}
+}

+ 2 - 0
netflix-web/src/main/resources/application-pre.yml

@@ -145,6 +145,8 @@ wx-login:
   yhShopLoginUrl: https://shop.liuliangbang.vip/mall/admin/loginNexte
   baRedirectUrl: https://nf.video/8082/api/applets/market/task/bind/wx/baseRedirect
   cpsWebRedirectUri: https://inside.liuliangbang.vip/yinhe/cps/homePage
+  userMirrorShopRedirectUri: https://cps.nf.video/8082/api/mirrorShop/manage/wx/authLogin/baseRedirect
+  userMirrorShopLoginUrl: https://cps.nf.video/mall/admin/loginNexte
   remark: 银河录像网页微信登录
 
 wx-shop-login: