让阳光指引生命的每一刻,乘着风,跟随我融化空气

美丽的地球

2010年12月16日 #

asp.net封装开心网分享api

代码
1 public class ShareApiHelper
2 {
3 /// <summary>
4 /// 获取开心分享的参数
5 /// </summary>
6 /// <param name="kxsApi"></param>
7 /// <returns></returns>
8   public static String GetKaiXinParams(KaiXinShareApi kxsApi)
9 {
10 String strResult = String.Empty;
11 StringBuilder sbParams = new StringBuilder();
12 String strSign = String.Empty;
13 SortedDictionary<String, String> dictParams = new SortedDictionary<String, String>();
14
15 dictParams.Add("appid", kxsApi.AppId);
16 dictParams.Add("v", kxsApi.Version);
17 dictParams.Add("beta", kxsApi.Beta);
18 dictParams.Add("type", kxsApi.Type);
19 dictParams.Add("time", System.TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)).Subtract(kxsApi.Time).TotalSeconds.ToString());
20 dictParams.Add("iid", kxsApi.Iid);
21 dictParams.Add("title", kxsApi.Title);
22 dictParams.Add("pic", kxsApi.ImageUrl);
23 dictParams.Add("price", kxsApi.Price);
24 dictParams.Add("link", kxsApi.LinkUrl);
25 dictParams.Add("description", kxsApi.Description);
26
27 foreach (KeyValuePair<String, String> item in dictParams)
28 {
29 String base64Key = Convert.ToBase64String(Encoding.Default.GetBytes(item.Key));
30 String base64Value = Convert.ToBase64String(Encoding.Default.GetBytes(item.Value));
31
32 String key = base64Key.Replace("+", "*").Replace("/", "-").Replace("=", "");
33 String value = base64Value.Replace("+", "*").Replace("/", "-").Replace("=", "");
34
35 sbParams.AppendFormat("{0}={1}_", key, value);
36 }
37
38 sbParams = sbParams.Remove(sbParams.Length - 1, 1);
39 strSign = UtilHelper.Md5Hash(sbParams.ToString() + "_" + kxsApi.Sectet).ToLower();
40 strResult = strSign + "_" + kxsApi.AppId + "_" + kxsApi.Beta + "_" + sbParams;
41
42 return strResult;
43 }
44 }
45
46 /// <summary>
47 /// 开心分享Api模型
48 /// </summary>
49   public class KaiXinShareApi
50 {
51 #region //字段
52 private String m_appid = String.Empty;
53 private String m_version = "1";
54 private String m_beta = "1";
55 private String m_type = "1";
56 private String m_sectet = String.Empty;
57 private DateTime m_time = DateTime.Now;
58
59 private String m_iid = String.Empty;
60 private String m_title = String.Empty;
61 private String m_pic = String.Empty;
62 private String m_price = String.Empty;
63 private String m_link = String.Empty;
64 private String m_wapLink = String.Empty;
65 private String m_texttype = String.Empty;
66 private String m_nick = String.Empty;
67 private String m_description = String.Empty;
68 #endregion
69
70 #region //属性
71 #region 基本属性
72 /// <summary>
73 /// 在开心网注册或者开心网分配的合作网站Id
74 /// </summary>
75   public String AppId
76 {
77 get{return m_appid;}
78 set{m_appid = value;}
79 }
80
81 /// <summary>
82 /// 开心网接口版本号,目前是1
83 /// </summary>
84 public String Version
85 {
86 get{return m_version;}
87 set{m_version = value;}
88 }
89
90 /// <summary>
91 /// 通过审核是0,没有通过审核是1
92 /// </summary>
93 public String Beta
94 {
95 get{return m_beta;}
96 set{m_beta = value;}
97 }
98
99 /// <summary>
100 /// 转发数据的排版样式,目前只有一种为1
101 /// </summary>
102 public String Type
103 {
104 get{return m_type;}
105 set { m_type = value; }
106 }
107
108 /// <summary>
109 /// MD5加密key
110 /// </summary>
111 public String Sectet
112 {
113 get{return m_sectet;}
114 set{m_sectet = value;}
115 }
116
117 /// <summary>
118 /// 生成签名的Unix时间戳(从1970年01月01日00时00分00秒起到现在的总秒数)
119 /// </summary>
120 public DateTime Time
121 {
122 get { return m_time; }
123 set { m_time = value; }
124 }
125 #endregion
126
127 #region 商品属性
128 /// <summary>
129 /// 内容在合作网站的Id,非必须
130 /// </summary>
131 public String Iid
132 {
133 get { return m_iid; }
134 set { m_iid = value; }
135 }
136
137 /// <summary>
138 /// 内容名称,必须
139 /// </summary>
140 public String Title
141 {
142 get { return m_title; }
143 set { m_title = value; }
144 }
145
146 /// <summary>
147 /// 内容图片地址,必须
148 /// </summary>
149 public String ImageUrl
150 {
151 get { return m_pic; }
152 set { m_pic = value; }
153 }
154
155 /// <summary>
156 /// 价格,非必须
157 /// </summary>
158 public String Price
159 {
160 get { return m_price; }
161 set { m_price = value; }
162 }
163
164 /// <summary>
165 /// 内容链接地址,www版必须,wap版非必须
166 /// </summary>
167 public String LinkUrl
168 {
169 get { return m_link; }
170 set { m_link = value; }
171 }
172
173 /// <summary>
174 /// 内容链接wap版链接地址,wap版必须,www版非必须
175 /// </summary>
176 public String WapLink
177 {
178 get { return m_wapLink; }
179 set { m_wapLink = value; }
180 }
181
182 /// <summary>
183 /// 文案编号,非必须
184 /// </summary>
185 public String TextType
186 {
187 get { return m_texttype; }
188 set { m_texttype = value; }
189 }
190
191 /// <summary>
192 /// 商家店铺名,一般用于C2C网站,非必须
193 /// </summary>
194 public String Nick
195 {
196 get { return m_nick; }
197 set { m_nick = value; }
198 }
199
200 /// <summary>
201 /// 内容描述,非必须
202 /// </summary>
203 public String Description
204 {
205 get { return m_description; }
206 set { m_description = value; }
207 }
208 #endregion
209
210 #endregion
211 }

 

 

