【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)
汝之观览,吾之幸也! 从本文开始讲下项目中用到的一些框架和技术,最基本的框架使用的是SpringBoot(2.5.10)+Mybatis-plus(3.5.3.2)+lombok(1.18.28)+knife4j(3.0.3)+hutool(5.8.21),可以做到代码自动生成,满足最基本的增删查改。
一、新建SpringBoot项目
使用Idea工具直接创建项目
输入项目名称等
生成web项目
二、配置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>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.10</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mitool</groupId><artifactId>springboot</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><mybatis-plus.version>3.5.3.2</mybatis-plus.version><freemarker.version>2.3.29</freemarker.version><lombok.version>1.18.28</lombok.version><knife4j.version>3.0.3</knife4j.version><hutool.version>5.8.21</hutool.version><pagehelper.version>1.4.7</pagehelper.version><ali.cola.version>4.3.2</ali.cola.version><org.mapstruct.version>1.4.2.Final</org.mapstruct.version></properties><dependencies><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><!-- mysql 链接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- Mybatis-plus 代码生成器 依赖配置 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId></exclusion></exclusions></dependency><!--freemarker依赖--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>${freemarker.version}</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><!-- knife4j --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>${knife4j.version}</version></dependency><!-- hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!-- pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.version}</version></dependency><!-- 阿里cola --><dependency><groupId>com.alibaba.cola</groupId><artifactId>cola-component-dto</artifactId><version>${ali.cola.version}</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin></plugins></build></project>
三、配置application.properties
1、配置application.properties
配置application.properties文件,文件中包含数据库配置、knife4j配置
# 应用名称
spring.application.name=spring-demo
# 开发环境设置
spring.profiles.active=dev
# 应用路径
server.servlet.context-path=/springboot
# 编码字符集
server.servlet.encoding.charset=utf-8
# swagger
knife4j.enable=true
knife4j.production=false
knife4j.basic.enable=false
2、配置application-dev.properties
配置数据库,
localhost:数据库IP
db_source:数据库名称
username:用户名
password:密码
# 端口
server.port=9900
spring.datasource.url=jdbc:mysql://localhost:3306/db_source?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# SSO
zsc.open.token.check=false
四、新建代码生成工具类 CodeGeneratorUtil
package com.mitool.springboot.utils;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.InjectionConfig;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;import java.util.Arrays;
import java.util.Scanner;/*** <p>Title: CodeGeneratorUtil</p>* <p>Description:* 描述:mybatis-plus 自动生成代码工具类* </p>** @author Jimmy.Shen* @version v1.0.0* @since 2022-10-19 9:58*/
@Slf4j
public class CodeGeneratorUtil {/*** 表前缀*/private static final String[] PREFIX = new String[]{"illp_", "t_"};/*** 是否生成controller、service、serviceImpl、converter*/private static final boolean ONLY_UPDATE_COLUMNS = true;/*** 数据源配置*/private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig.Builder("jdbc:mysql://10.10.177.151:3309/smart_park?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true","root", "ztesoft");/*** 读取控制台内容*/public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);log.info("### 请输入" + tip);if (scanner.hasNext()) {String ipt = scanner.next();if (StrUtil.isNotEmpty(ipt)) {return ipt;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}public static void main(String[] args) {String projectPath = System.getProperty("user.dir");String outputDir = projectPath + "/springboot/src/main/java/";String[] scannerArr = scanner("作者名,包名,表名").split(",");String authorName = scannerArr[0];String packageName = scannerArr[1];String tableName = scannerArr[2];// 规定代码路径,如果代码在不同项目中可进行调整String controllerName =projectPath + "/springboot/src/main/java/com/mitool/springboot/controller/" + packageName;String serviceName =projectPath + "/springboot/src/main/java/com/mitool/springboot/service/" + packageName;String serviceImplName =projectPath + "/springboot/src/main/java/com/mitool/springboot/service/" + packageName + "/impl/";String entityName =projectPath + "/springboot/src/main/java/com/mitool/springboot/entity/dataobject/" + packageName;String mapperName =projectPath + "/springboot/src/main/java/com/mitool/springboot/mapper/" + packageName;String mapperXmlName =projectPath + "/springboot/src/main/resources/mybatis-mapper/" + packageName;String voName =projectPath + "/springboot/src/main/java/com/mitool/springboot/entity/vo/" + packageName;String converterName =projectPath + "/springboot/src/main/java/com/mitool/springboot/converter/" + packageName;FastAutoGenerator.create(DATA_SOURCE_CONFIG)// 全局配置.globalConfig(builder ->//作者名builder.author(authorName)// 开启 swagger 模式 默认值:false.enableSwagger()// 禁止打开输出目录 默认值:true.disableOpenDir()// 指定输出目录.outputDir(outputDir)).packageConfig(builder -> builder.moduleName(packageName)).injectionConfig(builder -> {updateColumn(entityName, mapperName, mapperXmlName, voName, builder);if (ONLY_UPDATE_COLUMNS) {updateTemplate(controllerName, serviceName, serviceImplName, converterName, builder);}})//具体的生成文件的策略配置.strategyConfig(builder -> {builder.addInclude(tableName.split("#"))// .enableSkipView().addTablePrefix(Arrays.asList(PREFIX)).entityBuilder().enableFileOverride().enableLombok()// // controller.controllerBuilder().enableRestStyle().formatFileName("%sController").enableFileOverride()// service.serviceBuilder().superServiceClass(IService.class).formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl").enableFileOverride()//开启生成mapper.mapperBuilder().enableBaseResultMap().enableBaseColumnList().superClass(BaseMapper.class).formatMapperFileName("%sMapper").formatXmlFileName("%sXml").enableFileOverride();})//模板配置,如果你没有自定义的一些模板配置,这里直接使用默认即可。.templateConfig(config -> config.entity("/templates/entity.java"))//模板引擎配置.templateEngine(new FreemarkerTemplateEngine()).execute();// 删除生成的自带的 baomidou代码FileUtil.del(projectPath + "/springboot/src/main/java/com/baomidou");}private static void updateColumn(String entityName, String mapperName, String mapperXmlName, String voName, InjectionConfig.Builder builder) {builder.customFile(consumer -> consumer.fileName("DO.java").filePath(entityName).enableFileOverride().templatePath("/templates/entity.java.ftl"));builder.customFile(consumer -> consumer.fileName("Mapper.java").filePath(mapperName).enableFileOverride().templatePath("/templates/mapper.java.ftl"));builder.customFile(consumer -> consumer.fileName("Mapper.xml").filePath(mapperXmlName).enableFileOverride().templatePath("/templates/mapper.xml.ftl"));builder.customFile(consumer -> consumer.fileName("VO.java").filePath(voName).enableFileOverride().templatePath("/templates/vo.java.ftl"));}private static void updateTemplate(String controllerName,String serviceName, String serviceImplName,String converterName, InjectionConfig.Builder builder) {builder.customFile(consumer -> consumer.fileName("Controller.java").filePath(controllerName).enableFileOverride().templatePath("/templates/controller.java.ftl"));builder.customFile(consumer -> consumer.fileName("Service.java").filePath(serviceName).enableFileOverride().templatePath("/templates/service.java.ftl"));builder.customFile(consumer -> consumer.fileName("ServiceImpl.java").filePath(serviceImplName).enableFileOverride().templatePath("/templates/serviceImpl.java.ftl"));builder.customFile(consumer -> consumer.fileName("AppConverter.java").filePath(converterName).enableFileOverride().templatePath("/templates/converter.java.ftl"));}}
五、模板(FreemarkerTemplate)
模板文件放在resource/templates下
1、controller.java.ftl
package com.mitool.springboot.controller.${package.ModuleName};import com.mitool.springboot.utils.PageUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import com.mitool.springboot.service.${package.ModuleName}.${table.serviceName};
import com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO;
import com.mitool.springboot.entity.vo.${package.ModuleName}.${entity}VO;
import com.mitool.springboot.converter.${package.ModuleName}.${entity}AppConverter;
import com.alibaba.cola.dto.SingleResponse;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
<#if superControllerClassPackage??>import ${superControllerClassPackage};
</#if>
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* ${table.comment!} 前端控制器
* </p>
*
* @author ${author}
* @since ${date}
*/
@Slf4j
@RestController
@RequestMapping("/api/<#if controllerMappingHyphenStyle>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
@Api(value = "${table.comment!}", tags = "${table.comment!} 管理模块")
<#if superControllerClass??>public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>@Resourceprivate ${table.serviceName} service;@Resourceprivate ${entity}AppConverter converter;@ApiOperation(value = "${table.comment!}分页查询", notes = "${table.comment!}分页查询")@GetMapping("/page")public SingleResponse<?> page(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {PageHelper.startPage(pageIndex, pageSize);List<${entity}DO> list = service.list();return SingleResponse.of(PageUtil.pageInfoCopy(new PageInfo<>(list), ${entity}VO.class, converter::toValueObject));}@ApiOperation(value = "${table.comment!}列表查询", notes = "${table.comment!}列表查询")@GetMapping("/list")public SingleResponse<?> list() {List<${entity}DO> list = service.list();return SingleResponse.of(converter.toValueObject(list));}@ApiOperation(value = "${table.comment!}详情", notes = "${table.comment!}详情")@GetMapping("/detail")public SingleResponse<?> detail(@RequestParam Integer id) {return SingleResponse.of(converter.toValueObject(service.getById(id)));}@ApiOperation("新增")@PostMapping("/save")public SingleResponse<?> save(@RequestBody ${entity}VO param) {${entity}DO dataObject = converter.toDataObject(param);service.save(dataObject);return SingleResponse.buildSuccess();}@ApiOperation("更新")@PostMapping("/update")public SingleResponse<?> update(@RequestBody ${entity}VO param) {${entity}DO dataObject = converter.toDataObject(param);service.updateById(dataObject);return SingleResponse.buildSuccess();}@ApiOperation("删除")@PostMapping("/remove")public SingleResponse<?> remove(@RequestBody ${entity}VO param) {service.removeById(param.getId());return SingleResponse.buildSuccess();}
}
2、converter.java.ftl
package com.mitool.springboot.converter.${package.ModuleName};import com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO;
import com.mitool.springboot.entity.vo.${package.ModuleName}.${entity}VO;import org.mapstruct.Mapper;import java.util.List;/*** <p>* ${table.comment!} app 模型转换服务* </p>** @author ${author}* @since ${date}*/
@Mapper(componentModel = "spring")
public interface ${entity}AppConverter {${entity}DO toDataObject(${entity}VO ${entity?uncap_first}VO);List<${entity}DO> toDataObject(List<${entity}VO> ${entity?uncap_first}VOList);${entity}VO toValueObject(${entity}DO ${entity?uncap_first}DO);List<${entity}VO> toValueObject(List<${entity}DO> ${entity?uncap_first}DOList);
}
3、entity.java.ftl
package com.mitool.springboot.entity.dataobject.${package.ModuleName};import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.time.LocalDateTime;/**
* <p>* Title:${entity}* </p>* <p>* Description:描述:${table.comment} 对象* </p>** @author ${author}* @version 1.0.0* @since ${date}
**/
@Data
@TableName("${table.name}")
public class ${entity}DO implements Serializable {private static final long serialVersionUID = 1L;
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>/*** ${field.comment}*/<#if field.keyFlag><#assign keyPropertyName="${field.propertyName}"/>@TableId(value = "${field.name}", type = IdType.AUTO)</#if>private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
}
4、mapper.java.ftl
package com.mitool.springboot.mapper.${package.ModuleName};import com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO;
import ${superMapperClassPackage};
<#if mapperAnnotationClass??>import ${mapperAnnotationClass.name};
</#if>
import org.apache.ibatis.annotations.Mapper;/**
* <p>* ${table.comment!} Mapper 接口* </p>** @author ${author}* @since ${date}*/
<#if mapperAnnotationClass??>
@${mapperAnnotationClass.simpleName}
</#if>
<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}DO>
<#else>
@Mapper
public interface ${table.mapperName} extends ${superMapperClass}<${entity}DO> {}
</#if>
5、mapper.xml.ftl
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mitool.springboot.mapper.${package.ModuleName}.${table.mapperName}"><#if enableCache><!-- 开启二级缓存 --><cache type="${cacheClassName}"/></#if><!-- 通用查询映射结果 --><resultMap id="BaseResultMap"type="com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO"><#list table.fields as field><#if field.keyFlag><#--生成主键排在第一位--><id column="${field.name}" property="${field.propertyName}"/></#if></#list><#list table.commonFields as field><#--生成公共字段 --><result column="${field.name}" property="${field.propertyName}"/></#list><#list table.fields as field><#if !field.keyFlag><#--生成普通字段 --><result column="${field.name}" property="${field.propertyName}" />
</#if>
</#list></resultMap><#if baseColumnList><!-- 通用查询结果列 --><sql id="Base_Column_List">
<#list table.commonFields as field>${field.columnName},
</#list>${table.fieldNames}</sql></#if>
</mapper>
6、service.java.ftl
package com.mitool.springboot.service.${package.ModuleName};import ${superServiceClassPackage};
import com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO;/**
* <p>* ${table.comment!} 服务类* </p>
*
* @author ${author}
* @since ${date}
*/
<#if kotlin>
interface ${table.serviceName} : ${superServiceClass}<${entity}DO>
<#else>
public interface ${table.serviceName} extends ${superServiceClass}<${entity}DO> {}
</#if>
7、serviceImpl.java.ftl
package com.mitool.springboot.service.${package.ModuleName}.impl;import com.mitool.springboot.mapper.${package.ModuleName}.${table.mapperName};
import com.mitool.springboot.service.${package.ModuleName}.${table.serviceName};
import com.mitool.springboot.entity.dataobject.${package.ModuleName}.${entity}DO;
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;/**
* <p>* ${table.comment!} 服务实现类* </p>
*
* @author ${author}
* @since ${date}*/
@Service
<#if kotlin>
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}DO>(), ${table.serviceName} {}
<#else>
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}DO> implements ${table.serviceName} {}
</#if>
8、vo.java.ftl
package com.mitool.springboot.entity.vo.${package.ModuleName};<#list table.importPackages as pkg><#if pkg?contains("baomidou")><#elseif pkg?contains("Serializable")><#else>
import ${pkg};</#if>
</#list>
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;/*** <p>* ${table.comment!} 请求模型* </p>** @author ${author}* @since ${date}*/
@ApiModel(value="${entity}对象", description="${table.comment!}")
@Data
public class ${entity}VO {<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field><#if field.name != "is_delete"><#if field.keyFlag><#assign keyPropertyName="${field.propertyName}"/></#if><#if field.comment!?length gt 0>/*** ${field.comment}*/@ApiModelProperty(value = "${field.comment}")</#if>private ${field.propertyType} ${field.propertyName};</#if>
</#list>
<#------------ END 字段循环遍历 ---------->
}
六、用到的其他类 PageUtil
使用到了分页的工具类,放在utils目录下
package com.mitool.springboot.utils;import com.github.pagehelper.PageInfo;import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 分页工具类** @author Jimmy.Shen* @since 2021/11/26*/
public class PageUtil {/*** 通用pageInfo转换** @param sourcePageInfo 源数据* @param targetClass 目标类型* @param mapper list转换方法* @param <T> 目标类型* @param <S> 源类型*/public static <T, S> PageInfo<T> pageInfoCopy(PageInfo<S> sourcePageInfo, Class<T> targetClass, Function<S, T> mapper) {PageInfo<T> respPageInfo = new PageInfo<>();respPageInfo.setPageNum(sourcePageInfo.getPageNum());respPageInfo.setPageSize(sourcePageInfo.getPageSize());respPageInfo.setSize(sourcePageInfo.getSize());respPageInfo.setStartRow(sourcePageInfo.getStartRow());respPageInfo.setEndRow(sourcePageInfo.getEndRow());respPageInfo.setPages(sourcePageInfo.getPages());respPageInfo.setPrePage(sourcePageInfo.getPrePage());respPageInfo.setNextPage(sourcePageInfo.getNextPage());respPageInfo.setIsFirstPage(sourcePageInfo.isIsFirstPage());respPageInfo.setIsLastPage(sourcePageInfo.isIsLastPage());respPageInfo.setHasPreviousPage(sourcePageInfo.isHasPreviousPage());respPageInfo.setHasNextPage(sourcePageInfo.isHasNextPage());respPageInfo.setNavigatePages(sourcePageInfo.getNavigatePages());respPageInfo.setNavigatepageNums(sourcePageInfo.getNavigatepageNums());respPageInfo.setNavigateFirstPage(sourcePageInfo.getNavigateFirstPage());respPageInfo.setNavigateLastPage(sourcePageInfo.getNavigateLastPage());respPageInfo.setTotal(sourcePageInfo.getTotal());List<T> pageList = sourcePageInfo.getList().stream().map(mapper).collect(Collectors.toList());respPageInfo.setList(pageList);return respPageInfo;}
}
七、运行 CodeGeneratorUtil main方法
输入作者、包、表名生成文件,启动项目后可生成代码
生成的项目架构
使用swagger查看
相关文章:

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)
汝之观览,吾之幸也! 从本文开始讲下项目中用到的一些框架和技术,最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成,满足最基本的增删查改。 一、新…...

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器
一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中,我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说,RNN方法已经过时了,研究它们是没有意义的。的…...

