From aae3fe5305518b5d950bbf40f6c1fea6d76881b3 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 13 十二月 2021 11:49:05 +0800 Subject: [PATCH] update [重大更新] 重写数据权限实现 --- ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 4 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml | 16 ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java | 5 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java | 25 ++ ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java | 2 ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusDataPermissionInterceptor.java | 96 +++++++++ ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java | 66 ++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java | 50 +++++ ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java | 24 ++ ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java | 133 +++++++++++++ ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java | 39 +++ ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java | 17 + ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java | 10 + ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml | 8 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 5 ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java | 11 ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java | 4 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java | 2 ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java | 29 ++ ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java | 18 + ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 3 ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml | 16 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java | 8 24 files changed, 551 insertions(+), 45 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java new file mode 100644 index 0000000..9364666 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java @@ -0,0 +1,25 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 鏁版嵁鏉冮檺 + * + * @author Lion Li + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataColumn { + + /** + * 鍗犱綅绗﹀叧閿瓧 + */ + String key() default "deptName"; + + /** + * 鍗犱綅绗︽浛鎹㈠�� + */ + String value() default "dept_id"; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java new file mode 100644 index 0000000..e04b236 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java @@ -0,0 +1,17 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 鏁版嵁鏉冮檺缁� + * + * @author Lion Li + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + DataColumn[] value(); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java index feaa3f4..f1a4f9f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -6,11 +6,14 @@ * 鏁版嵁鏉冮檺杩囨护娉ㄨВ * * @author ruoyi + * @deprecated 3.6.0 绉婚櫎 {@link com.ruoyi.common.annotation.DataPermission} */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated public @interface DataScope { + /** * 閮ㄩ棬琛ㄧ殑鍒悕 */ @@ -25,4 +28,5 @@ * 鏄惁杩囨护鐢ㄦ埛鏉冮檺 */ boolean isUser() default false; + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 2fa57f5..dd23d3e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -162,7 +162,7 @@ private Long[] postIds; /** - * 瑙掕壊ID + * 鏁版嵁鏉冮檺 褰撳墠瑙掕壊ID */ @ApiModelProperty(value = "瑙掕壊ID") @TableField(exist = false) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java new file mode 100644 index 0000000..f99413b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java @@ -0,0 +1,66 @@ +package com.ruoyi.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 鏁版嵁鏉冮檺绫诲瀷 + * + * 璇硶鏀寔 spel 妯℃澘琛ㄨ揪寮� + * + * 鍐呯疆鏁版嵁 user 褰撳墠鐢ㄦ埛 鍐呭鍙傝�� SysUser + * 濡傞渶鎵╁睍鏁版嵁 闇�寰� SysUser 鍐呮敞鍏� + * 鍐呯疆鏈嶅姟 sdss 绯荤粺鏁版嵁鏉冮檺鏈嶅姟 鍐呭鍙傝�� SysDataScopeService + * 濡傞渶鎵╁睍鏇村鑷畾涔夋湇鍔� 鍙互鍙傝�� sdss 鑷缂栧啓 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DataScopeType { + + /** + * 鍏ㄩ儴鏁版嵁鏉冮檺 + */ + ALL("1", ""), + + /** + * 鑷畾鏁版嵁鏉冮檺 + */ + CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) "), + + /** + * 閮ㄩ棬鏁版嵁鏉冮檺 + */ + DEPT("3", " #{#deptName} = #{#user.deptId} "), + + /** + * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄� + */ + DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )"), + + /** + * 浠呮湰浜烘暟鎹潈闄� + */ + SELF("5", " #{#userName?:1} = #{#user.userId} "); + + private final String code; + + /** + * 璇硶 閲囩敤 spel 妯℃澘琛ㄨ揪寮� + */ + private final String sql; + + public static DataScopeType findCode(String code) { + if (StringUtils.isBlank(code)) { + return null; + } + for (DataScopeType type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java index dccea61..7a3cb62 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java @@ -1,11 +1,19 @@ package com.ruoyi.demo.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.vo.TestDemoVo; import org.apache.ibatis.annotations.Param; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; /** * 娴嬭瘯鍗曡〃Mapper鎺ュ彛 @@ -15,6 +23,37 @@ */ public interface TestDemoMapper extends BaseMapperPlus<TestDemo> { + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) Page<TestDemoVo> customPageList(@Param("page") Page<TestDemo> page, @Param("ew") Wrapper<TestDemo> wrapper); + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + <P extends IPage<TestDemo>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List<TestDemo> selectList(@Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestDemo entity); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java index 05b0153..3880950 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java @@ -1,7 +1,16 @@ package com.ruoyi.demo.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.demo.domain.TestTree; +import org.apache.ibatis.annotations.Param; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; /** * 娴嬭瘯鏍戣〃Mapper鎺ュ彛 @@ -11,4 +20,24 @@ */ public interface TestTreeMapper extends BaseMapperPlus<TestTree> { + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List<TestTree> selectList(@Param(Constants.WRAPPER) Wrapper<TestTree> queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestTree entity); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index f717bff..1cb5268 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -1,16 +1,15 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.bo.TestDemoBo; import com.ruoyi.demo.domain.vo.TestDemoVo; @@ -36,7 +35,6 @@ return getVoById(id); } - @DataScope(isUser = true) @Override public TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo); @@ -47,7 +45,6 @@ /** * 鑷畾涔夊垎椤垫煡璇� */ - @DataScope(isUser = true) @Override public TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo); @@ -55,7 +52,6 @@ return PageUtils.buildDataInfo(result); } - @DataScope(isUser = true) @Override public List<TestDemoVo> queryList(TestDemoBo bo) { return listVo(buildQueryWrapper(bo)); @@ -63,14 +59,11 @@ private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) { Map<String, Object> params = bo.getParams(); - Object dataScope = params.get("dataScope"); LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), - dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index daff12b..c4097e6 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -3,7 +3,6 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestTree; @@ -33,7 +32,6 @@ } // @DS("slave") // 鍒囨崲浠庡簱鏌ヨ - @DataScope(isUser = true) @Override public List<TestTreeVo> queryList(TestTreeBo bo) { LambdaQueryWrapper<TestTree> lqw = buildQueryWrapper(bo); @@ -42,13 +40,10 @@ private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeBo bo) { Map<String, Object> params = bo.getParams(); - Object dataScope = params.get("dataScope"); LambdaQueryWrapper<TestTree> lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), - dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusDataPermissionInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusDataPermissionInterceptor.java new file mode 100644 index 0000000..1c3d6e0 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusDataPermissionInterceptor.java @@ -0,0 +1,96 @@ +package com.ruoyi.framework.Interceptor; + +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.ruoyi.framework.handler.PlusDataPermissionHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SelectBody; +import net.sf.jsqlparser.statement.select.SetOperationList; +import net.sf.jsqlparser.statement.update.Update; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +public class PlusDataPermissionInterceptor extends JsqlParserSupport implements InnerInterceptor { + + private final PlusDataPermissionHandler dataPermissionHandler = new PlusDataPermissionHandler(); + + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); + } + + @Override + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + SqlCommandType sct = ms.getSqlCommandType(); + if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); + } + } + + @Override + protected void processSelect(Select select, int index, String sql, Object obj) { + SelectBody selectBody = select.getSelectBody(); + if (selectBody instanceof PlainSelect) { + this.setWhere((PlainSelect) selectBody, (String) obj); + } else if (selectBody instanceof SetOperationList) { + SetOperationList setOperationList = (SetOperationList) selectBody; + List<SelectBody> selectBodyList = setOperationList.getSelects(); + selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj)); + } + } + + @Override + protected void processUpdate(Update update, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); + if (null != sqlSegment) { + update.setWhere(sqlSegment); + } + } + + @Override + protected void processDelete(Delete delete, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); + if (null != sqlSegment) { + delete.setWhere(sqlSegment); + } + } + + /** + * 璁剧疆 where 鏉′欢 + * + * @param plainSelect 鏌ヨ瀵硅薄 + * @param mappedStatementId 鎵ц鏂规硶id + */ + protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); + if (null != sqlSegment) { + plainSelect.setWhere(sqlSegment); + } + } + +} + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 7392d83..1a0d8e0 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -18,9 +18,11 @@ * 鏁版嵁杩囨护澶勭悊 * * @author Lion Li + * @deprecated 3.6.0 绉婚櫎 {@link com.ruoyi.framework.handler.PlusDataPermissionHandler} */ @Aspect @Component +@Deprecated public class DataScopeAspect { /** diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java index db81b74..aeae4a3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.ruoyi.common.core.mybatisplus.methods.InsertAll; +import com.ruoyi.framework.Interceptor.PlusDataPermissionInterceptor; import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; @@ -30,6 +31,8 @@ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 鏁版嵁鏉冮檺澶勭悊 + interceptor.addInnerInterceptor(dataPermissionInterceptor()); // 鍒嗛〉鎻掍欢 interceptor.addInnerInterceptor(paginationInnerInterceptor()); // 涔愯閿佹彃浠� @@ -37,6 +40,13 @@ return interceptor; } + /** + * 鏁版嵁鏉冮檺鎷︽埅鍣� + */ + public PlusDataPermissionInterceptor dataPermissionInterceptor() { + return new PlusDataPermissionInterceptor(); + } + /** * 鍒嗛〉鎻掍欢锛岃嚜鍔ㄨ瘑鍒暟鎹簱绫诲瀷 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java new file mode 100644 index 0000000..89897c3 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -0,0 +1,133 @@ +package com.ruoyi.framework.handler; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.enums.DataScopeType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.expression.BeanResolver; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.ParserContext; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 鏁版嵁鏉冮檺杩囨护 + * + * @author Lion Li + */ +@Slf4j +public class PlusDataPermissionHandler { + + private final ExpressionParser parser = new SpelExpressionParser(); + private final ParserContext parserContext = new TemplateParserContext(); + private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + + public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + DataColumn[] dataColumns = findAnnotation(mappedStatementId); + if (ArrayUtil.isEmpty(dataColumns)) { + return where; + } + SysUser currentUser = SpringUtils.getBean(UserService.class).selectUserById(SecurityUtils.getUserId()); + // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹� + if (StringUtils.isNull(currentUser) || currentUser.isAdmin()) { + return where; + } + String dataFilterSql = buildDataFilter(currentUser, dataColumns, isSelect); + if (StringUtils.isBlank(dataFilterSql)) { + return where; + } + try { + Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); + if (ObjectUtil.isNotNull(where)) { + return new AndExpression(where, expression); + } else { + return expression; + } + } catch (JSQLParserException e) { + throw new ServiceException("鏁版嵁鏉冮檺瑙f瀽寮傚父 => " + e.getMessage()); + } + } + + /** + * 鏋勯�犳暟鎹繃婊ql + */ + private String buildDataFilter(SysUser user, DataColumn[] dataColumns, boolean isSelect) { + StringBuilder sqlString = new StringBuilder(); + + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(beanResolver); + context.setVariable("user", user); + + for (DataColumn dataColumn : dataColumns) { + // 璁剧疆娉ㄨВ鍙橀噺 key 涓鸿〃杈惧紡鍙橀噺 value 涓哄彉閲忓�� + context.setVariable(dataColumn.key(), dataColumn.value()); + for (SysRole role : user.getRoles()) { + user.setRoleId(role.getRoleId()); + + // 鑾峰彇瑙掕壊鏉冮檺娉涘瀷 + DataScopeType type = DataScopeType.findCode(role.getDataScope()); + if (ObjectUtil.isNull(type)) { + throw new ServiceException("瑙掕壊鏁版嵁鑼冨洿寮傚父 => " + role.getDataScope()); + } + // 鍏ㄩ儴鏁版嵁鏉冮檺鐩存帴杩斿洖 + if (type == DataScopeType.ALL) { + return ""; + } + // 涓嶅寘鍚� key 鍙橀噺 鍒欎笉澶勭悊 + if (!StringUtils.contains(type.getSql(), "#" + dataColumn.key())) { + continue; + } + // 鏇存柊鎴栧垹闄ら渶婊¤冻鎵�鏈夋潯浠� + sqlString.append(isSelect ? " OR " : " AND "); + // 瑙f瀽sql妯℃澘骞跺~鍏� + String sql = parser.parseExpression(type.getSql(), parserContext).getValue(context, String.class); + sqlString.append(sql); + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + return sqlString.substring(isSelect ? 4 : 5); + } + return ""; + } + + private DataColumn[] findAnnotation(String mappedStatementId) { + StringBuilder sb = new StringBuilder(mappedStatementId); + int index = sb.lastIndexOf("."); + String clazzName = sb.substring(0, index); + String methodName = sb.substring(index + 1, sb.length()); + Class<?> clazz = ClassUtil.loadClass(clazzName); + List<Method> methods = Arrays.stream(ClassUtil.getDeclaredMethods(clazz)) + .filter(method -> method.getName().equals(methodName)).collect(Collectors.toList()); + DataPermission dataPermission; + for (Method method : methods) { + if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) { + dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class); + return dataPermission.value(); + } + } + return null; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index d0ae46d..317be7e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -1,5 +1,7 @@ package com.ruoyi.system.mapper; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -19,6 +21,9 @@ * @param dept 閮ㄩ棬淇℃伅 * @return 閮ㄩ棬淇℃伅闆嗗悎 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) List<SysDept> selectDeptList(SysDept dept); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java index eb44006..d2721ee 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -14,6 +16,9 @@ */ public interface SysRoleMapper extends BaseMapperPlus<SysRole> { + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) Page<SysRole> selectPageRoleList(@Param("page") Page<SysRole> page, @Param("role") SysRole role); /** @@ -22,6 +27,9 @@ * @param role 瑙掕壊淇℃伅 * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) List<SysRole> selectRoleList(SysRole role); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index e930d87..1a07f7f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -14,6 +16,10 @@ */ public interface SysUserMapper extends BaseMapperPlus<SysUser> { + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page<SysUser> selectPageUserList(@Param("page") Page<SysUser> page, @Param("user") SysUser user); /** @@ -22,6 +28,10 @@ * @param sysUser 鐢ㄦ埛淇℃伅 * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) List<SysUser> selectUserList(SysUser sysUser); /** @@ -30,6 +40,10 @@ * @param user 鐢ㄦ埛淇℃伅 * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page<SysUser> selectAllocatedList(@Param("page") Page<SysUser> page, @Param("user") SysUser user); /** @@ -38,6 +52,10 @@ * @param user 鐢ㄦ埛淇℃伅 * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page<SysUser> selectUnallocatedList(@Param("page") Page<SysUser> page, @Param("user") SysUser user); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java new file mode 100644 index 0000000..34e2ea3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +/** + * 閫氱敤 鏁版嵁鏉冮檺 鏈嶅姟 + * + * @author Lion Li + */ +public interface SysDataScopeService { + + /** + * 鑾峰彇瑙掕壊鑷畾涔夋潈闄� + * @param roleId 瑙掕壊id + * @return 閮ㄩ棬id缁� + */ + String getRoleCustom(Long roleId); + + /** + * 鑾峰彇閮ㄩ棬鍙婁互涓嬫潈闄� + * @param deptId 閮ㄩ棬id + * @return 閮ㄩ棬id缁� + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 0000000..8439958 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,50 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.system.domain.SysRoleDept; +import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.mapper.SysRoleDeptMapper; +import com.ruoyi.system.service.SysDataScopeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service("sdss") +public class SysDataScopeServiceImpl implements SysDataScopeService { + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + @Autowired + private SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List<SysRoleDept> list = roleDeptMapper.selectList( + new LambdaQueryWrapper<SysRoleDept>() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return list.stream().map(rd -> Convert.toStr(rd.getDeptId())).collect(Collectors.joining(",")); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List<SysDept> list = deptMapper.selectList(new LambdaQueryWrapper<SysDept>() + .select(SysDept::getDeptId) + .eq(SysDept::getDeptId, deptId) + .or() + .apply("find_in_set({0},ancestors)", deptId)); + if (CollUtil.isNotEmpty(list)) { + return list.stream().map(d -> Convert.toStr(d.getDeptId())).collect(Collectors.joining(",")); + } + return null; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 8b4c5db..0f8897f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -5,7 +5,6 @@ import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; @@ -47,8 +46,9 @@ * @return 閮ㄩ棬淇℃伅闆嗗悎 */ @Override - @DataScope(deptAlias = "d") public List<SysDept> selectDeptList(SysDept dept) { +// return baseMapper.selectList(); +// return baseMapper.selectList(new LambdaQueryWrapper<>()); return baseMapper.selectDeptList(dept); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index de47ff0..cea08c8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -2,7 +2,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; @@ -46,7 +45,6 @@ private SysRoleDeptMapper roleDeptMapper; @Override - @DataScope(deptAlias = "d") public TableDataInfo<SysRole> selectPageRoleList(SysRole role, PageQuery pageQuery) { Page<SysRole> page = baseMapper.selectPageRoleList(PageUtils.buildPage(pageQuery), role); return PageUtils.buildDataInfo(page); @@ -59,7 +57,6 @@ * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 */ @Override - @DataScope(deptAlias = "d") public List<SysRole> selectRoleList(SysRole role) { return baseMapper.selectRoleList(role); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index be99994..3af2fa8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; @@ -54,7 +53,6 @@ private SysUserPostMapper userPostMapper; @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) public TableDataInfo<SysUser> selectPageUserList(SysUser user, PageQuery pageQuery) { Page<SysUser> page = baseMapper.selectPageUserList(PageUtils.buildPage(pageQuery), user); return PageUtils.buildDataInfo(page); @@ -67,7 +65,6 @@ * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) public List<SysUser> selectUserList(SysUser user) { return baseMapper.selectUserList(user); } @@ -79,7 +76,6 @@ * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) public TableDataInfo<SysUser> selectAllocatedList(SysUser user, PageQuery pageQuery) { Page<SysUser> page = baseMapper.selectAllocatedList(PageUtils.buildPage(pageQuery), user); return PageUtils.buildDataInfo(page); @@ -92,7 +88,6 @@ * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) public TableDataInfo<SysUser> selectUnallocatedList(SysUser user, PageQuery pageQuery) { Page<SysUser> page = baseMapper.selectUnallocatedList(PageUtils.buildPage(pageQuery), user); return PageUtils.buildDataInfo(page); diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 346332c..2c1fc75 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -42,10 +42,10 @@ <if test="status != null and status != ''"> AND status = #{status} </if> - <!-- 鏁版嵁鑼冨洿杩囨护 --> - <if test="params.dataScope != null and params.dataScope != ''"> - AND ( ${params.dataScope} ) - </if> +<!-- <!– 鏁版嵁鑼冨洿杩囨护 –>--> +<!-- <if test="params.dataScope != null and params.dataScope != ''">--> +<!-- AND ( ${params.dataScope} )--> +<!-- </if>--> order by d.parent_id, d.order_num </select> diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 94b161b..c13bd68 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -60,10 +60,10 @@ <if test="role.params.endTime != null and role.params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� --> and date_format(r.create_time,'%y%m%d') <= date_format(#{role.params.endTime},'%y%m%d') </if> - <!-- 鏁版嵁鑼冨洿杩囨护 --> - <if test="role.params.dataScope != null and role.params.dataScope != ''"> - AND ( ${role.params.dataScope} ) - </if> +<!-- <!– 鏁版嵁鑼冨洿杩囨护 –>--> +<!-- <if test="role.params.dataScope != null and role.params.dataScope != ''">--> +<!-- AND ( ${role.params.dataScope} )--> +<!-- </if>--> order by r.role_sort </select> @@ -88,10 +88,10 @@ <if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� --> and date_format(r.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') </if> - <!-- 鏁版嵁鑼冨洿杩囨护 --> - <if test="params.dataScope != null and params.dataScope != ''"> - AND ( ${params.dataScope} ) - </if> +<!-- <!– 鏁版嵁鑼冨洿杩囨护 –>--> +<!-- <if test="params.dataScope != null and params.dataScope != ''">--> +<!-- AND ( ${params.dataScope} )--> +<!-- </if>--> order by r.role_sort </select> diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 5d9a185..d9a927f 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -108,10 +108,10 @@ AND (u.dept_id = #{user.deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{user.deptId}, ancestors) )) </if> - <!-- 鏁版嵁鑼冨洿杩囨护 --> - <if test="user.params.dataScope != null and user.params.dataScope != ''"> - AND ( ${user.params.dataScope} ) - </if> +<!-- <!– 鏁版嵁鑼冨洿杩囨护 –>--> +<!-- <if test="user.params.dataScope != null and user.params.dataScope != ''">--> +<!-- AND ( ${user.params.dataScope} )--> +<!-- </if>--> </select> <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult"> @@ -142,10 +142,10 @@ AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )) </if> - <!-- 鏁版嵁鑼冨洿杩囨护 --> - <if test="params.dataScope != null and params.dataScope != ''"> - AND ( ${params.dataScope} ) - </if> +<!-- <!– 鏁版嵁鑼冨洿杩囨护 –>--> +<!-- <if test="params.dataScope != null and params.dataScope != ''">--> +<!-- AND ( ${params.dataScope} )--> +<!-- </if>--> </select> <select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult"> -- Gitblit v1.9.3