总结学习的程序结构

系统架构设计师笔记第34期:信息系统架构设计方法 信息系统架构设计是指在构建一个具有高可用性、可扩展性和灵活性的信息系统时所采用的方法和原则。在信息系统架构设计时,需要根据具体的业务需求和系统特点选择合适的架构方法,并考虑系统的可靠性、性能、安全性和可维护性等因素。此外,还需要使用合适的设计工具和技术进行架构建模、评估和优化,确保系统能够满足用户的需求并具备良好的可扩展性和适应性。 阅读详情

利用自己写过的一小段代码总结写,可能文字的表述太少,重在理解程序的结构

1 典型三层

数据表-----------> common类库-------> dataAccess 类库--------> business类库-------->web表示

思想:首先设计好数据表,

然后将表映射成common类(数据缓存在内存中),

其次编写数据访问层dataAccess,访问数据库的参数从common类中取得,而common类中参数的值从 WEB 层中取得

再写business层,该层访问dataAccess层

最后编写web,该层不能直接访问dataAccess层,而是通过business层来实现的

 

分析:

首先设计好数据表

(表名mrBranch:字段BranchID、BranchName、SimpleCode、DelFlag)

然后将表映射成common类库的MrBranchData 类(数据缓存在内)

public class MrBranchData:DataSet//注意该类继承自DataSet类的作用

