25、全栈开发:从基础到持续集成与部署

全栈开发:从基础到持续集成与部署

1. 持续集成与 GitHub Actions

1.1 持续集成、交付与部署概念

持续集成(CI)是软件开发中的重要实践,它强调频繁地将代码集成到共享仓库,并通过自动化测试来确保代码的质量。持续交付(CD)是 CI 的自然延伸,在成功构建和测试后,代码准备好部署到生产环境。而持续部署则更进一步,自动将代码部署到生产环境。

1.2 GitHub Actions 概述

GitHub Actions 与 GitHub 生态系统紧密集成,可用于实现成功的 CI 开发实践。它允许定义必要的检查,在合并拉取请求前确保构建成功,为更复杂的开发工作流(如持续交付或部署)打下基础。

1.3 创建 CI 管道步骤

  1. 初始化本地 Git 仓库 :执行命令 git init -b main 来初始化本地仓库。
  2. 生成个人访问令牌(PAT) :在 GitHub 中生成 PAT,用于后续操作。
  3. 创建 GitHub 仓库 :在 GitHub 上创建项目仓库,并将本地应用文件推送到该仓库。
  4. 创建 GitHub Actions 工作流 :通过编写配置文件,定义构建和测试项目的步骤,确保未来的代码更改不会破坏应用程序。

2. 全栈开发基础技术

2.1 Quarkus 框架

  • 框架简介 :Quarkus 是类似于 Spring Boot 的 Java 网络应用框架,专注于减少应用启动时间和内存占用,提升开发者体验。
  • 项目创建 :可通过 CLI 工具、Maven 目标或使用 https://code.quarkus.io 页面创建 Quarkus 项目。
  • 开发模式运行 :使用命令 ./mvnw quarkus:dev 以开发模式运行 Quarkus 项目。
  • 测试驱动开发(TDD) :TDD 是一种软件开发过程,旨在提高开发者生产力和代码质量。
  • 应用打包 :运行 ./mvnw clean package 命令可轻松打包 Quarkus 应用。

2.2 Hibernate 与数据库操作

  • Hibernate 简介 :Hibernate 是 Java 中成熟的对象关系映射(ORM)库,提供 Java 持久化 API(JPA)规范的实现。
  • 反应式持久层 :使用 Quarkus 可实现完全反应式的持久层。
  • 实体实现 :通过扩展 PanacheEntity 基类,可在 Quarkus 中实现利用 Active Record 模式的实体。
  • 初始数据加载 :使用 quarkus.hibernate-orm.sql-load-script 配置选项和资源文件夹中的 SQL 脚本,可轻松加载应用的初始数据到数据库。
  • Quarkus Dev Services :在开发模式或集成测试阶段,Quarkus Dev Services 会自动配置应用依赖的服务容器。

2.3 REST 端点开发

  • RESTEasy Reactive :可用于实现阻塞和非阻塞的 REST 端点。
  • Mutiny 类型 :Mutiny 提供 Uni 和 Multi 两种类型来启动反应式管道。
  • Bean 管理 :Bean 是由 CDI 容器管理的对象,支持生命周期回调、依赖注入和拦截器等服务。在 Quarkus 中,使用 @ApplicationScoped 注解可轻松声明单例 Bean。
  • 密码哈希 : bcrypt 是首选的密码哈希函数,因其算法缓慢,能更好地抵御暴力攻击。
  • 路径参数处理 :在 Quarkus 中,可通过在路径中使用花括号声明路径参数,并使用 @PathParam 注解获取参数值。
  • JSON 响应 :若响应类型为 JSON 且声明了 quarkus-resteasy-reactive-jackson 依赖,则无需添加 @Produces 注解。
  • 异常处理 :实现 ExceptionMapper 类可将 Java 异常映射为 HTTP 响应。

2.4 JWT 安全

  • JWT 概念 :JWT 即 JSON Web Token,是用于在两方之间安全交换声明的标准。
  • 签名验证 :验证 JWT 签名需要公钥。
  • JWT 生成 :在 Quarkus 中,可使用 SmallRye JWT 构建依赖生成 JWT。
  • 密钥存储 :需要存储配置的密钥副本,且密钥存储路径的配置可在运行时覆盖。
  • 配置值获取 :使用 @ConfigProperty 注解可在 Quarkus 中获取配置值。
  • 角色注解优先级 :若 @RolesAllowed 注解同时应用于类和方法,方法注解优先级更高。

