Skip to content

DataProxy 数据代理

提供增、删、改、查、导入、导出、数据初始化等事件触发逻辑接口,相当于传统开发中的 service 层

可以实现如:缓存写入、消息推送、数据校验、RPC 调用、动态赋值等功能!

各能力的详细用法见本分组下的其他文档:

使用方法

@Erupt 注解中添加 dataProxy 配置,重写其中的方法即可:

java
@Erupt(name = "Erupt", dataProxy = EruptTestDataProxy.class)
public class EruptTest extends BaseModel{
    
    @EruptField(
            views = @View(title = "名称"),
            edit = @Edit(title = "名称")
    )
    private String name;
    
}

定义实现 DataProxy 接口的类:

java
@Service // 添加此注解可使用依赖注入相关功能
public class EruptTestDataProxy implements DataProxy<EruptTest>{
    
    @Override
    public void beforeAdd(EruptTest eruptTest) {
        // 数据校验
        if("张三".equals(eruptTest.getName())){
            throw new EruptApiErrorTip("名称禁止为张三!");
        }
    }

    @Override
    public void beforeUpdate(EruptTest eruptTest) {
        // 动态写数据
        eruptTest.setName(eruptTest.getName() + "xxxxxxx");
    }
    
    @Override
    public void afterFetch(Collection<Map<String, Object>> list) {
        // TODO 查询结果动态处理
    }

    @Override
    public Alert alert(List<Condition> conditions) {
        return Alert.info("页面提示信息");
    }
    
}

DataProxy 接口定义

java
public interface DataProxy<MODEL> {

    /** 数据校验,校验不通过可抛出 EruptException,1.13.1+ 支持 */
    default void validate(MODEL model) throws EruptException { }

    /** 新增前 */
    default void beforeAdd(MODEL model) { }

    /** 新增后 */
    default void afterAdd(MODEL model) { }

    /** 修改前 */
    default void beforeUpdate(MODEL model) { }

    /** 修改后 */
    default void afterUpdate(MODEL model) { }

    /** 删除前 */
    default void beforeDelete(MODEL model) { }

    /** 删除后 */
    default void afterDelete(MODEL model) { }

    /**
     * 查询前动态注入条件
     * @param conditions 前端已传递条件
     * @return 自定义查询条件(JPQL WHERE 子句,不含 WHERE 关键字)
     */
    default String beforeFetch(List<Condition> conditions) { return null; }

    /**
     * 查询结果后置处理
     * @param list 查询结果
     */
    default void afterFetch(Collection<Map<String, Object>> list) { }

    /**
     * 全局页面提示,每次打开页面时触发,返回 null 则不显示提示
     * Alert 支持 info / warning / error / success 四种类型
     */
    default Alert alert(List<Condition> conditions) { return null; }

    /**
     * 自定义渲染 HTML,返回值展示在视图顶部区域
     */
    default String extraContent(List<Condition> conditions, Collection<Map<String, Object>> list) { return null; }

    /**
     * 新增表单打开时触发,可用于设置默认值
     */
    default void addBehavior(MODEL model) { }

    /**
     * 编辑表单打开时触发,可在渲染前对数据进行预处理
     */
    default void editBehavior(MODEL model) { }

    /**
     * 页面加载时触发,设置搜索框默认值
     * Map 的 key 为字段名,value 为默认搜索值
     */
    default void searchCondition(Map<String, Object> condition) { }

    /**
     * Excel 导出后触发,参数需强转为 Apache POI Workbook 对象,可自定义导出内容
     */
    default void excelExport(Object workbook) { }

    /**
     * Excel 导入时触发(原始 POI 阶段),参数需强转为 Apache POI Workbook 对象
     */
    default void excelImport(Object workbook) { }

    /**
     * Excel 导入数据解析后触发(结构化阶段),可对 list 进行校验或批量修改
     */
    default void excelImportProcess(List<MODEL> list) { }

    /**
     * 打印时触发,返回修改后的 HTML 内容字符串
     */
    default String print(MODEL model, String content) { return content; }

    /**
     * 返回额外的表格行(如合计行),追加在正常数据行之后
     */
    default List<Row> extraRow(List<Condition> conditions) { return null; }

    /**
     * 独立表单视图:打开时触发,从数据源加载数据并填充 model
     */
    default void formViewBehavior(MODEL model) { }

    /**
     * 独立表单视图:字段校验通过后触发,将 model 持久化到数据源
     * 抛出 EruptException 可中止保存并向用户显示错误信息
     */
    default void formSave(MODEL model) throws EruptException { }

}

DataProxy 上下文信息获取

java
@Service
public class EruptTestDataProxy implements DataProxy<EruptTest>{
    
    @Override
    public void afterFetch(Collection<Map<String, Object>> list) {
        // 获取当前操作的 Erupt 类信息(如 EruptTest.class)
        Class<?> clazz = DataProxyContext.currentClass();
        // 获取 @Erupt dataProxyParams 传入的值(字符串数组)
        String[] params = DataProxyContext.params();
        // 获取完整上下文数据对象(内含 eruptModel 与 params)
        DataProxyContext.Data data = DataProxyContext.get();
        EruptModel eruptModel = data.getEruptModel();
    }
    
}

DataProxyContext 主要方法:

方法返回值说明
currentClass()Class<?>当前 Erupt 实体类
params()String[]@Erupt(dataProxy = X.class, dataProxyParams = {"a","b"}) 中的 dataProxyParams
get()DataProxyContext.Data当前上下文数据对象,包含 eruptModelparams 两个属性

get() 是无参方法,不能用来获取 Spring Bean。需要 Bean 时请直接注入,或使用 EruptSpringUtil.getBean(Xxx.class);需要 HttpServletRequest 时直接在 DataProxy 中 @Resource 注入即可。

贡献者

The avatar of contributor named as YuePeng YuePeng
The avatar of contributor named as Claude Opus 5 (1M context) Claude Opus 5 (1M context)

页面历史

Released under the Apache-2.0 License.