Merge branch 'develop' of https://gitee.com/likeadmin/likeadmin_java into develop

# Conflicts:
#	server/like-front/src/main/java/com/mdd/front/config/FrontConfig.java
This commit is contained in:
caijianhao 2022-12-20 15:50:21 +08:00
commit 864b54951a
9 changed files with 312 additions and 112 deletions

View File

@ -0,0 +1,47 @@
package com.mdd.admin.controller.channel;
import com.mdd.admin.service.IChannelOpService;
import com.mdd.admin.validate.channel.ChannelOpValidate;
import com.mdd.admin.vo.channel.ChannelOpVo;
import com.mdd.common.core.AjaxResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 微信开发平台渠道设置
*/
@RestController
@RequestMapping("api/channel/op")
public class ChannelOpController {
@Resource
IChannelOpService iChannelOpService;
/**
* 开放平台设置详情
*
* @author fzr
* @return AjaxResult<Object>
*/
@GetMapping("/detail")
public AjaxResult<Object> detail() {
ChannelOpVo vo = iChannelOpService.detail();
return AjaxResult.success(vo);
}
/**
* 开放平台设置保存
*
* @author fzr
* @param opValidate 参数
* @return AjaxResult<Object>
*/
@PostMapping("/save")
public AjaxResult<Object> save(@Validated @RequestBody ChannelOpValidate opValidate) {
iChannelOpService.save(opValidate);
return AjaxResult.success();
}
}

View File

@ -0,0 +1,27 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.channel.ChannelOpValidate;
import com.mdd.admin.vo.channel.ChannelOpVo;
/**
* 微信开放渠道设置接口服务类
*/
public interface IChannelOpService {
/**
* 开放平台设置详情
*
* @author fzr
* @return ChannelOpVo
*/
ChannelOpVo detail();
/**
* 开放平台设置保存
*
* @author fzr
* @param opValidate 参数
*/
void save(ChannelOpValidate opValidate);
}

View File

@ -0,0 +1,44 @@
package com.mdd.admin.service.impl;
import com.mdd.admin.service.IChannelOpService;
import com.mdd.admin.validate.channel.ChannelOpValidate;
import com.mdd.admin.vo.channel.ChannelOpVo;
import com.mdd.common.util.ConfigUtils;
import org.springframework.stereotype.Service;
/**
* 开放平台设置服务类
*/
@Service
public class ChannelOpServiceImpl implements IChannelOpService {
/**
* 开放平台设置详情
*
* @author fzr
* @return ChannelOpVo
*/
@Override
public ChannelOpVo detail() {
String appId = ConfigUtils.get("op_channel", "appId", "");
String appSecret = ConfigUtils.get("op_channel", "appSecret", "");
ChannelOpVo vo = new ChannelOpVo();
vo.setAppId(appId);
vo.setAppSecret(appSecret);
return vo;
}
/**
* 开放平台设置保存
*
* @author fzr
* @param opValidate 参数
*/
@Override
public void save(ChannelOpValidate opValidate) {
ConfigUtils.set("op_channel", "appId", opValidate.getAppId());
ConfigUtils.set("op_channel", "appSecret", opValidate.getAppId());
}
}

View File

@ -0,0 +1,19 @@
package com.mdd.admin.validate.channel;
import lombok.Data;
import java.io.Serializable;
/**
* 开发平台渠道参数
*/
@Data
public class ChannelOpValidate implements Serializable {
private static final long serialVersionUID = 1L;
private String appId;
private String appSecret;
}

View File

@ -0,0 +1,18 @@
package com.mdd.admin.vo.channel;
import lombok.Data;
import java.io.Serializable;
/**
* 开发平台Vo
*/
@Data
public class ChannelOpVo implements Serializable {
private static final long serialVersionUID = 1L;
private String appId;
private String appSecret;
}

View File

@ -30,6 +30,8 @@ public class FrontConfig {
"/api/article/list",
"/api/pc/getConfig",
"/api/pc/index",
"/api/login/getScanCode",
};
}

View File

