博主介绍:翰文编程 专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和课设项目实战、企业信息化系统建设,从业十八余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了2000+题目解决方法案例 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
4.1系统功能模块分析
4.1.1 设计原则
本系统项目创建过程实行以下方法原则:采用业界认可的先进技术和设备,系统服务器承担着整个网络信息的存储,系统必须易于维护,在系统建设和开发过程中的每个环节,无论是主机、数据库,操作与处理的关键任务,为信息系统的支撑枢纽,必须遵循有关国际,在一个统一的体系结构之中,国家主流技术标准存储设备、网络、网管,系统对硬件软件的要求会不断提高,从数据库存贮、检索,开发运行平台都采用高性能、随着数据量的增加和运行节点的扩展,高可靠性的技术、设备平台,系统采用的所有硬件,网站服务器的可靠性要求较高,支持开放的标准接口,网站服务器还要求速度快,软件的选型必须考虑可扩展性的要求,系统中每种设备、否则,信息的获取、存储、管理,,很难提供快速、为保证系统的可靠性,高效的信息服务,软件必须具有良好的开放性,使整个系统成为一个统一的整体,等各个环节和有关技术组成,检索、统计、发布,从数据库存贮、检索、提取、入库,所有硬、软件都应遵循业界相关标准,数据的流动形成一个闭环,整个系统具有良好的安全管理功能,提供友好的用户操作界面,并行处理能力强等高的使用性能,而不致产生运行上的"孤岛",发布、管理等各个层面和角度都具有相应的安全机制,具备直观易用的人机界面,成熟性不存在数据流断路的现象。动态管理:对系统数据库实行动态操作,能实现对数据库信息的动态查询、动态更新修改和动态录入数据。
4.1.2 系统功能设计
1、顾客登录网上订餐系统进行菜单浏览
2、顾客注册为会员
3、顾客对自己的个人信息进行更改,比如联系电话。以及账户密码。
4、顾客对已选的菜单进行更改,选择更改数量或者取消选择。当顾客确定订餐完毕后,顾客将其提交只服务器后台点餐系统,并生成订单。
(1)浏览菜品详细信息
(2)将菜品加入购物车
(3)提交购物车并生成订单
(4)结帐付款
(5)配送点餐,更改订单状态,结束订餐
5、管理员后台管理
(1)管理员在后台登录后,可以创建新的管理员。
(2)管理员对系统菜品进行管理,通过后台录入新的菜品信息,录入后的菜品进行价格描述的修改,根据用户需求,及时更新菜品信息。
(3)管理员维护菜品信息,管理用户档案信息。
(4)管理员对用户菜品订单进行管理,可以根据订单状态进行查询,订单编号根据订单日期生成订单编号等。
基于MVC的学校食堂点餐管理系统包括了前台会员点餐子系统,和后台管理员管理子系统,前台点餐子系统的功能结构如图3-1所示。

图3-1 功能结构图
基于MVC的学校食堂管理员管理子系统的功能结构图,如图3-2所示。

图3-2 后台功能结构图
4.2业务流程图
通过画图方式对系统内,所有的角色可以应用到的各单位、人员之间业务关系、作业顺序和管理信息流动过程的进行整体的数据描述的过程。并且画出业务流程图的过程,可以认为是在对系统分析时进行,最终实现了系统业务分析,实现系统所有的功能流程,按照原有信息流动过程结合系统的数据信息,通过有效的分析,逐个地调查分析系统中,用户所需要处理的,所有环节的处理业务,以及处理的内容,和系统进行处理顺序。

图3-3 业务流程图
前台校园食堂在线点餐子系统共有四大功能板块:校园食堂美食菜谱介绍、餐饮资讯、推荐美食介绍、浏览食堂信息、在线点餐和在线交流等模块。用户模块包括用户登录、注册、个人信息修改、查看校园食堂美食菜谱信息、查看餐饮资讯、推荐美食信息、在线查看校园可点餐食堂的菜单及提交美食在线预定单、通过在线交流与校园可点餐食堂间进行沟通等操作;
管理员模块包括管理修改登录密码、管理系统注册会员信息、管理美食资讯信息、管理可到达的点餐学校校园信息、管理学校内的点餐学校校园食堂信息、管理可点餐的菜单信息、管理会员提交的在线交流信息、以及管理会员提交的美食预订单信息等。
4.3 E-R图
系统ER图如图4-4所示,包括管理员与注册会员间关系,管理员与校园食堂点餐订单间关系,注册会员与校园食堂点餐订单间关系,管理员与在线留言间关系,管理员与美食资讯间关系,会员与美食资讯间关系。

