基于微信小程序+Python的美食菜谱推荐系统设计与实现

💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例(持续更新)
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人

一.前言

在这里插入图片描述
随着现代生活节奏的加快和人们健康意识的提升,饮食健康已成为公众关注的热点问题。越来越多的人开始追求均衡、营养丰富的饮食方式,以维护身体健康和预防疾病。然而,如何科学合理地搭配食材,制定个性化的健康食谱,对于许多人来说仍是一个挑战。在这样的背景下,健康菜谱推荐系统的研究应运而生。

另一方面,移动互联网技术的飞速发展也为健康菜谱推荐系统的研究提供了有力支持。通过微信小程序和推送算法等技术的应用,可以收集和分析用户的饮食情况、健康状况等信息,为用户提供个性化的菜谱推荐服务。这种服务不仅能帮助用户解决饮食搭配的问题,还能促进健康产业的发展,提高人们的生活质量。

本系统采用了B/S架构模式、微信开发者,使用 Django框架,搭建了Python语言和django服务器,并选择MySQL轻量级数据库作为数据存储媒介。通过这些技术手段,可以保证系统的高效性和稳定性,并且为用户提供良好的体验和高效的管理能力。


二.技术环境

ide工具:PyCharm或者 IDEA,微信小程序开发工具
数据库: mysql5.7 (必须5.7)
编程语言: Python
python框架:Django
maven: 3.6.1
详细技术:HTML+CSS+Python+Django+MYSQL+VUE+MAVEN+微信开发工具


三.功能设计

1、用户需求分析
用户作为该系统的主要使用人员,在系统中发挥十分重要的作用,通过详细分析得出,首先用户需要拥有系统登陆的账号,这里也能够允许用户自行注册;然后再进入系统首页之后,用户可以查看到菜谱信息、学习视频、美食论坛、我的等信息,随后用户可以自行点击操作这些功能。
2、管理员需求分析
对于信息管理系统,最重要的角色当属于管理员。管理员需要完成不少任务,主要包括用户、口味、食谱分类、菜谱信息、视频分类、学习视频、美食论坛、系统管理、个人中心等。然后可以增删改查等操作。
用户用例图如图所示。
在这里插入图片描述

管理员用例图如图所示。
在这里插入图片描述
系统总体功能结构图如下所示:
在这里插入图片描述

程序上交给用户进行使用时,需要提供程序的操作流程图,这样便于用户容易理解程序的具体工作步骤,现如今程序的操作流程都有一个大致的标准,即先通过登录页面提交登录数据,通过程序验证正确之后,用户才能在程序功能操作区页面操作对应的功能。
在这里插入图片描述

四.数据设计

数据库概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。而且Mysql数据库是自我保护能力比较强的数据库,限于篇幅要求,仅列出关键部分实体属性图和E-R图,如下所述。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
系统总体E-R图如下所示:
在这里插入图片描述

五.部分效果展示

5.1用户微信端功能实现效果

微信小程序首页是用户登录后进入的第一个界面,用户可通过小程序端首页进入对应的页面或者通过小程序最下面的那一行导航栏中的“首页、菜谱信息、学习视频、美食论坛、我的”,也可以点击“我的”进入我的页面,在我的页面可以对我的收藏、我的发帖、修改密码等进行详细操作,如图所示:

在这里插入图片描述

用户点击学习视频,在学习视频页面输入视频名称、视频分类、发布人、发布时间、评论数、收藏数、视频内容等信息进行相应的操作,如图所示:

在这里插入图片描述

用户点击菜谱信息,在菜谱信息页面可以查看食谱名称、食谱分类、口味、发布时间、评论数、收藏数、食材、食谱价格等信息,并可以进行赞、踩、添加评论等操作,如图所示:

在这里插入图片描述

在我的功能界面,用户点击“我的”进入我的页面,在我的页面可以对学习视频、我的收藏、我的发帖、修改密码等进行详细操作,如图所示:

在这里插入图片描述

用户点击美食论坛,在美食论坛页面可以查看帖子标题、发布人、发布时间等信息,并可以进行搜索等相应操作,如图所示:
在这里插入图片描述

5.2管理员服务端功能实现效果

管理员登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,管理员登录功能实现图如图所示:
在这里插入图片描述

当管理员登录时,需选择管理员身份权限。系统将会调用LoginController进行判断,并对输入的信息与数据库中的相关信息进行比对。若验证通过,则会自动跳转至管理员主页面;若未能通过验证,则会重新跳转至登录页面并给出相应的验证失败提示,以避免再次出现同样的错误。管理员功能实现页面如图所示:

在这里插入图片描述

管理员点击用户管理,在用户管理页面中输入用户名、姓名、头像、性别、年龄、邮箱、手机等进行查询,然后查看用户信息,也可以点击查看、修改、添加或删除等操作。如图所示:
在这里插入图片描述

