从零开始学ASP.NET(基础篇)

博客记录编程学习内容,提到处理字符串时建议使用StringBuilder的Append方法,可节省服务器资源;还展示了VB.NET在表中增加字段的代码,如dt.Columns.Add(\WebName\ GetType(String))等。
第一天

学习目的:
    
  • 掌握最基本的Label、TextBox、Button控件用法
        
  • 掌握用StringBuider类连接字符串
        
  • 理解服务器的环境变量


    StringBuilder类:
    命名空间是:System.Text。

    StringBuilder类是个高效的类,StringBuilder.Append连接字符串的方法是非常快的。用于连接大量的字符串,其速度的优越性就会体现出来。

    先举几个例子:
         在cs或vb文件的头部加上
    [C#]using System.Text;
    [VB]Imports System.Text

    [C#]StringBuilder sbFirst = new StringBuilder();
         sbFirst.Append(“这是第一个学ASPNET的例子</br>”);
         sbFirst.Append( “这个例子太简单</br>”);
         sbFirst.Append( “连三岁小陔都会做,我早知道了,嘿嘿。”);
         Response.Write(sbFirst.ToString());

    [VB]Dim sbFirst As StringBuilder = New StringBuilder()
         sbFirst.Append(“这是第一个学ASPNET的例子</br>”)
         sbFirst.Append( “这个例子太简单</br>”)
         sbFirst.Append( “连三岁小陔都会做,我早知道了,嘿嘿。”)
         Response.Write(sbFirst.ToString)

    下面就可以做正题了:
    先建立一个C#的WEB应用程序工程,这废话我就少说了吧。
    放一个Button控件:ID为btnShowVariable
    放一个Label控件:ID为labServerVariable

    添加Button的单击事件,如下代码
              private void btnShowVariable_Click(object sender, System.EventArgs e)
              {               
                   labServerVariables.Text = "";

                   StringBuilder info = new StringBuilder();

                   foreach (object objVar in Request.ServerVariables)
                   {
                        info.Append("<span style='font-size:9pt'>");
                        info.Append(objVar.ToString());
                        info.Append(" = <font color=blue>");
                        info.Append(Request.ServerVariables[objVar.ToString()]);
                        info.Append("</font></span><br>");
                   }

                   labServerVariables.Text = info.ToString();
              }

    结果显示:

    图片如下:


    这样我们就可以这样用
    Response.Write(Request.ServerVariables["REMOTE_ADDR"]);      // IP地址
    Response.Write("<BR>");
    Response.Write(Request.ServerVariables["URL"]);           // 网页的URL
  • 第二天

    学习目的:
        

  • 掌握文本框的用法
        
  • 初次接触try…catch…语法

    今天内容很轻松,用一个例子,输入年月日,判断输入是否正确

    图片如下:


    用个文本框,ID分别为txtYear,txtMonth,txtDate;
    检验按钮的代码为:
              private void btnCheck_Click(object sender, System.EventArgs e)
              {
                   int year, month, date;

                   // 先把输入的字符转成int类型,如果非数字型,
                   // 会触发错误

                   try
                   {
                        year = Convert.ToInt32(txtYear.Text);
                        month = Convert.ToInt32(txtMonth.Text);
                        date = Convert.ToInt32(txtDate.Text);
                   }
                   catch
                   {
                        labCheckInfo.Text = "输入的是非数字字符。";
                        return;
                   }

                   // 如果第一步检验合格,就把输入的数字转化为日期格式
                   // 如果不符合日期格式即引发错误

                   try
                   {
                        DateTime dt = new DateTime(year, month, date);
                   }
                   catch
                   {
                        labCheckInfo.Text = "输入的数字不符合日期格式";
                        return;
                   }

                   labCheckInfo.Text = "输入正确";
              }

  • 嗯,补充一下,关于StringBuider
    在处理字符串的时候很多人喜欢+=,其实对于string来说,一旦定义了就无法更改了
    所谓的+只是新建的一个新的string变量并赋值
    所以对于尽量使用StringBuider的Append的方法,这样将大量的节省服务器的资源

    第三天

    学习目的:

  • 掌握下拉列表框的用法,并理解AutoPostBack属性;
  • 理解IsPoskBack及用法;
  • 初识DataTable的增加列、行,与下拉列表框绑定的方法。

    今天的内容稍多些,而且涉及一些比较常用的,如IsPostBack及DataTable的基本用法。

    知识点:
    IsPostBack:在页面onLoad之间是false值,而当从服务器回传后,该值变为true。当页面中的Button或ImageButton等触发事件,都会把表单回传到服务器,而返回时又会引发onLoad事件。为了节省服务器资源,有些加载中需进行一次,而不需要在回传后多次发生,可以用!IsPoskBack来作为条件,那么页面第一次加载后,以后就不会发生。该属性可以帮助你提高程序的性能。
    DataTable:即数据表,.Net 程序中最常用的类,特别是数据库开发中,没有该类的程序是不可想象的。

    先做个小程序来练练手,很简单,就一个下拉菜单,取名dlstWeb。在属性的Itmes选项中打开以下对话框,添加各项:


    图片如下:
    按Alt+滚轮缩放图片,单击查看完整图片

    ASPX中的代码为:
    <asp:DropDownList id="dlstWeb" style="Z-INDEX: 101; LEFT: 32px;
    POSITION: absolute; TOP: 32px" runat="server"
         Width="88px" AutoPostBack="True">
         <asp:ListItem value="http://www.sina.com.cn">新浪 </asp:ListItem>
         <asp:ListItem value="http://www.sohu.com">搜狐</asp:ListItem>
         <asp:ListItem value="http://www.163.com">网易</asp:ListItem>
    </asp:DropDownList>

    在下拉框的SelectedIndexChanged事件中的加入代码:
              private void dlstWeb_SelectedIndexChanged(object sender, System.EventArgs e)
              {
                   Response.Write("<script language=javascript>window.open('" +dlstWeb.Selectedvalue + "');</script>");
              }

    按F5运行,可是我们发现这下拉框选择时什么事也没发生。原来原因是出在下拉框的AutoPostBack属性上,把它设为true后再试试,一切OK了。
    下面我们增加些难度,下拉框中的内容很多情况下不是事先固定的,而是要动态添加。这里设计是用一数据表DataTable与之联系起来。

    另建一文件,按上添加一下拉框,取名dlstWeb,先设AutoPostPack为false,否则在刚启动而面就触发SelectedIndexChanged事件,弹出窗口就乱飞了。
    在onLoad事件中添加代码,注意DataTable用法及IsPoskBack
    DataTable属于System.Data命名空间,所以如果页面没预添加,可以自行增加这一行。

              private void Page_Load(object sender, System.EventArgs e)
              {
                   // 用IsPostBack判断,只在没有回传时才初始化
                   // 这样可以防止每次刷新或回传时,都执行一次以下代码
                   // 可以节省服务器的资源了。

                   if (!IsPostBack)
                   {
                        DataTable dt = new DataTable();
                        DataRow dr;

                        // 在表中增加字段
                        dt.Columns.Add("WebName", typeof(string));
                        dt.Columns.Add("WebUrl", typeof(string));

                        // 表中增加行
                        dr = dt.NewRow();
                        dr["WebName"] = "新浪";
                        dr["WebUrl"] = "http://www.sina.com.cn";
                        dt.Rows.Add(dr);

                        dr = dt.NewRow();
                        dr["WebName"] = "网易";
                        dr["WebUrl"] = "http://www.163.com";
                        dt.Rows.Add(dr);

                        dr = dt.NewRow();
                        dr["WebName"] = "搜狐";
                        dr["WebUrl"] = "http://www.sohu.com";
                        dt.Rows.Add(dr);

                        // 把表与下拉菜单绑定数据
                        dlstWeb.DataSource = dt;
                        dlstWeb.DataTextField = "WebName";
                        dlstWeb.DatavalueField = "WebUrl";
                        dlstWeb.DataBind();               

                        // 开始时就把下拉菜单的AutoPostBack设为false,
                        // 防止一开始就乱跳出网页来

                        dlstWeb.AutoPostBack = true;
                   }
              }

    下面的事件与前面一模一样了
              private void dlstWeb_SelectedIndexChanged(object sender, System.EventArgs e)
              {
                   Response.Write("<script language=javascript>window.open('" +dlstWeb.Selectedvalue + "');</script>");
              }

    小结:今天的一些知识非常重要,为了理解,程序的难度并不高。但这是以后程序设计的基础,所以这些你一定要掌握。
  • VB.NET增加字段代码稍有不同,如下:

                        // 在表中增加字段
                        dt.Columns.Add("WebName", GetType(String))
                        dt.Columns.Add("WebUrl", GetType(String))

    其它都差不多了。

    每四天

    学习目的:

  • 学习ADO.NET用法,并如何用DataRearder读取数据

    今天练习数据库的最基本用法,如何打开数据库。首先在网站设置文件web.config文件的<configuration>下方加入以下节点:

    <configuration>

    <appSettings>
         <add key="数据库1" value="ex01.mdb" />
    </appSettings>

    ……

    该节点设置了数据库的路径,这样就可以很方便的调用数据库文件了,调用方法为:
    Server.MapPath(ConfigurationSettings.AppSettings["数据库1"])
    这是ASP.NET程序的通用方法,以后介绍的SQL SERVER数据库也是在此设置的。
    好开始做程序,首先在CS文件的头部加入:
    using System.Configuration;
    using System.Data.OleDb;
    using System.Text;
    以下在Page的Load事件中,读取ACCESS数据库,并用表格显示出来:
              private void Page_Load(object sender, System.EventArgs e)
              {
                   StringBuilder sbTable = new StringBuilder();      // 用于输出表格的语句

                   string strConnection = "Provider=Microsoft.Jet.Oledb.4.0;Data Source="
                        + Server.MapPath(ConfigurationSettings.AppSettings["数据库1"]);

                   // 连接数据库的语句
                   OleDbConnection conn = new OleDbConnection(strConnection);
                   // 建立DbCommand对象
                   OleDbCommand cmd = conn.CreateCommand();
                   cmd.CommandText = "SELECT * FROM Book";

                   // 打开数据库
                   conn.Open();

                   // 用DataReader读取数据
                   OleDbDataReader dr = cmd.ExecuteReader();

                   sbTable.Append("<table cellSpacing='0' cellPadding='0' border='1'><tr>");
                   sbTable.Append("<td>书名</td><td>作者</td><td>单价<td></tr>");
                   while (dr.Read())
                   {
                        sbTable.Append("<tr><td>");
                        sbTable.Append(dr["BookTitle"].ToString());
                        sbTable.Append("</td><td>");
                        sbTable.Append(dr["Author"].ToString());
                        sbTable.Append("</td><td>");
                        sbTable.Append(dr["UnitPrice"].ToString());
                        sbTable.Append("</td><tr>");
                   }
                   sbTable.Append("</tr></table>");

                   // 记住dr用毕必须关闭,否则会阻塞服务器
                   dr.Close();

                   // DbConnection是受托管的,可以不关闭
                   // 但为良好的编程习惯,应该关闭

                   conn.Close();

                   Response.Write(sbTable.ToString());

              }
    显示结果

    图片如下:
  • 第五天

    学习目的:
        

  • 掌握ADO.NET打开SQL SERVER数据库的方法。

    今天做个非常普通的例子,做一个用户登录框。主要是通过这个练习认识一下SQL SERVER数据库的连接方法。和昨天的例子方法基本相同,很容易掌握的。
    先建立SQL SERVER数据库,库名为AspNetABC,并建立一Member新表,建表SQL如下:

    CREATE TABLE [dbo].[Member] (
         [MemberID] [int] IDENTITY (1, 1) NOT NULL ,
         [MemberName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
         [Password] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
         [Gender] [bit] NOT NULL ,
         [Birthday] [datetime] NULL ,
         [Email] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
    ) ON [PRIMARY]

    ALTER TABLE [dbo].[Member] WITH NOCHECK ADD
         CONSTRAINT [PK_Member] PRIMARY KEY CLUSTERED
         (
              [MemberID]
         ) ON [PRIMARY]

    与上一例子差不多,在web.config文件中再增加一行:
    <appSettings>
    <add key="数据库1" value="ex01.mdb" />
    <add key="SqlDatabase1" value="data source=localhost;user id=sa;password=sa;initial catalog=AspNetABC;Connect Timeout=30" />
    </appSettings>

    在面中添加二个文本框,txtMemberName、txtPassword,并设置txtPassword的TextMode为Password。设置按钮btnLogin。btnLogin的事件代码如下:

              private void btnLogin_Click(object sender, System.EventArgs e)
              {
                   // 先检验输入正确性
                   if (txtMemberName.Text == String.Empty || txtMemberName.Text.Trim() == "")
                   {
                        Response.Write("<script language=javascript>alert('帐号不能为空')</script>");
                        return;
                   }
                   if (txtPassword.Text == String.Empty || txtPassword.Text.Trim() == "")
                   {
                        Response.Write("<script language=javascript>alert('没有输入密码')</script>");
                        return;
                   }

                   string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];
                   string sqlMember = "SELECT MemberName ,[Password] FROM Member "
                        + " WHERE MemberName = '" + txtMemberName.Text.Trim() + "'"
                        + " AND [Password] = '" + txtPassword.Text.Trim() + "'";

                   // 连接SqlServer数据库
                   SqlConnection conn = new SqlConnection(strConnection);
                   // 建立SqlCommand
                   SqlCommand cmd = conn.CreateCommand();
                   cmd.CommandText = sqlMember;
                   conn.Open();
                   // 建立DataReader
                   SqlDataReader dr = cmd.ExecuteReader();

                   // 判断DataReader是否为空记录
                   if (dr.HasRows)
                   {
                        Response.Write("<script language=javascript>alert('" + txtMemberName.Text + "欢迎你!')</script>");
                   }
                   else
                   {
                        Response.Write("<script language=javascript>alert('找不到该会员,或密码错误。')</script>");
                   }

                   // 千万不要忘记关闭DataReader
                   dr.Close();

                   conn.Close();
              }

    好了,一个非常简单的登录框做好了。当然在实际程序中还应加入跳转等,这个就留给你做了。
  • 第六天

    学习目的
        

  • 掌握如何用ADO.NET插入新的记录

    我们学得好快,今天做一个简易的新闻发布网页,可以说是个演示型的,只是让大家能理插入数据的最主要步骤。掌握今天的内容,我们就有基础可以做一个稍有实用的新闻程序了。
    为了不使注意力分散,程序没有加入输入的验证,很快我会接下去写一个验证输入的方法。


    图片如下:
    按Alt+滚轮缩放图片,单击查看完整图片

    仍用昨天的方法新建一数据表,SQL语句如下:
    CREATE TABLE [dbo].[NewsArticle] (
         [NewsArticleID] [int] IDENTITY (1, 1) NOT NULL ,
         [Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
         [SubTitle] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
         [Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
         [Writer] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
         [PubTime] [datetime] NOT NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    ALTER TABLE [dbo].[NewsArticle] WITH NOCHECK ADD
         CONSTRAINT [DF_NewsArticle_PubTime] DEFAULT (getdate()) FOR [PubTime],
         CONSTRAINT [PK_NewsArticle] PRIMARY KEY CLUSTERED
         (
              [NewsArticleID]
         ) ON [PRIMARY]
    GO

    按昨天的方法加入头部的语句,在提交按钮中建立以下事件:

              private void btnPublish_ServerClick(object sender, System.EventArgs e)
              {
                   string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];

                   // 连接SqlServer数据库
                   SqlConnection conn = new SqlConnection(strConnection);
                   // 建立SqlCommand
                   SqlCommand cmd = conn.CreateCommand();
                   cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content) valueS ("
                        + "'" + txtTitle.Text + "',"
                        + "'" + txtSubTitle.Text + "',"
                        + "'" + txtWriter.Text + "',"
                        + "'" + txtContent.Text + "')";
                   conn.Open();
                   //Response.Write (cmd.CommandText);

                   // 插入记录
                   try
                   {
                        cmd.ExecuteNonQuery();
                   }
                   catch (Exception ex)
                   {
                        Response.Write("<script language=javascript>alert('输入错误,数据库不能更新。')</script>");
                   }
                   finally
                   {
                        conn.Close();
                   }
              }

    注意Command对象的ExecuteNonQuery()方法使用,该方法可以用于插入、更新、删除等操作,是Command对象的重要方法。今天介绍了Command语句的最基本用法,下次还将介绍占位符的用法。好了,各位先消化一下,明后天将做实用的东东了。
  • 第七天

    学习目的
        

  • 接触验证控件

    昨天介绍了SQL SERVER插入数据,但是我们省略了验证输入这一步。以前的做法是用语句逐个判断输入的正确性,如是否为空,长度是否超过等。现在.NET中有了验证控件,可以使我们在编程的语句中大在简化了。今天介绍验证控件中最基本的一个,RequeiredFieldValidator控件,是用来判别否输入控件是否为空值,如为空则引发错误。

    RequeiredFieldValidator可以用来验证TextBox、ListBox、DropDownList、RadioButtonList及Html控件中的InputText、TextArea、Select、InputFile等。

    属性介绍:
         ControlToValidate:指点验证某一控件的控件名,如为空,将引发异常;
         ErrorMessage:错误提示信息;
         IsValid:用于判断是否通过验证;
         Display:有三个值,None表示错误时不显示信息,但在ValidationSunmmary控件中显示;Static表示不论错误提示是否出现,都占页面空间;Dymatic:只有错误提示才占用空间。
         Text:文本内容。和ErrorMessage一起使用时,将显示Text错误信息。该种情况可以通过ValidationSummay控件显示ErrorMessage属性的提示。

    使用方法:
         设置:
         txtTitle:MaxLength(50);
         txtSubTitle: MaxLength(50);
         txtWriter: MaxLength(10);
         这样可以防止输入过长字符串
         rfvTitle:ControlToValidate(txtTitle)、ErrorMessage(“标题必须输入。”)
    rfvContent:ControlToValidate(txtTitle)、ErrorMessage(“内容必须输入。”)

    这样在没有验证通过时,会出现下图信息提示,并不执行插入语句。直到验证正确后,才执行数据更新。


    图片如下:
    按Alt+滚轮缩放图片,单击查看完整图片
  • 第八天

    学习目的
        

  • 学会SQL中的占位符用法

    在鲸鱼这几天忙死了,好几天没写了,真对不起各位。这几天让XHTML闹得不开心,虽然以前也知道这个,但没太在意。可现在我是如梦初醒,我发觉XHTML是个信号,所以这几天不得不仔细研究一下这个。很笨,我还没发觉XHTML的奥妙。确实如此,没上过台面,真不知这桌菜怎样好吃。少说了,回到正题。

    先把以前的Command的CommandText重新写过:
    cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content)"
                                       + " valueS ( @Title, @SubTitle, @Writer, @Content )";
    这样代码是否很清晰了,我们可以避免一大串的难以看懂的的语句了。

    接下来,我们就给这些定位符赋予属性和值了:
    cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
    cmd.Parameters.Add("@SubTitle", SqlDbType.NVarChar, 50);
    cmd.Parameters.Add("@Writer", SqlDbType.NVarChar, 10);
    cmd.Parameters.Add("@Content", SqlDbType.NText);

    以上我们给每个占位符定义一个值类型,相信不难看懂吧。接者再给于值:
    cmd.Parameters["@Title"].value = txtTitle.Text.Trim();
    if (txtSubTitle.Text == string.Empty || txtSubTitle.Text.Trim() == "")
    {
         cmd.Parameters["@SubTitle"].value = DBNull.value;
    }
    else
    {
         cmd.Parameters["@SubTitle"].value = txtSubTitle.Text.Trim();
    }
    if (txtWriter.Text == string.Empty || txtWriter.Text.Trim() == "")
    {
         cmd.Parameters["@Writer"].value = DBNull.value;
    }
    else
    {
         cmd.Parameters["@Writer"].value = txtWriter.Text;
    }
    cmd.Parameters["@Content"].value = txtContent.Text;

    其实,也可以这样写:
    cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50) .value = txtTitle.Text.Trim();
    这要看你喜欢了。

    不错吧,程序是否很有条理。

    程序代码:
              private void btnPublish_ServerClick(object sender, System.EventArgs e)
              {
                   string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];

                   // 连接SqlServer数据库
                   SqlConnection conn = new SqlConnection(strConnection);
                   // 建立SqlCommand
                   SqlCommand cmd = conn.CreateCommand();
                   cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content)"
                                                           + " valueS ( @Title, @SubTitle, @Writer, @Content )";
                   conn.Open();

                   cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
                   cmd.Parameters.Add("@SubTitle", SqlDbType.NVarChar, 50);
                   cmd.Parameters.Add("@Writer", SqlDbType.NVarChar, 10);
                   cmd.Parameters.Add("@Content", SqlDbType.NText);

                   cmd.Parameters["@Title"].value = txtTitle.Text.Trim();
                   if (txtSubTitle.Text == string.Empty || txtSubTitle.Text.Trim() == "")
                   {
                        cmd.Parameters["@SubTitle"].value = DBNull.value;
                   }
                   else
                   {
                        cmd.Parameters["@SubTitle"].value = txtSubTitle.Text.Trim();
                   }
                   if (txtWriter.Text == string.Empty || txtWriter.Text.Trim() == "")
                   {
                        cmd.Parameters["@Writer"].value = DBNull.value;
                   }
                   else
                   {
                        cmd.Parameters["@Writer"].value = txtWriter.Text;
                   }
                   cmd.Parameters["@Content"].value = txtContent.Text;
                   // 插入记录
                   try
                   {
                        cmd.ExecuteNonQuery();
                   }
                   catch (Exception ex)
                   {
                        Response.Write("<script language=javascript>alert('输入错误,数据库不能更新。')</script>");
                   }
                   finally
                   {
                        conn.Close();
                   }
              }
