ASP.NET实训材料管理网站源代码解析与实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:ASP.NET是一个用于构建动态Web应用程序的开发平台。本实训材料管理网站源代码为开发者提供全面的学习资源,涵盖页面生命周期管理、控件模型、状态管理、数据绑定和MVC模式等核心特性。通过实践网站的模块化设计,如登录注册、分类管理、文件上传下载、搜索功能、权限管理、报表统计和安全防护,开发者可以掌握ASP.NET在实际项目中的应用,并提升数据库交互和安全性理解。

1. ASP.NET核心特性介绍

ASP.NET是一个功能强大的Web应用框架,它构建在.NET框架之上,为开发动态Web应用程序提供了丰富而灵活的特性。本章将简要介绍ASP.NET的核心特性,并为后续章节中更深入的技术讨论打下基础。

1.1 ASP.NET的历史和发展

ASP.NET自2002年首次发布以来,经历了数次重大的更新与升级,每一次的更新都带来了新的特性和改进。从ASP.NET Web Forms到ASP.NET MVC,再到最新的ASP.NET Core,这些变迁标志着技术进步和开发者需求的演变。

1.2 ASP.NET与.NET Core的关系

在ASP.NET Core发布之前,ASP.NET存在两个主要分支:传统的.NET Framework中的ASP.NET和基于.NET Core的ASP.NET Core。ASP.NET Core是重新设计的框架,它具有跨平台、模块化和性能优化的特点。这一变革使得ASP.NET Core成为构建Web应用程序的首选。

1.3 ASP.NET Core的主要特性

ASP.NET Core引入了许多创新的特性,如依赖注入、中间件管道、集成的路由系统等。这些特性为开发者提供了更灵活、高效的方式来构建Web应用。此外,ASP.NET Core也提供了优秀的性能,这得益于其轻量级的托管模型和基于任务的异步编程模型。这些核心特性使得ASP.NET在现代Web开发中保持了强大的竞争力。

通过上述章节内容的逐步深入,我们不仅了解了ASP.NET的发展历程,还清楚了它与.NET Core的关系以及核心特性,为深入探索ASP.NET提供了坚实的基础。接下来我们将讨论ASP.NET页面生命周期管理,这是构建动态Web页面不可或缺的一部分。

2. 页面生命周期管理

2.1 页面请求处理流程

2.1.1 HTTP请求与ASP.NET的交互

在ASP.NET应用程序中,一个页面请求的生命周期始于客户端发出HTTP请求。服务器接收到请求后,ASP.NET框架会根据请求的类型,找到合适的处理器来处理该请求。这个处理器通常是一个页面(.aspx文件)或一个Web服务(.asmx文件)。一旦确定了处理器,ASP.NET引擎将开始执行页面生命周期的不同阶段。

2.1.2 页面生命周期各阶段解析

ASP.NET页面的生命周期包含一系列的阶段,每一个阶段都对应页面处理流程中的特定操作:

  • 初始化(Init) :在这个阶段,页面和控件被初始化,实例化,以及它们的状态被恢复(如果状态有被保存的话)。
  • 加载(Load) :在加载阶段,页面和控件被加载到内存中。如果是在回发(postback)过程中,控件的状态会被从视图状态(ViewState)中恢复。
  • 处理回发事件(ProcessPostData) :这个阶段负责处理回发事件并更新服务器端控件的状态。
  • 加载完成(LoadComplete) :这个阶段发生于所有的回发事件处理完毕,控件状态完全恢复。
  • 处理请求(PreRender) :在这里,页面进行最终的调整,例如绑定数据,完成数据更新等。
  • 保存状态(SaveState) :此阶段用于保存控件和页面的状态,以便在页面回发时能够恢复。
  • 渲染(Render) :最终,页面的内容被转换为HTML,并发送到客户端。
  • 卸载(Unload) :在卸载阶段,页面和控件被清除出内存。

2.2 事件驱动模型

2.2.1 事件模型的工作机制

