要

随着互联网技术的发展和智能化推荐系统的广泛应用,旅游行业也逐渐依托数据分析和推荐技术为用户提供个性化的服务。传统的旅游推荐方式往往依赖人工选择或简单的分类展示,无法满足日益多样化和个性化的需求。因此,基于协同过滤算法的旅游推荐系统应运而生,旨在通过挖掘用户偏好,为用户推荐最适合的旅游景点和服务。

本课题旨在设计并实现一个基于协同过滤算法的旅游推荐系统。系统包含用户登录与注册、景点信息展示、个人信息管理、旅游论坛、景点分类、推荐系统等多个功能模块。通过用户行为数据的收集与分析,利用协同过滤算法实现基于用户相似性和物品相似性的推荐。具体而言,系统将通过用户对景点的浏览、评分、评论等行为,构建用户兴趣模型,并利用该模型为用户推荐符合其偏好的景点。同时,系统还将结合最热景点、最新景点等功能,提升推荐的精准度与用户体验。此外,用户可通过收藏功能进行个性化管理,实现旅游兴趣的长期跟踪和优化。

本课题的目的是通过协同过滤算法为用户提供个性化的旅游推荐服务,提高用户体验,提升系统的智能化水平。通过优化推荐系统,帮助用户发现符合其偏好的旅游目的地,同时为景点商家提供数据支持,推动旅游产业的创新和发展。

关键词:协同过滤算法; 旅游推荐系统; 用户偏好; 个性化推荐; 数据分析

Abstract

With the development of Internet technology and the wide application of intelligent recommendation system, the tourism industry is also gradually relying on data analysis and recommendation technology to provide personalized services for users. Traditional travel recommendation methods often rely on manual selection or simple classification display, which cannot meet the increasingly diversified and personalized needs. Therefore, the tourism recommendation system based on collaborative filtering algorithm came into being, aiming to recommend the most suitable tourist attractions and services for users by mining user preferences.

This project aims to design and implement a travel recommendation system based on a collaborative filtering algorithm. The system includes user login and registration, scenic spot information display, personal information management, tourism forum, scenic spot classification, recommendation system and other functional modules. Through the collection and analysis of user behavior data, the collaborative filtering algorithm is used to realize the recommendation based on user similarity and item similarity. Specifically, the system will build a user interest model through users' browsing, scoring, commenting and other behaviors, and use the model to recommend scenic spots for users that meet their preferences. At the same time, the system will also combine the hottest scenic spots, the latest scenic spots and other functions to improve the accuracy of recommendation and user experience. In addition, users can conduct personalized management through the collection function to realize the long-term tracking and optimization of travel interests.

The purpose of this project is to provide users with personalized travel recommendation services through the collaborative filtering algorithm, improve the user experience, and improve the intelligence level of the system. By optimizing the recommendation system, it can help users find the tourist destinations in line with their preferences, and provide data support for scenic spot merchants to promote the innovation and development of the tourism industry.

Key wordsCollaborative Filtering Algorithm; Travel Recommendation System; User Preference; Personalized Recommendation; Data Analysis

目  录

摘  要.............................................................................. 1

Abstract............................................................................ 1

第1章 绪论.................................................................... 1

1.1 系统开发背景................................................... 1

1.2 系统开发的目的和意义................................... 1

1.3 系统达到的模板及内容................................... 1

1.4 系统开发主要技术........................................... 1

1.4.1 Python..................................................... 1

1.4.2 Django..................................................... 2

1.4.3 Spider...................................................... 2

1.4.4 协同过滤算法........................................ 2

第2章 系统分析............................................................ 3

2.1 可行性分析....................................................... 3

2.1.1 技术可行性............................................ 3

2.1.2 经济可行性............................................ 3

2.1.3 操作可行性............................................ 3

2.1.4 时间可行性............................................ 4

2.2 需求分析........................................................... 4

2.2.1 功能需求................................................ 4

2.2.2 数据需求................................................ 7

2.2.3 数据字典................................................ 8

2.2.4 性能需求.............................................. 10

第3章 系统设计.......................................................... 11

3.1 数据库设计..................................................... 11

3.1.1 数据库概念设计.................................. 11

3.1.2数据库逻辑设计................................... 16

3.1.3数据库物理设计................................... 21

3.2 程序设计......................................................... 22

3.2.1 总体设计.............................................. 22

3.2.2详细设计............................................... 24

第4章 系统实现.......................................................... 28

4.1  数据库实现................................................... 28

4.1.1  表实现................................................ 28

4.1.2  关系图................................................ 29

