课程设计---物流配送管理系统.doc_第1页
课程设计---物流配送管理系统.doc_第2页
课程设计---物流配送管理系统.doc_第3页
课程设计---物流配送管理系统.doc_第4页
课程设计---物流配送管理系统.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

吉林省经济管理干部学院吉林经济职业技术学院2012-2013学年第一学期课 程 设 计项目类别:C#程序设计II课程设计设计题目:物流配送管理系统班 级 :11软件组长学号 :06 31组长姓名 :高海丹 王秋红校内教师:庞英智企业教师:徐铁楠设计日期: 2012年12月 17 日2012年12月 28日吉林省经济管理干部学院吉林经济职业技术学院一、设计目标“C#程序设计II”课程设计是在系统的学习了C#程序设计II课程后,综合运用所学的知识,设计开发一个小型基于C/S模式物流配送管理系统。它的主要功能有:区域信息管理、顾客信息管理以及物流配送信息管理和信息查询四大功能。通过这一具体问题的分析、设计与实现,将理论与应用相结合,学会如何把书本上学到的知识用于解决实际问题,培养动手能力。二、任务描述(一)三层架构模式三层架构模式是有表现层、业务逻辑层,数据层组成的。表现层:根据需求进行界面设计,并完成基本交互代码,能够实现将代码提交给业务逻辑层。业务逻辑层:将表现层的数据解析成数据层的数据模型,并传递给数据层。同时接受数据层的返回结果给表现层、数据层:数据库连接、接收业务逻辑层传递过来的数据模型,提交给数据库进行处理,并根据实际的具体需求建立存储过程,既数据层开发员不在负责数据库的整体建立。(二)四大功能区域物流配送系统一共包括区域信息管理、顾客信息管理以及物流配送信息管理和信息查询四大功能,一下就是这四大功能之间关系的简图。并且这四大功能与数据相连,实现对数据库的增、删、改、查操作。物流配送管理系统区域信息管理 顾客信息管理 物流配送管理 信息查询新区域创建区域查询 区域删除 区域修改新用户创建顾客查询顾客删除顾客修改顾客配送查询物流配送查询三、人员分工成员姓名成员分工组长高海丹负责数据层的建立组长王秋红负责数据库建立组员矫美丽 负责业务逻辑层建立及代码实现组员牟天琪负责业务逻辑层接口代码实现组员宋飞 表现层的FArea FGuest FGuestOrder界面设计组员张强表现层的MainForm Forder FSearch界面设计组员崔志伟 表现层的FArea FGuest代码设计组员赵映寰表现层的FGuestOrder MainForm代码设计组员孙博表现层的Forder FSearch代码设计四、设计过程 (一)设计思想 我们小组们采用三层架构模式,使系统的代码不冗长,也有利于系统的编译和运行,如果系统出现错误就会第一时间知道问题出现在哪里。所以采用三层的架构模式,不仅调理清晰,组员分工明确完成的效率也会提高。以下就是三层架构逻辑关系图。也是我们小组们设计设计系统的思想。表现层业务逻辑层将表现层传递进来的数据转换成数据模型进行判断返回结果行是否大于1是则继续执行否则创建失败 数据层将业务层传来的数据解封用泛型集合,将结果集返回到业务逻辑层 数据库 表现层将数据 传到业务逻辑层 将数据模型封装传递给数据层 将数据传给数据库 命令成功后返回结果集 传递结果 返回表现层(二)数据库设计 根据物流管理系统的需求分析,可见在功能上分为:区域信息管理、顾客信息管理、物流配送管理和信息查询。1、数据表的建立区域信息管理根据需求分析得到区域信息只需要记录:区域和区域信息的描述即可,所以可以为表TArea建立如下字段:物流配送区域:TAreaAreaIDuniqueidentifier区域编号AreaIDAreaNameVarchar(50)区域名称AreaNameAreaDescVarchar(150)区域描述AreaDesc 顾客信息表TGuestGuestIDuniqueidentifier顾客编号GuestIDGuestNameVarchar(50)顾客姓名GuestNameGuestPhoneVarchar(50)顾客联系电话GuestPhoneGuestAddressVarchar(500)顾客地址GuestAddressGuestDescVarchar(1000)顾客说明GuestDescAreaIDuniqueidentifier所属区域AreaID* 配送状态表TOrder(OrderIDuniqueidentifier物流单编号CycleIDOrderNoVarchar(5)物流单号CycleNoOrderStateInt配送状态CycleStateOrderDescVarchar(500)配送备注CycleDesc配送时间表TGuestOrderGuestOrderIDuniqueidentifier配送关系编号GuestCycleIDGuestIDuniqueidentifier顾客编号GuestIDOrderIDuniqueidentifier运单编号CycleIDOrderOutDateDatetime配送日期CycleOutDateOrderOverDateDatetime送至日期CycleNextDateDeliveryStaffVarchar(5)配送员CycleCheckNOOrderMoneyFloat运费CycleMoneyisBackInt是否被拒收CycleBackOrderStateInt配送状态CycleState2、建立视图 根据顾客表物流配送表检索物流与顾客的关系并建立视图V1。3、存储过程设计为了方便程序处理,我们小组们需要为每个数据库中的表元素添加关于增、删、改、查、的存储过程,例如为区域增加的存储过程(其他三个表的存储过程也依此进行设计):插入ALTER Proc dbo.Insert_GuestGuestID uniqueidentifier,GuestName varchar(50), GuestPhone varchar(50),GuestAddress varchar(500),GuestDesc varchar (1000),AresID uniqueidentifierAsINSERT INTO TGuest (GuestID,GuestName,GuestPhone,GuestAddress,GuestDesc,AresID)VALUES (GuestID,GuestName,GuestPhone,GuestAddress,GuestDesc,AresID) 修改ALTER Proc dbo.Update_GuestGuestID uniqueidentifier,GuestName varchar(50),GuestPhone varchar(50),GuestAddress varchar(500),GuestDesc varchar(1000),AresID uniqueidentifierAsUpdate TGuest set GuestName = GuestName, GuestPhone = GuestPhone,GuestAddress=GuestAddress,GuestDesc=GuestDesc where GuestID=GuestID删除ALTER Proc dbo.Delete_GuestGuestID uniqueidentifierAsDelete from TGuest where GuestID=GuestID查询ALTER Proc dbo.Select_GuestGuestID uniqueidentifier,GuestName varchar(50),GuestPhone varchar(50),GuestAddress varchar(500),GuestDesc varchar(1000),AresID uniqueidentifierAsselect GuestID, GuestName, GuestPhone,GuestAddress,GuestDesc,AresID from TGuest where convert(varchar(50),GuestID) like % + convert(varchar(50),GuestID)+ % and GuestName like % + GuestName + % andGuestPhone like % + GuestPhone + % andGuestAddress like % + GuestAddress + % andGuestDesc like % + GuestDesc + % andconvert (varchar(50),AresID) like % +convert(varchar(50), AresID)+ %(三)建立数据模型及代码实现 根据项目的核心思想,因此需要建立一个类库项目,项目名称为“CommonModel”,并根据数据库表中的结构定义类和属性。尽量保证表名和类名相同,字段名和属性名相同,字段类型和属性数据类型相同。using System;using System.Collections.Generic;using System.Text;namespace CommonModel public class TGuest private Guid guestID = Guid.Empty; private string guestName = ; private string guestPhone = ; private string guestAddress = ; private string guestDesc = ; private Guid areaID = Guid.Empty; public Guid GuestID get return guestID; set guestID = value; public string GuestName get return guestName; set guestName = value ; public string GuestPhone get return guestPhone; set guestPhone = value; public string GuestAddress get return guestAddress; set guestAddress = value; public string GuestDesc get return guestDesc; set guestDesc = value; public Guid AreaID get return areaID; set areaID= value; 其他三个表同上(四)表现层的设计以及代码实现1、项目总揽表现层开发员需要了解在项目的关系:CycleManagement项目:是项目运行的界面项目,负责与用户交互;CycleInterface项目:是负责与业务逻辑层之间协商的规范,负责与业务逻辑层进行交互;CommonModel项目:是负责表现层使用数据模型;当项目开发时,表现层与业务逻辑层之间需要交流的便是CycleInterface项目中BLL文件夹内的借口文件;2、主窗口MainForm在“LogisticsManagement”项目中右击,选择“新建项”,在项目列表中选择“Windows窗体”,名称为“MainForm.cs”;窗体建立后,设置窗体属性:MainForm.IsMdiContainer=trueMainForm.Text= 物流配送管理系统MainForm.StartPosition=CenterScreen在需求分析中,物流配送管理系统的主要功能有:区域信息管理、顾客信息管理以及物流配送信息管理和信息查询四大功能,因此可以为主窗体添加一个菜单栏,并设置如下菜单:基础信息管理(M)信息查询(S)退出系统(X)区域管理(A)顾客管理(G)物流配送管理(C)(无)(无)单击“区域管理”菜单,则调用窗体“FArea”;单击“顾客管理”菜单,则调用窗体“FGuest”;单击“物流配送管理”菜单,则调用窗体“FLogistics”;单击“信息查询”菜单,则调用窗体“FSearch”;单击“退出系统”菜单,则执行Application.Exit()退出应用程序。因此,为每个菜单编辑类似如下的代码(假设FArea窗体已经存在)FArea form = new FArea();form.MdiParent = this;form.StartPosition = FormStartPosition.CenterParent;form.WindowState = FormWindowState.Maximized;form.Show();该窗体由于属于各个功能窗体的调用总窗体,因此不需要与业务逻辑层进行任何的交互操作。3、区域管理窗口FArea窗体控件布局根据需求分析,在区域管理的功能上,只需要做到增、删、查即可,不需要为区域管理添加其他功能,因此可将区域管理功能的界面设计如图所示界面:业务逻辑的功能统计根据界面的设计,我们小组们知道该功能需要:查询出目前所有区域的信息创建区域信息修改区域信息删除区域信息操作逻辑窗体加载成功后,通过查询功能将区域信息加载到内存,并在区域信息的数据源列表中的第一个位置新增具有“新建区域”信息的区域项目;单击“创建”按钮,则调用业务逻辑层的创建方法,并传递区域名和区域描述两个文本框的内容;单击“修改”按钮,则调用业务逻辑层的修改方法,并传递区域编号、区域名、区域描述;单击“删除”按钮,则调用业务逻辑层的删除方法,并传递区域编号;单击“取消”按钮,则使区域信息框隐藏,既Visible=false;窗体加载时读取数据双击窗体标题栏,进入代码编写界面,并在FArea_Load方法内书写如下代码: IArea bll = new AreaBLL();List list = bll.GetList();TArea empty=new TArea ();empty.ID=Guid.Empty;empty.Name=新建区域;empty.Description=;list.IndexOf(empty, 0);lstAreaList.Items.Clear();foreach (TArea tmp in list)ListViewItem lvi = new ListViewItem(tmp.Name);lvi.SubItems.Add(tmp.ID.ToString();lvi.SubItems.Add(tmp.Description);lvi.ToolTipText = tmp.Name;lvi.Tag = tmp;lvi.ImageIndex=0;lstAreaList.Items.Add(lvi);双击ListView操作双击ListView后,可能引发的三种情况:代码如下:if (lstAreaList.SelectedItems.Count != 0) TArea area = (TArea)lstAreaList.SelectedItems0.Tag; txtAreaName.Text = area.Name; txtAreaDesc.Text = area.Description; if (area.ID = Guid.Empty) grpAreaInfo.Visible = true; btnCreate.Enabled = true; btnModify.Enabled = false; btnDelete.Enabled = false; btnCancel.Enabled = true; grpAreaInfo.Tag = area; txtAreaName.Text = ; txtAreaDesc.Text = ; else grpAreaInfo.Visible = true; btnCreate.Enabled = false; btnModify.Enabled = true; btnDelete.Enabled = true; btnCancel.Enabled = true; grpAreaInfo.Tag = area; 单击创建单击创建后,由于需要与数据库进行交互,因此需要通过业务逻辑层的方法来创建。在创建之前,需要对数据进行简单的验证,例如是否为空,数据是否合法等:if (txtAreaName.Text = ) MessageBox.Show(区域名称不能为空!); return; IArea bll = new AreaBLL(); if (bll.Create(txtAreaName.Text, txtAreaDesc.Text) MessageBox.Show(区域新建成功!); grpAreaInfo.Visible = false; else MessageBox.Show(区域新建失败!); 单击修改单击修改后,由于需要与数据库进行交互,因此需要通过业务逻辑层的方法来修改,在修改之前,需要对数据进行简单的验证,例如是否为空,数据是否有效等:if (txtAreaName.Text = ) MessageBox.Show(区域名称不能为空!); return; IArea bll = new AreaBLL(); if (bll.Modify(TArea)grpAreaInfo.Tag).ID, txtAreaName.Text, txtAreaDesc.Text) MessageBox.Show(区域修改成功!); grpAreaInfo.Visible = false; else MessageBox.Show(区域修改失败!); 单击删除单击删除与修改相似,只是这里不再需要判断数据是否合法,只需要将ID传递给业务逻辑层即可:if (MessageBox.Show(this, 确定要删除该区域么?, 删除, MessageBoxButtons.OKCancel) = DialogResult.OK) IArea bll = new AreaBLL(); if (bll.Delete(TArea)grpAreaInfo.Tag).ID) MessageBox.Show(区域删除成功!); grpAreaInfo.Visible = false; else MessageBox.Show(区域删除失败!); 单击取消单击取消,只需要将GroupBox控件隐藏即可:grpAreaInfo.Visible = false;4、顾客管理窗口FGuest顾客管理窗口的界面与区域管理相似,同样应用ListView显示顾客数据,适用GroupBox收集和显示顾客信息数据,可见右图:在顾客管理窗口的顾客信息GroupBox中,逻辑部分便是“顾客类型”选择后,应使对应的Panel处于可用状态,以及单击保存时,需要判断该顾客是需要新建,还是需要保存修改。窗体加载但在窗体加载过程中,需要为区域下拉框添加数据源:IArea area=new AreaBLL ();cmbArea.DataSource = area.GetList();cmbArea.DisplayMember = Name;双击ListView项目if (lstAreaList.SelectedItems.Count != 0) TArea area = (TArea)lstAreaList.SelectedItems0.Tag; txtAreaName.Text = area.Name; txtAreaDesc.Text = area.Description; if (area.ID = Guid.Empty) grpAreaInfo.Visible = true; btnCreate.Enabled = true; btnModify.Enabled = false; btnDelete.Enabled = false; btnCancel.Enabled = true; grpAreaInfo.Tag = area; txtAreaName.Text = ; txtAreaDesc.Text = ; else grpAreaInfo.Visible = true; btnCreate.Enabled = false; btnModify.Enabled = true; btnDelete.Enabled = true; btnCancel.Enabled = true; grpAreaInfo.Tag = area; 切换RadioButton可设计为:单击个人家庭RadioButton时,第一个Panel可用,第二个Panel不可用;单击个体商户RadioButton时,第一个Panel不可用,第二个Panel可用private void rdoHome_CheckedChanged(object sender, EventArgs e) pnlHome.Enabled = true; pnlShop.Enabled = false;private void rdoShop_CheckedChanged(object sender, EventArgs e) pnlHome.Enabled = false; pnlShop.Enabled = true; 单击保存首先,判断双击项目是不是“新建顾客”的项目,如果是“新建顾客”的项目,则执行业务逻辑层中新建的方法,否则需执行修改的方法。操作成功后隐藏GroupBox控件。IGuest bll = new CycleBLL.GuestBLL();TGuest guest = (TGuest)grpGuestInfo.Tag;string Address = txtProvince.Text + , + txtCity.Text + , + txtCounty.Text;if (rdoHome.Checked) Address = Address + ,1, + txtBuildingArea.Text + , + txtBuilding.Text + , + txtUnit.Text + , + txtLayer.Text + , + txtRoomNo.Text;else Address = Address + ,2, + txtStreet.Text + , + txtNo.Text + , + txtOther.Text;if (guest.GuestID = Guid.Empty) if (bll.Create(txtName.Text, txtPhone.Text, Address, txtDesc.Text, (TArea)cmbArea.SelectedValu MessageBox.Show(顾客创建成功!); grpGuestInfo.Visible = false; else MessageBox.Show(顾客创建失败!); Else if (bll.Modify(guest.GuestID, txtName.Text, txtPhone.Text, Address, txtDesc.Text, (TArea)cmbArea.SelectedValue).ID) MessageBox.Show(顾客修改成功!); grpGuestInfo.Visible = false; else MessageBox.Show(顾客修改失败!); 单击取消隐藏GroupBox控件:grpGuest.Visibled=false;5、物流配送管理窗口FLogistics1 添加配送单添加时,需要收集的信息有:顾客姓名、配送单号、运费、配送日期。顾客姓名:顾客信息需要操作员手动输入,将操作员手动输入的文字与数据库中的用户进行对比,当寻找到顾客姓名后,列在文本框下方的列表中提供操作员选择,操作员选择用户后,才能继续进行添加配送单。需要定义一个接口:List GetList(string)根据姓名搜索顾客,并返回满足条件的顾客列表。这时,就需要在文本框的文本改变事件中书写搜索顾客信息的代码:private void textBox1_TextChanged(object sender, EventArgs e) listBox1.Items.Clear(); IGuest bll = new GuestBLL(); List list = bll.GetList(textBox1.Text); listBox1.DataSource = list; listBox1.DisplayMember = GuestName;private void listBox1_SelectedIndexChanged(object sender, EventArgs e) if (listBox1.SelectedItems.Count != 0) tabControl1.Enabled = true; else tabControl1.Enabled = false; 需要定义一个接口List GetNoUseCycle()在窗体加载时,为这个Combobox添加数据源。ICycle cyc=new CycleBLL.CycleBLL();comboBox1.DataSource = cyc.GetNoUseCycle();comboBox1.DisplayMember = No;在信息收集完成后,单击“添加”按钮时,将各个数据传递给业务逻辑层,所以需要建立接口:bool AddCycle(Guid, Guid, string, float, DateTime, DateTime, string)并在单击添加时,执行BLL的该方法IGuestCycle gc = new CycleBLL.GuestCycleBLL();if (gc.AddCycle( (TGuest)listBox1.SelectedItems0).GuestID, (TCycle)comboBox1.SelectedItem0).ID, textBox3.Text, float.Parse(textBox5.Text), dateTimePicker1.Value, dateTimePicker2.Value, textBox4.Text ) MessageBox.Show(添加成功!);else MessageBox.Show(添加失败!);6、信息查询窗口FSearch在信息查询窗口中,系统将完成以下功能:运单与顾客管理、物流的配送日期与送至日期等操作,由此可以看出, 在该界面中,单击物流与顾客管理后,可启动FLogistics窗体,单击搜索后,将搜索条件转为参数传递给业务逻辑层,然后根据业务逻辑层所返回的泛型集合,将数据填充到列表中。(五)业务逻辑层的建立业务逻辑开发员的主要工作就是将表现层传递进来的数据转换成数据模型,并交由数据层处理。因此表现层需要在基础框架上建立三个工程:CommonModel、DAL、BLL。Public int Insert(TArea area) return 1;至于CommonModel应该通过组长向数据层开发员索要。业务逻辑开发员只需要将BLL实现即可。在业务逻辑层实现过程中,需要不断的与表现层或组长进行沟通,得知表现层需要什么样的方法,返回什么样的数据。区域信息管理只涉及到增、删、改、查,因此在区域的业务逻辑类中,只要满足这四个要求基本就可以满足表现层所需要的功能了。其他接口的实现与钢瓶创建的接口原理上都是一样的,都是将参数转换为数据模型,最简成增、删、改、查的操作,再传递给能够完成操作的数据层方法。(六)数据层建立及代码实现1) 数据库公共执行类DatabaseControl介绍并基本建类在框架基础上,建立类库项目:DAL,并添加对CommonModel类库的引用。由于DAL负责与数据库的交互,为了减少代码重写,提高数据库的操作,我们小组们将数据库的操作过程写在一个名为DatabaseControl的类中。该类是整个项目最核心的一个部分,也是相对最复杂的一个部分,该类一旦被建立,会大大减少我们小组们在其他位置所书写的代码和逻辑过程。对于数据库的操作,除了返回“该操作共影响了 N 行”外,就是返回一个的数据集合。所以,我们小组们除了定义数据库连接器(SqlConnection)、数据命令器(SqlCommand)和数据适配器(SqlDataAdapter)外,还需要建立公开方法:Executed方法所有需要执行数据库操作的,都必须调用Execute来执行SQL语句或存储过程。而Execute的返回值,则有两种情况,一种是返回一个数字,一种是返回一个结果集,所以Execute方法得到了以下几种重载/执行语句或存储过程,返回影响的行数(无参数传递)Int Execute(CommandType, string)/将参数传递给语句或存储过程并执行,返回影响的行数(有参数传递)Int Execute(CommandType, string, SqlParameter)/执行语句或存储过程,返回结果集(无参数传递)DataCollection Execute(CommandType, string)/将参数传递给语句或存储过程并执行,返回结果集(有参数传递)DataCollection Execute(CommandType, string, SqlParameter)由于数据库的操作需要打开数据库和关闭数据库,因此需要建立Open和Close方法。截止到目前,我们小组们可以得到如下的类代码:public class DatabaseControl private const string connstr = ; private SqlConnection conn = new SqlConnection(connstr); private SqlCommand comm = new SqlCommand(); private SqlParameter adap = new SqlParameter(); public int Execute(CommandType type, string command) return Execute(type, command, new SqlParameter ); public IList Execute(CommandType type, string command) return Execute(type, command, new SqlParameter ); public int Execute(CommandType type, string command, SqlParameter para) public IList Execute(CommandType type, string command, SqlParameter para) private void OpenDatabase() if (conn.State != ConnectionState.Open) conn.Open(); comm = new SqlCommand(); comm.Connection = conn; private void Close() if (conn.State = ConnectionState.Open) conn.Close(); 进一步加工这个类,整合OpenDatabase方法根据两个三参Execute方法,我们小组们可以看出,在建立指令对象时,需要为SqlCommand对象指定:CommandType、CommandText以及Parameter。需要注意的是SqlCommand所接受的Parameter并不是数组,而是SqlParameterCollection对象,因此我们小组们需要将SqlParameter数组对象添加到这个Collection中。所以,数据库的打开方法:OpenDatabase将更改为:Private void OpenDatabase(CommandType type, string command, SqlParameter para)if (conn.State != ConnectionState.Open) conn.Open(); comm = new SqlCommand(); comm.Connection = conn; comm.CommandType = type; comm.CommandText = command; foreach (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论