图3-4 ER 图
4.4 数据库设计
数据库是设计网站必不可少的后台支持,可以存储系统数据,及保障系统数据安全。创建一个数据库,数据库命名为DB_MeishiSystem,该数据库中包含了7张表:管理员用户信息表(AdminInfo)、注册会员信息表 (MemberInfo)、点餐学校校园(AreaInfo)、菜谱分类 (TypeInfo)、校园可点餐食堂(ShopInfo)、可点餐菜品信息(FoodInfo)、校园食堂点餐订单(OrderInfo)、校园食堂点餐订单明细(OrderList)、用户点餐购物车(ShopCar)。
4.4.1 管理员信息表设计
管理员信息表保存了系统操作管理者的相关信息,包括自动编号ID、管理员帐号、管理员登录密码,表中各个字段的说明如下表4-1所示
表4-1 管理员信息表
|--------|--------------|----|------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| ADName | nvarchar(50) | 否 | 用户名 |
| ADPass | Nvarchar(50) | 否 | 用户密码 |
4.4.2 注册会员信息表设计
会员信息表中记录的是通过系统注册而收集的会员档案相关信息,包括编号ID、会员登录帐号、会员登录密码、姓名、电话、Email、送餐地址、注册时间,表中各个字段的说明如下表4-2所示
表4-2 会员信息表
|----------|--------------|----|--------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| mName | varchar(50) | 否 | 会员登录帐号 |
| mPass | Varchar(50) | 否 | 登录密码 |
| MName | Varchar(50) | 否 | 真实姓名 |
| MPhone | Varchar(50) | 否 | 电话 |
| MEmail | Varchar(50) | 否 | 邮箱 |
| mAddress | Varchar(100) | 否 | 联系地址 |
| addtime | DateTime | 否 | 注册日期 |
4.4.3 菜品分类
美食分类信息中保存的是系统划分美食分类数据,包括自动编号ID、分类名称,表中各个字段的说明如下表4-3所示
表4-3 可点餐菜品信息表
|-------|--------------|----|--------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| TName | Nvarchar(50) | 否 | 美食分类名称 |
4.4.4 点餐校园信息表设计
点餐学校校园信息表存储着可点餐学校校园,包括美食学校名称等信息,表中各个字段的说明如下表4-4所示
表4-4 美食学校信息表
|-------|--------------|----|----------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| AName | Varchar(100) | | 点餐学校校园信息 |
4.4.5 店铺信息
店铺信息表存储的是可校园可点餐食堂详细信息,包括所属点餐学校校园、店铺名称、店铺地址、店铺介绍等字段,表中各个字段的说明如下表4-5所示。
表4-5 校园食堂美食菜谱信息表
|----------|--------------|----|--------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| AID | Int | | 所属学校ID |
| SName | Varchar(100) | | 店铺名称 |
| SName | Varchar(100) | | 电话 |
| SAddress | Varchar(100) | | 店铺地址 |
| SContent | Ntext | | 店铺介绍 |
4.4.6 订单信息表
校园食堂点餐订单信息表主要存储的是存储会员提交的在线预定单,包括订单编号、订单会员、订单电话、联系人、联系电话、联系地址、送餐费用、订单状态、订单日期等字段,表中各个字段的说明如下表4-6所示。
表4-6 订单信息
|----------|--------------|----|--------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| Mid | Int(4) | | 订单会员id |
| OrderNo | Varchar(100) | | 订单编号 |
| OTel | Varchar(100) | | 电话 |
| OUName | Varchar(100) | | 点餐人 |
| MAddress | Varchar(100) | | 送餐地址 |
| OPrice | Float | | 订单费用 |
| OState | Int | | 订单状态 |
| addtime | datetime | | 留言时间 |
4.4.7 订单明细表
校园食堂点餐订单明细信息表主要存储的是订单所对应的详细信息,包括订单编号、订购的美食、订购数量、美食单价、更新时间,表中各个字段的说明如下表4-7所示
表4-7订单明细信息
|---------|--------------|----|--------|
| 字段名 | 类型 | 主键 | 备注 |
| ID | Int(4) | 是 | 自动编号 |
| OrderNo | Varchar(100) | | 订单编号 |
| Fid | Int(4) | | 订购菜品id |
| FName | Varchar(100) | | 菜品名称 |
| FPrice | Float | | 价格 |
| FNum | Int | | 购物数量 |
| addtime | datetime | | 留言时间 |
第5章 系统功能实现
5.1 母版页设计
进入系统首先进入的是系统首页,在系统首页可以查看到美食网站的介绍信息,包括banner展示,以及系统导航菜单,右侧点餐学校校园、及联系方式,如图5-1所示。

