ASP.NET CORE 学习笔记

1.LINQ 查询

LINQ(Language-Integrated Query)是一种在 .NET 平台上进行数据查询和操作的统一编程模型。它可以用于查询和操作各种数据源,如集合、数组、数据库以及 XML 等。

LINQ 查询通过使用类似 SQL 的语法来进行数据查询,并利用 C# 或 Visual Basic 的语言特性进行数据操作。下面是一个简单的 LINQ 查询的示例:

// 假设有一个包含学生信息的列表
List<Student> students = new List<Student>
{
    new Student { Name = "Alice", Age = 20, Major = "Computer Science" },
    new Student { Name = "Bob", Age = 21, Major = "Mathematics" },
    new Student { Name = "Charlie", Age = 19, Major = "Physics" }
};

// 使用 LINQ 查询语法查询所有年龄大于等于20岁的学生
var query = from student in students
            where student.Age >= 20
            select student;

// 遍历查询结果并输出学生姓名
foreach (var student in query)
{
    Console.WriteLine(student.Name);
}

在这个示例中,我们利用 LINQ 查询语法从 students 列表中筛选出年龄大于等于 20 岁的学生,并将查询结果存储在名为 query 的变量中。然后,通过 foreach 循环遍历查询结果,并输出学生的姓名。

LINQ 还提供了一些其他的查询运算符,如 selectwhereorderbygroupby 等,以及方法形式的查询。通过这些查询运算符和方法,您可以以一种统一和直观的方式对数据进行查询和操作。

需要注意的是,LINQ 查询可以用于不同类型的数据源,包括 LINQ to Objects(用于查询内存中的对象集合)、LINQ to SQL(用于查询数据库)、LINQ to XML(用于查询 XML 数据)等。根据具体的应用场景和数据源类型,您可以选择适合的 LINQ 提供程序来执行查询操作。

2.@RenderBody()

@RenderBody() 是一个在 Razor 视图引擎中使用的指令。它用于渲染主体内容,在 Razor 视图中使用该指令会将主体内容插入到特定位置。

具体而言,当使用布局视图时,@RenderBody() 用于在主体视图中显示内容。主体视图是基于布局视图的子视图,@RenderBody() 指令会将子视图中的内容插入到布局视图中的相应位置。这样可以实现布局和内容的分离。

请注意,@RenderBody() 只能在主体视图中使用,而不能在布局视图中使用。在布局视图中,可以使用@RenderSection() 指令来定义和渲染具体的节(sections) 。@RenderBody() 和 @RenderSection() 是 Razor 视图引擎为实现布局和内容分离提供的两个重要指令。

3.LINQ to Entities

LINQ to Entities 是一种 Microsoft .NET Framework 中的数据访问技术,它允许使用 LINQ 语言查询 Entity Framework 提供的对象关系映射 (ORM) 数据库。Entity Framework 是一个开源的 ORM,使开发人员能够使用 NET 应用程序中的对象来操作数据库。

