JavaScript基础 - 经典案例2 - 生成校验验证码

Javascript验证码的生成和验证,源代码 JavaScript验证码生成和验证,源代码, 阅读详情

需求:

随机生成4位验证码,范围0-9a-z,用户输入后,点击确定按钮开始校验;

若用户未输入,弹出提示框;

若用户输入错误,显示红色的字,提示用户验证码输入错误,重新生成验证码,并清空输入框;

若用户输入正确,显示绿色的字,提示用户验证码输入正确;

当用户点击看不清换一张时重新显示新的验证码;

示例:

 

 

 

 

关键点:

1、生成随机数

2、修改DOM元素内容、样式

代码示例:

HTML:

<div class="code">
    <!-- 验证码显示 -->
    <div class="code_show">
        <span class="code_check">fr3d</span>
        <a href="javascript:;" class="change">看不清换一张</a>
    </div>

    <!-- 验证码输入 -->
    <div class="code_input">
        验证码:<input type="text">
        <!-- 提示验证码输入对错 -->
        <span class="tip"></span>
    </div>

    <button>确定</button>
</div>

CSS:

.code_input .tip {
    color: red;
}

/* 验证码输入正确时的样式 */
.code_input .tip.right {
    color: green;
}

JS

<script>
    // 获取显示验证码的span
    let codeCheck = document.querySelector('.code_check')
    // 获取'看不清换一张'按钮
    let change = document.querySelector('.change')
    // 获取提示验证码输入对错的span
    let tip = document.querySelector('.tip')
    // 获取验证码输入框
    let input = document.querySelector('.code_input input')
    // 获取确定按钮
    let btn = document.querySelector('.code button')

    // 确定按钮点击事件
    btn.addEventListener('click', () => {

        // 用户未输入提示'请输入验证码!'时
        if (!input.value) {
            return alert('请输入验证码!')
        }

        // 用户输入验证码与显示的验证码不一致时
        if (input.value !== codeCheck.innerHTML) {

            // 将用户输入框清空,便于用户下一次输入
            input.value = ''

            // 更换验证码
            codeCheck.innerHTML = getRandomCode(4)

            // 去掉提示验证码输入对错的span的 .right 样式
            tip.className = 'tip'

            // 设置提示验证码输入对错的span的内容,并退出函数
            return tip.innerHTML = '验证码输入错误!'
        }

        // 用户输入验证码正确
        tip.innerHTML = '验证码输入正确!'
        tip.classList.add('right')

    })

    // '看不清换一张'按钮点击事件
    change.addEventListener('click', () => {
        codeCheck.innerHTML = getRandomCode(4)

        // 清空提示验证码输入对错的span的内容
        tip.innerHTML = ''
    })

    // 生成随机数函数,范围是 min-max
    function getRandomNum(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min
    }

    // 生成 n 位随机验证码函数 /^[0-9a-z]{4}$/
    function getRandomCode(n) {

        // 验证码素材数组
        let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

        // 存放验证码的字符串
        let checkStr = ''

        for (let i = 0; i < n; i++) {
            // 调用getRandomNum函数,生成随机的 n 个数组下标
            let random = getRandomNum(0, arr.length - 1)

            // 将数组下标对应的元素拼接到字符串
            checkStr += arr[random]
        }

        return checkStr
    }
</script>

结束;

uniapp前端生成图形验证码并校验 一、uniapp前端生成图形验证码并校验 1、在src/utils目录下新建文件mcaptcha.js // mcaptcha.js export class Mcaptcha { constructor(options) { this.options = options; this.fontSize = options.height * 3 / 6; this.init(); this.refresh(); } init() { this.ctx 阅读详情

相关推荐

原生JS实现随机生成指定位数的验证码并校验

功能:1.生成随机指定位数的验证码,生成的验证码字符可以是字母或数字 2. 忽略字母大小写比较验证码是否输入正确 一、求字母和数字的Unicode 编码 用str.charCodeAt();来求解: 0~9: 48-57 A-Z: 65-90 a-z: 97-122 二、利用Math.random()求随机数 str.formCharCode()从字符编码创建一个字符串 校验时统

Qianqianliuliu的博客 2425

使用JavaScript实现很简单的随机验证码的生成以及验证

随即生成验证码,实现了随机生成、验证、随机背景色

weixin_54479067的博客 3623

Javascript 02:验证码生成以及校验