@ -11,6 +11,10 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
/**
@ -104,4 +108,12 @@ public class LoginController {
return AjaxResult.success();
}
@GetMapping("/getScanCode")
public AjaxResult<Map<String, String>> getScanCode(HttpSession session) {
String qrcodeUrl = iLoginService.getScanCode(session);
Map<String, String> map = new LinkedHashMap<>();
map.put("url", qrcodeUrl);
return AjaxResult.success(map);
}
}

View File

@ -3,6 +3,7 @@ package com.mdd.front.service;
import com.mdd.front.validate.UserRegisterValidate;
import com.mdd.front.vo.LoginTokenVo;
import javax.servlet.http.HttpSession;
import java.util.Map;
/**
@ -19,13 +20,13 @@ public interface ILoginService {
void register(UserRegisterValidate userRegisterValidate);
/**
* 微信登录
* 账号登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
LoginTokenVo mnpLogin(Map<String, String> params);
LoginTokenVo accountLogin(Map<String, String> params);
/**
* 手机登录
@ -37,13 +38,13 @@ public interface ILoginService {
LoginTokenVo mobileLogin(Map<String, String> params);
/**
* 账号登录
* 微信登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
LoginTokenVo accountLogin(Map<String, String> params);
LoginTokenVo mnpLogin(Map<String, String> params);
/**
* 公众号登录
@ -71,4 +72,5 @@ public interface ILoginService {
*/
void forgotPassword(Map<String, String> params);
String getScanCode(HttpSession session);
}

View File