在使用 LINQ to Entities 时,可以使用 LINQ 查询语句来查询数据,这些查询会被翻译成 SQL 语句并在数据库中执行。这种方式的优点是可以使用一种熟悉的语言 (即 C# 或 VB.NET) 来查询数据,而无需学习新的数据库查询语言。

在 LINQ to Entities 中,实体对象通常由代码自动生成,实体类型对应数据库中的表或视图,每个实体类型的属性对应表中的列。通过定义 Entity Framework 中的 DbContext 类,可以访问数据库中的各个表/视图,并进行增删改查等操作。由于 Entity Framework 支持多表关联和继承等复杂特性,因此 LINQ to Entities 也能很好地支持这些特性。

4.ado.net是什么

ADO.NET 是 Microsoft .NET 平台中的一种用于访问数据库的技术,是 ActiveX 数据对象(ADO)的升级版。它提供了一种简单、一致的方式来访问各种关系型数据库(如 SQL Server、Oracle、MySQL 等),并将它们的数据转换为数据集(DataSet)和数据表(DataTable)进行处理。

ADO.NET 主要由以下几个组件构成:

  1. Connection:表示与数据库的连接,并提供一些设置连接的属性和方法。

  2. Command:表示在数据源上要执行的操作(如查询、插入、更新等),并提供一些设置和执行命令的属性和方法。

  3. DataReader:提供只读的方式来读取来自数据源的数据,它支持向前遍历数据,但不支持更新数据。

  4. DataSet 和 DataTable:DataSet 表示一组 DataTable,而 DataTable 则表示单个数据库表。它们支持在内存中存储数据库中的数据,并支持对数据的修改和更新。

  5. DataAdapter:通过填充数据集(DataSet)来执行与数据源之间的数据交换,支持对数据进行更新。

ADO.NET 提供了丰富的功能,使得开发人员能够轻松访问不同的数据库,并对数据库进行数据操作。同时,由于 ADO.NET 是基于 .NET 平台的,它能够与其他 .NET 开发技术如 ASP.NET、Windows Forms 等融合,从而使得数据访问和显示逻辑的开发变得更加容易和灵活。

5.entity framework core

Entity Framework Core 是 Microsoft 提供的用于 .NET 开发的一种对象关系映射(ORM)框架。它是 Entity Framework 的最新版本,专为跨平台和轻量级应用程序开发而设计。

Entity Framework Core 旨在简化与关系数据库的交互,并提供了许多功能,包括:

  1. 对象关系映射:EF Core 允许开发人员将数据库中的表、视图和存储过程映射到 .NET 中的实体对象,使得开发人员可以使用面向对象的方式操作数据库。

  2. 数据访问:EF Core 提供了强大的查询语言(LINQ)和方法链,使得开发人员可以直接在代码中编写查询,而无需编写复杂的 SQL 语句。

  3. 自动迁移:EF Core 的迁移功能可以根据实体类的变化自动更新数据库结构,从而简化了数据库的版本管理和升级。

  4. 跨数据库支持:EF Core 支持多种关系数据库,如 SQL Server、MySQL、Oracle、SQLite 等,使得开发人员可以轻松切换不同的数据库引擎。

  5. 轻量级设计:与前代的 Entity Framework 相比,EF Core 更加轻量级,并且在性能方面有所提升。它利用了新的设计和模块化结构,以满足现代应用程序的需求。

Entity Framework Core 是一个强大而灵活的 ORM 框架,使得开发人员能够更加便捷地进行数据库操作,并提高开发效率。它广泛应用于 .NET Core 和 .NET 5 及以上版本的应用程序开发中。

6.orm框架

ORM(Object Relational Mapping,对象关系映射)框架是一种将数据库表转换成对象,以对象为基础进行数据操作的技术。ORM 将数据库操作转化成与对象相关的操作,对开发人员屏蔽了 SQL 语句和数据库操作,使得开发人员能够以面向对象的方式来进行数据库操作,从而大大提高了开发效率和代码的可维护性。

ORM 框架通常提供以下几个主要功能:

  1. 对象 - 表映射:将数据库表映射成对象。

  2. CRUD 操作:简化对关系型数据库的查询、添加、更新和删除操作。

  3. 聚合函数、排序和分页:提供高级查询功能,包括聚合函数、排序和分页功能等。

  4. 数据操作事务:支持事务,保证开发人员的数据库操作的原子性和隔离性。

  5. 缓存:ORM 框架通常还提供一些缓存机制,用于提高数据查询效率。

ORM 框架有很多种,如 Entity Framework、Hibernate、MyBatis 等。不同的 ORM 框架有其不同的实现机制和使用方式,开发者需要选择最适合自己的 ORM 框架。

ORM 框架虽然能够为开发人员提供方便,但是也存在性能损失的问题。开发人员在选择 ORM 框架时,需要考虑性能和使用便利度的平衡问题。

9.数据库先行

"数据库先行"是一种软件开发的设计思想或原则,强调在开发过程中首先设计和建立数据库结构,然后再进行应用程序的开发。

在采用数据库先行的开发方式中,开发者首先进行数据库的设计和建模,包括定义实体、关系、属性和约束等。然后,通过数据库管理系统(DBMS)创建相应的数据库和表结构,并定义它们之间的关系。这样,数据库成为应用程序的核心组成部分,开发者可以以数据模型为基础,直接从数据库中获取和处理数据。

通过数据库先行的开发方式,可以获得以下优势:

  1. 数据驱动开发:以数据为中心进行开发,确保应用程序与数据库的一致性和完整性。

  2. 数据结构和关系的清晰性:通过数据库模型的定义,可以明确数据实体之间的关系和数据处理的规则,提高应用程序的可维护性和可扩展性。

  3. 提高开发效率:数据库先行可以减少从零开始开发的工作量,避免了手动创建和管理数据存储的繁琐过程。

  4. 数据安全性和一致性:通过数据库的约束和事务支持,可以确保数据的安全性和一致性。

然而,数据库先行也有一些限制和注意事项。例如,对于快速迭代和需求变更频繁的项目,数据库结构的设计可能变得相对固定和难以修改。因此,在使用数据库先行时,需要确保对需求的充分了解,并进行适当的规划和设计,以便在后续开发过程中灵活应对变化。

10.db first

“DB first”是一种以数据库为先的开发方式,与“Code first”相对应,强调在开发过程中以现有数据库为基础,生成相应的实体类和代码进行开发。

在使用“DB first”方式开发时,首先需要有一个已经存在的数据库,然后通过相应的工具从数据库中扫描生成对应的实体类和代码模板,从而节省编写实体类和重复代码的时间。这些生成的实体类和代码可以很方便地进行扩展和修改,并且与现有数据库结构保持同步。通常在“DB first”方式下,会使用一些 ORM(Object Relational Mapping,对象关系映射)框架和工具来辅助实现。

相对于 “Code first” 方式,使用“DB first”的优势在于:

  1. 节约时间:不需要编写实体类和数据库表结构,减少了部分工作量,并且可以直接利用已有的数据结构和数据。

  2. 同步更新:可以保证应用程序与数据库之间的数据结构同步更新,减少因修改数据库而修改实体类引起的麻烦。

  3. 简易维护:因为实体类与数据库结构有一一对应关系,修改数据库的表结构时,也能更加方便的修改实体类,相对于手写实体类来说,维护成本降低。

需要注意的是,“DB first”也有其缺点,例如:

  1. 生成的实体类和代码可能不够优雅或高效,需要进行进一步的优化。

  2. 数据库的修改可能会影响现有数据,需要特别注意该情况。

  3. 在进行代码和实体类的扩展时,需要仔细考虑与现有数据库结构之间的关系,以免造成冲突。

综上所述,“DB first”是一种以数据库为中心的开发方式,可以减少一定的工作量,但也需要考虑到其缺点和注意事项,以便更好地使用该方式进行开发。

11.什么是导航属性

导航属性(Navigation Property)是在对象关系映射(ORM)中使用的一个概念,用于表示实体类之间的关联关系。导航属性提供了一种直观的方式来在实体类之间导航和访问关联的对象。

在一个关系数据库中,表之间往往存在各种关联关系,如一对一、一对多和多对多等。通过导航属性,ORM框架可以自动地将这些关系转换为对象之间的关联关系。

举个例子,假设有两个实体类:Author(作者)和 Book(书)。在数据库中,可以将它们之间的关系建模为 “一个作者可以写多本书” 的一对多关系。在实体类中,可以通过导航属性来表示这个关系:

public class Author
{
    // 其他属性...
    
    public ICollection<Book> Books { get; set; }
}

public class Book
{
    // 其他属性...
    
    public Author Author { get; set; }
}

在上面的代码中,Author 类包含一个类型为 ICollection<Book> 的导航属性 Books,表示一个作者可以拥有多本书。而 Book 类包含一个类型为 Author 的导航属性 Author,表示一本书所属的作者。

通过导航属性,我们可以方便地在对象之间进行导航和访问关联的对象。比如,可以通过 Author 对象的 Books 属性来访问该作者写的所有书籍,或者通过 Book 对象的 Author 属性来访问该书的作者信息。

导航属性使得在进行实体对象之间的关联操作时更加方便和直观,简化了代码的编写和维护,提高了开发效率。它是 ORM 框架中常用的概念之一,帮助开发者更好地处理实体对象之间的关联关系。

12.什么是数据库连接池

数据库连接池(Database Connection Pool)是一种用于管理数据库连接和提高应用程序性能的技术。在应用程序与数据库之间建立连接时,数据库连接池会预先创建一定数量的数据库连接,并将这些连接提供给应用程序使用,当应用程序需要与数据库通信时,从连接池中获取一个可用的连接,使用完毕后归还给连接池。

数据库连接的创建、销毁和管理是资源消耗较大的操作,频繁地创建和关闭连接会影响应用程序的性能。数据库连接池的作用是避免频繁创建和关闭连接,复用已经创建的连接,从而减少了连接创建和关闭的开销,提高数据库访问效率。

数据库连接池通常包含以下组件和功能:

  1. 连接池管理器:负责创建、销毁和管理数据库连接的组件。它会维护一定数量的数据库连接,并提供获取和释放连接的接口。

  2. 连接池参数配置:可以配置连接池的初始连接数、最大连接数、超时时间等参数,以适应不同应用程序的需求。

  3. 连接状态管理:连接池会跟踪和管理连接的状态,包括连接是否空闲可用、连接是否正在使用等。

  4. 连接回收和超时处理:对于长时间没有使用的连接,连接池可以定期回收或关闭这些闲置连接,防止连接占用过多资源。

通过使用数据库连接池,应用程序可以有效地管理和利用数据库连接资源,避免了频繁创建和关闭连接的开销,提高了数据库访问的性能和效率。同时,连接池还可以控制数据库连接的数量,避免连接过多导致数据库性能下降或资源耗尽的问题。

需要注意的是,为了正确地使用连接池,开发者需要遵守相应的最佳实践。例如,应当及时归还连接,避免连接泄漏;合理配置连接池参数,以满足应用程序的需求;根据具体情况设置适当的连接超时时间等。这样可以更好地利用数据库连接池,并确保应用程序运行的稳定性和性能。

13.如何使用asp.net core mvc写一个登录页

要使用 ASP.NET Core MVC 编写一个登录页,您可以按照以下步骤进行操作:

  1. 创建一个新的 ASP.NET Core Web 应用程序项目。
  2. 在项目模板选择器中选择 “ASP.NET Core Web 应用程序”。
  3. 选择一个名称和位置来保存您的项目并单击“创建”。
  4. 在下一个对话框中,选择“Web 应用程序(Model-View-Controller)”模板并单击“创建”。
  5. 在“解决方案资源管理器”中,找到 Views 文件夹并创建一个名为 Account 的文件夹。
  6. 在 Account 文件夹中创建一个名为 Login.cshtml 的视图文件。
  7. 在 Login.cshtml 视图文件中编写HTML和表单代码来设计登录页面。例如:
@model LoginViewModel

<h2>登录</h2>

<form asp-action="Login" method="post">
    <div>
        <label asp-for="Username">用户名:</label>
        <input asp-for="Username" />
    </div>
    <div>
        <label asp-for="Password">密码:</label>
        <input asp-for="Password" />
    </div>
    <button type="submit">登录</button>
</form>
  1. 在控制器文件夹中创建一个名为 AccountController 的控制器。
  2. 在 AccountController 中创建一个 Login 动作方法和相应的 HTTP GET 和 POST 方法,用于处理登录请求。例如:
public class AccountController : Controller
{
    [HttpGet]
    public IActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Login(LoginViewModel model)
    {
        // 处理登录逻辑
        // 验证用户名和密码是否正确
        // 根据需要进行重定向或返回特定视图

        if (ModelState.IsValid)
        {
            // 登录成功
            // 可以进行重定向到其他页面
            return RedirectToAction("Index", "Home");
        }

        // 登录失败
        // 可以显示验证错误消息,并返回登录页
        ModelState.AddModelError("", "用户名或密码错误");
        return View(model);
    }
}
  1. 创建一个名为 LoginViewModel 的模型类,用于存储登录表单的字段。例如:
public class LoginViewModel
{
    public string Username { get; set; }

    public string Password { get; set; }
}
  1. 运行应用程序,并在浏览器中访问登录页面。

通过上述步骤,您可以使用 ASP.NET Core MVC 编写一个简单的登录页,并处理登录请求。根据您的需求,您可以添加更多的验证逻辑以及其他功能,例如记住登录状态、密码重置等。

14.如何在layout页面中添加子页面

要在ASP.NET Core MVC的布局(layout)页面中添加子页面,您可以按照以下步骤进行操作:

布局页面 (_Layout.cshtml) 是整个应用程序中共享的主要页面。子页面则是使用布局页面作为基础,并与其结合显示内容。

请根据以下步骤进行操作:

  1. 打开布局页面 (_Layout.cshtml) 文件。在通常的情况下,它位于 Views/Shared 文件夹中。

  2. 决定子页面的显示位置。在布局页面中,找到您希望显示子页面的位置,并在相应位置添加占位符。通常,这是通过添加 @RenderBody() 方法来实现的。将其放在适当的位置,例如:

<!DOCTYPE html>
<html>
<head>
    <title>My Application</title>
    <!-- 其他头部内容 -->
</head>
<body>
    <!-- 其他页面结构 -->
    
    <div id="main-content">
        @RenderBody()
    </div>
    
    <!-- 其他脚本文件 -->
</body>
</html>
  1. 创建一个子页面 (Example.cshtml)。在适当的位置创建和设计子页面。请注意,子页面不需要包含完整的 HTML 结构,因为它将被插入到布局页面中。例如,只需包含所需的内容,不需要完整的头部和脚部信息。

  2. 在子页面中指定布局页面。在子页面的头部使用 @ 符号和 @Layout 指令来指定要使用的布局页面。例如:

@{
    Layout = "_Layout";
}
 
<!-- 子页面的内容 -->
<h1>子页面内容</h1>
<p>这是一个示例子页面。</p>
  1. 运行应用程序,并导航到对应的子页面,检查布局页面和子页面是否正常显示。

通过上述步骤,您可以在ASP.NET Core MVC中的布局页面中添加子页面。布局页面充当了整个应用程序中共享的主要模板,而子页面则包含特定的内容,它们会插入到布局页面的占位符位置。

15.如何在asp.net core mvc中使用code first

在ASP.NET Core MVC中使用Code First方法来定义和创建数据库有以下步骤:

步骤 1: 定义模型类

首先,您需要定义模型类。这些模型类将反映您的数据库中的表结构。每个模型类将成为数据库中的一个表。

例如,假设您有一个Product模型类:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

步骤 2: 定义数据库上下文

接下来,您需要定义数据库上下文类,它将继承自DbContext类。这个上下文类将用于与数据库交互,并包含对数据库的查询和操作。

例如,创建一个AppDbContext上下文类:

public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("YourConnectionString"); // 替换为您的实际连接字符串
    }
}

