ylbtech-java-com-util-common-service:BaseService.java
1.返回顶部
1、
package com.shineyoo.manager.util.common.service;import java.util.List;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;import com.shineyoo.manager.util.common.persistence.BaseEntity;
import com.shineyoo.manager.util.modules.sys.entity.Role;
import com.shineyoo.manager.util.modules.sys.entity.User;
import com.google.common.collect.Lists;/*** Service基类* @author* @version 2014-05-16*/
@Transactional(readOnly = true)
public abstract class BaseService {/*** 日志对象*/protected Logger logger = LoggerFactory.getLogger(getClass());/*** 数据范围过滤* @param user 当前用户对象,通过“entity.getCurrentUser()”获取* @param officeAlias 机构表别名,多个用“,”逗号隔开。* @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数* @return 标准连接条件对象*/public static String dataScopeFilter(User user, String officeAlias, String userAlias) {StringBuilder sqlString = new StringBuilder();// 进行权限过滤,多个角色权限范围之间为或者关系。List<String> dataScope = Lists.newArrayList();// 超级管理员,跳过权限过滤if (!user.isAdmin()){boolean isDataScopeAll = false;for (Role r : user.getRoleList()){for (String oa : StringUtils.split(officeAlias, ",")){if (!dataScope.contains(r.getDataScope()) && StringUtils.isNotBlank(oa)){if (Role.DATA_SCOPE_ALL.equals(r.getDataScope())){isDataScopeAll = true;}else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getCompany().getParentIds() + user.getCompany().getId() + ",%'");}else if (Role.DATA_SCOPE_COMPANY.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");// 包括本公司下的部门 (type=1:公司;type=2:部门)sqlString.append(" OR (" + oa + ".parent_id = '" + user.getCompany().getId() + "' AND " + oa + ".type = '2')");}else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getOffice().getParentIds() + user.getOffice().getId() + ",%'");}else if (Role.DATA_SCOPE_OFFICE.equals(r.getDataScope())){sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");}else if (Role.DATA_SCOPE_CUSTOM.equals(r.getDataScope())){
//                            String officeIds =  StringUtils.join(r.getOfficeIdList(), "','");
//                            if (StringUtils.isNotEmpty(officeIds)){
//                                sqlString.append(" OR " + oa + ".id IN ('" + officeIds + "')");
//                            }sqlString.append(" OR EXISTS (SELECT 1 FROM sys_role_office WHERE role_id = '" + r.getId() + "'");sqlString.append(" AND office_id = " + oa +".id)");}//else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){                        dataScope.add(r.getDataScope());}}}// 如果没有全部数据权限,并设置了用户别名,则当前权限为本人;如果未设置别名,当前无权限为已植入权限if (!isDataScopeAll){if (StringUtils.isNotBlank(userAlias)){for (String ua : StringUtils.split(userAlias, ",")){sqlString.append(" OR " + ua + ".id = '" + user.getId() + "'");}}else {for (String oa : StringUtils.split(officeAlias, ",")){//sqlString.append(" OR " + oa + ".id  = " + user.getOffice().getId());sqlString.append(" OR " + oa + ".id IS NULL");}}}else{// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。sqlString = new StringBuilder();}}if (StringUtils.isNotBlank(sqlString.toString())){return " AND (" + sqlString.substring(4) + ")";}return "";}/*** 数据范围过滤(符合业务表字段不同的时候使用,采用exists方法)* @param entity 当前过滤的实体类* @param sqlMapKey sqlMap的键值,例如设置“dsf”时,调用方法:${sqlMap.sdf}* @param officeWheres office表条件,组成:部门表字段=业务表的部门字段* @param userWheres user表条件,组成:用户表字段=业务表的用户字段* @example*         dataScopeFilter(user, "dsf", "id=a.office_id", "id=a.create_by");*         dataScopeFilter(entity, "dsf", "code=a.jgdm", "no=a.cjr"); // 适应于业务表关联不同字段时使用,如果关联的不是机构id是code。*/public static void dataScopeFilter(BaseEntity<?> entity, String sqlMapKey, String officeWheres, String userWheres) {User user = entity.getCurrentUser();// 如果是超级管理员,则不过滤数据if (user.isAdmin()) {return;}// 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;8:仅本人数据;9:按明细设置)StringBuilder sqlString = new StringBuilder();// 获取到最大的数据权限范围String roleId = "";int dataScopeInteger = 8;for (Role r : user.getRoleList()){int ds = Integer.valueOf(r.getDataScope());if (ds == 9){roleId = r.getId();dataScopeInteger = ds;break;}else if (ds < dataScopeInteger){roleId = r.getId();dataScopeInteger = ds;}}String dataScopeString = String.valueOf(dataScopeInteger);// 生成部门权限SQL语句for (String where : StringUtils.split(officeWheres, ",")){if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(dataScopeString)){// 包括本公司下的部门 (type=1:公司;type=2:部门)sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE type='2'");sqlString.append(" AND (id = '" + user.getCompany().getId() + "'");sqlString.append(" OR parent_ids LIKE '" + user.getCompany().getParentIds() + user.getCompany().getId() + ",%')");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_COMPANY.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE type='2'");sqlString.append(" AND id = '" + user.getCompany().getId() + "'");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE (id = '" + user.getOffice().getId() + "'");sqlString.append(" OR parent_ids LIKE '" + user.getOffice().getParentIds() + user.getOffice().getId() + ",%')");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_OFFICE.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM SYS_OFFICE");sqlString.append(" WHERE id = '" + user.getOffice().getId() + "'");sqlString.append(" AND " + where +")");}else if (Role.DATA_SCOPE_CUSTOM.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM sys_role_office ro123456, sys_office o123456");sqlString.append(" WHERE ro123456.office_id = o123456.id");sqlString.append(" AND ro123456.role_id = '" + roleId + "'");sqlString.append(" AND o123456." + where +")");}}// 生成个人权限SQL语句for (String where : StringUtils.split(userWheres, ",")){if (Role.DATA_SCOPE_SELF.equals(dataScopeString)){sqlString.append(" AND EXISTS (SELECT 1 FROM sys_user");sqlString.append(" WHERE id='" + user.getId() + "'");sqlString.append(" AND " + where + ")");}}//        System.out.println("dataScopeFilter: " + sqlString.toString());// 设置到自定义SQL对象
        entity.getSqlMap().put(sqlMapKey, sqlString.toString());}}

