通用接口
通用接口也是一种开发规范, 遵循这些规范,使用这些通用接口将大量减少重复工作。
Option接口
矩阵星云提供了一个通用Option接口,无论是枚举类型还是数据库字典都可以通过这个接口为前端单选与多选控件提供备选数据集。
后端接口:
包 名: com.matrix.framework.global.controller
原 型: public Mono<Result<List<Options>>> getOptions(@RequestBody TypeDefDto dto)
参 数: typeDefDto
返回值: Mono<Result<List<Options>>>
约 束:
1: 枚举类型必须实现IEnumDescribable接口
2. 数据库字典服务必须实现IOptionService接口前端接口:
路径名: ./apps/web-antd/src/api/core/optontool.ts
原 型: function getOptionsApi(data: TypeDefDto)
参 数: interface TypeDefDto
返回值: interface Option枚举类型示例
后端定义一个枚举类型, 该枚举类型必须实现IEnumDescribable接口, 如下图所示: 
前端只需要传递给后端一个枚举类型的包格式的全路径,即可拉取到枚举值 
页面效果如下: 
数据库字典示例
实现一个访问数据库字典的服务类, 该服务类必须实现IOptionService接口, 如下图所示: 
前端只需要传递给后端一个服务类bean名称,即可拉取到字典集合, 由于示例模块没有应用场景. 前端代码参考枚举类型图示, 将枚举包路径用服务类bean名称替换即可.
最终的页面效果参考如下图所示: 
分页器
一般情况下, 列表查询都是分页的, 矩阵星云提供一个统一的分页器, 定义如下:
package com.matrix.framework.core.common.global;
import java.util.List;
/**
* 分页基类
*
* Copyright © 海平面工作室 版权所有
*
* @Author: Leo
* @Create: 2025/06/01 19:10
* @Since 1.0
*/
public class Pager<T> {
/** 当前页码,从1开始 */
private int page = 1;
/** 每页数量 */
private int pageSize = 10;
/** 成员VO集合 */
private List<T> items;
/** 总数 */
private long total;
// get,set方法
...
}在进行列表查询时, 入参与返回值都需要是它的子类, 其中泛型是列表集合的视图类, 以项目成员管理为例,进行列表查询时应该定义一个继承Pager的MemberDto类, 并明确泛型为成员视图类. 如下图所示: 
进行列表查询时, 将查询条件也置于dto中供服务类取用, 查询结果存于其中并返回给前端, 如下图所示: 
上图可见入参与返回值都是Pager的子类MemberDto. 它既是输入也是输出,输入时带入分页参数与查询条件参数; 输出时同样返回分页信息以及查询结果。
返回值封装器
基本上Web应用的返回值的结构大致是一样的, 包括返回码, 提示信息以及数据结果. 矩阵星云也是如此, 返回值封装器的结构如下:
package com.matrix.framework.core.common.result;
import static com.matrix.framework.core.common.result.ResultCodeEnum.CHECK_FAIL;
/**
* 返回结果类
*
* Copyright © 海平面工作室 版权所有
*
* @Author: Leo
* @Create: 2024/10/3 11:15
*/
public class Result<T> {
//返回码
private Integer code;
//返回消息
private String message = "ok";
//返回数据
private T data;
public Result(){}
/**
* 操作成功
* @param data baseCategory1List
* @param <T>
* @return
*/
public static<T> Result<T> ok(T data){
return build(data, ResultCodeEnum.SUCCESS);
}
/**
* 操作失败
* @param data
* @param <T>
* @return
*/
public static<T> Result<T> fail(T data){
return build(data, ResultCodeEnum.FAIL);
}
...
}页面调用后的数据示例如下:
{
"code": 200,
"message": "成功",
"data": {
"page": 1,
"pageSize": 20,
"items": [
{
"id": 1,
"name": "张三",
"sex": "男",
"phone": "19864634678",
"role": "架构师"
},
{
"id": 2,
"name": "李四",
"sex": "男",
"phone": "13953685436",
"role": "后端专家"
},
{
"id": 3,
"name": "王五",
"sex": "女",
"phone": "13690745678",
"role": "前端专家"
},
{
"id": 6,
"name": "赵六",
"sex": "男",
"phone": "13723578976",
"role": "市场专员"
}
],
"total": 4,
"searchKey": "",
"role": "",
"sex": ""
}
}自动化审计日志
审计日志采用AOP实现自动生成, 只需要在控制器类的增删改的方法上添加上@LogCollector注解即可。如下图所示: 
为了让日志内容具有实际意义, 还需要在Po实体类实现toString()方法, 如下图所示: 
当发生增删改事件时, 自动生成的日志如下图所示: 