ASP.NET中的事件驱动模型是基于服务器控件的,这些控件生成事件,这些事件可以由服务器代码进行处理。当用户与页面交互(如点击按钮,输入文本等)时,将产生一个或多个事件,ASP.NET框架处理这些事件的机制包括:

  • 事件触发 :用户交互导致控件触发事件。
  • 事件绑定 :开发者通过在控件标签内使用 On<EventType> 属性或在后端代码中使用事件处理器方法来绑定事件。
  • 事件分发 :当事件发生时,ASP.NET分发事件到对应的事件处理器。
  • 事件处理 :事件处理器执行具体逻辑,响应事件。
2.2.2 常见页面事件的应用实例

一个常见的事件处理示例是按钮点击事件,在ASP.NET中,你可以通过 OnClick 属性来绑定事件处理方法。

protected void Button1_Click(object sender, EventArgs e)
{
    // 在这里编写按钮点击后的逻辑代码
}

在上面的代码块中, Button1_Click 是事件处理方法, sender 参数表示触发事件的控件, EventArgs 类型参数提供事件相关的信息。当按钮被点击时,这个方法将被调用并执行其内部的代码逻辑。

2.3 页面状态管理

2.3.1 视图状态(ViewState)的使用

在Web应用中,页面状态管理至关重要。ASP.NET通过 ViewState 来维持页面和控件状态。当一个页面被发送到客户端后, ViewState 会保存控件的状态信息,当页面回发到服务器时,这些信息被用于恢复控件的状态。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // 页面首次加载时的逻辑代码
    }
    else
    {
        // 页面回发时的逻辑代码
        // 这里可以访问ViewState来获取控件状态
        string myViewStateValue = ViewState["MyViewStateKey"].ToString();
    }
}

在该示例中, Page_Load 方法检查页面是否为回发( IsPostBack 属性)。如果是首次加载,执行特定逻辑;如果是回发,可以使用 ViewState 来获取和设置控件的状态信息。

2.3.2 控件状态与会话状态的区别

ViewState 是针对单个页面和控件的状态管理,而 Session 状态则提供了跨页面保持用户信息的能力。 Session 通常用于存储用户特定的信息,如登录状态、购物车内容等,而这些信息对于整个用户会话都是有效的。

Session["ShoppingCart"] = new ShoppingCart();

在上述代码中,一个购物车对象 ShoppingCart 被存储在 Session 中。在用户会话期间,可以在任何页面访问和修改这个对象,而 ViewState 通常仅在单个页面的生命周期内有效。

以上就是第二章节的核心内容,从页面请求的处理流程到事件驱动模型的机制,以及页面状态管理的深入解析,我们探索了ASP.NET页面生命周期中的关键点。下一章将介绍ASP.NET的核心组件——服务器控件模型,探讨如何高效地使用这些控件来构建强大的Web应用程序。

3. 服务器控件模型

3.1 服务器控件基础

3.1.1 服务器控件的分类和用途

ASP.NET中的服务器控件是用于构建动态Web页面的基本构件。它们运行在服务器端,并可以生成客户端能够识别的HTML标记。服务器控件的分类和用途包括:

  • HTML控件:这些控件生成标准的HTML标记,用于快速生成页面元素。
  • Web控件:提供更丰富的接口和事件处理,适用于复杂的场景。
  • 验证控件:用于确保用户输入满足特定要求,提供自动验证。
  • 数据绑定控件:用于显示和编辑数据源中的数据。

服务器控件的核心优势在于它们提供了一种抽象机制,使得开发者能够以编程的方式操作页面元素,而不是直接编写HTML代码。这极大地提高了Web应用程序的开发效率和可维护性。

3.1.2 标准服务器控件的属性和事件

服务器控件的属性和事件是实现页面功能的关键。通过这些属性和事件,开发者可以对控件进行设置和响应用户操作。以下是标准服务器控件的一些通用属性和事件:

  • ID : 控件的唯一标识符,用于在服务器端代码中引用控件。
  • runat : 指定控件在服务器端运行,其值为 "server"
  • Text Value : 分别用于存储文本内容或输入值。
  • On_Load : 页面加载时触发的事件。
  • On_Click : 点击控件时触发的事件。
  • On_Change : 控件内容发生变化时触发的事件。

