BookRent借阅管理
最近整了个BookRent的小应用,单机版、连本地sqlite db、wpf界面,其中涉及到一些有趣的小功能和小坑,简单小结一下。
项目结构是wpf ui->view model->repository->sqlite db,各层间用接口隔开,写在1个项目里,拆起来也方便。
1. DataRepository层的Cache
在数据存取层封了个Cache,只在这一层内部使用,外部不知道Cache的存在。可以改进的地方有:
- repository的代码比较相似,可以引入T4等模板工具
- query里的getCache、add/delete/update里的setCache可以引入entlib等工具里的aop
- 如果逻辑简单,直接用template;复杂一些就用aop。目前的场景下template够用了
- 对db和cache的操作应该封到1个transaction里,否则出错了就不一致了
- 目前queryCondition是查出所有后,再在内存里过滤。数据量大一些之后,可以考虑引入EF.sqlite之类的ORM工具
- 目前不支持启动时创建db、验证db等,也可以考虑扔给orm去做
- 删除列: sqlite默认不支持删除列,所以只能建临时表、拷贝数据、再重命名。详情见这个stackoverflow的帖子。
2. Model层
Model层虽然简单,但也有些小坑:
- 原以为ISBN是唯一的,结果一查,ISBN与书(特别是系列书)之间完全是多对多的关系,根本就是一团乱麻,据说是取决于各出版社的喜好。所以,主键采用sqlite默认自增长的rowid,对象的equality比较也用rowid。
- 注意enum里要用
enum Types { Type0 = 0, Type1 = 1 }
的形式,不然以后enum里换顺序就坑了
3. ViewModel层
- 这里会听一些插件的消息,注意Timer或ThreadPool里发消息的不是ui线程,要扔给Dispatcher由它排入ui线程的队列里等待处理
- 还会听其他ViewModel的消息,同步更新Model的状态,用户不需要反复点查询
4. View层
- 新增/编辑时采用无弹框的设计,改了就直接保存,大量录入时会很方便。
- 没做启动闪屏、没做菜单的动态加载,启动时加载所有(3个)页面,会有卡顿感,页面多了要改为动态加载,配合unity之类的。
- 所有按钮都绑定快捷键,可全键盘操作,但没做成可配置的。
5. 插件Plugins
- 所有插件都读取app.config的配置,并设置timer定时执行。为方便可读,很多config项和enum都直接用中文。
- IsbnPlugin的功能比较有趣,可根据isbn访问豆瓣rest api获取书名、价格、作者、出版社等信息。这个插件配合扫描枪录入isbn,录几百本书都轻松愉快。甚至可以批量导入isbn号。为了减少server的压力,豆瓣限制每分钟每IP访问次数约为2.5次。为防止被封IP,限制程序每30秒访问一次。
- sqlite db是本地文件,因此要做本地备份。如果能联网的话,还可以配合baidu云盘的api备份到云端。
- 嘲讽的是,做完才知道,用户没法联网。只能呵呵了。
6. 其他
- 还有1个有趣的点是用户希望输入拼音首字母快速检索。原以为要用什么算法,百思不得其解。结果一搜索,擦,全是穷举映射。想想也对,中文字形和拼音之间确实没什么关系。比较了一下,选用园子里kingboy2008的这篇,特此表示感谢!简单的实现,多半是不支持多音字的。要支持多音字,又要继续穷举了。实现之间的差别,只在准确度、内存消耗、查找速度上。
基本就这些,后续可以考虑转成b/s+mobile上,练手呗。
BookRent借阅管理的更多相关文章
- UML基础与Rose建模实训教程
目 录 第1章 初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章 Rational Rose工具... 6 2.1 安装与配置Rational Ro ...
- NABCD
1) N (Need 需求) 随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高.计算机信息处理系统的引进已彻底改变了许多系统的经营管理. 图书管理系统是学校管理机制中的重要组成部分 ...
- 图书馆管理系统SRS
1.任务概述 1.1目标 主要提供图书信息和读者基本信息的维护以及借阅等功能.本系统是提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学.合理的规划,系统.高效的实施. 1 ...
- 16Aspx.com源码2013年10月到2013年12月详细
创建时间FROM: 创建时间TO: ExtJS合同管理信息系统源码 2013-12-13 [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...
- asp.net C# 题目大全
net001在线饰品销售系统 net002鲜花商城 net003商品销售管理系统 net004在线辅导答疑 net005土地税务管理系统 net006旅游管理 net007房产中介 net008房产信 ...
- UML与软件建模:第一次作业(UML用例图绘制)
uml第一次作业: 用例图是什么? 用例图我感觉就是把网站中各个用户的动作分解一下,再用rational rose软件把图画出来. 画例图主要分为三个步骤:a 确定系统角色 b 确定用例 c 对用 ...
- UML作业第一次:UML用例图绘制
UML第一次作业 一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦 ...
- UML与软件建模:第一次作业(用例图绘制)
一.小结 用例图是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和结束. 用例图的要素: (1)参与者,即与用例存在交互关系的系统外部实体; (2)用例,用来描述个 ...
- UML第一次作业
一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦,用plantum ...
随机推荐
- quantile normalization原理
对于芯片或者其它表达数据来说,最常见的莫过于quantile normalization啦. 那么它到底对我们的表达数据做了什么呢?首先要么要清楚一个概念,表达矩阵的每一列都是一个样本,每一行都是一个 ...
- 安装rabbitMQ delayed-messaged
由于一些原因,消息需要延迟发送给消费者,可以用delayed-messaged插件 在 /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins目录下 # ...
- 27.solr集群
搭建solr集群整个架构: 前提: (1)zookeeper集群 (2)最好做系统间拷贝免密码(频繁复制东西输密码太麻烦) (3)软件solr.*.zip zookerper.*.tar.gz i ...
- FAQ
1.Baudrare and the speed of Byte. 2. Linux FS and Flash store. 3. SW's Coupling. 4. Protocol and Pro ...
- 个人博客作业Week3
一.调研 下载并使用,按照描述的bug定义,找出几个功能性的比较严重的bug.至少两个.用专业的语言描述(每个bug 不少于 40字),如有必要,可以配图. 电脑用户未登录就能使用单词本功能,万一是用 ...
- Wiki介绍
Wiki是一种高效的知识管理系统. 我们可以使用wiki构建自己的个人知识管理系统.
- HTML的基本骨架
HTML:生命html网页当前范围,所有内容写在该标签中 head:用来设置当前页面的一些属性及样式等等.这部分是用户看不到的,title除外. body:网页的内容部分,网页中所有布局写在该标签中. ...
- Python中Paramiko协程方式详解
什么是协程 协程我们可以看做是一种用户空间的线程. 操作系统对齐存在一无所知,需要用户自己去调度. 比如说进程,线程操作系统都是知道它们存在的.协程的话是用户空间的线程,操作系统是不知道的. 为什么要 ...
- ie8兼容性(不支持trim 、readonly光标、乱码encodeURI())
IE8下String的Trim()方法失效的解决方案 1.用jquery的trim()方法,$.trim(str)就可以了. 2.String扩展: 第一种 String.prototype.trim ...
- Android编译环境折腾记
题记:感觉是时候写点什么了=_=! 第一次安装了ubuntu14.04.5,官网下载的iso,官网下的jar,编译android4.x需要安装jdk6,更高的版本会有问题,baidu到很多搭建环境的步 ...