4.2  程序实现....................................................... 29

第5章 系统测试.......................................................... 43

5.1 系统测试的目的............................................. 43

5.2 系统测试......................................................... 43

5.2.1 数据库性能测试.................................. 43

5.2.2 后端接口测试...................................... 43

5.3.3 模块测试.............................................. 45

第6章 结论.................................................................. 49

参考文献........................................................................ 50

致谢................................................................................ 51

第1章 绪论

1.1 系统开发背景

随着互联网技术的迅猛发展,旅游行业得到了前所未有的扩展。人们在选择旅游目的地、酒店、景点等方面面临信息过载的问题。传统的旅游推荐方式依赖人工筛选和用户提供的基本信息,难以提供个性化和精准的推荐服务。游客往往因为信息不对称,导致决策困难,错失了适合自己的旅游体验。随着大数据和人工智能技术的快速发展,基于协同过滤算法的旅游推荐系统成为解决旅游信息过载问题、提升旅游决策效率的关键路径。基于协同过滤算法的旅游推荐系统应运而生,旨在为用户提供更加精准和个性化的旅游推荐。

1.2 系统开发的目的和意义

传统的旅游推荐模式,往往依赖用户手动筛选和较为简单的规则匹配,导致推荐效果差,个性化服务不足。基于协同过滤算法的旅游推荐系统,利用算法对用户的历史行为和偏好数据进行深度分析,从而实现更加精准的个性化推荐。对于旅游平台而言,能够通过系统提供更合适的旅游产品推荐,提高用户的满意度和平台的转化率;对用户来说,系统能够根据其个人需求、偏好和历史数据推荐合适的旅游目的地、酒店和景点,提升旅游决策的效率,增强旅游体验。同时,系统为旅游行业提供数据支持,有助于推动行业的智能化升级,提升整个行业的服务水平。

1.3 系统达到的模板及内容

运用计算机技术与协同过滤算法理论,搭建基于协同过滤算法的旅游推荐系统,提升旅游服务的智能化水平。系统需满足:

(1)响应时间:正常网络下,用户请求发出到获取推荐旅游内容的时间控制在 3 秒内,确保即时响应。

(2)安全性:用户需注册并登录后才能使用全部功能,未登录用户仅能浏览基础旅游信息。管理员负责系统数据、用户及权限管理,确保系统数据安全和稳定运行。

(3)吞吐量:系统可在单位时间内处理 200 次以上的用户请求,确保在高并发情况下的稳定性和流畅体验。

(4)程序友好性:界面设计简洁直观,能够适配多种终端设备。操作流程便捷,支持用户的旅游目的地查询、推荐、评价及收藏等多样化功能,提升用户的互动体验。

1.4 系统开发主要技术

1.4.1 Python

Python 是一种高级、解释型编程语言,由 Guido van Rossum 在 1989 年发明,1991 年首次发布。它以简洁易读的语法著称,学习门槛较低,对新手友好。作为解释型语言,Python 代码无需编译,可直接运行,提升了开发效率。Python 支持面向对象、函数式和过程式编程范式,具有强大的表达能力。其拥有庞大且丰富的标准库与第三方库,涵盖数据处理、Web 开发、机器学习等众多领域。在本系统开发中,借助 Python 丰富的库资源,能高效处理数据,为协同过滤算法实现以及系统各项功能搭建提供有力支持 。

1.4.2 Django

Django 是基于 Python 的高级 Web 开发框架,旨在快速、高效地构建优质 Web 应用。它遵循模型 - 视图 - 控制器(MVC)架构模式,鼓励开发者采用简洁、务实的设计理念。Django 拥有强大的数据库抽象层,能轻松与多种数据库(如 MySQL)进行交互,无需编写大量底层数据库操作代码。自带的用户认证、权限管理、表单处理等功能,极大减少了重复开发工作。同时,Django 具备良好的扩展性和安全性,可应对高并发场景,保护系统和用户数据安全。在本旅游推荐系统中,Django 用于搭建稳定可靠的后端架构,实现前后台功能的逻辑处理与交互 。

1.4.3 Spider

Spider(爬虫)是一种用于自动化采集网页数据的程序或脚本。它通过模拟浏览器访问网页,获取网页中的信息并将其提取和存储。爬虫的工作过程通常包括发送请求、获取响应、解析网页内容以及数据存储等步骤。爬虫可以用于各种应用,如搜索引擎索引、数据分析、价格监控、新闻聚合等。