使用属性和事件可以轻松地实现用户界面与后端逻辑的交互。例如,一个按钮控件的点击事件可以触发数据的保存或页面的跳转。

protected void submitButton_Click(object sender, EventArgs e)
{
    // 代码逻辑,例如保存数据
}

在上述示例中, submitButton_Click 是一个事件处理方法,当按钮被点击时会自动执行。

3.2 验证控件与用户输入

3.2.1 验证控件的种类和工作原理

验证控件是ASP.NET中用于自动检查用户输入的服务器控件。它们能够确保用户提交的数据符合预定义的规则,从而提高数据的质量和安全性。常见的验证控件包括:

  • RequiredFieldValidator : 确保用户填写了必填字段。
  • CompareValidator : 比较两个字段是否匹配或一个字段的值是否在指定范围内。
  • RegularExpressionValidator : 使用正则表达式检查输入格式。
  • CustomValidator : 允许开发者定义自己的验证逻辑。
  • RangeValidator : 确保输入值位于指定的数值范围内。

这些验证控件通过客户端和服务器端验证来确保用户输入的有效性。客户端验证通常使用JavaScript实现,提供即时反馈,而服务器端验证则在数据提交到服务器时进行。

3.2.2 用户输入验证的实际应用

在实际开发中,验证控件可以组合使用以满足复杂的输入验证需求。例如,当用户注册时,可能需要验证邮箱格式、密码强度、以及是否已接受服务条款。

下面是一个简单的用户注册验证示例:

<asp:TextBox ID="emailTextBox" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="emailRegex" runat="server" 
    ControlToValidate="emailTextBox" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" 
    ErrorMessage="请输入有效的电子邮件地址。" />
<asp:RequiredFieldValidator ID="emailRequired" runat="server" 
    ControlToValidate="emailTextBox" ErrorMessage="电子邮件是必填项。" />

在这个例子中, emailTextBox 文本框将用于输入电子邮件地址,两个验证控件确保输入的内容符合要求。如果输入不符合要求,相应的错误消息将显示给用户。

3.3 数据绑定控件

3.3.1 数据绑定控件的基本使用

数据绑定控件是ASP.NET用来显示数据集合的服务器控件,它们能够从数据源(例如数据库、XML文件)中自动提取数据并呈现给用户。基本使用步骤包括:

  1. 定义数据源:声明数据源,可以是数组、列表、DataTable等。
  2. 使用数据绑定语法:ASP.NET提供了一种数据绑定语法,允许开发者将数据源绑定到控件。
  3. 数据控件填充:控件通过绑定的数据源填充数据,如表格行、列表项等。

下面是一个简单的数据绑定示例,展示了如何将列表数据绑定到 GridView 控件:

<asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Age" HeaderText="Age" />
    </Columns>
</asp:GridView>
List<MyData> dataList = new List<MyData>
{
    new MyData { Name = "Alice", Age = 25 },
    new MyData { Name = "Bob", Age = 30 }
};
myGridView.DataSource = dataList;
myGridView.DataBind();

在此示例中, MyData 类包含 Name Age 属性,这些属性分别对应 GridView 中的列。通过 DataBind 方法, dataList 被绑定到 myGridView ,页面上将显示两行数据。

3.3.2 复杂数据结构的绑定技术

在面对更复杂的数据结构时,如对象的集合或层次数据,标准的数据绑定控件可能不足以直接展示。在这种情况下,需要采用一些高级技术来实现数据的展示:

  • 使用数据模板(Data Templates)自定义数据的显示方式。
  • 递归使用数据绑定控件来展示层次数据。
  • 使用第三方库或自定义控件以支持更复杂的数据展示逻辑。

举个例子,如果要展示一个包含嵌套列表的层次数据,可以在 GridView 中嵌套使用 Repeater 控件。

