书房信息初始化已完成,现在开始处理图书信息新增功能。

主要是实现之前New Razor Pages的后台部分。

新增需要保存的Model:Book.InitSpec.cs

/Models/Book.InitSpec.cs

 using System.Collections.Generic;

 namespace PTager.BL
{
public partial class Book
{
public class InitSpec
{
public string Title { get; set; }
public string Subtitle { get; set; }
public IEnumerable<string> Author { get; set; }
public IEnumerable<string> Translator { get; set; }
public string Isbn13 { get; set; }
public string Isbn10 { get; set; }
public string AuthorIntro { get; set; }
public string Summary { get; set; }
public string Publisher { get; set; }
public string Binding { get; set; }
public string OriginTitle { get; set; }
public int Pages { get; set; }
public string ImageUrl { get; set; }
public string Pubdate { get; set; }
public string Catalog { get; set; }
public IEnumerable<string> Tags { get; set; }
}
}
}

实现Post请求部分:

/Pages/Shelves/New.cshtml.cs

 namespace PTager.BL.WebUI.Pages.Shelves
{
using M = Book;
public class NewModel : PageModel
{
private readonly IHostingEnvironment _env;
private readonly string _savePath;
private readonly string _relativePath;
public NewModel(IHostingEnvironment env)
{
_env = env;
_relativePath = Path.Combine("App_Data", "Images/Books", DateTime.Today.ToString("yyyy-MM-dd"));
_savePath = Path.Combine(_env.ContentRootPath, _relativePath);
} [BindProperty]
public string IsbnNbr { get; set; }
public DoubanBookModel DoubanBook { get; set; } public async Task OnGetAsync(string isbn){...//查看之前的博客}
public async Task<IActionResult> OnPostAsync()
{
if (validIsbnNbr(IsbnNbr))
{
DoubanBook = await getDoubanBook();
if (DoubanBook != null)
{
var extention = Path.GetExtension(DoubanBook.image);
var fileName = Guid.NewGuid().ToString() + (string.IsNullOrEmpty(extention) ? ".jpeg" : extention);
await saveImageAsync(fileName, DoubanBook.image);
var spec = new M.InitSpec
{
Author = DoubanBook.author,
AuthorIntro = DoubanBook.author_intro,
Binding = DoubanBook.binding,
Catalog = DoubanBook.catalog,
ImageUrl = Path.Combine(_relativePath, fileName),
Isbn10 = DoubanBook.isbn10,
Isbn13 = DoubanBook.isbn13,
OriginTitle = DoubanBook.origin_title,
Pages = DoubanBook.pages,
Pubdate = DoubanBook.pubdate,
Publisher = DoubanBook.publisher,
Subtitle = DoubanBook.subtitle,
Summary = DoubanBook.summary,
Tags = DoubanBook.tags.Select(x => x.name),
Title = DoubanBook.title,
Translator = DoubanBook.translator
};
}
}
return Page();
}
private async Task saveImageAsync(string fileName, string url)
{
using (var httpClient = new HttpClient())
{
var responseStream = await httpClient.GetStreamAsync(url);
var savePath = Path.Combine(_savePath, fileName);
var stream = new FileStream(savePath, FileMode.Create);
byte[] bArr = new byte[];
int size = responseStream.Read(bArr, , bArr.Length);
while (size > )
{
stream.Write(bArr, , size);
size = responseStream.Read(bArr, , bArr.Length);
}
stream.Close();
responseStream.Close();
}
}
private async Task<DoubanBookModel> getDoubanBook(){...//查看之前的博客}
public async Task<string> HttpGetAsync(string url, Encoding encoding = null){...//查看之前的博客} private bool validIsbnNbr(string isbn){...//查看之前的博客}
}
}

新增IBookRepo和BookRepo:

/Repos/IBookRepo.cs

 using System.Threading.Tasks;

 namespace PTager.BL
{
using M = Book;
public interface IBookRepo
{
Task InitAsync(M.InitSpec spec);
}
}

/Repos/BookRepo.cs

 using System.Threading.Tasks;
using PTager.BL.Data.Store; namespace PTager.BL.Data.Repos
{
using M = Book;
public class BookRepo : RepoBase, IBookRepo
{
public BookRepo(BLDbContext context) : base(context)
{
} public async Task InitAsync(M.InitSpec spec)
=> await _context.Book_Init(spec.ToJson());
}
}

/Store/BLDbContext.cs

         public async Task Book_Init(string json)
=> await this.ExecuteMethodCallAsync(nameof(Book_Init), args: json);

记开发个人图书收藏清单小程序开发(九)Web开发——新增图书信息的更多相关文章

  1. 记开发个人图书收藏清单小程序开发(十)DB开发——新增图书信息

    昨晚完成了Web端新增图书信息的功能,现在就差DB的具体实现了. 因为我把Book相关的信息拆分的比较多,所以更新有点小麻烦. 首先,我需要创建一个Book Type的Matter: 然后,将图片路径 ...

  2. 记开发个人图书收藏清单小程序开发(三)DB设计

    主要是参考豆瓣的图书查询接口: https://api.douban.com/v2/book/isbn/:9780132350884 返回内容如下: { "rating": { & ...

  3. 记开发个人图书收藏清单小程序开发(五)Web开发

    决定先开发Web端试试. 新增Web应用: 选择ASP.NET Core Web Application,填写好Name和Location,然后点击OK. 注意红框标出来的,基于.NET Core 2 ...

  4. 记开发个人图书收藏清单小程序开发(六)Web开发

    Web页面开发暂时是没有问题了,现在开始接上Ptager.BL的DB部分. 首先需要初始化用户和书房信息.因为还没有给其他多余的设计,所以暂时只有个人昵称和书房名称. 添加 Init Razor Pa ...

  5. 记开发个人图书收藏清单小程序开发(四)DB设计

    早上起来,又改动了一下: 主要是,将非常用信息全部拆分出来,让Table尽量的小,小到不能继续拆分了,这样区分DB逻辑.增加了FileBank存储Book的封面图片,统一管理图片资源. 新添加的Typ ...

  6. 记开发个人图书收藏清单小程序开发(七)DB设计

    前面的书房初始化的前端信息已经完善,所以现在开始实现DB的Script部分. 新增Action:Shelf_Init.sql svc.sql CREATE SCHEMA [svc] AUTHORIZA ...

  7. 微信小程序开发系列一:微信小程序的申请和开发环境的搭建

    我最近也刚刚开始微信小程序的开发,想把我自学的一些心得写出来分享给大家. 这是第一篇,从零开始学习微信小程序开发.主要是小程序的注册和开发环境的搭建. 首先我们要在下列网址申请一个属于自己的微信小程序 ...

  8. 微信小程序开发系列五:微信小程序中如何响应用户输入事件

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  9. 微信小程序开发系列七:微信小程序的页面跳转

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

随机推荐

  1. python 主要模块和方法

    ******************** PY核心模块方法 ******************** os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename ...

  2. Django学习---Form组件认证

    Form组件认证 能够帮助我们做用户认证. 以前写我们自己写用户认证的时候,我们自己写HTML的form表单,点击提交,数据就被发送到后台,后台进行验证.在验证过程中我们就需要自己去写正则表达式去匹配 ...

  3. Shell 函数库

    1.为什么要定义函数库 经常使用的重复代码封装成函数文件 一般不直接执行,而是由其他脚本调用 2.编写一个函数库,该函数库实现以下几个函数. 1.加法函数:add 2.减法函数:reduce 3.乘法 ...

  4. 在 ubuntu1604 中 搭建 i 屁 sec 虚拟专用连接服务器

    1.wget https://git.io/vpnsetup -O vpnsetup.sh 2.vim vpnsetup.sh 修改一些内容: 主要有三个参数:IPSEC的预共享秘钥,用户名,密码 3 ...

  5. java String标准格式转换Date(yyyy-MM-dd HH:mm:ss)

    SimpleDateFormat sdf=new SimpleDateFormat("yyy年MM月dd日hh点mm分"); Date date=new Date(); Strin ...

  6. curl模拟多线程抓取网页(优化)

    通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...

  7. ie11的仿真模式

    1>在ie11的仿真模式中,所有版本的按钮都失效,解决方法:再ie的配置中,选项-高级-重置,然后重启ie11 程序员的基础教程:菜鸟程序员

  8. C和C++中的不定参数

    在初学C的时候,我们都会用到printf函数来写Hello World的程序.在我们看printf函数的声明时,会看到类似于下面代码 int printf(const char * __restric ...

  9. javascript+php实现根据用户时区显示当地时间的方法

    本文实例讲述了javascript+php实现根据用户时区显示当地时间的方法.分享给大家供大家参考.具体如下: 在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为 ...

  10. C语言源字符集与执行字符集

    参考: http://blog.csdn.net/yucan1001/article/details/7188267   http://blog.csdn.net/dbzhang800/article ...