2、
2.返回顶部
3.返回顶部
4.返回顶部
5.返回顶部
6.返回顶部
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/storebook/p/9605369.html

java-com-util-common-service:BaseService.java相关推荐

  1. java联接pg库_Java14:使用Java 14的新记录联接数据库表

    java联接pg库 您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将 ...

  2. java jwt 验证_教程:用Java创建和验证JWT

    java jwt 验证 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多 ...

  3. java 调用 go_实践总结:在 Java 中调用 Go 代码

    在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...

  4. 数据结构java版txt,图解数据结构:使用Java

    图解数据结构:使用Java 下载 mobi epub pdf ☆☆☆☆☆ 胡昭民 著 下载链接在页面底部 发表于2021-03-10 图书介绍 出版社: 清华大学出版社 ISBN:9787302402 ...

  5. java基础-宇宙第一YWM:入门java看书小发现

    ##java基础-宇宙第一YWM:书籍入门java 今天看了head first设计模式,其实从学Java基础开始就挺喜欢head first系列,而言很多前辈也都推荐过这两本,大家有空也可以看看.( ...

  6. Java多线程电影院,干货来袭:图解Java多线程(一)

    Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. 什么是Java多线程? 进程与线程 进程 ...

  7. java链表list_数据结构-List:使用Java实现双向链表LinkedList

    JDK中的LinkedList属于双向循环链表. 下面是使用Java来实现一个双向非循环链表. package org.cgz.practice2; import java.util.NoSuchEl ...

  8. vector java 复制_面试官:关于Java性能优化,你有什么技巧

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. 一般有两种 ...

  9. java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?

    为什么 Java 中"1000==1000"为false,而"100==100"为true?  这是一个挺有意思的讨论话题. 如果你运行下面的代码: Integ ...

最新文章

  1. php 请求服务器时间设置,学习猿地-php如何设置服务器时间
  2. 利用 Cloudera 实现 Hadoop (一)
  3. hibernate mysql缓存机制_Hibernate的缓存机制
  4. 第 3 章 第 2 题 求级数问题 递归法实现
  5. Python平衡点问题
  6. 数据膨胀了?你的数仓又没有空间了?
  7. MySQL Proxy和 Amoeba 工作机制浅析
  8. Docker的常规应用手册
  9. 我对python的理解_python高级函数以及我对python的理解
  10. python数据导出excel_Python方法将DBF文件导出到Excel代码示例
  11. 如何用计算机计算平均温差,换热器传热计算的平均温差法.PPT
  12. Echarts官网Json获取方式
  13. IDEA 返回上一步 快捷键
  14. 拉绳位移传感器的原理
  15. TCP编程-端口扫描器
  16. upload-labs-master 通关分析
  17. 华为LTC流程再造(BPR)的来龙去脉,看一篇文就够了!管理变革专家许浩明老师
  18. autodesk fbx sdk sample里面的工程无法调试解决方法
  19. houdini 常用命令
  20. 轻松实现iMessage群发

热门文章

  1. html点击隐藏点击出现,点击按钮,内容隐藏,再点击一下,然后内容又显示了,这种效果怎么做?然后默认的是隐藏的...
  2. 卸载 流程_「工具」Windows 卸载软件,这一个就够了
  3. 本构二次开发 c语言,umat二次开发超弹性本构.doc
  4. mysql backdoor_Mysql UDF BackDoor
  5. 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
  6. git第一次提交代码到码云,git pull 报错:fatal: refusing to merge unrelated histories
  7. 你知道面试必问的AOP吗(1),2021吊打面试官系列
  8. 【深度学习入门到精通系列】特别正经的合理调参介绍~❤️
  9. ppct各代表什么_开关背面L、L1、L2各代表什么?火线,零线,地线怎样接?
  10. 网站文章要求图文并茂,图片要怎样做好优化工作呢?