【sendredirect 源码】【蓝领相关软件源码】【网站的程序源码】Createdataset源码

时间:2024-12-28 19:32:38 来源:网站访客源码 分类:娱乐

1.求决策树源代码。最好使用matlab实现。
2.3. torch.utils里需要掌握的函数
3.详解数据读取--Dataset, Samper, Dataloader
4.PyTorch - DataLoader 源码解析(一)
5.Pytorch_循环神经网络RNN
6.100分求一个用VB.net做的简单网页的代码,谢谢!!!sendredirect 源码

Createdataset源码

求决策树源代码。最好使用matlab实现。

       function [Tree RulesMatrix]=DecisionTree(DataSet,AttributName)

       %输入为训练集,为离散后的数字,如记录1:1 1 3 2 1;

       %前面为属性列,最后一列为类标

       if nargin<1

        error('请输入数据集');

       else

        if isstr(DataSet)

        [DataSet AttributValue]=readdata2(DataSet);

        else

        AttributValue=[];

        end

       end

       if nargin<2

        AttributName=[];

       end

        Attributs=[1:size(DataSet,2)-1];

        Tree=CreatTree(DataSet,Attributs);

        disp([char() 'The Decision Tree:']);

        showTree(Tree,0,0,1,AttributValue,AttributName);

        Rules=getRule(Tree);

        RulesMatrix=zeros(size(Rules,1),size(DataSet,2));

        for i=1:size(Rules,1)

        rule=cell2struct(Rules(i,1),{ 'str'});

        rule=str2num([rule.str([1:(find(rule.str=='C')-1)]) rule.str((find(rule.str=='C')+1):length(rule.str))]);

        for j=1:(length(rule)-1)/2

        RulesMatrix(i,rule((j-1)*2+1))=rule(j*2);

        end

        RulesMatrix(i,size(DataSet,2))=rule(length(rule));

        end

       end

       function Tree=CreatTree(DataSet,Attributs) %决策树程序 输入为:数据集,属性名列表

        %disp(Attributs);

        [S ValRecords]=ComputEntropy(DataSet,0);

        if(S==0) %当样例全为一类时退出,返回叶子节点类标

        for i=1:length(ValRecords)

        if(length(ValRecords(i).matrix)==size(DataSet,1))

        break;

        end

        end

        Tree.Attribut=i;

        Tree.Child=[];

        return;

        end

        if(length(Attributs)==0) %当条件属性个数为0时返回占多数的类标

        mostlabelnum=0;

        mostlabel=0;

        for i=1:length(ValRecords)

        if(length(ValRecords(i).matrix)>mostlabelnum)

        mostlabelnum=length(ValRecords(i).matrix);

        mostlabel=i;

        end

        end

        Tree.Attribut=mostlabel;

        Tree.Child=[];

        return;

        end

        for i=1:length(Attributs)

        [Sa(i) ValRecord]=ComputEntropy(DataSet,i);

        Gains(i)=S-Sa(i);

        AtrributMatric(i).val=ValRecord;

        end

        [maxval maxindex]=max(Gains);

        Tree.Attribut=Attributs(maxindex);

        Attributs2=[Attributs(1:maxindex-1) Attributs(maxindex+1:length(Attributs))];

        for j=1:length(AtrributMatric(maxindex).val)

        DataSet2=[DataSet(AtrributMatric(maxindex).val(j).matrix',1:maxindex-1) DataSet(AtrributMatric(maxindex).val(j).matrix',maxindex+1:size(DataSet,2))];

        if(size(DataSet2,1)==0)

        mostlabelnum=0;

        mostlabel=0;

        for i=1:length(ValRecords)

        if(length(ValRecords(i).matrix)>mostlabelnum)

        mostlabelnum=length(ValRecords(i).matrix);

        mostlabel=i;

        end

        end

        Tree.Child(j).root.Attribut=mostlabel;

        Tree.Child(j).root.Child=[];

        else

        Tree.Child(j).root=CreatTree(DataSet2,Attributs2);

        end

        end

       end

       function [Entropy RecordVal]=ComputEntropy(DataSet,attribut) %计算信息熵

        if(attribut==0)

        clnum=0;

        for i=1:size(DataSet,1)

        if(DataSet(i,size(DataSet,2))>clnum) %防止下标越界

        classnum(DataSet(i,size(DataSet,2)))=0;

        clnum=DataSet(i,size(DataSet,2));

        RecordVal(DataSet(i,size(DataSet,2))).matrix=[];

        end

        classnum(DataSet(i,size(DataSet,2)))=classnum(DataSet(i,size(DataSet,2)))+1;

        RecordVal(DataSet(i,size(DataSet,2))).matrix=[RecordVal(DataSet(i,size(DataSet,2))).matrix i];

        end

        Entropy=0;

        for j=1:length(classnum)

        P=classnum(j)/size(DataSet,1);

        if(P~=0)

        Entropy=Entropy+(-P)*log2(P);

        end

        end

        else

        valnum=0;

        for i=1:size(DataSet,1)

        if(DataSet(i,attribut)>valnum) %防止参数下标越界

        clnum(DataSet(i,attribut))=0;

        valnum=DataSet(i,attribut);

        Valueexamnum(DataSet(i,attribut))=0;

        RecordVal(DataSet(i,attribut)).matrix=[]; %将编号保留下来,以方便后面按值分割数据集

        end

        if(DataSet(i,size(DataSet,2))>clnum(DataSet(i,attribut))) %防止下标越界

        Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))=0;

        clnum(DataSet(i,attribut))=DataSet(i,size(DataSet,2));

        end

        Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))= Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))+1;

        Valueexamnum(DataSet(i,attribut))= Valueexamnum(DataSet(i,attribut))+1;

        RecordVal(DataSet(i,attribut)).matrix=[RecordVal(DataSet(i,attribut)).matrix i];

        end

        Entropy=0;

        for j=1:valnum

        Entropys=0;

        for k=1:length(Value(j).classnum)

        P=Value(j).classnum(k)/Valueexamnum(j);

        if(P~=0)

        Entropys=Entropys+(-P)*log2(P);

        end

        end

        Entropy=Entropy+(Valueexamnum(j)/size(DataSet,1))*Entropys;

        end

        end

       end

       function showTree(Tree,level,value,branch,AttributValue,AttributName)

        blank=[];

        for i=1:level-1

        if(branch(i)==1)

        blank=[blank ' |'];

        else

        blank=[blank ' '];

        end

        end

        blank=[blank ' '];

        if(level==0)

        blank=[' (The Root):'];

        else

        if isempty(AttributValue)

        blank=[blank '|_____' int2str(value) '______'];

        else

        blank=[blank '|_____' value '______'];

        end

        end

        if(length(Tree.Child)~=0) %非叶子节点

        if isempty(AttributName)

        disp([blank 'Attribut ' int2str(Tree.Attribut)]);

        else

        disp([blank 'Attribut ' AttributName{ Tree.Attribut}]);

        end

        if isempty(AttributValue)

        for j=1:length(Tree.Child)-1

        showTree(Tree.Child(j).root,level+1,j,[branch 1],AttributValue,AttributName);

        end

        showTree(Tree.Child(length(Tree.Child)).root,level+1,length(Tree.Child),[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);

        else

        for j=1:length(Tree.Child)-1

        showTree(Tree.Child(j).root,level+1,AttributValue{ Tree.Attribut}{ j},[branch 1],AttributValue,AttributName);

        end

        showTree(Tree.Child(length(Tree.Child)).root,level+1,AttributValue{ Tree.Attribut}{ length(Tree.Child)},[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);

        end

        else

        if isempty(AttributValue)

        disp([blank 'leaf ' int2str(Tree.Attribut)]);

        else

        disp([blank 'leaf ' AttributValue{ length(AttributValue)}{ Tree.Attribut}]);

        end

        end

       end

       function Rules=getRule(Tree)

        if(length(Tree.Child)~=0)

        Rules={ };

        for i=1:length(Tree.Child)

        content=getRule(Tree.Child(i).root);

        %disp(content);

        %disp([num2str(Tree.Attribut) ',' num2str(i) ',']);

        for j=1:size(content,1)

        rule=cell2struct(content(j,1),{ 'str'});

        content(j,1)={ [num2str(Tree.Attribut) ',' num2str(i) ',' rule.str]};

        end

        Rules=[Rules;content];

        end

        else

        Rules={ ['C' num2str(Tree.Attribut)]};

        end

       end

3. torch.utils里需要掌握的函数

       在深度学习框架PyTorch中,torch.utils模块提供了许多实用工具,帮助我们有效地处理和加载数据。其中几个关键组件包括:

       1. DataLoader:这是数据加载的核心工具,它封装了Dataset类,使得我们可以并行加载和处理数据,提高训练效率。使用DataLoader时,要特别注意add方法的运用。

       2. Dataset:有Map-style的TensorDataset,它允许我们将数据和标签打包成Tensor,便于在索引过程中同时获取数据和对应的标签。源代码如下:

       python

        dataset = TensorDataset(data, labels)

       3. IterableDataset:例如IterableDataset,其加载数据的方式更像迭代器,适用于需要逐批处理的蓝领相关软件源码数据源。同样,add方法在使用时也需要注意:

       python

        iterable_dataset = IterableDataset()

        iterable_dataset.add(...)

       4. ConcatDataset和ChainDataset:前者用于连接多个Dataset,后者则适用于连接多个IterableDataset,方便处理多源数据集。

       5. Subset:用于从一个Dataset中提取指定索引序列的子集,这对于数据增强或者验证集划分非常有用。

       通过熟练掌握这些torch.utils中的函数,我们可以更有效地组织和处理数据,提高模型训练的灵活性和性能。

详解数据读取--Dataset, Samper, Dataloader

       在使用Pytorch进行模型训练时,数据读取过程常涉及到Dataset、Dataloader以及Sampler三个核心组件。通常情况下,我们自定义一个继承自Dataset的类来创建数据集,并作为Dataloader的初始化参数。Dataloader则根据初始化参数如batch_size和shuffle等完成数据加载。本文将深入解析这三个组件如何协同作用,完成数据读取任务。

       在构建Dataloader时,两个关键参数sampler和batch_sampler及collate_fn通常被指定。sampler需要继承自torch.utils.data.Sampler类,而collate_fn通常是一个函数。未指定时它们具有默认值。数据读取流程是由Dataset、Dataloader和Sampler共同完成的。本文章将通过源码解析它们如何协同工作。

       在理解Dataset、Dataloader和Sampler的网站的程序源码联动之前,我们先对迭代器和生成器的概念进行梳理。迭代器iterator和可迭代对象iterable是Python中用于数据遍历的基础概念。一个iterable对象能够通过`iter()`函数获取其对应的iterator对象,而iterator对象在遍历时通过`next()`函数获取iterable中的下一个元素。实际上,for循环的`in`操作符在背后依赖于iterable和iterator的相互作用。

       生成器generator是一种特殊的迭代器,具有`yield`关键字,可以实现函数的暂停与恢复,非常适合用于生成序列数据。其操作方式类似于函数调用,但能暂停执行并在需要时恢复,生成序列数据。

       在数据读取流程中,Dataloader创建的迭代器最终指向Dataset。具体实现中,Dataloader首先初始化一个iterator对象,通常基于自定义的Sampler。当使用for循环遍历Dataloader时,实际上在遍历这个迭代器。Sampler负责确定数据读取顺序,而Dataset提供实际的数据点。Dataloader内部实现了一个`_next_data()`函数,负责从Dataset中提取并打包成批次数据,再通过`collate_fn`处理,最终生成训练批次。

       在Dataloader中,`_next_index()`函数用于获取下一个批次的手机闹钟软件源码索引。这些索引由Sampler生成,通常基于随机或顺序策略。获取索引后,Dataloader使用`_dataset_fetcher.fetch(index)`从Dataset中读取数据点。Dataset可能根据其类型(如`IterableDataset`或继承自`Dataset`的自定义类)实现具体的读取逻辑,通常通过`__getitem__`方法获取指定索引的数据。

       最后,数据点通过`collate_fn`进行打包,确保批次中的数据结构一致,适应模型训练的需求。整个过程展示了Dataset、Dataloader和Sampler如何协同工作,从数据集读取数据点,确定读取顺序,到最终生成可用于模型训练的批次数据。

       综上所述,理解Dataset、Dataloader和Sampler的协同作用是构建高效数据加载系统的关键。通过精心设计这些组件,可以显著提高数据处理效率,优化模型训练过程。

PyTorch - DataLoader 源码解析(一)

       本文为作者基于个人经验进行的初步解析,由于能力有限,可能存在遗漏或错误,敬请各位批评指正。

       本文并未全面解析 DataLoader 的全部源码,仅对 DataLoader 与 Sampler 之间的联系进行了分析。以下内容均基于单线程迭代器代码展开,源码分析与计算多线程情况将在后续文章中阐述。

       以一个简单的数据集遍历代码为例,在循环中,数据是如何从 loader 中被取出的?通过断点调试,我们发现循环时,代码进入了 torch.utils.data.DataLoader 类的 __iter__() 方法,具体内容如下:

       可以看到,该函数返回了一个迭代器,主要由 self._get_iterator() 和 self._iterator._reset(self) 提供。接下来,我们进入 self._get_iterator() 方法查看迭代器的产生过程。

       在此方法中,根据 self.num_workers 的数量返回了不同的迭代器,主要区别在于多线程处理方式不同,但这两种迭代器都是继承自 _BaseDataLoaderIter 类。这里我们先看单线程下的例子,进入 _SingleProcessDataLoaderIter(self)。

       构造函数并不复杂,在父类的构造器中执行了大量初始化属性,然后在自己的构造器中获得了一个 self._dataset_fetcher。此时继续单步前进断点,发现程序进入到了父类的 __next__() 方法中。

       在分析代码之前,我们先整理一下目前得到的信息:

       下面是 __next__() 方法的内容:

       可以看到最后返回的是变量 data,而 data 是由 self._next_data() 生成的,进入这个方法,我们发现这个方法由子类负责实现。

       在这个方法中,我们可以看到数据从 self._dataset_fecther.fetch() 中得到,需要依赖参数 index,而这个 index 由 self._next_index() 提供。进入这个方法可以发现它是由父类实现的。

       而前面的 index 实际上是由这个 self._sampler_iter 迭代器提供的。查找 self._sampler_iter 的定义,我们发现其在构造函数中。

       仔细观察,我们可以在倒数第 4 行发现 self._sampler_iter = iter(self._index_sampler),这个迭代器就是这里的 self._index_sampler 提供的,而 self._index_sampler 来自 loader._index_sampler。这个 loader 就是最外层的 DataLoader。因此我们回到 DataLoader 类中查看这个 _index_sampler 是如何得到的。

       我们可以发现 _index_sampler 是一个由 @property 装饰得到的属性,会根据 self._auto_collation 来返回 self.batch_sampler 或者 self.sampler。再次整理已知信息,我们可以得到:

       因此,只要知道 batch_sampler 和 sampler 如何返回 index,就能了解整个流程。

       首先发现这两个属性来自 DataLoader 的构造函数,因此下面先分析构造函数。

       由于构造函数代码量较大,因此这里只关注与 Sampler 相关的部分,代码如下:

       在这里我们只关注以下部分:

       代码首先检查了参数的合法性,然后进行了一轮初始化属性,接着判断了 dataset 的类型,处理完特殊情况。接下来,函数对参数冲突进行了判断,共判断了 3 种参数冲突:

       检查完参数冲突后,函数开始创建 sampler 和 batch_sampler,如下图所示:

       注意,仅当未指定 sampler 时才会创建 sampler;同理,仅在未指定 batch_sampler 且存在 batch_size 时才会创建 batch_sampler。

       在 DataLoader 的构造函数中,如果不指定参数 batch_sampler,则默认创建 BatchSampler 对象。该对象需要一个 Sampler 对象作为参数参与构造。这也是在构造函数中,batch_sampler 与 sampler 冲突的原因之一。因为传入一个 batch_sampler 时,说明 sampler 已经作为参数完成了 batch_sampler 的构造,若再将 sampler 传入 DataLoader 是多余的。

       以第一节中的简单代码为例,此时并未指定 Sampler 和 batch_sampler,也未指定 batch_size,默认为 1,因此在 DataLoader 构造时,创建了一个 SequencialSampler,并传入了 BatchSampler 进行构建。继续第一节中的断点,可以发现:

       具体使用 sampler 还是 batch_sampler 来生成 index,取决于 _auto_collation,而从上面的代码发现,只要存在 self.batch_sampler 就永远使用 batch_sampler 来生成。batch_sampler 与 sampler 冲突的原因之二:若不设置冲突,那么使用者试图同时指定 batch_sampler 与 sampler 后,尤其是在使用者继承了新的 Sampler 子类后, sampler 在获取数据的时候完全没有被使用,这对开发者来说是一个困惑的现象,容易引起不易察觉的 BUG。

       继续断点发现程序进入了 BatchSampler 的 __iter__() 方法,代码如下:

       从代码中可以发现,程序不停地从 self.sampler 中获取 idx 加入列表,直到填满一个 batch 的量,并将这一整个 batch 的 index 返回到迭代器的 _next_data()。

       此处由 self._dataset_fetcher.fetch(index) 来获取真正的数据,进入函数后看到:

       这里依然根据 self.auto_collation(来自 DataLoader._auto_collation)进行分别处理,但是总体逻辑都是通过 self.dataset[] 来调用 Dataset 对象的 __getitem__() 方法。

       此处的 Dataset 是来自 torchvision 的 DatasetFolder 对象,这里读取文件路径中的后,经过转换变为 Tensor 对象,与标签 target 一起返回。参数中的 index 是由迭代器的 self._dataset_fetcher.fetch() 传入。

       整个获取数据的流程可以用以下流程图简略表示:

       注意:

       另附:

       对于一条循环语句,在执行过程中发生了以下事件:

Pytorch_循环神经网络RNN

        RNN是Recurrent Neural Networks的缩写,即循环神经网络,它常用于解决序列问题。RNN有记忆功能,除了当前输入,还把上下文环境作为预测的依据。它常用于语音识别、翻译等场景之中。

        RNN是序列模型的基础,尽管能够直接调用现成的RNN算法,但后续的复杂网络很多构建在RNN网络的基础之上,如Attention方法需要使用RNN的隐藏层数据。RNN的原理并不复杂,但由于其中包括循环,很难用语言或者画图来描述,最好的方法是自己手动编写一个RNN网络。本篇将介绍RNN网络的原理及具体实现。

        在学习循环神经网络之前,先看看什么是序列。序列sequence简称seq,是有先后顺序的一组数据。自然语言处理是最为典型的序列问题,比如将一句话翻译成另一句话时,其中某个词汇的含义不仅取决于它本身,还与它前后的多个单词相关。类似的,如果想预测电影的情节发展,不仅与当前的画面有关,还与当前的一系列前情有关。在使用序列模型预测的过程中,输入是序列,而输出是一个或多个预测值。

        在使用深度学习模型解决序列问题时,最容易混淆的是,序列与序列中的元素。在不同的场景中,定义序列的方式不同,当分析单词的感情色彩时,一个单词是一个序列seq;当分析句子感情色彩时,一个句子是一个seq,其中的每个单词是序列中的元素;当分析文章感情色彩时,一篇文章是一个seq。简单地说,seq是最终使用模型时的输入数据,由一系列元素组成。

        当分析句子的感情色彩时,以句为seq,而句中包含的各个单词的含义,以及单词间的关系是具体分析的对象,此时,单词是序列中的元素,每一个单词又可有多维特征。从单词中提取特征的方法将在后面的自然语言处理中介绍。

        RNN有很多种形式,单个输入单个输入;多个输入多个输出,单个输入多个输出等等。

        举个最简单的例子:用模型预测一个四字短语的感情色彩,它的输入为四个元素X={ x1,x2,x3,x4},它的输出为单个值Y={ y1}。字的排列顺序至关重要,比如“从好变坏”和“从坏变好”,表达的意思完全相反。之所以输入输出的个数不需要一一对应,是因为中间的隐藏层,变向存储中间信息。

        如果把模型设想成黑盒,如下图所示:

        如果模型使用全连接网络,在每次迭代时,模型将计算各个元素x1,x2...中各个特征f1,f2...代入网络,求它们对结果y的贡献度。

        RNN网络则要复杂一些,在模型内部,它不是将序列中所有元素的特征一次性输入模型,而是每一次将序列中单个元素的特征输入模型,下图描述了RNN的数据处理过程,左图为分步展示,右图将所有时序步骤抽象成单一模块。

        第一步:将第一个元素x1的特征f1,f2...输入模型,模型根据输入计算出隐藏层h。

        第二步:将第二个元素x2的特征输入模型,模型根据输入和上一步产生的h再计算隐藏层h,其它元素以此类推。

        第三步:将最后一个元素xn的特征输入模型,模型根据输入和上一步产生的h计算隐藏层h和预测值y。

        隐藏层h可视为将序列中前面元素的特征和位置通过编码向前传递,从而对输出y发生作用,隐藏层的大小决定了模型携带信息量的多少。隐藏层也可以作为模型的输入从外部传入,以及作为模型的输出返回给外部调用。

        本例仍使用上篇中的航空乘客序列数据,分别用两种方法实现RNN:自己编写程序实现RNN模型,以及调用Pytorch提供的RNN模型。前一种方法主要用于剖析原理,后一种用于展示常用的调用方法。

        首先导入头文件,读取乘客数据,做归一化处理,并将数据切分为测试集和训练集,与之前不同的是加入了create_dataset函数,用于生成序列数据,序列的输入部分,每个元素中包括两个特征:前一个月的乘客量prev和月份值mon,这里的月份值并不是关键特征,主要用于在例程中展示如何使用多个特征。

        第一步:实现模型类,此例中的RNN模型除了全连接层,还生成了一个隐藏层,并在下一次前向传播时将隐藏层输出的数据与输入数据组合后再代入模型运算。

        第二步,训练模型,使用全部数据训练次,在每次训练时,内部for循环将序列中的每个元素代入模型,并将模型输出的隐藏层和下一个元素一起送入下一次迭代。

        第三步:预测和作图,预测的过程与训练一样,把全部数据拆分成元素代入模型,并将每一次预测结果存储在数组中,并作图显示。

        需要注意的是,在训练和预测过程中,每一次开始输入新序列之前,都重置了隐藏层,这是由于隐藏层的内容只与当前序列相关,序列之间并无连续性。

        程序输出结果如下图所示:

        经过次迭代,使用RNN的效果明显优于上一篇中使用全连接网络的拟合效果,还可以通过调整超参数以及选择不同特征,进一步优化。

        使用Pytorch提供的RNN模型,torch.nn.RNN类可直接使用,是循环网络最常用的解决方案。RNN,LSTM,GRU等循环网络都实现在同一源码文件torch/nn/modules/rnn.py中。

        第一步:创建模型,模型包含两部分,第一部分是Pytorch提供的RNN层,第二部分是一个全连接层,用于将RNN的输出转换成输出目标的维度。

        Pytorch的RNN前向传播允许将隐藏层数据h作为参数传入模型,并将模型产生的h和y作为函数返回值。形如: pred, h_state = model(x, h_state)

        什么情况下需要接收隐藏层的状态h_state,并转入下一次迭代呢?当处理单个seq时,h在内部前向传递;当序列与序列之间也存在前后依赖关系时,可以接收h_state并传入下一步迭代。另外,当模型比较复杂如LSTM模型包含众多参数,传递会增加模型的复杂度,使训练过程变慢。本例未将隐藏层转到模型外部,这是由于模型内部实现了对整个序列的处理,而非处理单个元素,而每次代入的序列之间又没有连续性。

        第二步:训练模型,与上例中把序列中的元素逐个代入模型不同,本例一次性把整个序列代入了模型,因此,只有一个for循环。

        Pythorch支持批量处理,前向传递时输入数据格式是[seq_len, batch_size, input_dim),本例中输入数据的维度是[, 1, 2],input_dim是每个元素的特征数,batch_size是训练的序列个数,seq_len是序列的长度,这里使用%作为训练数据,seq_len为。如果数据维度的顺序与要求不一致,一般使用transpose转换。

        第三步:预测和作图,将全部数据作为序列代入模型,并用预测值作图。

        程序输出结果如下图所示:

        可以看到,经过次迭代,在前个元素的训练集上拟合得很好,但在测试集效果较差,可能存在过拟合。

分求一个用VB.net做的简单网页的代码,谢谢!!!

       用vb.net做的校友录……(附所有源代码)

       来源:不详 作者 佚名 点击数: 录入时间:-- ::

       想必大家都上过校友录吧,里面的功能虽然不是很强大,但是为我们这些毕业之后各奔西东的学子来说,到真是提供了一个好的聚集点,下面是我用vb.net做的校友录,当然也不能说是校友录了,只能说是我们班的学友录了:)不过只要你掌握了这种编程思想,校友录就不在话下了。这里我将重点谈一下关于管理员权限赋予。

       以前有这个想法的时候,难就难在管理员身份的赋予上,开始想如果一般用户在被提升为管理员之后,我可以把他的信息转到另外一个表中,以后登陆的时候先检查manage表中是否有他就行了,这种办法我已经实现了,是不是有些笨……可是正在我要正式开工的时候,一个想法突然冒了出来,是什么呢?呵呵,就是在数据库中再增加一个字段了如果是第一次注册就让这个字段item(int)的值为0,要是被提升之后就update为1,班级创始人呢?当然了,在他申请时付给他一个班级id,然后先判断班级id为这个已经注册的人信息条数是否为0,如果是,那么就付给他item=2好了。下面的代码中,我没有实现这个功能,因为我做的是班友录的,当然了,我就是管理员喽:)

       在这里,我使用的是checkboxlist(两个),一个用来转换数据(visibe=fause),一个用来显示数据,还有一个checkbox用来写全部选中的事件。当然了还有两个按钮事件,一个是用来提升为管理员的,一个是用来降级为一般用户的,这两个按钮在判断为一般用户时

       enable都是为fause的,只有当判断登录为管理员时才为true。当然了,如果你是班级创始人,是不可能被降级的:)

       这里用来显示信息的我用的是一个datagrid,当判断为非管理员时,删除栏的visible将为fause,为管理员的时候,才为true,也就是说只有管理员才可以删除信息。而不是注册的用户是不能发言的所有的按钮控件的enable将都为fause。

       代码如下:board.aspx

       <%@ Page Language="vb" AutoEventWireup="false" Codebehind="boaman.aspx.vb" Inherits="_re1.boaman"%>

       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

       <HTML>

        <HEAD>

        <title></title>

        <meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">

        <meta content="Visual Basic 7.0" name="CODE_LANGUAGE">

        <meta content="javascript" name="vs_defaultClientScript">

        <meta content="/intellisense/ie5" name="vs_targetSchema">

        </HEAD>

        <body background="image/bg.gif" MS_POSITIONING="GridLayout">

        <form id="Form1" method="post" runat="server">

        <asp:checkbox id="yourcheck" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="全部选中" AutoPostBack="True" ForeColor="SaddleBrown" Font-Bold="True"></asp:checkbox>

        <asp:button id="Button1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="提升为管理员" Height="px" Width="px" BackColor="Gainsboro" BorderColor="Lavender" BorderWidth="2px" BorderStyle="Outset"></asp:button>

        <asp:button id="Button2" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Text="降级为一般用户" Height="px" Width="px" BackColor="Gainsboro" BorderColor="Lavender" BorderWidth="2px" BorderStyle="Outset"></asp:button>

        <asp:checkboxlist id="CheckBoxList1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Visible="False"></asp:checkboxlist>

        <asp:checkboxlist id="mycheck" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" ForeColor="Navy" Font-Size="X-Small"></asp:checkboxlist>

        <asp:label id="Label1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" ForeColor="Red" Font-Names="方正姚体">(已注册用户)</asp:label>

        <asp:image id="Image1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Height="px" Width="px" ImageUrl="image/re1-1.gif"></asp:image>

        <asp:datagrid id="DataGrid1" style="Z-INDEX: ; LEFT: px; POSITION: absolute; TOP: px" runat="server" Height="px" Width="px" BorderColor="#ffcc" AutoGenerateColumns="False" HeaderStyle-Font-Size="9" HeaderStyle-HorizontalAlign="Center" HeaderStyle-ForeColor="red" HeaderStyle-Font-Bold="True">

        <Columns>

        <asp:HyperLinkColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Height="" ItemStyle-Font-Size="9" DataNavigateUrlField="stu_id" DataNavigateUrlFormatString="querry.aspx?stu_id={ 0}" DataTextField="stu_id" HeaderText="学号"></asp:HyperLinkColumn>

        <asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="tel" HeaderText="电话"></asp:BoundColumn>

        <asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="oicq" HeaderText="OICQ"></asp:BoundColumn>

        <asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="email" HeaderText="E-mail"></asp:BoundColumn>

        <asp:BoundColumn ItemStyle-ForeColor="navy" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="" ItemStyle-Font-Size="9" DataField="point" HeaderText="登录次数"></asp:BoundColumn>

        </Columns>

        </asp:datagrid>

        </form>

        </body>

       </HTML>

       下面是codebehind中的内容:boaman.asp.vb

       Imports System.Data

       Imports System.Data.SqlClient

       Public Class boaman

        Inherits System.Web.UI.Page

        Protected WithEvents yourcheck As System.Web.UI.WebControls.CheckBox

        Protected WithEvents Button1 As System.Web.UI.WebControls.Button

        Protected WithEvents CheckBoxList1 As System.Web.UI.WebControls.CheckBoxList

        Protected WithEvents mycheck As System.Web.UI.WebControls.CheckBoxList

        Protected WithEvents Label1 As System.Web.UI.WebControls.Label

        Protected WithEvents Image1 As System.Web.UI.WebControls.Image

        Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid

        Protected WithEvents Button2 As System.Web.UI.WebControls.Button

       #Region " Web Form Designer Generated Code "

        'This call is required by the Web Form Designer.

        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        End Sub

        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init

        'CODEGEN: This method call is required by the Web Form Designer

        'Do not modify it using the code editor.

        InitializeComponent()

        End Sub

       #End Region

        Dim conn As SqlConnection = New SqlConnection("server=lixinri;uid=sa;pwd=;database=re1")

        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '////////////////////判断是否为过客

        If Session("stu_id") = "" Then

        Button1.Enabled = False : Button2.Enabled = False

        '////////////////////调用check()事件

        check()

        Else

        If Not IsPostBack Then

        Dim sql As String = "select * from pwd where stu_id=@stu_id"

        Dim comm As SqlCommand = New SqlCommand(sql, conn)

        comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))

        comm.Parameters("@stu_id").Value = Session("stu_id")

        Dim dr As SqlDataReader

        conn.Open()

        dr = comm.ExecuteReader

        While dr.Read

        If dr.Item("term") = "0" Then

        '///////////////////判断是否为一般用户

        dr.Close()

        Button1.Enabled = False : Button2.Enabled = False

        Dim sql_1 As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"

        Dim cmd As New SqlCommand(sql_1, conn)

        dr = cmd.ExecuteReader

        While dr.Read

        If dr.Item("term") = "1" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")

        ElseIf dr.Item("term") = "2" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")

        Else

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")

        End If

        CheckBoxList1.Items.Add(dr.Item("stu_id"))

        End While

        Else

        '////////////////////判断是否为管理员

        dr.Close()

        Button1.Enabled = True : Button2.Enabled = True

        Dim sql_1 As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"

        Dim cmd As New SqlCommand(sql_1, conn)

        dr = cmd.ExecuteReader

        While dr.Read

        If dr.Item("term") = "1" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")

        ElseIf dr.Item("term") = "2" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")

        Else

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")

        End If

        CheckBoxList1.Items.Add(dr.Item("stu_id"))

        End While

        End If

        End While

        dr.Close()

        '////////////////////////取出数据,填充dataset

        Dim mysql As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"

        comm = New SqlCommand(mysql, conn)

        Dim mycomm As SqlDataAdapter = New SqlDataAdapter(mysql, conn)

        Dim ds As DataSet = New DataSet()

        mycomm.Fill(ds, "base")

        DataGrid1.DataSource = ds.Tables("base").DefaultView

        DataGrid1.DataBind()

        End If

        End If

        End Sub

        '///////////////////////书写check()事件

        Sub check()

        If Not IsPostBack Then

        Dim mysql As String = "select a.stu_id as stu_id,a.term,b.name as name,b.tel as tel,b.call as oicq,b.point as point,b.email from pwd a,stu_base b where a.stu_id=b.stu_id"

        Dim comm As New SqlCommand(mysql, conn)

        Dim dr As SqlDataReader

        conn.Open()

        dr = comm.ExecuteReader

        While dr.Read

        If dr.Item("term") = "1" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=darkorange>(管理员)</font>")

        ElseIf dr.Item("term") = "2" Then

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>" & "<font color=red>(班级创始人)<font>")

        Else

        mycheck.Items.Add("<u>" & dr.Item("name") & "</u>")

        End If

        CheckBoxList1.Items.Add(dr.Item("stu_id"))

        End While

        dr.Close()

        Dim mycomm As SqlDataAdapter = New SqlDataAdapter(mysql, conn)

        Dim ds As DataSet = New DataSet()

        mycomm.Fill(ds, "base")

        DataGrid1.DataSource = ds.Tables("base").DefaultView

        DataGrid1.DataBind()

        End If

        End Sub

        '/////////////////////填充yourcheck

        Private Sub yourcheck_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles yourcheck.CheckedChanged

        Dim i As Integer

        For i = 0 To mycheck.Items.Count - 1

        If yourcheck.Checked Then

        mycheck.Items(i).Selected = True

        Else

        mycheck.Items(i).Selected = False

        End If

        Next

        End Sub

        '///////////////////////提升一般用户为管理员

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        conn.Open()

        Dim i As Integer

        For i = 0 To mycheck.Items.Count - 1

        If mycheck.Items(i).Selected Then

        Dim sql_1 As String = "update pwd set term=1 where stu_id=@stu_id and term=0"

        Dim comm As SqlCommand = New SqlCommand(sql_1, conn)

        comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))

        comm.Parameters("@stu_id").Value = CheckBoxList1.Items(i).Text

        comm.ExecuteNonQuery()

        End If

        Next

        Response.Redirect("boaman.aspx")

        End Sub

        '///////////////////////降级管理员为一般用户

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        conn.Open()

        Dim i As Integer

        For i = 0 To mycheck.Items.Count - 1

        If mycheck.Items(i).Selected Then

        Dim sql_1 As String = "update pwd set term=0 where stu_id=@stu_id and term=1"

        Dim comm As SqlCommand = New SqlCommand(sql_1, conn)

        comm.Parameters.Add(New SqlParameter("@stu_id", SqlDbType.Int, 4))

        comm.Parameters("@stu_id").Value = CheckBoxList1.Items(i).Text

        comm.ExecuteNonQuery()

        End If

        Next

        Response.Redirect("boaman.aspx")

        End Sub

       End Class

       当然了,这里面还有好多不足的地方,恳求高手批评指正。

       校友录还有一些其它的功能就很简单了,这里就不再探讨了。