@ -27,6 +27,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
/**
@ -75,6 +78,81 @@ public class LoginServiceImpl implements ILoginService {
userMapper.insert(user);
}
/**
* 账号登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
@Override
public LoginTokenVo accountLogin(Map<String, String> params) {
Assert.notNull(params.get("username"), "username参数缺失!");
Assert.notNull(params.get("password"), "password参数缺失!");
String username = params.get("username");
String password = params.get("password");
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,password,salt,mobile,is_disable")
.eq("username", username)
.eq("is_delete", 0)
.last("limit 1"));
Assert.notNull(user, "账号不存在!");
String pwd = ToolsUtils.makeMd5(password+user.getSalt());
Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!");
Assert.isFalse(user.getIsDisable() != 0, "账号已被禁用!");
// 更新登录信息
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
return this.makeLoginToken(user.getId(), user.getMobile());
}
/**
* 手机号登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
@Override
public LoginTokenVo mobileLogin(Map<String, String> params) {
Assert.notNull(params.get("mobile"), "mobile参数缺失!");
Assert.notNull(params.get("code"), "code参数缺失!");
String mobile = params.get("mobile");
String code = params.get("code").toLowerCase();
// 校验验证码
int typeCode = NoticeEnum.SMS_LOGIN_CODE.getCode();
Object smsCode = RedisUtils.get(GlobalConfig.redisSmsCode+typeCode+":"+mobile);
if (StringUtils.isNull(smsCode) || !smsCode.toString().equals(code)) {
throw new OperateException("验证码错误!");
}
// 删除验证码
RedisUtils.del(GlobalConfig.redisSmsCode+typeCode+":"+mobile);
// 查询手机号
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,mobile,is_disable")
.eq("mobile", mobile)
.eq("is_delete", 0)
.last("limit 1"));
Assert.notNull(user, "账号不存在!");
Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!");
// 更新登录信息
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
return this.makeLoginToken(user.getId(), user.getMobile());
}
/**
* 微信小程序登录
*
@ -162,111 +240,13 @@ public class LoginServiceImpl implements ILoginService {
userMapper.updateById(user);
}
String token = ToolsUtils.makeToken();
int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"));
RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime);
LoginTokenVo vo = new LoginTokenVo();
vo.setId(userId);
vo.setIsBindMobile(!user.getMobile().equals(""));
vo.setToken(token);
return vo;
return this.makeLoginToken(userId, user.getMobile());
} catch (WxErrorException e) {
throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg());
}
}
/**
* 手机号登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
@Override
public LoginTokenVo mobileLogin(Map<String, String> params) {
Assert.notNull(params.get("mobile"), "mobile参数缺失!");
Assert.notNull(params.get("code"), "code参数缺失!");
String mobile = params.get("mobile");
String code = params.get("code").toLowerCase();
// 校验验证码
int typeCode = NoticeEnum.SMS_LOGIN_CODE.getCode();
Object smsCode = RedisUtils.get(GlobalConfig.redisSmsCode+typeCode+":"+mobile);
if (StringUtils.isNull(smsCode) || !smsCode.toString().equals(code)) {
throw new OperateException("验证码错误!");
}
// 删除验证码
RedisUtils.del(GlobalConfig.redisSmsCode+typeCode+":"+mobile);
// 查询手机号
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,mobile,is_disable")
.eq("mobile", mobile)
.eq("is_delete", 0)
.last("limit 1"));
Assert.notNull(user, "账号不存在!");
Assert.isFalse(user.getIsDisable() != 0, "账号已禁用!");
// 更新登录信息
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
String token = ToolsUtils.makeToken();
int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"));
RedisUtils.set(FrontConfig.frontendTokenKey+token, user.getId(), tokenValidTime);
LoginTokenVo vo = new LoginTokenVo();
vo.setId(user.getId());
vo.setIsBindMobile(!user.getMobile().equals(""));
vo.setToken(token);
return vo;
}
/**
* 账号登录
*
* @author fzr
* @param params 参数
* @return LoginTokenVo
*/
@Override
public LoginTokenVo accountLogin(Map<String, String> params) {
Assert.notNull(params.get("username"), "username参数缺失!");
Assert.notNull(params.get("password"), "password参数缺失!");
String username = params.get("username");
String password = params.get("password");
User user = userMapper.selectOne(new QueryWrapper<User>()
.select("id,username,password,salt,mobile,is_disable")
.eq("username", username)
.eq("is_delete", 0)
.last("limit 1"));
Assert.notNull(user, "账号不存在!");
String pwd = ToolsUtils.makeMd5(password+user.getSalt());
Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!");
Assert.isFalse(user.getIsDisable() != 0, "账号已被禁用!");
// 更新登录信息
user.setLastLoginIp(IpUtils.getHostIp());
user.setLastLoginTime(System.currentTimeMillis() / 1000);
userMapper.updateById(user);
String token = ToolsUtils.makeToken();
int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"))+1;
RedisUtils.set(FrontConfig.frontendTokenKey+token, user.getId(), tokenValidTime-1);
LoginTokenVo vo = new LoginTokenVo();
vo.setId(user.getId());
vo.setIsBindMobile(!user.getMobile().equals(""));
vo.setToken(token);
return vo;
}
/**
* 公众号登录
*
@ -341,15 +321,7 @@ public class LoginServiceImpl implements ILoginService {
userMapper.updateById(user);
}
String token = ToolsUtils.makeToken();
int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"))+1;
RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime-1);
LoginTokenVo vo = new LoginTokenVo();
vo.setId(user.getId());
vo.setIsBindMobile(!user.getMobile().equals(""));
vo.setToken(token);
return vo;
return this.makeLoginToken(userId, user.getMobile());
} catch (WxErrorException e) {
throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg());
}
@ -414,6 +386,63 @@ public class LoginServiceImpl implements ILoginService {
userMapper.updateById(user);
}
/**
* 扫码链接
*
* @author fzr
* @param session session
* @return String
*/
@Override
public String getScanCode(HttpSession session) {
// 获取AppId
String appId = ConfigUtils.get("op_channel", "appId", "");
// 微信开放平台授权
String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=%s" +
"&redirect_uri=%s" +
"&response_type=code" +
"&scope=snsapi_login" +
"&state=%s" +
"#wechat_redirect";
// 回调地址
String redirectUrl = "https://www.baidu.com/";
try {
redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new OperateException(e.getMessage());
}
// 防止csrf攻击
String state = ToolsUtils.makeUUID().replaceAll("-", "");
RedisUtils.set("wechat-open-state-"+session.getId(), state, 600);
//生成qrcodeUrl
return String.format(baseUrl, appId, redirectUrl, state);
}
/**
* 生成登录Token
*
* @author fzr
* @param userId 用户ID
* @param mobile 用户手机
* @return LoginTokenVo
*/
private LoginTokenVo makeLoginToken(Integer userId, String mobile) {
String token = ToolsUtils.makeToken();
int tokenValidTime = Integer.parseInt(YmlUtils.get("like.token-valid-time"));
RedisUtils.set(FrontConfig.frontendTokenKey+token, userId, tokenValidTime);
LoginTokenVo vo = new LoginTokenVo();
vo.setId(userId);
vo.setIsBindMobile(!mobile.equals(""));
vo.setToken(token);
return vo;
}
/**
* 生成用户编号
*