管理员点击菜谱信息,在菜谱信息页面中输入食谱名称、食谱分类、图片、口味、发布时间、评论数、收藏数,进行查询,然后查看菜谱信息,也可以查看、修改、添加、查看评论或者删除等操作。如图所示:
在这里插入图片描述

管理员点击学习视频,在学习视频页面中输入视频名称、视频分类、图片、学习视频、发布人、发布时间、评论数、收藏数,进行查询,然后查看学习视频信息,也可以点击添加、查看、修改、查看评论或者删除等操作。如图所示:

在这里插入图片描述

管理员点击学习视频评论,在学习视频评论页面中输入用户名、评论内容、回复内容,进行查询,然后查看评论内容,也可以点击回复或删除等操作。如图所示:
在这里插入图片描述

管理员点击美食论坛,在美食论坛页面中输入帖子标题、用户名、状态、是否置顶、置顶时间,进行查找,然后查看帖子内容,也可以点击查看、查看评论或删除等操作。如图所示:
在这里插入图片描述

管理员点击轮播图管理,在轮播图管理页面中输入名称、值等信息,进行查看或修改等操作。如图所示:
在这里插入图片描述

管理员点击菜谱文章,在菜谱文章页面中输入标题、分类名称、发布人、点击次数、收藏数、图片,进行查找,然后查看文章内容,也可以点击查看、修改或删除等操作。如图所示:

在这里插入图片描述

部分功能代码

def caipuxinxi_info(request,id_):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        data = caipuxinxi.getbyid(caipuxinxi,caipuxinxi, int(id_))
        if len(data)>0:
            msg['data']=data[0]
            if msg['data'].__contains__("reversetime"):
                if isinstance(msg['data']['reversetime'], datetime.datetime):
                    msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")
                else:
                    if msg['data']['reversetime'] != None:
                        reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')
                        msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")

        #浏览点击次数
        try:
            __browseClick__= caipuxinxi.__browseClick__
        except:
            __browseClick__=None

        if __browseClick__=="是"  and  "clicknum"  in caipuxinxi.getallcolumn(caipuxinxi,caipuxinxi):
            try:
                clicknum=int(data[0].get("clicknum",0))+1
            except:
                clicknum=0+1
            click_dict={"id":int(id_),"clicknum":clicknum}
            ret=caipuxinxi.updatebyparams(caipuxinxi,caipuxinxi,click_dict)
            if ret!=None:
                msg['code'] = crud_error_code
                msg['msg'] = ret
        return JsonResponse(msg)

def caipuxinxi_detail(request,id_):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        data =caipuxinxi.getbyid(caipuxinxi,caipuxinxi, int(id_))
        if len(data)>0:
            msg['data']=data[0]
            if msg['data'].__contains__("reversetime"):
                if isinstance(msg['data']['reversetime'], datetime.datetime):
                    msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")
                else:
                    if msg['data']['reversetime'] != None:
                        reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')
                        msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")

        #浏览点击次数
        try:
            __browseClick__= caipuxinxi.__browseClick__
        except:
            __browseClick__=None

        if __browseClick__=="是"   and  "clicknum"  in caipuxinxi.getallcolumn(caipuxinxi,caipuxinxi):
            try:
                clicknum=int(data[0].get("clicknum",0))+1
            except:
                clicknum=0+1
            click_dict={"id":int(id_),"clicknum":clicknum}

            ret=caipuxinxi.updatebyparams(caipuxinxi,caipuxinxi,click_dict)
            if ret!=None:
                msg['code'] = crud_error_code
                msg['msg'] = ret
        return JsonResponse(msg)

def caipuxinxi_update(request):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
        req_dict = request.session.get("req_dict")
        if 'clicktime' in req_dict.keys() and req_dict['clicktime']=="None":
            del req_dict['clicktime']
        if req_dict.get("mima") and "mima" not in caipuxinxi.getallcolumn(caipuxinxi,caipuxinxi) :
            del req_dict["mima"]
        if req_dict.get("password") and "password" not in caipuxinxi.getallcolumn(caipuxinxi,caipuxinxi) :
            del req_dict["password"]
        try:
            del req_dict["clicknum"]
        except:
            pass


        error = caipuxinxi.updatebyparams(caipuxinxi, caipuxinxi, req_dict)
        if error!=None:
            msg['code'] = crud_error_code
            msg['msg'] = error

        return JsonResponse(msg)


