入门级微服务项目搭建:三、创建系统核心子模块
现在我们就开始创建系统模块的子模块了,我们在这些子模块中编写具体的业务逻辑。下面我将创建一个用户模块作为示例。
1.创建项目
创建项目的流程和之间差不多,这里就不过多展示了。最终项目的结构如下图所示。
2.修改pom文件
pom文件具体如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wcc</groupId>
<artifactId>mall-cloud-system</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.wcc</groupId>
<artifactId>system-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>system-user</name>
<description>system-user</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.修改项目的application.yml文件
application.yml文件的内容如下所示
server:
port: 9001 #服务访问端口
spring:
application:
name: system-user #应用名称
#数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall-cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml
4.创建数据库
本项目我选用的是MySql数据库,没有安装MySql数据库的,可以去网上找相关教程,这里就不过多叙述了。
首先新建数据库——mall-cloud
CREATE DATABASE `mall-cloud` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
获得如下数据库:
然后创建一个m_user表
CREATE TABLE `m_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
`account` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号',
`password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`balance` decimal(10,2) DEFAULT NULL COMMENT '账户余额',
`del_flag` int DEFAULT NULL COMMENT '是否删除(0:未删除,1:已删除)',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_date` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_date` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`create_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者',
`update_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改者',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
获得如下所示表:
数据表中添加一条测试数据。
INSERT into m_user (account,password,name,balance,del_flag,create_date,update_date) VALUES
('cc','123456','大大怪将军',10.28,0,now(),now())
获得如下所示数据:
5.编写一个简单的业务逻辑
5.1创建实体类
实体类代码如下:
package com.wcc.systemuser.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户实体类
* @author wcc
* @createTime 2024年05月15日 10:13:00
*/
@Data
@TableName("m_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
private Integer id;
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 名称
*/
private String name;
/**
* 账户余额
*/
private String balance;
/**
* 是否删除(0:未删除,1:已删除)
*/
private Integer delFlag;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createDate;
/**
* 更新时间
*/
private Date updateDate;
/**
* 创建人
*/
private String createBy;
/**
* 更新人
*/
private String updateBy;
}
5.2创建dao层接口
package com.wcc.systemuser.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wcc.systemuser.domain.User;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户 dao层接口
* @author wcc
* @createTime 2024年05月15日 10:22:00
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
5.3进行dao层的单元测试
单元测试十分重要,可以在前期就排查出大量简单bug,不会出现一测接口全是报错的情况,也可以减轻后续排错的工作量。
单元测试代码如下所示:
package com.wcc.systemuser.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wcc.systemuser.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户 dao层测试
* @author wcc
* @createTime 2024年05月15日 10:29:00
*/
@SpringBootTest
public class UserMapperTest {
@Resource
private UserMapper userMapper;
@Test
public void testQuery(){
List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("del_flag", 0));
users.forEach(System.out::println);
}
}
运行结果:
由上可得dao层的代码编写成功,无明显bug。
(ps:由于现在的代码逻辑比较简单,我之后会直接使用MyBatis-Plus自带的方法操作数据库,不自己编写sql)
5.4编写统一的响应类
编写统一格式的响应类有利于规范化前后端的交互。
package com.wcc.systemuser.result;
import lombok.Data;
/**
* 统一的响应格式
* @author wcc
* @createTime 2024年05月15日 10:56:00
*/
@Data
public class Result <T> {
private int code; // 状态码
private String msg; // 返回的信息
private T data; // 返回的数据
/**
* 成功时候的调用(有数据)
* @param data
* @param <T>
* @return
*/
public static <T> Result<T> success(T data){
return new Result<T>(data);
}
/**
* 成功时候的调用(无数据)
* @param <T>
* @return
*/
public static <T> Result<T> success(){
return new Result<T>();
}
/**
* 异常时候的调用(有msg参数)
* @param msg
* @param <T>
* @return
*/
public static <T> Result<T> error(String msg){
return new Result<T>(msg);
}
/**
* 异常时候的调用(无msg参数)
* @param <T>
* @return
*/
public static <T> Result<T> error(){
return new Result<T>("error");
}
private Result(T data) {
this.code = 200;
this.msg = "success";
this.data = data;
}
private Result() {
this.code = 200;
this.msg = "success";
}
private Result(String msg) {
this.code = 400;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
}
5.5编写Service层代码
编写业务层接口:
package com.wcc.systemuser.service;
import com.wcc.systemuser.domain.User;
import com.wcc.systemuser.result.Result;
import java.util.List;
/**
* 用户 业务层接口
* @author wcc
* @createTime 2024年05月15日 10:49:00
*/
public interface UserService {
Result queryAllUser();
}
编写业务层接口实现类:
package com.wcc.systemuser.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wcc.systemuser.dao.UserMapper;
import com.wcc.systemuser.domain.User;
import com.wcc.systemuser.result.Result;
import com.wcc.systemuser.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author wcc
* @createTime 2024年05月15日 10:52:00
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Override
public Result queryAllUser() {
try{
List<User> userList=userMapper.selectList(new QueryWrapper<User>().eq("del_flag", 0));
return Result.success(userList);
}catch (Exception e){
log.error("查询用户信息失败",e);
return Result.error("查询用户信息失败");
}
}
}
单元测试:
package com.wcc.systemuser.service;
import com.wcc.systemuser.result.Result;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
/**
* 用户 Service层测试
* @author wcc
* @createTime 2024年05月15日 11:04:00
*/
@SpringBootTest
public class UserServiceTest {
@Resource
private UserService userService;
@Test
public void testQueryAllUser() {
Result result = userService.queryAllUser();
System.out.println(result);
}
}
控制台输出:
符合心理预期,无明显bug。
5.6编写Controller代码
controller中只放一些和前端交互的逻辑,业务逻辑不要放在controller中,否则会很乱。简单来说controller怎么简单怎么来。
controller代码如下:
package com.wcc.systemuser.controller;
import com.wcc.systemuser.result.Result;
import com.wcc.systemuser.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 用户 Controller层
* @author wcc
* @createTime 2024年05月15日 11:12:00
*/
@RequestMapping("/user")
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/query_all_user")
public Result queryAllUser(){
return userService.queryAllUser();
}
}
启动项目测试接口是否编写正确,本项目我直接使用Apifox进行测试接口,你也可以使用Swagger或者是Postman,只要能测接口就行。
apifox的官网如下:Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。
微服务项目或者多模块项目启动我推荐在Services中进行 |
---|
![]() |
![]() |
![]() |
项目启动成功 |
---|
![]() |
apifox测试接口 | |
---|---|
![]() | 新建项目 |
![]() | 新建项目 |
![]() | 新建接口,此处如果配置了swagger的话,可以直接导入接口文档的,这里暂时就不搞swagger了 |
![]() | 选择测试环境,这边前置的url暂时就清空了 |
![]() | 根据你自己的项目,填写请求路径点击发送 |
![]() | 正常返回数据,接口无异常 |