您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
GPS定位系统-VUE
ASP.NET+VUE GPS定位系统介绍(物联网) 系列源码下载页 asp.net 新建web api工程 asp.net 集成必要的组件和注入 asp.net 集成 EFCore mysql 数据库操作类 asp.net 自定义GPRS通讯协议 asp.net 集成 Tcp Server 服务 asp.net 添加web api接口 asp.net 补充功能 新建VUE工程 vue工程添加项目文件 新建Windows Server 2022虚拟机 Windows Server 2022 IIS运行环境配置 ASP.NET IIS发布 VUE工程 IIS发布 ASP.NET Docker发布(额外内容) VUE Docker发布(额外内容) 结束语(VUE框架)
asp.net 新建web api工程
asp.net 集成 EFCore mysql 数据库操作类
激萌の小宅 小宅博客 GPS定位系统-VUE

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

asp.net 集成必要的组件和注入

        工程源码下载:GPS定位系统VUE版本源码下载

        在上一节中,我们已经新建了工程,这一节中,我们需要在工程中添加自己的控制器模块,以及jwt,来实现api的权限控制。


新增控制器

        首先在Controllers目录下新增“HomeController.cs”和“LoginController.cs”两个文件; LoginController.cs用于编写用户登录所需要的所有api,不做jwt权限控制;HomeController.cs用于编写地图数据和报表数据的api,需要支持jwt权限控制。

        然后删除项目中的“WeatherForecastController.cs”和“WeatherForecast.cs”两个文件,这是项目自带的,没啥用。

        

HomeController.cs 内容如下:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace WebApplicationApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize]
    public class HomeController : Controller
    {
        private readonly IConfiguration configuration;
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
        {
            this.configuration = configuration;
            this._logger = logger;
        }
    }
}


LoginController.cs 内容如下:

using Microsoft.AspNetCore.Mvc;

namespace WebApplicationApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoginController : Controller
    {
        private readonly IConfiguration configuration;
        private readonly ILogger<LoginController> _logger;

        public LoginController(ILogger<LoginController> logger, IConfiguration configuration)
        {
            this.configuration = configuration;
            this._logger = logger;
        }
    }
}


修改appsettings.json配置

修改appsettings.json配置文件,新增的配置项一共有三个。

1、jwt配置,用于设置jwt生成密钥以及有效期,我们这里设置有效期为24个小时。

2、数据库和tcp通讯配置,数据库连接我们这边配置的是mysql的地址信息,我这里配置的是本地地址localhost。另一个tcp配置是用于gps通讯用的连接地址信息。

3、日志输出的路径信息,用于输出系统日志,输出地址是“wwwroot/applogs/”目录,这个目录我们需要手动新建一下,日志按每日一个文件的形式进行保存。

{
  // 1、系统默认配置,不要动
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  // 2、JWT配置信息
  "JWT": {
    "SecretKey": "AAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCC", // 私钥
    "Issuer": "http://localhost:5059", //发布者
    "Expires": "24", // 有效期设置
    "Audience": "http://localhost:5059" //接收者
  },

  // 3、数据库和tcp通讯配置
  "ConnectionStrings": {
    "mysql": "Server=localhost;port=3306;Database=GpsDemo;Uid=root;Pwd=123456;persistsecurityinfo=True;Character Set=utf8",
    "tcp": "127.0.0.1:2234"
  },

  // 4、日志输出路径信息
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "shared": true,
          "rollingInterval": "Day",
          "restrictedToMinimumLevel": "Information",
          "path": "wwwroot/applogs/logs.txt",
          "outputTemplate": "{Timestamp:yyyy/MM/dd HH:mm:ss.fff zzz} {Application} [{Level}] {Message}{NewLine}{Exception}"
        }
      }
    ]
  }
}


添加完之后,就是下面这个样子了。

QQ截图20240725110102.jpg


修改Program.cs配置

        为了方便大伙理解,我这边直接提供完整的Program.cs配置信息,我在代码中做注释讲解。

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Quartz;
using Serilog;
using Serilog.Events;
using System.Text;