图5-1 系统母版页
本系统的页面设计按照 "上"、"中"、"下"布局,其中"中间"部分又分为"左"和"右"2部分。其中系统前台页面的 "上"、"下"、"左"三部分都为统一的,即"上"主要是系统前台页面导航,"下"方主要是系统前台页面的底部,在页面设计的过程中,通过创建MasterPage.master的母版页的形式,只需为页面设置母版页即可,节省代码,方便快捷。
实现原理:页面创建过程中,先创建MasterPage.master的母版页,通过ContentPlaceHolder控件创建出不同学校的母版内容,包括页面标题和页面内容部分,在其他页面引用母版页时,只需要填充母版学校的内容即可。
在实现用户登录前后界面内容显示不同时,通过Session"ADType"获取到登录用户的身份权限,通过Session"ADID".ToString()得到登录用户的ID信息,若当用户的Session"ADID".ToString()值为NULL或空字符时,表示用户没有登录系统,反之表示用户已经成功登录了系统,并通过Session"ADName".ToString()显示用户的登录帐号。
关键代码:
<table border="0" width="1000" bgcolor="#FFFFFF" cellpadding="0" cellspacing="0"
align="center" style="border-left: 5px solid #423003; border-right: 5px solid #423003;">
<tr>
<td style="color: #000000; background-color: #775504; clear: both; text-align: right;">
<p runat="server" id="login_ok" style="color: #000000;">
欢迎 <span style="color: #000000;">
<asp:Literal ID="lit_info" runat="server"></asp:Literal>
</span>登录系统, <a href="Uinfo.aspx"><span style="color: #000000;">会员中心</span></a><a
href="Shopcar.aspx"><span style="color: #000000;">购物车</span></a><a href="ULoginout.aspx"><span
style="color: #000000;">【退出】</span></a>
</p>
<p runat="server" id="login_no">
<a href="ULogin.aspx"><span style="color: #000000;">登录</span></a> <a href="UReg.aspx">
<span style="color: #000000;">注册</span></a>
</p></td></tr>
<tr><td>
<div style="text-align: center;">
<a href="default.aspx">
<img src="img/top.jpg" width="1000" border="0" /></a>
</div></td></tr>
<tr><td align="center" class="PageDH" style="height: 48px; line-height: 48px; font-size: 16px;
background-image: url(img/dh.jpg); background-repeat: repeat-x; color: #fff;">
<a href="default.aspx">首页</a> | <a href="NewsList.aspx?k=推荐美食">推荐美食</a> | <a href="NewsList.aspx?k=美食菜谱">
美食菜谱</a> | <a href="NewsList.aspx?k=餐饮资讯">餐饮资讯</a> | <a href="ShopList.aspx?aid=4">我要点餐</a>
| <a href="BBS.aspx">在线交流</a>
</td></tr>
<tr><td><asp:ContentPlaceHolder ID="CPlace_top" runat="server">
</asp:ContentPlaceHolder>
</td></tr>
<tr><td>
<div class="fooder">
版权所有:
<%=Common.getWebTitle() %>
<a href="admin/ULogin.aspx" target="_blank">管理员系统</a>
</div></td></tr></table>
5.2 浏览推荐美食
对应页面:ArticleList.aspx?tid=1访客点击页面顶部的"新闻",将进入美食资讯展示页面,访客可以随机查看到系统中管理员发布美食资讯信息,如图5-2所示

图5-2 推荐美食
实现原理:页面加载调用Page_Load事件进入初始化界面,判断页面是否重新加载, 以及Request.QueryString"k"判断进入页面要显示的新闻动态关键词,并通过typeid.Text赋值保存,通过获取搜索的关键字,!string.IsNullOrEmpty(Request.QueryString"key"),显示页面中,通过LoadInfo()加载显示符合条件的美食资讯信息,通过调用SystemMgr.BLL.Common.getConnection()实现数据库连接,读取数据数据,并加载显示数据,方法得到服务条件的数据记录的集合,为DataList1控件的DataList1.DataSource赋值,并记录当前符合条件的数据记录数,通过图片格式显示数据。
代码如下:
//根据类型绑定推荐美食信息
private void gvbind()
{string sql = "select * from News where TypeName='" + hf_type.Value + "' order by addtime desc";
SqlConnection con = SystemMgr.BLL.Common.getConnection();
con.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
sda.Fill(ds);
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = ds.Tables0.DefaultView;
objPds.AllowPaging = true;
objPds.PageSize = 39;
int CurPage;
if (Request.QueryString"Page" != null)
CurPage = Convert.ToInt32(Request.QueryString"Page");
else
CurPage = 1;
objPds.CurrentPageIndex = CurPage - 1;
lblCurrentPage.Text = CurPage.ToString();
lblSumPage.Text = objPds.PageCount.ToString();
if (!objPds.IsFirstPage)
{this.hyfirst.NavigateUrl = Request.CurrentExecutionFilePath + "?k=" + hf_type.Value + "&Page=" + 1;
lnkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?k=" + hf_type.Value + "&Page=" + Convert.ToString(CurPage - 1);
}
{hylastpage.NavigateUrl = Request.CurrentExecutionFilePath + "?k=" + hf_type.Value + "&Page=" + objPds.PageCount;
lnkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?k=" + hf_type.Value + "&Page=" + Convert.ToString(CurPage + 1);
}
this.DataList1.DataSource = objPds;
con.Close();
}
protected string CutChar(string strChar, int intLength)
{//取得自定义长度的字符串
if (strChar.Length > intLength)
{ return strChar.Substring(0, intLength); }
else{ return strChar; }}
5.3 查看点餐食堂
进入我也订单模块,点击页面查看可以点餐的学校信息,通过学校后发的数字统计出当前学校拥有的可以订单学校食堂数量,点击学校名称进入食堂列表界面,可以查看食堂的详细列表,包括食堂名称、招牌菜品、联系地址、等信息,点击"查看菜单"按钮进入店铺的详细订购菜品菜单列表页面,如图5-3所示。

