WPF实战项目十三(API篇):备忘录功能api接口、优化待办事项api接口
1、新建MenoDto.cs
/// <summary>/// 备忘录传输实体/// </summary>public class MenoDto : BaseDto{private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title = value; }}private string content;/// <summary>/// 内容/// </summary>public string Content{get { return content; }set { content = value; }}}
2、添加映射关系
CreateMap<Memo, MemoDto>().ReverseMap();
3、新建服务接口IMemoService
public interface IMemoService : IBaseService<MemoDto>{}
4、新建服务MemoService
public class MemoService : IMemoService{private readonly IUnitOfWork _unitOfWork;private readonly IMapper mapper;public MemoService(IMapper mapper, IUnitOfWork unitOfWork){this.mapper = mapper;_unitOfWork = unitOfWork;}/// <summary>/// 新增备忘录/// </summary>/// <param name="model"></param>/// <returns></returns>public async Task<ApiResponse> AddEntityAsync(MemoDto model){try{var memo = mapper.Map<Memo>(model);await _unitOfWork.GetRepository<Memo>().InsertAsync(memo);if(await _unitOfWork.SaveChangesAsync() > 0){return new ApiResponse(true, memo);}else{return new ApiResponse(false, "添加数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}/// <summary>/// 删除备忘录/// </summary>/// <param name="id"></param>/// <returns></returns>public async Task<ApiResponse> DeleteEntityAsync(int id){try{var repository = _unitOfWork.GetRepository<Memo>();var memo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id.Equals(id));if(memo != null){repository.Delete(memo);}if(await _unitOfWork.SaveChangesAsync() > 0){return new ApiResponse(true, "删除数据成功!");}else{return new ApiResponse(false, "删除数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}/// <summary>/// 查询所有备忘录/// </summary>/// <returns></returns>public async Task<ApiResponse> GetAllAsync(){try{var repository = _unitOfWork.GetRepository<Memo>();var memo = await repository.GetAllAsync();if(memo != null){return new ApiResponse(true, memo);}else{return new ApiResponse(false, "查询数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}/// <summary>/// 根据Id查询备忘录/// </summary>/// <param name="id"></param>/// <returns></returns>public async Task<ApiResponse> GetSingleAsync(int id){try{var repository = _unitOfWork.GetRepository<Memo>();var memo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id.Equals(id));if(memo != null){return new ApiResponse(true, memo);}else{return new ApiResponse(false, $"查询Id={id}的数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}/// <summary>/// 更新备忘录/// </summary>/// <param name="model"></param>/// <returns></returns>public async Task<ApiResponse> UpdateEntityAsync(MemoDto model){try{var dbmemo = mapper.Map<Memo>(model);var repository = _unitOfWork.GetRepository<Memo>();var memo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id.Equals(dbmemo.Id));if( memo != null){memo.Title = dbmemo.Title;memo.Content = dbmemo.Content;memo.UpdateDate = DateTime.Now;repository.Update(memo);if(await _unitOfWork.SaveChangesAsync() > 0){return new ApiResponse(true, "更新数据成功!");}else{return new ApiResponse(false, "更新数据失败!");}}else{return new ApiResponse(false, $"未查询到Id={dbmemo.Id}的数据!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}}
5、新增MemoController控制器
public class MemoController : BaseApiController{private readonly IUnitOfWork _unitOfWork;private readonly IMemoService memoService;public MemoController(IMemoService memoService, IUnitOfWork unitOfWork){this.memoService = memoService;_unitOfWork = unitOfWork;}[HttpGet]public async Task<ApiResponse> GetMemoById(int Id){return await memoService.GetSingleAsync(Id);}[HttpPost]public async Task<ApiResponse> AddMemo([FromBody] MemoDto memoDto){return await memoService.AddEntityAsync(memoDto);}[HttpDelete]public async Task<ApiResponse> DeleteMemo(int Id){return await memoService.DeleteEntityAsync(Id);}[HttpGet]public async Task<ApiResponse> GetAllMemo(){return await memoService.GetAllAsync();}[HttpPost]public async Task<ApiResponse> UpdateMemo(MemoDto memoDto){return await memoService.UpdateEntityAsync(memoDto);}}
6、在program.cs添加服务
builder.Services.AddTransient<IMemoService, MemoService>();
7、F5运行项目







8、针对查询数据可以做个优化,增加查询的页数、内容、数据量等,新建查询参数类

public class QueryParameter{public int PageIndex { get; set; }public int PageSize { get; set; }public string Search { get; set; }}
9、在IToDoService.cs和IMemoService.cs中添加分页查询的接口
public interface IToDoService : IBaseService<TodoDto>{Task<ApiResponse> GetPageListAllAsync(QueryParameter parameter);}public interface IMemoService : IBaseService<MemoDto>{Task<ApiResponse> GetPageListAllAsync(QueryParameter parameter);}
10、在ToDoService.cs中实现接口和MemoService.cs中实现接口
/// <summary>/// 分页查询所有数据/// </summary>/// <param name="parameter"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public async Task<ApiResponse> GetPageListAllAsync(QueryParameter parameter){try{var repository = unitOfWork.GetRepository<ToDo>();var todo = await repository.GetPagedListAsync(predicate: x => string.IsNullOrWhiteSpace(parameter.Search) ? true : x.Title.Contains(parameter.Search),pageIndex: parameter.PageIndex,pageSize: parameter.PageSize,orderBy: y => y.OrderByDescending(t => t.CreateDate));if (todo != null){return new ApiResponse(true, todo);}else{return new ApiResponse(false, "查询数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}
/// <summary>/// 分页查询所有备忘录/// </summary>/// <param name="parameter"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public async Task<ApiResponse> GetPageListAllAsync(QueryParameter parameter){try{var repository = _unitOfWork.GetRepository<Memo>();var memo = await repository.GetPagedListAsync(predicate: x => string.IsNullOrWhiteSpace(parameter.Search) ? true : x.Title.Contains(parameter.Search),pageIndex: parameter.PageIndex,pageSize: parameter.PageSize,orderBy: y => y.OrderByDescending(t => t.CreateDate));if (memo != null){return new ApiResponse(true, memo);}else{return new ApiResponse(false, "查询数据失败!");}}catch (Exception ex){return new ApiResponse(false, ex.Message);}}
11、在ToDoController和MemoController中添加代码
[HttpGet]public async Task<ApiResponse> GetAllPageListToDo([FromQuery] QueryParameter parameter){return await toDoService.GetPageListAllAsync(parameter);}
[HttpGet]public async Task<ApiResponse> GetAllPageListMemo([FromQuery] QueryParameter parameter){return await memoService.GetPageListAllAsync(parameter);}
12、F5运行项目




相关文章:
WPF实战项目十三(API篇):备忘录功能api接口、优化待办事项api接口
1、新建MenoDto.cs /// <summary>/// 备忘录传输实体/// </summary>public class MenoDto : BaseDto{private string title;/// <summary>/// 标题/// </summary>public string Title{get { return title; }set { title value; }}private string con…...
clickhouse(十四、分布式DDL阻塞及同步阻塞问题)
文章目录 一、分布式ddl 阻塞、超时现象验证方法解决方案 二、副本同步阻塞现象验证解决方案 一、分布式ddl 阻塞、超时 现象 在clickhouse 集群的操作中,如果同时执行一些重量级变更语句,往往会引起阻塞。 一般是由于节点堆积过多耗时的ddl。然后抛出…...
怎么入门网络安全(黑客)?
目录: 一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习2.不要把深度学习作为入门第一课3.以黑客技能、兴趣为方向的自学误区:4.不要收集过多的资料二、学习网络安全的一些前期准备三…...
c++ boost::json
Boost社区12月11日发布了1.75版本,在之前,Boost使用Boost.PropertyTree解析JSON,XML,INI和INFO格式的文件。但是由于成文较早及需要兼容其他的数据格式,相比较于其他的…...
《Flink学习笔记》——第九章 多流转换
无论是基本的简单转换和聚合,还是基于窗口的计算,我们都是针对一条流上的数据进行处理的。而在实际应用中,可能需要将不同来源的数据连接合并在一起处理,也有可能需要将一条流拆分开,所以经常会有对多条流进行处理的场…...
openmmlab出现KeyError: ‘xxx is not in the model registry....‘
问题描述 在复现基于mmpose框架的算法时,运行程序出现KeyError: xxx is not in the model registry....的问题,报错原因是自定义的backbone等结构或者某些当前代码使用的方法没有注册到现有的包中, 导致在import的时候无法导入该方法。 解决方案 找到…...
错误代码0x80131500要怎么解决?快速修复方法
错误代码0x80131500通常与.NET Framework 相关的问题有关。它可能表示.NET Framework的安装损坏、版本冲突或系统文件缺失等。下面我们一起来探讨一下解决错误代码0x80131500有哪些。 以下是一些解决方法 安装最新的.NET Framework版本:访问Microsoft官方网站&…...
PMO(Project Management Office)
PMO 是项目管理办公室(Project Management Office)的缩写。它是组织内的一个部门或团队,负责支持和促进项目管理活动,以确保项目按时、按预算、按要求完成。 PMO 的职责和角色可以因组织的性质和需求而有所不同,但通常…...
STM32 CUBEMX CAN通信数据发送失败原因分析
CAN通信是一种数据通信协议,用于在不同设备之间进行通信。它是一种高效的、实时的、可靠的、多主机的、串行通信系统,通常用于汽车电子、工业自动化等领域。CAN通信协议是由德国BOSCH公司于1986年引入,并在欧洲和日本广泛使用。CAN通信具有独…...
长安链并行调度机制(2):DAG构建和从节点执行流程
长安链采用高效的并行调度方式执行交易,了解长安链交易调度、冲突检测和DAG构建流程有助于开发者更好地理解长安链并行调度的运行机制,帮助开发者编写高质量、低冲突的智能合约,更好地构建区块链应用。 上一篇内容我们说明了长安链交易调度、…...
leetcode做题笔记110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路一:递归 int height(struct TreeNode* root) {if (root NULL) {return…...
iOS开发Swift-字符串与字符
1.字符串的定义 let someString "some string value"2.多行字符串的定义(""") let quotation """ 有一个人前来买瓜。 "这瓜甜吗?"他问。 """前一个"""前和后一个""&…...
Linux Kernel:syscall之fork与exec
环境: Kernel Version:Linux-5.10 ARCH:ARM64 一:前言 上一节我们提到了进程的产生方式fork,exec与clone,本节将详细分析fork和exec族系统调用的具体实现。通常这些调用不是由应用程序直接发出的,而是通过一个中间层调用,即负责与内核通信的C标准库。从用户状态切换到…...
CentOS 修改MySQL密码
CentOS 修改MySQL密码 1.登录MySQL 2.执行如下命令 update user set passwordpassword(mivbAs7Awc) where userroot;报错如下: Unknown column ‘password’ in ‘field list’ 3.执行如下命令 update user set passwordpassword(mivbAs7Awc) where userroot碰到…...
Android通过setaffinity实现绑核
有时候为了降低App算力占用,会把关键的线程绑定到大核中,下面介绍一种绑核的方式 查看绑核 查看pid :/ # ps -A | grep test u0_a15 25178 405 15950272 176544 do_epoll_wait 0 S com.test.jnites查看线程号 top -H -p 25178 25224 u0_…...
stm32的位带操作
在51单片机中,我们可以使用P2^1来对单片机的某一位进行操作,到了stm32,我们通过位带操作,将寄存器的每一位映射到一个32位的地址。如下是我查资料摘录的一些图片。 映射方式 SRAM: AliasAddr 0x22000000 (A-0X20000000)*8*4n*4…...
Java 电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…...
https协议经过SpringMVC重定向之后变成http协议
之前项目的协议还是http,当改为https之后,就出现了这个问题。 服务访问地址:https://wuxinke.demo.com 访问某个页面的地址:https://wuxinke.demo.com/aps/judgeProviderOrCtenant.ht 经SpringMVC重定向之后,地址变…...
iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合
效果图 需求,由于视图层级的原因,需要对图片分开进行磨砂, 然后组合在一起 如图,上下两部分,上下两个UIImageVIew大小相同,都是和图片同样的大小,只是上面的UIimageVIew 只展示上半部份 &#…...
与面试官互动:建立积极的技术讨论氛围
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
我的家庭影音中心进化史:从群晖到用Ubuntu+CasaOS自建,省下大几千
我的家庭影音中心进化史:从群晖到UbuntuCasaOS自建方案 1. 为什么放弃品牌NAS选择自建方案 三年前,我花了大半个月工资购入了一台群晖DS920,当时觉得这是家庭数据管理的终极解决方案。然而随着使用深入,逐渐发现品牌NAS的几大痛点…...
如何用免费AI助手提升3倍编码效率?DeepSeek-Coder-V2全解析
如何用免费AI助手提升3倍编码效率?DeepSeek-Coder-V2全解析 【免费下载链接】DeepSeek-Coder-V2 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 在AI编程工具层出不穷的今天,开发者面临着一个关键选择:是为商…...
消费级显卡轻松玩转百亿大模型微调?8步教你降维打击,显存成本打骨折!
本文介绍了如何使用QLoRA技术,仅需单张RTX 3090/4090显卡,即可高效微调百亿参数量级的大模型。文章详细阐述了从数据准备、模型加载与量化(4-bit NF4)、LoRA配置、训练优化(混合精度、梯度累积等)、模型评估…...
CopyManga下载器新手指南:从入门到精通的漫画收藏解决方案
CopyManga下载器新手指南:从入门到精通的漫画收藏解决方案 【免费下载链接】copymanga-downloader 使用python编译exe/bash/命令行参数来下载copymanga(拷贝漫画)中的漫画,支持批量选话下载和获取您收藏的漫画并下载!(windows&linux支持&…...
不同品牌路由器也能玩桥接?TP-LINK AC1200主路由+FAST FWR303副路由详细配置指南
跨品牌路由器桥接实战:TP-LINK AC1200与FAST FWR303混合组网全解析 现代家庭网络环境中,信号死角问题如同房间角落的灰尘一样难以避免。特别是当房屋结构复杂或面积较大时,单台路由器往往力不从心。此时,利用家中闲置的旧路由器进…...
基于Koopman算子的四旋翼无人机MPC控制开发:一种创新的数据驱动方法
318-一种基于Koopman算子的模型预测控制MPC控制四旋翼无人机开发 简介: 一种基于Koopman算子和扩展动态模式分解(EDMD)的四旋翼无人机学习和控制的新型数据驱动方法。 基于欧拉角(表示方向)等传统方法构建EDMD的观测器已知涉及奇异性。 为了解决这个问题,…...
TouchGal:打造纯净Galgame社区的5个简单步骤
TouchGal:打造纯净Galgame社区的5个简单步骤 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个专为视觉小说…...
Power BI视觉对象交互设计秘籍--巧用书签按钮实现动态提示
1. 为什么需要动态提示功能? 做数据分析报表最怕什么?不是数据不准,而是看报表的人看不懂。我见过太多这样的场景:精心设计的柱状图被用户误读,复杂的折线图被理解成完全相反的趋势。这时候你会想,要是有个…...
1998-2025年区县政府工作报告文本数据
县域政府工作报告是县级政府向同级人民代表大会汇报年度工作的核心文件,报告既总结上一年度经济社会发展和政府工作成效,也提出当前形势判断、政策取向及下一阶段重点任务,是集中反映政府施政理念、政策重点和发展方向的重要文本 整理了1998…...
避坑指南:CentOS虚拟机重启报rdsosreport.txt错误时,为什么xfs_repair有时需要-L参数?
CentOS虚拟机XFS文件系统修复实战:为什么-L参数是最后的救命稻草? 当你深夜加班部署服务,突然虚拟机异常断电,重启后屏幕上赫然出现"generating /run/initramfs/rdsosreport.txt"的报错——这个场景足以让任何Linux管理…...
