springboot第29集:springboot项目详细

news2024/11/13 2:47:03
  1. public static LoginUser getLoginUser():该行声明了一个公共的静态方法 getLoginUser(),它的返回类型是 LoginUser

  2. try:开始一个 try 块,用于处理接下来的代码中可能发生的异常。

  3. return (LoginUser) getAuthentication().getPrincipal();:该行从 getAuthentication() 方法中获取当前已认证用户的主体对象,并将其转换为 LoginUser 类型。getPrincipal() 方法通常在成功认证后返回与当前用户关联的主体对象。

  4. catch (Exception e):捕获 try 块中发生的任何异常,并将其赋值给变量 e。这样可以在 catch 块中处理异常。

  5. throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);:如果 try 块中发生异常,该行将抛出一个 ServiceException 异常,带有描述性的错误信息 "获取用户信息异常",以及 HTTP 状态码 UNAUTHORIZED

数据分片,包括分表和分库,日常我们一般使用springboot项目

  • springboot

  • mybatis-plus

  • dynamic-datasource(动态数据源、mybatis-plus拓展)

  • druid 连接池

# 多数据源配置 可参考 https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter
spring:
  datasource:
    dynamic:
      primary: master # 设置默认的数据源或者数据源组,默认值即为master
      strict: false   # 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
#        db-test:
#          url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
#          username: root
#          password: root
#          driver-class-name: com.mysql.jdbc.Driver

使用Docker部署elasticsearch docker下一键启动es,可根据需要的版本号对语句做修改

sudo docker run -it --rm --name elasticsearch -d -p 9200:9200 -p 9300:9300 elasticsearch:2.3.5

注意到该命令:

–rm参数:容器终止后销毁 -d:后台进程 -p 9200:9200 -p 9300:9300:开放了9200端口和9300端口

java -jar xxx.jar --spring.profiles.active = dev

java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

简介

Redis时一个开源的非关系数据库,支持持久化存储。

安装

Mac os x下安装Redis很简单通过Brew安装即可。

如果没有安装 Brew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
首先,获取最新软件安装包

brew update

安装Redis

brew install redis

redis-server

//Redis 默认端口是6379,你也可以换个端口号启动,
redis-server --port 6380

//使用了肯定需要停止,停止怎么弄呢?
//停止
//执行命令
redis-cli shutdown

在IDEA中,你可以使用"Redo"(重做)操作来执行Command+Z(或Ctrl+Z)的反功能。"Redo"操作用于撤销之前的撤销操作,从而恢复先前的更改。

你可以通过以下几种方式执行"Redo"操作:

  1. 使用快捷键:默认情况下,"Redo"操作的快捷键是"Ctrl + Shift + Z"(Windows/Linux)或"Cmd + Shift + Z"(Mac)。按下对应的快捷键,即可执行"Redo"操作。

  2. 使用菜单选项:在IDEA的菜单栏中,选择"Edit"(编辑)菜单,然后选择"Redo"选项,即可执行"Redo"操作。

  3. 使用工具栏按钮:在IDEA的工具栏中,有一个"Redo"按钮(通常显示为一个向前的箭头),点击该按钮即可执行"Redo"操作。

请注意,"Redo"操作仅在先前执行了"Undo"(撤销)操作之后才可用。如果你尚未进行过任何撤销操作,或者你已经执行了其他操作而无法进行"Redo",则"Redo"选项可能会被禁用或不可用。

PO持久化对象:数据库记录entity,一一与数据库记录对应。

BO业务对象:前端业务请求、应用内部业务逻辑对象,以及所有非PO场景。

VO值对象:返回前端结果

