本手册是基于 Vue3 + SpringCloud5 + MyBatisPlus + MySQL 的项目结构和代码实现,旨在作为一个教学案例进行讲解。为了使案例更具普适性,文档中的公司名称、实体类、表名以及字段名称等敏感信息均已脱敏。
项目结构概述
项目采用标准的分层架构,划分为 common模块 、gateway模块 和 业务模块。每个模块都对应特定的职责,确保代码的可维护性和清晰度。以下是项目的基本目录结构:
├─common-module
│ │ pom.xml
│ ├─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─common
│ │ │ ├─constant
│ │ │ │ ResultConstant.java
│ │ │ ├─entity
│ │ │ │ Storage.java
│ │ │ ├─enums
│ │ │ │ ResultEnum.java
│ │ │ └─util
│ │ │ PageData.java
│ │ │ Result.java
│ │
├─gateway-module
└─business-module
│ pom.xml
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─business
│ │ │ │ BusinessApplication.java
│ │ │ ├─config
│ │ │ │ MyBatisPlusConfig.java
│ │ │ │ WebConfig.java
│ │ │ ├─mapper
│ │ │ │ StorageMapper.java
│ │ │ ├─service
│ │ │ │ │ StorageService.java
│ │ │ │ └─impl
│ │ │ │ StorageServiceImpl.java
│ │ │ └─web
│ │ │ └─controller
│ │ │ StorageController.java
│ │ └─resources
│ │ │ application.yml
│ │ └─mapper
│ │ StorageMapper.xml
模块说明
- common-module: 公共模块,包含常量、实体类、枚举类和工具类等基础代码,供其他模块复用。
- gateway-module: API 网关模块,负责请求转发、负载均衡等功能。
- business-module: 业务逻辑模块,包含具体的服务、控制器、数据访问层等。
核心技术
1. SpringCloud 5
SpringCloud 是微服务架构的核心框架,提供了服务注册与发现、负载均衡、断路器等重要功能。本项目通过 SpringCloud 构建微服务,并使用网关模块进行统一入口管理。
2. MyBatis-Plus
MyBatis-Plus 是 MyBatis 的增强工具,简化了单表的 CRUD 操作。本项目利用它来实现对数据库的高效访问。MyBatis-Plus 提供的 Page
类非常适合分页查询。
3. Vue3
Vue3 是前端框架,负责与后端进行交互并展示数据。本文档重点在后端,前端部分暂不展开。
4. MySQL
MySQL 是关系型数据库,存储我们的业务数据。本项目使用 MyBatis-Plus 与 MySQL 进行集成,通过实体类映射表结构来实现数据库操作。
关键代码实现
1. 实体类
java
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("storage_table")
public class Storage {
private String companyName;
@TableId
private Long id;
// 其他字段...
}
2. 数据访问层 (Mapper)
java
public interface StorageMapper extends BaseMapper<Storage> {
/**
* 分页查询仓库信息
* @param page 分页参数
* @param name 仓库名称(模糊查询,允许为空)
* @return 分页结果
*/
Page<Storage> findByPage(@Param("page") Page<Storage> page, @Param("name") String name);
}
3. 服务层 (Service)
java
@Service
public class StorageServiceImpl implements StorageService {
@Autowired
private StorageMapper storageMapper;
@Override
public Page<Storage> findByPage(String name, int pageNum, int pageSize) {
Page<Storage> page = new Page<>(pageNum, pageSize);
QueryWrapper<Storage> queryWrapper = new QueryWrapper<>();
if (name != null && !name.isEmpty()) {
queryWrapper.like("name", name);
}
return storageMapper.selectPage(page, queryWrapper);
}
}
4. 控制层 (Controller)
java
@RestController
@RequestMapping("/storage")
public class StorageController {
@Autowired
private StorageService storageService;
@GetMapping("/findByPage")
public Result<PageData<List<Storage>>> findByPage(Integer pageNum,
Integer pageSize,
String name) {
if (pageNum == null || pageNum <= 0) {
pageNum = 1;
}
if (pageSize == null || pageSize <= 0) {
pageSize = 10;
}
Page<Storage> storagePage = storageService.findByPage(name, pageNum, pageSize);
PageData<List<Storage>> pageData = new PageData<>(storagePage.getRecords(), storagePage.getTotal());
return Result.ok(pageData);
}
}
5. Mapper XML 文件
xml
<mapper namespace="com.example.business.mapper.StorageMapper">
<select id="findByPage" resultType="com.example.common.entity.Storage">
SELECT
id,
company_name AS companyName,
type,
name,
company_id AS companyId,
manager,
phone,
address,
area,
state,
create_time AS createTime,
update_time AS updateTime
FROM storage_table
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
</where>
</select>
</mapper>
结论
通过该项目结构,可以看到微服务架构下如何通过 SpringCloud 进行模块化拆分,以及通过 MyBatis-Plus 实现高效的数据访问。整个项目结构清晰,适合进行扩展,代码层次分明,易于维护。