vue-webpack代码混淆、代码压缩设置

JS逆向-常见压缩和混淆之webpack(1) 对于代码混淆,其本质是对于代码标识符和结构的调整,从而达到不可读不可调试的目的,常用的混淆有字符串,变量名混淆。说到webpack,它是当前前端最热门的模块化管理和打包工具,本质上webpack只是一个现代JavaScript应用程序的静态模块打包工具,并不是混淆工具,尽管webpack有一些插件可以把代码混淆化,所以现在很多网站都把webpack和obfuscator混淆工具结合使用,这两者结合起来,会让前端代码变得难以阅读和分析。另外目前市面上比较常见的混淆还有ob混淆,特征是定义数组,数组位移。 阅读详情

package.json

"dependencies": {
    "webpack": "^4.41.3" // webpack版本
    "webpack-obfuscator": "^2.6.0" // 代码混淆版本
    "compression-webpack-plugin": "6.1.1", // 代码压缩版本
}

webpack.config.prod.js

const JavaScriptObfuscator = require('webpack-obfuscator');
const CompressionPlugin = require('compression-webpack-plugin');
config: {
  ...
  plugins: [
    // 代码混淆
    new JavaScriptObfuscator({
      // 压缩代码
      compact: true,
      // 关键字转义
      unicodeEscapeSequence: true
    }, []),
    new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),//该插件能够使得指定目录被忽略,从而使得打包变快,文件变小
    new CompressionPlugin({
      filename: "[path][base].gz", // 有的版本是[path].gz[query] 根据情况而定
      algorithm: "gzip",
      test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"),
      threshold: 10240, // 只有大小大于该值的资源会被处理 10240
      minRatio: 1, // 只有压缩率小于这个值的资源才会被处理
      deleteOriginalAssets: true, // 删除原文件,如果删除源文件nginx中需要额外配置资源目录
    }),
    new webpack.optimize.LimitChunkCountPlugin({
      maxChunks: 5, //控制打包生成js的个数
      minChunkSize: 100
    })

  ],
}

代码混淆 JavaScriptObfuscator

详情 JavaScript Obfuscator Tool 可以在这个网站测试自己需要的混淆方式

  plugins: [
    // 代码混淆
    new JavaScriptObfuscator({
      // 压缩代码
      compact: true,
      // 关键字转义
      unicodeEscapeSequence: true
    }, []),
  ],

代码压缩 CompressionPlugin

  const productionGzipExtensions = ["js", "css"];  
  plugins: [
    new CompressionPlugin({
      filename: "[path][base].gz", // 有的版本是[path].gz[query] 根据情况而定
      algorithm: "gzip",
      test: /\.(js|css)(\?.*)?$/i,
      // threshold: 10240, 只有大小大于10K的资源会被压缩,默认为0
      minRatio: 1, //默认为0.8,能压缩到小于等于原来的80%才压缩
      deleteOriginalAssets: true, // 删除原文件,如果删除源文件nginx中需要额外配置资源目录
    }),
  ],

代码压缩后Nginx配置

压缩为gz包后,是否删除源js文件,如果设置为true nginx需要额外配置资源文件目录

http {
    ....

	gzip on; # 开启gizp文件支持
    gzip_min_length 1k;
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   D:/workspace/dmp/dmp-service/dolphinscheduler-ui/dist;
            index  index.html index.htm;
            gzip_static on; #查找静态文件,删除源文件后需要添加
        }

    }
}

webpack压缩js 压缩js 到页面,并且可以适当混淆加密以达到保护js代码的作用 立即下载

相关推荐

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7116

Vue 项目开启gzip

2、 对 webpack 配置打包压缩,并在服务端加上支持gizp的配置,当浏览器请求时,服务端直接将资源返回给浏览器。1、在服务端开启压缩,当浏览器发起请求时,服务端对传输资源进行实时压缩,然后返回给浏览器。第二种则是打包后的 dist 文件包体积比较大(因为包含 .gz 文件和源文件)第一种是服务端进行实时压缩,对服务器的性能消耗较大。首先,安装 compression 插件。如下图,看到响应头中出现。

qq_30193097的博客 3377

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 729

vue前端性能优化之分包策略、异步组件、Gzip压缩

项目的性能优化是有完整项目经历的开发者都会遇到得一个问题。这是整个项目开发最后的一步,也是最关键的一步,做一个项目并不是单单完成功能就算结束了,作为开发者,更要站在用户角度去进行项目体验,响应快速的程序交互会直接提升程序的印象分。反之,如果页面间的交互响应缓慢、时常卡顿,无论程序功能再多再强大,让人很难去想去体验第二次。这个时候,性能优化尤为重要。

dai556688的博客 4322

Spring Boot整合AWS S3文件上传实战:从配置到权限管理全流程解析

本文详细解析了Spring Boot整合AWS S3文件上传的全流程,包括基础配置、核心上传功能实现、高级权限控制及安全最佳实践。通过实战案例展示如何高效处理文件上传、大文件分片及权限管理,帮助开发者构建健壮的文件管理系统。特别强调AWS S3的高可用性和安全性,适用于企业级应用开发。

sam99的博客 283

一起玩转GNU Radio:调制解调大合集

本文汇总了GNU Radio中多种常见的调制解调方法及其参考文献链接,便于今后查看,供大家参考!

无线通信实验室 1万+

Vue性能优化--gZip

gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chrome,firefox,IE等都支持该协议。常见的服务器如Apache,Nginx,IIS同样支持gzip。gzip压缩比率在3到10倍左右,可以大大节省服务器的网络带宽。而在实际应用中,并不是对所有文件进行压缩,通常只是压缩静态文件。

Schaffer的博客 2973

