Springboot——对接支付宝实现扫码支付

文章目录

  • 前言
  • 官方文档以及说明
    • 1、申请沙箱
    • 2、进入沙箱获取对应的关键信息
    • 3、拿到系统生成的公钥和密钥
  • 注意事项
  • 创建springboot项目
    • 1、引入依赖
    • 2、配置连接参数
    • 3、创建配置类,用于接收这些参数
    • 4、中间类的定义(订单类)
    • 5、编写测试接口
      • 场景一、pc端请求后端后,生成支付宝的特制页面(AlipayTradePagePayRequest)
      • 场景二、前端请求后端,只返回对应的二维码地址(AlipayTradePrecreateRequest)

前言

最近项目中需要对接支付模块,需要考虑到微信支付与支付宝支付的实现。

由于微信支付的还在审核中,先预研demo做一个支付宝支付码获取的实现。

官方文档以及说明

本次开发环境中编写demo实现,采用的是支付宝的沙箱方式,后续上线会重新申请正式的appid等信息。

支付宝开发平台链接:https://open.alipay.com/

1、申请沙箱

进入支付宝的开发平台,用支付宝登录后,在控制台面板中找到沙箱,并创建第一个沙箱。

https://open.alipay.com/develop/manage

在这里插入图片描述

2、进入沙箱获取对应的关键信息

在这里插入图片描述
对于像授权回调地址应用网关地址这些暂时不设置。

3、拿到系统生成的公钥和密钥

在这里插入图片描述
在这里插入图片描述
这里会有应用公钥支付宝公钥应用私钥。但这里通过个人实践,只需要支付宝公钥应用私钥

应用公钥在某些特定的场景中并不会生效还会出现各种奇怪的报错。

注意事项

沙箱并不是所有的操作都能够在其中进行开发操作,详情参考官方文档说明。

https://opendocs.alipay.com/common/097jyi?pathHash=9fcbe0d0&highlight_field=%E6%B2%99%E7%AE%B1%E7%8E%AF%E5%A2%83

在这里插入图片描述

创建springboot项目

1、引入依赖

选用的是springboot 2.x 的版本,并且引用的依赖在官方文档中有版本说明。

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.34.47.ALL</version>
</dependency><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.0.0</version>
</dependency>

参考官方文档依赖版本规定:

https://opendocs.alipay.com/common/02n6z6?pathHash=f5e2a056

其中,针对通用版的版本要求,官方文档中有做说明:

https://opendocs.alipay.com/common/02kkv2?pathHash=358ff034

在这里插入图片描述

2、配置连接参数

src/main/resources中新建一个application.yml文件,如果是nacos项目,可以在对应的配置中心中新增配置项。

# 支付宝支付
alipay:# 应用ID,标识你的应用appId: # 应用私钥,用于签名请求appPrivateKey:# 应用公钥,用于验证支付宝的响应#alipayPublicKey: 沙箱页面中的应用公钥# 支付宝公钥(推荐使用这个)alipayPublicKey: 支付宝公钥# 支付通知的回调地址,支付宝会在支付完成后通知这个地址notifyUrl: 支付成功后的回调地址,必须要求公网能够访问# 页面跳转地址,支付完成后跳转到此URLreturnUrl: 场景一中登录成功后的重定向页面# 签名类型,通常为RSA2signType: RSA2# 字符编码,通常为utf-8charset: utf-8# 支付宝网关地址,用于发送请求gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do

3、创建配置类,用于接收这些参数

package cn.alipay.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 支付宝 支付参数配置类*/
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {/*** APPID*/private String appId;/*** 应用私钥,就是工具生成的应用私钥*/public String appPrivateKey;/*** 支付宝公钥,对应APPID下的支付宝公钥*/public String alipayPublicKey;/*** 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息*/public String notifyUrl;/*** 同步通知,支付成功,一般跳转到成功页*/public String returnUrl;/*** 签名方式*/private String signType;/*** 字符编码格式*/private String charset;/*** 支付宝网关;https://openapi-sandbox.dl.alipaydev.com/gateway.do*/public String gatewayUrl;/*** 订单超时时间*/private String timeout = "5m";
}