在这个上下文类中,您可以使用DbSet属性定义数据库中的表,例如上面的例子中的Products表。

步骤 3: 配置和应用迁移

接下来,您需要为模型创建一个迁移,并将其应用于数据库。运行以下命令来生成迁移:

dotnet ef migrations add InitialCreate

这将在项目中生成一个迁移文件,其中包含对应模型的定义。

然后,运行以下命令来应用迁移并创建数据库:

dotnet ef database update

这将应用迁移,根据模型类创建数据库和表。

步骤 4: 使用模型和数据库上下文

现在,您可以在控制器或其他类中使用模型和数据库上下文进行数据查询和操作。

例如,在控制器中查询所有产品:

public class ProductController : Controller
{
    private readonly AppDbContext _dbContext;

    public ProductController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IActionResult Index()
    {
        var products = _dbContext.Products.ToList();
        return View(products);
    }
}

在这个例子中,我们注入了AppDbContext到控制器的构造函数中,并在Index方法中使用它来查询所有产品。

通过以上步骤,您就可以在ASP.NET Core MVC项目中使用Code First方法来定义和创建数据库。请注意,您需要安装Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServer等相关的NuGet包来支持数据库操作和迁移。

16.ADO.NET 三层架构

ADO.NET 三层架构是指将数据访问的相关操作分成三层:表示层、业务逻辑层和数据访问层(也称作数据层)。这种架构模式被广泛使用,以帮助开发人员将不同层次的逻辑分离,以简化代码结构,提高代码可维护性和可伸缩性。