代码
public class UtilHelper
{
public static String Md5Hash(String source)
{
byte[] bt = UTF8Encoding.UTF8.GetBytes(source);

MD5CryptoServiceProvider objMD5
= new MD5CryptoServiceProvider ();
byte[] output = objMD5.ComputeHash (bt);

return BitConverter.ToString (output).Replace("-","").ToLower();
}

}

 

posted @ 2010-12-16 17:17 天真的好蓝啊 阅读(351) 评论(0) 编辑

2010年1月22日 #

SQL数据库分页排序记录

    如大家要转载,请保留本人的版权:
    /*
    *Description:SQL数据库数据分页技术
    *Auther:chongchong2008-天真的好蓝啊
    *MSN:chongchong2008@msn.com
    *QQ:154674958
    *Blog:chongchong2008.cnblogs.com
    *Dates:2010-01-13
    *Copyright:ChongChong2008 YiChang HuBei China
    */


    说说SQL数据库按照降序排列的情况,如下:

 

    方法一:Select Top Min(Max) Select Top 方法

    问题,第一页的时候有bug
    问题,不能多字段排序,必须要求主键,即排序字段唯一不能重复,且此主键的类型必须是int类型,如果多字段排序,还要求主键是连续的,不能断裂。

    读取第二页数据的基本SQL代码,每页10条数据
    如下降序排序:
   

    SELECT TOP 10 * FROM table_test where table_ID<(
        SELECT MIN(table_ID) FROM (
            SELECT TOP 20 table_ID FROM table_test ORDER BY table_ID DESC
        ) t
    )ORDER BY table_ID DESC

 


    方法二:Select In Select Top 方法 
 
    问题,最后一页的时候有bug
    问题,要求有主键,即要求一个不能重复的唯一字段,主键的类型可以任意,可以多字段排序,多个字段都可以有自己单独的排序方式

    读取第二页数据的基本SQL代码,每页10条数据

    如下降序排序:

    SELECT * FROM table_test where table_ID in (
        SELECT top 10 table_ID FROM (
            SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID DESC,table_ID DESC
        ) t order by table_OrderID ASC,table_ID ASC
    )order by table_OrderID DESC,table_ID DESC


    如下升序排序:

    SELECT * FROM table_test where table_ID in (
        SELECT top 10 table_ID FROM (
            SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID ASC,table_ID ASC
        ) t order by table_OrderID DESC,table_ID DESC
    )order by table_OrderID ASC,table_ID ASC

 

    第一种方法其实很好,如果你不要求用其他的非主键排序的话,那绝对是你的首选。

    不过,在要求非主键字段排序的场合下,就得用上第二种方法了,而且还可以多字段排序,下下主要说说这种排序方法。
    这种排序方法要求排序字段的排序方式反转,在你写SQL语句的时候要用到,为了支持多字段的自动反转,下面我写了一个函数,方便调用。

    如下:

   

    -- =============================================
    -- Description: 反转排序字段的排序方式
    -- Author:  chongchong2008 - 天真的好蓝啊
    -- QQ:              154674958
    -- Email:           yc_mingzi@tom.com
    -- MSN:             chongchong2008@msn.com
    -- Create Date:     2009-11-13
    -- =============================================
    ALTER FUNCTION [dbo].[fn_chongchong_ReversOrder]
    (
        @orderFields nvarchar(255)
    )
    RETURNS nvarchar(256)
    AS
        BEGIN

            declare @sourceString nvarchar(255)
            declare @resultString nvarchar(255)
            declare @tempString nvarchar(32)
           declare @index int
            declare @len int
            declare @len2 int

            set @sourceString = @orderFields + ',';

            --计算长度
            set @len = len(@sourceString)
            set @index = CHARINDEX(',', @sourceString)
            set @resultString = ''

            --循环
            while(@index!=0)
            BEGIN
                set @tempString = SUBSTRING(@sourceString, 1, @index-1)

                if( CHARINDEX('desc', @tempString) !=0 )
                    SET @tempString = replace(@tempString,'desc','ASC')
                else
                    SET @tempString = replace(@tempString,'asc','DESC')

                SET @resultString = @resultString + @tempString+ ',' ;

                SET @sourceString = SUBSTRING(@sourceString, @index+1, @len-@index)
                SET @index = CHARINDEX(',', @sourceString)
            END

            SET @len2 = len(@resultString)
            SET @resultString = substring(@resultString,1,@len2-1)

     RETURN @resultString

        END


    此SQL函数的功能如下:(用来反转任意多个排序字段的排序方式)

    declare @strSource nvarchar(255)
    set @strSource = dbo.fn_chongchong_ReversOrder('test_OrderID ASC,test_OtherID DESC,test_Date DESC')
    print @strSource

    返回输出 test_OrderID DESC,test_OtherID ASC,test_Date ASC

 


    利用第二种方法写出如下的代码:

        SET @orderKey = @orderKey + CASE @orderType WHEN  0 THEN ' ASC' ELSE ' DESC' END;
 SET @orderKeyRevers = dbo.fn_chongchong_ReversOrder(@orderKey); -- 反转
        SET @orderFields = replace(replace(@orderKey,'ASC',''),'DESC',''); --去掉排序标记符

        SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName
                          + @where1 + @primaryKey + 'in('
                              +'SELECT TOP '+ CAST(@pageSize as varchar) + @primaryKey + ' FROM ('
                                  +'SELECT TOP '+ CAST(@pageSize*(@pageIndex) as varchar) + @orderFields +' FROM '+ @tableName
                                  + @where2 + ' ORDER BY ' + @orderKey
                              + ') t ORDER BY '+ @orderKeyRevers
                          + ') order by ' + @orderKey;


    注意这种方法,当翻页到最后一页的时候有个Bug,下面这段用来修正这个Bug.

        IF(@pageIndex >= @totalPage) -- 修正第后一页
            SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName + @where1 + @primaryKey + 'in('
                                + 'SELECT TOP ' + CAST(@lastRecords as varchar) +  @primaryKey + ' FROM '+ @tableName + ' ORDER BY ' + @orderKey + + CASE @orderType WHEN  0 THEN ' DESC' ELSE ' ASC' END
                              +') order by ' + @orderKey + CASE @orderType WHEN  0 THEN ' ASC' ELSE ' DESC' END;

 

    OK,就是这样...


 