DTO数据传输对象: 对外API的返回对象,或者系统间(非应用间)传输

  1. Domain(领域模型): 领域模型是指在软件开发中对真实世界的概念和业务规则的建模。在领域驱动设计(Domain-Driven Design)中,领域模型被认为是软件系统的核心,它负责表示业务实体、业务逻辑和业务规则。在Spring Boot应用程序中,领域模型通常是用来表示业务实体的Java类,例如用户、订单、产品等。

  2. VO(Value Object,值对象): 值对象是指那些没有唯一标识符,且仅根据它们的属性值来进行比较的对象。在Java开发中,VO通常用于封装一组相关属性,用于传递数据或表示某个特定领域的值。VO对象通常是不可变的(immutable),这意味着它们的属性一旦被设置就不能再改变。在Spring Boot应用程序中,VO通常用于表示一些与业务逻辑相关的值,如DTO(Data Transfer Object)或响应对象等。

PathSimplifier是一个轨迹展示组件,相比 AMap.Polyline (折线),PathSimplifier更加针对节点数量巨大、排布密集的路径,比如按秒记录位置的车辆行进轨迹,精细的地理边界等等。主要的功能特性包括:

  1. 对需要绘制的轨迹节点,在保留视觉效果的前提下,做一定的简化处理(利用Simplify.js 。举例来说,比如A点和B点,两者距离不到1像素,则可以去掉B点,只留A点;再比如A,B,C三点在一条直线上,或者,B点仅仅稍微偏离A点和C点构成的线段,那么B点就可以去掉),从而减少轨迹绘制时涉及的节点数量,提升绘制性能。

  2. 支持快速识别轨迹上的节点。比如鼠标在轨迹上滑动时,可以显示鼠标位置对应的节点信息。

  3. 内置轨迹巡航器,支持轨迹回放,标识经过路径,以及获取经过距离等等。

  4. 支持丰富的样式配置,覆盖轨迹线、轨迹方向、轨迹节点,以及巡航器等。

Cause: java.sql.SQLException: Column count doesn't match value count at row 1\n; bad SQL grammar []; nested exception is java.sql.SQLException: Column count doesn't match value count at row 1"

该错误提示表明在进行数据库插入操作时,插入的数据列数与表的列数不匹配,导致出现了异常。具体原因是插入的数据列数与表定义的列数不一致,数据库要求插入的值的数量必须与表中列的数量相匹配。

通常情况下,这个错误可能由以下几个原因导致:

  1. 插入的值数量不匹配:您可能在插入数据库时提供了不正确数量的值。比如,插入语句中的列数与提供的值的数量不一致。

  2. 数据类型不匹配:有时候插入的数据类型与表的定义不一致,也会导致这个错误。比如,插入了一个字符串值到一个整数类型的列。

  3. 表结构变更:如果在数据库表结构发生了变化,例如添加或删除了某些列,而代码中的插入操作没有相应地更新,也可能导致这个错误。

要解决这个问题,您可以采取以下步骤:

  1. 检查插入语句:确保插入语句中的列与提供的值的数量相匹配,且列的顺序正确。确保数据类型与表定义的列类型相匹配。

  2. 检查表结构:如果表结构有变更,确保代码中的插入操作也相应地更新。如果有新的列,确保插入语句中包含新列,并提供对应的值。如果有删除的列,确保插入语句不包含这些列。

  3. 使用参数化查询:推荐使用参数化查询来执行数据库插入操作,而不是直接拼接SQL语句。这样可以避免SQL注入问题,并且更容易管理参数和值的匹配。

String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, value1);
pstmt.setInt(2, value2);
pstmt.executeUpdate();

由于字段'introduce_id'没有默认值,而且没有在插入语句中显式提供值,导致出现了异常。具体原因是数据库表中的'introduce_id'字段被定义为不允许为空,并且没有设置默认值,因此在插入数据时必须为该字段提供一个值。

出现这个错误的原因可能是以下几种情况:

  1. 缺少'introduce_id'字段的值:在插入数据时,未为'introduce_id'字段提供值,或者提供了一个空值(null),导致数据库无法生成该字段的值。

  2. 数据库表定义不正确:可能在数据库表的定义中,'introduce_id'字段没有设置为自增字段(auto-increment),导致在插入数据时必须手动为该字段提供一个值。

  3. MyBatis配置问题:在MyBatis映射文件中,可能没有正确地映射'introduce_id'字段,导致MyBatis无法自动为其生成值。