爬虫根据其抓取的目标和方式,可以分为不同类型,包括全网爬虫、深度爬虫和增量爬虫等。全网爬虫会抓取互联网上所有公开的网页,深度爬虫则更注重抓取网站内部深层次页面,而增量爬虫则专注于抓取更新的数据。

虽然爬虫技术非常强大,但也面临一些挑战,如如何处理反爬虫机制、如何避免抓取过度影响网站性能、如何合法合规地抓取数据等。因此,使用爬虫时需要注意遵守相关的法律法规和网站的robots.txt协议。

1.4.4 协同过滤算法

协同过滤算法是一种基于用户行为数据的推荐算法,广泛应用于推荐系统领域。它主要通过分析用户的历史行为,如游客的目的地浏览、住宿预订记录,以及对景点的评价等数据,寻找具有相似行为模式的用户群体或旅游项目集合。基于这些相似性,为目标用户推荐其可能感兴趣的旅游目的地或景点。该算法分为基于用户的协同过滤和基于物品的协同过滤。前者依据用户间的相似性推荐,后者则根据旅游项目(如目的地、景点)之间的相似性进行推荐。在本旅游推荐系统中,协同过滤算法是核心,通过对大量用户数据的分析挖掘,实现旅游项目与游客的精准匹配,提升用户体验与满意度。

2章 系统分析

2.1 可行性分析

可行性分析是为了对整个系统在技术、市场、资金等多个方面进行的研究分析评估。其中本文进行的可行性分析包括技术可行性、经济可行性、操作可行性和社会可行性。

2.1.1 技术可行性

从技术层面来看,本系统的开发具备充分的可行性。在编程语言方面,Python 以其简洁的语法、丰富的库资源以及强大的数据处理能力,为系统开发提供了有力支撑。借助 Numpy、Pandas 等库,能够高效地处理和分析游客与旅游项目的海量数据,为协同过滤算法的运行提供数据基础。

协同过滤算法作为推荐系统的核心技术,在学术界和工业界都已经得到了广泛的研究和应用,技术成熟度高。通过分析用户的历史行为数据,如浏览记录、预订记录等,能够精准地为游客推荐合适的旅游目的地或景点。同时,Django 框架负责搭建稳定可靠的后端架构,实现前后台功能的逻辑处理与交互,确保系统的高效运行。MySQL 数据库用于存储各类数据,保障数据的安全存储与高效调用。综上所述,现有的技术完全能够满足本旅游推荐系统的开发需求。 

2.1.2 经济可行性

在经济可行性上,本系统具有显著优势。开发过程中所使用的 Python、Django、MySQL 等技术均为开源软件,无需支付高昂的软件授权费用,大大降低了开发成本。对于旅游企业来说,提升旅游推荐的精准度是最大的经济收益。通过精准的目的地推荐,企业能够快速找到合适的旅游客户,提升客户满意度,缩短营销周期,减少营销过程中的人力、物力和时间成本。

从长期来看,系统的稳定运行和持续优化也无需大量的额外资金投入。相较于传统旅游推荐方式中因效果不佳而反复进行营销活动所产生的高额费用,本系统的一次性开发成本以及后续的少量维护成本显得微不足道。同时,系统还能帮助企业提高客户质量,进而提升企业的整体效益,为企业带来长远的经济效益。 

2.1.3 操作可行性

本旅游推荐系统在操作可行性方面表现出色。对于游客而言,系统界面设计简洁直观,操作流程简便易懂。在前台,游客可以轻松地进行目的地搜索、查看推荐旅游项目、管理个人信息以及进行旅游预订等操作。系统会根据用户的操作习惯和行为数据,不断优化推荐结果,提升用户体验。

对于旅游企业端,管理员能够方便地发布旅游项目信息、筛选客户需求、与游客进行沟通。后台管理系统为管理员提供了全面的管理功能,包括用户管理、旅游项目管理、数据统计等,操作简单便捷,无需专业的技术知识即可上手。同时,系统还提供了详细的操作指南和帮助文档,进一步降低了用户的操作难度,确保系统能够在实际应用中顺利运行。 

2.1.4 时间可行性

在时间可行性上,本系统的开发具有合理的时间规划。首先,所采用的技术均为成熟技术,开发团队对 Python、Django 等技术有丰富的经验,能够快速搭建系统框架,减少技术探索时间。其次,协同过滤算法有大量的研究成果可供参考,开发人员可以直接借鉴成熟的算法模型,并根据旅游场景进行优化,缩短算法开发周期。