posted @ 2010-01-22 11:18 天真的好蓝啊 阅读(274) 评论(0) 编辑

2010年1月13日 #

B2C电子商务系统概念数据模型分析设计


B2C电子商务系统概念数据模型分析设计

 

 

如大家要转载,请保留本人的版权:
/*
*Description:B2C电子商务系统概念数据模型分析设计
*Auther:chongchong2008-天真的好蓝啊
*MSN:chongchong2008@msn.com
*QQ:154674958
*Blog:chongchong2008.cnblogs.com
*Dates:2010-01-13
*Copyright:ChongChong2008 YiChang HuBei China
*/

 



    我大概浏览了下网路上的购物网站,体验了一些”免费“(天下掉下馅饼可能吗,呵呵)的电子商务系统,了解了些业务,有些确实很不错,各个不同语言实现的都有,我是说很不错,可是对于我来说是用起来有点晕,可能和自己的使用理念有些区别,干脆自己来造一个吧,不是很好玩吗?于是,有想写个电子商务程序的念头。

    下面开始设计这个电子商务程序。经过我的了解,B2C电子商务数据模型分下面这几部分:

 

    一。数据概念模型基本定义,暂不包括各个模型之间的关系

1。会员部分:
==============================
1.1 会员基本数据
1.2 会员角色数据
1.3 会员个性化数据
1.4 会员等级数据

 

