【附源码】从0到1项目搭建-框架搭建(上)

news/2024/5/5 22:55:20/文章来源:https://blog.csdn.net/qq_41779565/article/details/126982775

前言

大家好,本文是基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Druid、Logback 等主流技术。希望对大家有所帮助~

目录

    • 前言
    • 一、概述
    • 二、创建统一的依赖管理
      • 2.1、统一的依赖管理工程创建
      • 2.2、Maven托管
    • 三、创建通用模块
      • 3.1、创建通用模块工程
      • 3.2、Maven托管
      • 3.3、完善目录结构
      • 3.4、定义通用类库
        • 3.4.1、返回状态码
        • 3.4.2、通用返回结果
        • 3.4.3、通用工具类
    • 四、创建项目服务模块
      • 4.1、创建项目服务模块工程
      • 4.2、Maven托管
      • 4.3、完善目录结构
      • 4.4、创建 Application
      • 4.5、整合 Logback
      • 4.6、整合 Druid 数据库连接池
    • 五、创建代码生成模块
      • 5.1、创建代码生成模块工程
      • 5.2、Maven托管
      • 5.3、完善目录结构
      • 5.4、测试代码生成
      • 5.5、测试生成效果
      • 5.6、测试 Controller 层
    • 六、源码获取

一、概述

随着技术栈的不断更新迭代,我们需要快速的在企业中搭建一个项目,并使用市面上前沿且稳定的技术栈。本期将跟大家一起从0到1搭建一个基于SpringBoot 的项目,并集成MyBatis-Plus、Druid、Logback 等主流技术。后续也会整合 Docker,自定义构建 Docker 项目,实现 Docker Compose 部署。源码附在文末。

二、创建统一的依赖管理

2.1、统一的依赖管理工程创建

创建一个名称为 my-project-dependencies的项目,该项目负责统一的依赖管理

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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version></parent><groupId>com.micromaple</groupId><artifactId>my-project-dependencies</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><name>my-project-dependencies</name><properties><!-- Environment Settings --><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- Spring Settings --><spring-boot-alibaba-druid.version>1.2.11</spring-boot-alibaba-druid.version><spring-boot-mybatis-plus.version>3.5.2</spring-boot-mybatis-plus.version><!-- Environment Setting --><mysql.version>8.0.30</mysql.version><lombok.version>1.18.18</lombok.version><guava.version>25.1-jre</guava.version><jackson.version>2.11.4</jackson.version><apache-httpclient.version>4.5.5</apache-httpclient.version><collections.version>3.2.1</collections.version><!-- Common Setting--><poi.version>3.10-FINAL</poi.version><hutool.version>5.3.7</hutool.version><velocity.version>2.3</velocity.version><hibernate-validator.version>6.0.15.Final</hibernate-validator.version><!-- log4j2 --><log4j2.version>2.16.0</log4j2.version><!-- mybatis-plus-generator --><mybatis-plus-generator.version>3.5.1</mybatis-plus-generator.version></properties><dependencyManagement><dependencies><!-- Spring Boot Starter Begin --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${spring-boot-alibaba-druid.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${spring-boot-mybatis-plus.version}</version></dependency><!-- Spring Boot Starter End --><!-- Environment Begin --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>${collections.version}</version></dependency><!-- Environment End --><!-- Apache Http Begin --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>${apache-httpclient.version}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId><version>${apache-httpclient.version}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>${apache-httpclient.version}</version></dependency><!-- Apache Http End --><!-- Common Begin --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>${velocity.version}</version></dependency><!-- Common End --><!--mybatis-plus代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus-generator.version}</version></dependency></dependencies></dependencyManagement><build><plugins><!-- Compiler 插件, 设定 JDK 版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><showWarnings>true</showWarnings></configuration></plugin><!-- 打包 jar 文件时,配置 manifest 文件,加入 lib 包的 jar 依赖 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><addMavenDescriptor>false</addMavenDescriptor></archive></configuration><executions><execution><configuration><archive><manifest><!-- Add directory entries --><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries><addClasspath>true</addClasspath></manifest></archive></configuration></execution></executions></plugin><!-- resource --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId></plugin><!-- install --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-install-plugin</artifactId></plugin><!-- clean --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-clean-plugin</artifactId></plugin><!-- ant --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId></plugin><!-- dependency --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId></plugin></plugins><pluginManagement><plugins><!-- Java Document Generate --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><executions><execution><phase>prepare-package</phase><goals><goal>jar</goal></goals></execution></executions></plugin><!-- YUI Compressor (CSS/JS压缩) --><plugin><groupId>net.alchim31.maven</groupId><artifactId>yuicompressor-maven-plugin</artifactId><version>1.5.1</version><executions><execution><phase>prepare-package</phase><goals><goal>compress</goal></goals></execution></executions><configuration><encoding>UTF-8</encoding><jswarn>false</jswarn><nosuffix>true</nosuffix><linebreakpos>30000</linebreakpos><force>true</force><includes><include>**/*.js</include><include>**/*.css</include></includes><excludes><exclude>**/*.min.js</exclude><exclude>**/*.min.css</exclude></excludes></configuration></plugin></plugins></pluginManagement><!-- 资源文件配置 --><resources><resource><directory>src/main/java</directory><excludes><exclude>**/*.java</exclude></excludes></resource><resource><directory>src/main/resources</directory></resource></resources></build>
</project>

2.2、Maven托管

将其交给Maven托管
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、创建通用模块

3.1、创建通用模块工程

创建一个名称为 my-project-common的项目,该项目负责通用的类库以及工具类

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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.micromaple</groupId><artifactId>my-project-dependencies</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../my-project-dependencies/pom.xml</relativePath></parent><artifactId>my-project-common</artifactId><packaging>jar</packaging><name>my-project-common</name><dependencies><!-- Commons Begin--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><!-- Commons End--><!-- Environment Begin --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId></dependency><!-- Environment End --><!-- Apache Http Begin --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId></dependency><!-- Apache Http End --></dependencies>
</project>

3.2、Maven托管

可以使用右侧的Maven+ 号来进行项目的托管。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3、完善目录结构

创建 src/main/java 目录后,创建包名,包名为:com.micromaple.my.project.common

此工程是放一些通用的类库或者是工具类之类的。

3.4、定义通用类库

3.4.1、返回状态码

创建常量包constant

通用常量返回状态码HttpStatus

package com.micromaple.my.project.common.constant;/*** 返回状态码* Title: HttpStatus* Description:** @author Micromaple*/
public class HttpStatus {/*** 操作成功*/public static final int SUCCESS = 200;/*** 对象创建成功*/public static final int CREATED = 201;/*** 请求已经被接受*/public static final int ACCEPTED = 202;/*** 操作已经执行成功,但是没有返回数据*/public static final int NO_CONTENT = 204;/*** 资源已被移除*/public static final int MOVED_PERM = 301;/*** 重定向*/public static final int SEE_OTHER = 303;/*** 资源没有被修改*/public static final int NOT_MODIFIED = 304;/*** 参数列表错误(缺少,格式不匹配)*/public static final int BAD_REQUEST = 400;/*** 未授权*/public static final int UNAUTHORIZED = 401;/*** 访问受限,授权过期*/public static final int FORBIDDEN = 403;/*** 资源,服务未找到*/public static final int NOT_FOUND = 404;/*** 不允许的http方法*/public static final int BAD_METHOD = 405;/*** 资源冲突,或者资源被锁*/public static final int CONFLICT = 409;/*** 不支持的数据,媒体类型*/public static final int UNSUPPORTED_TYPE = 415;/*** 系统内部错误*/public static final int ERROR = 500;/*** 接口未实现*/public static final int NOT_IMPLEMENTED = 501;
}