要解决这个问题,您可以采取以下步骤:

  1. 检查插入语句:确保插入语句中为'introduce_id'字段提供了一个有效的值。如果该字段是自增字段,可以将其从插入语句中去掉,让数据库自动生成值。

  2. 检查数据库表定义:如果'introduce_id'字段应该是自增字段,确保数据库表的定义中已经将其设置为自增字段。如果不是自增字段,确保在插入数据时手动提供一个合法的值。

  3. 使用数据库默认值:如果您希望'introduce_id'字段在插入数据时使用默认值,可以在数据库表的定义中为该字段设置默认值。例如,将其设置为自增字段,或者设置一个默认值,这样在插入数据时如果未提供具体值,数据库将使用默认值。

  4. 检查MyBatis映射配置:如果使用MyBatis进行数据库操作,请确保'introduce_id'字段在映射文件中正确地进行了映射,特别是如果该字段是自增字段,需要正确配置以使数据库能够自动生成值。

示例(设置默认值):

ALTER TABLE your_table MODIFY COLUMN introduce_id INT NOT NULL AUTO_INCREMENT;

<if>标签和${params.dataScope}是用于执行数据范围过滤的一种方式。数据范围过滤通常用于控制在数据库查询中返回的数据范围,以便根据用户的权限或其他条件仅返回满足特定条件的数据。

示例解释:

假设您有一个数据库表格users,其中包含以下字段:

  • user_id:用户ID

  • username:用户名

  • status:用户状态(例如,'active'表示激活,'inactive'表示未激活)

  • <update id="cleanLogininfor">:这表示定义了一个名为cleanLogininfor的更新操作,id为该更新操作的唯一标识,用于在MyBatis的mapper中调用这个SQL语句。

  • truncate table sys_logininfor:这是实际的SQL语句,用于执行数据清空操作。truncate table是SQL语句中的一个命令,用于删除整个表中的所有数据,但保留表的结构。在这里,我们指定要删除的表名为sys_logininfor

注意事项:

  1. TRUNCATE TABLE语句是一种高效的数据清空方法,它直接删除整个表的数据,而不是逐行删除数据。这意味着执行速度通常比DELETE语句快得多。但是请注意,使用TRUNCATE TABLE语句将无法记录删除的行,也无法触发触发器(如果有)。

  2. 在执行TRUNCATE TABLE语句时,需要谨慎使用,确保您真正需要清空整个表的数据。因为TRUNCATE TABLE操作是不可逆的,一旦执行就会永久删除表中的所有数据。

  3. 此操作可能需要具有足够权限的数据库用户来执行。在生产环境中,特别是涉及敏感数据的情况下,务必小心并确保仅有授权的用户可以执行这类操作。

53769b0c770c11504e6e1ac2df396409.png
image.png
dc92c2309b182a1f6b0248bd9a60b562.png
image.png

这个错误消息表明在更新数据库时出现了问题,原因是 java.lang.NumberFormatException,具体指向了字符串转换为数字时出现的错误。错误信息中显示出现了一个无效的数字字符串:"/profile/upload/2023/07/04/dddddd_20230704203032A001.png",这个字符串无法被正确转换为数字。

通常,这种错误在数据库更新过程中出现,可能是因为你的代码中尝试将字符串转换为数字类型,但这个字符串不符合数字的格式要求,导致转换失败。

在上述错误消息中,出现的字符串看起来像是一个图片的文件路径,而不是一个有效的数字。可能的原因是:

  1. 数据库字段类型错误: 可能在更新数据库时,你要将字符串值写入一个数字类型的数据库字段中,但该字段不应该存储这种类型的字符串数据。

  2. 数据格式错误: 数据库字段期望是数字类型,但在更新过程中传递了一个无效的字符串,例如包含了文件路径或其他非数字字符。

  3. 代码逻辑错误: 可能在更新数据库前,你的代码中做了某种操作,意外地将图片路径或其他非数字内容传递给了更新数据库的操作。

