模拟用户登录 LoginUser.java

当RuoYi遇上小程序:改造LoginUser实现双账号体系实战 本文详细介绍了如何在RuoYi框架中改造LoginUser类,实现传统账号与微信小程序登录的双账号体系。通过扩展LoginUser类并采用壳模式设计,开发者可以优雅地兼容微信OAuth2.0授权流程,同时保持原有Security架构不变。文章包含完整的代码示例和实战建议,帮助开发者快速实现混合认证系统。 阅读详情

package com.tedu;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

import com.tedu.utill.jdbcUtil;

/**

  • 模拟用户登录

*/

public class LoginUser {
public static void main(String[] args) {
System.out.println(“请登录…”);
System.out.println(“请输入用户名:”);
Scanner sc = new Scanner(System.in);
String username = sc.nextLine();
System.out.println(“请输入密码:”);
String password = sc.nextLine();
Login(username, password);
}

/**
 * 根据用户名密码查询用户信息
 *
 */
public static void Login(String username, String password) {
	Connection conn = null;
	Statement stat = null;
	ResultSet rs = null;

	try {
		conn = jdbcUtil.getconn();
		stat = conn.createStatement();
		String sql = "select * from user where username='"
				+ "" + username + "'and password='" + password + "'";
		rs = stat.executeQuery(sql);
		if (rs.next()) {
			System.out.println("恭喜您登录成功!");
		} else {
			System.out.println("账号或密码错误!");
		}

	} catch (Exception e) {
		// TODO: handle exception
	} finally {
		jdbcUtil.close(conn, stat, rs);
	}

}

}

Spring Security实战:如何在若依框架中实现前台会员与后台管理员双登录系统(附完整代码) 本文详细介绍了如何在若依框架中基于Spring Security实现前台会员与后台管理员双登录系统。通过配置多个AuthenticationManager和独立的UserDetailsService,为两种用户体系提供分离的认证流程与权限控制,并提供了完整的代码实现方案,解决多用户体系集成中的安全与架构挑战。 阅读详情

相关推荐

Java Web网上购物系统实战:Spring Boot+MyBatis-Plus课程设计指南

在Java Web开发领域,掌握主流框架技术栈是构建企业级应用的基础。其核心原理在于通过分层架构(如MVC)实现关注点分离,提升代码的可维护性和扩展性。Spring Boot作为当前Java生态的绝对主流,通过自动配置和起步依赖极大简化了项目搭建和部署流程,其技术价值在于让开发者能快速聚焦业务逻辑而非环境配置。结合MyBatis-Plus这类增强工具,可以高效完成数据持久层操作,这对于电商、管理等需要大量CRUD操作的应用场景至关重要。本文以“网上购物系统”这一经典课程设计项目为具体载体,深入解析如何运用S

weixin_33676492的博客 457

使用自定义注解LoginUser获取登录用户仅需三步

一、添加一个注解 /** * 登录用户信息 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface LoginUser { } 二、创建一个loginUser注解的解析器 /** * 有@LoginUser注解的方法参数,注入当前登录用户 */ @Compo...

sumengnan的博客 7615

Spring Boot热部署踩坑记:为什么SecurityUtils.getUser()突然获取不到登录用户了?

本文深入分析了Spring Boot热部署中SecurityUtils.getUser()突然失效的问题,揭示了热部署导致安全上下文丢失的机制。通过依赖矩阵分析、断点诊断技巧和工程化解决方案,提供了禁用devtools、自定义安全上下文持久化等实用方法,帮助开发者有效应对OAuth2认证场景下的用户信息丢失问题。

weixin_42552716的博客 165

java模拟用户登录

模拟用户登录

m0_63112274的博客 1392

基于Java+Spring Boot的在线考试系统设计与实现详解(含源码部署)

在Java Web开发中,数据库设计和权限控制是构建任何业务系统的核心基础。理解如何通过Spring Boot整合MyBatis与MySQL,实现用户认证、事务管理和数据持久化,是提升工程能力的关键。在线考试系统作为经典的实战项目,完整覆盖了从题库管理、随机组卷、限时答题到自动判分的业务闭环。本文从通用技术原理出发,深入解析了数据库表结构设计、登录拦截器、多种组卷策略以及后端时间控制等核心模块的实现思路,并提供了项目部署与常见问题排查的实操指南。无论你是准备毕业设计,还是希望巩固Java后端开发技能,都能借

cuiji1279的博客 420

java httpclient 模拟登录

模拟登录 不提供用户名密码

Java模拟用户登录

