# backend-ruoyi-template **Repository Path**: bingtool/backend-ruoyi-template ## Basic Information - **Project Name**: backend-ruoyi-template - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-23 - **Last Updated**: 2026-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # backend-ruoyi-template 项目手册 ## 简要 该项目为springboot模板项目(整合ruoyi),目的是为了更快创建项目。该项目多出的名字需要替换为业务名 ## 技术栈 | 技术 | 版本 | |--------------|--------| | JDK | 1.8 | | Spring Boot | 2.5.15 | | Maven | 3.8+ | | Mybatis Plus | 3.5.1 | | Ruoyi | 3.8.9 | ## 支持的数据库 - MySQL - Redis ## 许可证 MIT License ## **java后端项目创建模板** * template-common 通用模块(非业务) * template-ruoyi ruoyi模块(公共管理后台) * template-app 业务模块 ## **通用模块(非业务)包结构** **annotation** 自定义注解 **aspect** 自定义切面 **component** 通用组件 **config** 通用配置 **constant** 常量 - CacheKey 统一管理的缓存key - CommonConstant 通用常量定义 **enums** 枚举 - BaseErrorCodeEnum 接口错误码枚举 **exception** 自定义异常 **iface** 通用接口定义 **model** 通用POJO定义 **properties** 属性对象定义 **redis** redis配置 **util** 工具类 ## **业务模块包结构** **controller** - front(app接口)/admin(管理端接口) 模块 - 模块名称 - 具体业务类 **cmd** - 模块名称 - entity 实体类包 - mapper mybatis-plus mapper包 **domain** - 模块名称 - *QueryCmd 查询执行器 - *ActionCmd 行动执行器 **service** - 模块名称 - Service 具体接口 - impl Service实现类包 **model** - 模块名称 - bo 业务实体类包(一般是继承业务实体类的扩展类),非必须 - req 请求参数包 - resp 响应参数包 ## 常用实体类 * **Result** 通用响应实体 * **PageResult** 通用响应分页实体 * **PageReq** 通用分页请求实体(继承) * **BaseErrorCodeEnum** 通用错误码枚举 * **IErrorCode** 错误码接口(自定义业务错误码的时候实现该接口) * **IRedisService** redis统一使用该服务类禁止直接使用RedisTemplate * **PageUtil** 可以把PageReq转换成具体的分页对象 * **AssertBusUtils** 业务断言,手动抛异常的时候推荐使用该工具类 * **UserContextHolder** front的接口可以通过该类获取登录的用户ID * **BusinessException** 业务异常类 ## 编码规范 * 生成代码需要带注释 * req请求参数命名规范,业务名+Req.如:UserRecordReq * bo命名规范,业务名+Bo,通常还继承对应业务的entity实体.如:UserRecordBo * resp命名规范,Front/Admin+业务名+Vo,FrontUserRecordVo * 其他编码规范参考阿里java编码规范手册即可 * 业务实现需要考虑数据和业务解耦,如下convert方法里面不会调用查询数据,而是外面查好后传入。 ``` /** * 分页查询热门商品 * @param pageReq * @return */ public List page(PageReq pageReq){ // 分页查询热销商品 List list = hotProductService.page(pageReq); if(CollUtil.isEmpty(list)){ return Collections.emptyList(); } // 查询商品信息 List productIds = list.stream().map(HotProduct::getProductId).collect(Collectors.toList()); Map productRecordMap = productRecordService.listByIds(productIds).stream().collect(Collectors.toMap(ProductRecord::getProductId, item -> item)); // 构建实体 return convert(list,productRecordMap); } /** * 类型转换 * @param hotProducts * @param productRecordMap * @return */ private List convert(List hotProducts,Map productRecordMap){ List result = new ArrayList<>(); for(HotProduct hotProduct : hotProducts){ ProductRecord productRecord = productRecordMap.get(hotProduct.getProductId()); HotProductSimpleVO hotProductSimpleVO = new HotProductSimpleVO(); BeanUtil.copyProperties(productRecord,hotProductSimpleVO); result.add(hotProductSimpleVO); } return result; } ``` ## 注意 * mapper只可以被自己业务的service引用。 * service不能引用其他业务的service,解耦业务逻辑、避免循环依赖。 * 业务实现需要跨其他业务的时候需要在cmd里面去实现,只有cmd可以聚合其他service。 * 禁止直接返回entity的实体类给前端,禁止直接使用entity实体类接收前端参数。 * front的接口分页不用PageResult,而是使用PageHelper不统计总数。返回当前分页list。