2.5 测试相关

  • 测试环境数据添加 :使用 %test.quarkus.hibernate-orm.sql-load-script 配置属性和资源文件夹中的 SQL 脚本,可向测试环境数据库添加数据。
  • 测试套件创建 :在 IntelliJ 中,右键单击生产类声明,选择“Go To Test”菜单可自动创建测试套件类。
  • Quarkus 测试 :运行 Quarkus 测试时,Quarkus 会在后台启动应用程序。
  • 测试安全注解 : @TestSecurity 注解可在测试运行时覆盖应用的安全上下文。

2.6 GraalVM 与原生镜像

  • GraalVM Native Image 简介 :GraalVM Native Image 是一种提前编译技术,可生成独立的原生可执行文件。
  • Quarkus 优势 :Quarkus 将许多常规 Java 应用在运行时执行的任务移至构建阶段,大幅减少启动时间。
  • 性能影响 :原生镜像打包并非总是能提高应用性能,短生命周期应用更适合使用原生镜像打包。
  • 资源包含 :使用 quarkus.native.resources.includes 配置属性可在应用的原生镜像中包含额外资源。
  • 容器化原因 :应用通常以 Linux 容器镜像的形式分发。

2.7 React 前端开发

  • Material Design :Google 创建的设计系统,为创建用户界面提供最佳实践和原则。
  • 前端路由库 :前端路由库可创建可书签化且用户友好的 URL,但 React 不规定使用特定的路由库。
  • Redux Toolkit :是 Redux 的一种有倾向性的分发方式,包含简化常见用例配置的实用工具。
  • React 钩子 :允许用户在不编写类的情况下使用状态和其他功能。
  • JSX :React 提供的 JavaScript 扩展,用于编写组件。
  • React 准则 :推荐使用组合方式构建组件。

2.8 前后端交互与测试

  • 跨域资源共享(CORS) :服务器使用 CORS 机制与不同源共享资源。
  • API 消费与存储 :使用 Redux Toolkit Query 的 createApi 函数可轻松消费 HTTP API 并将结果持久化到 Redux 存储中。
  • Redux Toolkit Query 操作 :支持只读查询操作和读写突变操作。
  • Snackbars 显示 :在 Material Design 中,Snackbars 用于在屏幕底部显示临时短消息。
  • React 开发服务器 :默认 URL 为 http://localhost:3000 。

2.9 组件与状态管理

  • MUI 组件 : Alert 组件是显示吸引用户注意力的短消息的最合适选择。
  • 状态管理 :React 的 useState 钩子用于在组件内保留本地状态。
  • 模态对话框按钮 :模态对话框中的操作按钮通常位于底部。
  • Redux 集成 :需将 reducer 及其中间件添加到主应用的存储中。
  • 路由参数配置 :配置路由路径时定义参数,可使用 useParams 钩子获取参数值。

2.10 测试相关技术

  • 测试用例分组 : describe 函数块用于分组相关的测试用例。
  • 前置函数执行 :Jest 在执行 describe 块内的任何测试之前,仅执行一次 beforeAll 函数。
  • 异步测试 :可在 Jest 中运行异步测试。
  • 用户输入模拟 :使用 userEvent 函数可模拟用户在文本字段中输入。
  • 代码覆盖率计算 :使用 Create React App 测试脚本和 Jest,在执行 npm test 命令时指定 --coverage 参数即可轻松计算代码覆盖率。

2.11 微服务架构

  • 微服务优势 :微服务易于扩展、提供高冗余性,且与编程语言无关。
  • 微服务劣势 :需要额外的基础设施,调试困难,处理数据一致性和事务性时更具挑战性。
  • 资源配置 :可使用 Maven Resources Plugin 的 resources 配置,为每个位置添加条目,以包含多个位置的资源。
  • 程序执行 :Maven Exec 插件允许在单独的进程中执行程序和 Java 程序。
  • 原生镜像资源包含 :可使用 quarkus.native.resources.includes 配置属性或 resources-config.json 配置文件在原生镜像中包含额外资源。

2.12 Kubernetes 与容器管理

  • Kubernetes 功能 :Kubernetes 用于管理基于容器的应用程序。
  • 容器化应用 :通过容器镜像分发的应用程序,使系统管理员能以统一和一致的方式管理应用。
  • 容器优势 :提供环境一致性、轻量级运行时、高效资源消耗等优势。
  • Kubernetes Pod :表示 Kubernetes 中最小的可部署计算单元。
  • Kubernetes Ingress :用于配置对集群中部署的服务的外部访问和路由。
  • Jib 工具 :Jib 可在不使用 Docker 兼容守护进程的情况下构建和推送容器镜像。

