【后端作业W7】 RuoYi-Vue v3.8.2 实战:单表 CRUD 独立接口开发与 API 测试全记录
一、 前言本周的实战任务基于企业级开源框架RuoYi-Vue v3.8.2进行。与前两周纯手写的 SpringBoot 项目不同若依框架内置了庞大的组件和严密的安全鉴权体系Spring Security。本次作业的核心目的并非依赖代码生成器完成任务而是通过手工编写一套独立的单表 CRUD 接口深入理解企业级框架的底层路由扫描、Bean 管理机制并学习如何调整安全策略以开放 API 供 Postman 直接进行调试。二、 数据库设计与重构为了避免与若依系统自带的sys_user核心表发生冲突并遵循企业开发中“不使用业务字段如 name作为主键”的规范我独立创建了test_user表并引入了AUTO_INCREMENT自增主键。DROPTABLEIFEXISTStest_user;CREATETABLEtest_user(idINT(11)NOTNULLAUTO_INCREMENTCOMMENT唯一主键ID,nameVARCHAR(50)NOTNULLCOMMENT用户姓名,ageINT(3)DEFAULTNULLCOMMENT年龄,sexCHAR(1)DEFAULT0COMMENT性别 (0男 1女 2未知),create_timeDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT创建时间,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT独立业务测试用户表;-- 插入初始测试数据INSERTINTOtest_user(name,age,sex)VALUES(Zhong Jiahui,23,1),(Zhang San,18,1);2. 数据访问层 (UserMapper.javaUserMapper.xml)接口路径com.ruoyi.web.mapperpackagecom.ruoyi.web.mapper;importcom.ruoyi.web.domain.User;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;MapperpublicinterfaceUserMapper{ListUserselectAllUser();intinsertUser(Useruser);intupdateUser(Useruser);intdeleteUserById(Integerid);// 核心按自增 ID 寻址}XML 映射路径src/main/resources/mapper?xml version1.0 encodingUTF-8?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//EN[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)mappernamespacecom.ruoyi.web.mapper.UserMapperresultMapidUserResulttypecom.ruoyi.web.domain.Useridpropertyidcolumnid/resultpropertycreateTimecolumncreate_time//resultMapselectidselectAllUserresultMapUserResultselect * from test_user/selectinsertidinsertUserparameterTypecom.ruoyi.web.domain.Userinsert into test_user(name, age, sex, create_time) values(#{name}, #{age}, #{sex}, sysdate())/insertupdateidupdateUserparameterTypecom.ruoyi.web.domain.Userupdate test_user set name #{name}, age #{age}, sex #{sex} where id #{id}/updatedeleteiddeleteUserByIdparameterTypeIntegerdelete from test_user where id #{id}/delete/mapper3. 业务逻辑层 (UserServiceImpl.java)路径com.ruoyi.web.service.impl(注为了避免与若依原有的 userService 产生 Bean 冲突此处特意指定了别名)packagecom.ruoyi.web.service.impl;importcom.ruoyi.web.domain.User;importcom.ruoyi.web.mapper.UserMapper;importcom.ruoyi.web.service.UserService;importorg.springframework.stereotype.Service;importjavax.annotation.Resource;importjava.util.List;Service(bizUserService)// 设置独立 Bean 名称防冲突publicclassUserServiceImplimplementsUserService{ResourceprivateUserMapperuserMapper;OverridepublicListUsergetAllUsers(){returnuserMapper.selectAllUser();}OverridepublicintaddUser(Useruser){returnuserMapper.insertUser(user);}OverridepublicintmodifyUser(Useruser){returnuserMapper.updateUser(user);}OverridepublicintremoveUserById(Integerid){returnuserMapper.deleteUserById(id);}}4. 控制层与 API 开放 (UserController.java)路径com.ruoyi.web.controllerpackagecom.ruoyi.web.controller;importcom.ruoyi.common.annotation.Anonymous;importcom.ruoyi.web.domain.User;importcom.ruoyi.web.service.UserService;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;importjava.util.List;Anonymous// 突破口绕过 Spring Security 的 Token 鉴权允许匿名直接访问RestControllerRequestMapping(/api/db/users)publicclassUserController{Resource(namebizUserService)// 注入上面自定义的 BeanprivateUserServiceuserService;GetMappingpublicListUsergetUsers(){returnuserService.getAllUsers();}PostMappingpublicStringaddUser(Stringname,Integerage,Stringsex){UserusernewUser();user.setName(name);user.setAge(age);user.setSex(sex);userService.addUser(user);return新增成功;}PutMappingpublicStringupdateUser(Integerid,Stringname,Integerage,Stringsex){UserusernewUser();user.setId(id);user.setName(name);user.setAge(age);user.setSex(sex);userService.modifyUser(user);return更新成功;}DeleteMapping(/{id})publicStringdeleteUser(PathVariableIntegerid){userService.removeUserById(id);return删除成功ID: id;}}四、 Postman 接口连通性测试因在 Controller 级配置了Anonymous注解API 已完全开放。测试全过程无需在 Headers 中携带 Token。1. 列表查询 (GET)测试结果直接访问http://localhost:8080/api/db/users成功返回数据库中的集合。如果并没有在UserController中添加Anonymous注释访问api则会401报错2. 新增数据 (POST)测试结果利用AUTO_INCREMENT无需传递 ID 即可成功写入新用户返回“新增成功”。3. 数据更新 (PUT)测试结果传递id参数定位指定数据行精准更新该用户的个人信息。4. 数据删除 (DELETE)测试结果通过PathVariable解析 URL 中的 ID如/users/3底层执行精准物理删除。五、 深度踩坑记录在融入若依框架的过程中我并非一帆风顺而是遭遇了两次极其经典的底层 Bug并最终独立排查解决坑点 1BeanDefinitionOverrideException(Bean 冲突异常)现象启动项目直接崩溃提示容器中存在同名的userMapper或userService。复盘由于我使用了标准的User命名与若依系统中可能已存在的核心组件发生了 Spring 容器注入冲突。解决在UserServiceImpl上使用Service(bizUserService)为该类强制分配一个唯一的别名并在 Controller 中使用Resource(name bizUserService)精准注入完美避开冲突。坑点 2Invalid bound statement (not found)(XML 映射丢失)现象API 可以调通但在执行具体的 SQL 方法时报 500 内部错误。复盘这是 MyBatis 最经典的错误。在移植代码时我仅移动了文件位置却忽略了 XML 文件第一行的mapper namespace...。MyBatis 是依靠全限定类名的字符串进行强绑定的由于 namespace 仍是上周旧项目的路径导致接口找不到对应的 SQL。解决严格将UserMapper.xml的 namespace 修改为当前ruoyi-admin模块下的真实路径com.ruoyi.web.mapper.UserMapper错误瞬间消失。六、 总结这周的实战是一次真正的“从零散代码向企业级脚手架”的跃迁。在庞大且严密的若依框架中“开辟一块自留地”不仅考验了我们对 MyBatis 映射路径的严谨性更让我们深刻体会了控制反转IoC中 Bean 管理的冲突处理。尤其是学会使用Anonymous注解优雅地“撕开” Spring Security 的防护网为以后进行安全策略降级与独立接口联调打下了坚实基础