服务端工程使用IntellijIDEA开发,IDEA开发环境配置如下:
安装maven3.3.9,过程略。
关于maven仓库有以下配置方法:
<!--在setting.xml中<servers>段增加-->
<server>
<id>maven‐releases</id>
<username>私服账号</username>
<password>私服密码</password>
</server>
<server>
<id>maven‐snapshots</id>
<username>私服账号</username>
<password>私服密码</password>
</server>
<!--在<mirrors>添加-->
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>私服地址</url>
</mirror>
不作任何配置,maven自行从中央仓库下载,也可使用阿里官网Maven库:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
本教程使用本地仓库配置。在maven的setting.xml文件中配置本地仓库的路径,路径位置不要使用中文,配置例子如下:
在IDEA中选择setting.xml文件,自动找到本地仓库目录 ,如下图:
IDEA可以集成Eclipse的快捷键
如需自定义则点击“copy”复制一份进行修改
idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动 Alt+Enter 设置
设置idea导入包
自定义自己的代码模板
默认IDEA的提示是区分大小写的,这里设置为提示忽略大小写
Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可以不用定义getter/setter、equals、构造方法等,它会在编译时在字节码文件自动生成这些通用的方法,简化开发人员的工作。
项目官方地址:https://www.projectlombok.org/
比如上节创建的UserTest模型,@Data 注解可以自动生成getter/setter方法, @ToString 生成tostring方法。
使用方法:
作用:项目在编译时根据Lombok注解生成通用方法,依赖如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
作用:使用IDEA开发时根据Lombok注解生成通用方法,不报错。
修改idea64.exe.vmoptions(64位电脑选择此文件)
一个例子,电脑内存8G,设置如下:
-Xms1024m -Xmx4096m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=1024m
微服务开发需要构建服务发现中心、配置中心,本项目采用Nacos来实现。
本项目数据库使用 mysql-community-5.7,请自行安装MySQL数据库。
本项目持久层采用Mybatis Plus作为技术构架,Mybatis Plus是在Mybatis基础上作了很好的封装,方便系统开发。
学习Mybatis Plus详见 Mybatis-Plus介绍。
将基础工程导入IDEA,如下是基础工程结构图:
工程名 | 说明 |
---|---|
shanjupay | 闪聚支付父工程 |
shanjupay-common | 项目通用工程包括:常用工具类和分页信息封装VO等 |
使用客户端连接MySQL,执行 shanjupay-init.sql ,执行脚本自动创建数据库并导入初始数据。
数据库清单如下:
数据库名称 | 数据内容 |
---|---|
shanjupay_merchant_service | 用户中心数据 |
shanjupay_transaction | 交易服务数据库 |
备注:数据库、表中的字段以及表关系会在后续开发过程中随用随讲。
本节搭建如下项目工程:
服务名 | 职责 |
---|---|
商户平台应用(shanjupay-merchant-application) | 为前端提供商户管理功能 |
商户服务API(shanjupay-merchant-api) | 定义商户服务提供的接口 |
商户服务(shanjupay-merchant-service) | 实现商户服务的所有接口 |
三个工程在架构中的位置如下:
在基础工程的基础上创建商户平台应用工程。
1、选中shanjupay工程,右键选择新建Module
2、选择Maven和JDK1.8
3、填写ArtifactId: shanjupay-merchant-application
,设置Modoule Name:shanjupay-merchant-application
4、点击Fininsh完成创建
5、添加依赖,完善pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shanjupay</artifactId>
<groupId>com.shanjupay</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.shanjupay</groupId>
<artifactId>shanjupay-merchant-application</artifactId>
<dependencies>
<!-- Nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo启动器 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- Web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!--与log4j4日志冲突,去除 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j4启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 注释处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 健康检查,运维相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 测试启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Swagger依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
</dependencies>
</project>
6、配置bootstrap.yml
server:
port: 57010 #启动端口 命令行注入
max-http-header-size: 100KB
nacos:
server:
addr: 127.0.0.1:8848
spring:
application:
name: merchant-application
main:
allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server-addr: ${
nacos.server.addr}
namespace: 2aac6f5e-f974-464c-8261-ce06c0566687 #在nacos上新建的空间
cluster-name: DEFAULT
config:
server-addr: ${
nacos.server.addr} # 配置中心地址
file-extension: yaml
namespace: 2aac6f5e-f974-464c-8261-ce06c0566687 # 命令行注入
group: SHANJUPAY_GROUP # 聚合支付业务组
ext-config:
-
refresh: true
data-id: spring-boot-http.yaml # spring boot http配置
group: COMMON_GROUP # 通用配置组
#SpringMVC上传文件配置
servlet:
multipart:
#默认支持文件上传.
enabled: true
#支持文件写入磁盘.
file-size-threshold: 0
# 上传文件的临时目录
location:
# 最大支持文件大小
max-file-size: 1MB
# 最大支持请求大小
max-request-size: 30MB
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.shanjupay
protocol:
# dubbo 协议
name: dubbo
port: 20891
registry:
address: nacos://127.0.0.1:8848
application:
qos:
port: 22310 # dubbo qos端口配置 命令行注入
consumer:
check: false
timeout: 3000
retries: -1
logging:
config: classpath:log4j2.xml
7.、 在Nacos中添加spring-boot-http.yaml配置,Group:COMMON_GROUP,这里统一使用dev命名空间,没有此命名空间则在nacos中创建。
#HTTP格式配置
spring:
http:
encoding:
charset: utf-8
force: true
enabled: true
messages:
encoding: UTF-8
#tomcat头信息(用户ip和访问协议)及访问路径配置
server:
tomcat:
remote-ip-header: x-forwarded-for #头信息
protocol-header: x-forwarded-proto
servlet:
context-path: / #[请求路径]
use-forward-headers: true
#服务监控与管理配置,运维相关
management:
endpoints:
web:
exposure:
include: refresh,health,info,env
Nacos配置页面如下所示:
8、在Nacos中添加merchant-application.yaml配置,Group:SHANJUPAY_GROUP
#覆盖访问路径
server:
servlet:
context-path: /merchant
#启用Swagger
swagger:
enable: true
Nacos配置页面如下所示:
9、在resources目录下添加log4j2配置文件:log4j2.xml
log4j2是log4j的改进版本,性能比log4j要高,通常日志配置文件在开发可以调整日志级别,输出详细的日志来跟踪程序的执行。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="180" packages="">
<properties>
<property name="prjname">${project.name}</property>
<property name="logdir">logs</property>
<property name="PATTERN">[${project.name}][${env:SERVER_PORT}] %date{YYYY-MM-dd HH:mm:ss,SSS} %highlight{%level}
[%thread][%file:%line] - %msg%n%throwable
</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${PATTERN}"/>
</Console>
<RollingFile name="ErrorAppender" fileName="${logdir}/${prjname}_error.log"
filePattern="${logdir}/$${date:yyyy-MM-dd}/${prjname}_error.%d{yyyy-MM-dd-HH}.log" append="true">
<PatternLayout pattern="${PATTERN}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<RollingFile name="DebugAppender" fileName="${logdir}/${prjname}_info.log"
filePattern="${logdir}/$${date:yyyy-MM-dd}/${prjname}_info.%d{yyyy-MM-dd-HH}.log" append="true">
<PatternLayout pattern="${PATTERN}"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<!--异步appender-->
<Async name="AsyncAppender" includeLocation="true">
<AppenderRef ref="ErrorAppender"/>
<AppenderRef ref="DebugAppender"/>
</Async>
</Appenders>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的debug信息-->
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<logger name="springfox" level="INFO">
</logger>
<logger name="org.apache.http" level="INFO">
</logger>
<logger name="com.alibaba.nacos" level="WARN">
</logger>
<!--OFF 0-->
<!--FATAL 100-->
<!--ERROR 200-->
<!--WARN 300-->
<!--INFO 400-->
<!--DEBUG 500-->
<!--TRACE 600-->
<!--ALL Integer.MAX_VALUE-->
<!--日志等级:INFO可以手动改动-->
<Root level="INFO" includeLocation="true">
<AppenderRef ref="AsyncAppender"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
10、添加启动类
package com.shanjupay.merchant;
//merchant 表示商户
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class MerchantApplicationBootstrap {
public static void main(String[] args) {
SpringApplication.run(MerchantApplicationBootstrap.class, args);
}
}
11、启动服务
访问http://localhost:8848/nacos nacos服务列表,发现shanjupay-merchant-application服务已注册到nacos中。
在基础工程的基础上创建商户服务工程,商户服务工程包括接口和接口实现两个子工程。
1、按上述步骤创建商户服务工程 shanjupay-merchant
2、在 shanjupay-merchant 下创建 shanjupay-merchant-api ,选中shanjupay-merchant工程右键–>New–>Module,填写artifactId和Module Name:shanjupay-merchant-api
3、在 shanjupay-merchant 下创建 shanjupay-merchant-service ,选中 shanjupay-merchant 工程右键–>New–>Module,填写artifactId和Module Name:shanjupay-merchant-service
4、两个工程创建成功后,项目整体目录结构如下所示:
5、完善pom.xml,
shanjupay-merchant-api 模块依赖如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shanjupay-merchant</artifactId>
<groupId>com.shanjupay</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.shanjupay</groupId>
<artifactId>shanjupay-merchant-api</artifactId>
<dependencies>
<dependency>
<groupId>com.shanjupay</groupId>
<artifactId>shanjupay-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
shanjupay-merchant-service 模块依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shanjupay-merchant</artifactId>
<groupId>com.shanjupay</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.shanjupay</groupId>
<artifactId>shanjupay-merchant-service</artifactId>
<dependencies>
<!--nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--dubbo启动器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring Boot启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--log4j4启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--注释处理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--健康检查,运维相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--测试启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 对象池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</dependency>
</dependencies>
</project>
6、在resources目录下添加日志配置文件:log4j2.xml
7、在resources目录下添加配置文件:bootstrap.yml,将下边配置中namespace的ID替换为之前创建的dev命名空间的ID
bootstrap.yml内容如下
server:
port: 56040 #启动端口 命令行注入
nacos:
server:
addr: 127.0.0.1:8848
spring:
application:
name: merchant-service
main:
allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server-addr: ${
nacos.server.addr}
namespace: 2aac6f5e-f974-464c-8261-ce06c0566687
cluster-name: DEFAULT
config:
server-addr: ${
nacos.server.addr} # 配置中心地址
file-extension: yaml
namespace: 2aac6f5e-f974-464c-8261-ce06c0566687 # 命令行注入
group: SHANJUPAY_GROUP # 聚合支付业务组
ext-config:
- # - 此处不不能删除
refresh: true
data-id: spring-boot-http.yaml # spring boot http配置
group: COMMON_GROUP # 通用配置组
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.shanjupay
protocol:
# dubbo 协议
name: dubbo
port: 20890
registry:
address: nacos://127.0.0.1:8848
application:
qos:
port: 22240 # dubbo qos端口配置 命令行注入
consumer:
check: false
timeout: 90000
retries: -1
logging:
config: classpath:log4j2.xml
8、在Nacos中添加merchant-service.yaml配置,Group:SHANJUPAY_GROUP
#覆盖spring-boot-http.yaml的项目
server:
servlet:
context-path: /merchant-service
9、添加商户中心服务启动类
package com.shanjupay.merchant;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MerchantBootstrap {
public static void main(String[] args) {
SpringApplication.run(MerchantBootstrap.class,args);
}
}
通过一个案例“根据Id查询商户”的开发去熟悉项目架构的基本开发方法。
使用mp的自动生成工程生成entity、mapper等文件。
1、修改生成类中的数据库链接,连接shanjupay_merchant_service数据库
// 商户服务
dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?serverTimezone=Asia/Shanghai");
2、设置包路径
// 生成包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.shanjupay");
3、运行生成类,输入模块名:merchant
生成成功:
将生成的entity、mapper拷贝到shanjupay-merchant-service工程
1、在nacos中新建连接池Druid配置:spring-boot-starter-druid.yaml,Group为:COMMON_GROUP,内容如下:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/oauth?useUnicode=true
username: root
password: root
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
filter:
stat:
slow-sql-millis: 1
log-slow-sql: true
filters: config,stat,wall,log4j2
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: false
session-stat-max-count: 1000
principal-cookie-name: admin
principal-session-name: admin
profile-enable: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
allow: 127.0.0.1,192.168.163.1
deny: 192.168.1.73
reset-enable: false
login-password: admin
login-username: admin
aop-patterns: com.shanjupay.*.service.*
2、在nacos的配置列表商户服务中覆盖部分配置(数据库名和用户名密码):merchant-service.yaml
# 覆盖spring‐boot‐starter‐druid.yaml的项目
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: root
3、应用配置到商户服务shanjupay-merchant-service项目中:bootstrap.yml
ext-config:
-
refresh: true
data-id: spring-boot-starter-druid.yaml # spring boot starter druid配置
group: COMMON_GROUP # 通用配置组
1、在nacos中添加配置:spring-boot-mybatis-plus.yaml,Group为:COMMON_GROUP
mybatis-plus:
configuration:
cache-enabled: false
map-underscore-to-camel-case: true
global-config:
id-type: 0
field-strategy: 0
db-column-underline: true
refresh-mapper: true
type-aliases-package: com.shanjupay.user.entity
mapper-locations: classpath:com/shanjupay/*/mapper/*.xml
2、在nacos的配置列表的商户服务覆盖部分Mybatis-Plus配置:merchant-service.yaml
# 覆盖spring‐boot‐mybatis‐plus.yaml的项目
mybatis-plus:
type-aliases-package: com.shanjupay.merchant.entity
mapper-locations: classpath:com/shanjupay/*/mapper/*.xml
3、应用配置到本地项目中:bootstrap.yml
ext-config:
-
refresh: true
data-id: spring-boot-mybatis-plus.yaml # spring boot mybatisplus配置
group: COMMON_GROUP # 通用配置组
4、在shanjupay-merchant-service工程中添加分页和性能分析插件:MybatisPlusConfig
package com.shanjupay.merchant.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Administrator
* @version 1.0
* Mybatis‐Plus 配置
**/
@Configuration
@MapperScan("com.shanjupay.**.mapper")
public class MybatisPlusConfig {
/**
* 分页插件,自动识别数据库类型
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 启用性能分析插件
*/
@Bean
public PerformanceInterceptor performanceInterceptor(){
return new PerformanceInterceptor();
}
}
在shanjupay-merchant-api工程下新建商户接口:MerchantService
package com.shanjupay.merchant.api;
import com.shanjupay.merchant.api.dto.MerchantDTO;
public interface MerchantService {
//根据 id查询商户 返回值类型为自定义MerchantDTO
//主要原因:保证MerchantDTO作为数据库表字段一一对应关系
//简单理解为:service接口于dao层接口不同
public MerchantDTO queryMerchantById(Long id);
}
注意:DTO类型的对象作为service层传输的对象。
在shanjupay-merchant-api工程 定义MerchantDTO
package com.shanjupay.merchant.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author Administrator
* @version 1.0
**/
@ApiModel(value = "MerchantDTO", description = "商户信息")
@Data
public class MerchantDTO implements Serializable {
@ApiModelProperty("商户id")
private Long id;
@ApiModelProperty("企业名称")
private String merchantName;
@ApiModelProperty("企业编号")
private String merchantNo;
@ApiModelProperty("企业地址")
private String merchantAddress;
@ApiModelProperty("行业类型")
private String merchantType;
@ApiModelProperty("营业执照")
private String businessLicensesImg;
@ApiModelProperty("法人身份证正面")
private String idCardFrontImg;
@ApiModelProperty("法人身份证反面")
private String idCardAfterImg;
@ApiModelProperty("联系人")
private String username;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("手机号,关联统一账号")
private String mobile;
@ApiModelProperty("联系人地址")
private String contactsAddress;
@ApiModelProperty("审核状态,0-未申请,1-已申请待审核,2-审核通过,3-审核拒绝")
private String auditStatus;
@ApiModelProperty("租户ID")
private Long tenantId;
}
@ApiModel 和 @ApiModelProperty 是Swagger注解后边会学习。
在shanjupay-merchant-service下新建商户接口实现类:MerchantServiceImpl,并添加新建商户测试方法
本方法从shanjupay_merchant_service数据库的merchant查询数据。
package com.shanjupay.merchant.service;
import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import com.shanjupay.merchant.entity.Merchant;
import com.shanjupay.merchant.mapper.MerchantMapper;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Created by Administrator.
*/
注意导包.dubbo.config.annotation.Service;
@org.apache.dubbo.config.annotation.Service
public class MerchantServiceImpl implements MerchantService {
@Autowired
MerchantMapper merchantMapper;
/**
* 根据id查询商户信息
*/
@Override
public MerchantDTO queryMerchantById(Long id) {
Merchant merchant = merchantMapper.selectById(id);
MerchantDTO merchantDTO = new MerchantDTO();
merchantDTO.setId(merchant.getId());
merchantDTO.setMerchantName(merchant.getMerchantName());
//设置其他属性....
return merchantDTO;
}
}
在shanjupay-merchant-application下添加如下pom依赖:
<!--商户服务API-->
<dependency>
<groupId>com.shanjupay</groupId>
<artifactId>shanjupay-merchant-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在shanjupay-merchant-application下新建商户Controller:MerchantController,并调用商户中心服务提供的新建商户接口
package com.shanjupay.merchant.controller;
import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MerchantController {
//注意导入包:import org.apache.dubbo.config.annotation.Reference;
@Reference
private MerchantService merchantService;
+
@GetMapping("/merchants/{id}")
public MerchantDTO queryMerchantById(@PathVariable("id") Long id) {
MerchantDTO merchantDTO = merchantService.queryMerchantById(id);
return merchantDTO;
}
}
1、启动商户平台应用和商户服务
2、访问 .,测试根据id查询商户
如果merchant表没有数据可手动添加后再行测试。如下结果:
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:
Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。
1、在shanjupay-common项目中添加依赖,只需要在shanjupay-common中进行配置即可,因为其他微服务工程都直接或间接依赖shanjupay-common。
<!-- Swagger依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
2、在shanjupay-merchant-application工程的config包中添加一个Swagger配置类
package com.shanjupay.merchant.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@ConditionalOnProperty(prefix = "swagger", value = {
"enable"}, havingValue = "true")
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket buildDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(buildApiInfo())
.select()
// 要扫描的API(Controller)基础包
.apis(RequestHandlerSelectors.basePackage("com.shanjupay.merchant.controller"))
.paths(PathSelectors.any())
.build();
}
/**
* @param
* @return springfox.documentation.service.ApiInfo
* @Title: 构建API基本信息
* @methodName: buildApiInfo
*/
private ApiInfo buildApiInfo() {
Contact contact = new Contact("开发者", "", "");
return new ApiInfoBuilder()
.title("闪聚支付-商户应用API文档")
.description("")
.contact(contact)
.version("1.0.0").build();
}
}
3、添加SpringMVC配置类:WebMvcConfig,让外部可直接访问Swagger文档[放行]
package com.shanjupay.merchant.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 添加静态资源文件,外部可以直接访问地址
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
在Java类中添加Swagger的注解即可生成Swagger接口文档,常用Swagger注解如下:
@ApiImplicitParam 属性:
上边的属性后边编写程序时用到哪个我再详细讲解,下边写一个swagger的简单例子,我们在MerchantController中添加Swagger注解,代码如下所示:
package com.shanjupay.merchant.controller;
import com.shanjupay.merchant.api.MerchantService;
import com.shanjupay.merchant.api.dto.MerchantDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Administrator
* @version 1.0
**/
@RestController
@Api(value = "商户平台应用接口", tags = "商户平台应用接口", description = "商户平台应用接口")
public class MerchantController {
@org.apache.dubbo.config.annotation.Reference
MerchantService merchantService;
@ApiOperation(value = "根据id查询商户信息")
@GetMapping("/merchants/{id}")
public MerchantDTO queryMerchantById(@PathVariable("id") Long id) {
MerchantDTO merchantDTO = merchantService.queryMerchantById(id);
return merchantDTO;
}
@ApiOperation("测试")
@GetMapping(path = "/hello")
public String hello() {
return "hello";
}
@ApiOperation("测试")
@ApiImplicitParam(name = "name", value = "姓名", required = true, dataType = "string")
@PostMapping(value = "/hi")
public String hi(String name) {
return "hi," + name;
}
}
1、启动商户应用和商户中心服务,访问:http://localhost:57010/merchant/swagger-ui.html
2、点击其中任意一项即可打开接口详情,如下图所示:
3、点击“Try it out”开始测试,并录入参数信息,然后点击“Execute"发送请求,执行测试返回结果:“hi,李四”
Swagger生成API文档的工作原理:
Postman是一款功能强大的http接口测试工具,使用Postman可以完成http各种请求的功能测试。作为服务器端开发人员,当一个业务功能开发完毕后,应该用Postman进行功能测试。
1、请自行在本机安装Postman
2、新建集合(建议一个微服务新建一个对应的集合):闪聚支付-商户应用
3、在闪聚支付-商户应用集合中新建请求,并录入请求信息
填写新建商户接口地址和请求类型后,点击Send发送请求:
小技巧:每个测试都可以进行保存(Ctrl+S),以便于后续使用。
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法