|
|
@@ -3,16 +3,21 @@ package com.fs.app.controller;
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.fs.app.annotation.Login;
|
|
|
import com.fs.app.param.*;
|
|
|
+import com.fs.app.utils.UniVerifyUtil;
|
|
|
import com.fs.app.utils.WxUtil;
|
|
|
import com.fs.common.VerifyCodeUtil;
|
|
|
import com.fs.common.annotation.RepeatSubmit;
|
|
|
import com.fs.common.core.domain.R;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
+import com.fs.common.exception.CustomException;
|
|
|
import com.fs.common.exception.ServiceException;
|
|
|
import com.fs.common.service.ISmsService;
|
|
|
+import com.fs.common.utils.ServletUtils;
|
|
|
+import com.fs.common.utils.ip.IpUtils;
|
|
|
import com.fs.common.utils.sign.Md5Utils;
|
|
|
import com.fs.company.domain.CompanyUser;
|
|
|
import com.fs.company.service.ICompanyUserService;
|
|
|
@@ -21,19 +26,15 @@ import com.fs.course.domain.FsCoursePlaySourceConfig;
|
|
|
import com.fs.course.service.IFsCoursePlaySourceConfigService;
|
|
|
import com.fs.course.utils.FsCoursePlaySourceConfigQuery;
|
|
|
import com.fs.his.domain.FsUser;
|
|
|
-import com.fs.his.domain.FsUserNewTask;
|
|
|
import com.fs.his.mapper.FsUserMapper;
|
|
|
import com.fs.his.service.IFsUserCouponService;
|
|
|
import com.fs.his.service.IFsUserNewTaskService;
|
|
|
import com.fs.his.service.IFsUserService;
|
|
|
import com.fs.his.vo.FsUserRegisterParam;
|
|
|
import com.fs.im.service.OpenIMService;
|
|
|
-import com.fs.watch.domain.WatchDeviceSetup;
|
|
|
-import com.fs.watch.domain.WatchUser;
|
|
|
-import com.fs.watch.service.WatchUserService;
|
|
|
+import com.fs.lotus.utils.SignatureUtil;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
-import lombok.Synchronized;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.ibatis.annotations.Param;
|
|
|
@@ -43,14 +44,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
-
|
|
|
-import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
-import static com.fs.his.utils.PhoneUtil.encryptPhone;
|
|
|
-import static com.fs.his.utils.PhoneUtil.encryptPhoneOldKey;
|
|
|
+import static com.fs.his.utils.PhoneUtil.*;
|
|
|
|
|
|
@Api("app登录接口")
|
|
|
@RestController
|
|
|
@@ -85,6 +83,10 @@ public class AppLoginController extends AppBaseController{
|
|
|
private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
|
|
|
@Autowired
|
|
|
private OpenIMService openIMService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UniVerifyUtil uniVerifyUtil;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ICompanyUserService companyUserService;
|
|
|
|
|
|
@@ -143,8 +145,10 @@ public class AppLoginController extends AppBaseController{
|
|
|
switch (loginType) {
|
|
|
case 1:
|
|
|
return handleLoginType1(param);
|
|
|
- case 3:
|
|
|
- return handleLoginType3(param);
|
|
|
+// case 3:
|
|
|
+// return handleLoginType3(param);
|
|
|
+ case 4:
|
|
|
+ return handleLoginType4(param);
|
|
|
default:
|
|
|
return R.error("请选择正确的登陆类型!");
|
|
|
}
|
|
|
@@ -671,7 +675,7 @@ public class AppLoginController extends AppBaseController{
|
|
|
deleteUser = user;
|
|
|
}
|
|
|
keepUser.setUnionId(unionid);
|
|
|
- keepUser.setPhone(param.getPhone());
|
|
|
+ keepUser.setPhone(decryptPhone(param.getPhone()));
|
|
|
keepUser.setSource(param.getSource() != null ? param.getSource() : null );
|
|
|
keepUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
|
|
|
keepUser.setNickName(nickname);
|
|
|
@@ -1082,4 +1086,341 @@ public class AppLoginController extends AppBaseController{
|
|
|
return R.ok().put("data",openIMService.getFriendList(userRequestParam.getUserID(),userRequestParam.getPagination().getPageNumber(),userRequestParam.getPagination().getShowNumber(),userRequestParam.getApplyType()));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * UniApp 一键登录-多账号选择。
|
|
|
+ * 【安全要求】禁止仅凭 userId 发 Token:必须携带有效 accessToken+openId,经 uniCloud 校验换取手机号后,
|
|
|
+ * 再校验 userId 属于该手机号下账号(见 handleSecurePhoneLoginByUserId)。缺少第三方凭证时一律拒绝。
|
|
|
+ */
|
|
|
+ @ApiOperation("UniApp一键登录选择账号(安全)")
|
|
|
+ @PostMapping("/loginByUserIdUniverify")
|
|
|
+ @Transactional
|
|
|
+ public R loginByUserIdUniverify(@RequestBody FsUserLoginParam param) {
|
|
|
+ if (StringUtils.isEmpty(param.getAccessToken()) || StringUtils.isEmpty(param.getOpenId())) {
|
|
|
+ return R.error("一键登录凭证不完整");
|
|
|
+ }
|
|
|
+ String phone;
|
|
|
+ try {
|
|
|
+ phone = uniVerifyUtil.getPhoneNumber(param.getAccessToken(), param.getOpenId());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("UniVerify获取手机号失败: {}", e.getMessage());
|
|
|
+ return R.error("获取手机号失败,请重试");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(phone)) {
|
|
|
+ return R.error("获取手机号失败");
|
|
|
+ }
|
|
|
+ param.setPhone(phone);
|
|
|
+ return handleSecurePhoneLoginByUserId(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ @ApiOperation("UniApp一键登录(安全)")
|
|
|
+ @PostMapping("/loginByUniverify")
|
|
|
+ @Transactional
|
|
|
+ public R loginByUniverify(@RequestBody FsUserLoginParam param) {
|
|
|
+ if (StringUtils.isEmpty(param.getAccessToken()) || StringUtils.isEmpty(param.getOpenId())) {
|
|
|
+ return R.error("一键登录凭证不完整");
|
|
|
+ }
|
|
|
+ String phone;
|
|
|
+ try {
|
|
|
+ phone = uniVerifyUtil.getPhoneNumber(param.getAccessToken(), param.getOpenId());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("UniVerify获取手机号失败: {}", e.getMessage());
|
|
|
+ return R.error("获取手机号失败,请重试");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(phone)) {
|
|
|
+ return R.error("获取手机号失败");
|
|
|
+ }
|
|
|
+ param.setPhone(phone);
|
|
|
+ return handleSecurePhoneLogin(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ @ApiOperation("绑定手机号")
|
|
|
+ @PostMapping("/setPhoneOne")
|
|
|
+ public R setPhoneOne(@Validated @RequestBody FsUserEditPhoneParam param) {
|
|
|
+ if (StringUtils.isEmpty(param.getAccessToken()) || StringUtils.isEmpty(param.getOpenId())) {
|
|
|
+ return R.error("一键登录凭证不完整");
|
|
|
+ }
|
|
|
+ String phone;
|
|
|
+ try {
|
|
|
+ phone = uniVerifyUtil.getPhoneNumber(param.getAccessToken(), param.getOpenId());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("UniVerify获取手机号失败: {}", e.getMessage());
|
|
|
+ return R.error("获取手机号失败,请重试");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(phone)) {
|
|
|
+ return R.error("获取手机号失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ param.setPhone(phone);
|
|
|
+
|
|
|
+ FsUser user = userService.selectFsUserByUnionid(param.getUnionId());
|
|
|
+ if (user == null) {
|
|
|
+ return R.error("用户数据不存在");
|
|
|
+ }
|
|
|
+ //验证码绑定,需要校验验证码
|
|
|
+ if (param.getBindType()!=null){
|
|
|
+ String encryptPhone = encryptPhone(param.getPhone());
|
|
|
+ String redisCode = redisCache.getCacheObject("sms:code:" + encryptPhone);
|
|
|
+ if (StringUtils.isEmpty(redisCode)){
|
|
|
+ return R.error("验证码已过期,请重新发送");
|
|
|
+ }
|
|
|
+ if (!redisCode.equals(param.getCode())) {
|
|
|
+ return R.error("验证码错误");
|
|
|
+ }
|
|
|
+ redisCache.deleteObject("sms:code:" + encryptPhone);
|
|
|
+ }
|
|
|
+ FsUser userMap = findUserByPhone(param.getPhone());
|
|
|
+ //绑定的手机号已存在用户的情况,将微信登录的时候创建的新号的UnionId移动到老号中,删除新号(将两个号合并)
|
|
|
+ if (userMap!=null){
|
|
|
+ if (userMap.getUserId().equals(user.getUserId())) {
|
|
|
+ user.setPhone(param.getPhone());
|
|
|
+ user.setLoginDevice(param.getLoginDevice());
|
|
|
+ user.setHistoryApp("app");
|
|
|
+ if (user.getFirstLoginTime() == null) {
|
|
|
+ user.setFirstLoginTime(new Date());
|
|
|
+ }
|
|
|
+ user.setSource(param.getSource());
|
|
|
+ userService.updateFsUser(user);
|
|
|
+ return generateTokenAndReturn(user);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(userMap.getUnionId())&&!userMap.getUnionId().equals(user.getUnionId())){
|
|
|
+ return R.error("该手机号已绑定其他微信");
|
|
|
+ }
|
|
|
+ //如果存在手机号也有用户,微信也有用户,保留创建时间比较久的用户
|
|
|
+ FsUser keepUser;
|
|
|
+ FsUser deleteUser;
|
|
|
+ if (userMap.getCreateTime().before(user.getCreateTime())){
|
|
|
+ keepUser = userMap;
|
|
|
+ deleteUser = user;
|
|
|
+ }else {
|
|
|
+ keepUser = user;
|
|
|
+ deleteUser = userMap;
|
|
|
+ }
|
|
|
+ keepUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
|
|
|
+ keepUser.setSource(param.getSource());
|
|
|
+ keepUser.setHistoryApp("app");
|
|
|
+ if (keepUser.getFirstLoginTime() == null) {
|
|
|
+ keepUser.setFirstLoginTime(new Date());
|
|
|
+ }
|
|
|
+ keepUser.setUnionId(user.getUnionId());
|
|
|
+ keepUser.setPhone(param.getPhone());
|
|
|
+ keepUser.setIntegral(keepUser.getIntegral()+deleteUser.getIntegral());
|
|
|
+ if (userService.updateFsUser(keepUser)>0){
|
|
|
+ userService.deleteFsUserByUserId(deleteUser.getUserId());
|
|
|
+ return generateTokenAndReturn(keepUser);
|
|
|
+ }
|
|
|
+ return R.error("绑定手机号失败");
|
|
|
+ }
|
|
|
+ user.setPhone(param.getPhone());
|
|
|
+ user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null );
|
|
|
+ user.setHistoryApp("app");
|
|
|
+ if (user.getFirstLoginTime() == null) {
|
|
|
+ user.setFirstLoginTime(new Date());
|
|
|
+ }
|
|
|
+ user.setSource(param.getSource()!= null ? param.getSource() : null);
|
|
|
+ userMap = new FsUser();
|
|
|
+ userMap.setLoginDevice(param.getLoginDevice());
|
|
|
+ userMap.setHistoryApp("app");
|
|
|
+ if (userMap.getFirstLoginTime() == null) {
|
|
|
+ userMap.setFirstLoginTime(new Date());
|
|
|
+ }
|
|
|
+ userMap.setSource(param.getSource());
|
|
|
+ if (StringUtils.isEmpty(user.getNickName()) || user.getNickName().equals("匿名用户**")) {
|
|
|
+ userMap.setNickName("匿名用户" + param.getPhone().substring(param.getPhone().length() - 4));
|
|
|
+ }
|
|
|
+ userMap.setUserId(user.getUserId());
|
|
|
+ userMap.setPhone(param.getPhone());
|
|
|
+ if (userService.updateFsUser(userMap)>0){
|
|
|
+ return generateTokenAndReturn(user);
|
|
|
+ }
|
|
|
+ return R.error("绑定手机号失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ @ApiOperation("绑定手机号")
|
|
|
+ @PostMapping("/setIPhoneNumberOne")
|
|
|
+ public R setIPhoneNumberOne(@Validated @RequestBody FsUserEditPhoneParam param) {
|
|
|
+ if (StringUtils.isEmpty(param.getAccessToken()) || StringUtils.isEmpty(param.getOpenId())) {
|
|
|
+ return R.error("一键登录凭证不完整");
|
|
|
+ }
|
|
|
+ String phone;
|
|
|
+ try {
|
|
|
+ phone = uniVerifyUtil.getPhoneNumber(param.getAccessToken(), param.getOpenId());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("UniVerify获取手机号失败: {}", e.getMessage());
|
|
|
+ return R.error("获取手机号失败,请重试");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(phone)) {
|
|
|
+ return R.error("获取手机号失败");
|
|
|
+ }
|
|
|
+ param.setPhone(phone);
|
|
|
+
|
|
|
+ FsUser userMap = findUserByPhone(param.getPhone());
|
|
|
+ if (userMap != null) {
|
|
|
+ if (StringUtils.isNotEmpty(userMap.getAppleKey()) && StringUtils.isNotEmpty(param.getAppleKey()) && !param.getAppleKey().equals(userMap.getAppleKey())) {
|
|
|
+ return R.error("该手机号已绑定其他账号");
|
|
|
+ }
|
|
|
+ if (param.getSimExist() == 0 && !Md5Utils.hash(param.getPassword()).equals(userMap.getPassword())) {
|
|
|
+ return R.error("密码不正确");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ userMap = createNewAppleUser(param, param.getPhone());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ userMap.setLoginDevice(param.getLoginDevice());
|
|
|
+ userMap.setHistoryApp("app");
|
|
|
+ if (userMap.getFirstLoginTime() == null) {
|
|
|
+ userMap.setFirstLoginTime(new Date());
|
|
|
+ }
|
|
|
+ userMap.setSource(param.getSource());
|
|
|
+ if (StringUtils.isEmpty(userMap.getNickName()) || userMap.getNickName().equals("匿名用户**")) {
|
|
|
+ userMap.setNickName("苹果用户" + param.getPhone().substring(param.getPhone().length() - 4));
|
|
|
+ }
|
|
|
+ userMap.setAppleKey(param.getAppleKey());
|
|
|
+ if (userService.updateFsUser(userMap)>0){
|
|
|
+ return generateTokenAndReturn(userMap);
|
|
|
+ }
|
|
|
+ return R.error("绑定手机号失败");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 多账号场景下按 userId 登录,手机号已由 uniCloud 校验
|
|
|
+ */
|
|
|
+ private R handleSecurePhoneLoginByUserId(FsUserLoginParam param) {
|
|
|
+ List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
|
|
|
+ if (CollectionUtil.isEmpty(usersByPhone)) {
|
|
|
+ return R.error("账号不存在,请先注册账号");
|
|
|
+ }
|
|
|
+ if (usersByPhone.size() == 1) {
|
|
|
+ FsUser user = usersByPhone.get(0);
|
|
|
+ if (StringUtils.isNotEmpty(param.getJpushId())) {
|
|
|
+ updateExistingUserJpushId(user, param.getJpushId());
|
|
|
+ }
|
|
|
+ updateLoginDevice(user.getUserId(), param.getLoginDevice(), param.getSource());
|
|
|
+ return generateTokenAndReturn(user);
|
|
|
+ }
|
|
|
+ if (param.getUserId() == null) {
|
|
|
+ return R.error("请选择登录账号");
|
|
|
+ }
|
|
|
+ for (FsUser fsUser : usersByPhone) {
|
|
|
+ if (fsUser.getUserId().equals(param.getUserId())) {
|
|
|
+ if (StringUtils.isNotEmpty(param.getJpushId())) {
|
|
|
+ updateExistingUserJpushId(fsUser, param.getJpushId());
|
|
|
+ }
|
|
|
+ updateLoginDevice(fsUser.getUserId(), param.getLoginDevice(), param.getSource());
|
|
|
+ return generateTokenAndReturn(fsUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return R.error("账号不匹配,请检查账号");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新用户登录设备信息
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param loginDevice 登录设备
|
|
|
+ * @param source 来源
|
|
|
+ */
|
|
|
+ private void updateLoginDevice(Long userId, String loginDevice, String source) {
|
|
|
+ FsUser updateUser = new FsUser();
|
|
|
+ updateUser.setUserId(userId);
|
|
|
+ if (StringUtils.isNotBlank(loginDevice)) {
|
|
|
+ updateUser.setLoginDevice(loginDevice);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(source)) {
|
|
|
+ updateUser.setSource(source);
|
|
|
+ }
|
|
|
+ updateUser.setLastIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
|
|
+ userService.updateFsUser(updateUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * UniApp 一键登录(安全):手机号已由 uniCloud 校验,不信任客户端传入
|
|
|
+ * <ul>
|
|
|
+ * <li>无用户 → 自动注册新用户</li>
|
|
|
+ * <li>单用户 → 直接登录</li>
|
|
|
+ * <li>多用户 → 返回 users 列表,前端选择后调 /loginByUserIdUniverify</li>
|
|
|
+ * </ul>
|
|
|
+ */
|
|
|
+ private R handleSecurePhoneLogin(FsUserLoginParam param) {
|
|
|
+ String phone = param.getPhone();
|
|
|
+ List<FsUser> usersByPhone = findUsersByPhone(phone);
|
|
|
+ if (CollectionUtil.isEmpty(usersByPhone)) {
|
|
|
+ // 新用户自动注册
|
|
|
+ String appid = openProperties.getAppId();
|
|
|
+ param.setAppId(appid);
|
|
|
+ FsUser newUser = createNewUser(param);
|
|
|
+ if (StringUtils.isNotEmpty(param.getJpushId())) {
|
|
|
+ updateExistingUserJpushId(newUser, param.getJpushId());
|
|
|
+ }
|
|
|
+ updateLoginDevice(newUser.getUserId(), param.getLoginDevice(), param.getSource());
|
|
|
+ R r = generateTokenAndReturn(newUser);
|
|
|
+ r.put("isNew", true);
|
|
|
+ return r;
|
|
|
+ }
|
|
|
+ if (usersByPhone.size() == 1) {
|
|
|
+ FsUser user = usersByPhone.get(0);
|
|
|
+ // 历史用户首次一键登录:手机号还是明文,加密后落库
|
|
|
+ if (user.getUnionId() == null) {
|
|
|
+ if (user.getPhone() != null && user.getPhone().length() <= 11) {
|
|
|
+ FsUser fsUser = new FsUser();
|
|
|
+ fsUser.setUserId(user.getUserId());
|
|
|
+ fsUser.setPhone(encryptPhone(phone));
|
|
|
+ userMapper.updateFsUser(fsUser);
|
|
|
+ }
|
|
|
+ return R.ok().put("isNew", true).put("phone", encryptPhone(phone));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(param.getJpushId())) {
|
|
|
+ updateExistingUserJpushId(user, param.getJpushId());
|
|
|
+ }
|
|
|
+ updateLoginDevice(user.getUserId(), param.getLoginDevice(), param.getSource());
|
|
|
+ return generateTokenAndReturn(user);
|
|
|
+ }
|
|
|
+ // 多账号场景,脱敏后返回让前端选择
|
|
|
+ for (FsUser fsUser : usersByPhone) {
|
|
|
+ fsUser.setPhone("***********");
|
|
|
+ }
|
|
|
+ return R.ok().put("users", usersByPhone);
|
|
|
+ }
|
|
|
+
|
|
|
+ private R handleLoginType4(FsUserLoginParam param) {
|
|
|
+ if (param.getUserId() == null || StringUtils.isEmpty(param.getSign()) || param.getTimestamp() == null) {
|
|
|
+ return R.error("登录参数不完整");
|
|
|
+ }
|
|
|
+ // 验签
|
|
|
+ JSONObject reqJson = new JSONObject();
|
|
|
+ reqJson.put("userId", param.getUserId());
|
|
|
+ if (!SignatureUtil.verifySignature(param.getTimestamp(), reqJson.toString(), param.getSign())) {
|
|
|
+ return R.error("签名验证失败");
|
|
|
+ }
|
|
|
+ // 签名一次性:同一 sign 5 分钟内只能换票一次,防止截包重放
|
|
|
+ String usedKey = "lotus:login:sign:" + param.getSign();
|
|
|
+ if (!redisCache.setIfAbsent(usedKey, "1", 300, TimeUnit.SECONDS)) {
|
|
|
+ return R.error("登录凭证已失效,请重新授权");
|
|
|
+ }
|
|
|
+ Long userId = param.getUserId();
|
|
|
+ FsUser fsUser = userMapper.selectFsUserByUserId(userId);
|
|
|
+ if (fsUser == null) {
|
|
|
+ return R.error("用户不存在");
|
|
|
+ }
|
|
|
+ String token = jwtUtils.generateToken(userId);
|
|
|
+ redisCache.setCacheObject("userToken:" + userId, token, 604800, TimeUnit.SECONDS);
|
|
|
+ JSONObject res = new JSONObject();
|
|
|
+ res.put("token", token);
|
|
|
+ res.put("user", fsUser);
|
|
|
+ return R.ok().put("data", res);
|
|
|
+ }
|
|
|
+
|
|
|
}
|