3.4.2、通用返回结果

创建数据传输包dto

通用数据传输返回结果BaseResult

package com.micromaple.my.project.common.dto;import com.micromaple.my.project.common.constant.HttpStatus;import java.util.HashMap;/*** 返回结果* Title: BaseResult* Description:** @author Micromaple*/
public class BaseResult extends HashMap<String, Object> {private static final long serialVersionUID = 1L;/*** 状态码*/public static final String CODE_TAG = "code";/*** 返回内容*/public static final String MSG_TAG = "msg";/*** 数据对象*/public static final String DATA_TAG = "data";/*** 初始化一个新创建的 BaseResult 对象,使其表示一个空消息。*/public BaseResult() {}/*** 初始化一个新创建的 BaseResult 对象** @param code 状态码* @param msg  返回内容*/public BaseResult(int code, String msg) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);}/*** 初始化一个新创建的 BaseResult 对象** @param code 状态码* @param msg  返回内容* @param data 数据对象*/public BaseResult(int code, String msg, Object data) {super.put(CODE_TAG, code);super.put(MSG_TAG, msg);super.put(DATA_TAG, data);}/*** 返回成功消息** @return 成功消息*/public static BaseResult success() {return BaseResult.success("操作成功");}/*** 返回成功数据** @return 成功消息*/public static BaseResult success(Object data) {return BaseResult.success("操作成功", data);}/*** 返回成功消息** @param msg 返回内容* @return 成功消息*/public static BaseResult success(String msg) {return BaseResult.success(msg, null);}/*** 返回成功消息** @param msg  返回内容* @param data 数据对象* @return 成功消息*/public static BaseResult success(String msg, Object data) {return new BaseResult(HttpStatus.SUCCESS, msg, data);}/*** 返回错误消息** @return*/public static BaseResult error() {return BaseResult.error("操作失败");}/*** 返回错误消息** @param msg 返回内容* @return 警告消息*/public static BaseResult error(String msg) {return BaseResult.error(msg, null);}/*** 返回错误消息** @param msg  返回内容* @param data 数据对象* @return 警告消息*/public static BaseResult error(String msg, Object data) {return new BaseResult(HttpStatus.ERROR, msg, data);}/*** 返回错误消息** @param code 状态码* @param msg  返回内容* @return 警告消息*/public static BaseResult error(int code, String msg) {return new BaseResult(code, msg, null);}
}

