From 3dff5299206a365ab4b61e9050aeb6b52a733433 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: 星期四, 27 六月 2024 17:46:17 +0800 Subject: [PATCH] !556 新增mybatis注释 --- ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java | 30 ++- ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java | 70 ++++++++ ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java | 22 ++ ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java | 18 + ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java | 159 ++++++++++++++++++- ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java | 55 ++++++ ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java | 1 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java | 5 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java | 6 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java | 7 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java | 11 + ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java | 5 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java | 37 +++- ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java | 13 + ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java | 10 + 15 files changed, 386 insertions(+), 63 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java index aca470f..f8c5cd0 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -3,9 +3,10 @@ import java.lang.annotation.*; /** - * 鏁版嵁鏉冮檺 - * + * 鏁版嵁鏉冮檺娉ㄨВ锛岀敤浜庢爣璁版暟鎹潈闄愮殑鍗犱綅绗﹀叧閿瓧鍜屾浛鎹㈠�� + * <p> * 涓�涓敞瑙e彧鑳藉搴斾竴涓ā鏉� + * </p> * * @author Lion Li * @version 3.5.0 @@ -16,12 +17,16 @@ public @interface DataColumn { /** - * 鍗犱綅绗﹀叧閿瓧 + * 鏁版嵁鏉冮檺妯℃澘鐨勫崰浣嶇鍏抽敭瀛楋紝榛樿涓� "deptName" + * + * @return 鍗犱綅绗﹀叧閿瓧鏁扮粍 */ String[] key() default "deptName"; /** - * 鍗犱綅绗︽浛鎹㈠�� + * 鏁版嵁鏉冮檺妯℃澘鐨勫崰浣嶇鏇挎崲鍊硷紝榛樿涓� "dept_id" + * + * @return 鍗犱綅绗︽浛鎹㈠�兼暟缁� */ String[] value() default "dept_id"; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java index f4351e3..6fd3c3e 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -3,7 +3,7 @@ import java.lang.annotation.*; /** - * 鏁版嵁鏉冮檺缁� + * 鏁版嵁鏉冮檺缁勬敞瑙o紝鐢ㄤ簬鏍囪鏁版嵁鏉冮檺閰嶇疆鏁扮粍 * * @author Lion Li * @version 3.5.0 @@ -13,6 +13,11 @@ @Documented public @interface DataPermission { + /** + * 鏁版嵁鏉冮檺閰嶇疆鏁扮粍锛岀敤浜庢寚瀹氭暟鎹潈闄愮殑鍗犱綅绗﹀叧閿瓧鍜屾浛鎹㈠�� + * + * @return 鏁版嵁鏉冮檺閰嶇疆鏁扮粍 + */ DataColumn[] value(); } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index 820b49a..13a7941 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -17,7 +17,6 @@ * * @author Lion Li */ - @Data public class BaseEntity implements Serializable { diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 3889250..a68d96f 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -34,20 +34,38 @@ Log log = LogFactory.getLog(BaseMapperPlus.class); + /** + * 鑾峰彇褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� V 鐨� Class 瀵硅薄 + * + * @return 杩斿洖褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� V 鐨� Class 瀵硅薄 + */ default Class<V> currentVoClass() { return (Class<V>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1]; } + /** + * 鑾峰彇褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� T 鐨� Class 瀵硅薄 + * + * @return 杩斿洖褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� T 鐨� Class 瀵硅薄 + */ default Class<T> currentModelClass() { return (Class<T>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0]; } + /** + * 浣跨敤榛樿鐨勬煡璇㈡潯浠舵煡璇㈠苟杩斿洖缁撴灉鍒楄〃 + * + * @return 杩斿洖鏌ヨ缁撴灉鐨勫垪琛� + */ default List<T> selectList() { return this.selectList(new QueryWrapper<>()); } /** - * 鎵归噺鎻掑叆 + * 鎵归噺鎻掑叆瀹炰綋瀵硅薄闆嗗悎 + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @return 鎻掑叆鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿�� */ default boolean insertBatch(Collection<T> entityList) { Db.saveBatch(entityList); @@ -56,7 +74,10 @@ } /** - * 鎵归噺鏇存柊 + * 鎵归噺鏍规嵁ID鏇存柊瀹炰綋瀵硅薄闆嗗悎 + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @return 鏇存柊鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿�� */ default boolean updateBatchById(Collection<T> entityList) { Db.updateBatchById(entityList); @@ -65,7 +86,10 @@ } /** - * 鎵归噺鎻掑叆鎴栨洿鏂� + * 鎵归噺鎻掑叆鎴栨洿鏂板疄浣撳璞¢泦鍚� + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @return 鎻掑叆鎴栨洿鏂版搷浣滄槸鍚︽垚鍔熺殑甯冨皵鍊� */ default boolean insertOrUpdateBatch(Collection<T> entityList) { Db.saveOrUpdateBatch(entityList); @@ -74,7 +98,11 @@ } /** - * 鎵归噺鎻掑叆(鍖呭惈闄愬埗鏉℃暟) + * 鎵归噺鎻掑叆瀹炰綋瀵硅薄闆嗗悎骞舵寚瀹氭壒澶勭悊澶у皬 + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @param batchSize 鎵瑰鐞嗗ぇ灏� + * @return 鎻掑叆鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿�� */ default boolean insertBatch(Collection<T> entityList, int batchSize) { Db.saveBatch(entityList, batchSize); @@ -83,7 +111,11 @@ } /** - * 鎵归噺鏇存柊(鍖呭惈闄愬埗鏉℃暟) + * 鎵归噺鏍规嵁ID鏇存柊瀹炰綋瀵硅薄闆嗗悎骞舵寚瀹氭壒澶勭悊澶у皬 + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @param batchSize 鎵瑰鐞嗗ぇ灏� + * @return 鏇存柊鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿�� */ default boolean updateBatchById(Collection<T> entityList, int batchSize) { Db.updateBatchById(entityList, batchSize); @@ -92,7 +124,11 @@ } /** - * 鎵归噺鎻掑叆鎴栨洿鏂�(鍖呭惈闄愬埗鏉℃暟) + * 鎵归噺鎻掑叆鎴栨洿鏂板疄浣撳璞¢泦鍚堝苟鎸囧畾鎵瑰鐞嗗ぇ灏� + * + * @param entityList 瀹炰綋瀵硅薄闆嗗悎 + * @param batchSize 鎵瑰鐞嗗ぇ灏� + * @return 鎻掑叆鎴栨洿鏂版搷浣滄槸鍚︽垚鍔熺殑甯冨皵鍊� */ default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) { Db.saveOrUpdateBatch(entityList, batchSize); @@ -100,12 +136,23 @@ return true; } + /** + * 鏍规嵁ID鏌ヨ鍗曚釜VO瀵硅薄 + * + * @param id 涓婚敭ID + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄 + */ default V selectVoById(Serializable id) { return selectVoById(id, this.currentVoClass()); } /** - * 鏍规嵁 ID 鏌ヨ + * 鏍规嵁ID鏌ヨ鍗曚釜VO瀵硅薄骞跺皢鍏惰浆鎹负鎸囧畾鐨刅O绫� + * + * @param id 涓婚敭ID + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param <C> VO绫荤殑绫诲瀷 + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> C selectVoById(Serializable id, Class<C> voClass) { T obj = this.selectById(id); @@ -115,12 +162,23 @@ return MapstructUtils.convert(obj, voClass); } + /** + * 鏍规嵁ID闆嗗悎鎵归噺鏌ヨVO瀵硅薄鍒楄〃 + * + * @param idList 涓婚敭ID闆嗗悎 + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃 + */ default List<V> selectVoBatchIds(Collection<? extends Serializable> idList) { return selectVoBatchIds(idList, this.currentVoClass()); } /** - * 鏌ヨ锛堟牴鎹甀D 鎵归噺鏌ヨ锛� + * 鏍规嵁ID闆嗗悎鎵归噺鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃 + * + * @param idList 涓婚敭ID闆嗗悎 + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param <C> VO绫荤殑绫诲瀷 + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> List<C> selectVoBatchIds(Collection<? extends Serializable> idList, Class<C> voClass) { List<T> list = this.selectBatchIds(idList); @@ -130,12 +188,23 @@ return MapstructUtils.convert(list, voClass); } + /** + * 鏍规嵁鏌ヨ鏉′欢Map鏌ヨVO瀵硅薄鍒楄〃 + * + * @param map 鏌ヨ鏉′欢Map + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃 + */ default List<V> selectVoByMap(Map<String, Object> map) { return selectVoByMap(map, this.currentVoClass()); } /** - * 鏌ヨ锛堟牴鎹� columnMap 鏉′欢锛� + * 鏍规嵁鏌ヨ鏉′欢Map鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃 + * + * @param map 鏌ヨ鏉′欢Map + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param <C> VO绫荤殑绫诲瀷 + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> List<C> selectVoByMap(Map<String, Object> map, Class<C> voClass) { List<T> list = this.selectByMap(map); @@ -145,23 +214,47 @@ return MapstructUtils.convert(list, voClass); } + /** + * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄 + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄 + */ default V selectVoOne(Wrapper<T> wrapper) { return selectVoOne(wrapper, this.currentVoClass()); } + /** + * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄锛屽苟鏍规嵁闇�瑕佸喅瀹氭槸鍚︽姏鍑哄紓甯� + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param throwEx 鏄惁鎶涘嚭寮傚父鐨勬爣蹇� + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄 + */ default V selectVoOne(Wrapper<T> wrapper, boolean throwEx) { return selectVoOne(wrapper, this.currentVoClass(), throwEx); } /** - * 鏍规嵁 entity 鏉′欢锛屾煡璇竴鏉¤褰� + * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄锛屽苟鎸囧畾杩斿洖鐨刅O瀵硅薄鐨勭被鍨� + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param voClass 杩斿洖鐨刅O瀵硅薄鐨凜lass瀵硅薄 + * @param <C> 杩斿洖鐨刅O瀵硅薄鐨勭被鍨� + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囩被鍨嬭浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) { return selectVoOne(wrapper, voClass, true); } /** - * 鏍规嵁 entity 鏉′欢锛屾煡璇竴鏉¤褰� + * 鏍规嵁鏉′欢鏌ヨ鍗曚釜瀹炰綋瀵硅薄锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄 + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param throwEx 鏄惁鎶涘嚭寮傚父鐨勬爣蹇� + * @param <C> VO绫荤殑绫诲瀷 + * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass, boolean throwEx) { T obj = this.selectOne(wrapper, throwEx); @@ -171,16 +264,32 @@ return MapstructUtils.convert(obj, voClass); } + /** + * 鏌ヨ鎵�鏈塚O瀵硅薄鍒楄〃 + * + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃 + */ default List<V> selectVoList() { return selectVoList(new QueryWrapper<>(), this.currentVoClass()); } + /** + * 鏍规嵁鏉′欢鏌ヨVO瀵硅薄鍒楄〃 + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃 + */ default List<V> selectVoList(Wrapper<T> wrapper) { return selectVoList(wrapper, this.currentVoClass()); } /** - * 鏍规嵁 entity 鏉′欢锛屾煡璇㈠叏閮ㄨ褰� + * 鏍规嵁鏉′欢鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃 + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param <C> VO绫荤殑绫诲瀷 + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C> List<C> selectVoList(Wrapper<T> wrapper, Class<C> voClass) { List<T> list = this.selectList(wrapper); @@ -190,15 +299,31 @@ return MapstructUtils.convert(list, voClass); } + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨVO瀵硅薄鍒楄〃 + * + * @param page 鍒嗛〉淇℃伅 + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒嗛〉鍒楄〃 + */ default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) { return selectVoPage(page, wrapper, this.currentVoClass()); } /** - * 鍒嗛〉鏌ヨVO + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒嗛〉鍒楄〃 + * + * @param page 鍒嗛〉淇℃伅 + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄 + * @param <C> VO绫荤殑绫诲瀷 + * @param <P> VO瀵硅薄鍒嗛〉鍒楄〃鐨勭被鍨� + * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒嗛〉鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖 */ default <C, P extends IPage<C>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper, Class<C> voClass) { + // 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀹炰綋瀵硅薄鍒楄〃 List<T> list = this.selectList(page, wrapper); + // 鍒涘缓涓�涓柊鐨刅O瀵硅薄鍒嗛〉鍒楄〃锛屽苟璁剧疆鍒嗛〉淇℃伅 IPage<C> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); if (CollUtil.isEmpty(list)) { return (P) voPage; @@ -207,6 +332,14 @@ return (P) voPage; } + /** + * 鏍规嵁鏉′欢鏌ヨ绗﹀悎鏉′欢鐨勫璞★紝骞跺皢鍏惰浆鎹负鎸囧畾绫诲瀷鐨勫璞″垪琛� + * + * @param wrapper 鏌ヨ鏉′欢Wrapper + * @param mapper 杞崲鍑芥暟锛岀敤浜庡皢鏌ヨ鍒扮殑瀵硅薄杞崲涓烘寚瀹氱被鍨嬬殑瀵硅薄 + * @param <C> 瑕佽浆鎹㈢殑瀵硅薄鐨勭被鍨� + * @return 鏌ヨ鍒扮殑绗﹀悎鏉′欢鐨勫璞″垪琛紝缁忚繃杞崲涓烘寚瀹氱被鍨嬬殑瀵硅薄鍚庤繑鍥� + */ default <C> List<C> selectObjs(Wrapper<T> wrapper, Function<? super Object, C> mapper) { return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index 40b7530..6ca9b27 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -4,10 +4,10 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.sql.SqlUtil; -import lombok.Data; import java.io.Serial; import java.io.Serializable; @@ -19,7 +19,6 @@ * * @author Lion Li */ - @Data public class PageQuery implements Serializable { @@ -56,6 +55,9 @@ */ public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + /** + * 鏋勫缓鍒嗛〉瀵硅薄 + */ public <T> Page<T> build() { Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index a4b6799..8ecfb54 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -14,7 +14,6 @@ * * @author Lion Li */ - @Data @NoArgsConstructor public class TableDataInfo<T> implements Serializable { @@ -53,6 +52,9 @@ this.total = total; } + /** + * 鏍规嵁鍒嗛〉瀵硅薄鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄 + */ public static <T> TableDataInfo<T> build(IPage<T> page) { TableDataInfo<T> rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -62,6 +64,9 @@ return rspData; } + /** + * 鏍规嵁鏁版嵁鍒楄〃鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄 + */ public static <T> TableDataInfo<T> build(List<T> list) { TableDataInfo<T> rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -71,6 +76,9 @@ return rspData; } + /** + * 鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄 + */ public static <T> TableDataInfo<T> build() { TableDataInfo<T> rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java index 93487e9..5084424 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java @@ -1,8 +1,8 @@ package org.dromara.common.mybatis.enums; -import org.dromara.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; /** * 鏁版嵁搴撶被鍨� @@ -33,8 +33,17 @@ */ SQL_SERVER("Microsoft SQL Server"); + /** + * 鏁版嵁搴撶被鍨� + */ private final String type; + /** + * 鏍规嵁鏁版嵁搴撲骇鍝佸悕绉版煡鎵惧搴旂殑鏁版嵁搴撶被鍨� + * + * @param databaseProductName 鏁版嵁搴撲骇鍝佸悕绉� + * @return 瀵瑰簲鐨勬暟鎹簱绫诲瀷鏋氫妇鍊硷紝濡傛灉鏈壘鍒板垯杩斿洖 null + */ public static DataBaseType find(String databaseProductName) { if (StringUtils.isBlank(databaseProductName)) { return null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 9ea66b0..455cecb 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -1,19 +1,22 @@ package org.dromara.common.mybatis.enums; -import org.dromara.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.helper.DataPermissionHelper; /** - * 鏁版嵁鏉冮檺绫诲瀷 + * 鏁版嵁鏉冮檺绫诲瀷鏋氫妇 * <p> - * 璇硶鏀寔 spel 妯℃澘琛ㄨ揪寮� - * <p> - * 鍐呯疆鏁版嵁 user 褰撳墠鐢ㄦ埛 鍐呭鍙傝�� LoginUser - * 濡傞渶鎵╁睍鏁版嵁 鍙娇鐢� {@link DataPermissionHelper} 鎿嶄綔 - * 鍐呯疆鏈嶅姟 sdss 绯荤粺鏁版嵁鏉冮檺鏈嶅姟 鍐呭鍙傝�� SysDataScopeService - * 濡傞渶鎵╁睍鏇村鑷畾涔夋湇鍔� 鍙互鍙傝�� sdss 鑷缂栧啓 + * 鏀寔浣跨敤 SpEL 妯℃澘琛ㄨ揪寮忓畾涔� SQL 鏌ヨ鏉′欢 + * 鍐呯疆鏁版嵁锛� + * - {@code user}: 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅锛屽弬鑰� {@link LoginUser} + * 鍐呯疆鏈嶅姟锛� + * - {@code sdss}: 绯荤粺鏁版嵁鏉冮檺鏈嶅姟锛屽弬鑰� {@link ISysDataScopeService} + * 濡傞渶鎵╁睍鏁版嵁锛屽彲浠ラ�氳繃 {@link DataPermissionHelper} 杩涜鎿嶄綔 + * 濡傞渶鎵╁睍鏈嶅姟锛屽彲浠ラ�氳繃 {@link ISysDataScopeService} 鑷缂栧啓 + * </p> * * @author Lion Li * @version 3.5.0 @@ -29,36 +32,50 @@ /** * 鑷畾鏁版嵁鏉冮檺 + * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} )` + * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0` */ CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), /** * 閮ㄩ棬鏁版嵁鏉冮檺 + * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} = #{#user.deptId}` + * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0` */ DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), /** * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄� + * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )}` + * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0` */ DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), /** * 浠呮湰浜烘暟鎹潈闄� + * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#userName} = #{#user.userId}` + * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0` */ SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "); private final String code; /** - * 璇硶 閲囩敤 spel 妯℃澘琛ㄨ揪寮� + * SpEL 妯℃澘琛ㄨ揪寮忥紝鐢ㄤ簬鏋勫缓 SQL 鏌ヨ鏉′欢 */ private final String sqlTemplate; /** - * 涓嶆弧瓒� sqlTemplate 鍒欏~鍏� + * 濡傛灉涓嶆弧瓒� {@code sqlTemplate} 鐨勬潯浠讹紝鍒欎娇鐢ㄦ榛樿 SQL 琛ㄨ揪寮� */ private final String elseSql; + /** + * 鏍规嵁鏋氫妇浠g爜鏌ユ壘瀵瑰簲鐨勬灇涓惧�� + * + * @param code 鏋氫妇浠g爜 + * @return 瀵瑰簲鐨勬灇涓惧�硷紝濡傛灉鏈壘鍒板垯杩斿洖 null + */ public static DataScopeType findCode(String code) { if (StringUtils.isBlank(code)) { return null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index a66908f..99e6b38 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -3,12 +3,12 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.satoken.utils.LoginHelper; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.reflection.MetaObject; import java.util.Date; @@ -21,21 +21,28 @@ @Slf4j public class InjectionMetaObjectHandler implements MetaObjectHandler { + /** + * 鎻掑叆濉厖鏂规硶锛岀敤浜庡湪鎻掑叆鏁版嵁鏃惰嚜鍔ㄥ~鍏呭疄浣撳璞′腑鐨勫垱寤烘椂闂淬�佹洿鏂版椂闂淬�佸垱寤轰汉銆佹洿鏂颁汉绛変俊鎭� + * + * @param metaObject 鍏冨璞★紝鐢ㄤ簬鑾峰彇鍘熷瀵硅薄骞惰繘琛屽~鍏� + */ @Override public void insertFill(MetaObject metaObject) { try { if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 鑾峰彇褰撳墠鏃堕棿浣滀负鍒涘缓鏃堕棿鍜屾洿鏂版椂闂达紝濡傛灉鍒涘缓鏃堕棿涓嶄负绌猴紝鍒欎娇鐢ㄥ垱寤烘椂闂达紝鍚﹀垯浣跨敤褰撳墠鏃堕棿 Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime()) ? baseEntity.getCreateTime() : new Date(); baseEntity.setCreateTime(current); baseEntity.setUpdateTime(current); + + // 濡傛灉鍒涘缓浜轰负绌猴紝鍒欏~鍏呭綋鍓嶇櫥褰曠敤鎴风殑淇℃伅 if (ObjectUtil.isNull(baseEntity.getCreateBy())) { LoginUser loginUser = getLoginUser(); if (ObjectUtil.isNotNull(loginUser)) { Long userId = loginUser.getUserId(); - // 褰撳墠宸茬櫥褰� 涓� 鍒涘缓浜轰负绌� 鍒欏~鍏� + // 濉厖鍒涘缓浜恒�佹洿鏂颁汉鍜屽垱寤洪儴闂ㄤ俊鎭� baseEntity.setCreateBy(userId); - // 褰撳墠宸茬櫥褰� 涓� 鏇存柊浜轰负绌� 鍒欏~鍏� baseEntity.setUpdateBy(userId); baseEntity.setCreateDept(ObjectUtil.isNotNull(baseEntity.getCreateDept()) ? baseEntity.getCreateDept() : loginUser.getDeptId()); @@ -47,19 +54,24 @@ } } + /** + * 鏇存柊濉厖鏂规硶锛岀敤浜庡湪鏇存柊鏁版嵁鏃惰嚜鍔ㄥ~鍏呭疄浣撳璞′腑鐨勬洿鏂版椂闂村拰鏇存柊浜轰俊鎭� + * + * @param metaObject 鍏冨璞★紝鐢ㄤ簬鑾峰彇鍘熷瀵硅薄骞惰繘琛屽~鍏� + */ @Override public void updateFill(MetaObject metaObject) { try { if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 鑾峰彇褰撳墠鏃堕棿浣滀负鏇存柊鏃堕棿锛屾棤璁哄師濮嬪璞′腑鐨勬洿鏂版椂闂存槸鍚︿负绌洪兘濉厖 Date current = new Date(); - // 鏇存柊鏃堕棿濉厖(涓嶇涓轰笉涓虹┖) baseEntity.setUpdateTime(current); - // 褰撳墠宸茬櫥褰� 鏇存柊浜哄~鍏�(涓嶇涓轰笉涓虹┖) + + // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鐨処D锛屽苟濉厖鏇存柊浜轰俊鎭� Long userId = LoginHelper.getUserId(); if (ObjectUtil.isNotNull(userId)) { baseEntity.setUpdateBy(userId); } - } } catch (Exception e) { throw new ServiceException("鑷姩娉ㄥ叆寮傚父 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); @@ -67,7 +79,9 @@ } /** - * 鑾峰彇鐧诲綍鐢ㄦ埛鍚� + * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅 + * + * @return 褰撳墠鐧诲綍鐢ㄦ埛鐨勪俊鎭紝濡傛灉鐢ㄦ埛鏈櫥褰曞垯杩斿洖 null */ private LoginUser getLoginUser() { LoginUser loginUser; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java index ec3ee0d..518d52d 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -1,14 +1,13 @@ package org.dromara.common.mybatis.handler; -import org.dromara.common.core.domain.R; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.mybatis.spring.MyBatisSystemException; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; - -import jakarta.servlet.http.HttpServletRequest; /** * Mybatis寮傚父澶勭悊鍣� diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index 7d7fd84..74279bd 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -68,13 +68,27 @@ */ private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + /** + * 鏋勯�犳柟娉曪紝鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫诲苟鍒濆鍖栫紦瀛� + * + * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰� + */ public PlusDataPermissionHandler(String mapperPackage) { scanMapperClasses(mapperPackage); } - + /** + * 鑾峰彇鏁版嵁杩囨护鏉′欢鐨� SQL 鐗囨 + * + * @param where 鍘熷鐨勬煡璇㈡潯浠惰〃杈惧紡 + * @param mappedStatementId Mapper 鏂规硶鐨� ID + * @param isSelect 鏄惁涓烘煡璇㈣鍙� + * @return 鏁版嵁杩囨护鏉′欢鐨� SQL 鐗囨 + */ public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + // 鑾峰彇鏁版嵁鏉冮檺閰嶇疆 DataPermission dataPermission = getDataPermission(mappedStatementId); + // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅 LoginUser currentUser = DataPermissionHelper.getVariable("user"); if (ObjectUtil.isNull(currentUser)) { currentUser = LoginHelper.getLoginUser(); @@ -84,6 +98,7 @@ if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { return where; } + // 鏋勯�犳暟鎹繃婊ゆ潯浠剁殑 SQL 鐗囨 String dataFilterSql = buildDataFilter(dataPermission.value(), isSelect); if (StringUtils.isBlank(dataFilterSql)) { return where; @@ -103,7 +118,12 @@ } /** - * 鏋勯�犳暟鎹繃婊ql + * 鏋勫缓鏁版嵁杩囨护鏉′欢鐨� SQL 璇彞 + * + * @param dataColumns 鏁版嵁鏉冮檺娉ㄨВ涓殑鍒椾俊鎭� + * @param isSelect 鏍囧織褰撳墠鎿嶄綔鏄惁涓烘煡璇㈡搷浣滐紝鏌ヨ鎿嶄綔鍜屾洿鏂版垨鍒犻櫎鎿嶄綔鍦ㄥ鐞嗚繃婊ゆ潯浠舵椂浼氭湁涓嶅悓鐨勫鐞嗘柟寮� + * @return 鏋勫缓鐨勬暟鎹繃婊ゆ潯浠剁殑 SQL 璇彞 + * @throws ServiceException 濡傛灉瑙掕壊鐨勬暟鎹寖鍥村紓甯告垨鑰� key 涓� value 鐨勯暱搴︿笉鍖归厤锛屽垯鎶涘嚭 ServiceException 寮傚父 */ private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) { // 鏇存柊鎴栧垹闄ら渶婊¤冻鎵�鏈夋潯浠� @@ -159,20 +179,29 @@ } /** - * 閫氳繃 mapperPackage 璁剧疆鐨勬壂鎻忓寘 鎵弿缂撳瓨鏈夋敞瑙g殑鏂规硶涓庣被 + * 鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫伙紝骞舵煡鎵惧叾涓甫鏈夌壒瀹氭敞瑙g殑鏂规硶鎴栫被 + * + * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰� */ private void scanMapperClasses(String mapperPackage) { + // 鍒涘缓璧勬簮瑙f瀽鍣ㄥ拰鍏冩暟鎹鍙栧伐鍘� PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); + // 灏� Mapper 鍖呰矾寰勬寜鍒嗛殧绗︽媶鍒嗕负鏁扮粍 String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; try { for (String packagePattern : packagePatternArray) { + // 灏嗗寘璺緞杞崲涓鸿祫婧愯矾寰� String path = ClassUtils.convertClassNameToResourcePath(packagePattern); + // 鑾峰彇鎸囧畾璺緞涓嬬殑鎵�鏈� .class 鏂囦欢璧勬簮 Resource[] resources = resolver.getResources(classpath + path + "/*.class"); for (Resource resource : resources) { + // 鑾峰彇璧勬簮鐨勭被鍏冩暟鎹� ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); + // 鑾峰彇璧勬簮瀵瑰簲鐨勭被瀵硅薄 Class<?> clazz = Resources.classForName(classMetadata.getClassName()); + // 鏌ユ壘绫讳腑鐨勭壒瀹氭敞瑙� findAnnotation(clazz); } } @@ -181,9 +210,13 @@ } } + /** + * 鍦ㄦ寚瀹氱殑绫讳腑鏌ユ壘鐗瑰畾鐨勬敞瑙� DataPermission锛屽苟灏嗗甫鏈夎繖涓敞瑙g殑鏂规硶鎴栫被瀛樺偍鍒� dataPermissionCacheMap 涓� + * + * @param clazz 瑕佹煡鎵剧殑绫� + */ private void findAnnotation(Class<?> clazz) { DataPermission dataPermission; - // 鑾峰彇鏂规硶娉ㄨВ for (Method method : clazz.getMethods()) { if (method.isDefault() || method.isVarArgs()) { continue; @@ -194,17 +227,24 @@ dataPermissionCacheMap.put(mappedStatementId, dataPermission); } } - // 鑾峰彇绫绘敞瑙� if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); dataPermissionCacheMap.put(clazz.getName(), dataPermission); } } + /** + * 鏍规嵁鏄犲皠璇彞 ID 鎴栫被鍚嶈幏鍙栧搴旂殑 DataPermission 娉ㄨВ瀵硅薄 + * + * @param mapperId 鏄犲皠璇彞 ID + * @return DataPermission 娉ㄨВ瀵硅薄锛屽鏋滀笉瀛樺湪鍒欒繑鍥� null + */ public DataPermission getDataPermission(String mapperId) { + // 妫�鏌ョ紦瀛樹腑鏄惁鍖呭惈鏄犲皠璇彞 ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄 if (dataPermissionCacheMap.containsKey(mapperId)) { return dataPermissionCacheMap.get(mapperId); } + // 濡傛灉缂撳瓨涓笉鍖呭惈鏄犲皠璇彞 ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯灏濊瘯浣跨敤绫诲悕浣滀负閿煡鎵� String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); if (dataPermissionCacheMap.containsKey(clazzName)) { return dataPermissionCacheMap.get(clazzName); @@ -213,7 +253,10 @@ } /** - * 鏄惁鏃犳晥 + * 妫�鏌ョ粰瀹氱殑鏄犲皠璇彞 ID 鏄惁鏈夋晥锛屽嵆鏄惁鑳藉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄 + * + * @param mapperId 鏄犲皠璇彞 ID + * @return 濡傛灉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯杩斿洖 false锛涘惁鍒欒繑鍥� true */ public boolean invalid(String mapperId) { return getDataPermission(mapperId) == null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java index bb20f4b..a7cfee5 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -2,11 +2,11 @@ import cn.hutool.core.convert.Convert; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.mybatis.enums.DataBaseType; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; import javax.sql.DataSource; import java.sql.Connection; @@ -14,7 +14,6 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * 鏁版嵁搴撳姪鎵� diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 7f6ab1f..2afe9ee 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -24,17 +24,35 @@ private static final String DATA_PERMISSION_KEY = "data:permission"; + /** + * 浠庝笂涓嬫枃涓幏鍙栨寚瀹氶敭鐨勫彉閲忓�硷紝骞跺皢鍏惰浆鎹负鎸囧畾鐨勭被鍨� + * + * @param key 鍙橀噺鐨勯敭 + * @param <T> 鍙橀噺鍊肩殑绫诲瀷 + * @return 鎸囧畾閿殑鍙橀噺鍊硷紝濡傛灉涓嶅瓨鍦ㄥ垯杩斿洖 null + */ public static <T> T getVariable(String key) { Map<String, Object> context = getContext(); return (T) context.get(key); } - + /** + * 鍚戜笂涓嬫枃涓缃寚瀹氶敭鐨勫彉閲忓�� + * + * @param key 瑕佽缃殑鍙橀噺鐨勯敭 + * @param value 瑕佽缃殑鍙橀噺鍊� + */ public static void setVariable(String key, Object value) { Map<String, Object> context = getContext(); context.put(key, value); } + /** + * 鑾峰彇鏁版嵁鏉冮檺涓婁笅鏂� + * + * @return 瀛樺偍鍦⊿aStorage涓殑Map瀵硅薄锛岀敤浜庡瓨鍌ㄦ暟鎹潈闄愮浉鍏崇殑涓婁笅鏂囦俊鎭� + * @throws NullPointerException 濡傛灉鏁版嵁鏉冮檺涓婁笅鏂囩被鍨嬪紓甯革紝鍒欐姏鍑篘ullPointerException + */ public static Map<String, Object> getContext() { SaStorage saStorage = SaHolder.getStorage(); Object attribute = saStorage.get(DATA_PERMISSION_KEY); @@ -64,6 +82,7 @@ /** * 鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц + * <p>绂佹鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц蹇界暐鏁版嵁鏉冮檺</p> * * @param handle 澶勭悊鎵ц鏂规硶 */ @@ -78,6 +97,7 @@ /** * 鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц + * <p>绂佹鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц蹇界暐鏁版嵁鏉冮檺</p> * * @param handle 澶勭悊鎵ц鏂规硶 */ diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java index 6eed8f7..85a4d0a 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java @@ -37,17 +37,33 @@ private final PlusDataPermissionHandler dataPermissionHandler; + /** + * 鏋勯�犲嚱鏁帮紝鍒濆鍖� PlusDataPermissionHandler 瀹炰緥 + * + * @param mapperPackage 鎵弿鐨勬槧灏勫櫒鍖� + */ public PlusDataPermissionInterceptor(String mapperPackage) { this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage); } + /** + * 鍦ㄦ墽琛屾煡璇箣鍓嶏紝妫�鏌ュ苟澶勭悊鏁版嵁鏉冮檺鐩稿叧閫昏緫 + * + * @param executor MyBatis 鎵ц鍣ㄥ璞� + * @param ms 鏄犲皠璇彞瀵硅薄 + * @param parameter 鏂规硶鍙傛暟 + * @param rowBounds 鍒嗛〉瀵硅薄 + * @param resultHandler 缁撴灉澶勭悊鍣� + * @param boundSql 缁戝畾鐨� SQL 瀵硅薄 + * @throws SQLException 濡傛灉鍙戠敓 SQL 寮傚父 + */ @Override public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { - // 妫�鏌ュ拷鐣ユ敞瑙� + // 妫�鏌ユ槸鍚﹂渶瑕佸拷鐣ユ暟鎹潈闄愬鐞� if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { return; } - // 妫�鏌ユ槸鍚︽棤鏁� 鏃犳暟鎹潈闄愭敞瑙� + // 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ if (dataPermissionHandler.invalid(ms.getId())) { return; } @@ -56,16 +72,26 @@ mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); } + /** + * 鍦ㄥ噯澶� SQL 璇彞涔嬪墠锛屾鏌ュ苟澶勭悊鏇存柊鍜屽垹闄ゆ搷浣滅殑鏁版嵁鏉冮檺鐩稿叧閫昏緫 + * + * @param sh MyBatis StatementHandler 瀵硅薄 + * @param connection 鏁版嵁搴撹繛鎺ュ璞� + * @param transactionTimeout 浜嬪姟瓒呮椂鏃堕棿 + */ @Override public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); MappedStatement ms = mpSh.mappedStatement(); + // 鑾峰彇 SQL 鍛戒护绫诲瀷锛堝銆佸垹銆佹敼銆佹煡锛� SqlCommandType sct = ms.getSqlCommandType(); + + // 鍙鐞嗘洿鏂板拰鍒犻櫎鎿嶄綔鐨� SQL 璇彞 if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { return; } - // 妫�鏌ユ槸鍚︽棤鏁� 鏃犳暟鎹潈闄愭敞瑙� + // 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ if (dataPermissionHandler.invalid(ms.getId())) { return; } @@ -74,6 +100,14 @@ } } + /** + * 澶勭悊 SELECT 鏌ヨ璇彞涓殑 WHERE 鏉′欢 + * + * @param select SELECT 鏌ヨ瀵硅薄 + * @param index 鏌ヨ璇彞鐨勭储寮� + * @param sql 鏌ヨ璇彞 + * @param obj WHERE 鏉′欢鍙傛暟 + */ @Override protected void processSelect(Select select, int index, String sql, Object obj) { if (select instanceof PlainSelect) { @@ -84,6 +118,14 @@ } } + /** + * 澶勭悊 UPDATE 璇彞涓殑 WHERE 鏉′欢 + * + * @param update UPDATE 鏌ヨ瀵硅薄 + * @param index 鏌ヨ璇彞鐨勭储寮� + * @param sql 鏌ヨ璇彞 + * @param obj WHERE 鏉′欢鍙傛暟 + */ @Override protected void processUpdate(Update update, int index, String sql, Object obj) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); @@ -92,6 +134,14 @@ } } + /** + * 澶勭悊 DELETE 璇彞涓殑 WHERE 鏉′欢 + * + * @param delete DELETE 鏌ヨ瀵硅薄 + * @param index 鏌ヨ璇彞鐨勭储寮� + * @param sql 鏌ヨ璇彞 + * @param obj WHERE 鏉′欢鍙傛暟 + */ @Override protected void processDelete(Delete delete, int index, String sql, Object obj) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); @@ -101,10 +151,10 @@ } /** - * 璁剧疆 where 鏉′欢 + * 璁剧疆 SELECT 璇彞鐨� WHERE 鏉′欢 * - * @param plainSelect 鏌ヨ瀵硅薄 - * @param mappedStatementId 鎵ц鏂规硶id + * @param plainSelect SELECT 鏌ヨ瀵硅薄 + * @param mappedStatementId 鏄犲皠璇彞鐨� ID */ protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); @@ -113,6 +163,14 @@ } } + /** + * 鏋勫缓琛ㄨ揪寮忥紝鐢ㄤ簬澶勭悊琛ㄧ殑鏁版嵁鏉冮檺 + * + * @param table 琛ㄥ璞� + * @param where WHERE 鏉′欢琛ㄨ揪寮� + * @param whereSegment WHERE 鏉′欢鐗囨 + * @return 鏋勫缓鐨勮〃杈惧紡 + */ @Override public Expression buildTableExpression(Table table, Expression where, String whereSegment) { // 鍙湁鏂扮増鏁版嵁鏉冮檺澶勭悊鍣ㄦ墠浼氭墽琛屽埌杩欓噷 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java index d7ba934..a31c426 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -3,14 +3,14 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.dromara.system.domain.SysDept; -import org.dromara.common.mybatis.helper.DataBaseHelper; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRoleDept; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysRoleDeptMapper; import org.dromara.system.service.ISysDataScopeService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; @@ -30,6 +30,12 @@ private final SysRoleDeptMapper roleDeptMapper; private final SysDeptMapper deptMapper; + /** + * 鑾峰彇瑙掕壊鑷畾涔夋潈闄� + * + * @param roleId 瑙掕壊Id + * @return 閮ㄩ棬Id缁� + */ @Override public String getRoleCustom(Long roleId) { List<SysRoleDept> list = roleDeptMapper.selectList( @@ -42,6 +48,12 @@ return null; } + /** + * 鑾峰彇閮ㄩ棬鍙婁互涓嬫潈闄� + * + * @param deptId 閮ㄩ棬Id + * @return 閮ㄩ棬Id缁� + */ @Override public String getDeptAndChild(Long deptId) { List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>() -- Gitblit v1.9.3