{

public const string MRBRANCH_TABLE_NAME="mrBranch";//大小写,常量字段全部采用大写

public const string BRANCHID_FIELD="BranchID";

public const string BRANCHNAME_FIELD="BranchName";

public const string SIMPLECODE_FIELD="SimpleCode";

public const string DELFLAG_FIELD="DelFlag";

//默认的构造器

public MrBranchData()

{

BuildDataTables(); //调用方法

}

//生成内存表方法

private void BuildDataTables(){

DataTable table = new DataTable(MRBRANCH_TABLE_NAME);//定义类存中的表 类型

DataColumnCollection columns = table.Columns; //该表的列的集合

columns.Add(BRANCHID_FIELD,typeof(System.Int16));

columns.Add(BRANCHID_FIELD,typeof(System.String));

columns.Add(SIMPLECODE_FIELD,typeof(System.String));

columns.Add(DELFLAG_FIELD,typeof(System.String));

 

this.Tables.Add(table);//添加到DataSet.Tables中

}

其次编写数据访问层dataAccess,访问数据库的参数从common类中取得,而common类中参数的值从WEB层中取得(web传给business,business传给dataAccess)

Using xx.Common; //注意要引用common类库

public class MrBranch

{ private string conStr ;

private SqlConnection con ;

private SqlDataAdapter commandAdp ;

public MrBranch()//构造器

{ conStr = System.Configuration.ConfigurationSettings.AppSettings.Get("ConnectionString");

con = new SqlConnection(conStr);

commandAdp = new SqlDataAdapter();

}

private string paramChg(string str)//写方法下面用到

{

str = "@"+str;

return str;

}

//数据访问层的实现

public bool InsertMrBranch(string branchName,string simpleCode)

{ SqlCommand command = new SqlCommand();

command.CommandText = "InsertMrBranch";

command.Connection = con;

command.CommandType = CommandType.StoredProcedure; //proc

//proc的参数从common类MrBranchData中的BRANCHNAME_FIELD字段获得

command.Parameters.Add(paramChg(MrBranchData.BRANCHNAME_FIELD),SqlDbType.VarChar);

command.Parameters.Add(paramChg(MrBranchData.SIMPLECODE_FIELD),SqlDbType.VarChar);

//而类MrBranchData中的BRANCHNAME_FIELD字段的值从本方法的参数branchName获得,实际上本方法的参数是WEB层传过来的(WEB层的值传给business,business再调用本方法并且传参数给本方法)

command.Parameters[paramChg(MrBranchData.BRANCHNAME_FIELD)].Value = branchName;

command.Parameters[paramChg(MrBranchData.SIMPLECODE_FIELD)].Value = simpleCode;

 

con.Open();

int result = command.ExecuteNonQuery();

if(result>0)

{ return true;

}

else

{ return false;

}

}

再写business层,该层访问dataAccess层(实际上本人编写时,一般是先写web再写business去访问dataAccess)

using xx.Common;

using xx.DataAccess;//注意引用类库

public class Branch

{

public bool InsertBranch(string txtName ,string txtSimCode)//web层的值传给该方法

{

bool result;

MrBranch DataAccess = new MrBranch();//实例化数据访问层的类

result = DataAccess.InsertMrBranch(txtName,txtSimCode);//传参,调用该类的方法

return result;

}

}

最后编写web,该层不能直接访问dataAccess层,而是通过business层来实现

using xx.Common;

using xx.dataAccess;

using xx.Business;

 

private void cmdAdd_Click(object sender, System.EventArgs e)//web层控件事件

{

//实例化businees层的Branch类,并且调用该类的InsertBrach方法,且传web层的值做参数

bool result = (new Branch()).InsertBranch(txtName.Text,txtSimCode.Text);

dgdBranch.DataBind();

}

未完。。。。。。

 
CommonDataAccess 一个通用的数据访问类,用vb.net实现,利用工厂模型,通过DbProviderFactory创建。 立即下载

相关推荐

SoC验证新思路:除了UVM仿真,你还可以试试Cadence JasperGold的形式化验证

本文深入探讨了Cadence JasperGold形式化验证在SoC设计中的创新应用,对比传统UVM仿真验证,详细解析了其数学穷尽性验证优势。通过实战案例展示了JasperGold在总线协议、时钟域交叉等关键场景的验证方法,并提供了混合验证流程设计与效能优化方案,帮助工程师提升验证效率30%以上。

weixin_30566063的博客 120

学到的程序结构

1 典型三层 数据表-----------> common类库-------> dataAccess 类库--------> business类库-------->web表示 思想:首先设计好数据表, 然后将表映射成common类(数据缓存在内存中), 其次编写数据访问层dataAccess,访...

weixin_30371875的博客 144

H3C无线控制器AC与第三方认证系统集成实现企业级Portal短信认证方案

本文详细阐述了如何将H3C无线控制器(AC)与第三方认证系统集成,构建企业级Portal短信认证方案。该方案通过手机号作为临时凭证,实现了访客网络的实名追溯、权限控制与专业体验。文章深入解析了方案原理、H3C AC的关键配置步骤、第三方系统对接要点及短信网关选型避坑指南,为企业提升网络安全管理与访客服务质量提供了完整、可行的实战指导。

a3b4c5的博客 194

在上位机框架(通常指PC端控制软件或上位机软件)中,Business层(业务逻辑层)是整个系统架构中的核心部分,负责处理具体的业务逻辑,连接表示层和数据访问层

在上位机框架(通常指PC端控制软件或上位机软件)中,Business层(业务逻辑层)是整个系统架构中的核心部分,负责处理具体的业务逻辑,连接表示层(UI)和数据访问层(Data Access Layer)。以下是详细说明,以及推荐的资料和设计建议。在三层架构(Presentation、Business、Data)或领域驱动设计(DDD)中,Business 层(业务逻辑层,BLL)负责处理应用程序的核心逻辑,协调 Presentation 层(UI 或 API)与 Data 层(数据访问)之间的交互。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1341

手把手教你用STM32F103C8T6单片机,做一个即插即用的USB游戏手柄(附完整代码)

本文详细介绍了如何使用STM32F103C8T6单片机制作即插即用的USB游戏手柄,涵盖硬件搭建、HID协议解析及完整代码实现。通过深入讲解USB HID协议的七大关键描述符,帮助开发者快速掌握嵌入式USB设备开发技巧,打造个性化游戏控制器。

weixin_30887919的博客 439

Godot 4.x 实现 JRPG 回合制战斗系统:架构、状态机与实战优化

游戏开发中,状态机是管理复杂逻辑流转的核心设计模式,尤其在回合制战斗这类事件驱动的场景中。其原理是通过定义有限的状态和明确的转移条件,来控制系统在不同阶段的行为,从而实现清晰、可维护的流程控制。这项技术的价值在于能够将杂乱的条件判断代码结构化,降低模块间的耦合度,提升代码的可读性和可扩展性。在游戏开发领域,状态机广泛应用于角色AI、UI流程、战斗系统等场景。本文以Godot引擎为例,深入探讨如何运用节点与信号驱动架构,构建一个健壮的JRPG(日式角色扮演游戏)回合制战斗系统。内容涵盖从核心的**状态机**设

weixin_33749242的博客 499

oledb的类库Common和DataAccess