3.4.3、通用工具类

创建工具类包utils

通用Jackson工具类MapperUtils

package com.micromaple.my.project.common.utils;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Jackson 工具类* Title: MapperUtils* Description:** @author Micromaple*/
public class MapperUtils {private final static ObjectMapper objectMapper = new ObjectMapper();public static ObjectMapper getInstance() {return objectMapper;}/*** 转换为 JSON 字符串** @param obj* @return* @throws Exception*/public static String obj2json(Object obj) {try {return objectMapper.writeValueAsString(obj);} catch (Exception e) {e.printStackTrace();}return "";}/*** 转换为 JSON 字符串,忽略空值** @param obj* @return* @throws Exception*/public static String obj2jsonIgnoreNull(Object obj) throws Exception {ObjectMapper mapper = new ObjectMapper();mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);return mapper.writeValueAsString(obj);}/*** 转换为 JavaBean** @param jsonString* @param clazz* @return* @throws Exception*/public static <T> T json2pojo(String jsonString, Class<T> clazz){objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);try{return objectMapper.readValue(jsonString, clazz);}catch (Exception e){e.printStackTrace();}return null;}/*** 字符串转换为 Map<String, Object>** @param jsonString* @return* @throws Exception*/public static <T> Map<String, Object> json2map(String jsonString){if(StringUtils.isBlank(jsonString)) return null;ObjectMapper mapper = new ObjectMapper();mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);try {return mapper.readValue(jsonString, Map.class);} catch (IOException e) {e.printStackTrace();}return null;}/*** 深度转换 JSON 成 Map** @param json* @return*/public static Map<String, Object> json2mapDeeply(String json) throws Exception {return json2MapRecursion(json, objectMapper);}/*** 把 JSON 解析成 List,如果 List 内部的元素存在 jsonString,继续解析** @param json* @param mapper 解析工具* @return* @throws Exception*/private static List<Object> json2ListRecursion(String json, ObjectMapper mapper) throws Exception {if (json == null) {return null;}List<Object> list = mapper.readValue(json, List.class);for (Object obj : list) {if (obj != null && obj instanceof String) {String str = (String) obj;if (str.startsWith("[")) {obj = json2ListRecursion(str, mapper);} else if (obj.toString().startsWith("{")) {obj = json2MapRecursion(str, mapper);}}}return list;}/*** 把 JSON 解析成 Map,如果 Map 内部的 Value 存在 jsonString,继续解析** @param json* @param mapper* @return* @throws Exception*/private static Map<String, Object> json2MapRecursion(String json, ObjectMapper mapper) throws Exception {if (json == null) {return null;}Map<String, Object> map = mapper.readValue(json, Map.class);for (Map.Entry<String, Object> entry : map.entrySet()) {Object obj = entry.getValue();if (obj != null && obj instanceof String) {String str = ((String) obj);if (str.startsWith("[")) {List<?> list = json2ListRecursion(str, mapper);map.put(entry.getKey(), list);} else if (str.startsWith("{")) {Map<String, Object> mapRecursion = json2MapRecursion(str, mapper);map.put(entry.getKey(), mapRecursion);}}}return map;}/*** 将 JSON 数组转换为集合** @param jsonArrayStr* @param clazz* @return* @throws Exception*/public static <T> List<T> json2list(String jsonArrayStr, Class<T> clazz) throws Exception {JavaType javaType = getCollectionType(ArrayList.class, clazz);List<T> list = (List<T>) objectMapper.readValue(jsonArrayStr, javaType);return list;}/*** 获取泛型的 Collection Type** @param collectionClass 泛型的Collection* @param elementClasses  元素类* @return JavaType Java类型* @since 1.0*/public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);}/*** 将 Map 转换为 JavaBean** @param map* @param clazz* @return*/public static <T> T map2pojo(T map, Class<T> clazz) {return objectMapper.convertValue(map, clazz);}/*** 将 Map 转换为 JSON** @param map* @return*/public static String mapToJson(Map map) {try {return objectMapper.writeValueAsString(map);} catch (Exception e) {e.printStackTrace();}return "";}/*** 将 JSON 对象转换为 JavaBean** @param obj* @param clazz* @return*/public static <T> T obj2pojo(Object obj, Class<T> clazz) {return objectMapper.convertValue(obj, clazz);}
}

HttpClient 工具类

