若依代码生成的隐藏技巧:如何自定义生成模板实现个性化CRUD页面
若依代码生成器深度定制从模板修改到个性化CRUD实战在快速迭代的企业级应用开发中若依框架的代码生成器无疑是提升效率的利器。但大多数开发者仅停留在基础使用层面未能充分挖掘其定制化潜力。本文将揭示如何通过修改Velocity模板实现高度个性化的CRUD页面满足复杂业务场景需求。1. 理解若依代码生成器的核心机制若依的代码生成器本质上是一个基于Velocity模板引擎的元编程工具。其工作流程可分为三个阶段元数据采集通过解析数据库表结构information_schema获取字段名、类型、注释等信息上下文构建将元数据转换为Velocity模板引擎可处理的变量模型模板渲染使用预设的.vm模板文件生成最终代码关键目录结构说明ruoyi-generator ├── src/main/resources │ ├── templates # Velocity模板目录 │ │ ├── vm │ │ │ ├── java # 后端代码模板 │ │ │ │ ├── controller.java.vm │ │ │ │ ├── service.java.vm │ │ │ │ └── ... │ │ │ ├── xml # MyBatis映射文件模板 │ │ │ └── vue # 前端代码模板 │ └── generator.yml # 生成器配置2. 前端模板定制实战2.1 修改列表页表格样式找到ruoyi-generator/src/main/resources/templates/vm/vue/index.vue.vm定位到表格渲染部分el-table :datadataList selection-changehandleSelectionChange :row-keygetRowKeys #foreach($column in $columns) #set($dictType$column.dictType) el-table-column prop${column.javaField} label${column.columnComment} #if($column.htmlType datetime) width180 #end #if($dictType ! ) template #defaultscope dict-tag :optionsdict.type.${dictType} :valuescope.row.${column.javaField}/ /template #end /el-table-column #end /el-table定制示例添加固定列和斑马纹效果el-table :datadataList stylewidth: 100% stripe border v-loadingloading sort-changehandleSortChange el-table-column typeindex width60 fixedleft label序号 /el-table-column !-- 原有列循环 -- /el-table2.2 自定义表单控件类型在编辑模板form.vue.vm中可以扩展更多表单控件类型#foreach($column in $columns) #if($column.insert || $column.edit) #set($field$column.javaField) #if($column.htmlType select $column.dictType ! ) el-form-item label${column.columnComment} prop${field} el-select v-modelform.${field} placeholder请选择${column.columnComment} el-option v-fordict in dict.type.${column.dictType} :keydict.value :labeldict.label :valuedict.value / /el-select /el-form-item #elseif($column.htmlType upload) !-- 自定义上传控件 -- el-form-item label${column.columnComment} el-upload action/common/upload :on-successhandle${field}Success :before-uploadbefore${field}Upload el-button typeprimary点击上传/el-button /el-upload /el-form-item #end #end #end3. 后端模板深度定制3.1 增强Controller层功能修改controller.java.vm模板添加审计日志和权限控制Log(title ${functionName}, businessType BusinessType.${businessType}) PreAuthorize(ss.hasPermi(${permissionPrefix}:${businessName}:${businessType})) PostMapping(/${businessName}) public AjaxResult add(Validated RequestBody ${ClassName} ${className}) { // 审计字段自动填充 ${className}.setCreateBy(SecurityUtils.getUsername()); ${className}.setCreateTime(DateUtils.getNowDate()); return toAjax(${className}Service.insert${ClassName}(${className})); }3.2 自定义Service逻辑在serviceImpl.java.vm中增加业务校验逻辑Override public int update${ClassName}(${ClassName} ${className}) { // 自定义业务校验 ${ClassName} existing ${className}Mapper.select${ClassName}ById(${className}.get${pkColumn.capJavaField}()); if (existing null) { throw new ServiceException(${functionName}不存在); } // 审计字段 ${className}.setUpdateBy(SecurityUtils.getUsername()); ${className}.setUpdateTime(DateUtils.getNowDate()); return ${className}Mapper.update${ClassName}(${className}); }4. 高级模板技巧4.1 动态条件查询增强改造Mapper模板实现灵活查询!-- 在mapper.xml.vm中 -- select idselect${ClassName}List parameterType${ClassName} resultMap${ClassName}Result include refidselect${ClassName}Vo/ where #foreach($column in $columns) #set($field$column.javaField) #if($column.query) #set($queryType$column.queryType) #set($javaType$column.javaType) #if($queryType EQ) if test$field ! null #if($javaType String) and $field.trim() ! #end AND $column.columnName #{$field}/if #elseif($queryType LIKE) if test$field ! null and $field ! AND $column.columnName LIKE concat(%, #{$field}, %)/if #elseif($queryType BETWEEN) if testparams.begin${field} ! null and params.begin${field} ! AND $column.columnName gt; #{params.begin${field}} /if if testparams.end${field} ! null and params.end${field} ! AND $column.columnName lt; #{params.end${field}} /if #end #end #end /where !-- 添加排序支持 -- choose when testparams.orderByColumn ! null and params.orderByColumn ! ORDER BY ${params.orderByColumn} ${params.isAsc ascending ? ASC : DESC} /when otherwise ORDER BY ${pkColumn.columnName} DESC /otherwise /choose /select4.2 多数据源支持在Service模板中加入多数据源注解// 在serviceImpl.java.vm开头添加 DS(${moduleName}) // 使用模块名作为数据源名称 Service public class ${ClassName}ServiceImpl implements I${ClassName}Service { // ...原有实现 }5. 模板管理最佳实践版本控制将修改后的模板纳入Git管理模块化拆分按业务领域创建不同模板集变量集中管理在generator.yml中定义公共变量模板继承通过#parse指令复用基础模板示例配置片段# generator.yml gen: templateDir: /custom-templates # 自定义模板目录 commonVars: companyName: Acme Inc. copyrightYear: 2023 basePackage: com.acme通过深度定制若依代码生成器模板开发者可以大幅减少重复劳动同时保证生成的代码符合项目特定规范。建议从简单修改开始逐步构建适合自己团队的自定义模板库。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2424517.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!