💖💖作者:IT跃迁谷毕设展
💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
💛💛想说的话:感谢大家的关注与支持!
💜💜
Java实战项目集
微信小程序实战项目集
Python实战项目集
安卓Android实战项目集
大数据实战项目集
💕💕文末获取源码
文章目录
美食推荐外卖订餐小程序-选题背景
随着互联网的快速发展,外卖订餐行业也得到了迅猛的发展。人们越来越倾向于通过手机应用程序来订购外卖,方便快捷的外卖订餐小程序成为了人们生活中不可或缺的一部分。然而,目前市场上的外卖订餐小程序存在一些问题,如信息不准确、推荐算法不智能等,这给用户带来了不便和困扰。因此,开发一款能够提供准确、个性化的美食推荐外卖订餐小程序具有重要的研究意义。
目前市场上的外卖订餐小程序主要依赖于用户的历史订单和评价来进行推荐,但这种方式存在一些问题。首先,用户的历史订单和评价可能并不全面,无法覆盖到所有的美食种类和口味偏好。其次,现有的推荐算法往往只考虑了用户的个人喜好,而忽略了其他因素,如地理位置、时令食材等。此外,现有的外卖订餐小程序在用户体验方面也存在一些问题,如界面设计不美观、操作流程繁琐等。
本课题旨在开发一款能够提供准确、个性化的美食推荐外卖订餐小程序,以解决现有解决方案存在的问题。通过收集用户的历史订单、评价以及地理位置等信息,结合时令食材和用户口味偏好等因素,利用先进的推荐算法进行智能推荐,为用户提供更加符合其需求和口味的美食选择。同时,本课题还将注重用户体验的提升,通过优化界面设计和简化操作流程,使用户能够更加便捷地使用外卖订餐小程序。
美食推荐外卖订餐小程序-技术选型
开发语言:Java+Python
数据库:MySQL
系统架构:B/S
后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django
前端:Vue+HTML+CSS+JavaScript+jQuery
美食推荐外卖订餐小程序-图片展示
美食推荐外卖订餐小程序-小程序首页
美食推荐外卖订餐小程序-商品详情
美食推荐外卖订餐小程序-商品详情下
美食推荐外卖订餐小程序-个人中心
美食推荐外卖订餐小程序-餐厅角色
美食推荐外卖订餐小程序-管理员角色
美食推荐外卖订餐小程序-代码展示
美食推荐外卖订餐小程序-Java代码展示
/**
* 个性推荐
*/
@IgnoreAuth
@RequestMapping("/gexingtuijian")
public R gexingtuijian(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("gexingtuijian方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
CommonUtil.checkMap(params);
List<MeishiView> returnMeishiViewList = new ArrayList<>();
//查询订单
Map<String, Object> params1 = new HashMap<>(params);params1.put("sort","id");params1.put("yonghuId",request.getSession().getAttribute("userId"));
params1.put("shangxiaTypes",1);
params1.put("meishiYesnoTypes",2);
PageUtils pageUtils = meishiOrderService.queryPage(params1);
List<MeishiOrderView> orderViewsList =(List<MeishiOrderView>)pageUtils.getList();
Map<Integer,Integer> typeMap=new HashMap<>();//购买的类型list
for(MeishiOrderView orderView:orderViewsList){
Integer meishiTypes = orderView.getMeishiTypes();
if(typeMap.containsKey(meishiTypes)){
typeMap.put(meishiTypes,typeMap.get(meishiTypes)+1);
}else{
typeMap.put(meishiTypes,1);
}
}
List<Integer> typeList = new ArrayList<>();//排序后的有序的类型 按最多到最少
typeMap.entrySet().stream().sorted((o1, o2) -> o2.getValue() - o1.getValue()).forEach(e -> typeList.add(e.getKey()));//排序
Integer limit = Integer.valueOf(String.valueOf(params.get("limit")));
for(Integer type:typeList){
Map<String, Object> params2 = new HashMap<>(params);params2.put("meishiTypes",type);
params2.put("shangxiaTypes",1);
params2.put("meishiYesnoTypes",2);
PageUtils pageUtils1 = meishiService.queryPage(params2);
List<MeishiView> meishiViewList =(List<MeishiView>)pageUtils1.getList();
returnMeishiViewList.addAll(meishiViewList);
if(returnMeishiViewList.size()>= limit) break;//返回的推荐数量大于要的数量 跳出循环
}
params.put("shangxiaTypes",1);
params.put("meishiYesnoTypes",2);
//正常查询出来商品,用于补全推荐缺少的数据
PageUtils page = meishiService.queryPage(params);
if(returnMeishiViewList.size()<limit){//返回数量还是小于要求数量
int toAddNum = limit - returnMeishiViewList.size();//要添加的数量
List<MeishiView> meishiViewList =(List<MeishiView>)page.getList();
for(MeishiView meishiView:meishiViewList){
Boolean addFlag = true;
for(MeishiView returnMeishiView:returnMeishiViewList){
if(returnMeishiView.getId().intValue() ==meishiView.getId().intValue()) addFlag=false;//返回的数据中已存在此商品
}
if(addFlag){
toAddNum=toAddNum-1;
returnMeishiViewList.add(meishiView);
if(toAddNum==0) break;//够数量了
}
}
}else {
returnMeishiViewList = returnMeishiViewList.subList(0, limit);
}
for(MeishiView c:returnMeishiViewList)
dictionaryService.dictionaryConvert(c, request);
page.setList(returnMeishiViewList);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
CommonUtil.checkMap(params);
PageUtils page = meishiService.queryPage(params);
//字典表数据转换
List<MeishiView> list =(List<MeishiView>)page.getList();
for(MeishiView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
美食推荐外卖订餐小程序-小程序代码展示
<mescroll-uni @init="mescrollInit" :up="upOption" :down="downOption" @down="downCallback" @up="upCallback">
<view class="cu-bar bg-white search" :style="[{top:CustomBar + 'px'}]">
<view class="search-form round">
<input :style='{"padding":"0 30rpx","boxShadow":"0 0 16rpx var(--publicSubColor) inset","backgroundColor":"rgba(255, 255, 255, 1)","borderColor":"var(--publicMainColor)","borderRadius":"20rpx","color":"var(--publicMainColor)","textAlign":"left","borderWidth":"2rpx","fontSize":"28rpx","borderStyle":"solid","height":"88rpx","marginTop":"7rpx"}'
v-model="searchForm.meishiName" type="text" placeholder="商品名称"></input>
</view>
<view class="action">
<view :style="{width:'40rpx',borderRadius:'40rpx 0 0 40rpx',height:'80rpx',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
</view>
<view @tap="search" :style="{padding:'0 10rpx',lineHeight:'80rpx',width:'auto',height:'80rpx',fontSize:'28rpx',color:'rgba(239, 239, 239, 1)',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
搜索
</view>
<view v-if="isAuth('meishi','新增')" @click="onAddTap()"
:style="{padding:'0 10rpx',lineHeight:'80rpx',width:'auto',height:'80rpx',fontSize:'28rpx',color:'rgba(239, 239, 239, 1)',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
新增
</view>
<view v-if="isAuth('meishi','报表')" @tap="openChartDialog" :style="{padding:'0 10rpx',lineHeight:'80rpx',width:'auto',height:'80rpx',fontSize:'28rpx',color:'rgba(239, 239, 239, 1)',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
报表
</view>
<view @click="showDrawer()"
:style="{padding:'0 10rpx',lineHeight:'80rpx',width:'auto',height:'80rpx',fontSize:'28rpx',color:'rgba(239, 239, 239, 1)',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
类型
</view>
<view :style="{width:'40rpx',borderRadius:'0 40rpx 40rpx 0',height:'80rpx',backgroundColor:btnColor[0],borderColor:btnColor[0]}">
</view>
</view>
</view>
<view style="display: flex;flex-wrap: wrap">
<uni-drawer ref="showRight" mode="left" :maskClick="true" :width="100" :mask-click="true">
<scroll-view scroll-y="true" class="tabView" :style='{"padding":"0","boxShadow":"0 0 12rpx rgba(255,0,0,0)","margin":"10rpx 0 0 ","borderColor":"rgba(0,0,0,1)","borderRadius":"0","borderWidth":"0","borderStyle":"solid","height":"auto"}'>
<view style="display: flex;">
<view style="display: flex;flex-direction: column;width: 100%;">
<view :style='meishiTypes===item.codeIndex?sactiveItem:sitem' class="tab"
v-for="(item,index) in meishiTypesList" :key="index" :class="meishiTypes===item.codeIndex?'tabActive':''"
@tap="meishiTypesCategoryClick(item.codeIndex)">
{{item.indexName}}
</view>
</view>
</view>
</scroll-view>
</uni-drawer>
美食推荐外卖订餐小程序-文档展示
美食推荐外卖订餐小程序-结语
💕💕
Java实战项目集
微信小程序实战项目集
Python实战项目集
安卓Android实战项目集
大数据实战项目集
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。