招标拍卖的历史悠久,在近两千年的发展历程中,人们对拍卖的理论和技术做了大量的探讨。随着计算机网络技术的迅猛发展和日益成熟,为了提高招投标及采购工作的效率,为廉政建设和防止腐败提供技术保障,传统的拍卖招标向网上招投标过渡, 基于Web的招投标技术将成为今后招投标发展的方向。
本文对招投标国内外研究现状进行分析;阐述了ASP.Net技术,SQL数据库技术,以及B/S结构;并对招投标系统总体流程,系统的功能,招投标系统的数据库设计进行了相关的描述。采用ASP.Net运作方式和SQL2000的新技术和新工具,基于Web方式的招投标系统设计方法,构建了以B/S为结构的招投标系统。
关键词:招投标;数据库;B/S;ASP.Net
3.1 系统开发ASP.NET 1.1技术
ASP.NET 1.1(Active Serever Page.NET 1.1)是微软公司推出的Web开发平台。是在Internet环境中连接各种信息,系统与设备的软件架构。.NET系列服务软件最终目标是形成Internet的操作系统,进而控制其他基于次平台上的服务应用软件。从而,企业和客户都能从微软或他的盟友中获得任何有价值的基于Internet的服务。在ASP.NET运行时,公共语言运行(CLR)是整个.NET框架赖以存在的基础,它为Microsfot .NET应用程序提供了一个托管的代码执行环境。它实际上是驻留在内存里的一段代理代码,主要负责应用程序在整个执行期间的代码管理工作,比较典型的有内存管理、线程管理、安全管理、远程管理、即时编译和代码强制安全类型检查等。
3.1.1 .NET的组成
.NET主要由3个部分组成,下面分别对这3个部分进行简单的介绍。
- .NET战略,.NET战略基于这样一种想法,即所有的设备在将来都会通过Internet连接在一起,而.NET就会为Internet网络上提供的一种服务。
- .NET Framework,.NET Framework为ASP.NET提供了具体的服务和技术,方便了开发人员对应用程序的开发,同样也满足了已经连接到Internet上用户的需要。
- Windows服务器系统,Windows服务器系统是指像SQL Server 2000 等数据库一样,由.NET Framework应用程序使用的服务器产品。
3.1.2 .NET技术
- .NET Framework为 Microsoft 公司建立 .NET战略提供了基础。所有设备都将在标准化或共享协议的基础赏识用类似XML这样的公共语言,在不同的操作系统和设备上执行众多软件。
- .NET Framework提供了各种基础服务,而这些服务在Microsoft公司看来是实现其.NET战略的基本所在。要使网络上的两端交换数据库和连网工作更加容易,最好有一个全球网络和类似XML这样的开发标准。
3.2 SQL数据库技术
随着数据库技术的不断完善,用户数据的不断积累,用户的需求也不断提高,在此之上,更高级的应用应运而生,这包括已经成熟的数据仓库应用、广为接受的商业智能(BI)应用、以及方兴未艾的SOA等。当数据库能够容纳几乎所有数据之后,我们必然面临的一个问题是如何快速获得我们需要的数据。
当用户访问数据库时,怎样减少用户的等待,快速返回用户需要的数据是所有数据库都需要解决的问题。这也就需要另外一项高级增强--面向搜索的增强,从某种意义上说面向需求的增强-数据分析和挖掘也正是这个方向上的高级应用之一。目前各数据库在这一方面都不够完善,我们相信在未来,数据库能够容纳和存储各种数据之后,必然向快速搜索和查询方面进行增强。
3.3 B/S技术
B/S(Browser/Server)结构即浏览器和服务器结构。它是随着 Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端 (Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。
以目前的技术看,局域网建立的B/S结构网络应用,通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式来访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。
6 系统总体实现
本系统使用Pagelet控件技术编写了Header.ascx和Footer.ascx两个用户控件。其中Header.ascx控件用来显示系统标题,Footer.ascx控件用来显示系统的版本和版权信息。
本系统还主要提供了那些与项目基本信息相关的数据库操作方法,在项目类中首先为了用户参与招标投标,其中主要的部分是为某个项目添加一个招竞信息,在添加项目的时候通过对项目发布,项目信息的说明,以及对项目信息的修改,删除,更新等操作来实现了用户在本系统中的招标功能,其功能的实现主要是在数据库中对相关的数据与信息进行修改,删除,更新等,即实现发布招标信息使用户参与招标。
此外,当用户登录本系统后,可以对一系列项目进行浏览,当用户欲求购项目时,那么就需要参与竞标,在参与竞标之前需要对标书进行下载等工作。其页面显示了一个表,该表对每个当前招竞标的项目作了简单的说明。注册用户可以选择某个特定的待招项目,单击后到达BidItem.aspx页面查看别人的竞价或者自己欲对该项目出价,其功能的实现主要是对一个项目出价,出价后利用数据绑定将出价信息写入数据库,在数据库中通过对出价信息进行比较,将出价最高的用户判定为竞标获胜者,再从数据库中将数据读取出来并将用户参与竞标的项目发布在系统的主页面上,同时还公布出参与竞标的用户的详细信息。
6.1 Web.Config文件
主要介绍Web.Config文件为了避免页面重复连接数据库操作的设置。
<appSettings>
<add key="ConnectionString" Value="
Data source=(local);database=bids;
User id=sa;Password=5201314" />
</appSetting>
6.2 系统首页面
该页面为系统首页(图6-1系统首页),提供了登录、注册和浏览列表的链接。该页面非常简单,如果用户已经是系统会员,那么只要输入正确的用户名和密码就可以进入改系统了。如果用户不是会员,那么用户只要按照要求填写相关的信息就可以成功的注册为本系统会员。在不是会员的情况下,用户可以浏览本系统中正在招标的相关信息,但是不能进行任何相关的操作。
图6-1 系统首页
6.3用户注册和登录页面的实现
用户注册页面主要调用Person类提供了用户的详细信息相关的各个属性。这些属性分别与数据表中的字段相对应。在首页面单击“注册”链接进入该页面,此页面不仅可以让用户注册添加个人用户信息,同时它也是修改注册信息的界面。在该页面中使用了几个Panel组件,通过设置它们的Visible属性可以实现上面的操作。在写入数据库时,首先调用了Tools类中的public static bool IsLoggedIn()方法来实现判定用户是否已经登录,这样才能进行安全验证,确定用户是否具有权限访问某些页面。如果没有登录需要注册,则添加用户详细信息,通过Customer方法和系统引用文件.dll向数据库添加注册信息。
下面是Person类设计方案方法的定义和描述。如下表6-2所示:
表6-2 Person类设计方案方法的定义和描述
方 法 名 称 | 描 述 |
public string AddCustomer(string FamilyName,string GiveName,string EmailAddress,string Password,string Add1,string Add2,string City,string State,string Zip,string Country) | 添加一个用户信息 |
public PersonDetails GetPersonByID(Int32 intPersonID) | 获取某条竞标信息的竞标者信息 |
public PersonDetails GetPersonByID(string strEmail) | 通过用户名即邮件地址来查询一个用户 |
public PersonDetails Login(string strEmail,string strPassword) | 处理用户登录事件 |
public string ModifyCustomer(string FamilyName,string GiveName,string EmailAddress,string Password,string Add1,string Add2,string City,string State,string Zip,string Country) | 更新用户信息 |
其页面和几个事件代码如下图6-2所示::
图6-2 用户注册页面
下面主要介绍的是注册页面中核心代码部分,其代码如下:
private string Process;
//判定是否为注册用户
private void Page_Load(object sender, System.EventArgs e)
{
if (Tools.IsLoggedIn())
{
Process = "MODIFY";
Bid.PersonDetails myPersonDetails =
new Bid.PersonDetails();
Bid.Person obj = new Bid.Person();
myPersonDetails=obj.GetPersonDetails
(Request.Cookies["email"].Value);
txtFamilyName.Text = myPersonDetails.FamilyName;
txtGivenName.Text = myPersonDetails.GivenName;
txtEmail.Text = Request.Cookies["email"].Value;
txtPwd.Text = myPersonDetails.Password;
txtAdd1.Text = myPersonDetails.StreetAddress1;
txtAdd2.Text = myPersonDetails.StreetAddress2;
txtCity.Text = myPersonDetails.City;
txtState.Text = myPersonDetails.State;
txtZip.Text = myPersonDetails.PostalCode;
txtCountry.Text = myPersonDetails.Country;
txtEmail.Enabled = false;
obj = null;
GuestMenu.Visible = false;
RegisteredMenu.Visible = true;
}
else
{
Process = "ADD";
GuestMenu.Visible = true;
RegisteredMenu.Visible = false;
}
}
//添加用户信息
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if (Page.IsValid)
{
Bid.Person obj = new Bid.Person();
string strStatus;
if (Process == "ADD")
{
strStatus = obj.AddCustomer(txtFamilyName.Text,
txtGivenName.Text,
txtEmail.Text,
txtPwd.Text,
txtAdd1.Text,
txtAdd2.Text,
txtCity.Text,
txtState.Text,
txtZip.Text,
txtCountry.Text);
try
{
Int32.Parse(strStatus);
Response.Cookies["GivenName"].Value= txtGivenName.Text;
Response.Cookies["email"].Value = txtEmail.Text;
Response.Cookies["PersonID"].Value = strStatus;
Response.Redirect("MenuForRegisteredUsers.aspx");
}
catch (FormatException ex)
{
lblMsg.Text = strStatus;
}
}
else
{
// 更新用户信息
strStatus=obj.ModifyCustomer(txtFamilyName.Text,
txtGivenName.Text,
txtEmail.Text,
txtPwd.Text,
txtAdd1.Text,
txtAdd2.Text,
txtCity.Text,
txtState.Text,
txtZip.Text,
txtCountry.Text);
if (strStatus == "1")
{
Response.Cookies["GivenName"].Value=
Request.Form["txtGivenName"];
Response.Cookies["email"].Value=txtEmail.Text;
Response.Redirect("MenuForRegisteredUsers.aspx");
}
else if(strStatus.Length > 1)
{
lblMsg.Text = "Update Failed! " + strStatus;
}
}
}
}
}
}
用户登录页面主要是为会员提供服务,在用户已经成为会员时,只要该用户输入正确的用户名和密码,就能进入系统,进行一些相关的具体操作。因此,重点是按钮的单击事件响应程序,其功能主要是通过判定用户输入的用户名和密码是否和曾经注册时写入在数据库中的数据是否相同,来实现的登录功能。该页面(图6-3用户登录页面)与代码如下:
图6-3 系统登录页面
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if (Page.IsValid)
{
Bid.Person obj = new Bid.Person();
Bid.PersonDetails myPersonDetails =
new Bid.PersonDetails();
myPersonDetails =
obj.Login(txtEmail.Text, txtPwd.Text);
if (myPersonDetails.PersonID != 0)
{
Response.Cookies["email"].Value = txtEmail.Text;
Response.Cookies["GivenName"].Value =
myPersonDetails.GivenName;
Response.Cookies["PersonID"].Value =
myPersonDetails.PersonID.ToString();
Response.Redirect("MenuForRegisteredUsers.Aspx");
}
else
lblMsg.Text = "Login failed. Please try again.";
}
}
}
}
6.4招竞标页面
该页面显示了一个表,该表对每个当前招竞标的项目作了简单的说明。从该页面中,注册用户可以选择某个特定的待招项目,单击后到达BidItem.aspx页面查看别人的竞价或者自己为该项目出价。该页面功能的实现主要是对一个项目出价后,利用数据绑定将出价信息写入数据库,通过都出价信息的比较,将出价最高的用户判定为竞标获胜者,并发布出该用户的信息。该页面(图6-4项目工程)如下:
图6-4 项目工程
该页面项目类的数据层设计的方法和Page_Load主要事件处理程序与页面如下(图6-4项目工程):
表6-2列出了Item数据层类的设计方案方法的定义和描述。
表6-2 Item类设计方案方法的定义和描述
方 法 名 称 | 描 述 |
public string AddBid(Int32 ItemID) | 为某个项目增加一个竞标信息 |
public string AddItem(string ItemName,string ItemDesc,Double ItemAsk,Double ItemNotify,Int32 ItemSellerID,DateTime ItemExpDate) | 增加一个项目用于竞标 |
public string AddSale(Int32 ItemID,Int32 BidID) | 为某项目添加一次成功的交易记录 |
public string CompleteSale(Int32 ItemID,Double WinningBid) | 完成某件项目的交易 |
public string DeleteItem(Int32 ItemID) | 删除某件项目 |
public SqlDataReader GetBidDetails(Int32 intItemID) | 获取某件项目所有竞价的详细信息 |
public string GetHighestBid(Int32 intItemID) | 获得某个项目的最高竞价 |
public SqlDataReader GetMyWinningBids(Int32 intPersonID) | 返回某用户当前竞标处于领先地位的所有项目 |
public string UpdateItem(string strItemID,string strItemName,string strItemDesc,string strAskPrice,string strNotifyPrice) | 更新某件项目的信息 |
public SqlDataReader ViewItems(Int32 ingSellerID) | 返回某用户的项目 |
public SqlDataReader ViewItemsForSale() | 返回所有可以竞价的项目 |
在介绍了该类的方法与页面实现后,下面主要介绍的是该页面中核心代码部分,其代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
BindGrid();
//通过Tools类中的:public static bool IsLoggedIn()方法,并用该方法去判断用户是否已经登录。
if (Tools.IsLoggedIn())
{
lblUserName.Text = "Welcome" +
Request.Cookies["email"].Value +"";
GuestMenu.Visible = false;
RegisteredMenu.Visible = true;
}
else
{
lblUserName.Text = "Welcome guest";
GuestMenu.Visible = true;
RegisteredMenu.Visible = false;
}
}
}
private void BindGrid()//创建项目对象信息,添加一个招投标信息。
{
Bid.Item objItemList = new Bid.Item();
myItems.DataSource = objItemList.ViewItemsForSale();
myItems.DataBind();
}
public string FormatUrl(Int32 intID, string strName, string strDesc)
{
if (Tools.IsLoggedIn())
return "BidItem.aspx?itemid=" + intID.ToString() +
"&itemname=" +
Server.UrlEncode(strName) + "&itemdesc=" +
Server.UrlEncode(strDesc);
else
return "";
}
}
}