Linux音频了解
ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能! 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述; ⚫ alsa-lib 库介绍; ⚫ alsa-lib 库移植; ⚫ alsa-l…...

精心整理了优秀的GitHub开源项目,包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等,空闲的时候方便看看提高自己的视野
精心整理了优秀的GitHub开源项目,包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等,空闲的时候方便看看提高自己的视野。 刚开源就变成新星的 igl,不仅获得了 2k star,也能提高你开发游戏的效率,摆…...

Leetcode54螺旋矩阵
思路:用set记录走过的地方,记下走的方向,根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…...

element-plus 表格-方法、事件、属性的使用
记录element-plus 表格的使用。方法、事件、属性的使用。因为是vue3的方式用到了const install getCurrentInstance();才能获取表格的相关信息 没解决怎么获取选中的行的行号,采用自己记的方式实习的。 利用row-class-name"setRowClass"实现样式的简单…...

NVME Linux的查询命令-继续更新
NVME Linux的查询命令 查看NVMe设备 # nvme list 查看nvme controller 支持的一些特性 # nvme id-ctrl /dev/nvme0 查看设备smart log信息 # nvme smart-log /dev/nvme0 查看设备error 信息 # nvme error-log /dev/nvme0 设备的所有命名空间 # nvme list-ns /dev/nvmeX 检…...

