mirror of
https://github.com/continew-org/continew-starter.git
synced 2025-09-08 16:57:09 +08:00
refactor(extension/crud): 调整 BaseService 相关泛型类型加载为懒加载
This commit is contained in:
@@ -36,13 +36,25 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class ServiceImpl<M extends BaseMapper<T>, T> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T> implements IService<T> {
|
public class ServiceImpl<M extends BaseMapper<T>, T> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T> implements IService<T> {
|
||||||
|
|
||||||
protected final List<Field> entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass());
|
private List<Field> entityFields;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T getById(Serializable id) {
|
public T getById(Serializable id) {
|
||||||
return this.getById(id, true);
|
return this.getById(id, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前实体类型字段
|
||||||
|
*
|
||||||
|
* @return 当前实体类型字段列表
|
||||||
|
*/
|
||||||
|
public List<Field> getEntityFields() {
|
||||||
|
if (this.entityFields == null) {
|
||||||
|
this.entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass());
|
||||||
|
}
|
||||||
|
return this.entityFields;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 ID 查询
|
* 根据 ID 查询
|
||||||
*
|
*
|
||||||
|
@@ -68,17 +68,16 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdDO, L, D, Q, C> extends ServiceImpl<M, T> implements BaseService<L, D, Q, C> {
|
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdDO, L, D, Q, C> extends ServiceImpl<M, T> implements BaseService<L, D, Q, C> {
|
||||||
|
|
||||||
private final Class<?>[] typeArgumentCache = ClassUtils.getTypeArguments(this.getClass());
|
private Class<L> listClass;
|
||||||
protected final Class<L> listClass = this.currentListClass();
|
private Class<D> detailClass;
|
||||||
protected final Class<D> detailClass = this.currentDetailClass();
|
private Class<Q> queryClass;
|
||||||
protected final Class<Q> queryClass = this.currentQueryClass();
|
private List<Field> queryFields;
|
||||||
private final List<Field> queryFields = ReflectUtils.getNonStaticFields(this.queryClass);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResp<L> page(Q query, PageQuery pageQuery) {
|
public PageResp<L> page(Q query, PageQuery pageQuery) {
|
||||||
QueryWrapper<T> queryWrapper = this.buildQueryWrapper(query);
|
QueryWrapper<T> queryWrapper = this.buildQueryWrapper(query);
|
||||||
IPage<T> page = baseMapper.selectPage(pageQuery.toPage(), queryWrapper);
|
IPage<T> page = baseMapper.selectPage(pageQuery.toPage(), queryWrapper);
|
||||||
PageResp<L> pageResp = PageResp.build(page, listClass);
|
PageResp<L> pageResp = PageResp.build(page, this.getListClass());
|
||||||
pageResp.getList().forEach(this::fill);
|
pageResp.getList().forEach(this::fill);
|
||||||
return pageResp;
|
return pageResp;
|
||||||
}
|
}
|
||||||
@@ -91,7 +90,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
}
|
}
|
||||||
// 如果构建简单树结构,则不包含基本树结构之外的扩展字段
|
// 如果构建简单树结构,则不包含基本树结构之外的扩展字段
|
||||||
TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG;
|
TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG;
|
||||||
TreeField treeField = listClass.getDeclaredAnnotation(TreeField.class);
|
TreeField treeField = this.getListClass().getDeclaredAnnotation(TreeField.class);
|
||||||
if (!isSimple) {
|
if (!isSimple) {
|
||||||
// 根据 @TreeField 配置生成树结构配置
|
// 根据 @TreeField 配置生成树结构配置
|
||||||
treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField);
|
treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField);
|
||||||
@@ -104,7 +103,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey())));
|
tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey())));
|
||||||
tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey())));
|
tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey())));
|
||||||
if (!isSimple) {
|
if (!isSimple) {
|
||||||
List<Field> fieldList = ReflectUtils.getNonStaticFields(listClass);
|
List<Field> fieldList = ReflectUtils.getNonStaticFields(this.getListClass());
|
||||||
fieldList.removeIf(f -> CharSequenceUtil.equalsAnyIgnoreCase(f.getName(), treeField.value(), treeField
|
fieldList.removeIf(f -> CharSequenceUtil.equalsAnyIgnoreCase(f.getName(), treeField.value(), treeField
|
||||||
.parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey()));
|
.parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey()));
|
||||||
fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f
|
fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f
|
||||||
@@ -115,7 +114,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<L> list(Q query, SortQuery sortQuery) {
|
public List<L> list(Q query, SortQuery sortQuery) {
|
||||||
List<L> list = this.list(query, sortQuery, listClass);
|
List<L> list = this.list(query, sortQuery, this.getListClass());
|
||||||
list.forEach(this::fill);
|
list.forEach(this::fill);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
@@ -123,7 +122,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
@Override
|
@Override
|
||||||
public D get(Long id) {
|
public D get(Long id) {
|
||||||
T entity = super.getById(id, false);
|
T entity = super.getById(id, false);
|
||||||
D detail = BeanUtil.toBean(entity, detailClass);
|
D detail = BeanUtil.toBean(entity, this.getDetailClass());
|
||||||
this.fill(detail);
|
this.fill(detail);
|
||||||
return detail;
|
return detail;
|
||||||
}
|
}
|
||||||
@@ -175,9 +174,57 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void export(Q query, SortQuery sortQuery, HttpServletResponse response) {
|
public void export(Q query, SortQuery sortQuery, HttpServletResponse response) {
|
||||||
List<D> list = this.list(query, sortQuery, detailClass);
|
List<D> list = this.list(query, sortQuery, this.getDetailClass());
|
||||||
list.forEach(this::fill);
|
list.forEach(this::fill);
|
||||||
ExcelUtils.export(list, "导出数据", detailClass, response);
|
ExcelUtils.export(list, "导出数据", this.getDetailClass(), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前列表信息类型
|
||||||
|
*
|
||||||
|
* @return 当前列表信息类型
|
||||||
|
*/
|
||||||
|
public Class<L> getListClass() {
|
||||||
|
if (this.listClass == null) {
|
||||||
|
this.listClass = (Class<L>)ClassUtils.getTypeArguments(this.getClass())[2];
|
||||||
|
}
|
||||||
|
return this.listClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前详情信息类型
|
||||||
|
*
|
||||||
|
* @return 当前详情信息类型
|
||||||
|
*/
|
||||||
|
public Class<D> getDetailClass() {
|
||||||
|
if (this.detailClass == null) {
|
||||||
|
this.detailClass = (Class<D>)ClassUtils.getTypeArguments(this.getClass())[3];
|
||||||
|
}
|
||||||
|
return this.detailClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前查询条件类型
|
||||||
|
*
|
||||||
|
* @return 当前查询条件类型
|
||||||
|
*/
|
||||||
|
public Class<Q> getQueryClass() {
|
||||||
|
if (this.queryClass == null) {
|
||||||
|
this.queryClass = (Class<Q>)ClassUtils.getTypeArguments(this.getClass())[4];
|
||||||
|
}
|
||||||
|
return this.queryClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前查询条件类型字段
|
||||||
|
*
|
||||||
|
* @return 当前查询条件类型字段列表
|
||||||
|
*/
|
||||||
|
public List<Field> getQueryFields() {
|
||||||
|
if (this.queryFields == null) {
|
||||||
|
this.queryFields = ReflectUtils.getNonStaticFields(this.getQueryClass());
|
||||||
|
}
|
||||||
|
return queryFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -217,7 +264,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
} else {
|
} else {
|
||||||
checkProperty = property;
|
checkProperty = property;
|
||||||
}
|
}
|
||||||
Optional<Field> optional = entityFields.stream()
|
Optional<Field> optional = super.getEntityFields().stream()
|
||||||
.filter(field -> checkProperty.equals(field.getName()))
|
.filter(field -> checkProperty.equals(field.getName()))
|
||||||
.findFirst();
|
.findFirst();
|
||||||
ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property);
|
ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property);
|
||||||
@@ -248,7 +295,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
protected QueryWrapper<T> buildQueryWrapper(Q query) {
|
protected QueryWrapper<T> buildQueryWrapper(Q query) {
|
||||||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||||
// 解析并拼接查询条件
|
// 解析并拼接查询条件
|
||||||
return QueryWrapperHelper.build(query, queryFields, queryWrapper);
|
return QueryWrapperHelper.build(query, this.getQueryFields(), queryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -307,31 +354,4 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
|
|||||||
protected void afterDelete(List<Long> ids) {
|
protected void afterDelete(List<Long> ids) {
|
||||||
/* 删除后置处理 */
|
/* 删除后置处理 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前列表信息类型
|
|
||||||
*
|
|
||||||
* @return 当前列表信息类型
|
|
||||||
*/
|
|
||||||
protected Class<L> currentListClass() {
|
|
||||||
return (Class<L>)this.typeArgumentCache[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前详情信息类型
|
|
||||||
*
|
|
||||||
* @return 当前详情信息类型
|
|
||||||
*/
|
|
||||||
protected Class<D> currentDetailClass() {
|
|
||||||
return (Class<D>)this.typeArgumentCache[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前查询条件类型
|
|
||||||
*
|
|
||||||
* @return 当前查询条件类型
|
|
||||||
*/
|
|
||||||
protected Class<Q> currentQueryClass() {
|
|
||||||
return (Class<Q>)this.typeArgumentCache[4];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user