小程序相关改动

master
管理员 3 years ago
parent d07828d2d9
commit a58f440e00

@ -16,7 +16,6 @@
</description> </description>
<dependencies> <dependencies>
<!-- spring-boot-devtools --> <!-- spring-boot-devtools -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -105,6 +104,15 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version> <version>${spring-boot.version}</version>
<dependencies>
<!--这个plugin是给mvn用的 mvn spring-boot:run -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
<configuration> <configuration>
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 --> <fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
</configuration> </configuration>

@ -1,6 +1,7 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.HashMap; import java.util.HashMap;
@ -38,6 +40,7 @@ public class SysLoginController {
private final SysLoginService loginService; private final SysLoginService loginService;
private final ISysMenuService menuService; private final ISysMenuService menuService;
private final ISysUserService userService; private final ISysUserService userService;
private final RuoYiConfig config;
/** /**
* *
@ -47,13 +50,10 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/login") @PostMapping("/login")
public R<Map<String, Object>> login(@Validated @RequestBody LoginBody loginBody) { public R<?> login(@Validated @RequestBody LoginBody loginBody) {
Map<String, Object> ajax = new HashMap<>();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid()); loginBody.getUuid());
ajax.put(Constants.TOKEN, token); return R.map().put(Constants.TOKEN, token);
return R.ok(ajax);
} }
/** /**
@ -64,12 +64,9 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/smsLogin") @PostMapping("/smsLogin")
public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { public R<?> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
Map<String, Object> ajax = new HashMap<>();
// 生成令牌
String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
ajax.put(Constants.TOKEN, token); return R.map().put(Constants.TOKEN,token);
return R.ok(ajax);
} }
/** /**
@ -80,12 +77,41 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/xcxLogin") @PostMapping("/xcxLogin")
public R<Map<String, Object>> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) { public R<?> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
Map<String, Object> ajax = new HashMap<>();
// 生成令牌
String token = loginService.xcxLogin(xcxCode); String token = loginService.xcxLogin(xcxCode);
ajax.put(Constants.TOKEN, token); return R.map().put(Constants.TOKEN,token);
return R.ok(ajax); }
@SaIgnore
@PostMapping("/openid")
public R<?> xcxOpenid(@NotBlank(message = "{xcx.code.not.blank}") String openid) {
if(!config.getDev()){
throw new RuntimeException("未开发环境不允许直接使用openid登录");
}
String token = loginService.xcxLoginByOpenId(openid);
return R.map().put(Constants.TOKEN,token);
}
@SaIgnore
@PostMapping("/xcxRegLogin")
public R<?> xcxRegLogin(@NotBlank(message = "{xcx.code.not.blank}") String code,
MultipartFile avatar,
@NotBlank(message = "{not.null}") String nickname) {
String token = loginService.xcxRegLogin(code,avatar,nickname);
return R.map().put(Constants.TOKEN,token);
}
@SaIgnore
@PostMapping("/xcxRegLoginByOpenid")
public R<?> xcxRegLoginByOpenid(String openid, MultipartFile avatar, String nickname) {
if(!config.getDev()){
throw new RuntimeException("未开发环境不允许直接使用openid登录");
}
String token = loginService.xcxRegLoginByOpenid(openid,avatar,nickname);
return R.map().put(Constants.TOKEN,token);
} }
/** /**
@ -104,14 +130,12 @@ public class SysLoginController {
* @return * @return
*/ */
@GetMapping("getInfo") @GetMapping("getInfo")
public R<Map<String, Object>> getInfo() { public R<?> getInfo() {
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
SysUser user = userService.selectUserById(loginUser.getUserId()); SysUser user = userService.selectUserById(loginUser.getUserId());
Map<String, Object> ajax = new HashMap<>(); return R.map().put("user", user)
ajax.put("user", user); .put("roles", loginUser.getRolePermission())
ajax.put("roles", loginUser.getRolePermission()); .put("permissions", loginUser.getMenuPermission());
ajax.put("permissions", loginUser.getMenuPermission());
return R.ok(ajax);
} }
/** /**

@ -14,6 +14,21 @@ ruoyi:
addressEnabled: true addressEnabled: true
# 缓存懒加载 # 缓存懒加载
cacheLazy: false cacheLazy: false
# 小程序的用户默认设置
default-user:
# 所在单位
dept-id: 101
# 用户类型
user-type: app_user
# 帐号状态0正常 1停用
status: 0
# 用户组
role-ids:
- 2
# 岗位组
post-ids:
- 4
wx: wx:
miniapp: miniapp:
@ -27,9 +42,9 @@ wx:
captcha: captcha:
# 页面 <参数设置> 可开启关闭 验证码校验 # 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证 # 验证码类型 math 数组计算 char 字符验证
type: MATH type: char
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE category: shear
# 数字验证码位数 # 数字验证码位数
numberLength: 1 numberLength: 1
# 字符验证码长度 # 字符验证码长度
@ -108,6 +123,9 @@ spring:
deserialization: deserialization:
# 允许对象忽略json中不存在的属性 # 允许对象忽略json中不存在的属性
fail_on_unknown_properties: false fail_on_unknown_properties: false
# 不输出null
default-property-inclusion: non_null
# Sa-Token配置 # Sa-Token配置
sa-token: sa-token:
@ -128,7 +146,7 @@ sa-token:
# token前缀 # token前缀
token-prefix: "Bearer" token-prefix: "Bearer"
# jwt秘钥 # jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz jwt-secret-key: a1b2c3defg8hi9jkl46mnop3qrstu5vwxyz
# security配置 # security配置
security: security:

@ -1,5 +1,8 @@
package com.ruoyi.common.config; package com.ruoyi.common.config;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.enums.UserType;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
@ -54,4 +57,27 @@ public class RuoYiConfig {
RuoYiConfig.addressEnabled = addressEnabled; RuoYiConfig.addressEnabled = addressEnabled;
} }
private DefaultUser defaultUser = new DefaultUser();
@Data
public class DefaultUser {
private Long deptId = 100L;
private String userType = UserType.APP_USER.getUserType();
/**
* 0 1
*/
private String status = UserStatus.OK.getCode();
/**
*
*/
private Long[] roleIds = {2L};
/**
*
*/
private Long[] postIds = {4L};
}
} }