pyqt5-自定义文本域1
快捷键支持: CTRL鼠标滚轮实现字体大小调整 支持复制当前行 剪切当前行 # 多行文本框 class TextEdit(QTextEdit):def __init__(self, parentNone):super().__init__(parent)self.setStyleSheet("background-color: #262626;color: #d0d0d0;")self.setFon…...

Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】
Go实现LogCollect:海量日志收集系统【上篇——LogAgent实现】 下篇:Go实现LogCollect:海量日志收集系统【下篇——开发LogTransfer】 项目架构图: 0 项目背景与方案选择 背景 当公司发展的越来越大,业务越来越复杂…...

MySQL (1)
目录 操作须知 数据类型 1 DDL 1.1 操作库 1.2 操作表 1.3 操作字段(ALTER TABLE 表名) 2 DML 3 DQL(见下章) 操作须知 ※ MySQL在windows环境不区分大小写,但在Linux环境严格区分大小写 ※ 不同的数据库可能存在同名的表,可以给表前加"数据库前缀" //例:…...

MR混合现实汽车维修情景实训教学演示
MR混合现实技术应用于汽车维修课堂中,能够赋予学生更加真实,逼真地学习环境,让学生在情景体验中不断提高自己的专业能力。 MR混合现实汽车维修情景实训教学演示具体体现在: 1. 虚拟维修指导:利用MR技术,可…...