在项目管理方面,采用敏捷开发方法,将整个项目划分为多个阶段,每个阶段都有明确的目标和交付成果。通过合理安排任务,并行开展开发工作,能够有效地提高开发效率。同时,预留了一定的时间用于测试和优化,确保系统在预定时间内完成开发并上线,满足旅游企业和游客的需求。

需求分析旨在充分了解用户各方面需求,并按照用户需求对整个系统进行相关功能的开发,将用户需求转化为文档,从而确定后续工作。

2.2 需求分析

需求分析旨在充分了解用户各方面需求,并按照用户需求对整个系统进行相关功能的开发,将用户需求转化为文档,从而确定后续工作。

2.2.1 功能需求

本系统为基于协同过滤算法的旅游推荐系统,旨在为用户提供精准的旅游推荐服务,同时为管理员提供高效的数据管理与系统运维功能。系统主要面向两类用户角色:普通用户和管理员。系统功能设计需满足不同角色的需求,同时确保用户体验与后台管理的高效性。

具体功能需求如下:

1、登录模块:用户输入注册时的账号(通常为邮箱或手机号码)和密码,系统对其进行验证。验证通过后,用户成功登录系统,系统获取用户的唯一标识,以便后续关联该用户的个性化数据和推荐服务。若验证失败,提示用户账号或密码错误,并提供找回密码或重新注册的链接。

2、注册模块:新用户进入注册页面后,需填写一些基本信息,包括用户名、邮箱地址、手机号码、设置密码等。其中,邮箱地址和手机号码需进行格式验证,确保其有效性。密码设置要求具有一定的复杂度,如包含字母、数字和特殊字符,且长度不少于 8 位,以保障账号安全。

3、全部景点功能模块:在系统首页,展示当前所有景点信息,通过收藏量降序排列。点击相应按钮进入详情页面,里面包含景点所属城市、门票、地址、景区简介、评分、收藏,用户评论等信息。

4、我的信息功能模块:可以修改个人信息,例如密码、名字、邮箱、地址、手机号等信息。

5、旅游论坛功能模块:可以发布游记,游记中可以添加文字,并修改相关文字样式。可以游览论坛,查看热门游记、最新游记、点赞游记、收藏游记等。

6、城市分类功能模块:分类功能,根据数据库存储的信息,按需求添加城市,点击城市按钮,展示所选城市内所有景点信息。

7、最热景点功能模块:在特定的页面,展示热门景点信息。按景点浏览量降序排列。例如,展示近期评分最高的前 10 个景点,并附上精美的图片、简要的介绍和价格信息,吸引用户的关注,激发用户的旅游兴趣。

8、最新景点功能模块:在特定的页面,展示当前最新景点信息。按发布时间进行排序。

9、猜你喜欢功能模块:推荐功能,在系统中利用用户之间的相似性或者旅游产品之间的相似性来为用户推荐可能感兴趣的旅游产品。例如,如果发现一群用户在旅游偏好上很相似,都喜欢历史文化古迹游,并且其中大部分用户都去过某个新开发的古镇,那么对于这个群体中还没去过该古镇的用户,系统就会推荐这个古镇作为旅游目的地。

10、搜索功能模块:在系统页面的显著位置设置搜索框,用户可以在搜索框中输入关键词进行旅游产品搜索。当用户输入部分关键词时,系统根据关键词的热度和相关性,自动显示可能的搜索建议,帮助用户快速确定搜索词,提高搜索效率。例如,当用户输入 “北” 字时,系统自动显示 “北京”、“北戴河”等热门搜索建议。

11、收藏功能模块:用户在浏览旅游产品时,可以点击收藏按钮将感兴趣的产品添加到我的收藏中。用户可以在我的收藏页面随时查看自己收藏的产品,并可以对收藏的产品进行取消收藏等操作。收藏的产品信息包括产品名称、图片、简要介绍、收藏时间等,用户点击收藏的产品可以直接跳转到产品的详情页面,以便进一步了解。

12、管理员功能模块:可以管理城市信息,进行添加或删除。可以进行数据统计,统计用户信息数量、景点数量、评论数量、论坛数量。可以管理景点信息,进行添加或删除。可以管理用户信息、论坛信息等。

系统功能结构图如图2.1所示。

图2.1 系统功能模块图

系统流程图分析的目的是通过可视化的方式,清晰地展示系统各个模块之间的关系与数据流动,帮助开发团队理解系统的工作流程,系统流程图如下图 2.3 所示。

图2.3系统流程图

2.2.2 数据需求