要修复这个问题,你可以考虑以下步骤:

  1. 检查数据库字段类型: 确保要更新的字段类型与传递的值匹配。如果字段应该是数字类型,确保不会传递非数字内容。

  2. 检查数据处理逻辑: 回顾代码逻辑,查看在更新数据库前是否对数据进行了正确的处理,防止将非数字内容传递给数字字段。

  3. 日志记录: 在代码中加入更详细的日志记录,记录传递给数据库更新的值,帮助你找出哪个部分出现了问题。

  4. 异常处理: 确保在代码中有适当的异常处理,以便在出现错误时,能够捕获和处理异常,避免整个操作崩溃。

根据错误信息可以看出,出现了一个嵌套异常(nested exception)。主要错误是 java.lang.NumberFormatException,而导致此错误的原因是尝试将字符串 "/profile/avatar/2023/06/23/blob_20230623212234A001.png" 转换为数字时出现了问题。

在错误信息中,可以看到涉及到 MyBatis(org.apache.ibatis.exceptions.PersistenceException) 的数据库更新操作。这些操作发生在 SysPictureMapper.xml 文件中的 com.ruoyi.system.mapper.SysPictureMapper.insertPicture 方法中。

问题的根本在于尝试将字符串 "/profile/avatar/2023/06/23/blob_20230623212234A001.png" 转换为数字,而此字符串不是有效的数字格式,因此引发了 NumberFormatException。

为了解决这个问题,你需要检查代码并确保不会在需要数字的地方传递错误的字符串参数。在这种情况下,很可能是在数据库更新操作中,错误地将文件路径传递为数字导致的。你应该找到相关代码块,检查 SysPictureMapper.xml 和对应的 Java 代码,特别是与图片路径相关的部分。

一种可能的解决方案是,如果你希望在数据库中存储图片路径,你应该将其存储为字符串类型的字段,而不是尝试将其转换为数字。这样可以避免 NumberFormatException 错误。

例如,如果数据库表中有一个 "avatar_path" 字段来存储图片路径,那么你可以将其声明为 VARCHAR 或类似的字符串类型。

在修复代码后,确保重新构建和部署应用程序,以便更改生效。

总结一下:

  1. 检查代码中与图片路径有关的部分,确保不会将其错误地传递为数字。

  2. 如果需要在数据库中存储图片路径,请将其作为字符串类型存储,而不是数字类型。

  3. 修复代码后重新构建和部署应用程序。

java.lang.NumberFormatException: For input string: ""解决方案

引起异常的主要原因如下:

  • 1.传参字段和映射字段不一致

  • 2.传参类型和映射类型不一致

  • 3.时间类型转换时间戳长度不一致

  • 4.参数长度和数据库不一致

  1. <if> 条件中,检查 picUrluserId 是否为非空字符串时,应该修改判断条件,不要将它们与数字 0 进行比较,因为这些字段是字符串类型的。应该使用 picUrl != null and picUrl != ''userId != null and userId != '' 来判断是否为非空字符串。

  2. 对于 picUrluserId 字段,插入语句中的判断条件应该在逗号 , 前面,而不是在后面。如果字段值不为空,才应该插入逗号,否则不需要插入逗号。

Spring Boot 结合Swagger 实现图片上传API接口文档

/**
 * 图片文件上传至阿里云OSS
 *
 * @param multipartFile 图片文件
 * @return 上传结果 图片存储地址
 */
@ApiOperation(value = "上传图片文件至OSS", httpMethod = "POST")
@PostMapping(value = "/uploadPictureFile", consumes = "multipart/*", headers = "content-type=multipart/form-data")
public String uploadPictureFile(@ApiParam(value = "上传图片文件", required = true) @RequestParam("file") MultipartFile multipartFile) {
    return aliyunOssService.uploadPictureFile(multipartFile);
}

在Spring Boot中,你可以使用@ApiParam注解和@RequestPart注解来设置Swagger文档中上传文件的描述信息。下面是一个示例代码,展示如何根据MultipartFile来设置Swagger:

Swagger:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api")
@Api(tags = "文件上传接口")
public class FileUploadController {

    @PostMapping("/upload")
    @ApiOperation(value = "上传文件接口", notes = "上传文件到服务器")
    public ResponseEntity<String> uploadFile(
            @ApiParam(value = "要上传的文件", required = true) @RequestPart("file") MultipartFile file
    ) {
        // 在这里进行文件上传的逻辑
        // ...

        return new ResponseEntity<>("File uploaded successfully.", HttpStatus.OK);
    }
}

在上面的示例中,我们使用@ApiParam注解来描述MultipartFile类型的file参数。@ApiParam允许你为参数提供说明和其他元数据,这些信息将会显示在Swagger文档中。我们设置required = true来指定这个参数是必需的。

另外,我们还使用@RequestPart注解来绑定MultipartFile类型的参数file。这是因为文件上传时,一般会使用@RequestParam来处理普通表单字段,而使用@RequestPart来处理文件上传。

在使用Swagger生成API文档时,它会根据@Api@ApiOperation中的信息以及@ApiParam中的描述来生成相应的API文档。以上的示例会在Swagger UI中显示一个上传文件的接口,并且会包含关于文件参数的说明。

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL好难(6):queue队列的使用

目录 1.queue的介绍 2.queue的使用&#xff1a; 3.queue的模拟实现&#xff1a; 4.deque的介绍&#xff1a; 5.deque的函数接口和底层原理&#xff1a; 6.deque的优缺点&#xff1a; 1.queue的介绍 queue的文档内容 1. 队列是一种容器适配器&#xff0c;专门用于在FIFO上…

二次-InsCode Stable Diffusion 美图活动一期

模型&#xff1a; AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置&#xff1a; 正&#xff1a;Mountains and seas, people 负&#xff1a;NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…

C# .NET 如何调用 SAP RFC 接口

1.分析传参结构 SAP 传参格式对应 .NET 参数格式 SAP 参数.NET 参数参数类型import(导入)——关联类型为数据元素Param单个变量参数import(导出)——关联类型为结构体Struct结构体tableTable表 下面是 SAP 对应参数类型&#xff1a; 2.web.config 配置 配置文件需要客户端…

Python学习笔记(十六)————异常相关

目录 &#xff08;1&#xff09;异常概念 &#xff08;2&#xff09;异常的捕获 ①异常捕获的原因 ②捕获常规异常 ③捕获指定异常 ④捕获多个异常 ⑤ 捕获异常并输出描述信息 ⑥捕获所有异常 ⑦异常else ⑧异常的finally &#xff08;3&#xff09;异常的传递 &#xff08…

自动化测试 selenium 篇

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是自动化测试&#xff1f;Selenium 介绍Selenium 是什么Selenium 特点工作原理 seleniumJava环境搭建ChromeJava1.下载ch…

uni-app:删除默认title

去除前&#xff1a; 可以看到有两个title 去除后&#xff1a; 可以看出就只有手机顶部的title了 "navigationStyle": "custom",//删除默认title

堆的向上与向下调整

