ASP.NET基于Web的招投标系统的设计与实现

news2024/11/20 11:19:47

摘    要

招标拍卖的历史悠久,在近两千年的发展历程中,人们对拍卖的理论和技术做了大量的探讨。随着计算机网络技术的迅猛发展和日益成熟,为了提高招投标及采购工作的效率,为廉政建设和防止腐败提供技术保障,传统的拍卖招标向网上招投标过渡, 基于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个部分进行简单的介绍。

  1. .NET战略,.NET战略基于这样一种想法,即所有的设备在将来都会通过Internet连接在一起,而.NET就会为Internet网络上提供的一种服务。
  2. .NET Framework,.NET Framework为ASP.NET提供了具体的服务和技术,方便了开发人员对应用程序的开发,同样也满足了已经连接到Internet上用户的需要。
  3. Windows服务器系统,Windows服务器系统是指像SQL Server 2000 等数据库一样,由.NET Framework应用程序使用的服务器产品。

3.1.2 .NET技术

  1. .NET Framework为 Microsoft 公司建立 .NET战略提供了基础。所有设备都将在标准化或共享协议的基础赏识用类似XML这样的公共语言,在不同的操作系统和设备上执行众多软件。
  2. .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 "";

       }

   }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机科学与导论 第十六章 安全

文章预览&#xff1a; 16.1引言16.1.1 安全目标16.1.2 攻击 16.2机密性16.2.1 对称密钥密码术16.2.2 非对称密钥密码术 16.1引言 为了安全&#xff0c;信息需要避开未授权的使用(机密性),保护信息不受到未授权的篡改(完整性)&#xff0c;并且对于得到授权的实体来说是需要时可…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…

OpenWrt One/AP-24.XY 开源路由器发布,OpenWRT与Banana Pi社区合作

OpenWrt One/AP-24.XY 开源路由器 2024 年&#xff0c;OpenWrt 项目将迎来20 周年&#xff01;OpenWrt 开源社区官方通过推出社区自己的第一个完全上游支持的硬件设计来庆祝这一周年纪念日。并与联发科&#xff0c;Banana Pi开源社区紧密合作&#xff0c;共同完成硬件的设计与…

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系&#xff08;从已有节点创建关系&#xff09;4.4…

esp32 rst:0xf (BROWNOUT_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

供电不足导致的 1、第1次出现 电脑usb电压不够&#xff0c;只有3.8V&#xff0c;给esp32s3供电&#xff0c;然后esp32带的模块太多&#xff0c;运行启动就一直报错 2、第2次出现 esp32带的模块单独电池供电&#xff0c;然后一运行MAX98357播放声音就重启 然后换模块单独充电…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

给一个新项目配置conda环境的完整流程,安装pytorch,dgl

创建环境&#xff0c;并指定python的版本&#xff0c;我这边指定为3.7&#xff1a; conda create --name [自定义的环境名] python3.7我这边假定我的环境名为grand&#xff1a; conda create --name grand python3.7创建成功后&#xff0c;初始化一下conda&#xff1a; source …

easyx库的介绍

前言 如果想要摆脱黑窗口的限制那么easyx图形库是一个好的选择 easyx的初认识 easyx是针对c的图形库&#xff0c;可以帮助c/c上手图形和游戏编程 所以要用easyx必须要用.cpp的后缀 1 easyx的原理 window的图形编程&#xff0c;最终都由window的底层API来实现 2 easyx的颜色 …

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现&#xff1a; Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是&#xff1a;有时在一个交通网络上增加一条路段&#xff0c;或者提高某个路段的局部通行能力&a…

CRMEB PRO安装系统配置清单

统在安装完成之后&#xff0c;需要对系统进行一系列的配置&#xff0c;才能正常使用全部的功能&#xff0c;以下是官方整理的配置清单

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

【C++入门】类的6个默认成员函数、运算符重载、初始化列表、const成员、static成员

目录 引言 构造函数 引入构造函数 构造函数的特征 一些细节 析构函数 析构函数的特性 注意事项 拷贝构造函数 书写格式 使用细节 拷贝构造的典型应用场景 运算符重载 意义与格式 注意事项 赋值运算符重载 const成员 两个经典问题 再谈构造函数—初始化列…

『FPGA通信接口』汇总目录

Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

使用http-parser解析http请求和响应数据

1 简介 http-parser是一个用C编写的HTTP消息解析器&#xff0c;专为高性能HTTP应用程序设计。它能够解析HTTP/1.0和HTTP/1.1的消息&#xff0c;包括头部、主体和连续行。当解析到特定的HTTP元素&#xff08;如请求行、头字段或消息体&#xff09;时&#xff0c;会触发相应的回调…

【前端面试3+1】15 CSS如隐藏元素、css块级元素和行内元素有哪些?两者有什么区别?、JavaScript中“==”与“===”的区别、【丢失的数字】

一、CSS如何隐藏元素&#xff1f; 1、使用 display: none; 这种方法会隐藏元素&#xff0c;并且不占据页面空间。元素会被完全移除&#xff0c;无法通过任何方式显示出来。 .hidden-element {display: none; }2、使用 visibility: hidden; 这种方法会隐藏元素&#xff0c;但仍然…

线段树汇总

线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数&#xff0c;时间复杂度为O(logN)。而未优化的空间复杂度为2N&a…

Office 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到Office 2024安装包”。 打开解压后的文件夹&#xff0c;鼠标右击“YAOCTRI_Installer”选择“以管理员身份运行”。 输入数字“1”自动开始安装。 软件正在安装&#xff0c;请耐心等待&#xff0c;谢谢。 安装完成&#xff0c;点击“…

浅析Redis④:字典dict实现

什么是dict&#xff1f; 在 Redis 中&#xff0c;dict 是指哈希表&#xff08;hash table&#xff09;的一种实现&#xff0c;用于存储键值对数据。dict 是 Redis 中非常常用的数据结构之一&#xff0c;用于实现 Redis 的键空间。 在 Redis 源码中&#xff0c;dict 是一个通用…