1 、生成验证码方法(随机数生成) function getCode(){ var arr=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; var str=''; for(var i=0;i<6;i++){ var num= Math.round(Math.random()*(15-0)+0); str+=arr[num]; } return str;

weixin_52682120的博客 685

JavaScript 随机生成指定位数的验证码

代码片段: &lt;html&gt; &lt;title&gt;随机验证码&lt;/title&gt; &lt;body&gt; &lt;form name="form1"&gt; 输入验证码的位数:&lt;input name="num" type="text"/&gt;

ByRisonBoy 1312

JavaScript实现页面动态验证码

引言: 现在很多在用户登陆或注册的时候为了防止程序攻击,加入了动态验证的技术,一般是让用户输入随即生成的验证码来实现。我自己写了一个没有跟后台交互的,就在前端验证,发出来给大家看看。 效果图: 实现思路: 把数字和字母放到一个数组中,通过随机的方式取得数组下标,总共取4个组成验证码; 把验证码渲染出来(一个一个的渲染); 绘制一定数量的干扰线,随机颜色; 输入验证码,输入4位以后去验证,正确显示钩,错误显示叉并且刷新验证码。 编写构造函数 文本构造函数 //文字的构造函数 f.

编程界明世隐的博客 1万+

Javascript实现生成不同的验证码(附完整源码)

Javascript实现生成不同的验证码(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 343

layUI的验证码功能及校验

用layUI的伙伴一定发现了: layUI的验证码是长死图!!! 没错,是死图~~~~ 什么倒霉框架。 下面代码是canvas验证码及校验。稍微修改及可用。 我嵌套到项目里的效果如图:   &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;!-- head --&gt; &lt;head&gt; &lt;meta charset="utf-8"&...

苏公子的博客 3万+

使用PHP生成图片验证码并进行校验

PHP快速入门与实战,在现代互联网应用中,为了防止恶意操作和机器人攻击,常常会使用图片验证码来验证用户的身份。本文将介绍如何使用PHP语言生成图片验证码,并结合前端的jQuery框架实现验证码的输入校验。验证码(CAPTCHA)是一种区分计算机程序和人类用户的图灵测试,常用于防止恶意操作和网络爬虫。一般来说,验证码通常由一个随机字符组成的图片和一个输入框组成。用户需要正确地将图片中的字符输入到输入框中,才能通过验证。本文介绍了如何使用PHP语言生成图片验证码,并结合jQuery实现验证码的输入校验。

黑夜开发者的博客 4413

验证码的生成及校验

验证码的生成及校验 内容:验证码的刷新,确认时的验证 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>验证码的生成及校验</title> <style type="text/css"> div{ padding: 0px 0px; margin: 0px auto; } a{

飞鱼同学 9028

解决屏幕不亮难题:慷智SerDes DE信号极性配置避坑指南

本文深入探讨了基于慷智AIM95x系列SerDes芯片的嵌入式显示系统开发中,因DE信号极性配置不匹配导致屏幕不亮的典型故障。文章详细解析了DE信号的核心作用与极性定义,提供了慷智SerDes芯片中DE极性寄存器的具体配置方法与调试记录,并给出了从隔离问题、对比时序到波形验证的系统性排查流程,帮助工程师快速定位并解决此类隐蔽问题。

weixin_29185493的博客 141

忆阻器(二)——忆阻模拟器

除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。 一、数学模型 忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型: {I=W(φ)VW(φ)=a+3bφ2dφdt=V \begin{cases} I=W(\varphi)V \\ W(\varphi)=a+3b \varphi ^2\\ \frac{d \varphi }{dt}=V \end{cases} ⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​ 这里的WWW

http://www.icfgblog.com/ 1万+

验证码生成及校验

验证码生成及校验

Admin_76的博客 882

五子棋ai:极大极小搜索和α-β剪枝算法的思想和实现(qt和c++)(一)引言和界面设计

引言 alphaGo击败围棋冠军李世石的新闻让我对棋类博弈产生了浓厚的兴趣,无奈本人不会围棋,但算是一个五子棋业余爱好者,于是乎希望通过实现一个五子棋ai来了解相关算法和知识。 五子棋在英文中又称Gobang,five-in-row,还有两个称呼:gomoku和renju(连珠)。我来简要介绍一下区别。由于五子棋已经被机器严格证明了是一种**“不公平”的游戏,先手黑子是绝对占优的,并且先手有必胜*...

livingsu的博客 1万+

通过js完成滑动验证码的校验

背景 对于滑动验证码校验的原理,如果我理解的没错的话,大致如下:我们在浏览器调出验证码,拖动滑块,同时页面开始记录鼠标的坐标,当松开鼠标的时候,页面完成对坐标数据的加密,携带该数据发送请求,在服务器端进行校验。要想用js伪造该过程,关键是获取滑块的坐标和对坐标进行加密的算法,下面仍然以58同城二手车为例,学习一下该过程。 大致过程 经过反复操作,发现要想获取验证码图片,需要先对https://callback.58.com/antibot/codev2/getsession.do发送post请求,获取ses

a97d1f4b2的博客 3903

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 910

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2263

【JavaWeb】登录案例+验证码校验

案例分析 代码实现 1.生成验证码图片 package servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Random;

高高冷的博客 1003

Matlab之机载雷达系统中的空时自适应处理(STAP)技术(附源码)

在第一个脉冲期间,天线 1 通过天线 N-1 接收的杂波返回与第二个脉冲期间天线 2 通过天线 N 接收的杂波返回相同。该算法可能需要搜索角度和多普勒的所有组合来定位目标,但对于示例,由于确切知道目标的位置,因此可以将处理器定向到该点。然而,接收到的信号不仅包含来自目标的反射回波,还包含来自被照亮地表的回波。然而,由于干扰器的白噪声性质,接收到的干扰信号占据了整个多普勒频段。在以下部分中,您将模拟来自目标、杂波和干扰器的返回,并说明 STAP 技术如何过滤来自接收信号的干扰。假设元件间距是波形波长的一半。

珞瑜的博客 7135

js生成验证码并验证

验证码 #code { font-family:Arial; font-style:italic; font-weight:bold; border:0; letter-spacing:2px; color:blue; }

秋叶为何落 8万+

YOLOv11 模型改进全流程:从代码修改到性能跃升,让你打造专属检测利器

无论是科研中需要发表创新点满满的论文,还是企业里要解决特定场景的检测难题,这套方法都能让你在YOLOv11的基础上打造出“量身定制”的检测模型。别再让通用模型的“平庸性能”限制你的项目上限——现在就动手修改代码,让你的YOLOv11模型在精度、速度或小样本适应能力上实现跨越式提升,用技术突破证明你的AI研发实力!本文将带你从代码层面入手,完成从骨干网络到损失函数的全维度改进,真正掌握让YOLOv11“为你所用”的技术实力。该改进对小样本类别(如数据集中仅占5%的“稀有缺陷”)的识别精度提升显著。

m0_71589036的博客 402

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

验证码校验小案例

验证码校验小案例 作者:钟华 需求 使用graphics创建图片; 在图片上随机生成四位数的验证码,包含英文字母和数字; 从键盘获取用户输入的信息; 实现页面跳转: 用户输入信息 = 随机产生信息 -->输出true 用户输入信息 != 随机产生信息 -->输出false 以web程序为开发目标 开发步骤 创建工程:new project 导包:js...

xiyouaijia的博客 306

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

js生成验证码

js生成验证码 var zkzcode; //在全局 定义验证码 function createCode() { zkzcode = &amp;quot;&amp;quot;; var zkzcodeLength = 4;//验证码的长度 var checkCode = document.getElementById(&amp;quot;checkCode&amp;quot;);//此处是显示验证码的地方 var selectC

芳 1558

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【JavaWeb】Javascript经典案例

Javascript经典案例注意:该文章是参考b站进行学习的,没有CSS的组成。

weixin_57858263的博客 514

实现登陆界面验证码的JS代码与校验

登陆界面验证码的JS代码与校验 //输入的验证码与随机生成的验证码的比较 if(data.captcha!=show_num.join('')){ console.log(data.captcha); console.log(show_num.join('')); layer.msg("验证码错误"); return false; } //定义获取sh

NewBie_xW的博客 775

H5+JS生成验证码,并支持点击刷新,验证码校验

H5+JS生成验证码 JS代码,拷贝下来复制即可,不说太多,直接上代码 JS代码,拷贝下来复制即可,不说太多,直接上代码 !(function(window, document) { function GVerify(options) { //创建一个图形验证码对象,接收options对象为参数 this.options = { //默认options参数值...

OxygenChen 7266
上一篇: JavaScript基础 - 经典案例1 - 支付倒计时
下一篇: VSCODE 简单配置用户代码片段
noirscent
博客等级 码龄6年 4粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值