AdminUserServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package com.kym.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.crypto.asymmetric.KeyType;
  5. import cn.hutool.crypto.asymmetric.RSA;
  6. import cn.hutool.crypto.digest.DigestAlgorithm;
  7. import cn.hutool.crypto.digest.Digester;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.github.pagehelper.PageHelper;
  10. import com.github.yulichang.toolkit.JoinWrappers;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.kym.common.R;
  13. import com.kym.common.constant.ResponseEnum;
  14. import com.kym.common.exception.BusinessException;
  15. import com.kym.common.utils.CommUtil;
  16. import com.kym.common.utils.IDGenerator;
  17. import com.kym.entity.AdminUser;
  18. import com.kym.entity.AdminUserRole;
  19. import com.kym.entity.InvestorInfo;
  20. import com.kym.entity.Role;
  21. import com.kym.entity.common.PageBean;
  22. import com.kym.entity.queryParams.CommonQueryParam;
  23. import com.kym.entity.vo.AdminUserVo;
  24. import com.kym.mapper.AdminUserMapper;
  25. import com.kym.service.AdminUserRoleService;
  26. import com.kym.service.AdminUserService;
  27. import com.kym.service.InvestorInfoService;
  28. import com.kym.service.RoleService;
  29. import com.kym.service.mybatisplus.MyBaseServiceImpl;
  30. import jakarta.annotation.Resource;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.beans.BeanUtils;
  34. import org.springframework.beans.factory.annotation.Value;
  35. import org.springframework.stereotype.Service;
  36. import org.springframework.transaction.annotation.Transactional;
  37. import java.nio.charset.StandardCharsets;
  38. import java.time.LocalDateTime;
  39. import java.util.Collections;
  40. import java.util.List;
  41. import java.util.Map;
  42. /**
  43. * <p>
  44. * 用户表 服务实现类
  45. * </p>
  46. *
  47. * @author skyline
  48. * @since 2023-07-11
  49. */
  50. @Service
  51. public class AdminUserServiceImpl extends MyBaseServiceImpl<AdminUserMapper, AdminUser> implements AdminUserService {
  52. final static Digester MD5 = new Digester(DigestAlgorithm.MD5);
  53. private static final Logger LOGGER = LoggerFactory.getLogger(AdminUserServiceImpl.class);
  54. private final InvestorInfoService investorInfoService;
  55. private final RoleService roleService;
  56. @Value("${password.privateKey}")
  57. private String privateKey;
  58. @Value("${password.publicKey}")
  59. private String publicKey;
  60. @Resource
  61. private AdminUserRoleService adminUserRoleService;
  62. public AdminUserServiceImpl(InvestorInfoService investorInfoService, RoleService roleService) {
  63. this.investorInfoService = investorInfoService;
  64. this.roleService = roleService;
  65. }
  66. /**
  67. * 获取投资者角色对应的adminUser用户
  68. */
  69. @Override
  70. public List<AdminUser> getInvestorAdminUsers() {
  71. // 投资者角色ID
  72. var investorRole = roleService.lambdaQuery()
  73. .eq(Role::getRoleName, "投资者")
  74. .eq(Role::getRoleDesc, "investor").one();
  75. // 查找所有角色为investor的adminUser用户
  76. MPJLambdaWrapper<AdminUser> wrapper = JoinWrappers.lambda(AdminUser.class)
  77. .selectAll(AdminUser.class)
  78. .leftJoin(AdminUserRole.class, AdminUserRole::getAdminUserId, AdminUser::getId)
  79. .eq(AdminUserRole::getRoleId, investorRole.getId());
  80. return this.selectJoinList(AdminUser.class, wrapper);
  81. }
  82. @Override
  83. public R<?> login(String mobilePhone, String password) {
  84. var user = lambdaQuery().eq(AdminUser::getMobilePhone, mobilePhone).one();
  85. if (user == null) {
  86. return R.failed(ResponseEnum.LOGIN_FAILED);
  87. }
  88. if (user.getStatus() == AdminUser.STATUS_禁用) {
  89. throw new BusinessException("用户状态异常,无法登录");
  90. }
  91. RSA rsa = new RSA(privateKey, publicKey);
  92. password = rsa.decryptStr(password, KeyType.PrivateKey, StandardCharsets.UTF_8);
  93. var pwd = MD5.digestHex(password.concat(MD5.digestHex(mobilePhone).substring(0, 5)));
  94. if (pwd.equals(user.getPassword())) {
  95. StpUtil.login(user.getId());
  96. // 用户名存入session,统一日志读取使用
  97. StpUtil.getSession().set("mobilePhone", user.getMobilePhone());
  98. StpUtil.getSession().set("username", user.getUsername());
  99. user.setLastLoginTime(LocalDateTime.now());
  100. this.updateById(user);
  101. LOGGER.info("操作员:" + mobilePhone + "/id:" + user.getId() + "登录");
  102. // token在cookie中有隐式返回,这里多做显式返回
  103. return R.success(Map.of("id", user.getId(), "accessToken", StpUtil.getTokenValue()));
  104. }
  105. return R.failed(ResponseEnum.LOGIN_FAILED);
  106. }
  107. @Override
  108. public void logout(Long id) {
  109. StpUtil.logout(id);
  110. }
  111. /**
  112. * 用户信息、权限、角色
  113. *
  114. * @return
  115. */
  116. @Override
  117. public Object profile() {
  118. long userId = StpUtil.getLoginIdAsLong();
  119. return listUserPermissions(userId);
  120. }
  121. @Override
  122. public List<AdminUserVo> listUserPermissions(Long loginId) {
  123. return baseMapper.listUserPermissions(loginId);
  124. }
  125. @Override
  126. public List<String> listUserRoles(Long loginId) {
  127. return baseMapper.listUserRoles(loginId);
  128. }
  129. @Override
  130. public PageBean<AdminUserVo> listAdminUser(CommonQueryParam params) {
  131. PageHelper.startPage(params.getPageNum(), params.getPageSize());
  132. var list = baseMapper.listAdminUser(params);
  133. return new PageBean<>(list);
  134. }
  135. @Override
  136. public String createAdminUser(AdminUserVo adminUserVo) {
  137. var password = MD5.digestHex(adminUserVo.getPassword().concat(MD5.digestHex(adminUserVo.getMobilePhone()).substring(0, 5)));
  138. // 用户
  139. var adminUser = new AdminUser();
  140. BeanUtils.copyProperties(adminUserVo, adminUser);
  141. adminUser.setId(IDGenerator.INS().nextId());
  142. adminUser.setPassword(password);
  143. adminUser.setCreateTime(LocalDateTime.now());
  144. save(adminUser);
  145. // 角色和权限
  146. var adminUserRole = new AdminUserRole()
  147. .setAdminUserId(adminUser.getId())
  148. .setRoleId(adminUserVo.getRoleId());
  149. adminUserRoleService.save(adminUserRole);
  150. return String.valueOf(adminUser.getId());
  151. }
  152. @Override
  153. public Object detail(long id) {
  154. AdminUser adminUser = baseMapper.selectById(id);
  155. adminUser.setPassword(null);
  156. List<AdminUserRole> userRoleList = adminUserRoleService.lambdaQuery().eq(AdminUserRole::getAdminUserId, id).list();
  157. return Map.of("adminUser", adminUser, "roles", userRoleList);
  158. }
  159. @Transactional(rollbackFor = Exception.class)
  160. @Override
  161. public void updateRole(long userId, List<Long> roleIdList) {
  162. QueryWrapper wrapper = new QueryWrapper();
  163. wrapper.eq("admin_user_id", userId);
  164. adminUserRoleService.remove(wrapper);
  165. if (CommUtil.isEmptyOrNull(roleIdList)) {
  166. return;
  167. }
  168. roleIdList.forEach(roleId -> {
  169. AdminUserRole roleEntity = new AdminUserRole();
  170. roleEntity.setAdminUserId(userId);
  171. roleEntity.setRoleId(roleId);
  172. roleEntity.setCreateTime(LocalDateTime.now());
  173. roleEntity.setUpdateTime(LocalDateTime.now());
  174. adminUserRoleService.save(roleEntity);
  175. });
  176. }
  177. @Override
  178. @Transactional(rollbackFor = Exception.class)
  179. public void updateAdminUser(AdminUserVo adminUserVo) {
  180. AdminUser adminUser = new AdminUser();
  181. if (adminUserVo.getStatus() == AdminUser.STATUS_禁用) {
  182. adminUser.setStatus(AdminUser.STATUS_禁用);
  183. investorInfoService.lambdaUpdate().set(InvestorInfo::getStatus, InvestorInfo.STATUS_无效).eq(InvestorInfo::getAdminUserId, adminUserVo.getId()).update();
  184. } else {
  185. adminUser.setStatus(AdminUser.STATUS_启用);
  186. investorInfoService.lambdaUpdate().set(InvestorInfo::getStatus, InvestorInfo.STATUS_有效).eq(InvestorInfo::getAdminUserId, adminUserVo.getId()).update();
  187. }
  188. BeanUtil.copyProperties(adminUserVo, adminUser);
  189. baseMapper.updateById(adminUser);
  190. }
  191. @Override
  192. public PageBean<?> listUser(CommonQueryParam params) {
  193. PageHelper.startPage(params.getPageNum(), params.getPageSize());
  194. List<AdminUser> list = lambdaQuery()
  195. .like(!CommUtil.isEmptyOrNull(params.getUsername()), AdminUser::getUsername, params.getUsername())
  196. .like(!CommUtil.isEmptyOrNull(params.getMobilePhone()), AdminUser::getMobilePhone, params.getMobilePhone())
  197. .like(params.getStatus() != null, AdminUser::getStatus, params.getStatus())
  198. .orderByDesc(AdminUser::getId)
  199. .list();
  200. return new PageBean<>(list);
  201. }
  202. @Override
  203. public Object wxLogin(AdminUser user) {
  204. CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getOpenId()), "微信账户信息错误");
  205. var adminUser = lambdaQuery()
  206. .eq(AdminUser::getOpenId, user.getOpenId())
  207. .eq(AdminUser::getMobilePhone, user.getMobilePhone())
  208. .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
  209. if (null == adminUser) {
  210. //判断是否已有手机账号存在,有则自动绑定union id,无则创建账号
  211. adminUser = lambdaQuery()
  212. .eq(AdminUser::getMobilePhone, user.getMobilePhone())
  213. .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
  214. if (null != adminUser) {
  215. adminUser.setOpenId(user.getOpenId());
  216. } else {
  217. //自动注册
  218. CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getMobilePhone()), "手机号不能为空");
  219. adminUser = new AdminUser();
  220. adminUser.setId(IDGenerator.INS().nextId());
  221. adminUser.setOpenId(user.getOpenId());
  222. adminUser.setStatus(AdminUser.STATUS_启用);
  223. adminUser.setMobilePhone(user.getMobilePhone());
  224. adminUser.setUsername(user.getMobilePhone());
  225. adminUser.setLastLoginTime(LocalDateTime.now());
  226. adminUser.setUpdateTime(LocalDateTime.now());
  227. this.save(adminUser);
  228. }
  229. }
  230. StpUtil.login(adminUser.getId());
  231. // 用户名存入session,统一日志读取使用
  232. StpUtil.getSession().set("mobilePhone", adminUser.getMobilePhone());
  233. StpUtil.getSession().set("username", adminUser.getUsername());
  234. adminUser.setLastLoginTime(LocalDateTime.now());
  235. adminUser.setMobilePhone(adminUser.getMobilePhone());
  236. this.updateById(adminUser);
  237. LOGGER.info("微信用户union:{},name:{},phone:{},id:{}登录", adminUser.getOpenId(), adminUser.getUsername(), adminUser.getMobilePhone(), adminUser.getId());
  238. // token在cookie中有隐式返回,这里多做显式返回
  239. adminUser.setPassword(null);
  240. adminUser.setOpenId(null);
  241. return Map.of("user", adminUser, "satoken", StpUtil.getTokenValue());
  242. }
  243. @Override
  244. public Object loginByOpenId(AdminUser user) {
  245. CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getOpenId()), "微信账户信息错误");
  246. var adminUser = lambdaQuery()
  247. .eq(AdminUser::getOpenId, user.getOpenId())
  248. .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
  249. if (null == adminUser) {
  250. return Collections.emptyMap();
  251. } else {
  252. StpUtil.login(adminUser.getId());
  253. // 用户名存入session,统一日志读取使用
  254. StpUtil.getSession().set("mobilePhone", adminUser.getMobilePhone());
  255. StpUtil.getSession().set("username", adminUser.getUsername());
  256. adminUser.setLastLoginTime(LocalDateTime.now());
  257. this.updateById(adminUser);
  258. adminUser.setPassword(null);
  259. adminUser.setOpenId(null);
  260. return Map.of("user", adminUser, "satoken", StpUtil.getTokenValue());
  261. }
  262. }
  263. }