2.13 Fly.io 部署

  • Fly.io 优势 :允许开发者将工作负载部署到离用户近的地方,改善应用的延迟和性能。
  • 数据库 URL 覆盖 :运行 Quarkus 原生应用时,可通过提供 -Dquarkus.datasource.reactive.url 命令行参数覆盖配置的数据库 URL。
  • JKube 支持 :JKube 支持 Dockerfiles。
  • 部署配置 : flyctl 从 fly.toml 文件读取应用的部署配置。
  • 容器镜像部署 :可将现有容器镜像部署到 Fly.io。

2.14 任务管理器应用实践

  • 业务逻辑实现 :实现任务管理器的业务逻辑,包括 ProjectService 、 TaskService 和 UserService 等服务类。
  • 数据模型构建 :创建任务管理器的数据模型,包括 Project 、 Task 和 User 等实体,并加载初始数据。
  • 安全实现 :为任务管理器应用实现安全功能,如 JWT 认证和授权。
  • 前端开发 :创建 React 前端界面,包括登录页面、任务管理页面和用户管理页面等。
  • 测试与部署 :对任务管理器应用进行全面测试,并将其部署到不同的环境中,如 Kubernetes 集群或 Fly.io。

通过以上技术的综合应用,开发者可以构建出高效、安全、可扩展的全栈 Web 应用程序,并实现持续集成和部署的开发流程。

技术对比表格

技术 优点 缺点
微服务 易于扩展、高冗余、语言无关 需要额外基础设施、调试困难、数据一致性挑战
单体应用 开发简单、部署方便 扩展性差、维护困难

开发流程 mermaid 流程图

graph LR
    A[需求分析] --> B[Quarkus 后端开发]
    B --> C[数据库设计与操作]
    C --> D[REST 端点实现]
    D --> E[安全配置]
    E --> F[React 前端开发]
    F --> G[前后端交互]
    G --> H[测试]
    H --> I[持续集成与部署]

以上内容涵盖了全栈开发从基础技术到持续集成与部署的各个方面,为开发者提供了全面的技术指导和实践思路。

3. 任务管理器应用的详细实现与测试

3.1 任务管理器业务逻辑实现

任务管理器的业务逻辑主要通过几个核心服务类来实现:
- UserService :负责用户相关的操作,如创建用户、删除用户、查找用户等。以下是部分代码示例:

public class UserService {
    public User create(User user) {
        // 创建用户的具体逻辑
    }
    public void delete(long id) {
        // 删除用户的具体逻辑
    }
    public User findById(long id) {
        // 根据 ID 查找用户的具体逻辑
    }
    // 其他方法...
}
  • ProjectService :处理项目相关的操作,包括创建项目、更新项目、删除项目等。
public class ProjectService {
    public Project create(Project project) {
        // 创建项目的具体逻辑
    }
    public void update(Project project) {
        // 更新项目的具体逻辑
    }
    public void delete(long id) {
        // 删除项目的具体逻辑
    }
    // 其他方法...
}
  • TaskService :负责任务的管理,如创建任务、完成任务、更新任务等。
public class TaskService {
    public Task create(Task task) {
        // 创建任务的具体逻辑
    }
    public void setComplete(long id, boolean complete) {
        // 设置任务完成状态的具体逻辑
    }
    public void update(Task task) {
        // 更新任务的具体逻辑
    }
    // 其他方法...
}

3.2 任务管理器数据模型实现

任务管理器的数据模型通过实体类来定义,主要包括 User 、 Project 和 Task 实体:
- User 实体 :包含用户的基本信息,如用户名、密码等。

@Entity
public class User extends PanacheEntity {
    public String username;
    public String password;
    // 其他属性和方法...
}
  • Project 实体 :代表项目,包含项目的名称、描述等信息。
@Entity
public class Project extends PanacheEntity {
    public String name;
    public String description;
    // 其他属性和方法...
}
  • Task 实体 :表示任务,包含任务的标题、内容、所属项目等信息。
@Entity
public class Task extends PanacheEntity {
    public String title;
    public String content;
    @ManyToOne
    public Project project;
    // 其他属性和方法...
}

3.3 任务管理器安全配置

为了确保任务管理器应用的安全性,需要进行一系列的安全配置:
1. JWT 认证与授权 :使用 JWT 进行用户认证和授权,生成密钥文件,实现认证服务和登录接口。
2. HTTP 资源安全 :对 HTTP 资源进行保护,只允许授权用户访问特定的资源。
3. 密码哈希 :使用 bcrypt 对用户密码进行哈希处理,提高密码的安全性。

3.4 任务管理器前端开发

