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

摘    要

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

       }

   }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS -关于对象相关介绍

在JS中&#xff0c;除去基本的数据类型&#xff0c;还有包含对象这种复合数据类型&#xff0c;他可以储存多个键值对&#xff0c;并且每个键都是唯一的&#xff0c;并且在对象中可以包含各种数据类型的值&#xff0c;包括其他对象&#xff0c;数组&#xff0c;函数等。对象是Ja…

[AI]-(第0期):认知深度学习

深度学习是一种人工智能&#xff08;AI&#xff09;方法&#xff0c;用于教计算机以受人脑启发的方式处理数据。 深度学习模型可以识别图片、文本、声音和其他数据中的复杂模式&#xff0c;从而生成准确的见解和预测。 您可以使用深度学习方法自动执行通常需要人工智能完成的…

linux 基础命令docker及防火墙iptables详解

应用场景&#xff1a; web应用自动打包和发布 自动化测试&#xff0c;持续集成、发布 在服务环境中部署后台应用 搭建paaS平台 安装应用 apt install docker.io#kali中 配置docker源&#xff0c;文件位置/etc/docker/daemon.json { "registry-mirrors": [ "h…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简单步…

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

基于Springboot的小区物业管理系统

基于SpringbootVue的小区物业管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 用户管理 员工管理 业主信息管理 费用信息管理 楼房信息管理 保修信息…

攻防世界---reverse_re3

1.下载附件&#xff0c;先查壳&#xff1a;无壳 2.在IDA中分析&#xff0c;shiftfnf5&#xff0c;看到一串长得很像flag的flag 3.根据提示我们需要找到输入&#xff0c;再进行md5转换才能得到flag flag{md5(your input)} 4.双击这个句话&#xff0c;点进去想查看信息&#xff0…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来&#xff0c;对于参加考试的同学们来说&#xff0c;准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌&#xff0c;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘&#xff08;SSD&#xff09;健康状况检测工具&#xff0c;旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态&#xff0c;从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先&#xff0c;它能够定…

【分治】Leetcode 库存管理 III

题目讲解 LCR 159. 库存管理 III 本题的含义就是让求出最小的k个数 算法讲解 class Solution { public:void my_qsort(vector<int>& nums, int l, int r){if(l > r) return ;int i l, left l-1, right r1;int key nums[rand() % (r - l 1) l];//完成分三…

深度学习基础之《TensorFlow框架(12)—图片数据》

一、图像基本知识 1、如何转换图片文件 回忆&#xff1a;之前我们在特征抽取中讲过如何将文本处理成数据 思考&#xff1a;如何将图片文件转换成机器学习算法能够处理的数据&#xff1f; 我们经常接触到的图片有两种&#xff0c;一种是黑白图片&#xff08;灰度图&#xff09;…

C++ - STL详解—vector类

一. vector的概念 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;向量是一个能够存放任意类型的动态数组。 …

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

深度学习每周学习总结P5(运动鞋识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

开源大数据集群部署(二十一)Spark on yarn 部署

作者&#xff1a;櫰木 1 spark on yarn安装&#xff08;每个节点&#xff09; cd /root/bigdata/ tar -xzvf spark-3.3.1-bin-hadoop3.tgz -C /opt/ ln -s /opt/spark-3.3.1-bin-hadoop3 /opt/spark chown -R spark:spark /opt/spark-3.3.1-bin-hadoop32 配置环境变量及修改配…

BFS解决八数码问题-java

本文主要通过BFS广度优先搜索来解决八数码问题。 文章目录 前言 一、八数码 二、算法思路 1.思路模拟 2.实现思路 三、代码 1.代码如下&#xff1a; 2.读入数据 3.代码运行结果 总结 前言 本文主要通过BFS广度优先搜索来解决八数码问题。 提示&#xff1a;以下是本篇文章正文内…

有没有手机上使用的库存软件

库存软件是一种仓库的信息管理系统&#xff0c;它主要针对出库与入库这些数据进行管理&#xff0c;传统的库存管理都是在电脑上安装一个专门的数据库管理系统进行管理&#xff0c;这也是一种比较成熟的管理方式&#xff0c;那么有没有手机上使用的库存软件。 手机上使用的库存软…

开发工具——postman使用教程详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已停止维护&#xff0c;官方不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman.com…