2。商品部分:
==============================
2.1 商品类型数据模型

2.2 商品品牌数据模型

2.3 供应商数据模型

2.4 商品分类数据模型

2.5 商品数据数据模型

2.6 商品标签数据模型

2.7 商品属性数据模型

2.8 商品属性值数据模型

2.9 商品选项数据模型

2.10 商品选项值数据模型

2.11 商品参数组数据模型

2.12 商品参数数据模型

2.13 商品相册数据模型

2.14 商品配件数据模型

2.15 相关商品数据模型

2.16 相关商品类型数据模型

2.17 捆绑商品数据模型

2.18 捆绑商品项数据模型

2.19 商品咨询数据模型

2.20 商品咨询回复数据模型

2.21 商品评论数据模型

2.22 商品收藏数据


3。促销部分:
==============================
3.1 促销打折数据模型

3.2 优惠劵数据模型


4。订单部分:
==============================
4.1 订单
4.2 订单项
4.3 订单选项
4.4 订单状态
4.5 订单赠品
4.6 支付方式

5。配送部分:
==============================
5.1 送货方式及费用

 

通过分析,决定把其中的几个东西单独的提出来:
1. 会员系统从电子商务系统提出来,用成员管理子系统接入。
2. 把电子商务显示,显示模板也提出来,用CMS子系统接入。
3. 把商品相册也提出来,用相册子系统接入。
4. 把评论也提出来,用评论子系统接入,也可以不提出来,在电子商务子系统多建1个表来实现,看个人规划了。
5. 把留言及回复也提出来,用留言子系统接入,也可以不提出来,在电子商务子系统多建2个表来实现,看个人规划了。

发现我所体验的多个B2C电子商务系统,把模板都放入里面了,我更觉得这块要交给CMS来完成。

 

 

    二。电子商务需求的复杂度

1. 商品扩展属性,选项,参数的复杂度
电子商务系统的复杂度在于,商品类型(页可以说是顶级分类,看自己怎么设计了)所特有的扩展属性,选项,参数,
拿服装类型举例:

属性
================================
材质 : 纯棉,40%棉+60%涤纶等
.
.
.


选项
================================
颜色:红色,蓝色等
尺码:XL,L等
.
.
.

这些属性和选项数据模型的设计是个让人头疼的东东,有多种不同的解决方案,有的可以按照纯关系数据库那样来关联,另外也可以用序列化的对象来存储,还有就是可以利用多沉余字段来设计数据表。至于效率也要自己来取舍了,看自己怎么来定了,一但定型程序就要按照数据模型来写了。

 


2. 促销打折规则的复杂度

2.1 促销打折对象
    这个需要对业务有所了解,简单一点的就只有对订单的打折,而不包括单品的打折促销,这样一来,在计算订单总价的时候比较方便。
当然,我们自己要规划好。

 


2.2 促销打折规则定义
 
    2.2.1 针对订单的规则如下:

        2.2.1.1 满额直接优惠
        就是说满800,优惠30(即从800里减去30)

        2.2.1.2 满额直接折扣
        就是说满1500,打9.5折(即优惠 = 1500 * (1 - 0.95) )

        2.2.1.3 满额送优惠劵
        就是说满5000,送你价值等值人民币500的优惠劵,下次购物,在买单时可以直接当人民币来使用,感觉是不是很诱惑啊。

        2.2.1.4 满额赠送物品
        就是说满2000送运动水壶一个,或送三峡苕酥一盒,可以让客户自己在下单时候选择

 

    2.2.2 针对单品的规则如下:
        2.2.2.1 满件直接折扣
        就是说同一件商品,单价是1500,客户同时购买30件,就打9.5折(即优惠 = 1500 * (1 - 0.95) ),就是像批发一样的


    有些规则是互相排斥的,就是说不能同时启用的,这个要好好规划一下。

    其实针对订单的规则里满额直接优惠和直接折扣是雷同的,只是换了个马甲而已,如果可以的话把直接优惠可以去掉不要的。
    哎,商家可谓是机关算尽,就是要你多掏钱,正所谓无商不“精”嘛,呵呵。
   

 

    三 订单的处理

