最近整了个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借阅管理的更多相关文章

  1. UML基础与Rose建模实训教程

    目  录 第1章  初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章  Rational Rose工具... 6 2.1 安装与配置Rational Ro ...

  2. NABCD

    1) N (Need 需求) 随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高.计算机信息处理系统的引进已彻底改变了许多系统的经营管理. 图书管理系统是学校管理机制中的重要组成部分 ...

  3. 图书馆管理系统SRS

    1.任务概述 1.1目标 主要提供图书信息和读者基本信息的维护以及借阅等功能.本系统是提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学.合理的规划,系统.高效的实施. 1 ...

  4. 16Aspx.com源码2013年10月到2013年12月详细

    创建时间FROM: 创建时间TO:   ExtJS合同管理信息系统源码 2013-12-13   [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...

  5. asp.net C# 题目大全

    net001在线饰品销售系统 net002鲜花商城 net003商品销售管理系统 net004在线辅导答疑 net005土地税务管理系统 net006旅游管理 net007房产中介 net008房产信 ...

  6. UML与软件建模:第一次作业(UML用例图绘制)

    uml第一次作业: 用例图是什么? 用例图我感觉就是把网站中各个用户的动作分解一下,再用rational rose软件把图画出来. 画例图主要分为三个步骤:a 确定系统角色  b 确定用例  c 对用 ...

  7. UML作业第一次:UML用例图绘制

    UML第一次作业 一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦 ...

  8. UML与软件建模:第一次作业(用例图绘制)

    一.小结 用例图是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和结束. 用例图的要素: (1)参与者,即与用例存在交互关系的系统外部实体; (2)用例,用来描述个 ...

  9. UML第一次作业

    一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦,用plantum ...

随机推荐

  1. 新版微信h5视频自动播放

    微信最近升级了新版本,直播视频不能自动播放,经过了一番探索,发现下列方法可以实现自动播放. if (typeof WeixinJSBridge == "undefined") { ...

  2. VMWare虚拟机设置固定ip上网方法

    转自:http://blog.csdn.net/cyberrusher/article/details/7269795 1. 在VMWare工具栏中打开:编辑--->虚拟机网络编辑器, 打开VM ...

  3. SQL函数

    1,字符串截取拼接 CONCAT(),'****');SUBSTRING_INDEX(c.context,'}',1);SUBSTRING_INDEX(a.task_context,':',-1) a ...

  4. oracle更改用户名

    例如,用户名test1改为test2,在plsql界面中不支持直接更改,只能通过sql更改 1.查询系统user$中的user#值 select user#,name from user$ where ...

  5. less文件编译成微信小程序wxss文件

    2016年9月21日,微信小程序正式开启内测.在微信生态下,触手可及.用完即走的微信小程序引起广泛关注,刷爆朋友圈子.在这样的火爆氛围中,作为一个前端开发者的我,也悄悄地去尝鲜.在做demo小示例的过 ...

  6. ThinkPHP3.2中if判断条件是两个变量

    <select name="typeId"> <foreach name="typeInfo" item="v"> ...

  7. IT关键词,发现与更新,点成线,线成面,面成体

    时序图 1.什么是时序图 2.如何看懂时序图 3.时序图的作用 4.如何绘制时序图 分布式 一个业务分拆多个子业务,部署在不同的服务器上. 分布式是指将不同的业务分布在不同的地方. 而集群指的是将几台 ...

  8. js /jquery停止事件冒泡和阻止浏览器默认事件

    1>js阻止冒泡事件 var el = window.document.getElementById("a"); el.onclick = function (e) { // ...

  9. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  10. java.nio.file.Path

    public interface Path extends Comparable<Path>, Iterable<Path>, Watchable 1. A Path repr ...