b38ebff382b7cea709fe670c9dbf35dc3bcbcde8.svn-base 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package org.jeecg.modules.system.service.impl;
  2. import java.util.Date;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.annotation.Resource;
  7. import org.jeecg.common.constant.CacheConstant;
  8. import org.jeecg.common.constant.CommonConstant;
  9. import org.jeecg.common.exception.JeecgBootException;
  10. import org.jeecg.common.util.oConvertUtils;
  11. import org.jeecg.modules.system.entity.SysPermission;
  12. import org.jeecg.modules.system.entity.SysPermissionDataRule;
  13. import org.jeecg.modules.system.mapper.SysDepartPermissionMapper;
  14. import org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper;
  15. import org.jeecg.modules.system.mapper.SysPermissionMapper;
  16. import org.jeecg.modules.system.mapper.SysRolePermissionMapper;
  17. import org.jeecg.modules.system.model.TreeModel;
  18. import org.jeecg.modules.system.service.ISysPermissionDataRuleService;
  19. import org.jeecg.modules.system.service.ISysPermissionService;
  20. import org.springframework.cache.annotation.CacheEvict;
  21. import org.springframework.cache.annotation.Cacheable;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  25. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  26. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  27. /**
  28. * <p>
  29. * 菜单权限表 服务实现类
  30. * </p>
  31. *
  32. * @Author scott
  33. * @since 2018-12-21
  34. */
  35. @Service
  36. public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements ISysPermissionService {
  37. @Resource
  38. private SysPermissionMapper sysPermissionMapper;
  39. @Resource
  40. private ISysPermissionDataRuleService permissionDataRuleService;
  41. @Resource
  42. private SysRolePermissionMapper sysRolePermissionMapper;
  43. @Resource
  44. private SysDepartPermissionMapper sysDepartPermissionMapper;
  45. @Resource
  46. private SysDepartRolePermissionMapper sysDepartRolePermissionMapper;
  47. @Override
  48. public List<TreeModel> queryListByParentId(String parentId) {
  49. return sysPermissionMapper.queryListByParentId(parentId);
  50. }
  51. /**
  52. * 真实删除
  53. */
  54. @Override
  55. @Transactional
  56. @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)
  57. public void deletePermission(String id) throws JeecgBootException {
  58. SysPermission sysPermission = this.getById(id);
  59. if(sysPermission==null) {
  60. throw new JeecgBootException("未找到菜单信息");
  61. }
  62. String pid = sysPermission.getParentId();
  63. if(oConvertUtils.isNotEmpty(pid)) {
  64. int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid));
  65. if(count==1) {
  66. //若父节点无其他子节点,则该父节点是叶子节点
  67. this.sysPermissionMapper.setMenuLeaf(pid, 1);
  68. }
  69. }
  70. sysPermissionMapper.deleteById(id);
  71. // 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除
  72. this.removeChildrenBy(sysPermission.getId());
  73. //关联删除
  74. Map map = new HashMap<>();
  75. map.put("permission_id",id);
  76. //删除数据规则
  77. this.deletePermRuleByPermId(id);
  78. //删除角色授权表
  79. sysRolePermissionMapper.deleteByMap(map);
  80. //删除部门权限表
  81. sysDepartPermissionMapper.deleteByMap(map);
  82. //删除部门角色授权
  83. sysDepartRolePermissionMapper.deleteByMap(map);
  84. }
  85. /**
  86. * 根据父id删除其关联的子节点数据
  87. *
  88. * @return
  89. */
  90. public void removeChildrenBy(String parentId) {
  91. LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<>();
  92. // 封装查询条件parentId为主键,
  93. query.eq(SysPermission::getParentId, parentId);
  94. // 查出该主键下的所有子级
  95. List<SysPermission> permissionList = this.list(query);
  96. if (permissionList != null && permissionList.size() > 0) {
  97. String id = ""; // id
  98. int num = 0; // 查出的子级数量
  99. // 如果查出的集合不为空, 则先删除所有
  100. this.remove(query);
  101. // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级
  102. for (int i = 0, len = permissionList.size(); i < len; i++) {
  103. id = permissionList.get(i).getId();
  104. Map map = new HashMap<>();
  105. map.put("permission_id",id);
  106. //删除数据规则
  107. this.deletePermRuleByPermId(id);
  108. //删除角色授权表
  109. sysRolePermissionMapper.deleteByMap(map);
  110. //删除部门权限表
  111. sysDepartPermissionMapper.deleteByMap(map);
  112. //删除部门角色授权
  113. sysDepartRolePermissionMapper.deleteByMap(map);
  114. num = this.count(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getParentId, id));
  115. // 如果有, 则递归
  116. if (num > 0) {
  117. this.removeChildrenBy(id);
  118. }
  119. }
  120. }
  121. }
  122. /**
  123. * 逻辑删除
  124. */
  125. @Override
  126. @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)
  127. //@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true,condition="#sysPermission.menuType==2")
  128. public void deletePermissionLogical(String id) throws JeecgBootException {
  129. SysPermission sysPermission = this.getById(id);
  130. if(sysPermission==null) {
  131. throw new JeecgBootException("未找到菜单信息");
  132. }
  133. String pid = sysPermission.getParentId();
  134. int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid));
  135. if(count==1) {
  136. //若父节点无其他子节点,则该父节点是叶子节点
  137. this.sysPermissionMapper.setMenuLeaf(pid, 1);
  138. }
  139. sysPermission.setDelFlag(1);
  140. this.updateById(sysPermission);
  141. }
  142. @Override
  143. @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)
  144. public void addPermission(SysPermission sysPermission) throws JeecgBootException {
  145. //----------------------------------------------------------------------
  146. //判断是否是一级菜单,是的话清空父菜单
  147. if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) {
  148. sysPermission.setParentId(null);
  149. }
  150. //----------------------------------------------------------------------
  151. String pid = sysPermission.getParentId();
  152. if(oConvertUtils.isNotEmpty(pid)) {
  153. //设置父节点不为叶子节点
  154. this.sysPermissionMapper.setMenuLeaf(pid, 0);
  155. }
  156. sysPermission.setCreateTime(new Date());
  157. sysPermission.setDelFlag(0);
  158. sysPermission.setLeaf(true);
  159. this.save(sysPermission);
  160. }
  161. @Override
  162. @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)
  163. public void editPermission(SysPermission sysPermission) throws JeecgBootException {
  164. SysPermission p = this.getById(sysPermission.getId());
  165. //TODO 该节点判断是否还有子节点
  166. if(p==null) {
  167. throw new JeecgBootException("未找到菜单信息");
  168. }else {
  169. sysPermission.setUpdateTime(new Date());
  170. //----------------------------------------------------------------------
  171. //Step1.判断是否是一级菜单,是的话清空父菜单ID
  172. if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) {
  173. sysPermission.setParentId("");
  174. }
  175. //Step2.判断菜单下级是否有菜单,无则设置为叶子节点
  176. int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, sysPermission.getId()));
  177. if(count==0) {
  178. sysPermission.setLeaf(true);
  179. }
  180. //----------------------------------------------------------------------
  181. this.updateById(sysPermission);
  182. //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态
  183. String pid = sysPermission.getParentId();
  184. if((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) {
  185. //a.设置新的父菜单不为叶子节点
  186. this.sysPermissionMapper.setMenuLeaf(pid, 0);
  187. //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点
  188. int cc = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, p.getParentId()));
  189. if(cc==0) {
  190. if(oConvertUtils.isNotEmpty(p.getParentId())) {
  191. this.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1);
  192. }
  193. }
  194. }
  195. }
  196. }
  197. @Override
  198. public List<SysPermission> queryByUser(String username) {
  199. return this.sysPermissionMapper.queryByUser(username);
  200. }
  201. /**
  202. * 根据permissionId删除其关联的SysPermissionDataRule表中的数据
  203. */
  204. @Override
  205. public void deletePermRuleByPermId(String id) {
  206. LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<>();
  207. query.eq(SysPermissionDataRule::getPermissionId, id);
  208. int countValue = this.permissionDataRuleService.count(query);
  209. if(countValue > 0) {
  210. this.permissionDataRuleService.remove(query);
  211. }
  212. }
  213. /**
  214. * 获取模糊匹配规则的数据权限URL
  215. */
  216. @Override
  217. @Cacheable(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE)
  218. public List<String> queryPermissionUrlWithStar() {
  219. return this.baseMapper.queryPermissionUrlWithStar();
  220. }
  221. @Override
  222. public boolean hasPermission(String username, SysPermission sysPermission) {
  223. int count = baseMapper.queryCountByUsername(username,sysPermission);
  224. if(count>0){
  225. return true;
  226. }else{
  227. return false;
  228. }
  229. }
  230. @Override
  231. public boolean hasPermission(String username, String url) {
  232. SysPermission sysPermission = new SysPermission();
  233. sysPermission.setUrl(url);
  234. int count = baseMapper.queryCountByUsername(username,sysPermission);
  235. if(count>0){
  236. return true;
  237. }else{
  238. return false;
  239. }
  240. }
  241. }