分享

用Delphi 7 的IntraWeb 开发电子商务平台

 容心居 2020-03-27
      最近几年,电子商务发展十分迅速,各个行业都在进行相应的电子商务平台的建设。但开发出一套强大,健壮,性能优异电子商务系统还需要大量的知识,要通过繁重的脑力劳动。而著名的开发工具提供商Borland为我们带来的delphi使这一切变得简单。Borland提供了最早的Web开发组件是Dephi 3中的WebBroker。WebBroker功能不强大不适合编写大型的WebServer系统。为此Borland在Delphi 5中提供了InternetExpress,增强Web程序设计能力。Delphi 6中Borland提供了新的套件WebSnap,这套框架是在InternetExpress基础上重新设计的,它仍然采用的是原InternetExpress的页面设计方式。到了最新发布的Delphi 7,Borland引入了全新的Intraweb套件。Intraweb同以往所有的Web开发框架相比,是一个革命性的产品,彻底改变了Web开发方式。 


2003-5-17 7:27:00  
查看评语 ?  

2003-5-17 8:02:08  电子商务系统设计目标①高效率。由于商务的原则就是效率并且电子商务系统是一种分布式的软件体系,有大量的数据要求。分布式且数据流量大因此效率是必须考虑的问题。
②安全性。针对可能涉及到的商业机密或敏感的数据信息,系统应该从硬件和软件等多方面考虑安全性和可靠性。控制和区分用户权限,防止越权使用数据信息,对于敏感的数据信息进行加密处理。
③实用性。电子商务系统要与顾客交流要求具有友好的用户界面,使得顾客便于熟悉掌握。尽量减少用户前台的操作环节和系统的繁杂性。
④先进性。电子商务系统应体现了现代计算机及网络发展的最新的技术及应用成果:开放性、高速性、远距离数据传输、支持分布式应用等。

2003-5-17 8:06:21  Delphi 7对电子商务支持Delphi 7是Borland的最新推出十分优秀的可视化RAD快速开发工具,具有开发迅速、代码效率高、数据库操作方便等一系列优点。尤其是在7.0版本的MIDAS(即DataSnap)技术和Intra Web。 MIDAS可以运用现有的数据感知组件,快速开发复杂的多级应用程序。MIDAS技术把各种服务功能集中于中间应用层,而前端应用采用“瘦客户”形式,无需作任何状态设置即可执行,节省项目维护、程序分发以及在主从架构进行状态设置上花费的成本。并且MIDAS支持创建基于Web的客户端。而IntraWeb这种革命性的组件具有完全支持所见即所得的开发方式,支持各类Server端事件,支持非常简单直观的Session支持,可以不需要有任何的HTML、XML、JavaScript等编程知识,只要Pascal语言就足够了,还有Intraweb中集成了一个小巧的http server,可以方便的进行web程序跟踪调试排错。IntraWeb能利用Delphi的数据库访问引擎开发各种类型的Web应用程序,其所提供的功能比目前Microsoft.NET的WebForm还强大,已经成为一个跨平台的强大Web解决方案。

2003-5-17 8:07:19  Delphi 7开发电子商务系统的技术及方法-高效率对于电子商务系统高效率是设计的原则之一。
Delphi提供的ADOExpress组件实现了对原生ADO对象进行了几乎完美的封装。但ADOExpress组件的属性初始设置过于保守并不是最高效率的设置,针对电子商务系统特点需要对其进行优化调整。在ADO中CursorLocation 表示当客户端应用程序在存取了一些数据后,将这些数据存放的地方,将其设置为客户端Cursor可以提高性能。设置CacheSize值为100到1000之间可以大大减少启动数据和搜寻数据的时间。选择ADO执行异步存取模式,设置ExecuteOpion值为EoAsyncFetchNonBlocking 使得ADO以异步方式执行命令,而且不会阻碍应用程序的执行。将Prepared属性值设置为true,表示数据源在执行ADO组件提出的SQL命令前先编译SQL命令为暂时的存储过程,然后再执行这个存储过程,以增加应用程序执行效率。使用BatchOptimistic类型的LockType, 就启用了BatchUpdate模式。ADO的BatchUpdata功能于BDE/IDAPI的CachedUpdate非常类似,客户端对于所有数据的修改都暂时存储在客户端缓存中,在调用UpdaetBatch方法后才进行写入数据库操作。BatchUpdate模式可以使得数据提交给远程数据库的次数大大减少,在一定程度也增加了传输数据效率。实践证明在经过以上优化后可以很大程度上提高ADOExpress执行的效率。
在使用SQL语句时候避免使用“select * from Book”之类的语句,应该采用“select Book_ISBN,Book_Name,Book_Author,Book_Price,Book_Page,Book_publish,Book_Date,Book_Introduction from book”此类的语句,以减少不必要的数据的传输。
由于连接数据服务器是个比较耗时的过程,为减少用户的等待系统启动时间采取尽量晚获取资源的方法。通过共用,多用户能够共享资源,而且等待时间最少,对服务器的影响也最小,所以使用Pool技术最大程度减少连接数据库的开销。