要求: (1) 用户名和密码正确,提示登录成功。 (2) 用户名或密码不正确,提示“用户名或密码错误”。 (3) 总共有 3 次登录机会,在 3 次内(不包含第一次)输入正确的用户名和密码回到(1)。如若,超过 3 次输入的用户名或密码有误,则提示登录失败无法再继续登录。。。 在登录时,需要比较用户输入的用户名密码与已知的用户名密码是否相同,本案例可以使用 Scanner 类以及 String 类的相关方法实现比较操作。...............

qq_59506101的博客 3697

别让运放自激振荡!手把手教你用波特图分析反相放大电路的稳定性(附LTspice仿真)

本文详细解析了运算放大器在反相放大电路中的稳定性问题,通过波特图分析和LTspice仿真,揭示了自激振荡的成因及解决方案。文章从故障现象识别到数学工具应用,再到实战仿真和工程优化,提供了一套完整的稳定性分析工具链,帮助工程师有效避免运放自激振荡问题。

weixin_31682031的博客 302

java实现模拟用户登录功能

java实现模拟用户登录 功能描述 运用String类与Scanner类实现模拟用户登录基础功能,简单的登录验证模拟程序。 本案例要求编写一个程序,模拟用户登录,程序要求如下。 (1)用户名和密码正确,提示登录成功。 (2)用户名或密码不正确,提示“用户名或密码错误”。 (3)总共有3次登录机会,在3次内(包含3次)输入正确的用户名和密码后给出登录成功的相应提示。 超过3次用户名或密码输人误,则提示登录失败,无法继续登录。 在登录时,需要比较用户输入的用户名、密码与已知的用户名、密码是否相同,本案例可以使用

国际巨星的博客 1万+

ASP.NET Core Identity + Mysql(实战一)——注册登陆

在进行实战之前,我们先来了解一下Identity。 ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格、登录和用户数据存储。简单的来讲包括: 1.用户数据存储(使用任意你喜欢的关系型数据库,从sqllite到mysql、sqlserver等等,由Entity Framwork 支持) 2.登陆、注册外加身份认证(基于coo...

weixin_40359716的博客 1398

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

JAVA【案例5-3】模拟用户登录

【模拟用户登录】

m0_68442003的博客 1294

15、分布式参数热交换器:建模、动态特性与控制

本文综述了分布式参数热交换器的建模、动态特性和控制方法。从热交换器的基本方程推导出发,探讨了一维流动、流动强迫、错流、螺旋和旋转再生式热交换器的建模方法,并分析了其动态行为和频率响应中的共振现象。同时,介绍了热交换器的模拟方法,包括数值模拟和近似方法,并讨论了多种控制策略,如常规控制、最优控制、数字控制以及自适应控制。最后,总结了热交换器研究的发展历程,并展望了未来的研究方向,包括建模精度提升、控制算法优化和跨学科融合等。

w8x9y0z1的博客 123

自定义异常

题目:创建User类,定义userLogin()方法,模拟用户登录时,登录密码的长度6-10位,如果不满足则抛出自定义异常BaseException类,向用户显示”密码的长度应该在6-10之间” 1.创建异常类BaseException public class BaseException extends Exception{ public BaseException(){} public BaseException(String msg){ super(msg); } } 2.创建User类

qq_45429856的博客 304

【AI智能体】Langchain 主流大模型调用与对话API使用详解

【AI大模型】Langchain 模型调用与对话API使用详解

congge_study的博客 405

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

若依框架下构建独立移动端用户认证体系:Spring Security与JWT深度实践

在微服务与分布式架构成为主流的今天,用户认证与授权是保障系统安全的核心基石。其基本原理是通过一套可靠的机制验证用户身份并授予相应资源访问权限。JWT(JSON Web Token)作为一种流行的无状态令牌技术,因其自包含、易传输和适合分布式场景的特点,在工程实践中被广泛采用。结合Spring Security这一强大的安全框架,开发者可以高效构建灵活、安全的认证授权体系。这一技术组合的价值在于能够为多端应用(如Web后台、小程序、APP)提供统一且隔离的安全解决方案,尤其适用于需要将后台管理系统与面向C端移

weixin_34242819的博客 406

Amesim应用篇-电芯等效电路模型标定

为了使计算模型更加准确,在有电芯实验测试数据的情况下,依据现有的实验数据对Amesim中的电池等效电路模型进行标定。标定的目的是为了获得更加符合项目实际情况的电芯等效电路模型,标定完的电芯可以用于搭建PACK模型,也可以用于其他虚拟实验。本文以充电标定为例,进行介绍。放电标定与充电一致。

2201_75375391的博客 1213

SpringBoot校园二手交易平台:Java全栈课设实战指南

在Java Web开发领域,SpringBoot作为构建企业级应用的主流框架,以其简化配置和快速开发的特性,极大地提升了后端服务的开发效率。其核心原理在于通过自动配置和起步依赖,将开发者从繁琐的XML配置中解放出来,实现了约定大于配置的开发范式。这一技术价值在于能够帮助开发者,尤其是学生和初学者,快速搭建起结构清晰、易于维护的Web应用原型。结合MyBatis-Plus进行高效数据操作,以及Thymeleaf实现服务端渲染,构成了一个典型且实用的MVC技术栈。这种技术组合非常适合应用于电商、管理等具有清晰业

weixin_30268071的博客 393

C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

1 、题目 计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5)) 2、部分函数说明 C 库函数 double pow(double x, double y) 返回 x 的 y 次幂。 3、源代码实现 #include <stdio.h> #include <...