下面是ADO.NET 三层架构的三个层级:

  1. 表示层:表示层是用户与系统之间的接口层。用户通过表示层与应用程序进行交互,输入或接收数据。表示层通常使用 Web 应用程序或桌面应用程序来实现。

  2. 业务逻辑层(BLL):业务逻辑层是应用程序的中间层,它是表示层和数据访问层之间的桥梁。业务逻辑层包含应用程序的业务逻辑和数据处理逻辑,它负责将数据从表示层传输到数据访问层,并处理业务逻辑。

  3. 数据访问层(DAL):数据访问层是应用程序的底层层级,它负责与数据库进行交互。数据访问层包含数据库访问逻辑,例如 SQL 查询和表操作。它负责读取、写入和更新数据库中的数据。

在 ADO.NET 三层架构中,数据访问代码和业务逻辑代码被分开,使得应用程序变得易于维护和排错。通过将业务逻辑层从数据访问层中分离,开发者可以更容易地修改和重用代码,并提高代码的可读性和可复用性。

17.IQueryable<>

IQueryable<> 是一个泛型接口,可以用于对数据源进行查询操作的定义。它继承自 IEnumerable<> 泛型接口,因此它也可以执行基于枚举的查询操作。不同的是,IQueryable<> 接口支持对能够被转化为查询的数据源进行更深层次的查询操作,它支持 Linq to Entities,这让它更适合进行数据库查询。

