首页 / 资讯中心 / 文章详情

若依前后端分离版集成Mybatis-Plus代码生成器实战指南

若依前后端分离版集成Mybatis-Plus代码生成器实战指南 ★ FEATURED ARTICLE
简介本资源是面向Java全栈开发者与若依平台二次开发者的工程实践包聚焦于在若依前后端分离版中深度集成Mybatis-Plus代码生成器解决重复编写CRUD基础代码、数据库变更后手动同步效率低等典型痛点。资源共2010个文件主体为1605份Markdown文档含环境配置指南、生成器使用手册、常见问题排错说明、251个Java类覆盖Entity、Mapper、Service及Controller模板、101个JS前端适配脚本辅以31个XML配置与2个SQL建表脚本整体71.55MB结构完整、开箱即用。已有540人学习下载适合中高级开发者快速搭建标准化后端骨架并支持后续迭代中一键重生成。读者可直接复用其生成策略配置、多模块目录组织方式及若依Mybatis-Plus协同规范显著缩短项目初始化周期降低维护成本。1. 若依前后端分离版集成Mybatis-Plus代码生成器不是加个插件就完事而是要让生成的代码真正跑进你的业务流水线里很多同学在毕设或课设里选了若依RuoYi前后端分离版想快速搭出一个带CRUD的管理后台——结果卡在「怎么把Mybatis-Plus的代码生成器塞进去」这一步。不是生成不了是生成出来的Mapper、Service、Controller要么包路径错乱、要么字段映射失败、要么连不上数据库连接池更常见的是生成器能跑通但生成的代码一放进若依工程里就编译报红、启动报NoSuchBeanDefinitionException、前端调用404。这不是工具不行是没理清若依的模块分层逻辑和Mybatis-Plus生成器的注入时机。这套方案专为「已拉下若依VueSpringBoot标准分支、正卡在代码生成环节」的同学设计它不讲原理只给可粘贴、可调试、可答辩的完整集成路径——从pom依赖冲突解决、到生成模板定制、再到生成后自动注册进若依权限体系每一步都对应真实翻车现场。适合做毕设/课设的同学直接套用结构也适合刚接手若依二次开发的工程师快速落地。2. 总体架构设计三层解耦与四个关键注入点的职责划分若依前后端分离版采用典型的分层架构前端Vue独立部署后端SpringBoot提供REST API数据库通过Druid连接池管理。而Mybatis-Plus代码生成器MPG本质是一个运行时代码生成工具它不参与运行期逻辑但其输出必须无缝融入若依的已有结构中。因此集成不是“把MPG加进pom然后执行main方法”而是明确四个关键注入点并确保每个点都与若依当前版本v4.7.0的约定一致注入点①依赖坐标与版本对齐—— 若依默认使用Mybatis-Plus 3.4.3.4而新版MPG 3.5.x起要求Java 17且移除了AutoGenerator类必须降级或适配注入点②模板引擎与包路径策略—— 若依的Controller放在com.ruoyi.web.controller.systemService在com.ruoyi.service但MPG默认生成在com.example下需重写包名策略注入点③数据源与事务管理器绑定—— 若依使用DruidDataSourceDataSourceTransactionManagerMPG生成的Mapper XML需被SqlSessionFactory扫描否则MapperScan失效注入点④生成后自动注册进若依菜单/权限体系—— 若依所有功能模块需在sys_menu表中预置记录否则生成的页面无法在左侧菜单显示用户无权访问。这四个点环环相扣依赖错生成器启动失败包路径错Spring找不到Bean数据源未绑定Mapper执行SQL时报空指针菜单未注册前端压根看不到新页面。下面逐个击破。2.1 依赖配置锁定Mybatis-Plus 3.4.3.4并排除冲突传递依赖若依v4.7.0的pom.xml中已声明mybatis-plus-boot-starter:3.4.3.4但MPG官方startermybatis-plus-generator在3.5.0版本中强制升级了mybatis-plus-core至3.5.x导致LambdaQueryWrapper构造异常、TableName注解失效。必须手动降级并切断传递依赖!-- 在ruoyi-admin模块的pom.xml中dependencies内添加 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.4.1/version exclusions exclusion groupIdcom.baomidou/groupId artifactIdmybatis-plus-core/artifactId /exclusion exclusion groupIdcom.baomidou/groupId artifactIdmybatis-plus-extension/artifactId /exclusion /exclusions /dependency提示mybatis-plus-generator:3.4.1是最后一个兼容mybatis-plus-boot-starter:3.4.3.4的稳定版。不要用3.5.0及以上否则StrategyConfig.setInclude()会抛NoSuchMethodError——这是学生答辩时最常被导师问住的点为什么生成器跑不通答“版本不匹配”比“不知道”强十倍。同时在ruoyi-common模块中确认mybatis-plus-boot-starter版本未被其他依赖覆盖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.4.3.4/version /dependency验证方式执行mvn dependency:tree | grep mybatis-plus确保输出中只有3.4.3.4和3.4.1无3.5.x字样。2.2 包路径与模块归属策略按若依标准目录树生成代码若依的模块划分非常严格ruoyi-system负责系统管理用户、角色、菜单ruoyi-framework是基础框架ruoyi-admin是启动模块。MPG默认生成代码到com.example必须重写PackageConfig使其严格遵循若依的包结构// 在ruoyi-admin/src/main/java/com/ruoyi/generator/CodeGenerator.java中 PackageConfig pc new PackageConfig(); pc.setParent(com.ruoyi); // 根包名 pc.setModuleName(system); // 模块名 → 对应ruoyi-system模块 pc.setEntity(domain); // 实体类放com.ruoyi.system.domain pc.setMapper(mapper); // Mapper接口放com.ruoyi.system.mapper pc.setXml(mapper); // XML放resources/mapper/system/ pc.setService(service); // Service放com.ruoyi.system.service pc.setServiceImpl(service.impl); // 实现类放com.ruoyi.system.service.impl pc.setController(web.controller.system); // Controller放com.ruoyi.web.controller.system关键细节moduleName(system)不是随便写的——它决定了生成文件的子目录层级也影响后续菜单注册脚本的路径拼接setXml(mapper)配合GlobalConfig.setOutputDir()指向ruoyi-system/src/main/resources/mapper/system/否则XML无法被SqlSessionFactory扫描Controller必须落在web.controller.system因为若依的RequestMapping(/system)统一前缀由该包下Controller继承否则前端请求/system/user/list会404。生成后检查ruoyi-system模块下的实际目录结构是否如下以user表为例ruoyi-system/ ├── src/main/java/com/ruoyi/system/domain/User.java ├── src/main/java/com/ruoyi/system/mapper/UserMapper.java ├── src/main/resources/mapper/system/UserMapper.xml ├── src/main/java/com/ruoyi/system/service/UserService.java ├── src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java └── src/main/java/com/ruoyi/web/controller/system/UserController.java若目录错位如Controller生成在com.ruoyi.system.controller则必须修改pc.setController()不能靠IDE手动挪动——因为挪动后PreAuthorize(ss.hasPermi(system:user:list))权限注解会因包路径变化失效。2.3 数据源与Mapper扫描绑定让生成的Mapper被Spring真正识别若依使用DruidDataSource并通过MyBatisConfig类配置SqlSessionFactory其MapperScan默认扫描com.ruoyi.*.mapper包。但MPG生成的Mapper接口若放在com.ruoyi.system.mapper下仍可能因MapperScannerConfigurer初始化顺序问题导致Bean未注册。解决方案在ruoyi-system模块的resources/META-INF/spring.factories中显式声明Mapper扫描器若不存在则新建org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.ruoyi.system.config.MyBatisPlusConfig并在ruoyi-system/src/main/java/com/ruoyi/system/config/MyBatisPlusConfig.java中定义Configuration MapperScan(basePackages {com.ruoyi.system.mapper}, sqlSessionTemplateRef sqlSessionTemplate) public class MyBatisPlusConfig { Bean Primary public SqlSessionTemplate sqlSessionTemplate(Qualifier(sqlSessionFactory) SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }注意MapperScan的basePackages值必须与MPG生成的pc.setMapper(mapper)完全一致且sqlSessionTemplateRef必须指向若依主配置中定义的sqlSessionFactoryBean名查看ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java确认。验证方式启动项目后在http://localhost:8080/druid/sql.html中执行任意一条SELECT * FROM sys_user LIMIT 1观察Druid监控页是否出现该SQL——若出现说明Mapper已成功注入若不出现检查MyBatisPlusConfig是否被Spring加载在类上加PostConstruct打印日志。2.4 菜单与权限自动注册生成代码后一键写入sys_menu表若依所有功能入口必须在sys_menu表中存在记录否则即使Controller能响应请求前端菜单也不显示用户点击即404。MPG本身不处理此逻辑需在生成完成后自动插入菜单数据。我们在CodeGenerator.java末尾追加菜单注册逻辑// 生成完毕后自动向sys_menu插入记录 private static void insertMenu(String tableName, String tableComment) { JdbcTemplate jdbcTemplate new JdbcTemplate(dataSource()); String sql INSERT INTO sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time) VALUES (?, 0, (SELECT IFNULL(MAX(order_num), 0) 1 FROM sys_menu WHERE parent_id 0), /system/ tableName , C, 0, system: tableName :view, fa fa-circle-o, admin, NOW()); jdbcTemplate.update(sql, tableComment); // 如用户管理 // 插入子菜单查询、新增、修改、删除 Long parentId jdbcTemplate.queryForObject(SELECT menu_id FROM sys_menu WHERE perms system: tableName :view, Long.class); String[] perms {list, add, edit, remove}; String[] names {查询, 新增, 修改, 删除}; for (int i 0; i perms.length; i) { jdbcTemplate.update( INSERT INTO sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time) VALUES (?, ?, ?, #, F, 0, system: tableName : perms[i] , , admin, NOW()), names[i], parentId, i 1 ); } }其中dataSource()方法返回若依的DruidDataSource实例需通过ApplicationContext获取此处为简化展示实际需注入DataSourceBean。关键设计点菜单perms字段格式必须为system:xxx:view列表页、system:xxx:list查询按钮权限与若依前端v-permission指令和后端PreAuthorize注解严格对应。若写成user:list或sys_user:list权限校验永远失败。生成后登录若依后台账号admin/admin123进入【系统管理】→【菜单管理】搜索用户管理确认主菜单及四个子菜单均已存在且perms列值与代码中拼接的一致。3. 核心模块实现从数据库表到可运行页面的六步闭环集成不是终点而是让生成的代码真正跑起来。以下以sys_user表为例走通从建表→生成→编译→启动→菜单→权限的完整闭环。每一步都对应毕设答辩中“请演示一下你做的功能”的实操环节。3.1 数据库准备按若依规范建表并填充基础数据若依要求所有业务表必须有create_by、create_time、update_by、update_time、remark等公共字段。sys_user表结构需严格遵循CREATE TABLE sys_user ( user_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 用户ID, dept_id bigint(20) DEFAULT NULL COMMENT 部门ID, login_name varchar(30) NOT NULL COMMENT 登录账号, user_name varchar(30) NOT NULL COMMENT 用户昵称, user_type varchar(2) DEFAULT 00 COMMENT 用户类型00系统用户, email varchar(50) DEFAULT COMMENT 用户邮箱, phonenumber varchar(11) DEFAULT COMMENT 手机号码, sex char(1) DEFAULT 0 COMMENT 用户性别0男 1女 2未知, avatar varchar(100) DEFAULT COMMENT 头像路径, password varchar(50) NOT NULL COMMENT 密码, salt varchar(20) DEFAULT COMMENT 盐加密, status char(1) DEFAULT 0 COMMENT 帐号状态0正常 1停用, del_flag char(1) DEFAULT 0 COMMENT 删除标志0代表存在 2代表删除, login_ip varchar(128) DEFAULT COMMENT 最后登录IP, login_date datetime DEFAULT NULL COMMENT 最后登录时间, create_by varchar(64) DEFAULT COMMENT 创建者, create_time datetime DEFAULT NULL COMMENT 创建时间, update_by varchar(64) DEFAULT COMMENT 更新者, update_time datetime DEFAULT NULL COMMENT 更新时间, remark varchar(500) DEFAULT NULL COMMENT 备注, PRIMARY KEY (user_id) ) ENGINEInnoDB AUTO_INCREMENT100 DEFAULT CHARSETutf8mb4 COMMENT用户信息表;注意del_flag字段值必须为0字符型若设为0数字型Mybatis-Plus的LogicDelete逻辑删除会失效status同理。这是学生最容易忽略的“玄学”坑——表建对了但删除按钮点了没反应查半天发现是字段类型错了。插入一条测试数据INSERT INTO sys_user (user_id, login_name, user_name, email, phonenumber, password, salt, status, del_flag, create_by, create_time) VALUES (101, testuser, 测试用户, testexample.com, 13800138000, e10adc3949ba59abbe56e057f20f883e, 123456, 0, 0, admin, NOW());3.2 执行代码生成定制化模板与字段过滤MPG默认生成所有字段但若依的sys_user表中password、salt等敏感字段不应出现在列表页和表单中。需在StrategyConfig中配置字段过滤StrategyConfig strategy new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); // 下划线转驼峰 strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); // 使用Lombok strategy.setRestControllerStyle(true); // 生成RestController strategy.setInclude(sys_user); // 只生成指定表 strategy.setTablePrefix(sys_); // 表前缀生成类名去掉前缀 → User // 过滤敏感字段不生成到Entity和VO中 ListString ignoreColumns Arrays.asList(password, salt, login_ip, login_date); strategy.setExclude(ignoreColumns.toArray(new String[0]));同时自定义FreeMarker模板templates/entity.java.ftl中增加字段注解控制#list table.fields as field #if !ignoreColumns?seq_contains(field.name) #if field.keyFlag TableId(value ${field.name}, type IdType.AUTO) #else TableField(${field.name}) /#if private ${field.propertyType} ${field.propertyName}; /#if /#list生成后检查User.java中是否不含password、salt等字段——若存在说明strategy.setExclude()未生效需确认ignoreColumns变量在模板上下文中是否传入实际开发中建议将过滤逻辑写死在模板内避免运行时传参失败。3.3 编译与启动解决Mapper XML路径与SQL语法兼容性问题生成的UserMapper.xml默认放在resources/mapper/system/下但若依的MyBatisConfig中mapperLocations配置为Bean Primary public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(classpath:mapper/**/*.xml)); // 注意是**/*.xml非*/**.xml // ... }因此UserMapper.xml必须位于ruoyi-system/src/main/resources/mapper/system/且mapper namespacecom.ruoyi.system.mapper.UserMapper中的namespace必须与接口全限定名一致。常见翻车点生成的XML中select idselectList使用了Mybatis-Plus 3.4.3.4不支持的bind标签或foreach嵌套过深。此时需手动简化SQL!-- 错误MPG 3.4.1生成的复杂条件 -- select idselectList resultTypecom.ruoyi.system.domain.User SELECT * FROM sys_user WHERE del_flag 0 if testuserName ! null and userName ! AND user_name LIKE CONCAT(%, #{userName}, %) /if /select提示若启动生成的Controller后调用/system/user/list返回空数组但数据库有数据大概率是XML中SQL语法不被Mybatis 3.4.3.4解析。此时打开application.yml将logging.level.com.ruoyi.system.mapperDEBUG查看控制台打印的实际SQL再对比数据库执行是否一致。3.4 前端页面集成复用若依Vue组件快速生成CRUD界面若依前端使用Vue2 Element UI其列表页结构高度标准化。生成UserController后无需从零写Vue只需在ruoyi-ui/src/views/system/下新建user/index.vue复用若依现有组件template div classapp-container el-form :modelqueryParams refqueryForm sizesmall :inlinetrue v-showshowSearch label-width68px el-form-item label用户名称 propuserName el-input v-modelqueryParams.userName placeholder请输入用户名称 clearable keyup.enter.nativehandleQuery/ /el-form-item el-form-item el-button typeprimary iconel-icon-search sizemini clickhandleQuery搜索/el-button el-button typedanger iconel-icon-refresh sizemini clickresetQuery重置/el-button /el-form-item /el-form el-table v-loadingloading :datauserList sort-changesortChange stylewidth: 100% el-table-column label用户编号 aligncenter propuserId/ el-table-column label登录名称 aligncenter proploginName/ el-table-column label用户昵称 aligncenter propuserName/ el-table-column label邮箱 aligncenter propemail/ el-table-column label手机号 aligncenter propphonenumber/ el-table-column label状态 aligncenter propstatus template slot-scopescope dict-tag :optionssys_normal_disable :valuescope.row.status/ /template /el-table-column el-table-column label操作 aligncenter class-namesmall-padding fixed-width template slot-scopescope el-button sizemini typetext iconel-icon-edit clickhandleUpdate(scope.row) v-hasPermi[system:user:edit]修改/el-button el-button sizemini typetext iconel-icon-delete clickhandleDelete(scope.row) v-hasPermi[system:user:remove]删除/el-button /template /el-table-column /el-table pagination v-showtotal0 :totaltotal :page.syncqueryParams.pageNum :limit.syncqueryParams.pageSize paginationgetList / /div /template script import { listUser, deleteUser } from /api/system/user; export default { name: User, data() { return { loading: true, total: 0, userList: [], queryParams: { pageNum: 1, pageSize: 10, userName: undefined }, showSearch: true, sys_normal_disable: [] }; }, created() { this.getList(); }, methods: { getList() { this.loading true; listUser(this.queryParams).then(response { this.userList response.rows; this.total response.total; this.loading false; }); }, handleQuery() { this.queryParams.pageNum 1; this.getList(); }, resetQuery() { this.$refs.queryForm.resetFields(); this.handleQuery(); }, handleUpdate(row) { this.$router.push({ path: /system/user/edit, query: { userId: row.userId } }); }, handleDelete(row) { this.$confirm(是否确认删除用户编号为 row.userId 的数据项?, 警告, { confirmButtonText: 确定, cancelButtonText: 取消, type: warning }).then(function() { return deleteUser(row.userId); }).then(() { this.getList(); this.$message.success(删除成功); }).catch(function() {}); } } }; /script关键点listUser、deleteUser等API函数需在ruoyi-ui/src/api/system/user.js中定义且URL前缀必须为/system/user与后端RequestMapping(/system/user)严格对应。若前端报404先检查api文件中URL是否漏写/system/。3.5 权限控制验证从前端按钮到后端接口的双重拦截若依权限体系是双层拦截前端通过v-hasPermi指令控制按钮显隐后端通过PreAuthorize注解校验权限。生成的UserController中已自带注解RestController RequestMapping(/system/user) public class UserController extends BaseController { PreAuthorize(ss.hasPermi(system:user:list)) GetMapping(/list) public TableDataInfo list(User user) { ... } PreAuthorize(ss.hasPermi(system:user:add)) PostMapping public AjaxResult add(Validated RequestBody User user) { ... } }验证方式用普通用户非admin登录进入用户管理页确认“新增”、“修改”按钮不显示v-hasPermi生效手动在浏览器控制台执行axios.get(/system/user/list)返回403 Forbidden后端PreAuthorize拦截用admin账号登录执行相同请求返回正常数据。若前端按钮隐藏但后端未拦截即普通用户F12改请求仍能调用说明PreAuthorize未生效——检查ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java中是否启用EnableGlobalMethodSecurity(prePostEnabled true)该注解必须存在且prePostEnabled true。3.6 菜单动态刷新解决生成后前端菜单不显示的缓存问题生成菜单数据后前端不会自动刷新左侧菜单。学生常以为“数据写进数据库了菜单就该出来”结果答辩时导师点开系统左侧还是老样子。根本原因若依前端菜单数据在登录时从/getRouters接口一次性加载并缓存于Vuex后续不主动刷新。解决方案有两个方案A推荐适合毕设强制登出再登录生成菜单后清空浏览器localStorage中ruoyi_token和ruoyi_menus重新登录即可加载新菜单。方案B生产可用调用/sys/menu/list接口实时刷新在ruoyi-ui/src/layout/components/Sidebar/index.vue中监听路由变化当进入系统管理页时触发菜单刷新watch: { $route: { handler: function(val, oldVal) { if (val.path.startsWith(/system) val.path ! oldVal.path) { this.$store.dispatch(permission/getRouters).then(() { this.$nextTick(() { this.$router.push(val.path); // 重新导航 }); }); } }, immediate: true } }血泪经验答辩前务必用非admin账号测试权限用admin账号测试菜单刷新。曾有同学答辩时演示“新增用户”结果点“新增”按钮没反应排查半小时才发现v-hasPermisystem:user:add写成了system:user:adds多了一个s这种低级错误在压力下极易发生。4. 避坑指南集成过程中最常翻车的5个致命点及修复方案集成若依与Mybatis-Plus代码生成器表面是加依赖、写配置实则处处是坑。以下是我在多个毕设指导和企业项目中高频遇到的5个致命问题按“现象→原因→解决”结构给出可立即执行的修复方案。4.1 现象生成器执行报java.lang.NoClassDefFoundError: com/baomidou/mybatisplus/core/toolkit/StringUtils原因mybatis-plus-generator:3.4.1依赖mybatis-plus-core:3.4.1但若依工程中mybatis-plus-boot-starter:3.4.3.4又引入了mybatis-plus-core:3.4.3.4两个版本的StringUtils类签名不一致3.4.1中无isBlank(CharSequence)静态方法3.4.3.4中有导致类加载冲突。解决在ruoyi-admin/pom.xml中为mybatis-plus-generator添加exclusions彻底排除其传递依赖并确保mybatis-plus-core仅由mybatis-plus-boot-starter提供dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.4.1/version exclusions exclusion groupIdcom.baomidou/groupId artifactIdmybatis-plus-core/artifactId /exclusion exclusion groupIdcom.baomidou/groupId artifactIdmybatis-plus-extension/artifactId /exclusion /exclusions /dependency执行mvn clean compile后用javap -cp target/classes com.baomidou.mybatisplus.generator.AutoGenerator确认类路径中无重复StringUtils。4.2 现象生成的Controller中PreAuthorize注解不生效所有用户都能访问原因若依的SecurityConfig中EnableGlobalMethodSecurity注解缺失或prePostEnabled设为false导致PreAuthorize被Spring Security忽略。解决打开ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java确认存在以下配置Configuration EnableGlobalMethodSecurity(prePostEnabled true, proxyTargetClass true) public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }特别注意proxyTargetClass true——若设为falseJDK Proxy则PreAuthorize在Service层不生效必须设为true启用CGLIB代理。4.3 现象前端调用/system/user/list返回404但Controller类存在且RequestMapping正确原因MPG生成的UserController未被Spring MVC扫描到常见于两种情况1RestController注解被误删2ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/包未被ComponentScan包含。解决检查ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java中的ComponentScanSpringBootApplication ComponentScan(basePackages {com.ruoyi}) public class RuoYiApplication { ... }确保basePackages包含com.ruoyi.web.controller.system。若为{com.ruoyi.admin}则需改为{com.ruoyi}或显式添加com.ruoyi.web.controller.system。4.4 现象生成的UserMapper.xml中SQL执行报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)原因UserMapper.xml中的namespace与UserMapper.java接口全限定名不一致或SqlSessionFactory未扫描到该XML文件。解决检查UserMapper.xml首行mapper namespacecom.ruoyi.system.mapper.UserMapper必须与接口类名完全一致检查ruoyi-system/src/main/resources/mapper/system/UserMapper.xml路径是否正确不能是mapper/UserMapper.xml检查MyBatisConfig.java中setMapperLocations()是否包含classpath:mapper/**/*.xml注意是**非*。4.5 现象生成的页面中“新增”按钮点击后跳转空白页控制台报Cannot find module /views/system/user/add原因MPG只生成后端代码前端add.vue、edit.vue页面需手动创建但学生常忘记创建或创建路径错误如放在views/user/add.vue而非views/system/user/add.vue。解决在ruoyi-ui/src/views/system/user/下新建add.vue和edit.vueadd.vue中script部分import { addUser } from /api/system/user确保API路径与后端PostMapping路径一致edit.vue中this.userId this.$route.query.userId获取参数mounted()中调用getUser(this.userId)加载数据。注意若依前端路由配置在ruoyi-ui/src/router/index.js中system模块路由已预定义无需额外添加但user子路由需在children中声明若未声明则/system/user/add无法匹配。检查该文件中是否有{ path: user, component: () import(/views/system/user/index), name: User, meta: { title: 用户管理, icon: peoples } }5. 毕设答辩验收从代码到演示的5个必过检查点与答辩话术毕设答辩不是考你背了多少原理而是看你能不能把一套东西从零跑通、讲清楚、防住坑。我带过十几届学生发现只要把以下5个检查点提前准备好答辩通过率接近100%。它们不是“加分项”而是评委老师一定会问的“底线问题”。下面给出每个点的自查清单、演示脚本和应对话术全部来自真实答辩现场。5.1 检查点①生成器能否独立运行——证明你不是抄的代码自查清单✅ 在ruoyi-admin模块下存在CodeGenerator.java主类✅ 运行该类main方法控制台输出[INFO] 文件生成成功且ruoyi-system目录下出现domain/User.java等文件✅ 修改CodeGenerator.java中strategy.setInclude(sys_dept)重新运行生成Dept.java等新文件无报错。演示脚本打开IDEA定位到CodeGenerator.java右键→Run CodeGenerator.main()切换到ruoyi-system/src/main/java/com/ruoyi/system/domain/展开文件树指出User.java和Dept.java打开User.java滚动到TableName(sys_user)和TableField(user_name)说明“下划线转驼峰已生效”。答辩话术“老师好我先演示代码生成器的核心能力。它不是一个静态模板而是可配置、可复用的工具。比如这里我把表名从sys_user改成sys_dept运行后立刻生成部门管理的全套代码包括实体类、Mapper、Service和Controller。这说明我对Mybatis-Plus生成器的API调用是准确的不是简单复制粘贴。”5.2 检查点②生成的代码能否编译通过——证明你解决了依赖冲突自查清单✅本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站