namespace WebApplicationApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            #region JWT功能配置
            // 需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 6.0.29版本的组件

            builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    //验证发布者
                    ValidateIssuer = true,
                    ValidIssuer = builder.Configuration["JWT:Issuer"],
                    //验证接收者
                    ValidateAudience = true,
                    ValidAudience = builder.Configuration["JWT:Audience"],
                    //验证是否过期
                    ValidateLifetime = true,
                    //验证私钥
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))
                };
            });

            // 配置Swagger身份验证输入
            builder.Services.AddSwaggerGen(options =>
            {
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "Value: Bearer {token}",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    BearerFormat = "JWT",
                    Scheme = "Bearer",
                });
                //添加安全要求
                options.AddSecurityRequirement(new OpenApiSecurityRequirement {
                    {
                        new OpenApiSecurityScheme{
                            Reference =new OpenApiReference{
                                Type = ReferenceType.SecurityScheme,
                                Id ="Bearer"
                            }
                        },new string[]{ }
                    }
                });
                
                //SwaggerUI 添加中文注释提示
                string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
                string xmlPath = "WebApplicationApi.xml"; // WebApplicationApi.xml文件就是在项目属性里面配置的文件名
                string commentsFile = Path.Combine(baseDirectory, xmlPath);
                //将注释的XML文档添加到SwaggerUI中
                options.IncludeXmlComments(commentsFile);
            });

            #endregion

            # region 配置跨域服务
            builder.Services.AddCors(options =>
            {
                options.AddPolicy("cors", p =>
                {
                    p.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });
            });
            #endregion

            #region job服务
            // 需要安装 Quartz.Extensions.Hosting 最新版 3.11.0 的组件
            // 博主这里没用到这个功能,只是保留,给大伙做个演示
            // 定时设置方法:https://blog.51cto.com/u_11990719/3241430
            builder.Services.AddQuartz(q =>
            {
                q.SchedulerId = "Scheduler-Core";
                q.UseDefaultThreadPool(tp => { tp.MaxConcurrency = 10; });
                //q.ScheduleJob<JobDemo1>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
                //q.ScheduleJob<JobDemo2>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
            });

            builder.Services.AddQuartzHostedService(options =>
            {
                options.WaitForJobsToComplete = true;
            });
            #endregion

            #region 配置html
            // 配置这个,可以在控制器中获取到访问者的IP等信息,博主暂时没用到,这里做保留学习用
            builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            #endregion

            #region 解决网站右键查看源码时,乱码问题,这个可有可无,保留做学习用
            builder.Services.Configure<Microsoft.Extensions.WebEncoders.WebEncoderOptions>(options =>
            {
                options.TextEncoderSettings = new System.Text.Encodings.Web.TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All);
            });
            #endregion

            #region 添加日志服务
            // 添加日志服务,这个需要安装 Serilog.AspNetCore 最新版 8.0.1 的组件
            builder.Logging.ClearProviders();

            // 配置注入
            var configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .AddEnvironmentVariables()
               .Build();

            // 日志注入
            var logger = new LoggerConfiguration()
                            .ReadFrom.Configuration(configuration)
                            .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                            .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
                            .MinimumLevel.Override("Serilog", LogEventLevel.Error)
                            .Enrich.FromLogContext()
                            .CreateLogger();

            Log.Logger = logger;
            builder.Logging.AddSerilog(logger);
            builder.Host.UseSerilog();
            #endregion

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
                //app.UseDeveloperExceptionPage(); // 配置异常中间件
            }

            //跨域
            app.UseCors("cors");     
            app.UseHttpsRedirection();

            //添加jwt验证  这2句千万不能忘记了,顺序不能颠倒。
            app.UseAuthentication();
            app.UseAuthorization();

            // 启用静态文件服务  
            app.UseStaticFiles(); 

            app.MapControllers();

            // 后台程序启动,等后面添加完应用,这个要开起来
            // new ServerInit(builder.Configuration["ConnectionStrings:mysql"], builder.Configuration["ConnectionStrings:tcp"]);

            app.Run();
        }
    }
}


此时,程序还不能正常启动,我们还需要设置一点东西,设置xml文件为“WebApplicationApi.xml”,你工程是什么名字,这个xml文件就取什么名字,这么做的目的是在启动Swagger的时候,api能够进行备注提示。

QQ截图20240725114859.jpg


此时,运行我们的工程,你会发现,在项目目录下会生成一个WebApplicationApi.xml文件

QQ截图20240725115058.jpg


