09-通用功能 common-func¶
📄 创建: ZCode AI 2026-08-14 · 修改: JimWb 2026-08-14
common-func(29 个类)是 Spring Boot 应用的全局基础设施层:基础 Controller、AOP 注解、全局异常处理、Web 配置、Swagger、Excel 导入导出、MyBatis 字段拦截器、链路追踪。
一、EnergyBaseController —— 基础 CRUD Controller(核心)¶
cn.cnbm.bams.common.func.controller.EnergyBaseController<SERVICE, ENTITY>
泛型约束:<SERVICE extends IServiceExt<ENTITY>, ENTITY extends BaseEntity>。通过反射自动获取泛型类型并从 Spring 取 Bean。
继承它,你的 Controller 自动获得全套 REST 接口:
@RestController
@RequestMapping("/demo/product")
public class ProductController
extends EnergyBaseController<ProductService, Product> {
// 空的!全套接口已由父类提供
}
自动获得的接口¶
| 接口路径 | 方法 | 功能 | 注解 |
|---|---|---|---|
/list |
POST | 分页查询(传 BasicParamWrapper) | @TransProperty |
/dict |
POST | 字典查询(指定列) | @TransProperty |
/listCommon |
POST | 分页查询(带 @CommonData,查上级数据) | @TransProperty |
/tree |
POST | 树形查询(实体需实现 ITreeAble) | @TransProperty |
/first |
POST | 取第一条 | |
/last |
POST | 取最后一条 | |
/getOne/{id} |
GET | 按 id 查询 | |
/getTableName |
GET | 取表名 | |
/saveOrUpdate |
POST | 新增/修改(带校验/序列号) | @SysLog |
/batchSaveOrUpdate |
POST | 批量新增/修改 | @SysLog |
/delete/{id} |
POST | 按 id 删除 | @SysLog |
/batchDelete |
POST | 批量删除 | @SysLog |
/deleteByParams |
POST | 按参数删除 | @SysLog |
/listMap |
POST | 分页查 Map 结果 | |
/saveMap |
POST | Map 新增 | |
/updateMap |
POST | Map 更新 | |
/saveOrUpdateMap |
POST | Map 保存/更新 | |
/batchSaveOrUpdateMap |
POST | 批量 Map 保存 | |
/exportToExcel |
POST | 导出 Excel | |
/importExcelData |
POST | 导入 Excel | |
/generateTemplate |
GET | 下载导入模板 |
写操作带
@SysLog(自动记录操作日志),查询带@TransProperty(属性翻译)。
自定义扩展¶
@RestController
@RequestMapping("/demo/product")
public class ProductController extends EnergyBaseController<ProductService, Product> {
// 自定义接口,与父类接口共存
@PostMapping("/custom")
@SysLog // 自定义接口也可加操作日志
public JsonResult custom(@RequestBody Product product) {
getService().saveOrUpdateExt(product);
return JsonResult.success(product);
}
}
二、@SysLog —— 操作日志 AOP¶
cn.cnbm.bams.common.func.annotation.SysLog + cn.cnbm.bams.common.func.aop.SysLogHandler
Controller 方法加注解,自动记录操作日志到 sys_log 表。
@PostMapping("/delete/{id}")
@SysLog // 自动记录
public JsonResult delete(@PathVariable String id) { ... }
记录内容¶
| 字段 | 来源 |
|---|---|
requestIp |
请求 IP |
requestUrl |
请求 URL |
requestMethod |
请求方法 |
requestParams |
方法参数(JSON) |
responseBody |
返回值(JSON) |
exceptionCode/Detail |
异常信息 |
status |
success / error |
costTime |
耗时(毫秒) |
三、@ValidateToken —— JWT 校验 AOP¶
cn.cnbm.bams.common.func.annotation.ValidateToken + ValidateTokenAnnotationHandler
Controller 方法加注解,强制 JWT 校验。从请求头取 Authorization,JwtUtil.verify 失败返回 JsonResult.fail(403, "禁止访问")。
四、全局异常处理¶
cn.cnbm.bams.common.func.config.ExceptionHandlerConfig(@ControllerAdvice)
| 异常类型 | 处理 |
|---|---|
BussinessException(有 code) |
JsonResult.fail(code, message, stackTrace) |
BussinessException(无 code) |
JsonResult.fail("业务异常,请查看系统日志或联系管理员!!!") |
RuntimeException |
JsonResult.fail(OTHER.code, message) |
| 其他 Exception | JsonResult.fail(OTHER.code, FAIL.desc) |
所有异常先
log.error打印。前端收到的统一是JsonResult格式。
五、全局配置¶
CORS(CoreConfig)¶
cn.cnbm.bams.common.func.config.CoreConfig(@Configuration @EnableWebMvc)
全局 CORS:addMapping("/**"),允许所有 origin/method/header,allowCredentials(true),maxAge 3600。
Jackson(MyWebMvcConfigurer)¶
cn.cnbm.bams.common.func.config.MyWebMvcConfigurer
| 配置项 | 值 |
|---|---|
| 命名策略 | SNAKE_CASE |
| 未知属性 | 忽略 |
| 日期格式 | yyyy-MM-dd HH:mm:ss |
| 序列化 | NON_NULL |
| 时间戳 | 禁用 |
| 注册模块 | MySimpleModule + JavaTimeModule |
文件上传限制¶
| 配置 | 值 |
|---|---|
| 单文件 | 200MB |
| 总上传 | 10GB |
静态资源¶
映射 /doc.html、/webjars/**、/favicon.ico、/swagger-ui/**(Knife4j/Swagger UI)。
六、Swagger / Knife4j¶
cn.cnbm.bams.common.func.config.Knife4jOpenApiCustomizer
- 修复 Spring Boot 3.4+
/v3/api-docs兼容问题(issue #913) - 扫描
@ApiSupport注解的 RestController,把 order 值写入 tag 的x-order,实现接口分组排序
SwaggerProperties¶
springdoc:
swagger:
title: "BAMS API"
description: "接口文档"
author: "开发团队"
version: "2.0"
url: "https://example.com"
email: "dev@example.com"
七、版本信息¶
cn.cnbm.bams.common.func.config.VersionAutoConfiguration + VersionController
- 默认启用(
project.version.enabled,matchIfMissing=true) - 暴露
GET {project.version.path:/version} - 读
classpath:version.json,返回 VersionInfo(version/buildTime/commitTime/author/commitHash)
GitInfoController¶
GET /dac/gitInfos:从 git.properties 读 git 构建信息(branch/commit/build time)。
八、Excel 导入导出(ExcelHelper)¶
cn.cnbm.bams.common.func.helper.ExcelHelper
基于 FastExcel(原 EasyExcel)的导入导出工具。
实体注解¶
| 注解 | 说明 |
|---|---|
@ExcelProperty("表头名") |
字段→Excel 列映射 |
@ExcelDictionaryColumn("字典类型") |
字典下拉(编码→中文) |
@ExcelUniqueColumn |
导入去重列 |
导出示例¶
// 导出:用 TableData 动态表头
TableData data = new TableData();
data.setExportName("产品列表");
data.setTableHeaders(headers); // 支持多级嵌套表头
data.setData(dataList); // List<Map> 数据
data.setHeaderColor("#4384C7"); // 表头颜色
excelHelper.exportToExcel(data, response);
导入示例¶
// 导入:自动按 @ExcelProperty 映射,支持 @ExcelUniqueColumn 去重
List<Product> list = excelHelper.importExcelData(file, Product.class);
// ServiceExtImpl.processImportRowData 也支持更灵活的映射
模板生成¶
自动列宽¶
AutoColumnWithStyleStrategy:按内容字节长度自动设置列宽(最大 255)。
字典下拉¶
SelectColumnHandler:为字典列创建 Excel 数据验证下拉框,引用隐藏的"附件-字典"sheet。
九、字段拦截器(MyBatis)¶
@FieldValueFormat —— 字段格式化¶
cn.cnbm.bams.common.func.interceptors.ibatis.FieldValueFormatInterceptor
拦截 INSERT/UPDATE,对标记 @FieldValueFormat 的 String 字段执行格式化。
@FieldValueFormat(trim = true) // 前后去空格
private String name;
@FieldValueFormat(replaceRegex = "\\s+", replaceReplacement = "") // 去所有空白
private String code;
| 属性 | 功能 |
|---|---|
replaceBlank |
去所有非单词字符 |
replaceRegex / replaceReplacement |
正则替换 |
trim / trimMode |
前后去空格 |
@RedisCache —— 查询后 Redis 回填¶
cn.cnbm.bams.common.func.interceptors.ibatis.FieldValueRedisCacheInterceptor
拦截查询结果集,对标记 @RedisCache 的字段从 Redis 取值回填。
@RedisCache(
key = "user:{id}", // key 模板,{字段名} 占位
jsonKey = "userName", // 从 Redis JSON 取这个子键
redisType = "1" // "1"=getObject, 其他=hget
)
private String userName; // 查询后自动从 Redis 填充
十、链路追踪¶
cn.cnbm.bams.common.func.log.TraceLogInterceptor + TraceLogBeanRegistry
preHandle:生成 UUID(无横线)→ request attributeTRACE_ID+ SLF4JMDC.put("TRACE_ID", traceId)afterCompletion:响应头写Trace-Id+MDC.remove
日志配置¶
在 logback 配置中加 %X{TRACE_ID} 即可输出 traceId:
十一、表达式求值(Aviator)¶
cn.cnbm.bams.common.func.Evaluator
基于 Aviator 表达式引擎。
| 方法签名 | 功能 |
|---|---|
static Object eval(String content, IParser parser) |
求值(带参数) |
static Object eval(String content, Map params) |
求值(Map 参数) |
static Object eval(String content) |
求值(无参) |
公式解析器¶
| 类 | 说明 |
|---|---|
IParser |
解析器接口 |
ParserContext |
解析上下文(继承 Dict) |
AbstractParser |
模板方法,用正则 #{param(...)} 提取变量 |
十二、字段自动填充(MetaObjectHandler)¶
cn.cnbm.bams.common.func.sequence.MyBatisPlusMetaObjectHandler(@Component)
继承 bams-pojo 的 EnergyMetaObjectHandler,实现 getCurrentLoginUser() 从 PermissionContextHolder 取 userId。
insertFill:
├─ id 为空 → IDUtil.getId()
├─ createdTime/updatedTime → 当前时间
└─ createdBy/updatedBy → PermissionContextHolder 的 userId
updateFill:
├─ updatedTime → 当前时间
└─ updatedBy → userId
这是 BaseEntity 审计字段自动填充的实际实现。详见 04-实体与数据访问。
十三、自动建表¶
cn.cnbm.bams.common.func.config.SystemSettingsProperties
相关文档¶
- 01-快速开始 — EnergyBaseController 三行代码示例
- 04-实体与数据访问 — BaseEntity 自动填充
- 05-业务服务层 — ServiceExtImpl(EnergyBaseController 调用)
- 07-数据权限 — PermissionContextHolder
- 06-文件管理 — SysFileStorageConfigController 继承 EnergyBaseController