【原创】自己动手写工具----XSmartNote [Beta 3.0]

一、前面的话

在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了宝贵的意见。最后决定吸收园友的建议把这个工具重构一下。首先给它换了个名 称,XSmartNote。因为各种自身的原因,并没有完成这个工具的基本功能,只是实现了基本的框架。最近有点时间就搞了一下,权当做打下基础。本来想用B/S结构来重新搞一下,毕竟园子里有很多大牛都是专注于ASP.NET MVC,但仔细想想还是不要总写一些烂尾楼工程的好,其实采用那种架构都无所谓,毕竟是个人使用的小工具,一个是事件驱动、一个是请求响应模型,不同的也是只表现方式不一样。

二、XSmartNote能干什么?

每天都在关注着园子里的动态,看着各位大神分享着各种新技术,感觉自己要学习的东西太多了,但是各种知识点零零散散地没有分门别类,看过后又忘记了,很难达到学习的效果。所以希望能通过对知识的标签化,进行分门别类的总结梳理,想看的时候,通过标签来查找过滤出相关的知识点,进行学习和巩固,岂不美哉~这也同样适用于对编程经验的总结,养成习惯后,时间久了,所积累下来的可是一笔不小的知识财富。补充一句,有人会说现在网上有很多很多的现成的工具,如印象笔记、有道云笔记,各种笔记... ...干嘛不用?我只想说,用自己造的东西会很爽好嘛!

三、和上一个版本有什么区别?

在上一个版本中,只是简单地勾勒出一个大概的轮廓,目前的版本对上一个版本进行了扩充和实现,与上一个版本还是有很大区别的

1、底层数据操作

数据层由原来基本的最基础的ADO.NET操作,新版本中摒弃了最基本的SQL操作,采用了NHibernate框架,该框架为我们封装了很多的功能,这样就大大减少了工作量,避免了过多的sql脚本的编写,同时也避免了由脚本数量过大不可避免产生Bug的问题。NHibernate框架提供了对原生sql的支持,多表查询和复杂查询,可以直接使用原生sql,还支持Example查询。NHibernate配备了一种非常强大的查询语言HQL,这种语言看上去很像SQL。但是不要被语法结构上的相似所迷惑,HQL是有意识地被设计为完全面向对象的查询语言,它可以理解如继承、多态和关联之类的概念。NHibernate框架还有很多高级功能,如事务并发、提高性能的二级缓存等,由于没有使用,暂且不做讨论。

以下代码实现了根据Post的Id找到所有Tag,借助ADO.NET原生数据操作方式,可以看到,需要自己手动编写SQL脚本,这仅仅是这个小的功能点,如果涉及的表相对较多,那出错的几率就会大大提升,而且错误在编译期是看不出来的,这样就有可能会把错误推向运行期。

 1 private static DataTable QueryTable(StringBuilder sbcmd)
 2 {
 3     using (SqlConnection conn = SQLHelper.CreateConnection())
 4     {
 5         conn.Open();
 6         using (SqlCommand cmd = new SqlCommand(sbcmd.ToString(), conn))
 7         {
 8             DataTable dt = new DataTable();
 9             SqlDataAdapter sda = new SqlDataAdapter();
10             sda.SelectCommand = cmd;
11             sda.Fill(dt);
12             return dt;
13         }
14     }
15 }
1 //取得指定文章Id包含的标签
2 public static DataTable GetTagsByPostId(int id)
3 {
4     StringBuilder cmd = new StringBuilder(
5     string.Format("select t.tagContent,t.tagId from Table_Content c,Table_Content_Tag ct,Table_Tag t "));
6     cmd.Append(string.Format(" where c.Id=ct.postId and t.tagId=ct.tagId and c.id={0} ", id));
7     return QueryTable(cmd);
8 }

下面来看看采用NHibernate框架后,这段代码的实现。可以明显地看出,代码量减少,结构清晰,仅仅需要一行代码就可以取得指定Post的所有Tag。

 1 //取得指定文章Id包含的标签
 2 public IList<Tag> GetTagsByPostId(Guid Id)
 3 {
 4     IList<Model.Tags.Tag> tags = null;
 5     using (ISession session=sessionFactory.OpenSession())
 6     {
 7         ITransaction trans = session.BeginTransaction();
 8         try
 9         {
10             tags = session.CreateCriteria(typeof(Tag)).CreateCriteria("Posts").Add(Restrictions.Eq("Id", Id)).List<Tag>();
11         }
12         catch (Exception)
13         {
14             trans.Rollback();
15             throw;
16         }
17         return tags;
18     }
19 }

2、界面优化

先看下整体效果:

多主题支持:

在上一个版本中,由于只顾架构功能的设计,没有把重心放在界面的美化上。该版本采用了免费的CSkin界面库,对于提升界面UI整体的效果还是不错的,只需引用相关DLL组件即可。CSkin界面库是免费使用的,但是源码并不开源。以下是官方对CSkin界面库的简要的描述。

精简大量不必要代码,减小UI库体积,优化程序速度,使得库更加轻巧好用。

启用全新CSkin界面引擎,重塑界面UI每个角落,带来崭新体验,更加流畅轻快简洁,更不简单。

大量减少生硬的变换效果,注入更多轻快灵动的变化反馈,响应迅速。

同时支持多主题切换,目前有玫瑰红、宝石蓝、青葱绿、小鸭黄等主题(主题名称是我自己想的,有更好的意见可以告诉我),后续会支持更多主题配色方案,并且开放接口,允许以插件的方式开发自己喜欢的主题样式。同时增加了主界面对各个分辨率屏幕尺寸的自适应。让工具不仅仅是工具,用起来更舒心,提高使用的积极性。

3、提升性能

重构代码的时候,发现有好多代码段大量地创建新对象,如果我们使用过程中,积累的Note和标签越来越多,是会影响到工具性能的,所以把一些常用的设计模式融入到软件之中。例如,每个实体都有一个自己的数据库操作类,这里我把数据库操作类封装成单例模式,这样每次使用的都是同一个对象,如果不存在该对象或该对象被销毁才会创建新的对象,这样就提升了工具的性能。例如,下面的主题管理类:

 1 //主题管理类
 2 public class ThemeManager:IThemeManager
 3 {
 4     private static ThemeManager themeManager;
 5     private MainForm mainForm;
 6     private event Action<ThemeEnums.ThemeEnum> ThemeChangeEvent;
 7     private static object _lock = new object();
 8     private ThemeManager(MainForm mainForm)
 9     {
10         this.mainForm = mainForm;
11         ThemeChangeEvent += mainForm.SetTheme;
12     }
13
14     public static ThemeManager CreateThemeManager(MainForm form)
15     {
16         ThemeManager _themeManager;
17         if (themeManager == null)
18         {
19             lock (_lock)
20             {
21                 if (themeManager == null)
22                 {
23                     _themeManager = new ThemeManager(form);
24                     themeManager = _themeManager;
25                 }
26             }
27         }
28         return themeManager;
29     }
30
31     public void ChangeFormTheme(ThemeEnums.ThemeEnum enums)
32     {
33         if (ThemeChangeEvent != null)
34         {
35             ThemeChangeEvent(enums);
36         }
37     }
38 }

以及每个实体的数据操作类,这里以PostContents为例:

 1 //PostContents操作类
 2 public class PostContentsDAO : IPostContentsDAO
 3 {
 4     private ISessionFactory sessionFactory;
 5     private static PostContentsDAO PostContentsDao;
 6     private static object _lock = new object();
 7     private PostContentsDAO()
 8     {
 9         //在构造函数中获取配置,并产生SessionFactory
10         var cfg = new NHibernate.Cfg.Configuration().Configure("../../Config/hibernate.cfg.xml");
11         sessionFactory = cfg.BuildSessionFactory();
12     }
13
14     public static PostContentsDAO CreatePostContentsDAO()
15     {
16         PostContentsDAO _PostContentsDao;
17         if (null == PostContentsDao)
18         {
19             lock (_lock)
20             {
21                 if (null == PostContentsDao)
22                 {
23                     _PostContentsDao = new PostContentsDAO();
24                     PostContentsDao = _PostContentsDao;
25                 }
26             }
27         }
28         return PostContentsDao;
29     }
30 }

4、自定义控件

更新了若干个用户自定义控件,包括带CheckBox的可选标签、普通的Note展示标签以及仅用于展示标签的圆角矩形控件,采用自定义控件可以最大程度上灵活地控制控件的属性以及事件,无论从灵活性和外观上都是不错的选择。后面的文章我会单独把控件拿出来分享。

四、以后会有什么炫酷功能?

关于这个问题,我很认真地思考了一下,大概总结了如下几个功能点:

1、 目前的版本还尚未实现根据标签筛选Note的功能,只是将标签与Note相关联,后续版本会根据标签进行实时过滤;

2、 对代码片段的支持,我会编写一个用户控件专门用于对代码编辑的支持,它和文本编辑的方式是不同的,我觉得这是最炫酷的功能啦;

3、 增加控制面板,把一些功能的接口暴露出来,以控制面板的方式展现在用户面前,随心所欲地进行配置,如主界面透明度、颜色、控件属性等,更加丰富灵活;

4、 集成自定义翻页控件,目前的版本右侧Note展示区域默认显示某类别下的所有Note,并且存在万恶的滚动条,用起来不是很方便,所以我会集成一个漂亮的翻页控件,目前正在开发中;

5、 支持插件式开发,工具会提供一些接口,以插件的方式开发用户自己的特有功能,比如以插件的方式开发自己喜欢的主题或是一些定制功能;

6、 添加系统日志,记录用户的每一个操作,以及系统错误信息收集。

7、 多数据库支持。目前我采用的数据库是SQL Server 2008 R2版本,有点大材小用了,后续会支持Access、SQLite,这样就会便于携带,放在U盘里也可以哟~

五、唠叨一下