目录 一、堆 1、概念 2、性质 二、向上调整 三、向下调整 四、建堆的比较 1.向上调整建堆 2.向下调整建堆 3.比较 五、总结 一、堆 1、概念 如果有一个关键码的集合K {k0k1&#xff0c;k2&#xff0c;…kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存…

怎么学习PHP错误处理和调试? - 易智编译EaseEditing

学习PHP错误处理和调试技术可以通过以下步骤&#xff1a; 理解错误类型&#xff1a; 了解PHP中常见的错误类型&#xff0c;如语法错误、运行时错误和逻辑错误等。学习它们的特点和常见原因&#xff0c;以便更好地定位和解决问题。 错误报告设置&#xff1a; 在开发环境中&am…

【Java基础学习打卡14】Java注释

目录 前言一、什么是注释二、注释的重要性三、单行、多行注释1.单行注释2.多行注释 四、文档注释1.文档注释2.JDK官网文档3.javadoc生成文档 五、注释建议总结 前言 本文介绍Java注释&#xff0c;它是我们在Java编程中必不可少的。Java注释有单行注释、多行注释和文档注释。对…

BUUCTF Web CyberPunk WriteUp

想直接查看payload的点这里 前言 二次注入&#xff08;Second-Order Injection&#xff09;是指攻击者在应用程序中注入恶意数据&#xff0c;然后在稍后的操作或不同的上下文中再次使用该恶意数据&#xff0c;导致安全漏洞。它通常发生在数据库查询、数据导出、报告生成等过程…

基于springboot博客论坛系统设计与实现(源码+文档LW+数据库+报告)

HBLOG 是一个博客论坛网站&#xff0c;分为游客端和管理员端。游客端主要有注册登录&#xff0c;查看文章&#xff0c;发表撰写文章&#xff0c;管理自己的文章&#xff0c;评论文章等功能&#xff1b;而管理员端主要有登录&#xff0c;查看近期数据&#xff0c;查看日志&#…

如何做好迭代回顾 2/4

事故根因分析&#xff1a;上集 北京某软件开发公司&#xff0c;专门为电信供应商做定制软件开发&#xff0c;比如发短信做些推广活动等。公司希望做过程改进&#xff0c;我首次与公司老板访谈&#xff1a; 我&#xff1a;过程改进主要帮助管理层更好达到公司业务目标。你们自己…

365天深度学习训练营-第T5周:运动鞋品牌识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow2 一、前期工作&#xff1a; 1、导入…

【活动】如何在工作中管理情绪

写在前面 近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注。有时候我们遇到的最大的敌人&#xff0c;不是运气也不是能力&#xff0c;而是失控的情绪和口无遮拦的自己。如何在工作中保持稳定的情绪&#xff1f;谈谈我的看法。 愤怒的危害 说到愤怒这种情绪&#xf…

基于深度学习的高精度鸟类目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度鸟类目标&#xff08;鹦鹉&#xff08;Crested Myna&#xff09;、麻雀&#xff08;Eurasian Tree Sparrow&#xff09;、黑头文鸟&#xff08;Chestnut Munia&#xff09;、白领翡翠&#xff08;Collared Kingfisher&#xff09;、太阳鸟…

【C语言】进阶指针(二)—>函数指针与回调函数

目录 前言&#xff1a; 一、函数指针 代码1分析&#xff1a; 代码2分析&#xff1a; 二、函数指针数组 三、指向函数指针数组的指针 四、回调函数&#xff08;模拟实现库函数qsort&#xff09; &#xff08;一&#xff09;void*类型指针的作用 &#xff08;二&#xf…

Spark—Shell命令对WordCount案例的基本操作(统计、去重、排序、求平均值及join)

一、统计、去重 1、案例数据介绍 WordCount统计&#xff1a;某电商网站记录了大量的用户对商品的收藏数据&#xff0c;并将数据存储在名为buyer_favorite的文本文件中。文本数据格式如下&#xff1a; 2、启动spark-shell 配置好spark环境&#xff0c;若还没有环境可以参考…

windows下环境问题总结

nacos 启动后在spring 项目中无法加载yml配置文件 spring.datasource.platform mysql 注意一定要放开这行&#xff0c;不放的话&#xff0c;可能会导致服务可以成功注册&#xff0c;但是&#xff0c;我们无法使用局部的 nacos里yml配置文件的属性

Linux:项目自动化构建工具——make/Makefile

文章目录 一.make与Makefile的关系1.Makefile2.make 二.项目清理1.clean2. .PHONY 前言&#xff1a; 本章主要内容有认识与学习Linux环境下如何使用项目自动化构建工具——make/makefile。 一.make与Makefile的关系 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个…

js实现图片压缩

创建一个type"file"的input标签&#xff0c;用于文件上传。 <input type"file" name"" id"upload" value"" />通过js实现图片压缩 window.onload function () {const upload document.getElementById("upload…