订单里需要很多的沉余字段,因为商品价格和促销活动是会随时变化的,所以你得把客户下单时的商品当前价格,当前的促销活动给记录下来,以方便统计商品金额。


订单金额处理起来要和自己的促销规则结合起来,不然很容易算错商品金额的。

 

订单赠品的处理。

 


好了,分析到此,至于用什么编程语言实现,大家各自爱好了,数据概念模型设计中.................
欢迎指正,互相学习!
  

 

 

 

 

posted @ 2010-01-13 21:32 天真的好蓝啊 阅读(1017) 评论(0) 编辑

2009年6月10日 #

Flex 4 SDK源码浅析!

如大家要转载,请保留本人的版权:
/*
*Description:PV3D类继承体系结构

*Auther:崇崇-天真的好蓝啊
*MSN:chongchong2008@msn.com
*Blog:chongchong2008
*Dates:2009-06-02
*Copyright:ChongChong2008 YiChang HuBei China
*/

 

Flex 4 SDK源码浅析!

 


最近下了Flex 4 SDK (flex_sdk_4.0.0.7219_mpl_src)的源代码
此目录下包含如下相关的几个部分:

1。mx 核心 frameworks,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx

2。rpc frameworks,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> rpc --> src --> mx

3。air framework,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> airframework --> src --> mx

4。皮肤相关,它在以下目录可以找到
flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> haloclassic --> src

一。熟悉Flex SDK
Flex SDK真的很庞大,包罗万象,一开始真的很难入手,不知道从哪里开始读。
首先是熟悉Flex定义的基本接口,把各个接口都看一遍。就是在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->core 里面的基本接口文件,熟悉Flex的UIComponent组件,Container容器,特别是要熟悉Application类(如何与SystemManager类建立联系,组建是如何进入队列,怎样延迟调用)。

熟悉UICommpontent
public function callLater(method:Function,args:Array /* of Object */ = null):void {
        methodQueue.push(new MethodQueueElement(method, args));
        var sm:ISystemManager = systemManager;
        if (sm && (sm.stage || sm.useSWFBridge()))
        {
            if (!listeningForRender)
            {
                sm.addEventListener(FlexEvent.RENDER, callLaterDispatcher);
                sm.addEventListener(FlexEvent.ENTER_FRAME, callLaterDispatcher);
                listeningForRender = true;
            }
            if (sm.stage)
                sm.stage.invalidate();
        }
    }


熟悉FlexModuleFactory类的运作方式,系统单件类的注册,如何加载模块。

  addFrameScript(docFrame, docFrameHandler);

  // Frame 1: module factory
  // Frame 2: document class
  // Frame 3+: extra classes
         for (i = docFrame + 1; i < totalFrames; i++){
      addFrameScript(i, extraFrameHandler);
  }


接下来看Flex定义的管理接口,在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->managers里面,这个要先熟悉,才能知道Application是怎么运行的,这里的东西有些复杂,得认真看。特别是要认真的读SystemManager这块,这块就如同基本接口里的UIComponent一样重要。

还有一些概念要熟悉,需要知道什么是document,swfRoot,sandboxRoot,topLevelSystemManager。

 

Flex Application 运行:

=======================================================
FlexApplicationBootstrap.as
==================================
package mx.core{
import flash.display.DisplayObject;
import flash.events.Event;
import mx.events.FlexEvent;

[ExcludeClass]
public class FlexApplicationBootstrap extends FlexModuleFactory{
 include "../core/Version.as";
 public function FlexApplicationBootstrap(){
  addEventListener("ready", readyHandler);  
  super();
       }

       public function readyHandler(event:Event):void{
           removeEventListener("ready", readyHandler);       
     var o:Object = create();       
     if (o is DisplayObject){
               addChild(DisplayObject(o));
   o.dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));
     }

        }
    }
}