def caipuxinxi_delete(request):
    '''
    批量删除
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
        req_dict = request.session.get("req_dict")

        error=caipuxinxi.deletes(caipuxinxi,
            caipuxinxi,
             req_dict.get("ids")
        )
        if error!=None:
            msg['code'] = crud_error_code
            msg['msg'] = error
        return JsonResponse(msg)


def caipuxinxi_vote(request,id_):
    '''
    浏览点击次数(表属性[browseClick:/],点击字段(clicknum),调用info/detail接口的时候后端自动+1)、投票功能(表属性[vote:/],投票字段(votenum),调用vote接口后端votenum+1)
统计商品或新闻的点击次数;提供新闻的投票功能
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code}


        data= caipuxinxi.getbyid(caipuxinxi, caipuxinxi, int(id_))
        for i in data:
            votenum=i.get('votenum')
            if votenum!=None:
                params={"id":int(id_),"votenum":votenum+1}
                error=caipuxinxi.updatebyparams(caipuxinxi,caipuxinxi,params)
                if error!=None:
                    msg['code'] = crud_error_code
                    msg['msg'] = error
        return JsonResponse(msg)

def caipuxinxi_importExcel(request):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": {}}

        excel_file = request.FILES.get("file", "")
        file_type = excel_file.name.split('.')[1]
        
        if file_type in ['xlsx', 'xls']:
            data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())
            table = data.sheets()[0]
            rows = table.nrows
            
            try:
                for row in range(1, rows):
                    row_values = table.row_values(row)
                    req_dict = {}
                    caipuxinxi.createbyreq(caipuxinxi, caipuxinxi, req_dict)
                    
            except:
                pass
                
        else:
            msg = {
                "msg": "文件类型错误",
                "code": 500
            }
                
        return JsonResponse(msg)

import math

#查找相似用户
def cosine_similarity(a, b):
    numerator = sum([a[key] * b[key] for key in a if key in b])
    denominator = math.sqrt(sum([a[key]**2 for key in a])) * math.sqrt(sum([b[key]**2 for key in b]))
    return numerator / denominator

#收藏协同算法
def caipuxinxi_autoSort2(request):
    if request.method in ["POST", "GET"]:
        req_dict = request.session.get("req_dict")
        cursor = connection.cursor()
        sorted_recommended_goods=[]
        user_ratings={}
        try:
            cursor.execute("select * from storeup where type = 1 and tablename = 'caipuxinxi' order by addtime desc")
            desc = cursor.description
            data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
            #用户-订单矩阵
            for item in data_dict:
                if user_ratings.__contains__(item["userid"]):
                    ratings_dict = user_ratings[item["userid"]]
                    if ratings_dict.__contains__(item["refid"]):
                        ratings_dict[str(item["refid"])]+=1
                    else:
                        ratings_dict[str(item["refid"])] =1
                else:
                    user_ratings[item["userid"]] = {
                        str(item["refid"]):1
                    }
            try:
                # 计算目标用户与其他用户的相似度
                similarities = {other_user: cosine_similarity(user_ratings[request.session.get("params").get("id")], user_ratings[other_user])
                                for other_user in user_ratings if other_user != request.session.get("params").get("id")}
                # 找到与目标用户最相似的用户
                most_similar_user = sorted(similarities, key=similarities.get, reverse=True)[0]
                # 找到最相似但目标用户未购买过的商品
                recommended_goods = {goods: rating for goods, rating in user_ratings[most_similar_user].items() if
                                     goods not in user_ratings[request.session.get("params").get("id")]}
                # 按评分降序排列推荐
                sorted_recommended_goods = sorted(recommended_goods, key=recommended_goods.get, reverse=True)
            except:
                pass
        except:
            sorted_recommended_goods=[]
        L = []
        where = " AND ".join([f"{key} = '{value}'" for key, value in req_dict.items() if key!="page" and key!="limit" and key!="order"and key!="sort"])
        if where:
            sql = f'''SELECT * FROM (SELECT * FROM caipuxinxi WHERE {where}) AS table1 WHERE id IN ('{"','".join(sorted_recommended_goods)}') union all SELECT * FROM (SELECT * FROM caipuxinxi WHERE {where}) AS table1 WHERE id NOT IN ('{"','".join(sorted_recommended_goods)}')'''
        else:
            sql = f'''select * from caipuxinxi where id in ('{"','".join(sorted_recommended_goods)}') union all select * from caipuxinxi where id not in('{"','".join(sorted_recommended_goods)}')'''
        cursor.execute(sql)
        desc = cursor.description
        data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
        for online_dict in data_dict:
            for key in online_dict:
                if 'datetime.datetime' in str(type(online_dict[key])):
                    online_dict[key] = online_dict[key].strftime(
                        "%Y-%m-%d %H:%M:%S")
                else:
                    pass
            L.append(online_dict)

        return JsonResponse({"code": 0, "msg": '',  "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":5,"list": L[0:int(req_dict["limit"])]}})