目前安装的所有必要组件如下:

1、Microsoft.AspNetCore.Authentication.JwtBearer

2、Newtonsoft.Json

3、Quartz.Extensions.Hosting

4、Serilog.AspNetCore

QQ截图20240725115538.jpg


到这里,我们所有基本的前期配置工作就做完了。后面开始添加我们的应用部分。

asp.net 新建web api工程
asp.net 集成 EFCore mysql 数据库操作类

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

asp.net 集成必要的组件和注入

        工程源码下载:GPS定位系统VUE版本源码下载

        在上一节中,我们已经新建了工程,这一节中,我们需要在工程中添加自己的控制器模块,以及jwt,来实现api的权限控制。


新增控制器

        首先在Controllers目录下新增“HomeController.cs”和“LoginController.cs”两个文件; LoginController.cs用于编写用户登录所需要的所有api,不做jwt权限控制;HomeController.cs用于编写地图数据和报表数据的api,需要支持jwt权限控制。

        然后删除项目中的“WeatherForecastController.cs”和“WeatherForecast.cs”两个文件,这是项目自带的,没啥用。

        

HomeController.cs 内容如下:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace WebApplicationApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize]
    public class HomeController : Controller
    {
        private readonly IConfiguration configuration;
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
        {
            this.configuration = configuration;
            this._logger = logger;
        }
    }
}


LoginController.cs 内容如下:

using Microsoft.AspNetCore.Mvc;

namespace WebApplicationApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LoginController : Controller
    {
        private readonly IConfiguration configuration;
        private readonly ILogger<LoginController> _logger;

        public LoginController(ILogger<LoginController> logger, IConfiguration configuration)
        {
            this.configuration = configuration;
            this._logger = logger;
        }
    }
}


修改appsettings.json配置

修改appsettings.json配置文件,新增的配置项一共有三个。

1、jwt配置,用于设置jwt生成密钥以及有效期,我们这里设置有效期为24个小时。

2、数据库和tcp通讯配置,数据库连接我们这边配置的是mysql的地址信息,我这里配置的是本地地址localhost。另一个tcp配置是用于gps通讯用的连接地址信息。

3、日志输出的路径信息,用于输出系统日志,输出地址是“wwwroot/applogs/”目录,这个目录我们需要手动新建一下,日志按每日一个文件的形式进行保存。

{
  // 1、系统默认配置,不要动
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  // 2、JWT配置信息
  "JWT": {
    "SecretKey": "AAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCC", // 私钥
    "Issuer": "http://localhost:5059", //发布者
    "Expires": "24", // 有效期设置
    "Audience": "http://localhost:5059" //接收者
  },

  // 3、数据库和tcp通讯配置
  "ConnectionStrings": {
    "mysql": "Server=localhost;port=3306;Database=GpsDemo;Uid=root;Pwd=123456;persistsecurityinfo=True;Character Set=utf8",
    "tcp": "127.0.0.1:2234"
  },

  // 4、日志输出路径信息
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "shared": true,
          "rollingInterval": "Day",
          "restrictedToMinimumLevel": "Information",
          "path": "wwwroot/applogs/logs.txt",
          "outputTemplate": "{Timestamp:yyyy/MM/dd HH:mm:ss.fff zzz} {Application} [{Level}] {Message}{NewLine}{Exception}"
        }
      }
    ]
  }
}


添加完之后,就是下面这个样子了。

QQ截图20240725110102.jpg


修改Program.cs配置

        为了方便大伙理解,我这边直接提供完整的Program.cs配置信息,我在代码中做注释讲解。

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Quartz;
using Serilog;
using Serilog.Events;
using System.Text;