IQueryable<> 接口定义了一些方法,比如 Where()OrderBy() 和 Select() 等,这些方法可以在查询中执行过滤、排序和投影操作。在执行这些方法时,IQueryable<> 不会立即执行查询,而是生成一个表达式树,该表达式树可以在稍后执行查询时被翻译成相应的查询操作,从而提升查询效率。

总之,IQueryable<> 接口提供了更高级、更灵活的查询方式,允许 IQueryable 的实现进行更多更深入的优化,提高了查询性能和可扩展性。

18.IQueryable<Book>;

IQueryable<Book> 是一个泛型接口,其中 Book 是待查询实体类型。

该接口提供了对查询进行延迟、过滤、分组、排序和投影(仅选择部分属性)等操作的支持。IQueryable 将查询表达式表示为表达式树,这使得查询可以在运行时动态构建和修改。

可以通过 LINQ 语言来执行基于该接口的查询。LINQ 允许从支持 IQueryable 的数据源,如数据库、XML 文档和对象集合等中查询数据。

19.什么是webapi

Web API(应用程序编程接口)是一种编程接口或协议,它允许应用程序之间进行通信,以便它们可以相互交换数据或服务。Web API在Web服务器上运行,通常使用HTTP协议来提供数据或服务。 它们为开发人员提供了一种简单的方式来构建基于Web的应用程序,并允许不同的应用程序通过Web互相访问和共享数据和服务。常见的Web API包括RESTful API和SOAP API。

20.restful参数

在RESTful API中,参数可以通过URL路径、查询参数、请求头或请求体进行传递。以下是常见的RESTful API参数类型:

  1. 路径参数(Path Parameters):将参数直接包含在URL路径中。例如,/users/{id}中的{id}就是一个路径参数,用于指定请求的特定资源。

  2. 查询参数(Query Parameters):将参数作为键值对添加到URL的查询字符串中。它们通常用于过滤、分页或排序等操作。例如,/users?name=John&age=25中的nameage就是查询参数。

  3. 请求头参数(Header Parameters):将参数作为HTTP请求的头部信息传递。这些参数用于传递与请求相关的元数据。例如,Content-Type用于指定请求体的数据类型。

  4. 请求体参数(Request Body Parameters):将参数作为请求的主体进行传递。这通常用于传递结构化的数据,例如JSON或XML格式的数据。

根据具体的API设计和需求,可以选择适合的参数类型进行数据传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值