在实现这些复杂数据绑定技术时,开发者需要对数据结构和控件的绑定机制有深入理解,以便正确地将数据映射到用户界面。

4. 用户会话状态管理

4.1 状态管理机制概述

4.1.1 HTTP无状态特性的挑战

HTTP协议在设计之初就是一种无状态(stateless)的协议,这意味着每一个请求都是独立的,服务器不保留任何关于客户端的连接状态信息。这一特性在web应用中带来了一些挑战。例如,在一个典型的购物车场景中,用户添加了商品到购物车,如果服务器无法识别前后两次请求是同一个用户发起的,那么就无法在不同页面间保持购物车的状态。

为了应对这种无状态带来的限制,出现了多种会话状态管理技术,允许开发者在用户的多次请求之间保持状态信息。这些技术包括但不限于Cookie、URL重写、隐藏表单字段、会话状态(Session)和应用程序状态(AppState)等。

4.1.2 状态管理的技术选项

在ASP.NET中,状态管理技术的选择非常丰富。开发者可以根据应用的具体需求和环境,选择最合适的状态管理技术。

  • Cookie :在客户端存储状态信息。它容易实现,但受到存储大小的限制,且用户可以禁用Cookie。
  • URL重写 :将状态信息附加在URL后面。这种方法简单,但不安全,且限制了URL的长度和复杂性。
  • 隐藏表单字段 :将状态信息存储在HTML的隐藏表单字段中。这种方式适用于GET和POST请求,但不适合大量数据的存储。
  • 会话状态(Session) :在服务器端存储用户的状态信息。Session通常使用Cookie来标识特定的用户会话。
  • 应用程序状态(AppState) :在整个应用程序中共享状态信息,适用于所有用户。

4.2 会话状态(Session)和应用程序状态(AppState)

4.2.1 Session状态的原理和配置

Session状态管理机制允许开发者在服务器端存储与用户会话相关的数据,确保了数据的安全性和可靠性。在ASP.NET中,Session可以在Web.config文件中配置,或者在代码中动态设置。

Session状态的存储可以通过多种方式,包括:
- InProc :存储在服务器的内存中,访问速度快,但服务器重启会丢失。
- StateServer :通过独立的StateServer进程存储Session,支持跨服务器的Session共享。
- SQLServer :使用SQL Server数据库存储Session,提供了高可靠性和持久性。
- Custom :自定义存储机制,开发者可以根据需要自行实现Session存储。

<configuration>
  <system.web>
    <sessionState mode="InProc" timeout="20" />
  </system.web>
</configuration>

在上述配置中, mode 属性指定了Session的存储模式, timeout 属性定义了会话在多长时间后过期(单位为分钟)。

4.2.2 AppState的应用场景和实现

与Session状态不同,应用程序状态(AppState)适用于所有用户共享的数据,而不是特定用户的会话数据。在ASP.NET中,AppState是通过 System.Web.HttpApplicationState 类来访问的。

实现AppState的代码示例如下:

// 获取或设置全局应用程序状态项
Application["MyGlobalValue"] = "Hello World";

// 获取全局应用程序状态项
string appStateValue = Application["MyGlobalValue"] as string;

// 从全局应用程序状态中移除项
Application.Remove("MyGlobalValue");

在上述代码中,我们首先设置了一个全局的应用程序状态项 MyGlobalValue ,然后获取它,并最终从全局状态中移除它。这类状态信息适合存储如在线用户数量、网站配置信息等。

4.3 Cookie与缓存

4.3.1 Cookie的工作机制和安全问题

Cookie是一种在客户端存储小量数据的技术,常用于记住用户信息或会话标识。在用户首次访问网站时,服务器会发送一个或多个Cookie到客户端的浏览器。浏览器将这些Cookie存储在本地,并在随后的每一次请求中将它们发送给服务器。

Cookie的工作流程如下:
1. 服务器创建Cookie并发送给客户端。
2. 浏览器存储Cookie并在随后的请求中发送给服务器。
3. 服务器读取Cookie,获取状态信息。