# (按值统计)时间统计类型
def caipuxinxi_value(request, xColumnName, yColumnName, timeStatType):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": {}}
        
        where = ' where 1 = 1 '
        sql = ''
        if timeStatType == '日':
            sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d')".format(xColumnName, yColumnName, where, '%Y-%m-%d')

        if timeStatType == '月':
            sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m')".format(xColumnName, yColumnName, where, '%Y-%m')

        if timeStatType == '年':
            sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y')".format(xColumnName, yColumnName, where, '%Y')

        L = []
        cursor = connection.cursor()
        cursor.execute(sql)
        desc = cursor.description
        data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
        for online_dict in data_dict:
            for key in online_dict:
                if 'datetime.datetime' in str(type(online_dict[key])):
                    online_dict[key] = online_dict[key].strftime(
                        "%Y-%m-%d %H:%M:%S")
                else:
                    pass
            L.append(online_dict)
        msg['data'] = L
        return JsonResponse(msg)

# 按值统计
def caipuxinxi_o_value(request, xColumnName, yColumnName):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": {}}
        
        where = ' where 1 = 1 '
        
        sql = "SELECT {0}, sum({1}) AS total FROM caipuxinxi {2} GROUP BY {0} LIMIT 10".format(xColumnName, yColumnName, where)
        L = []
        cursor = connection.cursor()
        cursor.execute(sql)
        desc = cursor.description
        data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
        for online_dict in data_dict:
            for key in online_dict:
                if 'datetime.datetime' in str(type(online_dict[key])):
                    online_dict[key] = online_dict[key].strftime(
                        "%Y-%m-%d %H:%M:%S")
                else:
                    pass
            L.append(online_dict)
        msg['data'] = L
        return JsonResponse(msg)

# (按值统计)时间统计类型()
def caipuxinxi_valueMul(request, xColumnName, timeStatType):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": []}

        req_dict = request.session.get("req_dict")

        where = ' where 1 = 1 '

        for item in req_dict['yColumnNameMul'].split(','):
            sql = ''
            if timeStatType == '日':
                sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d') LIMIT 10".format(xColumnName, item, where, '%Y-%m-%d')

            if timeStatType == '月':
                sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y-%m') LIMIT 10".format(xColumnName, item, where, '%Y-%m')

            if timeStatType == '年':
                sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM caipuxinxi {2} GROUP BY DATE_FORMAT({0}, '%Y') LIMIT 10".format(xColumnName, item, where, '%Y')

            L = []
            cursor = connection.cursor()
            cursor.execute(sql)
            desc = cursor.description
            data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
            for online_dict in data_dict:
                for key in online_dict:
                    if 'datetime.datetime' in str(type(online_dict[key])):
                        online_dict[key] = online_dict[key].strftime(
                            "%Y-%m-%d %H:%M:%S")
                    else:
                        pass
                L.append(online_dict)
            msg['data'].append(L)
        return JsonResponse(msg)

# (按值统计())
def caipuxinxi_o_valueMul(request, xColumnName):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": []}

        req_dict = request.session.get("req_dict")
        
        where = ' where 1 = 1 '

        for item in req_dict['yColumnNameMul'].split(','):
            sql = "SELECT {0}, sum({1}) AS total FROM caipuxinxi {2} GROUP BY {0} LIMIT 10".format(xColumnName, item, where)
            L = []
            cursor = connection.cursor()
            cursor.execute(sql)
            desc = cursor.description
            data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
            for online_dict in data_dict:
                for key in online_dict:
                    if 'datetime.datetime' in str(type(online_dict[key])):
                        online_dict[key] = online_dict[key].strftime(
                            "%Y-%m-%d %H:%M:%S")
                    else:
                        pass
                L.append(online_dict)
            msg['data'].append(L)

        return JsonResponse(msg)




def caipuxinxi_group(request, columnName):
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": "成功", "data": {}}
        
        where = ' where 1 = 1 '

        sql = "SELECT COUNT(*) AS total, " + columnName + " FROM caipuxinxi " + where + " GROUP BY " + columnName

        L = []
        cursor = connection.cursor()
        cursor.execute(sql)
        desc = cursor.description
        data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
        for online_dict in data_dict:
            for key in online_dict:
                if 'datetime.datetime' in str(type(online_dict[key])):
                    online_dict[key] = online_dict[key].strftime("%Y-%m-%d")
                else:
                    pass
            L.append(online_dict)
        msg['data'] = L
        return JsonResponse(msg)




源码及文档获取

文章下方名片联系我即可~
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
精彩专栏推荐订阅:在下方专栏👇🏻

最新计算机毕业设计选题篇-选题推荐
小程序毕业设计精品项目案例-200套
Java毕业设计精品项目案例-200套
Python毕业设计精品项目案例-200套
大数据毕业设计精品项目案例-200套
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一点毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值