package com.micromaple.my.project.common.utils;import com.google.common.collect.Maps;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.Arrays;
import java.util.Map;/*** HttpClient 工具类* Title: HttpClientUtils* Description:** @author Micromaple*/
public class HttpClientUtils {public static final String GET = "get";public static final String POST = "post";public static final String REQUEST_HEADER_CONNECTION = "keep-alive";public static final String REQUEST_HEADER_CONTENTTYPE = "application/json;charset=UTF-8";public static final String REQUEST_HEADER_CONSUMES = "application/json";//设置连接超时时间,单位毫秒。public static final int CONNECTTIMEOUT = 18000;//请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。public static final int SOCKETTIMEOUT = 60000;//设置从connect Manager获取Connection 超时时间,单位毫秒public static final int CONNECTIONREQUESTTIMEOUT = 18000;/*** GET 请求** @param url 请求地址* @return*/public static String doGet(String url) {return createRequest(url, GET, null, false, null, 0);}/*** GET 请求 - 代理** @param url       请求地址* @param useProxy  是否需要代理* @param proxyHost 代理地址* @param proxyPort 代理端口* @return*/public static String doGet(String url, boolean useProxy, String proxyHost, int proxyPort) {return createRequest(url, GET, null, useProxy, proxyHost, proxyPort);}/*** GET 请求** @param url    请求地址* @param cookie cookie* @return*/public static String doGet(String url, String cookie) {return createRequest(url, GET, cookie, false, null, 0);}/*** POST 请求** @param url    请求地址* @param params 请求参数(可选)* @return*/public static String doPost(String url, BasicNameValuePair... params) {return createRequest(url, POST, null, false, null, 0, params);}/*** POST 请求 - 代理** @param url       请求地址* @param useProxy  是否需要代理* @param proxyHost 代理地址* @param proxyPort 代理端口* @param params    请求参数(可选)* @return*/public static String doPost(String url, boolean useProxy, String proxyHost, int proxyPort, BasicNameValuePair... params) {return createRequest(url, POST, null, useProxy, proxyHost, proxyPort, params);}/*** POST 请求** @param url    请求地址* @param cookie cookie* @param params 请求参数(可选)* @return*/public static String doPost(String url, String cookie, BasicNameValuePair... params) {return createRequest(url, POST, cookie, false, null, 0, params);}/*** POST 请求 - 文本 方式** @param url            请求地址* @param jsonBodyParams 请求参数 (JSON 格式)* @return*/public static String doPostForRow(String url, String jsonBodyParams) {return createRequestForRow(url, jsonBodyParams, false, null, 0);}/*** POST 请求 - 文本 方式 - 代理** @param url            请求地址* @param jsonBodyParams 请求参数* @param useProxy       是否需要代理* @param proxyHost      代理地址* @param proxyPort      代理端口* @return*/public static String doPostForRow(String url, String jsonBodyParams, boolean useProxy, String proxyHost, int proxyPort) {return createRequestForRow(url, jsonBodyParams, useProxy, proxyHost, proxyPort);}/*** POST 请求** @param url       请求地址* @param pMap      请求参数* @param useProxy  是否需要代理* @param proxyHost 代理地址* @param proxyPort 代理端口* @return*/public static Map<String, Object> doPost(String url, Map<String, String> pMap, boolean useProxy, String proxyHost, int proxyPort) {String str = HttpClientUtils.doPost(url, useProxy, proxyHost, proxyPort, generatNameValuePair(pMap));Map<String, Object> rtnMap = Maps.newHashMap();try {rtnMap = MapperUtils.json2map(str);} catch (Exception e) {e.printStackTrace();}return rtnMap;}/*** 创建请求** @param url           请求地址* @param requestMethod 请求方式 GET/POST* @param cookie        cookie* @param useProxy      是否需要代理* @param proxyHost     代理地址* @param proxyPort     代理端口* @param params        请求参数 仅限于 POST 请求用* @return*/private static String createRequest(String url, String requestMethod, String cookie, boolean useProxy, String proxyHost, int proxyPort, BasicNameValuePair... params) {//创建 HTTPClient 客户端
//        CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpClient httpClient = getHttpClient(useProxy, proxyHost, proxyPort);String result = null;try {//请求结果result = null;//请求方式HttpGet httpGet = null;HttpPost httpPost = null;//响应CloseableHttpResponse httpResponse = null;// GET 请求if (GET.equals(requestMethod)) {httpGet = new HttpGet(url);httpGet.setHeader("Connection", REQUEST_HEADER_CONNECTION);httpGet.setHeader("Cookie", cookie);httpResponse = httpClient.execute(httpGet);}// POST 请求else if (POST.equals(requestMethod)) {httpPost = new HttpPost(url);httpPost.setHeader("Connection", REQUEST_HEADER_CONNECTION);httpPost.setHeader("Cookie", cookie);//有参数进来if (params != null && params.length > 0) {httpPost.setEntity(new UrlEncodedFormEntity(Arrays.asList(params), "UTF-8"));}httpResponse = httpClient.execute(httpPost);}HttpEntity httpEntity = httpResponse.getEntity();result = EntityUtils.toString(httpEntity);} catch (IOException e) {e.printStackTrace();} finally {if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}return result;}/*** 创建 ROW POST 请求** @param url           请求地址* @param jsonBodyParam 请求参数 (JSON 格式)* @param useProxy      是否需要代理* @param proxyHost     代理地址* @param proxyPort     代理端口* @return*/private static String createRequestForRow(String url, String jsonBodyParam, boolean useProxy, String proxyHost, int proxyPort) {//创建 HTTPClient 客户端
//        CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpClient httpClient = getHttpClient(useProxy, proxyHost, proxyPort);String result = null;try {//请求结果result = null;//请求方式HttpPost httpPost = null;//响应CloseableHttpResponse httpResponse = null;httpPost = new HttpPost(url);httpPost.setHeader("Connection", REQUEST_HEADER_CONNECTION);httpPost.setHeader("Content-Type", REQUEST_HEADER_CONTENTTYPE);httpPost.setHeader("consumes", REQUEST_HEADER_CONSUMES);httpPost.setEntity(new StringEntity(jsonBodyParam, "UTF-8"));httpResponse = httpClient.execute(httpPost);HttpEntity httpEntity = httpResponse.getEntity();result = EntityUtils.toString(httpEntity);} catch (IOException e) {e.printStackTrace();} finally {if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}return result;}/*** 创建 HttpClient 客户端** @param useProxy  是否代理* @param proxyHost 代理地址* @param proxyPort 代理端口* @return*/private static CloseableHttpClient getHttpClient(boolean useProxy, String proxyHost, int proxyPort) {CloseableHttpClient httpClient = null;if (useProxy) {//设置代理IP、端口、协议HttpHost proxy = new HttpHost(proxyHost, proxyPort, "http");//把代理设置到请求配置//setConnectTimeout:设置连接超时时间,单位毫秒。//setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。//setSocketTimeout:请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(CONNECTTIMEOUT).setSocketTimeout(SOCKETTIMEOUT).setConnectionRequestTimeout(CONNECTIONREQUESTTIMEOUT).setProxy(proxy).build();//创建 HTTPClient 客户端httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();} else {//setConnectTimeout:设置连接超时时间,单位毫秒。//setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。//setSocketTimeout:请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(CONNECTTIMEOUT).setSocketTimeout(SOCKETTIMEOUT).setConnectionRequestTimeout(CONNECTIONREQUESTTIMEOUT).build();//创建 HTTPClient 客户端httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();}return httpClient;}/*** MAP类型数组转换成BasicNameValuePair类型** @param properties MAP类型数组* @return BasicNameValuePair类型数组*/private static BasicNameValuePair[] generatNameValuePair(Map<String, String> properties) {BasicNameValuePair[] basicNameValuePairs = new BasicNameValuePair[properties.size()];int i = 0;for (Map.Entry<String, String> entry : properties.entrySet()) {basicNameValuePairs[i++] = new BasicNameValuePair(entry.getKey(), entry.getValue());}return basicNameValuePairs;}
}

