- 浏览: 84299 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
上周六,写了第一篇博客《订餐系统之权限设计》,在此感谢那些鼓励、关注我的园友们,更要感谢那些提出宝贵建议的朋友们。看了你们的评论,才真切的感受到:朋友们的评论往往会让文章更有看点。上篇文章中 郑明、人生就是赌 等几个园友的留言让我对我们系统的权限优化有了方向。当然,这样的优化肯定不是一天两天的事,做技术的朋友应该都知道:一个难题经常啃啃,某天也许就有了好的方案了(近段时间啃掉了几个2、3年前未处理好的的问题,才想起初中数学老师让我们经常啃一些竞赛题的良苦用心),今天的文章说的就是一个从2010年就想优化,但一直未优化好的功能,也从 幸福框架的评论中,看到了他的博客,更是从他博客的留言中,找到了处理:按日期+6位顺序号生成订单编号(主要处理并发的情况)的方案,之前有客户要这样生成订单编号,我只能回复实现不了,因为当时只知道,每次获取最大的订单编号,处理不了并发的情况,惭愧。
关于这个标题,我还是交代下背景吧。这个问题从2010年第一次实现时,就觉得当时那种方案太差了,自己都看不去,只因没有别的办法,从那以后,每每得空,就拿出来琢磨下,现在这个方案也许还有不少问题,也希望各位指点下。我们是做订餐系统的,主要实体就是商家(有坐标)和用户(有坐标)。所以就有这么个需求,返回距离N公里内的商家,按距离从近到远排序。先看下,数据库设计吧,如图(1):
图(1)
下面我先介绍下这几个表的关系吧:
ETogo :商家表,dataid表示商家编号,togoname表示商家名称。
ETogoLocalInfo:商家定位表,togoid对应etogo.dataid,lat表示商家纬度,lng表示商家经度(经纬度在地图上标注所得)
EAddress :用户地址表,保存用户的经纬度,lat表示用户纬度,lng表示用户经度(经纬度在地图上标注所得)
生活的经验告诉我们:一条成功的路,背后总有数不完的错误的路。下面我把那些曾经错误的路也写下来,以作对比。
当时年少,对sql基本只会简单的select,更多的东西依赖于应用程序,于是有了下面的代码,由于对第二页的处理不了,所以用了方法:getDistancetogoid获取前N页的id然后再处理,里面关于距离的语句每次同事用到都抱怨,如果再加的N公里内的,这个语句就麻烦了。
/// <summary>
/// 获取列表,返回距离排序(出现商家重复的现象目前不采用)
/// </summary>
/// <param name="pagesize">每页大小</param>
/// <param name="pageindex">当前页数</param>
/// <param name="strWhere">搜索条件</param>
/// <param name="orderName">排序字段</param>
/// <param name="orderType">排序类型</param>
/// <param name="mylat">用户纬度</param>
/// <param name="mylng">用户经度</param>
/// <returns></returns>
public IList<TogoInfo> GetDistanceList(int pagesize, int pageindex, string strWhere, string orderName, int orderType, string mylat, string mylng)
{
IList<TogoInfo> infos = new List<TogoInfo>();
string ids = "";
if (pageindex > 1)
{
ids = getDistancetogoid(pagesize, pageindex, strWhere, orderName, orderType, mylat, mylng);
if (ids == "")
{
return infos;
}
}
SqlParameter[] parameters =
{
new SqlParameter("@tblName", SqlDbType.VarChar,255),
new SqlParameter("@strGetFields", SqlDbType.VarChar,2000),
new SqlParameter("@primary", SqlDbType.VarChar,255),
new SqlParameter("@orderName", SqlDbType.VarChar,255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar,4500),
new SqlParameter("@ids", SqlDbType.VarChar,2000)
};
string orderstr = orderType > 0 ? "desc" : "asc";
parameters[0].Value = "etogo";
string field = "*, (select Lat from ETogoLocalInfo where togoid = etogo.dataid) as lat ,(select lng from ETogoLocalInfo where togoid = etogo.dataid) as lng, (select lastlogindate from ETogoPrinter where ETogoPrinter.togoid = etogo.dataid ) lastlogindate,(select (Case when DateDiff(mi,LastLoginDate,getdate()) < 5 then 1 else 0 end) from etogoprinter where ETogoPrinter.togoid = etogo.dataid) as online";
field += ",(( 6371 * acos( cos( radians(" + mylat + ") ) * cos( radians( (select Lat from ETogoLocalInfo where togoid = etogo.dataid) )) * cos( radians( (select lng from ETogoLocalInfo where togoid = etogo.dataid) ) - radians(" + mylng + ") ) + sin( radians(" + mylat + ") ) * sin( radians( (select Lat from ETogoLocalInfo where togoid = etogo.dataid) ) ) ) )) as Distance ";
field += " ,CASE WHEN( ( CONVERT(varchar(12) , Time1Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )";
field += "and CONVERT(varchar(12) , Time1End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )";
field += ") or ( CONVERT(varchar(12) , Time2Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )";
field += "and CONVERT(varchar(12) , Time2End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )";
field += ") )THEN 1 ELSE 0 END AS havenew ";
parameters[1].Value = field;
parameters[2].Value = "DataID";
parameters[3].Value = orderName;
parameters[4].Value = pagesize;
parameters[5].Value = pageindex;
parameters[6].Value = orderType;
parameters[7].Value = strWhere;
parameters[8].Value = ids;
using (SqlDataReader dr = SQLHelper.ExecuteReader(CommandType.StoredProcedure, "pageselectpri_togo", parameters))
{
while (dr.Read())
{
TogoInfo info = new TogoInfo();
info.DataID = HJConvert.ToInt32(dr["DataID"]);
info.Picture = HJConvert.ToString(dr["Picture"]);
info.TogoName = HJConvert.ToString(dr["TogoName"]);
int isonline = HJConvert.ToInt32(dr["havenew"]);
if (togostatus == 1 && isonline == 1)
{
info.Status = 1;
}
else
{
info.Status = 0;
}
string _distance = HJConvert.ToString(dr["Distance"]);
if (mylat == "0" || _distance == "")
{
info.mydistance = "0";
}
else
{
info.mydistance = Convert.ToString(Convert.ToInt32(Convert.ToDecimal(_distance) * 1000));
}
info.Lat = HJConvert.ToString(dr["Lat"]);
if (info.Lat == "")
{
info.Lat = "0";
}
info.Lng = HJConvert.ToString(dr["Lng"]);
if (info.Lng == "")
{
info.Lng = "0";
}
infos.Add(info);
}
}
return infos;
}
/// <summary>
/// 获取所有商家的名称和对应的编号
/// </summary>
/// <param name="pagesize">每页大小</param>
/// <param name="pageindex">当前页数</param>
/// <param name="strWhere">搜索条件</param>
/// <param name="orderName">排序字段</param>
/// <param name="orderType">排序类型</param>
/// <param name="mylat">用户纬度</param>
/// <param name="mylng">用户经度</param>
public string getDistancetogoid(int pagesize, int pageindex, string sqlwhere, string sortname, int ordertype, string mylat, string mylng)
{
string ids = "";
string orderstr = ordertype > 0 ? "desc" : "asc";
int top = (pageindex - 1) * pagesize;
string field = "select top " + top + " dataid";
field += ",(( 6371 * acos( cos( radians(" + mylat + ") ) * cos( radians( (select Lat from ETogoLocalInfo where togoid = etogo.dataid) )) * cos( radians( (select lng from ETogoLocalInfo where togoid = etogo.dataid) ) - radians(" + mylng + ") ) + sin( radians(" + mylat + ") ) * sin( radians( (select Lat from ETogoLocalInfo where togoid = etogo.dataid) ) ) ) )) as Distance ";
field += " from etogo where " + sqlwhere + " order by " + sortname + " " + orderstr + " , dataid desc";
using (SqlDataReader dr = SQLHelper.ExecuteReader(CommandType.Text, field, null))
{
while (dr.Read())
{
ids += dr["dataid"] + ",";
}
}
ids = System.Text.RegularExpressions.Regex.Replace(ids, @",$", "");
return ids;
}
以下是代码中用到的分页存储过程:pageselectpri_togo
CREATE PROCEDURE [dbo].[pageselectpri_togo]
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@primary varchar(255)='', -- 主键的字段名
@orderName varchar(255)='', --要排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)
@ids varchar(2000)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @OrderType != 0
begin
set @strTmp = ' not in (select '
set @strOrder = ' order by ' + @orderName +' desc'
if @orderName <> @primary
begin
set @strOrder = @strOrder + ',[' + @primary +'] desc'
end
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = ' not in (select '
set @strOrder = ' order by ' + @orderName +' asc'
if @orderName <> @primary
begin
set @strOrder = @strOrder + ',[' + @primary +'] asc'
end
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else--后面的页数
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @primary + ']' + @strTmp + '['+ @primary + '] from (select top '
+ str((@PageIndex-1)*@PageSize) + ' ['+ @primary + '] from [' + @tblName + ']) as tblTmp)'+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @primary + '] not in ( '+@ids+' ) and ' + @strWhere + ' ' + @strOrder
end
exec (@strSQL)
此方案用时基本没有问题,但是就是太麻烦了,一个不留神,sql语句就拼错了。
从那时实现了之前的方案后,后面的项目都沿用,每每用起时,心中总会不痛快,于是开始经常关注这个,一次机会看到了下面的代码(之前一篇博客中看到的,已太久了,记不起出处了,哪位看到别介意),这个方案中也是大量拼接sql,很容易就出错了,另外,对最后一页还要做特别的处理,只因可以用一个方法(2010年方案要用两个方法,查两次数据库)实现,就放到项目中了,后来,经常有重复的商家,或者有些未显示出来,于是部分项目又用了2010年的方案,那个是麻烦,但至少没有错误。
/// <summary>
/// 获取列表,返回距离排序
/// </summary>
/// <param name="pagesize">每页大小</param>
/// <param name="pageindex">当前页数</param>
/// <param name="strWhere">搜索条件</param>
/// <param name="orderName">排序名称</param>
/// <param name="orderType">排序类型</param>
/// <param name="mylat">用户纬度</param>
/// <param name="mylng">用户经度</param>
/// <returns></returns>
public IList<TogoInfo> GetDistanceList(int pagesize, int pageindex, string strWhere, string orderName, int orderType, string mylat, string mylng)
{
IList<TogoInfo> infos = new List<TogoInfo>();
StringBuilder sb = new StringBuilder();
string distancepstr = "(( 6371 * acos( cos( radians(" + mylat + ") ) * cos( radians( (b.lat) )) * cos( radians( (b.lng) ) - radians(" + mylng + ") ) + sin( radians(" + mylat + ") ) * sin( radians( ( b.Lat) ) ) ) )) as Distance ";
int endrow = pagesize * pageindex;
string ordertype = orderType == 1 ? "desc" : "asc";
string _ordertype = orderType == 0 ? "desc" : "asc";
sb.Append("select a.* ,b.* ,");
sb.Append(distancepstr);
string field = " CASE WHEN( ( CONVERT(varchar(12) , Time1Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )";
field += "and CONVERT(varchar(12) , Time1End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )";
field += ") or ( CONVERT(varchar(12) , Time2Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )";
field += "and CONVERT(varchar(12) , Time2End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )";
field += ") )THEN 1 ELSE 0 END AS havenew";
sb.Append(" , "+ field);
sb.Append(" from etogo as a left join ETogoLocalInfo as b on a.dataid = b.togoid ");
sb.Append(" where a.dataid in ");
sb.Append(" ( select top " + pagesize + " dataid from ");
sb.Append(" (select top " + endrow + " a.dataid , " + distancepstr + ",sortnum from etogo as a left join ETogoLocalInfo as b on a.dataid = b.togoid where " + strWhere);
sb.Append(" order by " + orderName + " " + ordertype + "" + " ,a.dataid desc ) as mytepm ");
sb.Append(" order by " + orderName + " " + _ordertype + "" + ", dataid asc )");
sb.Append(" order by " + orderName + " " + ordertype + "" + ", a.dataid desc ");
//Hangjing.Common.HJlog.toLog(sb.ToString());
using (SqlDataReader dr = SQLHelper.ExecuteReader(CommandType.Text,sb.ToString(), null))
{
while (dr.Read())
{
TogoInfo info = new TogoInfo();
info.DataID = HJConvert.ToInt32(dr["DataID"]);
info.Picture = HJConvert.ToString(dr["Picture"]);
info.TogoName = HJConvert.ToString(dr["TogoName"]);
int togostatus = HJConvert.ToInt32(dr["Status"]);
int isonline = HJConvert.ToInt32(dr["havenew"]);
if (togostatus == 1 && isonline == 1)
{
info.Status = 1;
}
else
{
info.Status = 0;
}
info.mydistance = HJConvert.ToString(dr["Distance"]);
if (info.mydistance == "")
{
info.mydistance = "-1";
}
info.Lat = HJConvert.ToString(dr["Lat"]);
info.Lng = HJConvert.ToString(dr["Lng"]);
infos.Add(info);
}
}
return infos;
}
终于有一次再也忍受不了了,于是下定决心要优化(当然,就我目前的水平,想到的更多还是方便书写)了,当前就想了一点,不在程序中拼接距离的sql语句。经过多次修改,于是有了下面的代码:
-- =============================================
-- Author: jijunjian
-- Create date: 2013-5-7
-- Description: 获取商家列表(含坐标,按距离排序)
-- 调用 EXEC ETogo_GetShopListWithDistance 10,1,'distance','asc','1=1','30.313035','120.390998','distance<1'
-- =============================================
CREATE PROCEDURE [dbo].[ETogo_GetShopListWithDistance]
@pagesize int, --分页大小
@pageindex int, --页码
@orderfield varchar(20),--排序字段名称
@ordertype varchar(5), --排序类别 desc asc
@where varchar(2000), --查询条件
@lat VARCHAR(50),--用户纬度
@lng VARCHAR(50),--用户经度,
@otherwhere VARCHAR(2000)--这个条件是用来判断距离,及根据营业时间的状态条件
AS
DECLARE @startRow int,
@endRow int,
@sql varchar(4000),
@ordername varchar(200)--排序字段
SET @ordername = '( 6371 * acos( cos( radians(' + @lat + ') ) * cos( radians( Lat )) * cos( radians( lng ) - radians(' + @lng + ') ) + sin( radians(' + @lat + ') ) * sin( radians( Lat ) ) ) )'
IF @otherwhere = ''
SET @otherwhere = '1=1'
SET @startRow = (@pageindex - 1) * @pagesize + 1
SET @endRow = @startRow + @pagesize - 1
SET @sql = '
SELECT * FROM
(
select *,row_number() over(order by '+@orderfield+' '+@ordertype+') as [rowid] from
(
select '+@ordername+' as distance,dbo.ETogo.*,ETogoLocalInfo.Lat,ETogoLocalInfo.Lng,
CASE WHEN( ( CONVERT(varchar(12) , Time1Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )
and CONVERT(varchar(12) , Time1End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )
) or ( CONVERT(varchar(12) , Time2Start, 114 ) < CONVERT(varchar(12) , getdate(), 114 )
and CONVERT(varchar(12) , Time2End, 114 ) > CONVERT(varchar(12) , getdate(), 114 )
) )THEN 1 ELSE 0 END AS havenew
from etogo
LEFT JOIN ETogoLocalInfo ON etogo.dataid=ETogoLocalInfo.togoid WHERE '+ @where +'
) m where '+ @otherwhere +'
)m2
WHERE ROWID BETWEEN '+convert(varchar(5), @startRow) +' AND '+ convert(varchar(5), @endRow)+ '
'
print @sql
EXEC(@sql)
这个方案让我们搜索N公里内的代码变得简单了 :@otherwhere 参数 设置成 :distance < n 即可了。按距离排序只用:@orderfield=‘distance’就可以了。程序中再也不用出现距离两点距离的sql语句,另一个意外收获就是让我搜索营业中的商家也变得简单了(我们营业根据商家设置的两个时间段(如:8:00-12:00 16:00-20:00)及一个状态值而定).
以上便是此问题这几年的优化历程,当然,可能很多人对我们行业不了解,也可能我只是抽出了代码片段,很多人看了可能还是会不知所云,不过我想真正想研究这个问题的人看了,就应该能明白了。2013年的方案,可能还有不少问题,或者可以再进一步优化。希望有部分人能用到的同时 ,也能对此方案提出更多更好的意见或建议。
成为一名优秀的程序员!
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1073原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1134原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 624原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 475原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 597原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 560原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 560原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 526原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 497原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 801原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 788原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 624原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 568原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 612原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 840原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 956原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 412原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 676原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 671原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 504原帖地址:http://www.cnblogs.com/had ...
相关推荐
JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园订餐系统项目源码+数据库 JAVA WEB 校园...
网上订餐系统实验报告 网上订餐系统实验报告是关于设计和实现网上订餐系统的实验报告。该报告涵盖了系统的开发背景、研究意义、开发目标、调研分析、可行性分析、系统需求分析、系统设计等方面的内容。 开发背景与...
在线订餐系统(挺好的)在线订餐系统(挺好的)在线订餐系统(挺好的)在线订餐系统(挺好的)在线订餐系统(挺好的)
《网上订餐系统 .NET 企业订餐系统详解》 网上订餐系统是现代餐饮行业中不可或缺的一部分,尤其在 .NET 技术的支持下,企业订餐系统能够提供高效、便捷的在线订餐服务。本系统充分利用了 .NET 框架的优势,构建了一...
网上订餐系统代码 java网上订餐系统代码 基于springboot的网上订餐系统代码 1、网上订餐系统的技术栈、环境、工具、软件: ① 系统环境:Windows/Mac ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ ...
《订餐系统多店版3.5:打造高效餐饮管理平台》 订餐系统多店版3.5是一款专为餐饮行业设计的高效订餐管理软件,它集成了多店铺管理、订单处理、库存控制、支付对接等多种功能,旨在帮助餐饮商家提升服务效率,优化...
【网上订餐系统】是一种基于网络的餐饮服务预订平台,旨在提高订餐效率,适应现代快节奏生活。本文主要探讨的是一款使用JSP(JavaServer Pages)开发的网上订餐系统,采用B/S(Browser/Server)架构和MVC(Model-...
python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 ...
网上订餐系统是一种基于互联网技术的餐饮服务模式,它整合了餐厅、顾客和配送服务,为用户提供方便快捷的在线订餐体验。本源码提供了一个完整的网上订餐系统的前后台代码,涵盖了从用户下单到餐厅接单、处理订单直至...
“基于Android的在线订餐系统的研究与实现”项目由三个模块组成:WEB服务器,Android用户客户端和Android管理员客户端。 WEB服务器 “OrderServer”的部署有两种方法: 1、通过MyEclipse或者Eclipse直接部署,服务器...
基于系统开发的软件工程规范的需要,本人严格执行需求分析,概要设计,详细设计与编码以及系统设计等设计步骤来完成该系统,并且在系统开发过程中结合理论知识与开发技术,完成了网上订餐系统平台的构建,实现预期的...
《构建高效便捷的网上订餐系统——以短信接口技术为核心》 在当今信息化社会,餐饮行业的服务模式也在不断创新,快捷订餐系统与网上订餐系统的出现,极大地改变了人们的用餐方式。这种系统通过集成短信接口,为用户...
订餐系统设计文档知识点概述: 一、引言 1. 编写目的 本设计文档旨在明确软件需求、概要设计、详细设计以及功能测试用例,为软件后续开发和维护提供指导性文档。面向的主要读者对象包括需求人员、系统设计人员、...
网上订餐系统的出现,正是一种对这种需求的有效响应,它结合了现代计算机网络技术与餐饮业的服务,为顾客提供了一个方便快捷的订餐平台。 网上订餐系统通常包含三个主要的界面:用户界面、管理员界面和商家界面。...
《C#网上订餐系统深度解析》 C#网上订餐系统是一款基于C#编程语言,利用Visual Studio 2010开发环境,并配合SQL Server 2008数据库管理系统构建的应用程序。此系统旨在为用户提供便捷的在线订餐服务,同时也为管理...
《基于UML的网上订餐系统》是一款利用统一建模语言(Unified Modeling Language,简称UML)进行设计和开发的在线餐饮预订平台。本系统旨在为用户提供便捷、高效的订餐服务,同时也为餐厅提供智能化的订单管理解决...
《UML外卖订餐系统建模深度解析》 在信息技术领域,统一建模语言(Unified Modeling Language,简称UML)是一种强大的工具,用于系统分析、设计和开发过程中的可视化表达。本篇将深入探讨如何利用UML进行外卖订餐...
【网上订餐系统】是一种基于互联网技术的餐饮服务应用程序,它允许用户在线浏览菜单、选择菜品、...购物车功能的实现,结合了数据管理、业务逻辑和用户交互,是系统的核心功能之一,为用户提供了一个流畅的订餐体验。