=======================================================
FlexModuleFactory.as
=======================================================
package mx.core{
[ExcludeClass]
/**
 *  @private
 */
public class FlexModuleFactory extends MovieClip implements IFlexModuleFactory, ITextLineCreator{

        private static const INIT_STATE:int = 0;
 private static const RSL_START_LOAD_STATE:int = 1;
 private static const APP_LOAD_STATE:int = 2;
 private static const APP_START_STATE:int = 3;
 private static const APP_RUNNING_STATE:int = 4;
 private static const ERROR_STATE:int = 5;
 private static const RSL_LOADING_STATE:int = 6;

 public function FlexModuleFactory(){
     super();
     var rsls:Array = info()["rsls"];
     var cdRsls:Array = info()["cdRsls"];
         
     // Put cross-domain RSL information in the RSL list.
          var rslList:Array = [];
          var n:int;
          var i:int;
    if (cdRsls && cdRsls.length > 0){
  var crossDomainRSLItem:Class = Class(getDefinitionByName("mx.core::CrossDomainRSLItem"));
  n = cdRsls.length;
  for (i = 0; i < n; i++){
    var cdNode:Object = new crossDomainRSLItem(
     cdRsls[i]["rsls"],
     cdRsls[i]["policyFiles"],
     cdRsls[i]["digests"],
     cdRsls[i]["types"],
     cdRsls[i]["isSigned"]);
    
    rslList.push(cdNode);    
  }   
     }
     if (rsls != null && rsls.length > 0){
   n = rsls.length;
   for (i = 0; i < n; i++)
   {
       var node:RSLItem = new RSLItem(rsls[i].url);
    rslList.push(node);
   }
     }

            rslListLoader = new RSLListLoader(rslList);

  mixinList = info()["mixins"];

  stop();
       
  loaderInfo.addEventListener(Event.COMPLETE, moduleCompleteHandler);

     var docFrame:int = totalFrames == 1 ? 0 : 1;

  addFrameScript(docFrame, docFrameHandler);

  // Frame 1: module factory
  // Frame 2: document class
  // Frame 3+: extra classes
     for (i = docFrame + 1; i < totalFrames; i++)
     {
      addFrameScript(i, extraFrameHandler);
  }

  timer = new Timer(100);
  timer.addEventListener(TimerEvent.TIMER, timerHandler);
  timer.start();

        update();
    }

    public function create(... params):Object
    {
     var mainClassName:String = info()["mainClassName"];
    
  if (mainClassName == null)
     {
            var url:String = loaderInfo.loaderURL;
            var dot:Number = url.lastIndexOf(".");
            var slash:Number = url.lastIndexOf("/");
            mainClassName = url.substring(slash + 1, dot);
     }
   
        var mainClass:Class = Class(getDefinitionByName(mainClassName));

        return mainClass? new mainClass() : null;
    }

    public function info():Object
    {
        return {};
    }

 private function docFrameHandler(event:Event = null):void
 {
  // Register singleton classes.
  // Note: getDefinitionByName() will return null
  // if the class can't be found.

  Singleton.registerClass("mx.managers::IBrowserManager",
   Class(getDefinitionByName("mx.managers::BrowserManagerImpl")));

        Singleton.registerClass("mx.managers::ICursorManager",
   Class(getDefinitionByName("mx.managers::CursorManagerImpl")));

        Singleton.registerClass("mx.managers::IDragManager",
   Class(getDefinitionByName("mx.managers::DragManagerImpl")));

        Singleton.registerClass("mx.managers::IHistoryManager",
   Class(getDefinitionByName("mx.managers::HistoryManagerImpl")));

        Singleton.registerClass("mx.managers::ILayoutManager",
   Class(getDefinitionByName("mx.managers::LayoutManager")));

        Singleton.registerClass("mx.managers::IPopUpManager",
   Class(getDefinitionByName("mx.managers::PopUpManagerImpl")));

  Singleton.registerClass("mx.resources::IResourceManager",
   Class(getDefinitionByName("mx.resources::ResourceManagerImpl")));

        Singleton.registerClass("mx.styles::IStyleManager",
   Class(getDefinitionByName("mx.styles::StyleManagerImpl")));

        Singleton.registerClass("mx.styles::IStyleManager2",
   Class(getDefinitionByName("mx.styles::StyleManagerImpl")));

        Singleton.registerClass("mx.managers::IToolTipManager2",
   Class(getDefinitionByName("mx.managers::ToolTipManagerImpl")));

  appReady = true;
       
        // The resources must be installed before update() creates components
  // (such as DateChooswer) that might need them immediately.
  installCompiledResourceBundles();
  
  update();
       
  if (currentFrame < totalFrames)
            deferredNextFrame();
    }


    private function deferredNextFrame():void
    {
        if (currentFrame + 1 <= framesLoaded)
  {
            nextFrame();
  }
        else
        {
            // Next frame isn't baked yet, we'll check back...
      nextFrameTimer = new Timer(100);
      nextFrameTimer.addEventListener(TimerEvent.TIMER,
           nextFrameTimerHandler);
      nextFrameTimer.start();
        }
    }

 private function extraFrameHandler(event:Event = null):void
 {
     var frameList:Object = info()["frames"];

     if (frameList && frameList[currentLabel])
     {
         var c:Class;
         try
         {
             c = Class(getDefinitionByName(frameList[currentLabel]));
             c["frame"](this);
         }
         catch(e:Error)
         {
   }
     }

     if (currentFrame < totalFrames)
            deferredNextFrame();
 }

 private function timerHandler(event:TimerEvent):void
 {
     if (totalFrames > 2 && framesLoaded >= 2 ||
   framesLoaded == totalFrames)
  {
            appLoaded = true;
  }
  
  update();
    }

 private function nextFrameTimerHandler(event:TimerEvent):void
 {
     if (currentFrame + 1 <= framesLoaded)
     {
         nextFrame();
            nextFrameTimer.removeEventListener(TimerEvent.TIMER,
              nextFrameTimerHandler);
         // stop the timer
         nextFrameTimer.reset();
        }
    }
}

}

 


