入门级微服务项目搭建:三、创建系统核心子模块

入门级微服务项目搭建:三、创建系统核心子模块

现在我们就开始创建系统模块的子模块了,我们在这些子模块中编写具体的业务逻辑。下面我将创建一个用户模块作为示例。

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暂时就清空了
在这里插入图片描述根据你自己的项目,填写请求路径点击发送
在这里插入图片描述正常返回数据,接口无异常
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7号525

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值