ChatGPT在航空航天工程和太空探索中的潜在应用如何?
ChatGPT在航空航天工程和太空探索领域具有广泛的潜在应用。这些应用可以涵盖从设计和模拟到任务控制和数据分析的多个方面。本文将探讨ChatGPT在航空航天和太空探索中的各种可能应用,包括设计优化、任务规划、智能导航、卫星通信、数据分析和太空探测器运行。 ### …...

算法基础第三章
算法基础第三章 1、dfs(深度搜索)1.1、 递归回溯1.2、递归剪枝(剪枝就是判断接下来的递归都不会满足条件,直接回溯,不再继续往下无意义的递归) 2、bfs(广度搜索)2.1、最优路径(只适合于边权都相等的题) 3、…...

ElementUI浅尝辄止20:Pagination 分页
分页组件常见于管理系统的列表查询页面,数据量巨大时需要分页的操作。 当数据量过多时,使用分页分解数据。 1.如何使用? /*设置layout,表示需要显示的内容,用逗号分隔,布局元素会依次显示。prev表示上一页…...

Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...

什么是大模型?1750亿、700GB的GPT大模型大在哪?
文章目录 什么是大模型?1750亿、700GB的GPT大模型大在哪? 什么是大模型? 在人工智能领域,模型是指一种对数据进行处理和分析的数学结构。模型越复杂,能够处理的数据量和处理的准确性都会得到提高。 随着人工智能技术…...

剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题 和 剑指 Offer 10- I. 斐波那契数列 很像,改一下初始值就行了。 方法一 class Solution {int mod (int) 1e9 7;public int numWays(int n) {if(n < 1) return 1;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for(int i 3…...

oracle10和11功能说明比较
Oracle 10g/11g的特点和优势 首先,Oracle 10g/11g具有以下几个特点: 1. 可靠性和稳定性:Oracle 10g采用了多种技术来确保数据的可靠性和稳定性,如ACID事务处理和数据备份与恢复机制。它还提供了高可用性的解决方案,如…...

golang-bufio 缓冲写
1. 缓冲写 在阅读这篇博客之前,请先阅读上一篇:golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…...

Windows修改电脑DNS
访问浏览器出现无法访问此页面,找不到DNS地址,则可以通过如下方式修改DNS 按下windows键R键(两个键一起按) 出现下面窗口 输入control按回车键(Enter键)就会出现下面的窗口 DNS可以填下面这些: 114.114.114.114 和 114.114.115.115 阿里DNS&a…...

Linux驱动之Linux自带的LED灯驱动
目录 一、简介 二、使能Linux自带LED驱动 三、Linux内核自带LED驱动框架 四、设备树节点编写 五、运行测试 一、简介 前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 …...

C盘清理 “ProgramData\Microsoft\Search“ 文件夹过大
修改索引存放位置 进入控制面板->查找方式改成大图标, 选择索引选项 进入高级 填写新的索引位置 删除C盘索引信息 删除C:\ProgramData\Microsoft\Search\Data\Applications 下面的文件夹 如果报索引正在使用,参照第一步替换索引位置。关闭索引...

深入了解字符串处理算法与文本操作技巧
深入了解字符串处理算法与文本操作技巧 引言 字符串处理是计算机科学和数据处理的核心领域之一。本博客将深入介绍一些常见的字符串处理算法和文本操作技巧,包括字符串匹配、搜索、正则表达式、字符串操作和文本标准化等。 暴力匹配算法 什么是暴力匹配…...

Python爬虫:打开盈利大门的利器
导言: 随着互联网的迅速发展,越来越多的企业和个人开始意识到数据的重要性。而Python爬虫作为一种自动化获取互联网信息的技术,为人们提供了更便捷、高效的数据获取方式。本文将介绍基于Python爬虫的五种盈利模式,并提供实际案例…...

17.CSS发光按钮悬停特效
效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…...

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行(Flexbox Wrapping)⭐ 示例:实现换行⭐ 排序(Flexbox Ordering)⭐ 示例:实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得…...

spark底层为什么选择使用scala语言开发
Spark 底层使用 Scala 开发有以下几个原因: 基于Scala的语言特性 集成性:Scala 是一种运行在 Java 虚拟机(JVM)上的静态类型编程语言,可以与 Java 代码无缝集成。由于 Spark 涉及到与大量 Java 生态系统的交互&#x…...

基于RabbitMQ的模拟消息队列之三——硬盘数据管理
文章目录 一、数据库管理1.设计数据库2.添加sqlite依赖3.配置application.properties文件4.创建接口MetaMapper5.创建MetaMapper.xml文件6.数据库操作7.封装数据库操作 二、文件管理1.消息持久化2.消息文件格式3.序列化/反序列化4.创建文件管理类MessageFileManager5.垃圾回收 …...

DHorse v1.3.2 发布,基于 k8s 的发布平台
版本说明 新增特性 构建版本、部署应用时的线程池可配置化; 优化特性 构建版本跳过单元测试; 解决问题 解决Vue应用详情页面报错的问题;解决Linux环境下脚本运行失败的问题;解决下载Maven安装文件失败的问题; 升…...

在vue.config.js中配置文件路径代理名
今天在公司项目中看到一个非常有趣的导入路径 crud 先是一蒙 这是个啥 突然想起一个被自己遗漏的知识点 在vue.config.js中配置路径指向 这里 我们随便找一个vue项目 在src下找到 components 目录 如果没有就创建一个 下面找到HelloWorld.vue 如果没有也是自己创建一个就好 然…...