From 79893c39fc302e7796087d657f449aa4eefad620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=8E=AE=E9=93=AD?= <2373854303@qq.com> Date: Mon, 23 Jun 2025 11:27:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=8F=90=E4=BA=A4623=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\357\274\210\344\270\211\357\274\211.md" | 370 ++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 "\350\224\241\347\216\256\351\223\255/20250623 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\344\270\211\357\274\211.md" diff --git "a/\350\224\241\347\216\256\351\223\255/20250623 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\344\270\211\357\274\211.md" "b/\350\224\241\347\216\256\351\223\255/20250623 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\344\270\211\357\274\211.md" new file mode 100644 index 0000000..93d82df --- /dev/null +++ "b/\350\224\241\347\216\256\351\223\255/20250623 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\344\270\211\357\274\211.md" @@ -0,0 +1,370 @@ +# WebApi项目梳理(三) + +## 课堂笔记 + +### WebApi项目梳理(三) + +#### 一、启动 MySql 服务 + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250618163858.png) + +#### 二、解决 VsCode 代码提示问题 + +**禁用 `C# Dev Kit` 插件** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250618164022.png) + +#### 三、创建项目 + +```bash +dotnet new webapi +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250610110354.png) + +#### 四、安装依赖包 + +**安装 Pomelo.EntityFrameworkCore.MySql 包** + +```bash +dotnet add package Pomelo.EntityFrameworkCore.Mysql +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611163352.png) + +**安装 Microsoft.EntityFrameworkCore.Design 包** + +```bash +dotnet add package Microsoft.EntityFrameworkCore.Design -v 8 +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611163825.png) + +**安装 dotnet-ef 工具包** + +```bash +dotnet tool install --global dotnet-ef +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611172723.png) + +#### 五、配置数据库连接字符串 + +**appsettings.json** + +```Csharp +"ConnectionStrings": { + "mysql":"server=localhost;database=test;uid=root;pwd=123456;" +} +``` + +#### 六、创建数据库上下文类 + +**BookDbContext.cs** + +```Csharp +using Microsoft.EntityFrameworkCore; + +namespace MyWebApi.Domain; + +public class BookDbContext : DbContext +{ + public BookDbContext(DbContextOptions options) : base(options) { } + + public DbSet Books + { + get; set; + } +} +``` + +#### 七、配置数据库上下文类、添加控制器服务、注册泛型仓储 + +**Program.cs** + +```Csharp +using Microsoft.EntityFrameworkCore; +using MyWebApi.Domain; +using MyWebApi.Repository; + + +var builder = WebApplication.CreateBuilder(args); + +// 配置数据库上下文 +var connectionStrings = builder.Configuration.GetConnectionString("mysql"); + +builder.Services.AddDbContext(b => +{ + b.UseMySql(connectionStrings, ServerVersion.AutoDetect(connectionStrings)); +}); + +// 添加控制器服务 +builder.Services.AddControllers(); + +// 注册泛型仓储 +builder.Services.AddScoped(typeof(IRepository<>),typeof(EfRepository<>)); + +var app = builder.Build(); + +// 注册 API 路由 +app.MapControllers(); + +app.Run(); +``` + +#### 八、创建实体类 + +**Books.cs** + +```Csharp +namespace MyWebApi.Domain; + +public class Books +{ + // 图书编号 + public int Id { get; set; } + // 图书名称 + public string? BookName { get; set; } + // 作者 + public string? Author { get; set; } + // 图书价格 + public double Price { get; set; } +} +``` + +#### 九、迁移数据库 + +##### 1. 编译和构建 .NET 项目 + +```bash +dotnet build +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611172807.png) + +##### 2. 生成一个新的迁移文件 + +```bash +dotnet ef migrations add InitCreate +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250620171552.png) + +##### 3. 迁移数据库 + +```bash +dotnet ef database update +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250620171509.png) + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250620171433.png) + +#### 十、创建数据库操作类 + +**BookCreateDto.cs** + +```Csharp +namespace MyWebApi.Dto; + +public record BookCreateDto(string BookName, string Author, double Price); +``` + +#### 十一、创建仓储接口(异步方法) + +**IRepository.cs** + +```Csharp +namespace MyWebApi.Repository; + +public interface IRepository +{ + // 查询所有 + Task> GetAllAsync(); + + // 查询一个 + Task? GetOneAsync(int id); + + // 新增一个 + Task AddAsync(T entity); + + // 修改一个 + Task UpdateAsync(T entity); + + // 删除一个 + Task DeleteAsync(T entity); +} +``` + +#### 十二、实现仓储接口类(异步方法) + +**EfRepository.cs** + +```Csharp +using Microsoft.EntityFrameworkCore; +using MyWebApi.Domain; + +namespace MyWebApi.Repository; + +public class EfRepository : IRepository where T : class +{ + // 设置数据库上下文 + private readonly BookDbContext _db; + + // 设置表名 + private readonly DbSet _tb; + + // 依赖注入 + public EfRepository(BookDbContext db){ + _db = db; + _tb = db.Set(); + } + + // 查询所有 + public async Task> GetAllAsync(){ + return await _tb.ToListAsync(); + } + + // 查询一个 + public async Task? GetOneAsync(int id){ + var obj = await _tb.FindAsync(id); + + if(obj == null){ + return null; + } + + return obj; + } + + // 新增一个 + public async Task AddAsync(T entity){ + var obj = await _tb.AddAsync(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } + + // 修改一个 + public async Task UpdateAsync(T entity){ + var obj = _tb.Update(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } + + // 删除一个 + public async Task DeleteAsync(T entity){ + var obj = _tb.Remove(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } +} +``` + +#### 十三、编写控制器文件(使用仓储接口) + +**BooksController.cs** + +```Csharp +using Microsoft.AspNetCore.Mvc; +using MyWebApi.Repository; +using MyWebApi.Domain; +using MyWebApi.Dto; + +namespace MyWebApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class BooksController : ControllerBase +{ + // 数据库仓储接口 + private readonly IRepository _BookRep; + + // 依赖注入 + public BooksController(IRepository BookRep){ + _BookRep = BookRep; + } + + // 查询所有图书 + [HttpGet] + public async Task Get(){ + var books = await _BookRep.GetAllAsync(); + + // 响应对象 + return Ok(new{code=200,data=books,msg="查询成功"}); + } + + // 新增图书 + [HttpPost] + public async Task Post(BookCreateDto bookCreateDto){ + var obj = new Books{BookName=bookCreateDto.BookName,Author=bookCreateDto.Author,Price=bookCreateDto.Price}; + + var book = await _BookRep.AddAsync(obj); + + // 响应对象 + return Ok(new{code=200,data=book,msg="新增成功"}); + } + + // 修改图书 + [HttpPut("{id}")] + public async Task Put(int id,BookCreateDto bookCreateDto){ + var book = await _BookRep.GetOneAsync(id); + + if(book == null){ + return Ok(new{code=500,data=book,msg="删除失败"}); + } + + book.BookName = bookCreateDto.BookName; + book.Author = bookCreateDto.Author; + book.Price = bookCreateDto.Price; + + var obj = await _BookRep.UpdateAsync(book); + + // 响应对象 + return Ok(new{code=200,data=obj,msg="修改成功"}); + } + + // 删除图书 + [HttpDelete("{id}")] + public async Task Delete(int id){ + var book = await _BookRep.GetOneAsync(id); + + if(book == null){ + return Ok(new{code=500,data=book,msg="删除失败"}); + } + + var obj = await _BookRep.DeleteAsync(book); + + // 响应对象 + return Ok(new{code=200,data=book,msg="删除成功"}); + } +} +``` + +#### 十四、效果演示 + +##### [项目预览](https://gitee.com/hyo-ja/webapi-framework/tree/master/20250623%20WebApi%E9%A1%B9%E7%9B%AE%E6%A2%B3%E7%90%86%EF%BC%88%E4%B8%89%EF%BC%89/MyWebApi) + +##### 效果预览 + +###### **查询图书列表** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250623111432.png) + +###### **新增图书** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250623111457.png) + +###### **修改图书** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250623111521.png) + +###### **删除图书** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250623111544.png) + +## 课后作业 -- Gitee From 5f8f015d8463c4d05f9c25a8da297e6528111f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=8E=AE=E9=93=AD?= <2373854303@qq.com> Date: Tue, 24 Jun 2025 10:21:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=8F=90=E4=BA=A4624=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\357\274\210\345\233\233\357\274\211.md" | 379 ++++++++++++++++++ 1 file changed, 379 insertions(+) create mode 100644 "\350\224\241\347\216\256\351\223\255/20250624 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\345\233\233\357\274\211.md" diff --git "a/\350\224\241\347\216\256\351\223\255/20250624 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\345\233\233\357\274\211.md" "b/\350\224\241\347\216\256\351\223\255/20250624 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\345\233\233\357\274\211.md" new file mode 100644 index 0000000..6cb951f --- /dev/null +++ "b/\350\224\241\347\216\256\351\223\255/20250624 WebApi\351\241\271\347\233\256\346\242\263\347\220\206\357\274\210\345\233\233\357\274\211.md" @@ -0,0 +1,379 @@ +# WebApi项目梳理(三) + +## 课堂笔记 + +### WebApi项目梳理(三) + +#### 一、启动 MySql 服务 + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250618163858.png) + +#### 二、解决 VsCode 代码提示问题 + +**禁用 `C# Dev Kit` 插件** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250618164022.png) + +#### 三、创建项目 + +```bash +dotnet new webapi +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250610110354.png) + +#### 四、安装依赖包 + +**安装 Pomelo.EntityFrameworkCore.MySql 包** + +```bash +dotnet add package Pomelo.EntityFrameworkCore.Mysql +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611163352.png) + +**安装 Microsoft.EntityFrameworkCore.Design 包** + +```bash +dotnet add package Microsoft.EntityFrameworkCore.Design -v 8 +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611163825.png) + +**安装 dotnet-ef 工具包** + +```bash +dotnet tool install --global dotnet-ef +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611172723.png) + +#### 五、配置数据库连接字符串 + +**appsettings.json** + +```Csharp +"ConnectionStrings": { + "mysql":"server=localhost;database=test;uid=root;pwd=123456;" +} +``` + +#### 六、创建数据库上下文类 + +**BlogDbContext.cs** + +```Csharp +using Microsoft.EntityFrameworkCore; + +namespace MyWebApi.Domain; + +public class BlogDbContext : DbContext +{ + public BlogDbContext(DbContextOptions options) : base(options) { } + + public DbSet Blogs{ get; set; } +} +``` + +#### 七、配置数据库上下文类、添加控制器服务、注册泛型仓储 + +**Program.cs** + +```Csharp +using MyWebApi.Domain; +using Microsoft.EntityFrameworkCore; +using MyWebApi.Repository; + +var builder = WebApplication.CreateBuilder(args); + +// 配置数据库上下文 +var connectionString = builder.Configuration.GetConnectionString("mysql"); + +builder.Services.AddDbContext(b => +{ + b.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); +} +); + +// 添加数据库服务 +builder.Services.AddControllers(); + +// 注册泛型仓储 +builder.Services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + +var app = builder.Build(); + +// 注册 API 路由 +app.MapControllers(); + +app.Run(); +``` + +#### 八、创建实体类 + +**Blogs.cs** + +```Csharp +namespace MyWebApi.Domain; + +public class Blogs +{ + // 编号 + public int Id { get; set; } + + // 博客标题 + public string? Title { get; set; } + + // 作者 + public string? Author { get; set; } + + // 博客内容 + public string? Content { get; set; } +} +``` + +#### 九、迁移数据库 + +##### 1. 编译和构建 .NET 项目 + +```bash +dotnet build +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250611172807.png) + +##### 2. 生成一个新的迁移文件 + +```bash +dotnet ef migrations add InitCreate +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250620171552.png) + +##### 3. 迁移数据库 + +```bash +dotnet ef database update +``` + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250620171509.png) + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250624090029.png) + +#### 十、创建数据库操作类 + +**BlogCreateDto.cs** + +```Csharp +namespace MyWebApi.Dto; + +public record BlogCreateDto(string Title, string Author, string Content); +``` + +#### 十一、创建仓储接口(异步方法) + +**IRepository.cs** + +```Csharp +namespace MyWebApi.Repository; + +public interface IRepository +{ + // 查询所有 + Task> GetAllAsync(); + + // 查询一个 + Task? GetOneAsync(int id); + + // 新增一个 + Task AddAsync(T entity); + + // 修改一个 + Task UpdateAsync(T entity); + + // 删除一个 + Task DeleteAsync(T entity); +} +``` + +#### 十二、实现仓储接口类(异步方法) + +**EfRepository.cs** + +```Csharp +using Microsoft.EntityFrameworkCore; +using MyWebApi.Domain; + +namespace MyWebApi.Repository; + +public class EfRepository : IRepository where T : class +{ + // 数据库上下文 + private readonly BlogDbContext _db; + // 表名 + private readonly DbSet _tb; + + // 依赖注入 + public EfRepository(BlogDbContext db) + { + _db = db; + _tb = db.Set(); + } + + // 查询所有 + public async Task> GetAllAsync() + { + return await _tb.ToListAsync(); + } + + // 查询一个 + public async Task? GetOneAsync(int id) + { + var obj = await _tb.FindAsync(id); + + if (obj == null) + { + return null; + } + + return obj; + } + + // 新增一个 + public async Task AddAsync(T entity) + { + var obj = await _tb.AddAsync(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } + + // 修改一个 + public async Task UpdateAsync(T entity) + { + var obj = _tb.Update(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } + + // 删除一个 + public async Task DeleteAsync(T entity) + { + var obj = _tb.Remove(entity); + + await _db.SaveChangesAsync(); + + return obj.Entity; + } +} +``` + +#### 十三、编写控制器文件(使用仓储接口) + +**BlogsController.cs** + +```Csharp +using Microsoft.AspNetCore.Mvc; +using MyWebApi.Repository; +using MyWebApi.Dto; +using MyWebApi.Domain; + +namespace MyWebApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class BlogsController : ControllerBase +{ + // 泛型仓储 + private readonly IRepository _BlogRep; + + // 依赖注入 + public BlogsController(IRepository BlogRep) + { + _BlogRep = BlogRep; + } + + [HttpGet] + public async Task Get() + { + var obj = await _BlogRep.GetAllAsync(); + return Ok(new { code = 200, data = obj, msg = "查询成功" }); + } + + [HttpPost] + public async Task Post(BlogCreateDto blogCreateDto) + { + var blogs = new Blogs() + { + Title = blogCreateDto.Title, + Author = blogCreateDto.Author, + Content = blogCreateDto.Content, + }; + + var obj = await _BlogRep.AddAsync(blogs); + + return Ok(new { code = 200, data = obj, msg = "新增成功" }); + } + + [HttpPut("{id}")] + public async Task Put(int id, BlogCreateDto blogCreateDto) + { + var blogs = await _BlogRep.GetOneAsync(id); + + if (blogs == null) + { + return Ok(new { code = 500, data = "null", msg = "修改失败" }); + } + + blogs.Title = blogCreateDto.Title; + blogs.Author = blogCreateDto.Author; + blogs.Content = blogCreateDto.Content; + + var obj = await _BlogRep.UpdateAsync(blogs); + + return Ok(new { code = 200, data = obj, msg = "修改成功" }); + } + + [HttpDelete("{id}")] + public async Task Delete(int id) + { + var blogs = await _BlogRep.GetOneAsync(id); + + if (blogs == null) + { + return Ok(new { code = 500, data = "null", msg = "删除失败" }); + } + + var obj = await _BlogRep.DeleteAsync(blogs); + + return Ok(new { code = 200, data = obj, msg = "删除成功" }); + } +} +``` + +#### 十四、效果演示 + +##### [项目预览](https://gitee.com/hyo-ja/webapi-framework/tree/master/20250624%20WebApi%E9%A1%B9%E7%9B%AE%E6%A2%B3%E7%90%86%EF%BC%88%E5%9B%9B%EF%BC%89/MyWebApi) + +##### 效果预览 + +###### **查询博客列表** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250624100902.png) + +###### **新增博客** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250624100932.png) + +###### **修改博客** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250624101340.png) + +###### **删除博客** + +![](https://gitee.com/hyo-ja/picture-warehouse/raw/master/images/20250624101410.png) + +## 课后作业 -- Gitee