最近整了个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. phpstrom正则替换

  2. 相机位姿估计0:基本原理之如何解PNP问题

    关键词:相机位姿估计 PNP问题求解 用途:各种位姿估计 文章类型:原理 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-18 @Lab: CvLa ...

  3. SQL知识整理二:锁、游标、索引

    锁 锁的模式 锁模式 描述 共享(S) 用于不更改或不更新数据(只读操作),如SELECT语句 更新(U) 用于可更新的资源中.防止当多个会话在读取.锁定以及随后可能进行的资源更新时发生常见形式的死锁 ...

  4. CSUOJ_1001

    /* * Title : A+B(II) * Data : 2016/11/09 * Author : Andrew */ #include <iostream> #include < ...

  5. 关于django访问默认后台admin的时候提示403错误,

    Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message because this ...

  6. LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现

    解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费 ...

  7. Vue 性能优化track-by

    Vue 是一个MVVM框架 所谓mvvm就是model-->view,view-->model. vue帮助我们实现了自动绑定.省点我们用JQUERY,zpeto 去操作dom的麻烦. 主 ...

  8. 上传文件创建目录 mkdir

    mkdir($save_path,0777,true); $save_path  :文件名 0777:权限 .windows 下面可以忽略 当创建多级文件目录的时候一定要加上 true

  9. 转:如何实现一个malloc

    如何实现一个malloc 转载后排版效果很差,看原文!   任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...

  10. fullpage 单屏高度超过屏幕高度,实现单屏内可以滚动并解决手机端单屏高度不正确的问题

    最近接触了好几次jquery.fullpage.js这个插件,实现整屏的滑动,效果很炫,用fullpage来实现也很简单,但是也碰到了一些问题和大家分享一下 1.单屏高度超过屏幕高度,实现单屏的滑动 ...