news 2026/4/25 4:22:25

10年老兵带你学Java(第18课):Spring Boot 开发必备技能 - 支付/短信/文件上传/接口文档

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10年老兵带你学Java(第18课):Spring Boot 开发必备技能 - 支付/短信/文件上传/接口文档

本课目标

  • 掌握 Swagger + Knife4j 接口文档生成,提升开发协作效率
  • 掌握七牛云/阿里云OSS对象存储接入,实现图片/文件上传功能
  • 了解微信支付/支付宝支付对接流程
  • 了解短信验证码(阿里云短信)的对接方法

一、接口文档:Swagger + Knife4j

1.1 为什么需要接口文档?

在实际项目中,后端要给前端、APP、测试提供接口服务。如果靠口头交接或者写Word文档,效率低且容易出错。

Swagger是一个规范,它能自动根据代码注解生成 API 文档,还能在浏览器里直接测试接口。

1.2 引入 Knife4j

Knife4j 是 Swagger 的增强UI版,界面更美观,功能更强。

Maven 依赖:

<!-- Swagger3 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency><!-- Knife4j(增强UI)--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>4.3.0</version></dependency>

配置文件:

spring:mvc:path match:matching-strategy:ant_path_matcher
@Configuration@EnableSwagger2@EnableKnife4jpublicclassSwaggerConfig{@BeanpublicDocketcreateRestApi(){returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.example.scanorder.controller")).paths(PathSelectors.any()).build();}privateApiInfoapiInfo(){returnnewApiInfoBuilder().title("扫码点餐系统 - 接口文档").description("提供菜品、订单、桌位等管理接口").version("1.0.0").build();}}

1.3 接口注解使用

@RestController@RequestMapping("/dish")@Api(tags="菜品管理")publicclassDishController{@GetMapping("/page")@ApiOperation(value="分页查询菜品",notes="支持按分类和名称筛选")@ApiImplicitParams({@ApiImplicitParam(name="current",value="当前页",dataType="Integer"),@ApiImplicitParam(name="size",value="每页条数",dataType="Integer"),@ApiImplicitParam(name="name",value="菜品名称",dataType="String")})publicResult<Page<Dish>>page(@RequestParam(defaultValue="1")Integercurrent,@RequestParam(defaultValue="10")Integersize,@RequestParam(required=false)Stringname){// ...returnResult.success(dishService.page(current,size,name));}}

启动项目后访问:

  • Swagger UI:http://localhost:8080/api/swagger-ui/
  • Knife4j:http://localhost:8080/api/doc.html

二、文件上传:OSS对象存储

2.1 为什么不用本地存储?

之前我们把图片存在服务器本地,但存在以下问题:

  • 服务器磁盘有限,大流量下容易爆满
  • 多台服务器时图片访问不一致
  • 服务器重启/迁移时文件丢失

解决方案:使用 OSS(对象存储)。国内常用:

  • 阿里云OSS(收费,但稳定)
  • 七牛云(10G免费,适合学习)
  • 腾讯云COS

2.2 七牛云上传示例

七牛云 SDK 依赖:

<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.14.0</version></dependency>

上传工具类:

@ComponentpublicclassQiniuOssUtil{@Value("${qiniu.access-key}")privateStringaccessKey;@Value("${qiniu.secret-key}")privateStringsecretKey;@Value("${qiniu.bucket}")privateStringbucket;@Value("${qiniu.domain}")privateStringdomain;// 例如:http://pd5k8pfp.bkt.clouddn.compublicStringupload(MultipartFilefile)throwsIOException{// 1. 构造凭证Authauth=Auth.create(accessKey,secretKey);Stringtoken=auth.uploadToken(bucket);// 2. 生成文件名StringoriginalFilename=file.getOriginalFilename();Stringext="";if(originalFilename!=null&&originalFilename.contains(".")){ext=originalFilename.substring(originalFilename.lastIndexOf("."));}Stringkey=UUID.randomUUID().toString().replace("-","")+ext;// 3. 上传UploadManageruploadManager=newUploadManager();Responseresponse=uploadManager.put(file.getBytes(),key,token);// 4. 返回访问地址returndomain+"/"+key;}}

Controller:

@PostMapping("/upload")publicResult<String>upload(@RequestParam("file")MultipartFilefile)throwsIOException{Stringurl=qiniuOssUtil.upload(file);returnResult.success("上传成功",url);}

三、短信验证码:阿里云短信

3.1 阿里云短信配置

  1. 注册阿里云账号,开通短信服务
  2. 申请签名和模板,拿到AccessKeyIdAccessKeySecret
  3. 记住模板CODE

依赖:

<dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version></dependency>

发送工具类:

@ComponentpublicclassSmsUtil{@Value("${aliyun.sms.access-key-id}")privateStringaccessKeyId;@Value("${aliyun.sms.access-key-secret}")privateStringaccessKeySecret;publicvoidsendCode(Stringphone,Stringcode)throwsException{AlipayOpenApiClientclient=newAlipayOpenApiClient("https://dysmsapi.aliyuncs.com",accessKeyId,accessKeySecret);AlipayOpenApiSendSmsRequestrequest=newAlipayOpenApiSendSmsRequest();request.putQueryParameter("PhoneNumbers",phone);request.putQueryParameter("SignName","你的签名");request.putQueryParameter("TemplateCode","SMS_xxx");request.putBizContent("{\"code\":\""+code+"\"}");client棕.toAyncRequest(request);}}

四、下一课预告

下一课我们将学习Spring Cloud 微服务架构,了解如何将一个单体应用拆分为多个独立服务,实现高并发、高可用的分布式系统。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 4:21:20

猫都能听懂的Stable Diffusion原理解析

1. Stable Diffusion是什么&#xff1f; 想象你有一杯清水&#xff0c;滴入一滴墨水。墨水会慢慢扩散&#xff0c;直到整杯水变成均匀的灰色——这就是**扩散&#xff08;Diffusion&#xff09;**的直观例子。Stable Diffusion的核心思想&#xff0c;正是模拟这种“从有序到无序…

作者头像 李华
网站建设 2026/4/25 4:08:22

消息队列-RabbitMq

1.概述 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途:不同进程Process/线程Thread之间通信 为什么会产生消息…

作者头像 李华
网站建设 2026/4/25 4:07:20

嵌入式开发中的数据管理范式转变与ARM优化实践

1. 嵌入式开发的范式转变&#xff1a;从控制逻辑到数据管理十年前我刚入行嵌入式开发时&#xff0c;整个行业还沉浸在"控制为王"的思维定式中。我们花费大量时间编写精妙的控制算法&#xff0c;调试中断服务例程&#xff0c;优化状态机逻辑。然而最近五年&#xff0c…

作者头像 李华