diff --git "a/\345\224\220\345\255\235\345\235\232/20240603-\351\241\271\347\233\256\350\256\276\350\256\2411.md" "b/\345\224\220\345\255\235\345\235\232/20240603-\351\241\271\347\233\256\350\256\276\350\256\2411.md" new file mode 100644 index 0000000000000000000000000000000000000000..eb66ff40df8f45b32c370390becb5ad6bc9eeb55 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240603-\351\241\271\347\233\256\350\256\276\350\256\2411.md" @@ -0,0 +1,88 @@ +``` +建:Dto-AuthorDto.cs: + +namespace BookStore.Api.Dto; + +public class AuthorDto +{ + public Guid Id { get; set; } + + public string AuthorName { get; set; } = null!; + public int Gender { get; set; } + + // name 一个字符串 如果为null,表示不指向任何一个值 + // name 其值为"",就是空字符串,其实是有指向中一个值,这个值是空字符串而已 + +} +``` + +``` +Services-AuthorRepository.cs + +using BookStore.Api.Domain; +using BookStore.Api.Db; +using BookStore.Api.Dto; +using BookStore.Api.Interface; + +namespace BookStore.Api.Services; + +public class AuthorRepository : IAuthorRepository +{ + ...... + + public ICollection GetAllAuthors() + { + // 这个实现应该从持久化的数据源中获得:数据库、文件、各种异构数据、从各种api中获取的数据 + var list = BookStoreDb.Instance.Authors.ToList(); + var resultList = new List();// let resultList=[] + list.ForEach(item => + { + // 实例化一个对象这里有2种方式,一个是直接调用构造函数,形如:new AuthorDto() + // 另一个是直接填充其属性,形如:new AuthorDto{} + var tmp = new AuthorDto { Id = item.Id, AuthorName = item.AuthorName, Gender = item.Gender }; + resultList.Add(tmp); + }); + return resultList; + } + + public AuthorDto? GetAuthorById(Guid id) + { + var tmp = BookStoreDb.Instance.Authors.SingleOrDefault(item => item.Id == id); + var tmpResult = tmp != null ? new AuthorDto { Id = tmp.Id, AuthorName = tmp.AuthorName, Gender = tmp.Gender } : null; + // dynamic xResult=null; + // if(tmp!=null){ + // xResult=new AuthorDto { Id = tmp.Id, AuthorName = tmp.AuthorName, Gender = tmp.Gender }; + // } + return tmpResult; + } +..... +} +``` + +``` +Controllers-AuthorController.cs +.... + [HttpPost] + public IActionResult Post(AuthorCreateDto authorCreateDto) + { + /* + 1.拿到AuthorCreateDto类型的实例化数据-模型绑定 + 2.将相关数据保存到数据库 + 1.转换AuthorCreateDto类型的数据为Authors + 2.调用数据库上下文,将数据插入 + + */ + var result = _authorRepository.Insert(authorCreateDto); + return Ok(result); + } + + [HttpPut("{id}")] + public IActionResult Put(Guid id, AuthorUpdateDto authorUpdateDto) + { + var result = _authorRepository.Update(id, authorUpdateDto); + return Ok(result); + } + + .... + +``` \ No newline at end of file diff --git "a/\345\224\220\345\255\235\345\235\232/20240604-\351\241\271\347\233\256\350\256\276\350\256\2412.md" "b/\345\224\220\345\255\235\345\235\232/20240604-\351\241\271\347\233\256\350\256\276\350\256\2412.md" new file mode 100644 index 0000000000000000000000000000000000000000..2b22438389c50868f95a4afca090a7ea90153ad0 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240604-\351\241\271\347\233\256\350\256\276\350\256\2412.md" @@ -0,0 +1,98 @@ +``` +Serivices-AuthorRepository.cs: + +..... + public AuthorDto? Delete(Guid authorId) + { + // 先找出满足id的元素,然后再移除对应元素 + var tmp = BookStoreDb.Instance.Authors.FirstOrDefault(item => item.Id == authorId); + // BookStoreDb.Instance.Authors.Remove(tmp); + // var tmpResult = tmp != null ? new AuthorDto { Id = tmp.Id, AuthorName = tmp.AuthorName, Gender = tmp.Gender }:null; + if (tmp != null) + { + BookStoreDb.Instance.Authors.Remove(tmp); + var dto = new AuthorDto { Id = tmp.Id, AuthorName = tmp.AuthorName, Gender = tmp.Gender }; + return dto; + } + else + { + return null; + } + } +..... +``` + +``` +Controllers-AuthorsController.cs + + +..... + + [HttpDelete("{id}")] + public IActionResult Del(Guid id) + { + // return Ok(id); + var author = _authorRepository.Delete(id); + + + return Ok(author); + } +``` + +``` +Serivices-BookRepository.cs +.... + + public BookDto? GetBookById(Guid authorId, Guid bookId) + { + var author = BookStoreDb.Instance.Authors.FirstOrDefault(item => item.Id == authorId); + if (author == null) + { + return null; + } + var book = BookStoreDb.Instance.Books.FirstOrDefault(item => item.AuthorId == authorId && item.Id == bookId); + + if (book == null) + { + return null; + } + return new BookDto { Id = book.Id, BookName = book.BookName, AuthorId = book.AuthorId }; + } + + public BookDto? Insert(Guid authorId, BookCreateDto bookCreateDto) + { + /* + 1.确认传入的authorId存在对应的记录 + 如果存在,继续后面的流程;否则返回null + 2.将输入的数据进行整理转换,插入到数据中 + 1. 将BookCreateDto类型的数据转换成Books类型的数据 + 2. 将转换到books数据插入数据库表 + + 为了简单,目前从未对传入数据进行任何验证,原因就是为了让整个应用尽量简单,后续一定要进行数据验证 + 1. 简单验证 数据类型,是否为空,字符长度,是否一定格式等等 + 2. 复杂验证或者叫业务验证 + + */ + + var author = BookStoreDb.Instance.Authors.FirstOrDefault(item => item.Id == authorId); + if (author == null) + { + return null; + } + var tmp = new Books + { + Id = Guid.NewGuid(), + BookName = bookCreateDto.BookName, + Publisher = bookCreateDto.Publisher, + Price = bookCreateDto.Price, + AuthorId = authorId + }; + + BookStoreDb.Instance.Books.Add(tmp); + + var result = new BookDto { Id = tmp.Id, BookName = tmp.BookName, AuthorId = tmp.AuthorId, Author = author }; + + return result; + } + ... +``` \ No newline at end of file diff --git "a/\345\224\220\345\255\235\345\235\232/20240606-\351\241\271\347\233\256\350\256\276\350\256\2413.md" "b/\345\224\220\345\255\235\345\235\232/20240606-\351\241\271\347\233\256\350\256\276\350\256\2413.md" new file mode 100644 index 0000000000000000000000000000000000000000..c185cedaf0306e727468bcbb62463247f0cce6e2 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240606-\351\241\271\347\233\256\350\256\276\350\256\2413.md" @@ -0,0 +1,63 @@ +``` +Controllers-BooksController.cs +... + [HttpPost] + public IActionResult Post(Guid authorId, BookCreateDto bookCreateDto) + { + //var result = _bookRepository.Insert(authorId, bookCreateDto); + + + return Ok(result); + + /* + 1.确认传入的authorid存在对应的记录 + 如果存在,继续后面的流程,否则返回null + 2.将输入的数据进行整理转换,插入到数据 + 2.1:将BookCreateDto类型的数据转换成Books类型的数据 + 2.2:将转换到books数据插入到数据库表 + 目前未传入数据进行任何验证,后续一定要进行数据验证 + 1.简单验证:数据类型,是否未空,字符长度,是否一定格式等等 + 2。复杂验证或者叫业务验证 + */ + } + + + +``` + +``` +Serivices-BookRepository.cs + +... + public BookDto? Update(Guid authorId, Guid BookId, BookUpdateDto bookUpdateDto) + { + /* + 1. 要修改的指定的作者是不是在,如果不在则返回null,如果在则继续 + 2. 要修改的指定的图书book是不是存在,如果不存在则返回null,如果存在则继续 + 3. 完成book数据的更改和保存 + 将传入的bookUpdateDto数据赋值给book,就可以了 + + */ + + var author = BookStoreDb.Instance.Authors.FirstOrDefault(item => item.Id == authorId); + if (author == null) + { + return null; + } + + var book = BookStoreDb.Instance.Books.FirstOrDefault(item => item.Id == BookId); + if (book == null) + { + return null; + } + + book.BookName = bookUpdateDto.BookName; + book.Publisher = bookUpdateDto.Publisher; + book.Price = bookUpdateDto.Price; + book.BookName = bookUpdateDto.BookName; + + var result = new BookDto { Id = book.Id, BookName = book.BookName, AuthorId = book.AuthorId }; + return result; + } + ... +``` \ No newline at end of file diff --git "a/\345\224\220\345\255\235\345\235\232/20240607-\351\241\271\347\233\256\350\256\276\350\256\2414.md" "b/\345\224\220\345\255\235\345\235\232/20240607-\351\241\271\347\233\256\350\256\276\350\256\2414.md" new file mode 100644 index 0000000000000000000000000000000000000000..b473920afa62547b73e2c1d948a9079cd4fbaf84 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240607-\351\241\271\347\233\256\350\256\276\350\256\2414.md" @@ -0,0 +1,129 @@ +### 项目设计(删除) +``` +Controllers-BooksController.cs + +.... + [HttpDelete("{bookId}")] + public IActionResult Delete(Guid authorId, Guid bookId) + { + var result = _bookRepository.Delete(authorId, bookId); + return Ok(result); + } + +``` + +``` +Serivices-BookRepository.cs + +.... + public BookDto? Delete(Guid authorId, Guid bookId) + { + /* + 1. 确认要操作的作者是否存在 + 存在则继续 + 不存在则返回null + 2. 在内存数据库查找对应的图书id + 存在则删除对应图书 + 不存在则返回null + */ + var author = BookStoreDb.Instance.Authors.FirstOrDefault(item => item.Id == authorId); + if (author == null) + { + return null; + } + var book = BookStoreDb.Instance.Books.FirstOrDefault(item => item.Id == bookId); + if (book == null) + { + return null; + } + BookStoreDb.Instance.Books.Remove(book); + var result = new BookDto { Id = bookId, AuthorId = authorId, BookName = book.BookName }; + return result; + } + .. +``` + +``` +测试:http: + +### 删除指定作者下指定的图书 +DELETE {{url}}/api/authors/102a86f0-ae9b-439f-9bc4-bb8ed8c2af6d/books/a53434ed-4da3-4dd3-b31d-51920e31f56e HTTP/1.1 +``` + +### 第五章 :使用Entity Framework Core + +``` +Interfaces-IRepositoryBase.cs + +namespace BookStore.Api.Interface; + +/// +/// 基础仓储接口,定义通用的CRUD功能 +/// +public interface IRepositoryBase +{ + /* + 通过id获取指定模型(对应数据库中的表,模型中的公共属性对应数据表的字段或者叫列) + 获取所有的模型 + + 获取所有实体 + + 新增插入 + + 删除 + + + 更新 + + */ + + T GetById(Guid id); + + List GetAll(); + + T Insert(T entity); + T Update(T entity); + T Delete(T entity); + T Delete(Guid id); +} +``` + +``` +appsetting.json: + +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "Mssql":"server=.;database=BookStore;uid=sa;pwd=123456;TrustServerCertificate=true;" + } +} \ +``` + +``` +Db-BookStoreContext.cs + +using BookStore.Api.Domain; +using Microsoft.EntityFrameworkCore; + +namespace BookStore.Api.Db; + +public class BookStoreDbContext : DbContext +{ + public BookStoreDbContext(DbContextOptions options) : base(options) + { + + } + + + public DbSet Authors { get; set; } + public DbSet Books { get; set; } + public DbSet Users { get; set; } + +} +``` \ No newline at end of file