前端使用 React 进行开发,创建了多个页面和组件:
- 登录页面 :实现用户登录功能,管理前端会话。
- 任务管理页面 :展示任务列表,支持任务的创建、编辑和删除操作。
- 用户管理页面 :管理用户信息,包括用户的创建、更新和删除。

3.5 任务管理器应用测试

对任务管理器应用进行全面的测试,包括单元测试和集成测试:
- 单元测试 :对各个服务类的方法进行单独测试,确保其功能的正确性。
- 集成测试 :测试不同模块之间的交互,如前后端的交互、不同服务之间的协作等。
- 功能测试 :测试应用的各种功能,如用户登录、任务创建、项目管理等。

以下是一个简单的 Jest 单元测试示例:

import { render, screen } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
  render(<App />);
  const linkElement = screen.getByText(/learn react/i);
  expect(linkElement).toBeInTheDocument();
});

4. 持续集成与部署实践

4.1 GitHub Actions 实现持续集成

使用 GitHub Actions 创建持续集成管道,确保代码的质量和稳定性:
1. 初始化本地 Git 仓库 :执行 git init -b main 命令。
2. 生成个人访问令牌(PAT) :在 GitHub 账户中生成 PAT,用于访问仓库。
3. 创建 GitHub 仓库 :在 GitHub 上创建项目仓库,并将本地代码推送到仓库。
4. 创建 GitHub Actions 工作流 :编写 .github/workflows/main.yml 文件,定义构建和测试步骤。以下是一个简单的工作流示例:

name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build and test
        run: ./mvnw clean package

4.2 部署到不同环境

可以将任务管理器应用部署到不同的环境中,如 Kubernetes 集群和 Fly.io:

4.2.1 部署到 Kubernetes
  • 配置集群 :调整集群配置清单,使用 Eclipse JKube 或 Kubernetes Maven Plugin 来构建和部署容器镜像。
  • 部署应用 :使用 kubectl 命令将应用部署到 Kubernetes 集群。
4.2.2 部署到 Fly.io
  • 创建 Fly.io 账户 :在 Fly.io 上创建账户,并登录。
  • 配置项目 :设置 Maven 配置文件,创建 Dockerfile,配置 fly.toml 文件。
  • 部署应用 :使用 flyctl 命令将应用部署到 Fly.io。

5. 总结与展望

5.1 技术总结

通过本文的介绍,我们涵盖了全栈开发从基础技术到持续集成与部署的各个方面,包括 Quarkus 后端开发、React 前端开发、数据库操作、安全配置、测试和部署等。这些技术的综合应用可以帮助开发者构建高效、安全、可扩展的全栈 Web 应用程序。

5.2 未来展望

随着技术的不断发展,全栈开发将面临更多的挑战和机遇。未来,我们可以进一步探索以下方向:
- 微服务架构的优化 :进一步优化微服务架构,提高系统的性能和可扩展性。
- 人工智能与机器学习的集成 :将人工智能和机器学习技术集成到应用中,提供更智能的服务。
- 区块链技术的应用 :探索区块链技术在全栈开发中的应用,提高数据的安全性和可信度。

部署环境对比表格

部署环境 优点 缺点
Kubernetes 强大的容器编排能力、高可用性、可扩展性强 配置复杂、学习成本高
Fly.io 部署简单、接近用户、性能优化 功能相对有限、依赖网络环境

持续集成与部署 mermaid 流程图

graph LR
    A[代码提交] --> B[GitHub Actions 触发]
    B --> C[代码构建]
    C --> D[单元测试]
    D --> E[集成测试]
    E --> F{测试是否通过}
    F -- 是 --> G[部署到 Kubernetes]
    F -- 否 --> H[反馈错误信息]
    G --> I[部署到 Fly.io]

通过以上内容,开发者可以全面了解全栈开发的技术体系和实践方法,为实际项目的开发提供有力的支持。

相关推荐

DeepSeek集成开发全栈指南:解锁AI原生开发的终极工具箱

在AI技术渗透软件开发生命周期的今天,DeepSeek通过开放生态构建了覆盖全场景的开发工具矩阵。据统计,GitHub上awesome-deepseek-integration项目已获19k星标,其集成的200+工具链正在重塑AI应用开发范式。本文将深度解析DeepSeek生态中的核心开发工具,揭秘企业级AI应用的构建密码。通过DeepSeek-7B代码模型实现上下文感知的智能建议,实测Python开发效率提升60%基于强化学习的测试用例生成系统,可自动构建边界测试场景。

955

25、软件开发:构建与部署全解析

