Commit c3c67360 authored by liuyang's avatar liuyang

用户端登陆完成

parent 79e857d2
...@@ -46,4 +46,5 @@ public class AliyunApiController { ...@@ -46,4 +46,5 @@ public class AliyunApiController {
public Result<RefreshUploadVideoResponse> refreshVideoUploadPolicy(@RequestParam(required = true) String videoId) throws Exception { public Result<RefreshUploadVideoResponse> refreshVideoUploadPolicy(@RequestParam(required = true) String videoId) throws Exception {
return Result.succeed(aliyunService.refreshUploadVideo(videoId)); return Result.succeed(aliyunService.refreshUploadVideo(videoId));
} }
} }
package com.qkdata.biz.management.controller; package com.qkdata.biz.management.controller;
import com.aliyuncs.exceptions.ClientException;
import com.qkdata.biz.common.BizConstants; import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.management.entity.CourseSeriesPO; import com.qkdata.biz.management.entity.CourseSeriesPO;
import com.qkdata.biz.management.service.CourseService; import com.qkdata.biz.management.service.CourseService;
...@@ -117,4 +118,10 @@ public class CourseController { ...@@ -117,4 +118,10 @@ public class CourseController {
courseService.saveSeries(po); courseService.saveSeries(po);
return Result.succeed("ok"); return Result.succeed("ok");
} }
@ApiOperation("获取视频信息")
@GetMapping("/videoInfo/{videoId}")
@RequiresRoles(value = {BizConstants.ROLE_ADMIN,BizConstants.ROLE_OPERATOR},logical = Logical.OR)
public Result<VideoInfoModel> videoInfo(@PathVariable String videoId) throws ClientException {
return Result.succeed(courseService.getVideoInfo(videoId));
}
} }
...@@ -34,7 +34,7 @@ public class RecommendConfigController { ...@@ -34,7 +34,7 @@ public class RecommendConfigController {
@GetMapping("/list") @GetMapping("/list")
@RequiresRoles(value = {BizConstants.ROLE_ADMIN,BizConstants.ROLE_OPERATOR},logical = Logical.OR) @RequiresRoles(value = {BizConstants.ROLE_ADMIN,BizConstants.ROLE_OPERATOR},logical = Logical.OR)
public Result<List<RecommendConfigPO>> list(){ public Result<List<RecommendConfigPO>> list(){
Result.succeed(configService.list()); return Result.succeed(configService.list());
} }
@ApiOperation("添加推荐") @ApiOperation("添加推荐")
@PostMapping("/add") @PostMapping("/add")
......
...@@ -371,4 +371,14 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> { ...@@ -371,4 +371,14 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
po.setSeriesId(model.getSeriesId()); po.setSeriesId(model.getSeriesId());
return po.getId(); return po.getId();
} }
public VideoInfoModel getVideoInfo(String videoId) throws ClientException {
VideoInfoModel model = new VideoInfoModel();
GetVideoInfoResponse response = aliyunService.getVideoInfo(videoId);
model.setVideoId(videoId);
model.setSize(response.getVideo().getSize());
model.setDuration(response.getVideo().getDuration());
model.setCoverURL(response.getVideo().getCoverURL());
return model;
}
} }
\ No newline at end of file
package com.qkdata.biz.management.vo;
import lombok.Data;
@Data
public class VideoInfoModel {
private String videoId;
private Long size;
private Float duration;
private String coverURL;
}
...@@ -14,10 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -14,10 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -35,7 +32,7 @@ public class SmsController { ...@@ -35,7 +32,7 @@ public class SmsController {
@ApiOperation("发送验证码") @ApiOperation("发送验证码")
@SysLog("发送验证码") @SysLog("发送验证码")
@GetMapping("/sendCode") @PostMapping("/sendCode")
public Result<String> sendCode(@RequestBody @Validated SendValCodeReq req){ public Result<String> sendCode(@RequestBody @Validated SendValCodeReq req){
Map<String,Object> param = Maps.newHashMap(); Map<String,Object> param = Maps.newHashMap();
String captcha = RandomDigitGenerator.generate(6); String captcha = RandomDigitGenerator.generate(6);
......
...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qkdata.biz.sys.entity.SysUserPO; import com.qkdata.biz.sys.entity.SysUserPO;
import com.qkdata.biz.sys.vo.QueryUserModel; import com.qkdata.biz.sys.vo.QueryUserModel;
import com.qkdata.biz.sys.vo.SysUserListModel; import com.qkdata.biz.sys.vo.SysUserListModel;
import com.qkdata.biz.web.vo.FullUserInfo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -17,4 +18,6 @@ public interface SysUserMapper extends BaseMapper<SysUserPO> { ...@@ -17,4 +18,6 @@ public interface SysUserMapper extends BaseMapper<SysUserPO> {
List<SysUserListModel> queryPageList(Page<SysUserListModel> page, @Param("p") QueryUserModel queryUserModel); List<SysUserListModel> queryPageList(Page<SysUserListModel> page, @Param("p") QueryUserModel queryUserModel);
List<Long> queryAllMenuId(Long userId); List<Long> queryAllMenuId(Long userId);
FullUserInfo selectFullUserInfo(String username);
} }
...@@ -3,18 +3,27 @@ package com.qkdata.biz.sys.service; ...@@ -3,18 +3,27 @@ package com.qkdata.biz.sys.service;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.enums.AccountStatusEnum; import com.qkdata.biz.enums.AccountStatusEnum;
import com.qkdata.biz.management.entity.OrganizationPO;
import com.qkdata.biz.management.service.OrganizationService;
import com.qkdata.biz.sys.entity.SysMenuPO; import com.qkdata.biz.sys.entity.SysMenuPO;
import com.qkdata.biz.sys.entity.SysUserPO; import com.qkdata.biz.sys.entity.SysUserPO;
import com.qkdata.biz.sys.vo.LoginUserInfo; import com.qkdata.biz.sys.vo.LoginUserInfo;
import com.qkdata.biz.sys.vo.SysRoleModel; import com.qkdata.biz.sys.vo.SysRoleModel;
import com.qkdata.biz.web.vo.FullUserInfo;
import com.qkdata.biz.web.vo.LoginByCodeModel;
import com.qkdata.common.base.exception.BusinessException; import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.jwt.JWTService; import com.qkdata.common.jwt.JWTService;
import com.qkdata.common.oauth.AuthorizedUser; import com.qkdata.common.oauth.AuthorizedUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.crypto.hash.Sha256Hash; import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -22,6 +31,7 @@ import java.time.LocalDateTime; ...@@ -22,6 +31,7 @@ import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j
@Service @Service
public class ShiroService { public class ShiroService {
@Autowired @Autowired
...@@ -34,6 +44,12 @@ public class ShiroService { ...@@ -34,6 +44,12 @@ public class ShiroService {
private JWTService jwtService; private JWTService jwtService;
@Autowired @Autowired
private SysRoleService sysRoleService; private SysRoleService sysRoleService;
@Autowired
private OrganizationService orgSerivce;
@Autowired
@Qualifier("stringRedisTemplate")
private StringRedisTemplate redisTemplate;
public Set<String> getUserPermissions(Long userId) { public Set<String> getUserPermissions(Long userId) {
List<String> permsList; List<String> permsList;
...@@ -71,7 +87,7 @@ public class ShiroService { ...@@ -71,7 +87,7 @@ public class ShiroService {
userPO.setActivateTime(LocalDateTime.now()); userPO.setActivateTime(LocalDateTime.now());
sysUserService.updateById(userPO); sysUserService.updateById(userPO);
} }
String token = generatorToken(userPO); String token = generatorToken(userPO.getId(),userPO.getUsername());
LoginUserInfo loginUser = new LoginUserInfo(); LoginUserInfo loginUser = new LoginUserInfo();
BeanUtils.copyProperties(userPO,loginUser); BeanUtils.copyProperties(userPO,loginUser);
loginUser.setAuthorization(token); loginUser.setAuthorization(token);
...@@ -79,10 +95,10 @@ public class ShiroService { ...@@ -79,10 +95,10 @@ public class ShiroService {
return loginUser; return loginUser;
} }
private String generatorToken(SysUserPO userPO) throws JsonProcessingException { private String generatorToken(Long id,String username) throws JsonProcessingException {
AuthorizedUser user = new AuthorizedUser(); AuthorizedUser user = new AuthorizedUser();
user.setUserId(userPO.getId()); user.setUserId(id);
user.setUsername(userPO.getUsername()); user.setUsername(username);
String userJson = objectMapper.writeValueAsString(user); String userJson = objectMapper.writeValueAsString(user);
Map<String,Object> userClaim = Maps.newConcurrentMap(); Map<String,Object> userClaim = Maps.newConcurrentMap();
userClaim.put("user",userJson); userClaim.put("user",userJson);
...@@ -97,4 +113,76 @@ public class ShiroService { ...@@ -97,4 +113,76 @@ public class ShiroService {
List<SysRoleModel> roles = sysRoleService.getUserRoles(userId); List<SysRoleModel> roles = sysRoleService.getUserRoles(userId);
return roles.stream().map(SysRoleModel::getCode).collect(Collectors.toSet()); return roles.stream().map(SysRoleModel::getCode).collect(Collectors.toSet());
} }
public FullUserInfo loginByCode(LoginByCodeModel model) {
String cache_captcha = (String) redisTemplate.opsForValue().get(BizConstants.MOBILE_CAPTCHA_PREFIX+model.getMobile());
if (!Strings.isNullOrEmpty(cache_captcha)){
cache_captcha = cache_captcha.trim();
if (!cache_captcha.equals(model.getCode())){
log.error("验证码错误:redis值为{},输入值为{}",cache_captcha,model.getCode());
throw new BusinessException("验证码错误");
}
}else {
throw new BusinessException("验证码错误");
}
FullUserInfo userInfo = sysUserService.findFullUserInfo(model.getMobile());
if (userInfo == null){
//用户不存在时需要注册
registerUser(model.getMobile());
userInfo = sysUserService.findFullUserInfo(model.getMobile());
}
if (userInfo.getStatus() == AccountStatusEnum.DISABLE){
throw new BusinessException("对不起,您的帐户已禁用,请联系客服人员");
}
if (userInfo.getStatus() == AccountStatusEnum.UNACTIVATE){
//激活用户
SysUserPO userPO = new SysUserPO();
userPO.setId(userInfo.getId());
userPO.setStatus(AccountStatusEnum.ENABLE);
userPO.setActivateTime(LocalDateTime.now());
sysUserService.updateById(userPO);
}
//判断帐户角色是否为企业管理员或普通用户
List<SysRoleModel> roleModels = sysRoleService.getUserRoles(userInfo.getId());
boolean hasPerm = false;
for (SysRoleModel role : roleModels){
if (role.getCode().equals(BizConstants.ROLE_ENTERPRISE_ADMIN)){
hasPerm = true;
userInfo.setEnterpriesMgr(true);
}else if (role.getCode().equals(BizConstants.ROLE_USER)){
hasPerm = true;
userInfo.setEnterpriesMgr(false);
}
}
if (!hasPerm){
throw new BusinessException("对不起,您没有权限登陆,请联系客服人员");
}
//获取所属企业
if (userInfo.getEnterpriseId() != null){
OrganizationPO orgPo = orgSerivce.getById(userInfo.getEnterpriseId());
if (orgPo != null){
userInfo.setEnterpriseName(orgPo.getName());
}
}
updateLastLoginTime(userInfo.getId());
try {
userInfo.setAuthorization(generatorToken(userInfo.getId(),userInfo.getUsername()));
} catch (JsonProcessingException e) {
throw new BusinessException("系统处理错误");
}
return userInfo;
}
private void updateLastLoginTime(Long id) {
SysUserPO po = new SysUserPO();
po.setLastLoginTime(LocalDateTime.now());
po.setId(id);
sysUserService.updateById(po);
}
private void registerUser(String mobile) {
sysUserService.registerUser(mobile);
}
} }
...@@ -5,12 +5,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; ...@@ -5,12 +5,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.qkdata.biz.enums.AccountStatusEnum; import com.qkdata.biz.enums.AccountStatusEnum;
import com.qkdata.biz.enums.AccountTypeEnum;
import com.qkdata.biz.sys.entity.SysUserExtPO;
import com.qkdata.biz.sys.entity.SysUserPO; import com.qkdata.biz.sys.entity.SysUserPO;
import com.qkdata.biz.sys.mapper.SysUserExtMapper;
import com.qkdata.biz.sys.mapper.SysUserMapper; import com.qkdata.biz.sys.mapper.SysUserMapper;
import com.qkdata.biz.sys.vo.QueryUserModel; import com.qkdata.biz.sys.vo.QueryUserModel;
import com.qkdata.biz.sys.vo.SysRoleModel; import com.qkdata.biz.sys.vo.SysRoleModel;
import com.qkdata.biz.sys.vo.SysUserListModel; import com.qkdata.biz.sys.vo.SysUserListModel;
import com.qkdata.biz.sys.vo.SysUserModel; import com.qkdata.biz.sys.vo.SysUserModel;
import com.qkdata.biz.web.vo.FullUserInfo;
import com.qkdata.common.base.enums.CodeEnum; import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.exception.BusinessException; import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.PageResult; import com.qkdata.common.base.model.PageResult;
...@@ -34,6 +38,8 @@ public class SysUserService extends BaseServiceImpl<SysUserMapper, SysUserPO> { ...@@ -34,6 +38,8 @@ public class SysUserService extends BaseServiceImpl<SysUserMapper, SysUserPO> {
private SysUserRoleService sysUserRoleService; private SysUserRoleService sysUserRoleService;
@Autowired @Autowired
private SysRoleService sysRoleService; private SysRoleService sysRoleService;
@Autowired
private SysUserExtMapper sysUserExtMapper;
public SysUserPO getByUsername(String username) { public SysUserPO getByUsername(String username) {
return baseMapper.selectOne(Wrappers.<SysUserPO>lambdaQuery().eq(SysUserPO::getUsername,username)); return baseMapper.selectOne(Wrappers.<SysUserPO>lambdaQuery().eq(SysUserPO::getUsername,username));
...@@ -111,4 +117,22 @@ public class SysUserService extends BaseServiceImpl<SysUserMapper, SysUserPO> { ...@@ -111,4 +117,22 @@ public class SysUserService extends BaseServiceImpl<SysUserMapper, SysUserPO> {
removeByIds(ids); removeByIds(ids);
sysUserRoleService.deleteByUserIds(ids); sysUserRoleService.deleteByUserIds(ids);
} }
public FullUserInfo findFullUserInfo(String username) {
return baseMapper.selectFullUserInfo(username);
}
public void registerUser(String mobile) {
SysUserPO userPo = new SysUserPO();
userPo.setUsername(mobile);
userPo.setStatus(AccountStatusEnum.ENABLE);
userPo.setActivateTime(LocalDateTime.now());
save(userPo);
List<Long> roleIds = Lists.newArrayList(5L);
sysUserRoleService.saveOrUpdateUserRole(userPo.getId(),roleIds);
SysUserExtPO extUser = new SysUserExtPO();
extUser.setUserId(userPo.getId());
extUser.setType(AccountTypeEnum.USER);
sysUserExtMapper.insert(extUser);
}
} }
package com.qkdata.biz.web.controller;
import com.google.common.base.Strings;
import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.sys.service.ShiroService;
import com.qkdata.biz.sys.vo.LoginUserInfo;
import com.qkdata.biz.web.vo.FullUserInfo;
import com.qkdata.biz.web.vo.LoginByCodeModel;
import com.qkdata.common.annotation.SysLog;
import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.Result;
import com.qkdata.common.constants.Constants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Api(tags = "用户端登陆")
@RestController
@RequestMapping("/api/web/login")
public class LoginController {
@Autowired
private ShiroService shiroService;
@ApiOperation("手机号+验证码登陆")
@PostMapping("/loginByCode")
@SysLog(value = "手机号+验证码登陆",includeParam = false)
public Result<FullUserInfo> loginByCode(@RequestBody @Validated LoginByCodeModel model){
return Result.succeed(shiroService.loginByCode(model));
}
}
package com.qkdata.biz.web.vo;
import com.qkdata.biz.enums.AccountStatusEnum;
import com.qkdata.biz.enums.AccountTypeEnum;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class FullUserInfo {
/**
* 用户ID
*/
private Long id;
/**
* 用户帐号
*/
private String username;
/**
* 昵称
*/
private String nickName;
/**
* 状态
*/
private AccountStatusEnum status;
/**
* 注册时间
*/
private LocalDateTime createTime;
/**
* 最后登陆时间
*/
private LocalDateTime lastLoginTime;
/**
* 激活时间
*/
private LocalDateTime activateTime;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private Integer age;
/**
* 头像url
*/
private String avatarUrl;
/**
* 用户类型
*/
private AccountTypeEnum type;
/**
* 所属企业ID
*/
private Long enterpriseId;
/**
* 所属企业名称
*/
private String enterpriseName;
/**
* 是否企业管理员
*/
private boolean enterpriesMgr = false;
/**
* 认证token
*/
private String authorization;
}
package com.qkdata.biz.web.vo;
import com.qkdata.common.constants.ValidatorPattern;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
public class LoginByCodeModel {
@NotBlank(message = "请填写手机号")
@Pattern(regexp = ValidatorPattern.MOBILE_PATTERN, message = "手机号格式不正确")
private String mobile;
@NotBlank(message = "验证码不能为空")
private String code;
}
...@@ -89,9 +89,8 @@ jwt: ...@@ -89,9 +89,8 @@ jwt:
exclude-urls: exclude-urls:
- /api/wx/user/** - /api/wx/user/**
- /api/sys/login - /api/sys/login
- /api/aliyun/mgr/uploadPolicy #test - /api/sms/sendCode
- /api/aliyun/mgr/videoUploadPolicy #test - /api/web/login/**
- /api/aliyun/mgr/videoConfig #test
aud: qkdata aud: qkdata
exp: 720 #24*30 30天 exp: 720 #24*30 30天
......
...@@ -22,4 +22,23 @@ ...@@ -22,4 +22,23 @@
LEFT JOIN sys_role_menu rm on ur.role_id = rm.role_id LEFT JOIN sys_role_menu rm on ur.role_id = rm.role_id
where ur.user_id = #{userId} where ur.user_id = #{userId}
</select> </select>
<select id="selectFullUserInfo" resultType="com.qkdata.biz.web.vo.FullUserInfo">
SELECT u.id,
u.username,
u.nick_name,
u.`status`,
u.create_time,
u.activate_time,
u.last_login_time,
e.`name`,
e.age,
e.sex,
e.avatar_url,
e.type,
e.enterprise_id
FROM sys_user u
INNER JOIN user_ext e on u.id = e.user_id
WHERE u.is_del = 0
and username = #{username}
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment