Fly with the wind-TerryDong

.NET on the way
posts - 17, comments - 45, trackbacks - 1, articles - 0

2009年4月15日

  • jquery&ajax
    • js 调试工具:
      • firefox->firebug:非常非常好用。
      • IE 8 -> 开发者工具:很好用,这一点相信微软借鉴了不少firebug的思想。
      • IE 6 -> 非常痛苦的经历下,找了几个工具定位错误以及调试。IETester:基本可以满足,但是下载的版本与debugbar无法兼容,只能当个个多浏览器使用。debugbar and CommonJS 还不错,可以详细的列出引发一个js错误的所有入口点。
    • js 在vs 2008 中调试已经非常好用了。但一个莫名奇妙的错误,导致查找了一天,查遍了全球互联网。最后可笑的是,加一小段代码解决。分析原因是IE 6下对js的支持不够好,post回来的数据在下拉框中设置selected=true 无法找到对象。加入settimeout函数搞定。
    • 经验:
      • jquery的插件还算比较成熟,品种也繁多。
      • 如果只用基本的选择器封装就没必要了。毕竟对网页的速度有一定的影响。如果一个页面需要写超过200行左右的js代码,或者你需要用一个成熟的插件,建议使用。
      • js类库与jquery冲突:解决办发,使用jQuery("") 代替 $("")
      • 对于jquery的语法规则,确实是简单实用。但习惯了面向对象编程的方式后,更倾向于面向对象的方式。
  • 轻量级API
    • API 返回Json格式的数据,js处理起来方便
    • API 实现方式很多。这次用的是一个generic handler文件完成了API接口,对于web form 的应用是一个很好的选择
  • UnitTest
    • 单元测试在编程过程中起到了很大帮助。
    • 对于单元测试,很多人有很多顾虑,因为需要写一大堆测试用例,vs2008 中自带的单元测试,高度集成,很方便可以完成方法单元测试方法的Generated。好处在于:当你修改类库方法的时候,测试用例做回归很好,对于web form的unittest也支持的不错。
    • 单元测试的覆盖面:
      • 对于敏捷的小团队来说,单元测试覆盖到重要的数据访问以及业务逻辑就可以了。你可以再UI制作的时候,编写业务逻辑代码
      • 一个方法中,覆盖多种情况

posted @ 2009-04-15 14:06 Terry Dong 阅读(20) | 评论 (2)编辑

2008年11月7日

一个多月的时间,终于把支付平台这个阶段性项目release了,经过几天的bug fix 已经基本趋于稳定。期间发生的许多事情值得记录和总结。

项目的数据复杂度比较高,数据库的重新设计与迁移是痛苦的。为了保证不影响运营,采取了保守的写2边的做法。

 

项目采取的步骤:

  1. 在没有任何文档的情况下,查找所有涉及到要迁移的表的功能。以文件的方式查找asp页面,存储过程。(痛苦的经历)
  2. 总结查找到的功能与在线的功能对比,到底哪些还在继续使用,哪些功能不用了。(没文档的痛苦.too)
  3. 功能重写讨论,分解工作任务,讨论数据新的数据流向怎样集成到现有功能中
  4. 开发,期间对于数据库的操作反复讨论,几乎结对编程。
  5. 测试,期间导款功能返工,原有代码极为混乱,改动难度很大造成。
  6. 部署后的bug fix,期间业务部门提出了功能不好用以及新需求。

 

总结:

  1. 文档的重要性,对于后来者以及系统重构的意义。
  2. 数据库的混乱。测试环境与正式环境的字段差异导致在测试时无法发现问题,上线时异常。
  3. 个人觉得对于一个业务复杂的交易平台。数据库的重要性不言而喻。怎样开发、测试、上线呢。以下是最基本的保证。
    • 开发库:开发人员基于的数据库环境。此环境中,可以根据新的开发需求,更改和新建数据库库,表,字段。当开发完成后,通知DBA把测试环境和正式环境的数据库更新
    • 测试库:应该保证测试库与正式库的一致性,才可以保证不会再上线时出现数据库差异导致的错误。
    • 正式库:生产环境的DB。
  4. 产品经理存在重要性,即使是数据迁移这类的项目,也需要有一个产品经理与开发经理,业务部门的沟通,产生最终产物PRD。
    1. 有些功能在数据迁移时,用户操作界面不得不更改。例如财务导款。
    2. 开发经理在性能上控制上进行把握,产品经理基于此把一些业务部门的需求屏蔽掉,或讨论采取其它方式实现。
    3. PRD的详细程度。其中应该包括压力需求。例如:要把2w条的数据一下导入的问题,事先开发人员不清楚。
  5. 功能模块的Design文档。应该严格要求必须先根据PRD撰写设计文档,包括页面处理逻辑,数据处理逻辑,使用的相关数据库。
  6. 尽量避免开发组人员与业务部门直接沟通。业务部门的需求总是无穷尽的,开发人员直接参与不会有任何结果。需要产品经理的控制。
  7. 代码的版本管理。主干和分支的模式需求在这次开发中产生,在支付平台开发的过程中,另外一个项目也同时要基于底层类库开发。导致了上线时间的依赖关联问题。
  8. 导款的重写,是在项目进入到测试阶段才发生的,开发人员连续加班4-5天才搞定这个问题。对于项目控制来说,这是很危险,应该尽量避免的,进一步验证了把原功能逻辑直接拿过来重写的方式是不推荐的。

 

目前只想到这些,项目还是按时release了。虽然有一些不如意的地方,这也是每个项目进行中不得不遇到的事情。

工作,工作流程,配置,协调,软件开发流程中的每一部份,都很重要,任何公司,组织都只能结合自己的情况一步一步优化。当然先进的流程模型敏捷开发,SCRUM ,MSF敏捷也许是经验总结之外的一个很好的借鉴。

posted @ 2008-11-07 17:08 Terry Dong 阅读(25) | 评论 (0)编辑

2008年10月31日

Jquery这个简洁,实用的轻量级框架,已在越来越多的网站中得到应用,电子商务这样交互性很强的网站也在一次次改版中采用了jquery与asp.net 的结合

这不失为一种聪明的选择。

最近几个月,当当网在网站的用户体验方面,大量使用了Jquery技术,Jquery.UI在网站中增色不少。

刚刚又看到京东商城酝酿了一段时间的新版网站已经上线了,通过页面的很多风格就可以找到jquery的影子。我们看一下他的source code.

<script type="text/javascript" src="http://beta.360buy.com/script/jquery-1.2.6.pack.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.badword.1.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.cookie.1.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.jcarousel.pack.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.jqzoom.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.livequery.1.0.2.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.login.1.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.query.2.0.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.timers.1.0.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.utility.1.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.validate.1.4.0.js"></script>

<script type="text/javascript" src="http://beta.360buy.com/script/jquery.validate.methods.1.4.0.js"></script>

 

这是摘自详情页的源文件,可以看出使用了大量的Jquery plugins 和Jquery UI。

 

顺便说一句,京东新版首页中增加了日常用品的大分类, 3C+百货 的布局可以看出他向 百货商场挺进的步伐

 

当当和卓越,在B2C领域中互相肉搏中,又多了一个竞争对手,这个对手值得尊敬。

淘宝在C2C市场,以及其中蕴含的非自营B2C模式的领域中,也会迎来百度有啊,拍拍的一轮又一轮挑战

 

这个冬天的电子商务,很火热,看不到寒冷

posted @ 2008-10-31 14:58 Terry Dong 阅读(188) | 评论 (1)编辑

2008年9月22日

很久没有更新blog了,最新面试了一些candidate时,发现很多朋友对于一些算法问题总是有些拿捏不好,可能是工作中用到不多的原因吧。我们一起来回顾一些典型算法。

此算法从时间复杂度,使用最小空间方面,都应该是最优了。

时间上执行了数组的n/2次

空间上只在原有的数组中进行操作

Code

posted @ 2008-09-22 10:21 Terry Dong 阅读(190) | 评论 (0)编辑

2008年5月12日

两个UC:A.ascx ,B.ascx

在A中FindControl后B的类型是UsesrControl,是B父类,不能直接使用B中的自定义方法和属性,不过我们可以通过反射的方式可以在A中获取B中的所有信息并可以操作B的方法

 

demo code:

//get u2 instance

UserControl u2 = (UserControl)this.Parent.FindControl("UC2_1");

//set u2's properties

u2.GetType().GetProperty("relaType").SetValue(u2, relaType, null);
u2.GetType().GetProperty("relaInfo").SetValue(u2, relaInfo, null);
u2.GetType().GetProperty("Cust_ID").SetValue(u2, Cust_ID, null);

//operate u2's method

MethodInfo mi = u2.GetType().GetMethod("BindUC2");
mi.Invoke(u2, null);

 

看看效果吧。

posted @ 2008-05-12 14:54 Terry Dong 阅读(88) | 评论 (2)编辑

2008年3月5日

     摘要: 原文地址:http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx Introduction ASP.NET 2.0 has many secrets, which when revealed can give you big performance and scalability boost. For instance, ther... 阅读全文

posted @ 2008-03-05 10:30 Terry Dong 阅读(212) | 评论 (0)编辑

2008年2月3日

方法特点:

支持多个位于不同数据库服务器的数据库的统一事务提交,如果任何一个操作失败,全部回滚

应用:可以应用于分布式数据库系统中,多sql的事务提交应用

 

    /// <summary>
        /// 多数据库服务器事务提交
        /// </summary>
        /// <param name="sqlStrings">key为connName,value为Sql语句</param>
        /// <returns></returns>
        public static bool ExecuteMultiTran(List<string[]> sqlStrings)
        {
            bool reval = true;

            SqlCommand cmd = new SqlCommand();
            SqlTransaction tran;
            SqlConnection conn;
            //事务对象名,事务对象的集合
            Dictionary<string, SqlTransaction> tranResult = new Dictionary<string, SqlTransaction>();

            //conn对象名,对象
            Dictionary<string, SqlConnection> connResult = new Dictionary<string, SqlConnection>();

            //当前是否执行成功
            bool isSuccess = true;

            //
            List<string> keys = new List<string>();

            //通过connName进行循环执行事务
            foreach (string[] sqls in sqlStrings)
            {
                string keyName = sqls[0];

                //如果keys中已经存在当前 keyname,说明改conn的已经执行完毕,跳到下一keyname执行
                if (!keys.Contains(keyName))
                {
                    keys.Add(keyName);

                    //提交当前conn的事务,如果失败,标记当前事务失败
                    try
                    {
                        CreateNewConnection(keyName);
                        conn = new SqlConnection(connectionString);
                        conn.Open();
                        cmd.Connection = conn;
                        tran = conn.BeginTransaction();
                        cmd.Transaction = tran;

                        //记录当前事务
                        tranResult.Add(keyName, tran);

                        //记录当前conn
                        connResult.Add(keyName, conn);

                        //读取当前conn的sql,执行
                        foreach (string[] sql in sqlStrings)
                        {
                            if (sql[0] == keyName)
                            {
                                cmd.CommandText = sql[1];
                                cmd.ExecuteNonQuery();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        LogUtility.WriteErrLog(ex);

                        isSuccess = false;
                    }

                    if (!isSuccess)
                    {
                        break;
                    }
                }
            }

            //如果当前事务失败,把执行过的所有事务对象rollBack
            if (!isSuccess)
            {
                foreach ( SqlTransaction sqlTran in tranResult.Values)
                {
                    sqlTran.Rollback();
                }
                reval = false;
            }
            else
            {
                foreach (SqlTransaction sqlTran in tranResult.Values)
                {
                    sqlTran.Commit();
                }
            }          
            //关闭conn
            foreach (SqlConnection value in connResult.Values)
            {
                if (value.State!= ConnectionState.Closed)
                {
                    value.Close();
                }
            }
            return reval;
        }

posted @ 2008-02-03 18:16 Terry Dong 阅读(338) | 评论 (5)编辑

2008年2月1日

 

设计方案

  • 通过LDAP进行用户登录验证,并读取用户域中所属角色。
  • 通过用户角色与权限的关联表,判断用户是否可以访问某个操作页面,如果不可以操作,提示用户没有相关权限,提供返回入口。
  • 记录用户所有的安全日志,操作日志(包括,增加,修改,删除,查询)

功能

  • 角色-功能-权限管理界面
  • 功能列表管理 
  • 功能模块管理 
  • 事件日志管理 

数据库backend_authorize

  • 功能表(function_list):功能ID, 功能名称, 功能介绍,上级功能ID, 功能网址,是否可用
  • 权限表(permission):权限ID,权限名称
  • 角色权限表(role_authorized): 角色权限ID,角色名称,用户职位,功能id,权限id
  • 事件日志表(event_log):ID, 用户名,客户端IP, 事件类型, 功能名称, 模块名称, 详细描述, 操作时间

场景

* 验证逻辑.jpg:
验证逻辑.jpg

备注:用户的职位存储于域用户的描述栏中,但由于目前内网域环境中,用户对应的描述为空,所以暂时不进行用户的描述判断,即用户所拥有的角色可以访问页面,即通过权限的验证。

数据规则


字段
数据规则与约定

function_list
fucntion_list_id
自增长,主键

name
功能名称

description
功能描述

parent_id
父功能编号,默认值为0,即基本功能

url
功能网址,存储规则:Request.Url.AbsolutePath的值

is_valid
改功能是否可用,默认值为0,值为1时为可用

permission
permission_id
自增长,主键

name
权限名称,即(完全控制,只读)

role_authorized
role_authorized_id
自增长,主键

role_name
用户角色,存储规则:存为域中的group名

user_description
用户的职位,存储规则:存为域中user的description。若用户中description有多个职位(leader,employee...),在本字段中只插入一个职位,分多条记录存储

function_id
授权的功能id

permission_id
授权用户拥有的访问权限,(完全控制,只读(后期))

应用

  • 新增功能
    • 在数据表function_list中根据相关的字段数据规则添加
  • 为功能分配可访问角色信息
    • 在表role_authorized中 根据相关字段数据规则添加
  • web应用
    • 开发完功能页面后,如须添加访问控制,直接拖拽 用户权限验证控件(项目中\BackOfficeWeb\windowsAuthorized\WebUserControl.ascx到页面中既可,无需其他代码

posted @ 2008-02-01 17:59 Terry Dong 阅读(384) | 评论 (0)编辑

2008年1月15日

提起mysql,总觉得很有感情,03年末还在学校的时候就已经用到了mysql做项目,当时应该是mysql 3.X版本,时间过得真快,4年过去了,mysql重新进入了我的生活,原来的记忆还是很清晰,版本却已经升级到了5.1,mysql以它的免费和灵活等一系列优点,成为目前各个网络公司大多采用的产品

 

mysql 最近:

server:http://dev.mysql.com/downloads/mysql/5.1.html

connector for .net http://dev.mysql.com/downloads/connector/net/5.1.html

客户端管理工具:http://dev.mysql.com/downloads/gui-tools/5.0.html

当然还有一些第三方客户端工具:

web管理:PHPAdmin

客户端:mysql-front

mysql与sqlserver 比较:http://soft.zdnet.com.cn/software_zone/2007/0914/506454.shtml

 

mysql 的一个很大优势我觉得是可以在unix系统进行部署,安全性上相比windows好很多。


vs2005可以通过MySQL Connector Net 5.1.4中的Visual Studio Integration进行无缝整合,开发起来还是比较方便的。

经过测试vs2008暂时不能使用integration,不过可以直接引用mysql.data.dll进行开发

附图几张(vs2005 integration)

 

MySQLConnection1

 

mysql-vstudioplugin-4

mysql-vstudioplugin-3

posted @ 2008-01-15 16:51 Terry Dong 阅读(825) | 评论 (1)编辑

2008年1月2日

在我们做的事情中,有许多受到感情的影响。感情可以带来伟大的成就,同时也可以使我们面临失败。所以,我们必须了解,要控制自己的感情,首先应该做的是,了解对我们有刺激作用的感情有那些?我们可将这些感情分为7种消极和7种积极。

 

看到这篇文章的,我们得好好的自省。

 

消极:

恐惧 fear

仇恨 Hatred

愤怒 Anger

贪婪 Greed

嫉妒 Jealousy

报复 Revenge

迷信 Superstition

积极:

爱 love

性 Sex

希望 Hope

信心 Faith

同情 Sympathy

乐观 Optimism

忠诚 Loyalty

这些情绪正式我们人生计划成功或失败的关键,他们的组合既可以意义非凡,又能够混乱无章,完全取决于你自己。。。

 

很庆幸,消极的感情中,我只是有一点点的迷信,或许不能称之为迷信,应该算是一点信仰。

积极的感情中,乐观的感情可能离我稍远,但我正在逐渐的靠近,尽量释放压力,这应该源自于我从不攀比。我知道我注定是奋斗的一代人,注定需要通过双手的敲击赢得一些货币,享受生活~~

 

人干嘛要活的消极呢,事在人为,把信念转化为动力,把想法转化为生产力,大家加油吧,我所有的朋友,亲人和爱人。

posted @ 2008-01-02 13:07 Terry Dong 阅读(94) | 评论 (0)编辑