fix: 系统功能大优化,仅可查看自己创建的业务数据。

This commit is contained in:
tianyongbao
2024-05-17 14:09:54 +08:00
parent ab4189a401
commit 8d08061fef
48 changed files with 149 additions and 252 deletions

View File

@@ -1,80 +0,0 @@
package com.ruoyi.common.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义地理坐标转换注解
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CoordinateChange {
/**
* 要转换属性名
*/
String attributeName();
/**
* 原坐标系类型
*/
CoordinateType origin() default CoordinateType.WGS84;
/**
* 目标坐标系类型
*/
CoordinateType target() default CoordinateType.GCJ02;
/**
* 要处理对象类型是否为集合
*/
CollectionFlag isCollection();
public enum CoordinateType{
/**
* WGS84坐标系即地球坐标系国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
* 谷歌地图采用的是WGS84地理坐标系中国范围除外;
*/
WGS84(0),
/**
* GCJ02坐标系即火星坐标系是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
* 高德地图、腾讯地图、谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;
*/
GCJ02(1),
/**
* 即百度坐标系GCJ02坐标系经加密后的坐标系;
*/
BD09(2);
private int type;
CoordinateType(int type){
this.type = type;
}
public int type(){
return this.type;
}
}
public enum CollectionFlag{
// 是集合
IS_COLLECTION(1),
// 不是集合
NOT_COLLECTION(0);
private int flag;
CollectionFlag(int flag){
this.flag = flag;
}
public int flag(){
return this.flag;
}
}
}

View File

@@ -1,116 +0,0 @@
package com.ruoyi.common.core.aspect;
import com.ruoyi.common.core.annotation.CoordinateChange;
import com.ruoyi.common.core.utils.coordinate.Gps;
import com.ruoyi.common.core.utils.coordinate.PositionUtil;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
/**
* 地理坐标转换AOP
* 坐标格式(经度,纬度)
*/
@Aspect
@Component
public class CoordinateAspector {
private static final String SEPARATOR = ",";
@Around("@annotation(coordinateChange)")
public Object doBefore(ProceedingJoinPoint point, CoordinateChange coordinateChange) throws Throwable {
// 获取查询结果
Object proceed = point.proceed();
// 结果不为null时
if (null != proceed){
MethodSignature signature = (MethodSignature) point.getSignature();
Type type = signature.getMethod().getGenericReturnType();
if (CoordinateChange.CollectionFlag.IS_COLLECTION.equals(coordinateChange.isCollection())){
// 集合
Collection<?> collection = (Collection<?>) proceed;
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
Class<?> clz = null;
for (Type actualTypeArgument : actualTypeArguments) {
clz = Class.forName(actualTypeArgument.getTypeName());
}
// 遍历赋值
Class<?> finalClz = clz;
collection.forEach(c->{
Field field = null;
try {
field = finalClz.getDeclaredField(coordinateChange.attributeName());
field.setAccessible(true);
String coordinateStr = (String)field.get(c);
if (StringUtils.isNotEmpty(coordinateStr)) {
// 坐标转换
String[] split = coordinateStr.split(SEPARATOR);
Gps gps = transformCoordinate(Double.parseDouble(split[0]), Double.parseDouble(split[1]), coordinateChange);
// 重新赋值
String newCoordinateStr = gps.getWgLon() + SEPARATOR + gps.getWgLat();
field.set(c, newCoordinateStr);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
});
}else if (CoordinateChange.CollectionFlag.NOT_COLLECTION.equals(coordinateChange.isCollection())){
// 单个对象
// 通过反射获取坐标
Class<?> clz = Class.forName(type.getTypeName());
Field field = clz.getDeclaredField(coordinateChange.attributeName());
field.setAccessible(true);
String coordinateStr = (String)field.get(proceed);
if (StringUtils.isNotEmpty(coordinateStr)) {
// 坐标转换
String[] split = coordinateStr.split(SEPARATOR);
Gps gps = transformCoordinate(Double.parseDouble(split[0]), Double.parseDouble(split[1]), coordinateChange);
// 重新赋值
String newCoordinateStr = gps.getWgLon() + SEPARATOR + gps.getWgLat();
field.set(proceed, newCoordinateStr);
}
}
}
return proceed;
}
/**
* 坐标转换
* @param longitude 经度
* @param latitude 纬度
* @param coordinateChange 注解
* @return 转换后坐标
*/
private Gps transformCoordinate(double longitude, double latitude, CoordinateChange coordinateChange){
if (coordinateChange.origin().equals(CoordinateChange.CoordinateType.WGS84)){
if (coordinateChange.target().equals(CoordinateChange.CoordinateType.GCJ02)){
return PositionUtil.gps84_To_Gcj02(latitude,longitude);
}else if (coordinateChange.target().equals(CoordinateChange.CoordinateType.BD09)){
Gps gps = PositionUtil.gps84_To_Gcj02(latitude, longitude);
return PositionUtil.gcj02_To_Bd09(gps.getWgLat(),gps.getWgLon());
}
}else if (coordinateChange.origin().equals(CoordinateChange.CoordinateType.GCJ02)){
if (coordinateChange.target().equals(CoordinateChange.CoordinateType.WGS84)){
return PositionUtil.gcj02_To_Gps84(latitude,longitude);
}else if (coordinateChange.target().equals(CoordinateChange.CoordinateType.BD09)){
return PositionUtil.gcj02_To_Bd09(latitude,longitude);
}
}else if(coordinateChange.origin().equals(CoordinateChange.CoordinateType.BD09)){
if (coordinateChange.target().equals(CoordinateChange.CoordinateType.GCJ02)){
return PositionUtil.bd09_To_Gcj02(latitude,longitude);
}else if (coordinateChange.target().equals(CoordinateChange.CoordinateType.WGS84)){
Gps gps = PositionUtil.bd09_To_Gcj02(latitude,longitude);
return PositionUtil.gcj02_To_Gps84(gps.getWgLat(), gps.getWgLon());
}
}
return new Gps(latitude,longitude);
}
}

View File

@@ -26,6 +26,11 @@ public @interface DataScope
*/
public String userAlias() default "";
/**
* 业务表的别名
*/
public String businessAlias() default "";
/**
* 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@RequiresPermissions获取多个权限用逗号分隔开来
*/

View File

@@ -1,11 +1,5 @@
package com.ruoyi.common.datascope.aspect;
import java.util.ArrayList;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.context.SecurityContextHolder;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.core.utils.StringUtils;
@@ -15,6 +9,13 @@ import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 数据过滤处理
@@ -74,7 +75,8 @@ public class DataScopeAspect
{
String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), SecurityContextHolder.getPermission());
dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
controllerDataScope.userAlias(), permission);
controllerDataScope.userAlias(),
controllerDataScope.businessAlias(), permission);
}
}
}
@@ -88,7 +90,7 @@ public class DataScopeAspect
* @param userAlias 用户别名
* @param permission 权限字符
*/
public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String businessAlias, String permission)
{
StringBuilder sqlString = new StringBuilder();
List<String> conditions = new ArrayList<String>();
@@ -137,9 +139,12 @@ public class DataScopeAspect
}
else
{
// 数据权限为仅本人且没有userAlias别名不查询任何数据
sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
if (StringUtils.isNotBlank(businessAlias))
{
sqlString.append(StringUtils.format(" OR {}.create_by ='{}'", businessAlias, user.getUserName()));
}
}
}
conditions.add(dataScope);
}