[QMT量化交易小白入门]-二、如何用miniQMT获取沪深A股的板块列表、历史行情数据和实时行情数据

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 5659

webpack打包vue项目添加混淆方式,解决缓存问题

webpack打包vue项目添加混淆js

weixin_41127362的博客 4778

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 990

置顶必读(1) |《YOLOv8实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 14万+

VUE3的vue.config.js配置详解 vue.config.js配置详解注释

asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). This can impact web performance.

执着 2万+

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

webpack 个人总结

webpack 的作用 前端项目构建/打包工具,可以解决目前 vue 开发的困境 提供了友好的模块化支持,代码压缩混淆,解决 js 兼容问题,性能优化 等特性 提高了开发效率 和 项目的可维护性 步骤 1. 初始化包管理工具 npm init -y 命令,初始化包管理工具 package.json 2. 默认源代码目录是 src 文件夹,所以先创建一个 src 文件夹(后面可以改) 3. 安装 和 配置 npm install webpack webpack-cli -D 运行指令进行安装 在项目根目

weixin_44535571的博客 2313

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

记录一次vue2打包配置,cdn引入,gzip压缩

【代码】记录一次vue2打包配置,cdn引入,gzip压缩。

weixin_54889564的博客 726

深度学习工具包 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")

【webpack】1、基础使用

在webpack的配置文件中把mode由development该为production,项目在打包时会压缩main.js文件,但同时打包时间会加长。提供了友好的前端模块开发支持,以及代码压缩混淆,处理浏览器端javaScript的兼容性以及性能优化等功能。打包完成后会生成一个dist目录,里面有main.js文件,main.js不会有兼容性问题。src中的index.js文件,由于使用了ES6的语法,浏览器可能不兼容,无法实现效果。当然可以在webpack.config.js中指定打包入口文件和输出文件。

m0_46661713的博客 215

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

webpack 打包vue项目(一)

webpack 打包vue项目 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高

AGCA_ZXL的博客 432

vue2打包配置

vue2打包配置

qq_21295455的博客 836

UniApp项目构建优化:vue.config.js配置与Webpack实战指南

在现代前端工程化体系中,构建工具是连接开发与部署的关键桥梁,其核心作用在于优化代码打包、提升开发效率和保障应用性能。Webpack作为主流构建工具,通过模块化打包机制,将源代码转换为浏览器可识别的静态资源。理解其配置原理,能够帮助开发者实现代码分割、资源压缩、缓存优化等关键技术,从而显著提升应用加载速度与运行效率。在跨端开发框架UniApp中,vue.config.js文件正是Webpack配置的入口,它允许开发者深度定制构建流程,解决多平台兼容性、打包体积过大、热更新缓慢等常见工程问题。通过合理配置pub

weixin_30425949的博客 427

vue-cli 4 的es5兼容问题

第一步 mian.js引入一下两个模块 babel-polyfill 已经废弃,而且babel-polyfill就是由这两个构成的,所以直接引入这个两个即可 import 'core-js'; import 'regenerator-runtime/runtime'; 第二步 修改babel.config.js文件 browsers 根据自己需求更改 module.exports = { presets: [ ['@vue/app', { 'targ

sinat_41292836的博客 2979

【已解决】Vue项目中Vite以及Webpack代码混淆处理

关于代码混淆网上案例铺天盖地,90%以上都是`Webpack`相关来处理代码混淆,对于`Vite`的案例少之又少,在解决vite项目代码混淆我花了一些时间来找合适的插件区处理这个问题,最终选择`rollup-plugin-obfuscator`。另外第四章节介绍了`Webpack` 处理代码混淆方案。

编码世界 6万+

前端安全防线:使用Vue CLI配置代码压缩、加密和混淆功能

在 Vue 应用程序的开发中,代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。 Vue CLI 是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能。本文将介绍如何使用 Vue CLI 配置代码压缩、加密和混淆功能,以提高应用程序的性能和安全性。

小蓝枣的博客 1万+

vue js代码混淆加密、压缩

亲测有效。 1.首先安装 npm i webpack-obfuscator -D 与 npm i compression-webpack-plugin -D 2.打开vue.config.js 文件,如没有在项目根目录新建,粘贴以下内容,已经加上注释 let CompressionPlugin = require("compression-webpack-plugin"); const JavaS...

liu798675179的专栏 1万+

vue webpack压缩代码_webpack不混淆、不压缩指定js文件

在项目中使用了mozilla/pdf.js,在使用中需要设置GlobalWorkerOptions.workerSrc,代码如下import PDFJS from 'pdfjs-dist'import workerSrc from 'pdfjs-dist/build/pdf.worker.js'PDFJS.GlobalWorkerOptions.workerSrc = workerSrc;cons...

weixin_31092009的博客 5915

前端安全防线:使用Vue CLI配置代码压缩、加密和混淆功能_vue代码混淆

!!!!!

Karka_的博客 1693

Vue 应用程序性能优化:代码压缩、加密和混淆配置详解

所以就要使用到混淆器,混淆器是把里面的代码变量等信息进行重命名,这样可读性会变得非常差,接着,到这里,我们完成了对代码的混淆,但是还没有进行加固,防止反编译,所以,请往下看然后导入自己的包就可以了,这里是流水式的走下来,所以只需要导入和导出就可以了,添加单个文件,选择好刚刚混淆后的包,然后你做的事情就是等,等待上传完--加固完--下载完--已完成,当到已完成的时候,说明这里已经可以导出了,导出需要前面提到的自己创建的签名,这里可是会用到的,如果不用,则包安装包可能会出现问题。

m0_74760716的博客 3453
上一篇: 常用正则表达式
下一篇: 分布式程序中YARN中的角色
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值