新建配置类,获取对应的配置参数,并构建连接对象

package cn.alipay.config;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.domain.BusinessParams;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.SettleDetailInfo;
import com.alipay.api.domain.SettleInfo;
import com.alipay.api.internal.util.WebUtils;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;/*** 支付宝支付 模板*/
@Slf4j
@Data
@Component
public class AliPayTemplate {@Autowiredprivate AlipayProperties alipayProperties;private AlipayClient alipayClient;@PostConstructpublic void init() {log.info("APPID:" + alipayProperties.getAppId());log.info("应用私钥:" + alipayProperties.getAppPrivateKey());log.info("支付宝公钥:" + alipayProperties.getAlipayPublicKey());log.info("支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息:" + alipayProperties.getNotifyUrl());log.info("同步通知,支付成功,一般跳转到成功页:" + alipayProperties.getReturnUrl());log.info("签名方式:" + alipayProperties.getSignType());log.info("字符编码格式:" + alipayProperties.getCharset());log.info("订单超时时间:" + alipayProperties.getTimeout());log.info("支付宝网关:" + alipayProperties.getGatewayUrl());// 1. 根据支付宝的配置生成一个支付客户端alipayClient = new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppId(),alipayProperties.getAppPrivateKey(),"json",alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());}
}

4、中间类的定义(订单类)

创建一个订单类,主要用于一些基本信息的传参处理。

package cn.alipay.config;import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** 订单表*/
@Data
public class Order implements Serializable {/*** 订单Id*/private Long id;/*** 用户Id*/private Long userId;/*** 接口Id*/private Long interfaceInfoId;/*** 支付金额*/private Double money;/*** 支付方式*/private String paymentMethod;/*** 0 - 未支付 1 - 已支付*/private Integer status;/*** 创建时间*/private Date createTime;/*** 更新时间*/private Date updateTime;/*** 是否删除*/private Integer isDelete;private static final long serialVersionUID = 1L;
}

5、编写测试接口

场景一、pc端请求后端后,生成支付宝的特制页面(AlipayTradePagePayRequest)

在支付宝的PC端案例文档中,有一个注意事项。

https://opendocs.alipay.com/open/00dn7o?pathHash=c1e36251

在这里插入图片描述
像这种传递订单信息至后台,后台调用支付宝的对应接口后,返回前端页面样式或者地址,前端再进行渲染实现。可以参照以下的方式。

定义接口

package cn.alipay.controller;import cn.alipay.config.AliPayTemplate;
import cn.alipay.config.Order;
import com.alipay.api.AlipayApiException;
import com.alipay.easysdk.factory.Factory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;/*** 阿里支付宝支付与回调接口*/
@Slf4j
@RestController
@RequestMapping("/alipay")
public class AliPayController {@Autowiredprivate AliPayTemplate aliPayTemplate;/*** 获取支付宝* post 请求 生成 frame 页面* get 请求生成 页面url* @param id* @return* @throws AlipayApiException*/@GetMapping(value = "/pay", produces = MimeTypeUtils.TEXT_HTML_VALUE)@ResponseBodypublic String pay(@RequestParam long id) throws AlipayApiException {// 创建订单对象并设置属性Order order = createOrder(id);// 调用支付宝支付模板进行支付return aliPayTemplate.pay(order);}/*** 伪造订单数据* @param id* @return*/private Order createOrder(long id) {Order order = new Order();order.setId(id);  order.setUserId(1111111L);  order.setInterfaceInfoId(294389472934L); order.setMoney(1000.0);  order.setPaymentMethod("支付宝"); return order;}
}

定义请求逻辑代码

package cn.alipay.config;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.domain.BusinessParams;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.SettleDetailInfo;
import com.alipay.api.domain.SettleInfo;
import com.alipay.api.internal.util.WebUtils;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;/*** 支付宝支付 模板*/
@Slf4j
@Data
@Component
public class AliPayTemplate {@Autowiredprivate AlipayProperties alipayProperties;private AlipayClient alipayClient;@PostConstructpublic void init() {log.info("APPID:" + alipayProperties.getAppId());log.info("应用私钥:" + alipayProperties.getAppPrivateKey());log.info("支付宝公钥:" + alipayProperties.getAlipayPublicKey());log.info("支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息:" + alipayProperties.getNotifyUrl());log.info("同步通知,支付成功,一般跳转到成功页:" + alipayProperties.getReturnUrl());log.info("签名方式:" + alipayProperties.getSignType());log.info("字符编码格式:" + alipayProperties.getCharset());log.info("订单超时时间:" + alipayProperties.getTimeout());log.info("支付宝网关:" + alipayProperties.getGatewayUrl());// 1. 根据支付宝的配置生成一个支付客户端alipayClient = new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppId(),alipayProperties.getAppPrivateKey(),"json",alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());}/*** 调用支付接口* @param order* @return* @throws AlipayApiException*/public String pay(Order order) throws AlipayApiException {//2、创建一个支付请求,并设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());Long id = order.getId();Long interfaceInfoId = order.getInterfaceInfoId();Double money = order.getMoney();String paymentMethod = order.getPaymentMethod();// 设置业务内容,包含必要的支付参数AlipayTradePagePayModel pagePayModel = new AlipayTradePagePayModel();pagePayModel.setOutTradeNo(String.valueOf(id));pagePayModel.setTotalAmount(String.valueOf(money));pagePayModel.setSubject(String.valueOf(interfaceInfoId));pagePayModel.setBody(paymentMethod);pagePayModel.setTimeoutExpress(alipayProperties.getTimeout());// 电脑支付场景下仅支持FAST_INSTANT_TRADE_PAYpagePayModel.setProductCode("FAST_INSTANT_TRADE_PAY");alipayRequest.setBizModel(pagePayModel);// post 请求返回 frame 前端样式AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest, "POST");// get 请求返回一个页面地址urlAlipayTradePagePayResponse response2 = alipayClient.pageExecute(alipayRequest, "GET");String result = response.getBody();//返回支付宝响应的结果return result;}
}

启动服务,请求后的效果如下:

localhost:8080/alipay/pay?id=123456

post 请求生成的样式如下所示:

<form  name="punchout_form" method="post" action="会有对应的信息"><input  type="hidden" name="biz_content" value="{&quot;body&quot;:&quot;支付宝&quot;,&quot;out_trade_no&quot;:&quot;125477&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;,&quot;subject&quot;:&quot;294389472934&quot;,&quot;timeout_express&quot;:&quot;5m&quot;,&quot;total_amount&quot;:&quot;1000.0&quot;}"><input  type="submit" value="立即支付" style="display:none" ></form><script>document.forms[0].submit();</script>

在这里插入图片描述
如果是GET请求,则只会是上面action的地址。

场景二、前端请求后端,只返回对应的二维码地址(AlipayTradePrecreateRequest)

参照官方文档中的案例实现

https://opendocs.alipay.com/open/8ad49e4a_alipay.trade.precreate?scene=2ae8516856f24a5592194d237f3f235d&pathHash=d18bff53

编写对应的接口和实现类

@GetMapping(value = "/pay3")
@ResponseBody
public String pay3(@RequestParam long id) throws AlipayApiException {// 创建订单对象并设置属性Order order = createOrder(id);// 调用支付宝支付模板进行支付return aliPayTemplate.pay3(order);
}
package cn.alipay.config;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.domain.BusinessParams;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.SettleDetailInfo;
import com.alipay.api.domain.SettleInfo;
import com.alipay.api.internal.util.WebUtils;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;/*** 支付宝支付 模板*/
@Slf4j
@Data
@Component
public class AliPayTemplate {@Autowiredprivate AlipayProperties alipayProperties;private AlipayClient alipayClient;@PostConstructpublic void init() {log.info("APPID:" + alipayProperties.getAppId());log.info("应用私钥:" + alipayProperties.getAppPrivateKey());log.info("支付宝公钥:" + alipayProperties.getAlipayPublicKey());log.info("支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息:" + alipayProperties.getNotifyUrl());log.info("同步通知,支付成功,一般跳转到成功页:" + alipayProperties.getReturnUrl());log.info("签名方式:" + alipayProperties.getSignType());log.info("字符编码格式:" + alipayProperties.getCharset());log.info("订单超时时间:" + alipayProperties.getTimeout());log.info("支付宝网关:" + alipayProperties.getGatewayUrl());// 1. 根据支付宝的配置生成一个支付客户端alipayClient = new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppId(),alipayProperties.getAppPrivateKey(),"json",alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());}public String pay3(Order order) throws AlipayApiException {AlipayTradePrecreateRequest alipayRequest = new AlipayTradePrecreateRequest();// 强制关闭 ssl 证书校验WebUtils.setNeedCheckServerTrusted(false);alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());JSONObject jsonObject = new JSONObject();jsonObject.put("out_trade_no",order.getId());// 商户订单号jsonObject.put("total_amount",order.getMoney());// 商品价格jsonObject.put("subject","这只是个商品标题");// 商品标题jsonObject.put("store_id","香蕉集团");//组织或公司名
//            jsonObject.put("timeout_express","5m");// 订单有效时间alipayRequest.setBizContent(jsonObject.toString());AlipayTradePrecreateResponse response = alipayClient.execute(alipayRequest);System.out.println("创建订单结果:"+response.getBody());System.out.println("订单编号是"+response.getOutTradeNo());String qrCode = response.getQrCode();
//            AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();return qrCode;}
}

请求后会得到一个支付的地址,使用ZXing框架,将其转换为二维码。

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

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

相关文章

【云备份项目】json以及jsoncpp库的使用

目录 1.JSON 2.什么是 JSON&#xff1f; 3.JSON 发展史 4.为什么要使用 JSON&#xff1f; 5.JSON 的不足 6.JSON 应该如何存储&#xff1f; 7.什么时候会使用 JSON 7.1.定义接口 7.2.序列化 7.3.生成 Token 7.4.配置文件 8.JSON的语法规则 8.1.对象和数组 8.2.JS…

【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻

文章目录 C map 容器详解&#xff1a;高效存储与快速查找前言第一章&#xff1a;C map 的概念1.1 map 的定义1.2 map 的特点 第二章&#xff1a;map 的构造方法2.1 常见构造函数2.1.1 示例&#xff1a;不同构造方法 2.2 相关文档 第三章&#xff1a;map 的常用操作3.1 插入操作…

HOT100_最大子数组和

class Solution {public int maxSubArray(int[] nums) {int[] dp new int[nums.length];int res nums[0];dp[0] nums[0];for(int i 1; i< nums.length; i){dp[i] Math.max(nums[i] ,dp[i-1] nums[i]);res Math.max(res, dp[i]);}return res;} }

contenteditable实现需要一个像文本域一样的可编辑框

我这里是因为左上和右下有一个固定的模板&#xff0c;所有用textarea有点不方便&#xff0c;查了下还有一个方法可以解决就是在需要编辑的元素上加上 :contenteditable"true" 完整代码如下&#xff0c;因为这个弹窗是两用的&#xff0c;所以用messageType做了一下判…

SpringBoot源码解析(一)

SpringBoot自动装配原理 SpringBootApplication注解 我们在使用SpringBoot时&#xff0c;通常使用的是SpringBootApplication这个注解&#xff0c;比如&#xff1a; 而这个注解的定义为下图&#xff0c;可以发现这个注解上有另外三个注解&#xff1a;SpringBootConfiguration…

WPF+MVVM案例实战与特效(二十四)- 粒子字体效果实现

文章目录 1、案例效果2、案例实现1、文件创建2.代码实现3、界面与功能代码3、总结1、案例效果 提示:这里可以添加本文要记录的大概内容: 2、案例实现 1、文件创建 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 ParticleWindow.xaml,在 Models 文件夹下创建粒子…

js中怎么把excel和pdf文件转换成图片打包下载

index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件转图片工具</title><!-- 本…

盘点 2024 十大免费/开源 WAF

WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 近几年经济增速开始放缓&#xff0c;科…

蓝牙资讯|苹果AirPods Pro 2推出听力测试、助听器和听力保护等功能

苹果推送iOS 18.1 系统版本更新&#xff0c;AirPods Pro 2 用户也在 iOS 18.1 中获得了强大的新功能。 运行固件 7B19 的 AirPods Pro 2 用户&#xff0c;搭配 iOS 18.1 系统的 iPhone&#xff0c;将获得三项强大的听力健康功能&#xff1a;听力测试、助听器和听力保护。 听力…

如何检查雷池社区版 WAF 是否安装成功?

容器运行状态检查&#xff1a; 使用命令行检查&#xff1a;打开终端&#xff0c;连接到安装雷池的服务器。运行 docker ps 命令&#xff0c;查看是否有与雷池相关的容器正在运行。 如果能看到类似 safeline-mgt、safeline-tengine 等相关容器&#xff0c;并且状态为 Up&#x…

【AI开源项目】Botpress - 开源智能聊天机器人平台及其部署方案

文章目录 Botpress 概述Botpress 的定位 Botpress 的主要特点1. OpenAI 集成2. 易于使用3. 定制和扩展性4. 多平台支持5. 集成和扩展 API6. 活跃的社区和详尽的文档 部署方案集成集成开发集成部署机器人示例开发工具代理本地开发先决条件从源代码构建 Botpress 如何解决常见问题…

Rust 力扣 - 1652. 拆炸弹

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要遍历长度长度为k的窗口&#xff0c;然后把窗口内数字之和填充到结果数组中的对应位置即可 题解代码 impl Solution {pub fn decrypt(code: Vec<i32>, k: i32) -> Vec<i32> {let n c…

HTMLCSS:打造酷炫下载安装模拟按钮

效果演示 这段代码通过HTML和CSS创建了一个具有交互效果的下载按钮&#xff0c;当复选框被选中时&#xff0c;会触发一系列动画和样式变化&#xff0c;模拟了一个下载和安装的过程&#xff0c;包括圆形的动画、文本的显示和隐藏等。 HTML <div class"container&quo…

【C++、数据结构】哈希表——散列表(一)(概念/总结)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C / STL使用以及模拟实现 &#x1f308;数据结构专栏&#xff1a; 数据结构 / 十大排序算法 &#x1f308;Linux专栏&#xff1a; Linux系统编…

WindowsDocker安装到D盘,C盘太占用空间了。

Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…

mac|安装redis及RedisDesk可视化软件

一、安装 通过Homebrew安装 brew install redis 在安装过程可以得到以下信息&#xff1a; 1、启动redis或重新登陆redis brew services start redis 如果只想在前端运行&#xff0c;而不是在后端&#xff0c;则使用以下命令 /opt/homebrew/opt/redis/bin/redis-server /opt…

程序中怎样用最简单方法实现写excel文档

很多开发语言都能找到excel文档读写的库&#xff0c;但是在资源极其受限的环境下开发&#xff0c;引入这些库会带来兼容性问题。因为一个小功能引入一堆库&#xff0c;我始终觉得划不来。看到有项目引用的jar包有一百多个&#xff0c;看着头麻&#xff0c;根本搞不清谁依赖谁。…

重读《人月神话》(12)-未雨绸缪(Plan to Throw One Away)

对程序员而言&#xff0c;一个不容忽视的事实是&#xff1a;任何系统都将经历变更&#xff0c;最初精心设计的软件也可能因不断的修补而变得面目全非。无论设计多么完美&#xff0c;随着时间推移&#xff0c;系统难免陷入混乱&#xff0c;只是程度和速度有所不同。因此&#xf…

(附项目源码)python开发语言,基于python Web的高校毕业论文管理系统 51,计算机毕设程序开发+文案(LW+PPT)

摘 要 随着信息化技术的迅速发展&#xff0c;人类信息化文明的到来&#xff0c;为人类的日常生活以及日常生产活动提供了非常大的便利&#xff0c;有效地解决了很多曾经无法解决的问题。本次基于python Web的高校毕业论文管理系统的开发是针对我国传统的高校毕业论文管理模式沟…