ASP.net一夜速成视频教程列表 教程简介:本教程由烁空(socut.com)制作。因为教程偏重于代码编程,并且主旨在于“速成”,所以除了界面并无作任何美化之外,在代码解释上都尽可能做了中文注释,但是你可能还需要参考DW和C#等相关基础教程。注意:因为本教程节与节之间的关联性非常强,所以请必须从第一节开始看,切勿心急而从中间或跳节观看,这样只会导致你最终无法弄懂和会。   烁空简介:烁空网络课堂致力于在线计算机培训并开发了烁空网络课堂系统。 ·第一章 准备工作(已发布)  0.下载必用素材(一)(rar格式) 1.菜鸟第一步:安装和配置IIS 2.调试IIS是否已经安装成功 3.安装微软.Net框架,习设置虚拟目录 4.安装Visual Studio开发工具   ·第二章 项目配置(已发布) 0.下载必用素材(二)(rar格式) 1.ASP.Net项目的建立与文件夹设置   ·第三章 DataSet读取数据(已发布)  2.设置web.config,用DataGrid控件 3.为DataGrid网格控件添加后台代码 4.创建一个新闻详细内容页面 5.为新闻详细页添加后台代码     ·第四章 管理员模块(已发布)  6.设计“更新、删除”的管理员界面 7.添加“更新、删除”的后台代码(上) 8.添加“更新、删除”的后台代码(下) 9. 开发“添加新闻”管理功能     ·第五章 DataReader读取数据(已发布)  10.新闻系统的首页界面布局设计   11.使用函数方式的DataReader输出新闻列表 ·第六章 用户注册模块(已发布)  12.“用户注册”界面的布局设计 13.添加“用户注册”的后台代码 14.“用户登陆”界面的布局设计 15.添加“用户登陆”的后台代码(上) 16.添加“用户登陆”的后台代码(下)   ·第七章 其它实用模块  17.实现“文章数量统计”功能 18.毕业总结:会举一反三,扩展更多功能  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值