.net core 6.0 web api 爬坑日记

1 篇文章 0 订阅
1 篇文章 0 订阅

EFCore 的使用和配置

  • 本人以前做前端开发的,就是html,js,css,vue,react那些
  • 此前没接触过.net 甚至没接触过C# , 若哪里不对或有缺陷欢迎指出,以便改正! ^_^
  • 这是当前所在公司的一个小项目 , 虽然这个项目不大, 但是奈何我又喜欢新版本,所以直接用的.net core 6.0
  • 而且多数问题百度, 谷歌 都只有.net 3.x版本的回答
  • 本项目的前端是用的Blazor
  • 俗话说: 好记性不如烂笔头 , 自己做个笔记 , 能帮到其他朋友更好!

使用VS2022 新建webapi项目(不做赘述)

本项目地址

配置数据库

  • 添加包:
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools
  • Pomelo.EntityFrameworkCore.MySql(Microsoft.EntityFrameworkCore.Mysql不支持最新版dot net)
  1. appsettings.json中 添加配置代码: 例
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;database=wcsb_black_list;user id=root;password=toor"
  }

}
  1. 依赖注入:
// 连接数据库
    builder.Services.AddDbContext<BlackListContext>(options =>
        options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"),ServerVersion.Parse("8.0.26")));
    
    
    // 可访问和使用静态文件
    app.UseStaticFiles();
  1. 创建Models文件夹并创建数据Model

namespace WCSB_Black_LIst_API.Models
{
    public class BlackList
    {
        [Key] public int Id { set; get; }
        [DisplayName("姓名")] public string Name { set; get ; }
        [DisplayName("身份证号")] public string IdCard { set; get ; }
        [DisplayName("户籍地")] public string? Address { set; get ; }
    }
}
  1. 创建数据上下文
using Microsoft.EntityFrameworkCore;
namespace WCSB_Black_LIst_API.Models
{
    public class BlackListContext:DbContext
    {
        public BlackListContext(DbContextOptions<BlackListContext> options) : base(options)
        {
        }
        
        public DbSet<BlackList> BlackList { get; set; }
        // 如果多个Model 例: 
        public DbSet<Other> Others { get; set; }
    }
}
  1. 使用EFCore 的数据迁移(根据之前创建的Model和Context自动创建数据库)
  • 在程序包管理控制台(左下角, 或者工具->NuGet包管理器->程序包管理控制台) 输入 get-help entityframework 查看帮助
  • 常用的命令: add-migration 名 添加一个新的迁移
  • script-migration 生成迁移脚本
  • update-database 更新数据库
  • 至此 准备工作和表就建好了

数据的操作

  • 在Controller文件夹中创建相应的控制器
  • 如: BlackListController.cs
  • 控制器继承于 ControllerBase

[ApiController] 启用固定行为,使生成 Web API 更加容易。 一些行为包括参数源推理、将属性路由作为一项要求以及模型验证错误处理增强功能。
[Route] 定义路由模式 [controller]。 [controller] 令牌将替换为控制器的名称(不区分大小写,无 Controller 后缀)。

    using Microsoft.AspNetCore.Mvc;
    using WCSB_Black_LIst_API.Models;
    namespace WCSB_Black_LIst_API.Controllers
    {
        // [Route("api/[controller]")]
        [Produces("application/json")]
        [Consumes("application/json", "multipart/form-data")]//此处为新增 接受form表单数据
        [Route("api/")]
        [ApiController]
        public class BlackListController : ControllerBase
        {
            private readonly BlackListContext context;
            public BlackListController(BlackListContext context)
            {
                this.context = context;
            }
        }
    }

var data = new BlackList() { IdCard = idCard, Name = name, Address = address };
context.BlackList.Add(data); // 添加操作
context.SaveChanges(); // 保存更改

    var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault(); // 通过条件筛选并选取第一个数据
    context.BlackList.Remove(data); // 删除操作
    context.SaveChanges(); // 保存更改

    var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault(); // 通过条件筛选选取第一个数据
    data.Name = name; // 修改name值
    data.Address = address; // 修改address值
    data.IdCard = idCard; // 修改idCard值
    context.SaveChanges(); // 保存更改

  • 模糊查询
   // 模糊查询
   // str.Contains(keyword) 检查str中是否包含keyword字符串
   var s = context.BlackList.Where(_ => _.Name.Contains(keyword) || _.IdCard.Contains(keyword) || _.Address.Contains(keyword));
   // 获取总数据量 
   var total = s.Select(_ => _.Id).Distinct().Count();
   // 分页
   // Skip(从第多少条数据开始/忽略之前多少条数据)
   // Task(从开始处查询多少条数据)
   var res = s.Skip(limit * (page-1)).Take(limit);
  • 获取全部数据
   var bl = context.BlackList;
   // 查数量
   var total = bl.Select(_ => _.Id).Distinct().Count();
   // 获取全部数据 
   // bl.ToListAsync();
   // 分页查询
   var res =  bl.Skip(limit * (page-1)).Take(limit);

增删改查的完整示例(只示例两个典型,其他类似)

       // 搜索
       [HttpGet("Search")]
       public async Task<object> Search(string keyword,int page = 1, int limit = 20)
       {
           try
           {
               var s = context.BlackList.Where(_ => _.Name.Contains(keyword) || _.IdCard.Contains(keyword) || _.Address.Contains(keyword));
               var total = s.Select(_ => _.Id).Distinct().Count();
               var res = s.Skip(limit * (page-1)).Take(limit);
               return new {code = 200 , data =new {
                   list = res,
                   total
               }, message="查询成功"};
           }
           catch (Exception e)
           {
               return new {code = 400,message=e.Message};  
           }
       }
       // 更新/添加 (取决于有没有id) 参数为对象的方式在前端为JSON传参方式(content-type:application/json)
       [HttpPost("UpdatePeople")]
       public async Task<object> UpdatePeople(BlackList blackList )
        {
           try
           {
               int id = blackList.Id;
               string name = blackList.Name;
               string? address = blackList.Address;
               string idCard = blackList.IdCard;
               if (id == 0)
               {
                   var data = new BlackList() { IdCard = idCard, Name = name, Address = address };
                   context.BlackList.Add(data);
               }
               else
               {
                   var data = context.BlackList.Where(_ => _.Id == id).FirstOrDefault();
                   data.Name = name;
                   data.Address = address;
                   data.IdCard = idCard;
               }
               context.SaveChanges();
               return new { code = 200, message = (id == 0 ? "新增" : "修改") + "成功" };
           }
           catch (Exception e)
           {
                return new { code = 500, message = e.Message };
           }
       }

Excel导入数据的操作

  • 这里使用的是Npoi.Mapper库 在NuGet中可找到安装
  • Excel示例:
姓名证件号码户籍地
张三513002221152151201四川省达州市大竹县
李四51300222115215120X四川省达州市通川区
王五513002221152154561四川省达州市达川区
  • 以下是代码
   // excel的结构
    private class BlackListExcel {
       public string? Name { set; get; }
       public string? IdCard { set; get; }
       public string? Address { set; get; }
   }
   [HttpPost("UploadExcel")]
   public async Task<object> UploadExcel(IFormCollection files) 
   {
       try {
           // 遍历文件的数量
           foreach (var file in files.Files)
           {
               // 文件名
               string fileName = file.FileName;
               // 获取文件的后缀名
               string[] suffixArr = fileName.Split(".");
               string suffix = suffixArr[suffixArr.Length-1];
               // 限制后缀名
               if(suffix != "xlsx" && suffix != "xls" && suffix != "xlsm"&& suffix != "xltx"&& suffix != "et"&& suffix != "ett")
               {
                   throw new Exception($"[Error]文件格式不正确: .{suffix}不是有效的Excel文件格式!");
               }
               // 根据文件的数据流创建mapper对象
               var mapper = new Mapper(file.OpenReadStream());
               // 根据excel的标题映射数据
               var map = mapper.Map<BlackListExcel>("姓名", o => o.Name).Map<BlackListExcel>("证件号码", o => o.IdCard).Map<BlackListExcel>("户籍地", o => o.Address);
               // 获取映射后的数据列表
               var data = map.Take<BlackListExcel>("sheet1").Select(_ => _.Value);
               // 遍历数据列表
               foreach (var item in data)
               {
                   // 创建新的数据
                   var black = new BlackList() {IdCard = item.IdCard, Name = item.Name, Address = item.Address };
                   // 添加到临时blacklist上下文中 , 不要每一条都保存更改, 不止耗时还耗费资源
                   context.BlackList.Add(black);
               }
               // 最后保存更改
               context.SaveChanges();
           }
           return new { code = 200, message = "导入成功" };
       }catch(Exception e)
       {
           return new { code = 500, message = e.Message };
       } 
   }

Cors跨域

[官方文档] 在 ASP.NET CORE 中 (CORS) 跨 ASP.NET Core

  • 注入Cors服务
 builder.Services.AddCors(options =>
 {
    // 所有人都能跨域访问
    options.AddPolicy(name:"getData", builder =>
    {
        builder.AllowAnyMethod().AllowAnyHeader().SetIsOriginAllowed(_=>true); 
    });
    // 指定域名可跨域访问
    options.AddPolicy(name:"Policy", builder =>
    {
        builder.AllowAnyMethod().AllowAnyHeader().WithOrigins("http://example.com",
                                              "http://www.contoso.com"); 
    });
 });
 
 
 
 // 使用  必须在app.app.UseRouting();之后 且在app.UseAuthorization();之前;
 app.UseCors();
 // 或者全局使用
 app.UseCors("Policy");
  • 用法 我这里在controller中使用
[HttpGet("Search"), EnableCors("getData")] 
public async Task<object> Search(string name , string idCard)
{ 
    try 
    {
        var data = context.BlackList.Where(_ => _.IdCard == idCard && _.Name == name).FirstOrDefault();
        return new { code = 200, data, message = "查询成功" };
    }
    catch (Exception e)
    {
        return new { code = 500, message = e.Message };
    }
     
}
好的,我可以为您编写一个使用 asp.net core 6.0 webapi 的新闻信息 api 接口。 您可以按照以下步骤执行: 1. 创建一个 asp.net core 6.0 webapi 项目。 2. 在项目中添加一个 NewsController 控制器。 3. 在 NewsController 中添加一个 GetNews 方法,该方法将返回新闻信息列表。 4. 在 GetNews 方法中通过 HttpClient 获取新闻信息。 5. 将获取到的新闻信息转换成 News 对象列表。 6. 将 News 对象列表作为接口返回值,返回给调用者。 下面是一些示例代码,供参考: ```csharp using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; namespace NewsApi.Controllers { [ApiController] [Route("[controller]")] public class NewsController : ControllerBase { private readonly HttpClient _client; public NewsController(HttpClient client) { _client = client; } [HttpGet] public async Task<IEnumerable<News>> GetNews() { var newsJson = await _client.GetStringAsync("https://example.com/news"); var newsList = JsonConvert.DeserializeObject<List<News>>(newsJson); return newsList; } } public class News { public string Title { get; set; } public string Content { get; set; } } } ``` 在上述示例代码中,我们创建了一个 NewsApiController,并在其中添加了 GetNews 方法。GetNews 方法从 https://example.com/news 获取新闻信息,将其转换成一个 News 对象列表,并将其作为接口返回值返回给调用者。 当然,这仅仅是一个简单的示例,实际的实现可能会更复杂。但是这个示例可以给您一个思路,帮助您编写一个使用 asp.net core 6.0 webapi 的新闻信息 api 接口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值