# stringtemplate4 设置 $ ``` STGroup group = new STGroupString("db_template",template, '$', '$'); ``` ## 模版的定义 基础 ``` classTemplate(item, module, operationList, className) ::= << >> ``` > 注意 <<内容>> 定义的方法 > > classTemplate 为 group.getInstanceOf("classTemplate"); 定义 例子: ```java classTemplate(item, module, operationList, className) ::= << package $module.packageName$; /** * @author xia * @date 2026/1/10 * @version 0.0.1 */ public class $className$ { } >> ``` 映射字典 ```ts // 定义一个映射字典 requestAnnotations ::= [ "POST": "@PostMapping", "GET": "@GetMapping", "PUT": "@PutMapping", "DELETE": "@DeleteMapping", default: "@RequestMapping" ] ``` ## Controller ```java requestAnnotations ::= [ "POST": "@PostMapping", "GET": "@GetMapping", "PUT": "@PutMapping", "DELETE": "@DeleteMapping", default: "@RequestMapping" ] classTemplate(module,item,operationList,basics) ::= << package $module.packageName$.controller; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; /** * $item.itemName$ 控制器 * @author xia */ @Tag(name = "$item.itemName$") @RequiredArgsConstructor @RestController @RequestMapping("/$item.itemCode$") public class $basics.itemCodeUp$Controller { private final $basics.itemCodeUp$Service $item.itemCode$Service; $operationList:{op | @OperLog @SecureAudit(id = $op.id$,$if(op.isGreenLight)$isGreenLight = true,$endif$ $if(!item.isTenant)$isTenant = false,$endif$ funType = FunTypeEnum.$op.funType$, funName = "$op.funName$", funCode = "$module.moduleCode$:$item.itemCode$:$op.operationCode$") @Operation(summary = "$op.funName$", description = "$op.describe$") $requestAnnotations.(op.requestType)$("$op.url$$op.pathParamsUrl$") public XResult<$if(op.isPage)$Page<$basics.itemCodeUp$$op.methodNamePascalCase$Res>$else$$if(op.isResParams)$$basics.itemCodeUp$$op.methodNamePascalCase$Res$else$Void$endif$$endif$> $op.methodName$($if(op.isReqParams)$@RequestBody @Valid $basics.itemCodeUp$$op.methodNamePascalCase$Req req$endif$$op.pathParamsLong$) { return $item.itemCode$Service.$op.methodName$($if(op.isPathParams)$$op.pathParams$$endif$$if(op.isReqParams)$req$endif$); \} }$ } >> ``` ## 请求参数 ```java classTemplate(module,item,operationList,basics) ::= << package $module.apiPackageName$.request.$item.itemCode$; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import java.io.Serial; import java.io.Serializable; /** * $item.itemName$ * $basics.oper.funName$ 请求参数 * @author xia */ @Getter @Setter @Schema(description = "$basics.oper.funName$ 参数") public class $basics.itemCodeUp$Req $if(basics.oper.isPage)$extends XhPage$endif$ implements Serializable { @Serial private static final long serialVersionUID = 1L; } >> ``` ## 响应参数 ```java classTemplate(module,item,operationList,basics) ::= << package $module.apiPackageName$.response.$item.itemCode$; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import java.io.Serial; import java.io.Serializable; /** * $item.itemName$ * $basics.oper.funName$ 响应 * @author xia */ @Getter @Setter @Schema(description = "$basics.oper.funName$ 响应") public class $basics.itemCodeUp$Res implements Serializable { @Serial private static final long serialVersionUID = 1L; } >> ``` ## 服务接口 ```java classTemplate(module,item,operationList,basics) ::= << package $module.packageName$.service; /** * $item.itemName$ 服务层接口 * @author xia */ public interface $basics.itemCodeUp$Service { $operationList:{op | /** * $op.funName$ * $op.describe$ */ XResult<$if(op.isPage)$Page<$basics.itemCodeUp$$op.methodNamePascalCase$Res>$else$$if(op.isResParams)$$basics.itemCodeUp$$op.methodNamePascalCase$Res$else$Void$endif$$endif$> $op.methodName$($if(op.isReqParams)$$basics.itemCodeUp$$op.methodNamePascalCase$Req req$endif$$if(op.isPathParams)$$op.pathParamsLongReq$$endif$); }$ } >> ``` ## 服务接口实现 ```java classTemplate(module,item,operationList,basics) ::= << package $module.packageName$.service.impl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import $module.packageName$.service.$basics.itemCodeUp$Service; /** * $item.itemName$ 服务层接口 * @author xia */ @Service @RequiredArgsConstructor public class $basics.itemCodeUp$ServiceImpl implements $basics.itemCodeUp$Service{ $operationList:{op | /** * $op.funName$ * $op.describe$ */ @Override public XResult<$if(op.isPage)$Page<$basics.itemCodeUp$$op.methodNamePascalCase$Res>$else$$if(op.isResParams)$$basics.itemCodeUp$$op.methodNamePascalCase$Res$else$Void$endif$$endif$> $op.methodName$($if(op.isReqParams)$$basics.itemCodeUp$$op.methodNamePascalCase$Req req$endif$$if(op.isPathParams)$$op.pathParamsLongReq$$endif$){ // TODO $op.funName$ 实现 return null; \} }$ } >> ``` ## 模块数据 ```xml group dbXml; moduleTemplate(module) ::= << 初始化模块数据 $module:{op | }$ >> itemTemplate(item) ::= << 初始化功能数据 $item:{op | }$ >> funTypeAnnotations ::= [ "ADD": "0", "DELETE": "1", "EDIT": "2", "QUERY": "3", "UPLOAD": "4", "DOWNLOAD": "5", "IMPORT": "6", "EXPORT": "7", "PRINT": "8", "REGISTER": "9", "LOGIN": "10", "LOGOUT": "11", "SMS": "12", "EMAIL": "13", "WECHAT": "14", "OTHER": "99" default: "-1" ] operationTemplate(operation) ::= << 初始化操作数据 $operation:{op | }$ >> ``` ## 角色套餐 初始化数据 ```xml group dbXml; roleBindFunTemplate(operations,clientTypeCode,clientTypeDesc) ::= << 初始化平台角色权限数据($clientTypeDesc$) $operations:{op | }$ >> mealBindFunTemplate(meals,clientTypeCode,clientTypeDesc) ::= << 初始化模块数据($clientTypeDesc$) $meals:{op | }$ >> ``` ## 菜单数据 菜单数据生成 ```xml menuTypeAnnotations ::= [ "MENU_ID": "0", "BUTTON_ID": "1" ] clientTypeAnnotations ::= [ "PC": "0", "MINI_PROGRAM": "1", "H5": "2" ] menuTemplate(menus) ::= << 初始化菜单数据 $menus:{op | }$ >> ```