二。Flex继承体系

比较重要的类和接口在flex_sdk_4.0.0.7219_mpl_src -- > frameworks -- > projects --> framework --> src --> mx -->core

1。接口继承体系,从底层接口到高层接口如下:

IFlexDisplayObject --> IBitmapDrawable, IEventDispatcher
IUIComponent --> IFlexDisplayObject
IContainer --> IUIComponent
IDeferredInstantiationUIComponent --> IUIComponent
IButton --> IUIComponent

IBorder
IRectangularBorder -- > IBorder

ILayoutElement --> IEventDispatcher

IID
IRawChildrenContainer
IChildList

IConstraintClient
IDataRenderer
IEmbeddedFontRegistry
IFontContextComponent
IFactory
IFlexModule
IFlexModuleFactory
IInvalidating
IProgrammaticSkin

对flash本身的包装
IDisplayObjectInterface
IInteractiveObjectInterface
IDisplayObjectContainerInterface

内部命名空间
mx_internal

2。类继承体系

FlexSprite --> Sprite
UIComponent --> FlexSprite implements IAutomationObject, IChildList, IConstraintClient,
                                      IDeferredInstantiationUIComponent, IFlexDisplayObject, IFlexModule, IID,
                                      IInvalidating, ILayoutManagerClient, IPropertyChangeNotifier,
                                      IRepeaterClient, IStateClient, IAdvancedStyleClient, IToolTipManagerClient,
                                      IUIComponent, IValidatorListener, IVisualElement, ILayoutElement

Container --> UIComponent implements IContainer, IDataRenderer,
                                     IFocusManagerContainer, IListItemRenderer,
                                     IRawChildrenContainer, IChildList, IVisualElementContainer

LayoutContainer --> Container implements IConstraintLayout
LayoutManager --> EventDispatcher implements ILayoutManager

 

ClassFactory implements IFactory

全局类:
FlexGlobals
UIComponentGlobals
ContainerGlobals
SystemManagerGlobals
Singleton(Flex单件类,静态类型,很多地方都会引用到)

应用程序相关:
Application --> LayoutContainer
FlexApplicationBootstrap --〉FlexModuleFactory

系统管理相关:
ISystemManager --> IEventDispatcher, IChildList, IFlexModuleFactory
SystemManager --> MovieClip implements IChildList, IFlexDisplayObject, IFlexModuleFactory,
                                ISWFBridgeProvider, ISystemManager, ITextLineCreator
SystemManagerProxy --> SystemManager
SystemRawChildrenList implements IChildList

拖动管理相关:
IDragManager
DragManagerImpl implements IDragManager
DragManager
DragProxy --> UIComponent
DragSource
DragEvent --> MouseEvent