 Common的Class1.cs using System;using System.Collections.Generic;using System.Text;namespace Common{    public class Class1    {        public const string ConnectString = "Provider=Microsoft.Jet

成成的专栏 1082

【Agora 本地录制最全总结- 基于Java SDK】

Agora 本地服务端录制

lizhengze1117的博客 1790

C#学习1_认识项目/程序结构

C#学习1_认识项目/程序结构

qq_57250692的博客 1002

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2621

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

Jet4505的博客 1007

c语言的四种程序结构,如何学习C语言的四种程序结构.doc

如何学习C语言的四种程序结构如何学习C语言的四种程序结构???? 1)顺序结构 ??? 这种结构的程序比较简单,就是按照语句的排列顺序依次执行的机制。顺序结构的执行顺序是自上而下,依次执行,因此编写程序也必须遵守这一规定,否则你的程序执行结果就不对。 ??? 例如;a = 3,b = 5,现交换a,b的值,正确的程序为: ??? c = a; a = b; b = c; ??? 执行结果是a = ...

weixin_26821003的博客 184

Android车载音频系统概览

官网有些部分的内容描述比较简单,对没有app、系统和底层开发经验,容易一眼扫过,没有留意到相关细节。 本节补充车载音频相关细节。

hwj的博客 785

python学习笔记-程序结构

程序结构 顺序 分支 循环 分支 分支的基本语法 if 条件表达式: 语句1 语句2 语句3 … 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句,如果属于if语句块,则必须同一个锁紧等级 条件表达式结果为True执行if后面的缩进的语句块 age = 18 if age <20: print(age) else: prin...

qq_43227756的博客 131

android 蓝牙通讯demo

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java程序结构的学习

Java程序由类组成,每个Java文件必须有一个与文件名同名的类。:包是组织类和接口的容器,类似文件夹,防止命名冲突。:固定写法,程序从这里开始执行。:类中的函数,用于执行特定任务。修饰,可直接通过类名调用。:分为基本类型和引用类型。:需要先创建对象再调用。

2401_88206309的博客 425

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

程序结构学习笔记

程序结构 一、全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它们 //全局变量 #include <stdio.h> int f(void); int gAll = 12; int main(int argc, char const *argv[]){ printf( "in %s gAll=%d\n", __func__, gAll); f(); printf ( "agn in

jihuaTEL的博客 201

Golang学习之程序结构

注:这是《GO语言圣经》的内容,看的时候顺便整理下来以备需要时能够及时找到。 程序结构 声明 声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。 例如,下面的例子中声明了一个常量、一个函数和两个变量: package main import &amp;quot;fmt&amp;quot; const boil...

huang_yong_peng的博客 351

C#学习——02 基础程序结构

C#文件后缀为。C#注释同C,为或。C#大小写敏感。标识符:1. 必须以字母、下划线或@开头,后面可以跟一系列的字母、数字(0 - 9)、下划线( _ )、@。2. 标识符不能是C#关键字。除非它们有一个@前缀。3. 不能与C#的类库名称相同。

weixin_48488858的博客 529

【Python学习】04——程序结构

​​。

qq_62906846的博客 399

Python学习_02_程序结构

Python学习_02_程序结构Python学习_02_程序结构1. 位运算详解(补上节)2. 条件语句3. 循环语句 Python学习_02_程序结构 1. 位运算详解(补上节) 二进制表示形式 原码:就是其二进制表示(最高位是符号位,0表示正数,1表示负数)。 反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。 补码:正数的补码就是原码,负数的补码是反码+1; 计算机内部使用补码来表示,整数在内存中是以补码的形式存在的,输出也是按照补码输出。但是bin()比较特殊,

a18833260807的博客 193

C# 学习之程序结构

C# 程序结构 在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构,以便作为接下来章节的参考。 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declaration) 一个 class Class 方法 Class 属性 一个 Main 方法 语句(Statements)& 表达式(Expressions) 注释 实...

zhenzongpian1519的博客 252

C#学习笔记二:C#程序结构

从最简单的HelloWorld开始入手,这是一个最低限度的C#程序结构。 C# Hello World 示例 一个C#程序主要由以下几部分组成: 命名空间声明 一个类 类方法 类属性 一个Main方法 语句和表达式 注释 先看看下面的示例,将打印字的简单的代码 "Hello World": using Sys...

weixin_34210740的博客 113

C语言 程序结构 学习

C 程序结构 原文链接 c程序由头文件和函数组成。 C语言程序执行过程中最基本的三种结构: 顺序结构:从上到下、从左到右、从小到大,一条条执行直到结束指令结束程序 分支结构:需要了解if、else、elseif、switch case的用法 循环结构:for循环、while循环、do…while循环 C 程序主要包括以下部分: 预处理器指令、函数、变量、 语句 & 表达式 、 注释 用C语言在线运行工具运行代码 我们来看一段简单的代码,可以输出单词 “Hello World”: #i

zzyushi的博客 296

【Ptyhon学习】程序结构

编写程序,首先得有骨架,而程序结构就是这个骨架,很多的小骨架,共同支撑起了整个程序,本篇笔记记录程序结构。

qq_62906846的博客 391

Python 学习笔记03 - 程序结构

文章目录程序结构分支结构双向分支多路分支if语句补充循环语句for 循环for-else 语句while循环break、continue、passrange 函数 程序结构 程序三种结构 顺序 循环 分支 分支结构 分支结构基本语法 if 条件表达式: 语句1 语句2 语句3 …… 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句,如果属于if语句块,则必须同一个缩进等级 条件表达式结果为True执行if后面的缩进的语句块 # i

这天有点热的博客 239
上一篇: GB/T 10361-1989 如何取去掉中间的"/T",即得到 GB 10361-1989
下一篇: 返回存儲過程的多個輸出字段
mabuchi
博客等级 码龄22年 18粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值