namespace WebApplicationApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            #region JWT功能配置
            // 需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 6.0.29版本的组件

            builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    //验证发布者
                    ValidateIssuer = true,
                    ValidIssuer = builder.Configuration["JWT:Issuer"],
                    //验证接收者
                    ValidateAudience = true,
                    ValidAudience = builder.Configuration["JWT:Audience"],
                    //验证是否过期
                    ValidateLifetime = true,
                    //验证私钥
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))
                };
            });

            // 配置Swagger身份验证输入
            builder.Services.AddSwaggerGen(options =>
            {
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "Value: Bearer {token}",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    BearerFormat = "JWT",
                    Scheme = "Bearer",
                });
                //添加安全要求
                options.AddSecurityRequirement(new OpenApiSecurityRequirement {
                    {
                        new OpenApiSecurityScheme{
                            Reference =new OpenApiReference{
                                Type = ReferenceType.SecurityScheme,
                                Id ="Bearer"
                            }
                        },new string[]{ }
                    }
                });
                
                //SwaggerUI 添加中文注释提示
                string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
                string xmlPath = "WebApplicationApi.xml"; // WebApplicationApi.xml文件就是在项目属性里面配置的文件名
                string commentsFile = Path.Combine(baseDirectory, xmlPath);
                //将注释的XML文档添加到SwaggerUI中
                options.IncludeXmlComments(commentsFile);
            });

            #endregion

            # region 配置跨域服务
            builder.Services.AddCors(options =>
            {
                options.AddPolicy("cors", p =>
                {
                    p.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });
            });
            #endregion

            #region job服务
            // 需要安装 Quartz.Extensions.Hosting 最新版 3.11.0 的组件
            // 博主这里没用到这个功能,只是保留,给大伙做个演示
            // 定时设置方法:https://blog.51cto.com/u_11990719/3241430
            builder.Services.AddQuartz(q =>
            {
                q.SchedulerId = "Scheduler-Core";
                q.UseDefaultThreadPool(tp => { tp.MaxConcurrency = 10; });
                //q.ScheduleJob<JobDemo1>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
                //q.ScheduleJob<JobDemo2>(trigger => trigger.WithCronSchedule("*/1 * * * * ?"));
            });

            builder.Services.AddQuartzHostedService(options =>
            {
                options.WaitForJobsToComplete = true;
            });
            #endregion

            #region 配置html
            // 配置这个,可以在控制器中获取到访问者的IP等信息,博主暂时没用到,这里做保留学习用
            builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            #endregion

            #region 解决网站右键查看源码时,乱码问题,这个可有可无,保留做学习用
            builder.Services.Configure<Microsoft.Extensions.WebEncoders.WebEncoderOptions>(options =>
            {
                options.TextEncoderSettings = new System.Text.Encodings.Web.TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All);
            });
            #endregion

            #region 添加日志服务
            // 添加日志服务,这个需要安装 Serilog.AspNetCore 最新版 8.0.1 的组件
            builder.Logging.ClearProviders();

            // 配置注入
            var configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .AddEnvironmentVariables()
               .Build();

            // 日志注入
            var logger = new LoggerConfiguration()
                            .ReadFrom.Configuration(configuration)
                            .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                            .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
                            .MinimumLevel.Override("Serilog", LogEventLevel.Error)
                            .Enrich.FromLogContext()
                            .CreateLogger();

            Log.Logger = logger;
            builder.Logging.AddSerilog(logger);
            builder.Host.UseSerilog();
            #endregion

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
                //app.UseDeveloperExceptionPage(); // 配置异常中间件
            }

            //跨域
            app.UseCors("cors");     
            app.UseHttpsRedirection();

            //添加jwt验证  这2句千万不能忘记了,顺序不能颠倒。
            app.UseAuthentication();
            app.UseAuthorization();

            // 启用静态文件服务  
            app.UseStaticFiles(); 

            app.MapControllers();

            // 后台程序启动,等后面添加完应用,这个要开起来
            // new ServerInit(builder.Configuration["ConnectionStrings:mysql"], builder.Configuration["ConnectionStrings:tcp"]);

            app.Run();
        }
    }
}


此时,程序还不能正常启动,我们还需要设置一点东西,设置xml文件为“WebApplicationApi.xml”,你工程是什么名字,这个xml文件就取什么名字,这么做的目的是在启动Swagger的时候,api能够进行备注提示。

QQ截图20240725114859.jpg


此时,运行我们的工程,你会发现,在项目目录下会生成一个WebApplicationApi.xml文件

QQ截图20240725115058.jpg


目前安装的所有必要组件如下:

1、Microsoft.AspNetCore.Authentication.JwtBearer

2、Newtonsoft.Json

3、Quartz.Extensions.Hosting

4、Serilog.AspNetCore

QQ截图20240725115538.jpg


到这里,我们所有基本的前期配置工作就做完了。后面开始添加我们的应用部分。