2003-5-17 8:09:06  Delphi 7开发电子商务系统的技术及方法-数据完整一致性数据完整一致性
  为保证数据的完整一致性可以采用事务管理。事务管理就是系统执行企业逻辑程序代码,而这些企业逻辑程序代码会把资料来源中的资料从一个永续存储状态改变成另外一个永续存储状态。事务管理的运算对于所有数据的改变必须是成功的,并且把数据的状态成功的改变成另外一个状态。否则数据会恢复成这个事务管理还没有执行前的状态。在ADOExpress组件中,TADOConnection组件可以实现事务的管理。
实现事务管理可以在ADOExpress组件中的TADOQuery控件中的BeforePost,AfterPost和OnPostError事件处理程序中写如下代码来控制事务的管理。
Procedure TDataModule1.Client_QueryBeforePost(DataSet: TDataSet);
begin
ADOConnection.BeginTrans;//启动事务管理
end;

procedure TDataModule1.Client_QueryAfterPost(DataSet: TDataSet);
begin
ADOConnection.CommitTrans;//确定所有修改成功完成
end;

procedure TDataModule1.Client_QueryPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
ADOConnection.RollbackTrans;//发生错误时,回滚 取消所有对于数据的更改
Action:=daAbort;
end;
上面的代码完整的实现了ADO的事务管理,保证了数据的完整和一致。

2003-5-17 8:11:01  图书销售管理系统的电子商务开发实例开发背景
  电子商务是商业的新模式。根据买卖双方可分为:企业对政府机构、消费者对政府机构、企业对企业以及企业对消费者之间。其中企业对消费者的交易很大程度就是电子零售。网上零售随Web的出现而迅速发展,现在互联网上以及有成千上万的网上购物场所,提供各种消费品。从长远来看,B2C可以使得企业增进与客户的交流,为客户提供更多的选择,提供具有个性化的服务,而这些都是传统销售方式无法实现的。(上网购物流程如图所示)图书的销售在网上进行不仅能给购书者以更好的服务,拉近销售商与消费者的距离,而且销售商可以把市场与客户的信息进行统一管理。减少销售与管理的费用,简化了许多事务性流程,降低了运营成本。


2003-5-17 8:14:13  模型的构造基于以上的需求。系统可以分为两个部分,相关的业务管理部分和网上查询订购图书部分。其结构模型如图下图所示此结构前端与后端共享数据库,使得后台能够实时的反映出图书的销售情况以及读者的意见和建议,能及时的进行发货操作将图书及时送到消费者的手中。浏览器端的主要工作就是接受查询订购操作以及收集消费者的意见与建议。后端的管理系统管理图书的入库存储及业务方面的操作。


2003-5-17 8:16:37  模型的实现主要技巧与方法  IntraWeb是一个创建基于Web应用程序的具有革命性意义的新方法,它为我们提供了一个杰出的工具,用来高速、简易地创建Internet, Intranet 以及Extranet应用程序。IntraWeb很像是普通的应用程序,唯一不同的是它的用户界面是用浏览器代替了通常的Windows界面,当把应用程序安装到Web服务器上之后,用户马上就可以通过它的网络地址来开启它,应用程序会马上建立使用者的用户信息,这样就可以避免丢失用户信息或者与其它的使用者发生使用混乱。每一个用户的使用信息都会由程序自动创建和跟踪,并且对于开发者来说,是透明的。其它的开发语言,像ISAPI,CGI,ASP处理这些问题的能力都不是很好。
  IntraWeb在用户界面设计方面,IntraWeb可以结合HTML模板(HTML Template)使得用户界面十分友好,Templates(模板)允许你更好地规划和布置个别的TIWFrom。Templates也允许一使用其它的页面编辑工具来设计页面,而不是使用Delphi,简而言之就是说它允许把设计和代码的实现分开来进行。要使用Templates,首先要在你的程序目录里创建一个Templates子目录并且创建一个以<TIWFormname>.html命名的文件。然后,在要使用模板的那个TIWForm里添加一个TIWTemplateProcessorHTML组件,设置TIWForm的TemplateProcessor属性为那个新加上去的TIWTemplateProcessorHTML组件。对于每一个组件,Template都需要包含与之对应标记{%Component.HTMLName%}。HTMLName多数情况下都会和生成From时的名字一样,这些标记会在组件输出时被替换。采用{% %}而不用< >是因为这样更便于你在WSIWYG(即见即所得)的HTML编辑工具里编辑它,并且它兼容所有的HTML编辑器,{% %}标记也不会和其它的特殊字符冲突,这样就不会被解释成一些特殊的标记。需要注意的是Templates的必须符合W3C标准,否则IntraWeb是无法识别的。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>