@ -126,7 +126,9 @@ public class R<T> implements Serializable {
public static R<Map<String, ?>> map(){ public static R<Map<String, ?>> map(){
R<Map<String, ?>> r = new R<>(); R<Map<String, ?>> r = new R<>();
r.setData(new HashMap<>()); r.setCode(SUCCESS);
r.setMsg("操作成功");
r.setData(new HashMap<>(10));
return r; return r;
} }
@ -142,7 +144,9 @@ public class R<T> implements Serializable {
public static R<List<?>> list(){ public static R<List<?>> list(){
R<List<?>> r = new R<>(); R<List<?>> r = new R<>();
r.setData(new ArrayList<>()); r.setData(new ArrayList<>(10));
r.setCode(SUCCESS);
r.setMsg("操作成功");
return r; return r;
} }
@ -155,4 +159,5 @@ public class R<T> implements Serializable {
throw new RuntimeException("data does not belong to List"); throw new RuntimeException("data does not belong to List");
} }
} }
} }

@ -41,6 +41,8 @@ public class SysUser extends BaseEntity {
*/ */
private Long deptId; private Long deptId;
private String openid;
/** /**
* *
*/ */

@ -20,7 +20,7 @@ public class CaptchaConfig {
private static final int WIDTH = 160; private static final int WIDTH = 160;
private static final int HEIGHT = 60; private static final int HEIGHT = 60;
private static final Color BACKGROUND = Color.PINK; private static final Color BACKGROUND = Color.white;
private static final Font FONT = new Font("Arial", Font.BOLD, 48); private static final Font FONT = new Font("Arial", Font.BOLD, 48);
/** /**

@ -22,12 +22,12 @@ public class SaPermissionImpl implements StpInterface {
public List<String> getPermissionList(Object loginId, String loginType) { public List<String> getPermissionList(Object loginId, String loginType) {
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
UserType userType = UserType.getUserType(loginUser.getUserType()); UserType userType = UserType.getUserType(loginUser.getUserType());
if (userType == UserType.SYS_USER) { // if (userType == UserType.SYS_USER) {
return new ArrayList<>(loginUser.getMenuPermission()); return new ArrayList<>(loginUser.getMenuPermission());
} else if (userType == UserType.APP_USER) { // } else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // // 其他端 自行根据业务编写
} // }
return new ArrayList<>(); // return new ArrayList<>();
} }
/** /**
@ -37,11 +37,11 @@ public class SaPermissionImpl implements StpInterface {
public List<String> getRoleList(Object loginId, String loginType) { public List<String> getRoleList(Object loginId, String loginType) {
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
UserType userType = UserType.getUserType(loginUser.getUserType()); UserType userType = UserType.getUserType(loginUser.getUserType());
if (userType == UserType.SYS_USER) { // if (userType == UserType.SYS_USER) {
return new ArrayList<>(loginUser.getRolePermission()); return new ArrayList<>(loginUser.getRolePermission());
} else if (userType == UserType.APP_USER) { // } else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // // 其他端 自行根据业务编写
} // }
return new ArrayList<>(); // return new ArrayList<>();
} }
} }

@ -56,6 +56,13 @@ public interface ISysUserService {
*/ */
SysUser selectUserByPhonenumber(String phonenumber); SysUser selectUserByPhonenumber(String phonenumber);
/**
* openid
* @param openid
* @return
*/
SysUser selectUserByOpenid(String openid);
/** /**
* ID * ID
* *

@ -1,11 +1,16 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.secure.BCrypt; import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.event.LogininforEvent; import com.ruoyi.common.core.domain.event.LogininforEvent;
@ -16,6 +21,8 @@ import com.ruoyi.common.core.domain.model.XcxLoginUser;
import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.LoginType; import com.ruoyi.common.enums.LoginType;
import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException; import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserException; import com.ruoyi.common.exception.user.UserException;
@ -29,8 +36,10 @@ import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.time.Duration; import java.time.Duration;
@ -48,9 +57,20 @@ import java.util.function.Supplier;
public class SysLoginService { public class SysLoginService {
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
private final ISysUserService userService;
private final ISysConfigService configService; private final ISysConfigService configService;
private final SysPermissionService permissionService; private final SysPermissionService permissionService;
private final IdentifierGenerator id;
private final ISysOssService ossService;
private final WxMaService wxMaService;
private final RuoYiConfig config;
@Value("${user.password.maxRetryCount}") @Value("${user.password.maxRetryCount}")
private Integer maxRetryCount; private Integer maxRetryCount;
@ -100,19 +120,72 @@ public class SysLoginService {
return StpUtil.getTokenValue(); return StpUtil.getTokenValue();
} }
public String xcxRegLogin(String xcxCode, MultipartFile avatar,String nickname) {
WxMaJscode2SessionResult session = null;
try {
session = wxMaService.getUserService().getSessionInfo(xcxCode);
} catch (WxErrorException e) {
throw new RuntimeException(e);
}
String openid = session.getOpenid();
return xcxRegLoginByOpenid(openid,avatar,nickname);
}
public String xcxRegLoginByOpenid(String openid, MultipartFile avatar,String nickname) {
LambdaQueryWrapper<SysUser> q = Wrappers.lambdaQuery();
if(userMapper.selectCount(q.eq(SysUser::getOpenid,openid))>0){
throw new ServiceException("用户已经注册");
}
String url = null;
try {
url = ossService.uploadImgs(avatar,"avatar",400,400,null).getUrl();
}catch (Exception e){
log.debug("保存头像失败",e);
// throw new RuntimeException("保存头像失败",e);
}
SysUser user = new SysUser();
//设置默认值
BeanUtil.copyProperties(config.getDefaultUser(),user);
user.setOpenid(openid);
user.setAvatar(url);
user.setUserName("_"+new StringBuffer(Long.toString(id.nextId(null).longValue(),36)).reverse().toString());
user.setNickName(nickname);
userService.insertUser(user);
return xcxLoginByOpenId(openid);
}
public String xcxLogin(String xcxCode) { public String xcxLogin(String xcxCode) {
// xcxCode 为 小程序调用 wx.login 授权后获取 WxMaJscode2SessionResult session = null;
// todo 以下自行实现 try {
// 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid session = wxMaService.getUserService().getSessionInfo(xcxCode);
String openid = ""; } catch (WxErrorException e) {
throw new RuntimeException(e);
}
String openid = session.getOpenid();
return xcxLoginByOpenId(openid);
}
/**
*
* @param openid
* @return
*/
public String xcxLoginByOpenId(String openid) {
SysUser user = loadUserByOpenid(openid); SysUser user = loadUserByOpenid(openid);
// 此处可根据登录用户的数据不同 自行创建 loginUser
XcxLoginUser loginUser = new XcxLoginUser(); XcxLoginUser loginUser = new XcxLoginUser();
loginUser.setUserId(user.getUserId()); loginUser.setUserId(user.getUserId());
loginUser.setDeptId(user.getDeptId());
loginUser.setUsername(user.getUserName()); loginUser.setUsername(user.getUserName());
loginUser.setUserType(user.getUserType()); loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(user));
loginUser.setRolePermission(permissionService.getRolePermission(user));
loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
loginUser.setRoles(roles);
loginUser.setOpenid(openid); loginUser.setOpenid(openid);
// 生成token // 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.XCX); LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
@ -214,14 +287,17 @@ public class SysLoginService {
private SysUser loadUserByOpenid(String openid) { private SysUser loadUserByOpenid(String openid) {
// 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户
// oKSa06DQ-6mA-1qrP9CW9uRzgLgY
// todo 自行实现 userService.selectUserByOpenid(openid); // todo 自行实现 userService.selectUserByOpenid(openid);
SysUser user = new SysUser(); SysUser user = userService.selectUserByOpenid(openid);
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", openid); log.info("登录用户:{} 不存在.", openid);
// todo 用户不存在 业务逻辑自行实现 // todo 用户不存在 业务逻辑自行实现
throw new ServiceException("用户未注册");
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", openid); log.info("登录用户:{} 已被停用.", openid);
// todo 用户已被停用 业务逻辑自行实现 // todo 用户已被停用 业务逻辑自行实现
throw new ServiceException("用户已被停用");
} }
return user; return user;
} }

@ -151,6 +151,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
return baseMapper.selectUserByPhonenumber(phonenumber); return baseMapper.selectUserByPhonenumber(phonenumber);
} }
@Override
public SysUser selectUserByOpenid(String openid) {
return baseMapper.selectOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getOpenid,openid));
}
/** /**
* ID * ID
* *

Loading…
Cancel
Save