目前这个小工具在功能层面还处在初级阶段,上面第四点中提及的功能好多都还没有实现,本文中只截取了一点点代码用于解释版本差异,全部代码我会发布到GitHub上。由于本人时间和精力有限,所以希望园子里有兴趣的园友能和我一起完善这个工具。在这里附上GitHub地址,XSmartNode 。求Star,求Star,求Star。后面的文章中我会把相关的控件开发过程贴出来,都是一些基础性的东西,希望对初学者有所帮助,大神请绕道。本人能力有限,如果在表述的过程中有什么错误,还请多多指教,感激不尽。另外,我会把本篇文章同步发布到我的简书上。如果觉得文章还可以,请推荐一下哦,您的推荐是我写工具的最大动力!

作者:悠扬的牧笛

博客地址:http://www.cnblogs.com/xhb-bky-blog/p/5504570.html

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-08-25 21:52:06

【原创】自己动手写工具----XSmartNote [Beta 3.0]的相关文章

【原创】自己动手写工具----随手记(最终版)

一.前面的话 在上一篇自己动手写工具----随手记中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版evernote”,我想说的是,别人的工具再好用,终究不是自己写的,其实写这个的目的,一方面是锻炼自己的技术能力,在coding的时候,或多或少会遇到一些问题,在解决这些问题的过程中,技术能力就会有所提升:另一方面,写这个东西还有自己个人原因,可以随时记录一些繁杂的知识点,通过给这些知识点打上标签,可以实现归类,那有

【原创】自己动手写工具----签到器(升级版)

一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程任务: (2)任务按照进程进行分类:用IE就是执行IE的任务,与其他(如资源管理器等)无关: (3)每执行完一个任务关闭任务窗口: (4)对签到性质的任务进行”已签到“过滤: (5)实现执行的任务列表自定义: (6)另外实现任务的可视化: 还是先来看看效果图: 二.签到器的改进 在上一个版本中,(自

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

【原创】自己动手写工具----随手记

一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这么多的材料,如果挨个翻看还不得累死.我们知道每个Word或者PPT打开至少要4秒钟(我的电脑是这样,配置不赖),那几百个下来什么也不用做了,时间都在打开这些材料中度过了.而记录这些东西,又不需要花费专门的精力,只要想记下来,copy,paste,加上标签便于检索就OK啦~于是这个小玩意儿就产生啦~\

自己动手写工具:自动点击小插件

一. 模拟点击操作应用场景 当我们需要对一个网页上的某个按钮进行多次点击以求得某种“好处”的时候,例如天猫的抢红包活动,我们可能需要点击N次之后才有可能获得一个红包,但是这个N是一个未知数,有可能我们要不停地点击半个小时甚至一个小时都还无法获得,自己估计也会点鼠标点得醉了.因此,针对这种情况,我们希望自己写一个小工具来让计算机帮我们做这件事. 既然是让计算机模拟我们的点击操作,其思路自然是找到指定的按钮或图片,循环对其执行click事件.于是,我们开始对其做一个最简单的实现来看看其基本思路.首先

【原创】自己动手写控件----XSmartNote控件

一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的label扩展控件,还有包含自定义事件的含checkbox的控件.自定义控件的好处就是其灵活程度很高,不但可以扩展控件的外观,还可以扩展控件的事件,甚至从底层拦截Windows消息进行处理,这也是我喜欢自己写控件的原因.至于自定义控件的几种形式在这里就不说了,有兴趣的小伙伴可以百度一下,下面来看看这些控件的

【原创】连“霍金”都想学习的“人工智能”---【自己动手写神经网络】小白入门连载开始了(1)

欢迎关注[自己动手写神经网络]的博客连载!!! 第1章 神经网络简介 神经网络这个词,相信大家都不陌生.就在你打开本书,并试图了解神经网络时,你已经在使用一个世界上最复杂的神经网络——你的大脑,一个由大约1000亿个神经元(每个单元拥有约1万个连接)构成的复杂系统.但人的大脑太过复杂,以至于科学家们到目前为止仍然无法准确解释大脑的工作原理和方式.但有幸的是,生物神经网络的最最基本的元素已经能够被识别,而这就构成了本书想为你介绍的人工神经网络(Artificial Neural Network).

动手写一个Remoting测试工具

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首

《自己动手写框架8》:高屋建瓴,理念先行

<史记·高祖本纪>:"地势便利,其以下兵于诸侯,譬犹居高屋之上建瓴水也."这里用到了高屋建瓴这个词.意思是把瓶子里的水从高层顶上倾倒.比喻居高临下,不可阻遏的形势.现指对事物把握全面,了解透彻.此典故于汉高祖刘邦欲杀功臣韩信,大夫田肯进言到"陛下牢牢地控制着三秦(关中),陛下利用这雄险的地势,来控制.驾御诸侯,就如从高高的屋脊上把水从瓶子里倒下去."以此来表彰韩信的功劳,于是,刘邦赦免了韩信,只是将他降为淮阴侯. 同样,设计企业框架,也要对事物把握全面,