码莎拉蒂 4609

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2.15 Mybatis——权限管理模拟登陆练习(中)

方式二: 此处采用一对多的方式二,通过一条sql语句查出用户对应的角色和菜单信息。 代码实现: UserDao层方法: //方式二:一句sql——传入两个参数——通过用户名、密码登录 User login01(@Param("uname") String uname,@Param("pwd") String pwd); UserMapper.xml:通过两层collection集合映射实现。 <mapper namespace="com.zx.dao.UserDao">

wqh101121的博客 213

老版QQ原生表情gif动态

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

【Java8新特性】Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序

一、序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常。Java8新特性之Optional为此类问题提供了优雅的解决方式。 广大程序员朋友对空值异常刻骨铭心,因此Optional一经推出,广受赞誉。 二、问题复原 (一)素材准备 public class LoginUser implements UserDetails { private Long deptId; private String token; private Lon

Java知识图谱的博客 431

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java EE】Spring MVC 综合案例与架构设计

摘要:本文介绍了三个基于Spring MVC的综合案例:1)加法计算器,实现两数相加并返回HTML格式结果;2)用户登录系统,包含登录验证和获取当前用户功能,使用Session存储登录状态;3)留言板系统,采用Lombok简化代码,实现留言发布和获取功能。案例涉及前端页面、后端控制器、AJAX交互及Lombok工具的使用,展示了Spring MVC的基础开发流程和常见功能实现方式。

记录了从0学习Java技术栈的日常 334

AI协作构建Spring Boot用户管理系统:从零到可部署的工程实践

人工智能辅助编程正从简单的代码片段生成向系统化工程实践演进。其核心原理是通过自然语言指令解析和代码模式识别,将复杂需求转化为可执行代码。在技术价值层面,AI协作能显著提升开发效率,降低重复性工作负担,特别适合快速原型构建和标准化模块开发。应用场景涵盖微服务架构设计、数据库操作层实现、安全认证模块开发等常见工程任务。以Spring Boot用户管理系统为例,通过分层验证和迭代优化策略,AI能够生成包含JWT认证、权限控制、异常处理等完整功能的可部署代码,实现从实体模型到API控制器的全链路开发。这种工程化AI

weixin_30271335的博客 332

黑马SpringBoot3+Vue3(实战篇)学习记录三:SpringBoot注册参数校验框架Validation、登入、JWT、拦截器、拦截器配置、Spring参数绑定

Spring Boot 通过 `@Validated` + `@Pattern` 校验参数,校验失败由 `@RestControllerAdvice` 全局捕获并返回统一 `Result`;登录成功后生成 JWT 令牌,拦截器在 `preHandle()` 中验证令牌,验证失败返回 401,通过 `WebConfig` 配置拦截路径并排除登录/注册接口;底层利用反射获取参数名,`ArgumentResolver` 从 `HttpServletRequest` 取值并完成校验。🎯

weixin_47708672的博客 435

Java SSM框架实战:校园车辆管理系统毕业设计全流程指南

在Java企业级Web开发中,SSM(Spring + Spring MVC + MyBatis)框架整合是构建分层架构应用的核心技术。其原理是通过Spring的IoC容器管理Bean,Spring MVC处理Web请求与响应,MyBatis作为持久层框架简化数据库操作,三者协同实现了高内聚、低耦合的MVC设计模式。这一技术组合的价值在于能高效、规范地开发数据驱动的管理系统,广泛应用于各类后台管理、信息处理等应用场景。本文以“校园车辆管理系统”这一典型毕业设计选题为例,深入剖析如何从零开始,基于SSM框架整

weixin_34279246的博客 518
上一篇: jdbcUtill
下一篇: SQL注入
倾听心跳的频率灬
博客等级 码龄8年 13粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值