基于协同过滤算法的旅游推荐系统设计与实现课题的数据库需求主要包括:用户信息数据、旅游信息数据、用户意向数据、用户旅游交互数据、旅游数据检索条件数据、可视化数据以及系统推荐算法相关数据。以下是数据流图的描述:

一、数据流图

数据流图(Data Flow Diagram,缩写为DFD)是一种使用图形表示数据在系统内流转及更新的工具,它展示了系统各部分之间的数据交换方式和处理过程。DFD相比传统的功能结构图更加强调数据的输入和输出,使得开发人员可以更清晰地了解程序运行中的数据流向。在本系统中,数据通过用户和管理员进行交互,经过一系列处理后,最终将推荐的旅游信息和可视化结果展示给用户。

(1)系统顶级数据流图

用户通过系统发送请求,系统根据用户的需求返回推荐的旅游列表和可视化结果;管理员则对系统进行管理和数据更新,系统将相关信息返回给管理员。系统的顶级数据流图如图2.4所示。

图2.4系统顶层数据流图

(2)系统一级数据流图

针对顶级数据流图进行拆分,对其中核心功能进行诠释,绘制系统一级数据流图如图 2.5 所示。

图2.5系统一级数据流图

(3)系统二级数据流图

基于协同过滤算法的旅游推荐系统设计与实现的二级数据流分析主要关注用户行为数据与景点信息的交互过程。在系统的登录模块和注册模块中,用户提供的基础信息(如账号、密码、邮箱等)通过验证后生成唯一标识符,并与用户的行为数据进行关联。登录后,系统将根据用户的历史操作(如浏览、收藏、评论等)收集的数据生成用户画像。这些数据通过协同过滤算法分析,识别与其他用户的相似性,进一步为用户推荐个性化的景点或旅游产品。推荐结果可以展示在“猜你喜欢”功能模块中,以吸引用户点击。

在“全部景点”模块与“最热景点”模块中,系统根据用户的兴趣和行为数据,结合景点的受欢迎程度与评分,进行数据筛选和排序。此外,城市分类功能模块利用协同过滤算法分析用户对特定城市景点的喜好,以个性化推荐相关景点。在“搜索功能模块”中,用户输入的关键词通过查询历史记录和相似用户的搜索行为,提供更精准的搜索建议。收藏模块的数据流也与推荐系统紧密关联,用户的收藏行为会作为推荐算法的依据之一,从而提升推荐结果的相关性和精度。系统二级数据流图如图2.6所示。

四、数据库表结构设计:

Yonghu表保存系统中的用户信息,包括主键、创建时间、用户账号、密码、用户姓名、头像、性别、联系方式、旅游偏好。id,设置为自动增长。如表3.1所示。