然而,由于Cookie存储在客户端,它可能面临安全威胁,例如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。为了降低这些风险,应该对敏感信息加密存储,并限制Cookie的有效期。

4.3.2 缓存策略在ASP.NET中的应用

缓存是一种提高应用性能的有效方法,它减少了网络延迟、服务器负载和数据库访问次数。ASP.NET提供了多种缓存技术,包括页面输出缓存、数据缓存和缓存依赖。

  • 页面输出缓存 :可以存储整个页面或者页面的某一部分,减少页面生成的CPU和内存消耗。
  • 数据缓存 :可以存储程序数据,如数据库查询结果,以减少数据库访问。
  • 缓存依赖 :允许缓存项与外部资源(如数据库文件或XML文件)相关联,当这些资源发生变化时,相应的缓存项也会失效。

一个简单的数据缓存示例代码如下:

// 检查缓存中是否存在数据
var productInfo = (Product[])HttpRuntime.Cache["productInfo"];

if (productInfo == null)
{
    // 从数据源加载数据
    productInfo = LoadProductInfoFromDataSource();

    // 添加数据到缓存
    HttpRuntime.Cache.Insert("productInfo", productInfo, null,
                             DateTime.Now.AddMinutes(30), TimeSpan.Zero);
}

// 使用productInfo进行后续操作...

在这段代码中,我们首先尝试从缓存中获取 productInfo ,如果缓存项不存在,则从数据源加载数据并将其添加到缓存中。这里还指定了缓存项的绝对过期时间和优先级。

以上就是本章节的详细内容,通过介绍ASP.NET中用户会话状态管理的关键概念,我们深入探讨了HTTP无状态挑战、会话状态和应用程序状态的原理和配置方法,以及Cookie的工作机制和缓存策略的应用。理解并掌握这些概念和技术,对开发高性能、安全稳定的web应用至关重要。

5. 实战源代码分析

在这一章节中,我们将深入探讨ASP.NET中的实际代码应用,涵盖数据库交互、权限管理、C#编程实践以及网站功能模块的描述。通过对源代码的详细分析,我们可以加深对ASP.NET应用开发的理解。

5.1 数据库技术与交互

数据库操作是Web应用开发中不可或缺的一环,ASP.NET通过ADO.NET和LINQ等技术简化了数据库的交互操作。

5.1.1 ADO.NET的使用技巧

ADO.NET是.NET框架中用于数据访问的组件,它为数据访问提供了一种断开连接的、基于XML的模型。以下是一些常见的ADO.NET使用技巧:

  • 连接管理 :使用 SqlConnection 对象来管理数据库连接,并通过 using 语句来确保连接的正确关闭和释放资源。
  • 命令执行 :通过 SqlCommand 对象来执行SQL命令或存储过程,以及从数据库中检索数据。
  • 数据读取 :使用 SqlDataReader 对象来顺序访问数据流。
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM Products";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                string name = reader["ProductName"].ToString();
                decimal price = (decimal)reader["UnitPrice"];
                // 处理数据...
            }
        }
    }
}

5.1.2 LINQ技术在数据操作中的应用

LINQ(Language Integrated Query)是.NET语言集成查询功能,它允许开发者以声明式的方式操作数据。以下是LINQ在数据操作中的应用示例:

  • 查询语法 :使用查询表达式来进行数据筛选和排序。
  • 方法语法 :利用Lambda表达式进行数据处理。
var products = from p in context.Products
               where p.Price > 10.00
               orderby p.Price
               select p;

// 或者使用方法语法
var expensiveProducts = context.Products.Where(p => p.Price > 10.00).OrderBy(p => p.Price);

5.2 权限管理与安全防护

安全性是ASP.NET应用开发中的一个重点。实现有效的权限管理和安全防护,可以保护应用免受常见的网络攻击。

5.2.1 实现基于角色的安全模型