本文深入解析了软件开发中的构建与部署全流程,涵盖单元测试、自动化构建、持续集成实践、构建控制台工具选型、部署阶段的关键步骤及主流部署策略(蓝绿部署、滚动部署、金丝雀部署),并强调了监控与回滚机制的重要性。文章还提供了构建与部署的最佳实践,包括使用安装包作为交接接口、实现全面自动化和持续改进流程,旨在提升软件交付效率与质量,降低发布风险。

pca5navigator的博客 66

25、Anthos 开发与持续集成指南

本博客详细介绍了在 Anthos 上进行持续开发与持续集成的实践指南。内容涵盖 Anthos 开发者沙盒的使用、Cloud Source Repositories、Artifact Registry 和 Cloud Build 的配置与操作,以及如何将应用部署到 Anthos GKE、Cloud Run 和使用 Connect 网关部署到外部集群。此外,还讲解了如何触发 Cloud Build 管道并实现自动化部署。通过本博客,开发者可以掌握 Anthos 环境下的开发、构建和部署全流程,构建高效的 CI/

cherry的博客 132

JavaScript基础课程三十四、全栈跨平台综合实战与就业指南

本课是全系列前端全栈课程的收尾课,既是技术知识的综合实战闭环,也是从学习到就业的落地衔接。综合实战部分整合了Vue3、React、Node.js、MongoDB、跨端开发、性能优化、工程化全系列知识点,打造了一套企业级全栈跨平台项目,形成完整的技术体系。就业指南部分拆解了前端/全栈开发的岗位要求、简历制作、面试准备、职业成长全流程,给出了可落地的求职技巧与成长路径。掌握本课内容,你不仅具备了企业级全栈项目的独立开发能力,更掌握了求职就业的核心方法,完成了从技术学习者到职场开发者的关键跨越

RFCEO的博客 547

搞定8GB/s数据流:一个FPGA工程师的XDMA驱动调优实战(附避坑清单)

本文详细记录了FPGA工程师在XDMA驱动调优过程中实现8GB/s高带宽数据流的实战经验。通过优化DDR访问、中断响应、DMA映射等关键环节,解决了PCIE数据采集卡在高带宽场景下的性能瓶颈,并提供了实用的避坑清单和技术方案。

weixin_29194255的博客 201

Unity3D赛车游戏+脚本基础

本章主要介绍Unity的基础开发流程以及涉及到的概念。这个过程需要我们学会编写一些游戏脚本,在这讲的过程中我们会完成一个赛车小游戏,因此,在讲述这些基本概念和流程的时候,会同时涉及到一点脚本的开发基础.在游戏,电影和动画中,都有一个渲染的帧率,电影是24帧/s,游戏大概是30帧/s(当然也有60帧/s的)。在unity里面1秒钟,Update方法执行了30次。1秒钟有30帧,帧与帧之所消耗的时间是不一样的,那么我如何知道上一帧用了多少时间?Time.deltaTime就是为了解决这个问题。

m0_58367586的博客 7656

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 356

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7358

腾讯云智后台开发实习面试全纪录(已offer)

腾讯云智后台开发实习面经

wenwenaier的博客 5902

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 709

AM芯片性能测试

目前车载FM&AM没有明确的国标,因此各家测试项目可能不同,最主要测试标准比较混乱,多是根据具体芯片的规格书以及与芯片厂商协商。信号发生器:R&S SMCV100B音频分析仪:R&S UPV AUDIO AYALYZER DC 250KHZ(AP的也可以)专用USB-I2C控制模块(不同芯片控制模块不同,例如SPI或UART的控制模块)卡农线(针对模拟声道输出,+接左/右声道,-接GND,地可接GND也可悬空)

qflook的博客 902

一网打尽身份验证与授权:深入剖析ASP.NET Core Identity在C#中的全方位实战应用

ASP.NET Core Identity 是 Microsoft 提供的一个强大且可扩展的身份验证和授权框架,用于构建基于用户账户、角色和权限的Web应用程序。它提供了用户注册、登录、密码管理、多因素认证、角色分配、授权等功能,与ASP.NET Core框架深度集成,简化了安全相关的开发工作。通过上述代码示例和注释,展示了如何安装配置Identity、自定义用户实体与数据库上下文、实现用户注册登录、管理角色与用户角色关系,以及如何使用授权策略保护应用程序资源。,并指定用户和角色类型以及主键类型。

java专栏 1526

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 24、加密货币安全与隐私:防范诈骗与保护匿名性
下一篇: 基于多树的WSN节能查询
lemon
博客等级 码龄27年 33粉丝 1283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值