<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_疯子阿飞</title><subtitle type="text">爱玩程序</subtitle><id>http://feed.cnblogs.com/blog/u/37992/rss</id><updated>2011-02-21T01:33:16Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/37992/rss"/><entry><id>http://www.cnblogs.com/xiarugu/archive/2011/02/21/ie9-rc-submit-bug.html</id><title type="text">IE9 RC版的BUG发现</title><summary type="text">此BUG我在BETA版本的时候曾经提交过: http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html当form表单页面加载时处于隐藏状态, 而后用JS将form显示出来, 将导致在form中的input按下回车后不能触发表单提交.在RC版中, 该问题解决了一半: 如果用jQuery的$("form").show(), 即添加inline的style="display:block", 表单可以被回车触发提交.但如果是给form添加一个含有{display:block;}的className, 表单依然不能被回车触发提交.demo</summary><published>2011-02-21T01:33:00Z</published><updated>2011-02-21T01:33:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2011/02/21/ie9-rc-submit-bug.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2011/02/21/ie9-rc-submit-bug.html"/><content type="html">&lt;p&gt;此BUG我在BETA版本的时候曾经提交过: &lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html"&gt;http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当form表单页面加载时处于隐藏状态, 而后用JS将form显示出来, 将导致在form中的input按下回车后不能触发表单提交.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在RC版中, 该问题解决了一半: 如果用jQuery的$("form").show(), 即添加inline的style="display:block", 表单可以被回车触发提交.&lt;/p&gt;&#xD;
&lt;p&gt;但如果是给form添加一个含有{display:block;}的className, 表单依然不能被回车触发提交.&lt;/p&gt;&#xD;
&lt;p&gt;demo: &lt;a href="http://afei.name/demo/ie9/form-submit.htm"&gt;http://afei.name/demo/ie9/form-submit.htm&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;已经提交反馈, 希望在正式版发布时能够看到一个完美的IE9&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1959432.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2011/02/21/ie9-rc-submit-bug.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/12/17/1908767.html</id><title type="text">IE中jQuery.fn.text, jQuerey.fn.val 和 dom.innerText, dom.value 的换行与tab问题</title><summary type="text">最近使用jQuery的过程中发现关于.text, .val 和dom自身的.innerText, .value 在取值与赋值方面存在的差异.以及IE7与IE8的pre标签的呈现差异(即white-space:pre). 现与大家分享一下. 在IE中, 对pre标签的文本取值与赋值, 可以使用$("p").text("1\n2"), 亦可使用$("p")[0].innerText = "1\n2";不知道大家是否知道, 这两种方式的取值与赋值得到的结果, 产生的效果是存在差异的.换行符看过jquery-1.4.4的代码以后发现, 在最新版本的jQuery中, text取值使用的是获得最基础的te</summary><published>2010-12-16T20:23:00Z</published><updated>2010-12-16T20:23:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/12/17/1908767.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/12/17/1908767.html"/><content type="html">&lt;p&gt;最近使用jQuery的过程中发现关于.text, .val 和dom自身的.innerText, .value 在取值与赋值方面存在的差异.&lt;/p&gt;&#xD;
&lt;p&gt;以及IE7与IE8的pre标签的呈现差异(即white-space:pre).&amp;nbsp; 现与大家分享一下. &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在IE中, 对pre标签的文本取值与赋值, 可以使用$("p").text("1\n2"), 亦可使用$("p")[0].innerText = "1\n2";&lt;/p&gt;&#xD;
&lt;p&gt;不知道大家是否知道, 这两种方式的取值与赋值得到的结果, 产生的效果是存在差异的.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;换行符&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;看过jquery-1.4.4的代码以后发现, 在最新版本的jQuery中, text取值使用的是获得最基础的textNode的nodeValue, 也就是说, text取值和innerText取值的差异在于 nodeValue和innerText的差异:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;对网页自身代码的取值&lt;/strong&gt;&amp;nbsp;text() 返回的是1个字符char(13) 即 "\r",&amp;nbsp; innerText 返回的是2个字符char(13)+char(10) 即 "\r\n".&lt;/p&gt;&#xD;
&lt;p&gt;这里有一个诡异的问题:&lt;/p&gt;&#xD;
&lt;p&gt;当网页代码中包含一个自然换行时, text()可以取出这个换行符, 但是如果使用 innerText = innerText 赋值以后, 页面呈现没有发生任何变化, 但此时再用text()取值, 将无法得到换行符. 而使用text(text)的方式赋值后, 使用text()则可以得到换行符.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;赋值呈现&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;1. innerText使用\r或者\n都可以产生换行效果, 但在IE8中, 连续的\r和\n会被合并为一个换行效果(这跟正统的对回车符与换行符的理解相符). 但在IE7中, 无论\r与\n如何组合, 都无法产生连续换行的效果.&lt;/p&gt;&#xD;
&lt;p&gt;并且, 使用innerText产生的换行只能单向的, 也就是说, 只能产生换行效果, 这个换行符却无法再次通过javascript捕捉到(无论innerText还是text).&lt;/p&gt;&#xD;
&lt;p&gt;2. text在IE8中, 回车符\r和换行符\n产生同等的效果换行效果, 不会被合并, 并且可以被javascript捕捉到. 不同的是innerText对独立的\n捕捉到的是\n, 对\r\n捕捉到的是\r\n, 对独立的\r捕捉到的也是\r\n.&lt;/p&gt;&#xD;
&lt;p&gt;这里就会产生一个问题, 标准换行应该是两个字符\r\n, 但是如果使用jQuery将这个字符串呈现在pre中, 则会产生两个换行效果(IE8). 在IE7中, \n会变成一个空格的效果.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;制表符(\t)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;text方法的赋值和取值在处理制表符的时候都没有问题, 而innerText在赋值的时候则无法进行\t的赋值, 这个赋值的呈现效果将变成一个空格.再次使用innerText取回也会发现那个\t变成了char(32), 而使用text取回这个\t则会诡异得变成char(160)这么一个奇怪的值.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 18pt;"&gt;使用text还是innerText&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在呈现数据的时候, 究竟使用text还是innerText, 这取决于你数据库中的换行是\r, \n还是\r\n.&lt;/p&gt;&#xD;
&lt;p&gt;值得提醒的是, 在自然提交的表单中, 表单域中的换行符是正统换行, 即每个换行(效果)提交后都是完整的两个字符\r\n.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外还需要提醒各位的是, 虽然表单域在正常提交的情况下换行是\r\n, 但如果你是通过ajax提交的, 那么换行就变成\n了&lt;/p&gt;&#xD;
&lt;p&gt;因为.val()取值时, 会自动过滤掉\r字符.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;是不是看晕乎了, 我自己也很晕乎, 不过动动手, 去测试几个数据就会大概的明了了.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1908767.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/12/17/1908767.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/12/11/1903431.html</id><title type="text">自定义的Repeat类</title><summary type="text">因为一些依据性不强的道听途说以及个人偏见, 很不喜欢.NET的服务端控件. 主要是冗余代码问题以及一种强烈的根深蒂固的DIY癖.工作中经常需要将大量的字段信息以一定格式显示在页面上. 通常是Bind到一个DataView或Repeat控件中. 围绕着易用性, 改成如下调用方式:页面文件样式:调用方式:觉得想法不错的朋友欢迎顶顶, 觉得垃圾的也欢迎丢西红柿.实现代码我想园子里大部分人都很容易就能写出来, 这里就不写出来班门弄斧了, 主要是跟大家分享下想法.</summary><published>2010-12-11T13:39:00Z</published><updated>2010-12-11T13:39:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/12/11/1903431.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/12/11/1903431.html"/><content type="html">&lt;p&gt;因为一些依据性不强的道听途说以及个人偏见, 很不喜欢.NET的服务端控件. 主要是冗余代码问题以及一种强烈的根深蒂固的DIY癖.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;工作中经常需要将大量的字段信息以一定格式显示在页面上. 通常是Bind到一个DataView或Repeat控件中. 围绕着易用性, 改成如下调用方式:&lt;/p&gt;&#xD;
&lt;p&gt;页面文件样式:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;table&amp;gt;&#xD;
&amp;lt;tbody id="tbodyList" runat="server"&amp;gt;&#xD;
  &amp;lt;tr&amp;gt;&#xD;
    &amp;lt;td&amp;gt;{$id}&amp;lt;/td&amp;gt;&#xD;
     &amp;lt;td&amp;gt;{$date:"yyyy-MM-dd"}&amp;lt;/td&amp;gt;&#xD;
     &amp;lt;td&amp;gt;&amp;lt;a href="?customer_id={$customer_id}"&amp;gt;{$customer:text}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#xD;
  &amp;lt;/tr&amp;gt;&#xD;
&amp;lt;/tbody&amp;gt;&#xD;
&amp;lt;/table&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;调用方式:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;DataTable dtItems = db.GetTable(cmd);   //此处获得列表数据&#xD;
&#xD;
StringFormat.BindControl(this.tbodyList, dtItems);&#xD;
&#xD;
//StringFormat 即类名, 此处调用了其静态方法BindControl&#xD;
//字段名对应前台模板中的 {$field}, 可以规定格式为 {$field:"format"}&#xD;
//此处的format可以自定义(自己的类当然是自定义)&#xD;
//我常用的就是日期格式, 数字格式, 大小写, 或者text(经过Server.HtmlEncode的)&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;觉得想法不错的朋友欢迎顶顶, 觉得垃圾的也欢迎丢西红柿.&lt;/p&gt;&#xD;
&lt;p&gt;实现代码我想园子里大部分人都很容易就能写出来, 这里就不写出来班门弄斧了, 主要是跟大家分享下想法.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1903431.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/12/11/1903431.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/10/26/1861507.html</id><title type="text">重写System.IO.MemoryStream类, 实现LumiSoft.Net.POP3.Client单封邮件的下载进度显示</title><summary type="text">相信遇到过这个问题, 或者使用过LumiSoft收邮件的朋友只看标题就已经知道文章要说什么了.我们用LumiSoft.Net.POP3.Client收邮件的时候, 可以获得服务端的邮件总数, 那么没下载完一封邮件累加器加一, 除以邮件总数就可以得到总的下载进度.但是如果我们想得到单封邮件的下载进度呢, 很遗憾LumiSoft似乎没有这个功能, 不过Message.MessageToStream方法...</summary><published>2010-10-26T06:41:00Z</published><updated>2010-10-26T06:41:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/10/26/1861507.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/10/26/1861507.html"/><content type="html">&lt;p&gt;相信遇到过这个问题, 或者使用过LumiSoft收邮件的朋友只看标题就已经知道文章要说什么了.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们用LumiSoft.Net.POP3.Client收邮件的时候, 可以获得服务端的邮件总数, 那么没下载完一封邮件累加器加一, 除以邮件总数就可以得到总的下载进度.&lt;/p&gt;&#xD;
&lt;p&gt;但是如果我们想得到单封邮件的下载进度呢, 很遗憾LumiSoft似乎没有这个功能, 不过Message.MessageToStream方法给我们一个启示.&lt;/p&gt;&#xD;
&lt;p&gt;既然LumiSoft把Message写入到Stream里面, 那么应该是下载一部分就写入一部分, 只要我们在Stream的Write方法这里设置一个监视, 应该就可以知道当前这封邮件的下载进度了.&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;private class MailStream : System.IO.MemoryStream&#xD;
{&#xD;
	public int Total = -1;&#xD;
	public event DownloadProgressHandler DownloadProgress;&#xD;
&#xD;
	public override void Write(byte[] buffer, int offset, int count)&#xD;
	{&#xD;
		base.Write(buffer, offset, count);&#xD;
		if (this.DownloadProgress != null)&#xD;
			this.DownloadProgress(null, new DownloadProgressArgs((int)this.Length, Total));&#xD;
	}&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里直接复制了我项目中的一段代码, MailStream是一个子类, DownloadProgress是邮件下载类(父类)中的一个事件, 每当发生写入事件的时候触发这个事件, 就可以获得当前邮件的总字节数, 已下载字节数.&lt;/p&gt;&#xD;
&lt;p&gt;调用:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;stream = new MailStream();&#xD;
stream.Total = mail.Size;&#xD;
stream.DownloadProgress += new DownloadProgressHandler(Stream_DownloadProgress);&#xD;
mail.MessageToStream(stream);&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1861507.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/10/26/1861507.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html</id><title type="text">IE9 Beta的一个提交表单的bug</title><summary type="text">我们都知道在form中通常按下回车键会触发表单的submit事件.今天在 64位Win7+64位IE9 中尝鲜时发现一个bug.如果表单一开始是隐藏的, 然后用JavaScript显示出此表单, 将无法通过回车键触发表单的提交事件.测试地址如下: http://afei.name/demo/ie9/form-submit.htm已经提交给IE9的"发送反馈", 不知道这个软件老大的客户反馈会不会有...</summary><published>2010-10-19T09:55:00Z</published><updated>2010-10-19T09:55:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html"/><content type="html">&lt;p&gt;我们都知道在form中通常按下回车键会触发表单的submit事件.&lt;/p&gt;&#xD;
&lt;p&gt;今天在 64位Win7+64位IE9 中尝鲜时发现一个bug.&lt;/p&gt;&#xD;
&lt;p&gt;如果表单一开始是隐藏的, 然后用JavaScript显示出此表单, 将无法通过回车键触发表单的提交事件.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;测试地址如下:&amp;nbsp; &lt;a href="http://afei.name/demo/ie9/form-submit.htm"&gt;http://afei.name/demo/ie9/form-submit.htm&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;已经提交给IE9的"发送反馈", 不知道这个软件老大的客户反馈会不会有人看.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1855727.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/10/19/1855727.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/07/24/shanghai-juhui.html</id><title type="text">有多少上海的程序员, 大家约个时间出来聚聚</title><summary type="text">自己在一个小公司谋职, 遇上技术上的事情, 开心的, 不开心的, 迷惑的, 兴奋的, 很难有人一起分享.大家有哪些是上海的, 什么时候一起出来聚聚呀.有同样想法的朋友请留言, 并留下Email, 编码年龄, 以及住在哪个区. 格式如:疯子阿飞xiarugu@163.com十年普陀我会跟大家联系, 然后组织一次聚会, 大家意下如何啊.</summary><published>2010-07-24T03:51:00Z</published><updated>2010-07-24T03:51:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/07/24/shanghai-juhui.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/07/24/shanghai-juhui.html"/><content type="html">&lt;p&gt;自己在一个小公司谋职, 遇上技术上的事情, 开心的, 不开心的, 迷惑的, 兴奋的, 很难有人一起分享.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大家有哪些是上海的, 什么时候一起出来聚聚呀.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有同样想法的朋友请留言, 并留下Email, 编码年龄, 以及住在哪个区. 格式如:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;疯子阿飞&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:xiarugu@163.com"&gt;xiarugu@163.com&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;十年&lt;/p&gt;&#xD;
&lt;p&gt;普陀&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我会跟大家联系, 然后组织一次聚会, 大家意下如何啊.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1784247.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/07/24/shanghai-juhui.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/03/20/1690567.html</id><title type="text">关于更松散开放的数据结构的意淫</title><summary type="text">首先描述一下我所遇到的问题:两年前我开始为公司编写自己使用的"ERP", 之所以为"ERP"加上引号, 是因为不想被同行或更为专业的人士抨击.两年前公司的外贸业务也刚刚起步, 所以这个"ERP"的成长过程, 也就是公司业务发展的变更过程.从一开始的简单的产品信息入库, 到在线订单, 订单管理, 采购管理, 发货管理, 库存管理, 生产管理, 到现在正在进行的"供应链"的整合.这同时也是一个程序员挠...</summary><published>2010-03-20T09:52:00Z</published><updated>2010-03-20T09:52:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/03/20/1690567.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/03/20/1690567.html"/><content type="html">&lt;p&gt;首先描述一下我所遇到的问题:&lt;br /&gt;两年前我开始为公司编写自己使用的"ERP", 之所以为"ERP"加上引号, 是因为不想被同行或更为专业的人士抨击.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;两年前公司的外贸业务也刚刚起步, 所以这个"ERP"的成长过程, 也就是公司业务发展的变更过程.&lt;/p&gt;&#xD;
&lt;p&gt;从一开始的简单的产品信息入库, 到在线订单, 订单管理, 采购管理, 发货管理, 库存管理, 生产管理, 到现在正在进行的"供应链"的整合.&lt;/p&gt;&#xD;
&lt;p&gt;这同时也是一个程序员挠破脑袋的一部血泪史.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因为以前没有做过这样的系统, 所以开始的时候对后面的需求预估很不充分, 造成的结果就是, 每次需求发生改变的时候, 多会发现之前的数据库结构设计不合理.&lt;/p&gt;&#xD;
&lt;p&gt;表名, 字段名, 数据类型设计不合理, 等等.&lt;/p&gt;&#xD;
&lt;p&gt;但是为了维持原有的数据, 业务不中断, 避免大规模的更新升级, 一直是缝缝补补, 不停得加字段, 改字段, 加表, 改表.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每次更新都要从前端的JS, 表现层, 业务层, 数据层, 数据库结构统统改一遍, 不胜其烦.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我个人熟悉使用JavaScript, 其实仅就语言风格和"语法糖"来说, Javascript是我最喜欢的语言.&lt;/p&gt;&#xD;
&lt;p&gt;所以有时候会想, 如果更改需求只需要修改js就好了, 一个object, 有某个属性的时候就获得, 以前没有定义过的属性, 他会告诉你是null, 而且这并不妨碍你随时为他加上任意一个类型的属性, 甚至可以是一个function.&lt;/p&gt;&#xD;
&lt;p&gt;直接赋值数据, 直接提取数据, 不需要修改类结构, 不需要声明, 不需要管他怎么存储(数据库结构).&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个时候, 会有朋友跳出来说, 那整个项目会乱套的, 没有人知道什么数据是什么结构, 什么逻辑. 因为没有了对象结构的定义!&lt;/p&gt;&#xD;
&lt;p&gt;我弱弱地说一句: 是否可以作些简单的文档说明呢. 这里最主要的就是一个类结构的问题, 其实只要及时更新文档, 写明哪些实体包含哪些属性, 属性的变量名是什么就可以了.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我想至少在单人开发的小项目中, 尤其是需求变更特别厉害的项目, 这种方法应该很好的吧??&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外这个想法还得益于对wordpress的一些简单解读.&lt;/p&gt;&#xD;
&lt;p&gt;wordpress的数据库结构很简单, 几乎所有的实体都存在一个wp_post表里, 而这个表也只有一些最基础最简单的字段. 其他的扩展实体属性(Plugin后加上的), 全都在一个统一的附属表wp_post_meta里面. key=&amp;gt;value. 真简洁!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;业务的变更只需要改仅少量的代码, 不需要修改数据库结构. 真好.&lt;/p&gt;&#xD;
&lt;p&gt;当然这样付出的代价应该是性能吧, 需要大量的left join. &lt;/p&gt;&#xD;
&lt;p&gt;不过, 小应用中, 这点性能的牺牲, 又算得上什么呢.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;意淫一把, 继续痛苦的修改.&amp;nbsp; 希望哪天哪个公司能够出个不需要定义表结构的数据库.....&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiarugu/aggbug/1690567.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiarugu/archive/2010/03/20/1690567.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2010/01/27/1657272.html</id><title type="text">在iXWebHosting上安装WordPress遇到的问题，及解决方案</title><summary type="text">最近在iXWebHosting的虚拟主机上安装WordPress，遇到两个问题。这里跟大家分享一下解决方法。只能安装到子目录的问题使用iXWebHosting提供的cPanel后台的EasyApps Collection直接安装应用程序WordPress的时候，安装位置必须输入一个目录名，也就是说，WordPress必须安装到一个网站的某个目录中，而我是想直接安装到该网站的根目录下。只能折衷一下：...</summary><published>2010-01-27T02:22:00Z</published><updated>2010-01-27T02:22:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2010/01/27/1657272.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2010/01/27/1657272.html"/></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2009/12/16/1625519.html</id><title type="text">抛弃使用runat=server的form</title><summary type="text">godaddy的页面改版了，不知道是不是审美疲劳的原因，反正看着比以前舒服了。在接触Lunarpages以前很喜欢Godaddy，价格便宜速度也不错。后来有一阵子很喜欢模仿godaddy的页面布局形式，因为它的很多管理页面功能很强大，可以有足够多的空间来放置部署一些命令按钮和显示信息。但是godaddy一直使用runat=server的form，传统的ASP.NET页面形式是个人非常不喜欢的。冗长...</summary><published>2009-12-16T05:43:00Z</published><updated>2009-12-16T05:43:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2009/12/16/1625519.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2009/12/16/1625519.html"/></entry><entry><id>http://www.cnblogs.com/xiarugu/archive/2009/11/17/1604624.html</id><title type="text">维基百科：坏坏的百度</title><summary type="text">昨天从维基百科转载了一个APNG的词条到百度百科，今天收录了。然后无意中发现一件事情：在百度搜索APNG的时候，百度百科和维基百科分明网页内容是一样的，简述中维基百科显示的却是从二级内容开始，而百度百科是从基本简介开始。大家知道，搜索一个词条，上面的概念介绍的页面显然会比下面的貌似历史的文字更能吸引人。本以为是页面代码方面有问题，但是分析了一下维基和百度百科的页面代码，相差无几，都在概念介绍部分对...</summary><published>2009-11-17T06:53:00Z</published><updated>2009-11-17T06:53:00Z</updated><author><name>疯子阿飞</name><uri>http://www.cnblogs.com/xiarugu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiarugu/archive/2009/11/17/1604624.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiarugu/archive/2009/11/17/1604624.html"/></entry></feed>