<HEAD>
 <META http-equiv=Content-Type content="text/html; charset=gb2312">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
<META NAME="GENERATOR" Content="Microsoft FrontPage 5.0">
  <TITLE>求知在线书城</TITLE>

</HEAD>
………………
</HTML>
以上是符合W3C标准的HTML头标识的示例。
   IntraWeb套件中的IWDBGrids控件,是被用于在一个Grid中显示成千上万的数据记录的控件。假设一次显示如此多的数据在Web中,那将会是一个非常大的HTML文档,而且在用户加载的时候,是非常慢的。对此可以让IWDBGrid能局部地显示数据,采用用Next/previous选项来使用 “paged grid”技术以减少一次所传递的数据数量。还可以通过设置TIWDBGrid的 “StartFirst”属性成 “false” ,把RowLimit属性设置一个最大值来决定一次传给用户的数据记录数,这样通过Next/Previous来移动数据记录。通过采用让用户提供他所要筛选的数据参数,就能从成千上万的数据中筛选出十几个,或仅仅是几百个记录,这不但是降低网络带宽占用的好办法,同时,它也可以说是提供了一个很好的用户界面,并且,同时也最小化地读取数据库。但即使允许用户输入搜索条件仍然有可能产生就像上面提到的得到成千上万记录的可能性,为了避免这种情况的产生,TIWDGBrid有一个RowLimit属性,它默认值是0,也就是说它默认是被禁止的。你可以给它设置一个最大值,这样,不管查询出多少记录,返回给用户的记录数也不会超过你在RowLimit中所设置的最大值。
  IntraWeb是一个线程化的环境所以在IntraWeb全局变量通常不会使用,如果需要使用全局变量来指定每一个用户Session都要用到的变量,就要用到User Session。User Session是全局的它包含一个.Data属性,它能控制到一个对象的Reference。当需要储存一个用户的特定信息时,你可以把信息储存在.Data属性里,它接受即时的Tobject,并且能在Session释放的时候自动Destroy。
IntraWeb组件中的IWDBGrids控件的处理
  实现使IWDBGrid能局部地显示数据,使用 “paged grid”技术以减少传递的数据数。需要设置IWDBGrid的RowLimit值,然后编写相关控制代码。
//使IWDBGrid能局部地显示数据时点击此按钮后能向后翻页显示后面的数据
procedure TBookForm1.IWButton1Click(Sender: Tobject);
begin
DataModuleUnit.DataModule1.MovePage(IWDBGrid.RowLimit);
end;

//使IWDBGrid能局部地显示数据时点击此按钮后能向前翻页显示以前的数据
procedure TBookForm1.IWButton2Click(Sender: Tobject);
begin
DataModuleUnit.DataModule1.MovePage(-IWDBGrid.RowLimit);
end;

//在数据模块中定义的MovePage过程。
Procedure TDataModule1.MovePage(const APageSize: integer);
begin
 DataModule1.Book_Query.MoveBy(APageSize);
end;
在IWDBGrid中定位数据的实现方法是在TIWDBGridColumns中为数据字段指定LinkField值。在这里指定Columns中的Book_Name字段的LinkField值为Book_ISBN字段。实现代码如下所示:
//定位记录的代码
procedure TBookForm1.IWDBGrid1Columns0Click(Asender: Tobject;const Avalue: String);
begin
DataModuleUnit.DataModule1.Book_Query.Locate('Book_ISBN',Avalue,[]);
end;
对于购物记录存储在一个IWGrid控件中,为方便操作为每行数据都设置个按钮用以编辑数据方便用户操作。实现代码如下:
procedure TBookForm1.IWButton3Click(Sender: Tobject);
var
i: integer;
begin
with TUserSession(WebApplication.Data) do
begin
  ShopInfo.bookisbn:=IWDBLabel3.Text;
  ShopInfo.bookname:=IWDBLabel1.Text;
  ShopInfo.bookprice:=IWDBLabel4.Text;
  ShopInfo.bookcount:=Trim(CountEdit.Text);
  inc(ClientForm.count);//所订购图书计数器
  i:=ClientForm.count;
  ClientForm.ClientGrid.Cell[I,0].Text:=ShopInfo.bookisbn;
  ClientForm.ClientGrid.Cell[I,1].Text:=ShopInfo.bookname;
  ClientForm.ClientGrid.Cell[I,2].Text:=ShopInfo.bookprice;
  ClientForm.ClientGrid.Cell[I,3].Text:=ShopInfo.bookcount;
  //每行数据都设置个编辑按钮
  with ClientForm.ClientGrid.Cell[I,4] do begin
  Control := TIWButton.Create(Self);
      with TIWButton(Control) do begin
       Caption := '放弃此商品';
       Confirmation := '放弃此商品?';
       //连接到删除操作过程
       OnClick := ClientForm.DeleteButtonClick;
      end;
  end;