ASP.NET提供了基于角色的安全模型,允许对用户的角色进行管理,并基于角色来控制资源的访问权限。

  • 角色定义 :在 web.config 文件中定义角色。
  • 授权规则 :使用 <authorization> 元素定义哪些角色可以访问特定资源。
<system.web>
    <roleManager enabled="true" defaultProvider="SqlRoleManager" />
    <authentication mode="Forms" />
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
</system.web>

5.2.2 SQL注入防范与XSS防护

为防止SQL注入和跨站脚本攻击(XSS),需要在开发过程中采取一些措施:

  • 参数化查询 :使用参数化命令来避免SQL注入。
  • 输出编码 :对输出到浏览器的所有数据进行HTML编码以防止XSS。
// 使用参数化查询防止SQL注入
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserName = @name", conn);
cmd.Parameters.AddWithValue("@name", username);

5.3 C#编程语言应用

C#是ASP.NET应用开发的主要编程语言,它提供了丰富的面向对象编程特性。

5.3.1 C#在ASP.NET中的核心用法

C#在ASP.NET中用于编写后端逻辑,包括页面逻辑和事件处理等。

  • 类和对象 :C#中的类定义对象的属性和方法。
  • 事件处理 :ASP.NET页面的事件(如按钮点击)通过事件处理程序来响应。

5.3.2 面向对象编程在Web开发中的实践

面向对象编程(OOP)的概念如封装、继承和多态性,在Web开发中同样适用。

  • 封装 :隐藏对象的内部状态和实现细节,只暴露操作接口。
  • 继承 :通过继承来扩展类的功能。
  • 多态性 :通过接口或抽象类实现代码的多态性。

5.4 实训网站模块功能描述

在ASP.NET项目实训中,我们需要根据用户需求设计和实现网站的功能模块。

5.4.1 材料管理系统的功能模块划分

在材料管理系统中,功能模块可能包括用户登录、材料入库、材料出库等。

  • 用户登录模块 :验证用户身份。
  • 材料入库模块 :记录材料的入库信息。
  • 材料出库模块 :管理材料的出库流程。

5.4.2 用户界面设计与用户体验优化

良好的用户界面和体验对于应用的成功至关重要。

  • UI设计原则 :遵循一致性、简洁性和可用性的设计原则。
  • 用户体验优化 :通过用户反馈不断优化设计,提升用户满意度。

5.5 ASP.NET MVC模式

ASP.NET MVC模式提供了模型(model)、视图(view)和控制器(controller)的分离,使得Web应用的架构更加清晰。

5.5.1 MVC模式的优势和应用领域

MVC模式的优势在于它提高了应用的可测试性和可维护性。

  • 代码可测试性 :MVC将业务逻辑与用户界面分离,使得单元测试变得更加容易。
  • 可维护性 :清晰的分层减少了各部分之间的依赖,便于维护和扩展。

5.5.2 实现MVC模式的代码组织和视图管理

在实现MVC模式时,合理组织代码和管理视图至关重要。

  • 控制器创建 :创建用于处理用户请求的控制器。
  • 视图选择 :根据业务逻辑选择合适的视图进行渲染。
public class ProductsController : Controller
{
    public ActionResult Index()
    {
        var model = new ProductViewModel(); // Model for this view
        return View(model); // Render the view using the model
    }
}

以上章节内容详细介绍了在ASP.NET开发中的源代码分析,包括数据库交互、权限管理与安全防护、C#编程实践、实训网站模块功能描述以及MVC模式的实现。通过这些内容,我们可以更加深入地了解和掌握ASP.NET应用开发的实践技能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:ASP.NET是一个用于构建动态Web应用程序的开发平台。本实训材料管理网站源代码为开发者提供全面的学习资源,涵盖页面生命周期管理、控件模型、状态管理、数据绑定和MVC模式等核心特性。通过实践网站的模块化设计,如登录注册、分类管理、文件上传下载、搜索功能、权限管理、报表统计和安全防护,开发者可以掌握ASP.NET在实际项目中的应用,并提升数据库交互和安全性理解。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值