图5-3 食堂列表
实现原理:页面加载首先通过调用Page_Load方法加载网站中可以订购菜谱的食堂信息,通过调用Page.IsPostBack验证是否重新加载数据界面,SqlHelper.WebTitle()调用得到网站的标题,并显示在页面中,调用BindPage方法加载当前的所有可以点餐学校,并通过BindShopList(hf_id.Value,"")加载当前所有的店铺列表。选择学校后输入关键字,点击"搜索"按钮调用BindShopList(ddl_area.SelectedValue, key.Text.Trim())加载符合条件的店铺列表。代码如下:
//加载页面
private void BindPage()
{SqlHelper.BindAnyDropDownList("select ID,AName from AreaInfo order by AName", ddl_area, "AName", "id");
ddl_area.Items.Insert(0, new ListItem("所有学校", "0"));
}//绑定学校食堂列表
private void BindShopList(string AID,string key)
{//lit_arealist
string sql = "";
string sql2 = "";
StringBuilder sb = new StringBuilder();
if (AID != "" && AID != "0")
{sql = "select ID,AID,SName,SAddress,SContent from ShopInfo where AID=" + AID + (key ==""?"":" and SName like N'%" + key + "%'") +" order by newid(),SName";
sql2 = "select a.ID,a.AName,isnull(b.num,0) as allnum from AreaInfo a left join (select AID,count(AID) as num from ShopInfo group by AID) b on a.ID=b.AID where a.ID=" + AID + "";}
else{sql = "select ID,AID,SName,SAddress,SContent from ShopInfo where 1=1 " + (key ==""?"":" and SName like N'%" + key + "%'") +" order by newid(),SName";
sql2 = "select a.ID,a.AName,isnull(b.num,0) as allnum from AreaInfo a left join (select AID,count(AID) as num from ShopInfo group by AID) b on a.ID=b.AID where 1=2";}
//加载学校信息
DataTable dtm = SqlHelper.ExecQuerySql(sql2);
if (dtm.Rows.Count > 0)
{lit_areaname.Text = dtm.Rows0"AName".ToString();
}else{lit_areaname.Text = "所有学校";
}//从数据中查取食堂
DataTable dt = SqlHelper.ExecQuerySql(sql);
for (int i = 0; i < dt.Rows.Count; i++)
{sb.AppendLine("<DIV class=\"one tuij\">");
sb.AppendLine("<DL>");
sb.AppendLine("<H3><A href=\"ShopView.aspx?id=" + dt.Rowsi"id".ToString() + "\">" + dt.Rowsi"SName".ToString() + "</A>");
//sb.AppendLine("<B>粥店 </B>");
sb.AppendLine("</H3>");
sb.AppendLine("<SPAN><A href=\"ShopView.aspx?id=" + dt.Rowsi"id".ToString() + "\"\"><img src=\"img/Look.jpg\" border=\"0\" /></A></SPAN>");
sb.AppendLine("</DL>");
sb.AppendLine("<P class=jsh2>招牌菜:" + dt.Rowsi"SContent".ToString ().Replace ("\r","<br/>") + "</P>");
sb.AppendLine("<P class=jsh2>地 址:" + dt.Rowsi"SAddress".ToString() + "</P>");
sb.AppendLine("</DIV>");
}
lit_areanum.Text = dt.Rows.Count.ToString();
lit_shoplist.Text = sb.ToString();
}
5.4 会员注册
为了保证系统的安全性,在用户发布校园食堂美食菜谱等信息操作的时候需要加入用户注册登录功能,用户注册时需要用户输入"登陆名称"、"登录密码"、"确认密码"、"姓名"、"电话"、"邮箱"、"地址"等信息,当用户输入完毕点击"注册按钮",将用户输入信息保存到数据库中,如图5-4所示。

图5-4 用户注册