posts - 5,  comments - 57,  trackbacks - 0
  2008年5月13日

   
        2002年冬天写的一首诗,今天翻箱子看见的,发表的博客上记录一下,当时上大学二年级,对网络还一窍不通。
  
    审视
            
审视,世间这般纷杂,
审视,人心这般深沉,
难得的审视,心灵的独白,
一颗迷惑的心坎!

也不必踌躇,也不必评论,
更没有叹息,猜测和愤憎,
静静的,静静的仰望无垠的星辰,
静静的,静静的默许流逝的星雨。

嚼一芽橘黄,
滋润你粗糙的心,
尝一丝红椒,
燎起你似火的激情。

在这冰冷的冬季,
凝固你无绪的浪花,
永结向上的峰!

posted @ 2008-06-18 18:50 caizhiyuan 阅读(150) | 评论 (1)编辑
今天终于辞职了,压抑了很长时间,今天突然变的轻松
posted @ 2008-05-26 17:20 caizhiyuan 阅读(85) | 评论 (1)编辑

刚做的网站秀一下

http://www.Yibenzhang.com/

主要功能:

账本
通讯录
记事本
网址收藏夹

posted @ 2008-05-19 10:00 caizhiyuan 阅读(1201) | 评论 (40)编辑

        五一前,接到项目经理的通知,把当前项目b/s结构改为c/s结构,让我尽快实现。说完之后我还和项目经理吵了一下。你说改就改,b/s到c/s以为是小孩玩泥巴呀,想捏成什么就捏成什么。最后不欢而散。节后,程序还是要改的,项目中很多要用到客户端机器的资源,c/s结构比较容易实现也没有权限的限制还稳定。
        想了想其实让我改也挺好改的,转变个方式就是c/s结构了。以前做过一个小工具就是刚开始是一个网页,后来感觉在客户端直接装个软件比较好。
        这个工具是 迷你天气预报http://www.skycn.com/soft/32059.html大家有兴趣可以下载使用,这个是06年做的。还经常有人我怎么实现的。我说你直接用Reflector看看代码不就是了。
        整个项目有4个子系统是B/S结构,一个客户端小工具是数据采集和拨号传输。项目经理的意思是要把4个子系统都改成C/S结构和客户端工具集成载一起。你想想4个系统当时是8个人开发好几个月。现在让我一个人改成C/S结构。出了底层代码改得较少,可表现层的全部做吧。还要测试,看以前同事写的代码。还有N多报表。幸亏有以前的经验。整个项目的迁移我只用了2天就基本完成了,一些小毛病还需要调整的。其实就是做了一个浏览器。把B/S项目嵌入到C/S项目。
       1.新建windows应用程序。
       2.制作用户登陆窗口,调用webservices登陆的,登陆后得到一些配置信息,比如数据库连接字符串。这样在客户端软件里就可以不用配置和暴露数据库连接了以及其他敏感信息。
       3.本来想偷懒直接把用户登陆后的界面嵌入,就万事大吉了。可是这样也太狠了吧。和原来没啥两样。
       4.用户登陆成功后打开一个MainForm窗口,里面有菜单控件和工具栏控件,B/S项目是用Ext做前端展示的,每打开一个页面都在同窗体的tabpanel里,和ie7一样的风格。
     winform里我选用了WeifenLuo.WinFormsUI.Docking,免费开源很好用。
       5.新建一个窗体,里面放上WebBrowser控件,这个窗体的作用就是给这个窗体传一个url,里面打开这个网页。
       6.有了数据库连接字符串,用户登陆后得到菜单然后动态生成menu,事件动态绑定。事件当然是打开一个窗体(步骤5),里面链接B/S结构里以前的网页.
     
       其实到上面整个项目的迁移就基本完成了,可是这个过程有很多细节和注意的地方,
       A.比如你winform用户登录的时候,用户登陆的session,cookies怎么在你的winform中生成。
       B.网页中的javascript怎么调用winfrom的方法(不可能单单做一个浏览器吧),既然是C/S结构,一些B/S无法实现的功能,可以用Javascript调用Winform去完成。

      首先先说说A,登陆我用的是winform的方式,这个登陆就算在调用webservice时在webservice中生成session可是客户端并没有在webbroswer中生成相应的session cookies。这样你在登陆成功后打开菜单连接时,打开的网页会提示用户没有登陆。
     所以要在用户登陆的时候就要向WebBrowser中写session cookies。可是我到现在也不会写,我想写了也是伪造的。还不如让他在WebBrowser中在登陆一下:
             //产生客户端session
            string url = weburl + "Login.aspx?UserCode=" + this.txtBoxUsername.Text + "&Password=" + this.txtBoxPassword.Text + "&LangugeKind=" + GetLanguage();
             new Creative.WebBrowser.MyWebBrowser().Navigate(url);

         里面的Creative.WebBrowser.MyWebBrowser()是我把WebBrowser有封装了一下,实现了我的一些方法。
        这样就可以在客户端的WebBrowser中产生登陆后的session了。(这个是在调用webservices登陆成功后在登陆的,所以用户名密码一定是对的)。其实登陆的时候可以直接用这个,然后得到webbrowser中的返回内容,来判断是否登录。可是我要从websevices中得到跟多的得东西,一些可能直接是对象。所以就没有直接用这个登陆判定,只是用其生成客户端session。

       在说说B:
         Javascript要和winform交互,首先winform要com口开放。com口开放一个是局部的某个form或者整个程序集开放。
        单个form开放只需要在form类之上放上   [System.Runtime.InteropServices.ComVisible(true)]

         [System.Runtime.InteropServices.ComVisible(true)]
         public partial class BroswerForm : WeifenLuo.WinFormsUI.Docking.DockContent

          要想使整个程序集都com口开放,可以再
          项目属性-应用程序-程序集信息里选择com口开放。或者你可以直接在AssemblyInfo.cs里写上[assembly: ComVisible(true)]
 
          com口开放了,javascript怎么和winform交互呢,或者winform怎么调用javascript中的方法呢。
          设置 WebBrowser 的 ObjectForScripting 为一个对象,你可以设置为他本身,你也可以设置其他对象,当然我们设置当前的form最好了,比如我在form_load里设置了为当前form
       private void BroswerForm_Load(object sender, EventArgs e)
        {           
            this.myWebB.ObjectForScripting = this;   
        }
        
          这样就好了,可以用当前WebBrowser 中网页的javascript访问这个form中的方法了。但这个方法必须是public的
   比如我们在form里
       public void test()
        {
            MessageBox.Show("ddddddddddddd");        
        }

      在网页中就可以这样调用   window.external.test();      
       当然你还可以传参了和返回结果,这个大家可以自己试一下!
      
      winform中的方法当然也可以访问网页中的javascript了包括变量和函数,使用WebBrowser 的Document属性来调用script的代码。
       this.myWebB.Document.InvokeScript("ScriptName",Object[] ) 第一个参数是脚本的函数名 第二个是参数。   
      这样就可以实现双向互动了。

      我就是这样把B/S结构转为C/S结构的,当然中间改了很多东西,很多网页不能实现的都转嫁给Winform实现了。这样项目保留了以前B/的,也实现了C/S的访问和使用方式。

      感觉C/S里套用网页是很有意思的,很多布局比较复杂的或者报表都可以用网页实现,只要做的样式和C/S的一直就可以啦!

posted @ 2008-05-13 11:32 caizhiyuan 阅读(197) | 评论 (3)编辑