创建好后,目录结构效果如下:
在这里插入图片描述

四、创建项目服务模块

4.1、创建项目服务模块工程

创建一个名称为 my-project-server的项目,该项目负责实现具体业务,以及提供服务。

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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.micromaple</groupId><artifactId>my-project-dependencies</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../my-project-dependencies/pom.xml</relativePath></parent><artifactId>my-project-server</artifactId><packaging>jar</packaging><name>my-project-server</name><dependencies><!-- Project Begin --><dependency><groupId>com.micromaple</groupId><artifactId>my-project-common</artifactId><version>1.0.0-SNAPSHOT</version></dependency><!-- Project End --><!-- Spring Boot Begin --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!-- Spring Boot End --><!-- Junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!-- Environment Begin --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Environment End --><!-- Common Begin --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency><!-- Common End --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass></mainClass></configuration></plugin></plugins></build>
</project>

4.2、Maven托管

可以使用右侧的Maven+ 号来进行项目的托管。

4.3、完善目录结构

创建 src/main/javasrc/main/resource 目录

src/main/java 目录下创建包名,包名为:com.micromaple.my.project.server

src/main/resource 目录下创建application.yml,内容如下:

# Spring配置
spring:jackson:#时间戳统一转换为指定格式date-format: yyyy-MM-dd HH:mm:ss# 时区修改为东8区time-zone: GMT+8
server:port: 8899

4.4、创建 Application

这里使用 Spring 提供的 MyBatis 包扫面注解

package com.zxawvp.file.system.server;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@MapperScan(value = "com.zxawvp.file.system.server.mapper")
@EnableScheduling
public class FileSystemServerApplication {public static void main(String[] args) {SpringApplication.run(FileSystemServerApplication.class, args);}
}

pom.xml 中的 mainClass 指定该 Application

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.micromaple.my.project.server.MyProjectServerApplication</mainClass></configuration></plugin></plugins></build>

4.5、整合 Logback

