对比新文件 |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: Chill 搴勯獮 (smallchill@163.com) |
| | | */ |
| | | package org.springblade.core.datascope.handler; |
| | | |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springblade.core.cache.utils.CacheUtil; |
| | | import org.springblade.core.datascope.constant.DataScopeConstant; |
| | | import org.springblade.core.datascope.model.DataScopeModel; |
| | | import org.springblade.core.tool.utils.CollectionUtil; |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.core.tool.utils.StringPool; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springframework.jdbc.core.BeanPropertyRowMapper; |
| | | import org.springframework.jdbc.core.JdbcTemplate; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; |
| | | |
| | | /** |
| | | * BladeScopeModelHandler |
| | | * |
| | | * @author Chill |
| | | */ |
| | | @RequiredArgsConstructor |
| | | public class BladeScopeModelHandler implements ScopeModelHandler { |
| | | |
| | | private static final String SCOPE_CACHE_CODE = "dataScope:code:"; |
| | | private static final String SCOPE_CACHE_CLASS = "dataScope:class:"; |
| | | private static final String DEPT_CACHE_ANCESTORS = "dept:ancestors:"; |
| | | private static final DataScopeModel SEARCHED_DATA_SCOPE_MODEL = new DataScopeModel(Boolean.TRUE); |
| | | |
| | | private final JdbcTemplate jdbcTemplate; |
| | | |
| | | /** |
| | | * 鑾峰彇鏁版嵁鏉冮檺 |
| | | * |
| | | * @param mapperId 鏁版嵁鏉冮檺mapperId |
| | | * @param roleId 鐢ㄦ埛瑙掕壊闆嗗悎 |
| | | * @return DataScopeModel |
| | | */ |
| | | @Override |
| | | public DataScopeModel getDataScopeByMapper(String mapperId, String roleId) { |
| | | List<Object> args = new ArrayList<>(Collections.singletonList(mapperId)); |
| | | List<Long> roleIds = Func.toLongList(roleId); |
| | | args.addAll(roleIds); |
| | | // 澧炲姞searched瀛楁闃叉鏈厤缃殑鍙傛暟閲嶅璇诲簱瀵艰嚧缂撳瓨鍑荤┛ |
| | | // 鍚庣画鑻ユ湁鏂板閰嶇疆鍒欎細娓呯┖缂撳瓨閲嶆柊鍔犺浇 |
| | | DataScopeModel dataScope = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_CLASS, mapperId + StringPool.COLON + roleId, DataScopeModel.class, Boolean.FALSE); |
| | | if (dataScope == null || !dataScope.getSearched()) { |
| | | List<DataScopeModel> list = jdbcTemplate.query(DataScopeConstant.dataByMapper(roleIds.size()), args.toArray(), new BeanPropertyRowMapper<>(DataScopeModel.class)); |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | dataScope = list.iterator().next(); |
| | | dataScope.setSearched(Boolean.TRUE); |
| | | } else { |
| | | dataScope = SEARCHED_DATA_SCOPE_MODEL; |
| | | } |
| | | CacheUtil.put(SYS_CACHE, SCOPE_CACHE_CLASS, mapperId + StringPool.COLON + roleId, dataScope, Boolean.FALSE); |
| | | } |
| | | return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null; |
| | | } |
| | | |
| | | /** |
| | | * 鑾峰彇鏁版嵁鏉冮檺 |
| | | * |
| | | * @param code 鏁版嵁鏉冮檺璧勬簮缂栧彿 |
| | | * @return DataScopeModel |
| | | */ |
| | | @Override |
| | | public DataScopeModel getDataScopeByCode(String code) { |
| | | DataScopeModel dataScope = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_CODE, code, DataScopeModel.class, Boolean.FALSE); |
| | | // 澧炲姞searched瀛楁闃叉鏈厤缃殑鍙傛暟閲嶅璇诲簱瀵艰嚧缂撳瓨鍑荤┛ |
| | | // 鍚庣画鑻ユ湁鏂板閰嶇疆鍒欎細娓呯┖缂撳瓨閲嶆柊鍔犺浇 |
| | | if (dataScope == null || !dataScope.getSearched()) { |
| | | List<DataScopeModel> list = jdbcTemplate.query(DataScopeConstant.DATA_BY_CODE, new Object[]{code}, new BeanPropertyRowMapper<>(DataScopeModel.class)); |
| | | if (CollectionUtil.isNotEmpty(list)) { |
| | | dataScope = list.iterator().next(); |
| | | dataScope.setSearched(Boolean.TRUE); |
| | | } else { |
| | | dataScope = SEARCHED_DATA_SCOPE_MODEL; |
| | | } |
| | | CacheUtil.put(SYS_CACHE, SCOPE_CACHE_CODE, code, dataScope, Boolean.FALSE); |
| | | } |
| | | return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null; |
| | | } |
| | | |
| | | /** |
| | | * 鑾峰彇閮ㄩ棬瀛愮骇 |
| | | * |
| | | * @param deptId 閮ㄩ棬id |
| | | * @return deptIds |
| | | */ |
| | | @Override |
| | | public List<Long> getDeptAncestors(Long deptId) { |
| | | List ancestors = CacheUtil.get(SYS_CACHE, DEPT_CACHE_ANCESTORS, deptId, List.class); |
| | | if (CollectionUtil.isEmpty(ancestors)) { |
| | | ancestors = jdbcTemplate.queryForList(DataScopeConstant.DATA_BY_DEPT, new Object[]{deptId}, Long.class); |
| | | CacheUtil.put(SYS_CACHE, DEPT_CACHE_ANCESTORS, deptId, ancestors); |
| | | } |
| | | return ancestors; |
| | | } |
| | | } |