其他还有ToolTipManager,CursorManager,FocusManager,PopUpManager,LayoutManager,BrowserManager,HistoryManager

 

 

三。事件钩子,函数调用队列以及单件

Flex SDK内部大量的用到单件,事件钩子,队列调用。

Singleton.registerClass(
    "mx.resources::IResourceManager",
    Class(getDefinitionByName("mx.resources::ResourceManagerImpl"))
);

。。。。。未完

 


 

posted @ 2009-06-10 15:43 天真的好蓝啊 阅读(1729) 评论(0) 编辑

2009年6月2日 #

PV3D类继承体系结构及其内部结构惯用手法,附DEMO文件!

posted @ 2009-06-02 17:45 天真的好蓝啊 阅读(1935) 评论(0) 编辑

2008年8月9日 #

实现自己的MasterPage和WebPart控件,开发没有aspx,ascx的web程序,全部由自定义控件生成,并且支持MasterPage摸版功能。

posted @ 2008-08-09 18:17 天真的好蓝啊 阅读(2162) 评论(7) 编辑

2007年11月13日 #

详解ProfileManager内部是如何运行的!

摘要: 对于asp.NET2.0内置的profile有人支持,确也有不少高人说不过如此,所谓"鸡肋"!
那么下面我从它的设计意图,在代码层次上予以介绍,在完全了解了它的思想后我们也可以模仿这样的解决方案,如有错误之处还请高人指点!

先运行private static void Initialize (bool throwIfNotEnabled)
阅读全文

posted @ 2007-11-13 23:34 天真的好蓝啊 阅读(507) 评论(0) 编辑

2007年6月5日 #

Flex MXML+as3 VS WPF XAML+c#

摘要: Flex Framework 与 Microsoft WPF是非常像的,都是用各自独有的相关XML语法来表达界面。
WPF的是XAML , 而Flex的是MXML。同样都是XML语法表述。它们都用来表述UI,包含属性,事件,行为,数据绑定,效果等,都有各自的一套相关控件。
Flex开始出来的MXML需要在FlexBuilder环境编译,出来以后就是一个swf文件。阅读全文

posted @ 2007-06-05 09:54 天真的好蓝啊 阅读(1113) 评论(1) 编辑

2007年5月23日 #

asp.NET自定义服务器控件内部细节系列教程七(状态管理)

摘要: Contorl类的默认实现将状态管理委托给了ViewState属性,ViewState属性是一个复杂属性,该属性是一个StateBag类型,是一个字典,StateBag类实现了IStateManager接口来实现状态管理。StateBag保存了键/值对,其中键是字符串而值是对象。当某个对象添加到StateBag实例中时,StageBag自动为该对象存储一个附加位,它用来标志存储的对象是否修改过。

Control类用于IStateManager接口中相同的成员来实现状态管理,尽管Control并不实现IStateManager接口,只是委托给了实现了IStateManager接口类型的StateBag类,也就是委托给了ViewState属性。在自己的复杂类型状态管理中,可以模仿Control的这种行为,以实现自定义复杂属性的状态管理。
阅读全文

posted @ 2007-05-23 14:57 天真的好蓝啊 阅读(2029) 评论(1) 编辑

asp.NET自定义服务器控件内部细节系列教程六(复杂属性)

摘要: 复杂属性的类型不能用简单的字符串表示。这些类型包括非原子值的类型,除字符串外的引用类型以及集合类型。在使用自己的控件时如果遇到复杂属性,那么为了支持声明持久性还需要做额外的工作,并进行状态管理。
为了使复杂属性具有声明持久性,必须要由以下两个相关的内容一起作用实现:与串行化相关的元数据Attribute和执行给定类型与String类型及其它类型的互相转换的类型转换器,稍后我会讲到。

1.子属性的形式
1.1 连字符子属性的实现
1.2 内部属性的实现
1.3 内部默认属性的实现

2.属性和类型转换器
类型转换器是从System.ComponentModel.TypeConverter派生的一个类。页面框架使用类型转换器来实现视图状态的串行化,而且可视化设计器也适用类型转换器在浏览器中显示属性,并实现设计期的串行化。阅读全文

posted @ 2007-05-23 14:54 天真的好蓝啊 阅读(2181) 评论(1) 编辑

My Links

Blog Stats

News

搜索

 

常用链接

我的标签

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