end;
end;
//定义删除操作过程
procedure TClientForm.DeleteButtonClick(Asender: Tobject);
begin
ClientGrid.DeleteRow(Tcomponent(Asender).Tag);
Dec(Count);
end;


在图书销售管理系统中需要维护一个全局的单元,用以监视顾客的购物操作。在每个IntraWeb中都存在一个ServerController单元,User Session就在这个单元中。此单元主要内容如下:
Type
//购买图书记录
 TShopInfo=record  
  bookisbn: string;
  bookname: string;
  bookprice: string;
  bookcount: string;
 end;
// User Session的定义
TUserSession = class(Tcomponent)
 public
  DataModule1: TDataModule1;//数据模块
  ShopInfo: TShopInfo;
  ClientForm: TClientForm; //定义全局的购物篮窗体
  constructor Create(Aowner: Tcomponent); override;
 end;
//UserSession函数
function UserSession: TUserSession;
begin
 Result := TUserSession(RWebApplication.Data);
end;
//创建User Session类
constructor TUserSession.Create(Aowner: Tcomponent);
begin
 inherited;
 Datamodule1 := TDatamodule1.Create(Aowner);//创建数据模块
 ClientForm:=TClientForm.Create(Aowner);//创建购物篮窗体
end;

//对.Data属性付值
procedure TIWServerController.IWServerControllerBaseNewSession(
 Asession: TIWApplication; var VMainForm: TIWAppForm);
begin
 Asession.Data := TUserSession.Create(Asession);
end;
上面代码创建了全局的数据模块和监视消费者购物的购物车 。

2003-5-17 8:21:19  系统的发布与运行 对于IntraWeb发布AppMode开发的东西比较好办,在Server端(必须是管理员身份登录的),进入Command窗口,运行c:>ApplicantionName -install,Application 做为NT下的一个服务被启动,然后客户端直接在浏览器中键入:http://www.yourDomain.com:xxxx/就可以启动(或者用http://www.yourDomain.com:xxxx/start),xxxx是你开发程序时在ServerController中设定的端口号(为避免与服务器提供的WEB服务冲突,一般不能设为80端口)或者将程序改编译成ISAPI应用程序更改方法如下所示:
// Copyright ? 2003.
// JiShou university
// Written by C.X.M
program Bshop;
{PUBDIST}
uses
 IWInitStandAlone,
 ServerController in 'ServerController.pas' {IWServerController: TDataModule},
 IWUnit1 in 'IWUnit1.pas' {formMain: TIWForm1},
 DatamoduleUnit in 'DatamoduleUnit.pas' {DataModule1: TDataModule},
 BFrom1 in 'BFrom1.pas' {BookForm1: TIWAppForm},
 Bframe in 'Bframe.pas' {BookFrame: Tframe},
 BFrom2 in 'BFrom2.pas' {BookForm2: TIWAppForm},
 Cform in 'Cform.pas' {ClientForm: TIWAppForm};

{$R *.res}

begin
 IWRun(TFormMain, TIWServerController);
end.
以上的是程序项目文件中的内容,要将其改为ISAPI程序只要更改两个地方:1、改变Program 子句为 library。 2、改变 IWInitStandAlone 为IWInitISAPI。3、动态链接数据库问题:ISAPI模式,如果你不指定绝对路径,它会到winnt/system32下面去找,你可以用gsAppPath ,它是系统变量,定议在 SWSystem 里面 ,用时引用SWSystem就可以了,连接字符串为:
con:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;';
con:=con+'Data Source=';
con:=gsAppPath+'DataBase.mdb;'
Connection.ConnectionString:=con;
Connection.Connected:=true;

重新进行编译后就变成ISAPI应用程序拷贝如Web服务器虚拟目录就完成了发布。

2003-5-17 8:32:21  后记 采用Borland Delphi 7完全可以为我们快速的开发出强大,健壮的电子商务系统.最后我们应该感谢Borland为我们提供了一个这么神奇的工具,使得我们免受了许多痛苦折磨.向Borland的天才们致敬!!
 由于是本人的一些经验加上自己的语文水平有限,所以看上去这篇文章有点乱,不好意思.
 程序我已经发布到网上                             (http://www./zfc/cxm/bookshop/BookShop.dll)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多