表3.1 yonghu(用户信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

yonghuzhanghao

varchar

200

用户账号

mima

varchar

200

密码

yonghuxingming

varchar

200

用户姓名

touxiang

longtext

头像

xingbie

varchar

200

性别

lianxifangshi

varchar

200

联系方式

jingdianleixing

varchar

200

旅游偏好

Users表保存系统中的管理员信息,包括主键、用户名、密码、头像、角色、新增时间。id,设置为自动增长,如表3.2所示。

表3.2 users(管理员信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

username

varchar

100

用户名

password

varchar

100

密码

image

varchar

200

头像

role

varchar

100

角色

addtime

timestamp

新增时间

Remenjingdian表保存系统中的热门景点信息,包括主键、创建时间、景点名称、图片、景点类型、等级、开放时间、门票价格、景点位置、景点介绍、赞、踩、最近点击时间、点击次数、评论数。id,设置为自动增长,如表3.3所示。

表3.3 remenjingdian(热门景点信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

jingdianmingcheng

varchar

200

景点名称

tupian

longtext

图片

jingdianleixing

varchar

200

景点类型

dengji

varchar

200

等级

kaifangshijian

varchar

200

开放时间

menpiaojiage

double

门票价格

jingdianweizhi

varchar

200

景点位置

jingdianjieshao

longtext

景点介绍

thumbsupnum

int

11

crazilynum

int

11

clicktime

datetime

最近点击时间

clicknum

int

11

点击次数

discussnum

int

11

评论数

News表保存系统中的公告信息,包括主键、创建时间、标题、简介、分类名称、发布人、头像、点击次数、最近点击时间、赞、踩、收藏数、图片、内容。id,设置为自动增长,如表3.4所示。

表3.4 news(公告信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

title

varchar

200

标题

introduction

longtext

简介

typename

varchar

200

分类名称

name

varchar

200

发布人

headportrait

longtext

头像

clicknum

int

11

点击次数

clicktime

datetime

最近点击时间

thumbsupnum

int

11

crazilynum

int

11

storeupnum

int

11

收藏数

picture

longtext

0

图片

content

longtext

0

内容

Messages表保存系统中的论坛信息,包括主键、创建时间、留言人id、用户名、头像、留言内容、留言图片、回复内容、回复图片。id 字段为主键,设置为自动增长,如表3.5所示。

表3.5 messgaes(论坛信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

userid

bigint

20

留言人id

username

varchar

200

用户名

avatarurl

longtext

头像

content

longtext

留言内容

cpicture

longtext

留言图片

reply

longtext

回复内容

rpicture

longtext

回复图片

Jingdianxinxi表保存系统中的景点信息,包括主键、创建时间、标题、图片、热度、地点、评分、评论、评论人、评论数、详情地址。id 字段为主键,设置为自动增长,如表3.6所示。

表3.6 jingdianxinxi(景点信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

title

longtext

标题

picture

longtext

图片

redu

double

热度

didian

longtext

地点

score

double

评分

pinglun

longtext

评论

pinglunren

varchar

200

评论人

pinglunshu

int

11

评论数

xqdz

longtext

详情地址

discussremenjingdian表保存系统中的用户评价与反馈信息,包括主键、创建时间、关联表id、用户id、头像、用户名、评论内容、评分、回复内容。id 字段为主键,设置为自动增长,如表3.7所示。

表3.7discussremenjingdian(用户评价与反馈信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

refid

bigint

20

关联表id

userid

bigint

20

用户id

avatarurl

longtext

头像

nickname

varchar

200

用户名

content

longtext

评论内容

score

double

评分

reply

longtext

回复内容

jingdianleixing表保存系统中的景点类型信息,包括主键、创建时间、景点类型、图片。id 字段为主键,设置为自动增长,如表3.8所示。

表3.8 jingdianleixing(景点类型信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

id

bigint

20

主键

addtime

timestamp

创建时间

jingdianleixing

varchar

200

景点类型

image

longtext

图片

recommendation_algorithm_parameter_info 表保存系统中的推荐算法参数信息,包括参数 ID、参数名称、参数值、生效时间。parameter_id 字段为主键,设置为自动增长,如表3.9所示。

表3.9 recommendation_algorithm_parameter(推荐算法参数信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

parameter_id

int

10

参数 ID,主键,自动增长

parameter_name

varchar

255

参数名称

parameter_value

varchar

255

参数值

effective_time

timestamp

生效时间

data_crawling_task_info 表保存系统中的数据爬取任务信息,包括任务 ID、爬取目标网站、爬取频率、爬取规则、爬取结果存储位置、任务状态。task_id 字段为主键,设置为自动增长,如表3.10所示。

表3.10 data_crawling_task(数据爬取任务信息)表

字段名称

字段类型

长度

默认值

是否允许为空

备注

task_id

int

10

任务 ID,主键,自动增长

crawling_target_website

varchar

255

爬取目标网站

crawling_frequency

varchar

50

爬取频率

crawling_rules

text

爬取规则

crawling_result_storage_location

varchar

255

爬取结果存储位置

task_status

varchar

50

任务状态

3.1.3数据库物理设计

数据库的物理设计主要关注如何选择合适的数据库管理系统(DBMS)来管理数据。本系统使用的是开源的 MySQL 数据库,部署在 Windows 操作系统上,且所有表格均使用支持事务处理的 InnoDB 存储引擎。具体设计细节如下:

1.存储结构

数据文件:MySQL 的数据文件通常存储在指定的数据目录中,数据文件的路径可以在数据库配置文件中进行设置。不同的存储引擎使用不同类型的数据文件,且不同版本的 MySQL 在数据文件命名上也有所不同。在本系统中,数据文件存放路径为:D:\MySQL\DATA。

日志文件:MySQL 的 binlog(二进制日志)用于记录所有内部的数据变更操作,如增、删、改等。本系统的日志文件也存储在:D:\MySQL\DATA。

2.存取方法:本系统通过建立索引(Index)来优化数据存取,索引可以对数据库中的列进行排序,从而提高数据库管理系统的整体性能,减少响应时间并加快查询速度。我们通过创建索引来提升系统的查询效率。

数据库索引表如表 3.11 所示。。

表3.11 数据库索引表

表名

索引名

字段名

索引类型

用户信息表

idx_user_id

用户 ID

普通索引

idx_yonghuzhanghao

用户账号

普通索引

idx_addtime

创建时间

普通索引

管理员信息表

idx_username

用户名

普通索引

idx_role

角色

普通索引

idx_addtime

新增时间

普通索引

热门景点信息表

idx_jingdianmingcheng

景点名称

普通索引

idx_jingdianleixing

景点类型

普通索引

idx_addtime

创建时间

普通索引

公告信息表

idx_title

标题

普通索引

idx_addtime

创建时间

普通索引

idx_typename

分类名称

普通索引

论坛信息表

idx_userid

留言人 ID

普通索引

idx_username

用户名

普通索引

idx_addtime

创建时间

普通索引

景点信息表

idx_title

标题

普通索引

idx_didian

地点

普通索引

idx_score

评分

普通索引

用户评价与反馈信息表

idx_refid

关联表 ID

普通索引

idx_userid

用户 ID

普通索引

idx_addtime

创建时间

普通索引

景点类型信息表

idx_jingdianleixing

景点类型

普通索引

idx_addtime

创建时间

普通索引

推荐算法参数信息表

idx_parameter_name

参数名称

普通索引

idx_parameter_id

参数 ID

普通索引

idx_effective_time

生效时间

普通索引

数据爬取任务信息表

idx_task_id

任务 ID

普通索引

idx_crawling_target_website

爬取目标网站

普通索引

idx_task_status

任务状态

普通索引

4.2  程序实现

根据系统设计的内容,对系统进行各种配置及实体层(POJO)、数据访问层(DAO)、业务层(Service)、控制层(Controller)、视图层(VUE)进行实现。

一、 环境配置

使用 PyCharm 作为开发工具,使用 Python 环境 构建一个 旅游信息推荐与可视化系统,并进行配置。配置相关文件并实现主程序启动。

配置数据库连接:

ini

# 数据库连接配置

[sql]

;support two sql,mysql and mssql,choice one

type = mysql

host = 127.0.0.1

port = 3306

user = root

passwd = 123456

db = djangos1q3c7g4

charset = utf8

hasHadoop=

[redis]

host = 127.0.0.1

port = 6379

passwd = 123456

二、 实体层

因篇幅限制,仅展示旅游推荐信息实体层实现代码:

class remenjingdian(BaseModel):

    __doc__ = u'''remenjingdian'''

    __tablename__ = 'remenjingdian'

    __authTables__={}

    __authPeople__=''#用户表,表属性loginUserColumn对应的值就是用户名字段,mima就是密码字段

    __sfsh__=''#sfsh(是否审核,”是”或”否”)字段和sfhf(审核回复)字段,后台列表(page)的操作中要多一个”审核”按钮,点击”审核”弹出一个页面,包含”是否审核”和”审核回复”,点击确定调用update接口,修改sfshsfhf两个字段。

    __authSeparate__=''#后台列表权限

    __thumbsUp__=''#表属性thumbsUp[/],新增thumbsupnum赞和crazilynum踩字段

    __intelRecom__=''#智能推荐功能(表属性:[intelRecom(是/否)],新增clicktime[前端不显示该字段]字段(调用info/detail接口的时候更新),按clicktime排序查询)

    __browseClick__=''#表属性[browseClick:/],点击字段(clicknum),调用info/detail接口的时候后端自动+1)、投票功能(表属性[vote:/],投票字段(votenum,调用vote接口后端votenum+1

    __foreEndListAuth__=''#前台列表权限foreEndListAuth[/];当foreEndListAuth=是,刷的表新增用户字段userid,前台list列表接口仅能查看自己的记录和add接口后台赋值userid的值

    __foreEndList__=''#表属性[foreEndList]前台list:和后台默认的list列表页相似,只是摆在前台,:指没有此页,:表示有此页(不需要登陆即可查看),前要登:表示有此页且需要登陆后才能查看

    __isAdmin__=''#表属性isAdmin=”是”,刷出来的用户表也是管理员,即pagelist可以查看所有人的考试记录(同时应用于其他表)

    addtime = models.DateTimeField(auto_now_add=False, verbose_name=u'创建时间')

    jingdianmingcheng=models.CharField ( max_length=255,null=False, unique=False, verbose_name='景点名称' )

    tupian=models.TextField   (  null=True, unique=False, verbose_name='图片' )

    jingdianleixing=models.CharField ( max_length=255, null=True, unique=False, verbose_name='景点类型' )

    dengji=models.CharField ( max_length=255, null=True, unique=False, verbose_name='等级' )

    kaifangshijian=models.CharField ( max_length=255, null=True, unique=False, verbose_name='开放时间' )

    menpiaojiage=models.FloatField   ( null=False, unique=False, verbose_name='门票价格' )

    jingdianweizhi=models.CharField ( max_length=255, null=True, unique=False, verbose_name='景点位置' )

    jingdianjieshao=models.TextField   (  null=True, unique=False, verbose_name='景点介绍' )

    thumbsupnum=models.IntegerField  (  null=True, unique=False,default='0', verbose_name='' )

    crazilynum=models.IntegerField  (  null=True, unique=False,default='0', verbose_name='' )

    clicktime=models.DateTimeField  (  null=True, unique=False, verbose_name='最近点击时间' )

    clicknum=models.IntegerField  (  null=True, unique=False,default='0', verbose_name='点击次数' )

    discussnum=models.IntegerField  (  null=True, unique=False,default='0', verbose_name='评论数' )

    '''

    jingdianmingcheng=VARCHAR

    tupian=Text

    jingdianleixing=VARCHAR

    dengji=VARCHAR

    kaifangshijian=VARCHAR

    menpiaojiage=Float

    jingdianweizhi=VARCHAR

    jingdianjieshao=Text

    thumbsupnum=Integer

    crazilynum=Integer

    clicktime=DateTime

    clicknum=Integer

    discussnum=Integer

    '''

    class Meta:

        db_table = 'remenjingdian'

        verbose_name = verbose_name_plural = '热门景点'

三、 数据访问层

from flask import Flask, jsonify

from datetime import datetime

from pydantic import BaseModel

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///recruitment.db'

db = SQLAlchemy(app)

class RecruitmentRecommendation(db.Model):

    __tablename__ ='recruitment_recommendation'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    user_id = db.Column(db.Integer, nullable=False)

    position_id = db.Column(db.Integer, nullable=False)

    recommendation_score = db.Column(db.Float, nullable=False)

    recommend_time = db.Column(db.DateTime, default=datetime.utcnow)

@app.route('/recruitment/<int:position_id>', methods=['DELETE'])

def delete_recruitment(position_id):

    """删除指定ID的旅游信息"""

    recruitment = RecruitmentRecommendation.query.get(position_id)

    if not recruitment:

        return jsonify({'message': 'Recruitment not found'}), 404

    db.session.delete(recruitment)

    db.session.commit()

    return jsonify({'message': 'Recruitment deleted successfully'})

@app.route('/recruitment/recommendations', methods=['GET'])

def get_recommended_recruitment():

    """获取推荐的旅游"""

    recommended_recruitment = RecruitmentRecommendation.query.all()

    if not recommended_recruitment:

        return jsonify({'message': 'No recommended recruitment found'}), 404

    recruitment_list = []

    for recruitment in recommended_recruitment:

        recruitment_data = {

            'id': recruitment.id,

            'user_id': recruitment.user_id,

            'position_id': recruitment.position_id,

           'recommendation_score': recruitment.recommendation_score,

           'recommend_time': recruitment.recommend_time.strftime('%Y-%m-%d %H:%M:%S')

        }

        recruitment_list.append(recruitment_data)

    return jsonify(recruitment_list)

if __name__ == '__main__':

    with app.app_context():

        db.create_all()

    app.run(debug=True)

四、 业务层

# 旅游数据服务

class recruitment_data(Service):

    def __init__(self, *config):

        """

        构造函数

        @param {Object} config 配置参数

        """

        if config:

            config_temp = config[0]

        else:

            config_temp = {

                # 操作的表

                "table": "recruitment_data",

                # 分页大小

                "size": 30,

                "page": 1,

            }

        super(recruitment_data , self).__init__(config_temp)    

五、 控制层

系统为前后端分离模式,后端控制层提供接口,前端访问接口获取数据或将数据提供给接口,前后端交互采用 JSON 作为数据传输格式。控制层实现了由旅游推荐信息分析试控制类,收藏信息控制类、旅游评论控制类、旅游分类控制类、旅游控制类、公告控制类、个性化旅游控制类、用户控制类、管理员控制类、轮播图控制类、文件上传控制类组成。

由于篇幅限制,本文围绕旅游推荐信息控制类展开,旅游推荐信息实现核心代码如下:

# 旅游数据

class recruitment_data(controllerClass):

    def __init__(self, config={}):

        """

        构造函数

        @param {Object} config 配置参数

        """

        config_init = {

            # 选择的模板那路径模板

            "tpl": "./recruitment_data/",

            # 选择的服务

            "service": "recruitment_data",

        }

        config_temp = config

        config_temp.update(config_init)

        super(recruitment_data , self).__init__(config_temp)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