src/main/resource 目录下创建logback-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><substitutionProperty name="logBase" value="./logs/" /><substitutionProperty name="logName" value="my-project-server" /><substitutionProperty name="logPatternExp" value="%date{YYYY-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{9999} %L -=> %msg%n" /><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${logPatternExp}</pattern></encoder></appender><appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logBase}${logName}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${logBase}${logName}-%d{yyyy-MM-dd}-%i.zip</fileNamePattern><maxHistory>180</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>30MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${logPatternExp}</pattern></encoder></appender><!-- project default level --><logger name="com.micromaple.my.project.server" level="DEBUG" /><logger name="org.springframework" level="ERROR" /><!-- root --><root level="DEBUG"><appender-ref ref="console" /><appender-ref ref="rollingFile" /></root>
</configuration>

application.yml增加配置:

logging:config: classpath:logback-spring.xml

4.6、整合 Druid 数据库连接池

src/main/resource 目录下创建application-druid.yml,内容如下:

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.110.135:3306/my-project?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: 123456druid:#连接池配置 初始化连接池的连接数量 大小,最小,最大initial-size: 5min-idle: 5max-active: 20#配置获取连接等待超时的时间max-wait: 60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis: 30000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: truetest-on-return: false# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filter:stat:merge-sql: trueslow-sql-millis: 5000#3.基础监控配置web-stat-filter:enabled: trueurl-pattern: /*#设置不统计哪些URLexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100stat-view-servlet:enabled: true# 数据监控访问路径url-pattern: /druid/*reset-enable: true#设置监控页面的登录名和密码login-username: adminlogin-password: adminallow: 127.0.0.1

application.yml 增加配置,内容如下:

# Spring配置
spring:# 启用指定配置文件#(文件名需满足application-{profile}.yml的格式)profiles:active: druid

application.yml 完整配置如下:

# Spring配置
spring:jackson:#时间戳统一转换为指定格式date-format: yyyy-MM-dd HH:mm:ss# 时区修改为东8区time-zone: GMT+8# 启用指定配置文件#(文件名需满足application-{profile}.yml的格式)profiles:active: druid
server:port: 8899
logging:config: classpath:logback-spring.xml

最终项目效果图如下:
在这里插入图片描述

五、创建代码生成模块

5.1、创建代码生成模块工程

创建一个名称为 my-project-generator的项目,该项目负责通过数据库自动生成通用的增删改查。

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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.micromaple</groupId><artifactId>my-project-dependencies</artifactId><version>1.0.0-SNAPSHOT</version><relativePath>../my-project-dependencies/pom.xml</relativePath></parent><artifactId>my-project-generator</artifactId><packaging>jar</packaging><name>my-project-generator</name><dependencies><!-- Project Begin --><dependency><groupId>com.micromaple</groupId><artifactId>my-project-common</artifactId><version>1.0.0-SNAPSHOT</version></dependency><!-- Project End --><!-- Spring Boot Begin --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!-- Spring Boot End --><!-- Junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!-- Environment Begin --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!-- Environment End --><!-- MP  代码生成工具需要的依赖1 velocity-engine-core 2 slf4j-api   3slf4j-log4j12 --><!-- Apache velocity --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId></dependency><!--freemarker模板--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><!-- Common End --><!--mybatis-plus代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></dependency></dependencies>
</project>

5.2、Maven托管

可以使用右侧的Maven+ 号来进行项目的托管。

5.3、完善目录结构

创建 src/main/javasrc/main/resource 目录

src/main/java 目录下创建包名,包名为:com.micromaple.my.project.generator

创建代码生成类,内容如下:

package com.micromaple.my.project.generator;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;import java.util.Collections;/*** 代码生成* Title: GeneratorApplication* Description:** @author Micromaple*/
public class GeneratorApplication {public static void main(String[] args) {String projectPath = System.getProperty("user.dir");String finalProjectPath = projectPath + "/my-project-generator";// 数据源配置DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://192.168.110.135:3306/my-project?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8","root","123456").dbQuery(new MySqlQuery()).typeConvert(new MySqlTypeConvert()).keyWordsHandler(new MySqlKeyWordsHandler());new StrategyConfig.Builder().serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp").build();FastAutoGenerator.create(dataSourceConfig).globalConfig(builder -> {builder.author("Micromaple") //设置作者.commentDate("yyyy-MM-dd HH:mm:ss")//注释日期.outputDir(finalProjectPath + "/src/main/java"); //指定输出目录}).packageConfig(builder -> {builder.parent("com.micromaple.my.project.server").moduleName("") // 设置父包模块名.entity("domain") //设置entity包名//.other("model.dto") // 设置dto包名.pathInfo(Collections.singletonMap(OutputFile.mapperXml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径}).strategyConfig(builder -> {builder.addInclude("sys_user") // 设置需要生成的表名.addTablePrefix("tb_"); // 设置过滤表前缀builder.entityBuilder().enableLombok();//开启 lombok 模型builder.entityBuilder().enableTableFieldAnnotation();//开启生成实体时生成字段注解builder.controllerBuilder().enableRestStyle();//开启生成@RestController 控制器}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();}
}

5.4、测试代码生成

建表语句:

CREATE TABLE `sys_user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`code` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '编号',`name` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',`sex` varchar(2) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',`age` int DEFAULT NULL COMMENT '年龄',`birthday` date DEFAULT NULL COMMENT '生日',`mail` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',`created_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_date` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'

新增数据:

insert into `sys_user` (`code`, `name`, `sex`, `age`, `birthday`, `mail`, `created_date`, `updated_date`) values('admin','超级管理员','男','18','2004-01-01','micromaple@qq.com','2022-09-21 21:48:33',NULL);

执行 GeneratorApplication 类的 main 方法后,可以看到生成的代码,效果如下图:
在这里插入图片描述

将其拷贝到my-project-server工程模块中,完整效果如下:
在这里插入图片描述

5.5、测试生成效果

我们在 my-project-server 工程编写单元测试,测试生成的代码是否可用。

创建 src/test/java 目录,在该目录创建包 com.micromaple.my.project.server.service

接着创建测试类 SysUserServiceTest,内容如下:

package com.micromaple.my.project.server.service;import com.micromaple.my.project.server.MyProjectServerApplication;
import com.micromaple.my.project.server.domain.SysUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@SpringBootTest(classes = MyProjectServerApplication.class)
@RunWith(SpringRunner.class)
public class SysUserServiceTest {@Autowiredprivate ISysUserService sysUserService;/*** 测试新增*/@Testpublic void addTest() {SysUser sysUser = new SysUser();sysUser.setCode("user");sysUser.setName("用户");sysUser.setSex("女");sysUser.setAge(18);boolean save = sysUserService.save(sysUser);System.out.println(save);// 输出 true 代表插入成功}/*** 测试查询*/@Testpublic void selectTest() {List<SysUser> sysUsers = sysUserService.getBaseMapper().selectList(null);for (SysUser sysUser : sysUsers) {System.out.println(sysUser.getName());}/*** 输出内容如下:* 超级管理员* 用户*/}
}

5.6、测试 Controller 层

SysUserController 代码如下:

package com.micromaple.my.project.server.controller;import com.micromaple.my.project.common.dto.BaseResult;
import com.micromaple.my.project.common.utils.MapperUtils;
import com.micromaple.my.project.server.domain.SysUser;
import com.micromaple.my.project.server.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** <p>* 用户表 前端控制器* </p>** @author Micromaple* @since 2022-09-21 21:51:15*/
@RestController
@RequestMapping("/sys-user")
public class SysUserController {@Autowiredprivate ISysUserService sysUserService;@GetMapping("/get/all")public BaseResult getAll() {List<SysUser> sysUsers = sysUserService.getBaseMapper().selectList(null);return BaseResult.success(sysUsers);}
}

启动 MyProjectServerApplication 服务,访问地址:

http://localhost:8899/sys-user/get/all

效果如下:
在这里插入图片描述

六、源码获取

源码在 GitHub码云,持续更新中,别忘了 start 喔~

GitHub

https://github.com/micromaples/my-project

码云gitee

https://gitee.com/micromaple/my-project

读到这里,想必你已经知道了如何搭建一个Spring Boot项目,并整合其他技术栈,快跟着一起动手吧。别忘了三连支持博主呀~

我是微枫Micromaple,期待你的关注~💪💪💪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11825.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java深入数组

Java深入数组 1、数组概念 数组就是存储数据长度固定的容器&#xff0c;保证多个数据的数据类型要一致。 2、数组的初始化 Java语言中数组必须先初始化才能使用&#xff0c;所谓初始化就是为数组的数组元素分配内存空间&#xff0c;并为每个数组元素赋初始值。一旦数组的初…

ELK优雅开启密码登录认证

ELK登录认证 当我们安装好ELK后&#xff0c;默认是可以直接访问到kibana的&#xff0c;可以直接查看收集到的信息&#xff0c;这样很不安全。 很多人采用的是Nginx代理来做登录验证功能&#xff0c;这也是一种实现方式&#xff0c;但是我们还有另一种更加优雅的方式&#xff0c…

Vue2.0 —— Vue.nextTick(this.$nextTick)源码探秘

Vue2.0 —— Vue.nextTick&#xff08;this.$nextTick&#xff09;源码探秘 《工欲善其事&#xff0c;必先利其器》 一、知识储备 在学习这个 API 之前&#xff0c;我们需要进行一定量的知识储备&#xff0c;并且是从最基础的开始&#xff1a; nextTick&#xff0c;译为&…

激光雷达物体检测(二):点视图检测算法

综述&#xff1a; 1.点视图&#xff1a; PointNet/PointNet&#xff0c;Point-RCNN&#xff0c;3D SSD 2.俯视图&#xff1a; VoxelNet&#xff0c;SECOND&#xff0c;PIXOR&#xff0c;AFDet 3.前视图: LaserNet&#xff0c;RangeDet 4.多视图融合&#xff1a; 俯视图…

谷粒商城 高级篇 (十九) --------- 消息队列

目录一、概述二、应用三、RabbitMQ 概念四、安装 RabbitMQ五、RabbitMQ 运行机制Exchange 类型六、RabbitMQ 整合七、RabbitMQ 消息确认机制1. ConfirmCallback2. ReturnCallback3. Ack 消息确认机制一、概述 大多应用中&#xff0c;可通过消息服务中间件来提升系统异步通信、…

python实现图像添加噪声、噪声处理、滤波器代码实现

目录 加载图像添加噪声 图像傅里叶变换和反变换并可视化 图像处理---高通滤波、低通滤波、带通滤波 低通滤波器---Butterworth低通滤波器、理想低通滤波器、高斯低通滤波器 加载图像添加噪声 高斯噪声是指它的概率密度函数服从高斯分布&#xff08;即正态分布&#xff09;…

Linux设置开机自启动Java程序--三种方式

Linux设置开机自启动Java脚本程序 缘起 公司内部的服务器中有个SpringCloud项目需要运行&#xff0c;之前都是通过nohup java-jar .. &的命令来执行的&#xff0c;但是这个cloud项目服务太多&#xff0c;手动启动太麻烦而且容易出错&#xff0c;干脆写个执行java的脚本好…

C++内存管理(每日更新)

文章目录0 概述0.1 四个层面的基本用法1 Primitives1.1 new expression1.2 delete expression1.3 调用构造函数与析构函数1.4 array new & array delete1.4.1 array new0 概述 C应用程序malloc非常重要 可以看出&#xff0c;C内存管理主要是有四个层面 0.1 四个层面的基本…

NFT重构票务系统

什么是NFT&#xff1f; NFT是运行在区块链上的一种不可分割的凭证&#xff08;Non-Fungible Token&#xff09;&#xff0c;或者称为非同质化代币。NFT目前主要用在数字艺术品的铸造、拍卖、流转&#xff0c;因为一个NFT能唯一地确定它的所有者&#xff0c;并可在链上跟踪每一…

自然语言语义分析研究进展_笔记

自然语言语义分析研究进展_笔记 词语语义分析&#xff1a;确定词语意义&#xff0c;衡量两个词之间的语义相似度或相关度; 句子语义分析&#xff1a;研究包含句义分析和句义相似度分析两方面; 文本语义分析&#xff1a;识别文本的意义、主题、类别等语义信息的过程&#xff…

使用@JsonFormat并进一步了解:格式化java.util.Date对象

Java 8 Spring Boot 2.7.3 jackson 2.13.3 -- ben发布于博客园 0、前言 开发过程中遇到问题: 前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。 调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。 ben发布于博客园 新建spring …

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉&#xff0c;一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变&#xff0c;共识就是区块链系统中各节点达成数据一致性的算法&#xff0c;正常情况下每个节点需要运行相同规则的算法&#xff0c;例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门&#xff0c;是一家世界级的技术研究和咨询公司&#xff0c;拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…

全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中

如果你关注自动驾驶,那有这样一个算法大赛,值得参与。由卡车自动驾驶领导者嬴彻科技与清华大学智能产业研究院(AIR)精心打造的“嬴彻-清华AIR杯”自动驾驶技术挑战赛正火热开赛中。这是国内首个同时覆盖干线物流和城市道路双赛道的大赛。决策规划是自动驾驶当下的热门方向和技术…

go语言的基本数据类型

基本数据类型中的常量已经介绍了 var const iota 。此处要对字符串特别说明&#xff0c;字符串也会被认为是基本数据类型&#xff0c;字符串实际在底层原理上与复合类型的数据非常相似。同事go语言支持八进制&#xff0c;6进制&#xff0c;科学计数法。空指针的值是nil。 整…

百度地图API

一、百度地图API接入 1、搜索百度地图开发平台 2、注册百度账号 3、登陆并申请成为开发者 4、在百度地图开发平台的首页选择控制台&#xff0c;在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用&#xff0c;其中最重要的是AK&#xff0c;这是百度地图…

从0-1,如何用低代码搭建管理系统

关键字&#xff1a;功能模块、流程中心、OA 前言&#xff1a;对于搭建系统&#xff0c;字眼上都知道是怎么回事&#xff0c;但要怎么搭建到最后怎么呈现一个投入运作的系统&#xff0c;估计就很少人知道了。当然作为专业的程序员肯定知道怎么操作&#xff0c;但是不是必须要专业…

IDEA集成Git

介绍 参考视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?p27 1 配置 Git 忽略文件 1.1为什么要配置 问题 1:为什么要忽略他们&#xff1f; 答&#xff1a;与项目的实际功能无关&#xff0c;不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之 间的差异。…