【纯干货分享】计算机毕业设计必看必学(基于Python爬虫的旅游大数据可视化分析推荐系统)原创的定制程序,java、PHP、python、C#小程序、文案全套、毕设程序定制/毕设成品等等.
随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域,大量基于大数据的广泛应用给生活带来了十分的便利。所以把旅游大数据可视化分析推荐系统的开发管理与现在网络相结合,利用计算机搭建旅游大数据可视化分析推荐系统,实现旅游大数据可视化分析推荐系统的信息化。则对于进一步提高旅游大数据可视化分析推荐系统管理发展,丰富旅游大数据可视化分析推荐系统管理经验能起到不少的促进作用。
Python的旅游大数据可视化分析推荐系统利用大数据技术,包括数据采集、数据清洗和数据可视化,对旅游市场进行全面深入的分析和可视化展示。通过Python爬虫技术,从各大旅游网站获取海量的旅游信息数据,并进行数据清洗和预处理,确保数据的准确性和一致。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了django框架和MySQL数据库技术搭建系统的整体架构。对系统进行相应的测试,测试系统有无存在问题以及测试用户权限来优化系统,最后系统达到预期目标。
关键词:旅游大数据可视化分析推荐系统;MySQL数据库;django框架;python语言;
Abstract
With the development of computer technology, the application of computer systems has extended to various fields of society, and the widespread use of big data has brought great convenience to life. So, combining the development and management of tourism big data visualization analysis recommendation system with the current network, using computers to build tourism big data visualization analysis recommendation system development, and realizing the informatization of tourism big data visualization analysis recommendation system development. It can play a significant role in further improving the development and management of tourism big data visualization analysis recommendation systems, and enriching the experience of development and management of tourism big data visualization analysis recommendation systems.
The Python tourism big data visualization analysis recommendation system utilizes big data technology, including data collection, data cleaning, and data visualization, to conduct comprehensive and in-depth analysis and visual display of the tourism market. By using Python web scraping technology, massive tourism information data is obtained from major tourism websites, and data cleaning and preprocessing are carried out to ensure accuracy and consistency of the data. Mainly targeting the design, description, implementation, analysis, and testing aspects of the system to demonstrate the development process. The overall architecture of the system was built using the django framework and MySQL database technology during development. Conduct corresponding tests on the system to identify any issues and test user permissions to optimize the system, ultimately achieving the expected goals.
Keywords :Tourism big data visualization analysis recommendation system; MySQL database; Django framework; Python language;
目 录
1 绪论
1.1研究目的和意义
在当前信息化、数据化的时代背景下,基于Python爬虫技术构建旅游大数据可视化分析推荐系统的研究具有显著的目的和意义。首先,通过Python爬虫程序可以高效、自动地采集海量的旅游行业相关数据,如景点介绍、旅游资讯等,为后续的深度分析和应用提供丰富的数据源。其次,对收集的旅游大数据进行深度挖掘和整理,运用先进的数据挖掘算法和可视化技术,将原本复杂难懂的原始数据转化为直观易懂的图表和图形,以揭示旅游市场的运行规律、热点分布、游客偏好等深层次信息,为政府管理部门、旅游企业提供决策支持,有效指导旅游产品设计、市场推广策略和资源配置优化。
此外,基于Python爬虫抓取的旅游大数据,研究并构建旅游推荐系统,能够根据用户的个性化需求和历史行为数据,为其提供精准、个性化的旅游路线推荐、目的地选择建议以及其他旅游服务,显著提升用户旅游体验和满意度。通过该系统的开发与应用,有助于推动旅游行业向智慧旅游、个性化服务方向转型,促进旅游业的持续健康发展。同时,此研究也为大数据技术在旅游领域的应用提供了新的实践范例,对于进一步提升我国旅游信息化服务水平具有重要意义。
1.2国内外研究现状
在国外,由于旅游业的快速发展和互联网技术的广泛应用,旅游大数据的采集、处理、分析及应用已经取得了显著的成果。其可视化分析推荐系统不仅具备强大的数据处理能力,能够实时展示海量旅游数据,还通过深度学习和数据挖掘技术,对游客行为、偏好等进行分析,为游客提供个性化的旅游推荐服务。这些系统不仅提升了游客的旅游体验,也为旅游企业提供了精准的市场分析和决策支持。
相比之下,国内在旅游大数据可视化分析推荐系统方面的研究虽起步较晚,但发展势头强劲。借助国家大数据战略的推动和互联网技术的快速发展,国内研究团队在数据采集、存储、处理和分析等方面取得了显著进展。同时,国内的研究还注重与旅游业务场景的深度融合,将可视化分析推荐系统应用于旅游线路规划、景点介绍管理等多个环节,为旅游行业提供了更加智能化、精细化的服务。
随着技术的不断进步和应用场景的不断拓展,旅游大数据可视化分析推荐系统将在未来发挥更加重要的作用。它将进一步推动旅游行业的数字化转型,提升旅游服务的智能化水平,为游客提供更加便捷、个性化的旅游体验。同时,它也将为旅游企业提供更加精准的市场分析和决策支持,推动旅游行业的创新与发展。
1.3 论文结构与章节安排
论文将分层次经行编排,除去论文摘要致谢文献参考部分,正文部分还会对网站需求做出分析,以及阐述大体的设计和实现的功能,最后罗列部分调测记录,论文主要架构如下:
第一章:引言。第一章主要介绍了课题研究的背景,研究意义和本文的主要工作。
第二章:系统需求分析。第二章主要从系统的用户、功能等方面进行需求分析。
第三章:系统设计。第三章主要对系统框架、系统功能模块、数据库进行功能设计。
第四章:系统实现。第四章主要介绍了系统框架搭建、系统界面的实现。
第五章:系统测试。第五章主要对系统的部分界面进行测试并对主要功能进行测试
第六章:总结。
2 旅游大数据可视化分析推荐系统系统分析
2.1 可行性分析
可行性分析是系统分析的第一步,通过可行性分析我们可以得出系统是不是值得开发,如果系统的开发是不可信的,那么就没有必要再进行下面的操作,对于本旅游大数据可视化分析推荐系统,在可行性方面进行了技术、经济以及操作的分析。
2.1.1 技术可行性分析
Python的旅游大数据可视化分析推荐系统具备较高的技术可行性。Python提供了丰富的工具、库和框架,支持数据采集、清洗、处理、分析和可视化等多个关键步骤。同时,Python社区的活跃和开源资源的丰富也为项目的开发和应用提供了有力的支持。本系统采用的技术方案是基于python语言,django框架,MYSQL数据库,在大学的学习中这两门课程都已经学过,而且自己也用这些技术开发过小的项目,在平时的课程设计以及作业也经常用到python和MYSQL,在技术上实现自己的自主开发是可行的。
2.1.2 经济可行性分析
开发旅游大数据可视化分析推荐系统并不需要投入太多,开发工具、服务器、数据库等,都可以通过网络搜索、下载、安装,只需要一台普通的计算机就可以完成操作,而且在系统功能规划上通过走访调查目前用户对旅游大数据可视化分析推荐系统的需求,了解它们对系统具体实现的功能需求,然后进行设计开发,不存在任何开销,因此系统的开发在经济方面是可行的。
2.1.3 操作可行性分析
操作方面主要考虑的是用户在使用以及管理人员在管理的时候,是否简单可行,没有任何计算机基础的用户能否使用,开发的旅游大数据可视化分析推荐系统在设计的时候秉承简单易学的理念,在用户进入系统后都会有固定的导航按钮,只要认字就可以操作完成,而且管理员在管理方面也只需简单的增删改查即可完成,因此在操作上也是可行的。
2.2 系统性能分析
系统的性能方面主要是从系统的安全性、存储性、可靠性、易学性、稳定性等方面进行分析:
(1)安全性:系统应具备良好的安全性,确保用户数据和敏感信息的保密性。采用合适的安全措施,如数据加密、访问控制等,防止未经授权的访问和数据泄露。
(2)存储性:系统需要具备足够的存储容量,能够存储大量的旅游景点数据和相关信息。同时,系统的数据库设计应优化存储结构和查询效率,提高数据读取和写入的性能。
(3)可靠性:系统应具备高度可靠性,能够稳定运行并处理大量的并发请求。通过采用负载均衡、备份和容灾等机制,提高系统的可用性和容错性,避免单点故障导致系统崩溃或数据丢失。
(4)易学性:系统的界面设计应简洁直观,操作流程易于理解和掌握。提供清晰的操作指南和帮助文档,减少用户学习成本,并提供良好的用户体验。
(5)稳定性:系统应具备稳定的性能,能够在长时间运行过程中保持高效和稳定。通过性能监控和故障排查等手段,及时发现和解决系统性能问题,保证系统的稳定运行。
2.3 系统功能分析
旅游大数据可视化分析推荐系统中采用了python的django框架进行开发,在数据库上选择MYSQL,在功能上旅游大数据可视化分析推荐系统我划分为了普通用户管理模块和管理员模块这两大部分。
普通用户管理模块:
(1)用户注册登录:游客可以随时进入到系统中,对系统中的信息浏览,但是想要实现酒店信息的收藏评论等,就必须有这个系统的账号,如果没有账号的话,可以注册成用户进行相关的操作,同时用户还可以对个人信息以及操作的信息进行管控。
(2)旅游资讯:用户点击“旅游资讯”菜单显示所有的旅游资讯信息,可以按照条件进行旅游资讯的筛选或者输入关键词进行局部搜索,点击可以进入旅游资讯详细展示界面,在此界面用户可以收藏、点赞和评论。
(3)通知公告:用户点击“通知公告”菜单显示管理员在后台发布的所有的通知公告信息,可以查看通知公告详情。
(4)景点信息:用户点击“景点信息”菜单可以查看所有景点信息,可以按照条件查看景点信息,或者输入关键词进行查询,点击可以进入景点信息详细展示界面,在此界面用户可以收藏、点赞和评论,用户点击了景点信息后系统会根据点击类型推荐。
(5)我的账户:用户点击“我的”可以对个人资料以及密码进行更新。
管理员管理模块:
(1)登录:管理员在后台可以输入用户名+密码进行登录,管理员的用户名和密码是在数据库中直接设定好的。
(2)后台首页:管理员在此页面可以页面的数据信息统计、攻略分析统计、点评分析统计管理统计网站的数据情况,统计图根据模块数据统计。
(3)系统用户:管理员点击“系统用户”菜单可以对系统中存在的用户进行管理,包含了管理员用户和普通用户。
(4)景点分类管理:管理员对景点分类管理列表进行管控。
(5)系统管理:管理员点击“系统管理”菜单可以对首页展示的轮播图进行增删改查。
(6)资源管理:管理员点击“资源管理”菜单能够对其下子菜单旅游资讯、资讯分类进行增删改查。
2.4 系统用例分析
系统的用例展示的是系统功能与用户之间的关系,通过用例的方式能够直观的展示出来,本旅游大数据可视化分析推荐系统的完整UML用例图分别是图2-1、图2-2。

图2-1 旅游大数据可视化分析推荐系统前台用户角色用例图

3 旅游大数据可视化分析推荐系统总体设计
本章主要讨论的内容包括旅游大数据可视化分析推荐系统的功能模块设计、数据库系统设计。
3.1 系统功能模块设计
3.1.1整体功能模块设计
本旅游大数据可视化分析推荐系统是一个集信息查询、发布、管理为一体的平台,在功能上实现了前台和后台两部分的功能,根据第三章的系统功能分析,得出本旅游大数据可视化分析推荐系统的功能模块图,如图3-1所示。

图3-1 旅游大数据可视化分析推荐系统功能模块图
3.1.2用户管理模块设计
本旅游大数据可视化分析推荐系统是一个通过浏览器自主查询、交流的平台,用户想要参与进来,必须有账号和密码,登录后方可交流,管理员则实现对用户的管控,如下图:

图3-2用户管理模块结构图
3.1.3旅游资讯模块设计
旅游大数据可视化分析推荐系统是一个交流性质的公开平台,用户用户可以在平台上交流,增加用户之间的互动性。但是同时也为了更好的规范评论的内容,给予管理员删除不合适的言论的功能,所以需要专门设计一个评论管理模块,具体的结构图如下:

图3-3评论管理模块结构图
3.1.4旅游资讯管理模块设计
旅游大数据可视化分析推荐系统是中需要存储不少旅游信息,其模块功能结构,具体的结构图如下:

图3-4旅游信息模块结构图
3.2 数据库设计
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。
3.2.1 数据库概念结构设计
下面是整个旅游大数据可视化分析推荐系统中主要的数据库表总E-R实体关系图。

图3-6 旅游大数据可视化分析推荐系统总E-R关系图
3.2.2 数据库逻辑结构设计
通过上一小节中旅游大数据可视化分析推荐系统中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | token_id | int | 10 | 0 | N | Y | 临时访问牌ID | |
| 2 | token | varchar | 64 | 0 | Y | N | 临时访问牌 | |
| 3 | info | text | 65535 | 0 | Y | N | ||
| 4 | maxage | int | 10 | 0 | N | N | 2 | 最大寿命:默认2小时 |
| 5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 7 | user_id | int | 10 | 0 | N | N | 0 | 用户编号: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | article_id | mediumint | 8 | 0 | N | Y | 文章id:[0,8388607] | |
| 2 | title | varchar | 125 | 0 | N | Y | 标题:[0,125]用于文章和html的title标签中 | |
| 3 | type | varchar | 64 | 0 | N | N | 0 | 文章分类:[0,1000]用来搜索指定类型的文章 |
| 4 | hits | int | 10 | 0 | N | N | 0 | 点击数:[0,1000000000]访问这篇文章的人次 |
| 5 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 6 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 7 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 8 | source | varchar | 255 | 0 | Y | N | 来源:[0,255]文章的出处 | |
| 9 | url | varchar | 255 | 0 | Y | N | 来源地址:[0,255]用于跳转到发布该文章的网站 | |
| 10 | tag | varchar | 255 | 0 | Y | N | 标签:[0,255]用于标注文章所属相关内容,多个标签用空格隔开 | |
| 11 | content | longtext | 2147483647 | 0 | Y | N | 正文:文章的主体内容 | |
| 12 | img | varchar | 255 | 0 | Y | N | 封面图 | |
| 13 | description | text | 65535 | 0 | Y | N | 文章描述 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | type_id | smallint | 5 | 0 | N | Y | 分类ID:[0,10000] | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000]决定分类显示的先后顺序 |
| 3 | name | varchar | 16 | 0 | N | N | 分类名称:[2,16] | |
| 4 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
| 5 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该分类的作用 | |
| 6 | icon | text | 65535 | 0 | Y | N | 分类图标: | |
| 7 | url | varchar | 255 | 0 | Y | N | 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 | |
| 8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表attraction_information (景点信息)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | attraction_information_id | int | 10 | 0 | N | Y | 景点信息ID | |
| 2 | attraction_name | varchar | 64 | 0 | Y | N | 景点名称 | |
| 3 | classification_of_tourist_attractions | varchar | 64 | 0 | Y | N | 景点分类 | |
| 4 | strategy_quantity | varchar | 64 | 0 | Y | N | 攻略数量 | |
| 5 | number_of_comments | varchar | 64 | 0 | Y | N | 评论数量 | |
| 6 | the_proportion_of_donkey_friends | varchar | 64 | 0 | Y | N | 驴友占比 | |
| 7 | scenic_spot_ranking | varchar | 64 | 0 | Y | N | 景点排名 | |
| 8 | description_of_attractions | text | 65535 | 0 | Y | N | 景点描述 | |
| 9 | scenic_spot_rating | varchar | 64 | 0 | Y | N | 景点评分 | |
| 10 | scenic_spot_pictures | varchar | 255 | 0 | Y | N | 景点图片 | |
| 11 | scenic_spot_details | varchar | 255 | 0 | Y | N | 景点详情 | |
| 12 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
| 13 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 14 | recommend | int | 10 | 0 | N | N | 0 | 智能推荐 |
| 15 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 16 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | auth_id | int | 10 | 0 | N | Y | 授权ID: | |
| 2 | user_group | varchar | 64 | 0 | Y | N | 用户组: | |
| 3 | mod_name | varchar | 64 | 0 | Y | N | 模块名: | |
| 4 | table_name | varchar | 64 | 0 | Y | N | 表名: | |
| 5 | page_title | varchar | 255 | 0 | Y | N | 页面标题: | |
| 6 | path | varchar | 255 | 0 | Y | N | 路由路径: | |
| 7 | position | varchar | 32 | 0 | Y | N | 位置: | |
| 8 | mode | varchar | 32 | 0 | N | N | _blank | 跳转方式: |
| 9 | add | tinyint | 3 | 0 | N | N | 1 | 是否可增加: |
| 10 | del | tinyint | 3 | 0 | N | N | 1 | 是否可删除: |
| 11 | set | tinyint | 3 | 0 | N | N | 1 | 是否可修改: |
| 12 | get | tinyint | 3 | 0 | N | N | 1 | 是否可查看: |
| 13 | field_add | text | 65535 | 0 | Y | N | 添加字段: | |
| 14 | field_set | text | 65535 | 0 | Y | N | 修改字段: | |
| 15 | field_get | text | 65535 | 0 | Y | N | 查询字段: | |
| 16 | table_nav_name | varchar | 500 | 0 | Y | N | 跨表导航名称: | |
| 17 | table_nav | varchar | 500 | 0 | Y | N | 跨表导航: | |
| 18 | option | text | 65535 | 0 | Y | N | 配置: | |
| 19 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 20 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表classification_of_tourist_attractions (景点分类)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | classification_of_tourist_attractions_id | int | 10 | 0 | N | Y | 景点分类ID | |
| 2 | classification_of_tourist_attractions | varchar | 64 | 0 | Y | N | 景点分类 | |
| 3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | collect_id | int | 10 | 0 | N | Y | 收藏ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 收藏人ID: |
| 3 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 4 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 5 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 6 | title | varchar | 255 | 0 | Y | N | 标题: | |
| 7 | img | varchar | 255 | 0 | Y | N | 封面: | |
| 8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | comment_id | int | 10 | 0 | N | Y | 评论ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 评论人ID: |
| 3 | reply_to_id | int | 10 | 0 | N | N | 0 | 回复评论ID:空为0 |
| 4 | content | longtext | 2147483647 | 0 | Y | N | 内容: | |
| 5 | nickname | varchar | 255 | 0 | Y | N | 昵称: | |
| 6 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 9 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 10 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 11 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | data_information_id | int | 10 | 0 | N | Y | 数据信息ID | |
| 2 | attraction_name | varchar | 64 | 0 | Y | N | 景点名称 | |
| 3 | strategy_quantity | varchar | 64 | 0 | Y | N | 攻略数量 | |
| 4 | number_of_comments | varchar | 64 | 0 | Y | N | 评论数量 | |
| 5 | the_proportion_of_donkey_friends | varchar | 64 | 0 | Y | N | 驴友占比 | |
| 6 | scenic_spot_ranking | varchar | 64 | 0 | Y | N | 景点排名 | |
| 7 | description_of_attractions | text | 65535 | 0 | Y | N | 景点描述 | |
| 8 | scenic_spot_rating | varchar | 64 | 0 | Y | N | 景点评分 | |
| 9 | scenic_spot_pictures | varchar | 255 | 0 | Y | N | 景点图片 | |
| 10 | scenic_spot_details | varchar | 255 | 0 | Y | N | 景点详情 | |
| 11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | hits_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | notice_id | mediumint | 8 | 0 | N | Y | 公告id: | |
| 2 | title | varchar | 125 | 0 | N | N | 标题: | |
| 3 | content | longtext | 2147483647 | 0 | Y | N | 正文: | |
| 4 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 5 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | praise_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | status | bit | 1 | 0 | N | N | 1 | 点赞状态:1为点赞,0已取消 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | regular_users_id | int | 10 | 0 | N | Y | 普通用户ID | |
| 2 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 3 | user_gender | varchar | 64 | 0 | Y | N | 用户性别 | |
| 4 | contact_phone_number | varchar | 16 | 0 | Y | N | 联系电话 | |
| 5 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
| 6 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
| 7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | slides_id | int | 10 | 0 | N | Y | 轮播图ID: | |
| 2 | title | varchar | 64 | 0 | Y | N | 标题: | |
| 3 | content | varchar | 255 | 0 | Y | N | 内容: | |
| 4 | url | varchar | 255 | 0 | Y | N | 链接: | |
| 5 | img | varchar | 255 | 0 | Y | N | 轮播图: | |
| 6 | hits | int | 10 | 0 | N | N | 0 | 点击量: |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表upload (文件上传)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | upload_id | int | 10 | 0 | N | Y | 上传ID | |
| 2 | name | varchar | 64 | 0 | Y | N | 文件名 | |
| 3 | path | varchar | 255 | 0 | Y | N | 访问路径 | |
| 4 | file | varchar | 255 | 0 | Y | N | 文件路径 | |
| 5 | display | varchar | 255 | 0 | Y | N | 显示顺序 | |
| 6 | father_id | int | 10 | 0 | Y | N | 0 | 父级ID |
| 7 | dir | varchar | 255 | 0 | Y | N | 文件夹 | |
| 8 | type | varchar | 32 | 0 | Y | N | 文件类型 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | user_id | mediumint | 8 | 0 | N | Y | 用户ID:[0,8388607]用户获取其他与用户相关的数据 | |
| 2 | state | smallint | 5 | 0 | N | N | 1 | 账户状态:[0,10](1可用|2异常|3已冻结|4已注销) |
| 3 | user_group | varchar | 32 | 0 | Y | N | 所在用户组:[0,32767]决定用户身份和权限 | |
| 4 | login_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 上次登录时间: |
| 5 | phone | varchar | 11 | 0 | Y | N | 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时 | |
| 6 | phone_state | smallint | 5 | 0 | N | N | 0 | 手机认证:[0,1](0未认证|1审核中|2已认证) |
| 7 | username | varchar | 16 | 0 | N | N | 用户名:[0,16]用户登录时所用的账户名称 | |
| 8 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
| 9 | password | varchar | 64 | 0 | N | N | 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成 | |
| 10 | | varchar | 64 | 0 | Y | N | 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时 | |
| 11 | email_state | smallint | 5 | 0 | N | N | 0 | 邮箱认证:[0,1](0未认证|1审核中|2已认证) |
| 12 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 13 | open_id | varchar | 255 | 0 | Y | N | 针对获取用户信息字段 | |
| 14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 15 | vip_level | varchar | 255 | 0 | Y | N | 会员等级 | |
| 16 | vip_discount | double | 11 | 2 | Y | N | 0.00 | 会员折扣 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | group_id | mediumint | 8 | 0 | N | Y | 用户组ID:[0,8388607] | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000] |
| 3 | name | varchar | 16 | 0 | N | N | 名称:[0,16] | |
| 4 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该用户组的特点或权限范围 | |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | register | smallint | 5 | 0 | Y | N | 0 | 注册位置: |
| 9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
4 旅游大数据可视化分析推荐系统详细设计与实现
4.1用户功能模块
4.1.1 首页界面
当进入旅游大数据可视化分析推荐系统的时候,可以看到系统中的导航栏,搜索框,轮播图等信息,其主界面展示如下图4-1所示。

图4-1 首页界面图
4.1.2 用户注册界面
游客可以随时进入到系统中,对系统中的信息浏览,但是想要实现收藏、评论等,就必须有这个系统的账号,如果没有账号的话,可以注册成用户进行相关的操作。其用用户注册界面展示如下图4-2所示。

图4-2 用户注册界面图
注册关键代码如下:
def Register(self, ctx):
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
if "username" not in body and body["username"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名不能为空",
}
}, ensure_ascii=False))
if "user_group" not in body and body["user_group"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}, ensure_ascii=False))
if "password" not in body and body["password"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "密码不能为空",
}
}, ensure_ascii=False))
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名已存在",
}
}, ensure_ascii=False))
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
4.1.3 用户登录界面
当用户注册完成后就可以登录了,输入用户名+密码,点击“登录”按钮进行登录,登录界面如下图4-3所示。

图4-3登录界面图
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']}, {"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
if obj["state"] == 1:
if obj["password"] == password:
timeout = timezone.now()
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
ctx.request.session[token] = obj["user_id"]
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
4.1.4 旅游资讯详情界面
用户点击“旅游资讯”菜单显示所有的旅游资讯信息,可以按照条件进行旅游资讯的筛选或者输入关键词进行局部搜索,点击可以进入旅游资讯详细展示界面,在此界面用户可以收藏、点赞和评论。界面如图4-4所示。

图4-4旅游资讯详情界面图
4.1.5景点信息详情界面
用户点击“景点信息”菜单可以查看所有景点信息,可以按照条件查看景点信息,或者输入关键词进行查询,点击可以进入景点信息详细展示界面,在此界面用户可以收藏、点赞和评论,用户点击了景点信息后系统会根据点击类型推荐。界面如下图4-5所示。

图4-5景点信息详情界面图
4.2管理员功能模块
4.2.1个人信息管理界面
管理员点击“个人信息管理”这一菜单会显示所以相关信息,管理员可以对个人信息信息进行增删改查操作。界面如下图4-6所示。

图4-6个人信息管理界面图
个人信息管理关键代码如下:
def Add(self, ctx):
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
result = self.service.Add(body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
4.2.2 系统用户管理界面
管理员点击“系统用户”这一菜单会显示管理员和普通用户这两个子菜单,管理员可以对这两个角色的信息进行增删改查操作。界面如下图4-7所示。

图4-7系统用户界面图
系统用户关键代码如下:
def Del(self, ctx):
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
4.2.3大数据可视化分析统计界面
管理员可以在此页面可以看到攻略数量、景点评分、景点分类、评论数量、攻略评论占比等信息。界面如下图4-8所示。

图4-8数据可视化分析统计界面图
数据可视化分析管理关键代码如下:
def Set(self, ctx):
error = self.Set_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("set_before", ctx, None)
if error["code"]:
return {"error": error}
query = ctx.query
if 'page' in query.keys():
del ctx.query['page']
if 'size' in query.keys():
del ctx.query['size']
if 'orderby' in query.keys():
del ctx.query['orderby']
result = self.service.Set(ctx.query, ctx.body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Set_after(ctx, result)
if res:
result = res
res = self.Events("set_after", ctx, result)
if res:
result = res
return {"result": result}
4.2.4 系统管理界面
管理员点击“系统管理”菜单可以对首页展示的轮播图进行增删改查。界面如下图4-9所示。

图4-9系统管理界面图
系统管理关键代码如下:
def Get_list(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
if "page" in query:
config_plus["page"] = query.pop("page")
if "size" in query:
config_plus["size"] = query.pop("size")
if "orderby" in query:
config_plus["orderby"] = query.pop("orderby")
if "like" in query:
config_plus["like"] = query.pop("like")
if "groupby" in query:
config_plus["groupby"] = query.pop("groupby")
count = self.service.Count(query)
lst = []
if self.service.error:
return {"error": self.service.error}
elif count:
lst = self.service.Get_list(query,
obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
self.interact_list(ctx, lst)
return {"result": {"list": lst, "count": count}}
5系统测试
5.1 测试目的
系统测试的目的就是为了找错,从开发好的系统当中通过各种手段、方法进行找错,看看系统是不是存在乱码的现象,是不是用户功能混乱,通过各种纠错,保证系统能够正常的运行,在测试中我们通过采用的是黑盒测试和白盒测试两种测试方法,通过黑盒测试,我们可以了解系统各项功能是不是能够实现,界面是不是美观,操作是不是方便,通过白盒测试,我们可以了解到某一条的具体编程代码是不是运行路径正确,能不能达到预期,从错误中不断完善,想尽一切办法找到系统中存在的错误,然后找到出错的具体原因,然后对系统进行修改,达到我们所要实现的功能,进而提高了系统的各种性能(安全性、可靠性、稳定性等)。
系统测试不是程序开发完以后才开始的,他贯穿了开发的整个过程,在开发的过程中我们都会对实现的代码进行一点一点的测试,从而完成系统,再对系统进行整体测试,保证每个用户在使用的时候都能做到系统运行流程,满足信息增删改查等主要功能。
5.2 系统测试用例
表5.1 登录模块功能测试表
| 测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
| 登录模块测试 | 登录成功的情况 | 管理员可以通过浏览器进入到旅游大数据可视化分析推荐系统后台的登录界面,输入用户名:admin和密码admin后,点击“登录”按钮。 | 成功登录到管理员管理的界面 | 正确 |
| 登录模块测试 | 登录失败的情况 | 管理员可以通过浏览器进入到旅游大数据可视化分析推荐系统的后台登录界面,输入用户名:admin和密码111后,点击“登录”按钮。 | 系统提示“用户名和密码不匹配” | 正确 |
旅游资讯信息添加功能测试:
表5.2 旅游资讯信息添加功能测试表
| 测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
| 旅游资讯添加模块测试 | 旅游资讯添加成功的情况 | 在“资源管理”菜单中选择“旅游资讯”点击 “新增”,输入旅游资讯相关信息,输入正确的信息后,点击“提交”按钮。 | 提示添加成功 | 正确 |
| 旅游资讯添加模块测试 | 旅游资讯添加失败的情况 | 在“资源管理”菜单中选择“旅游资讯”点击 “新增”,不输入新闻标题,其他信息正常填写后,点击“提交”按钮。 | 提示“添加失败,新闻标题不能为空” | 正确 |
查看景点分类管理功能模块测试:
表5.3 查看景点分类管理功能测试表
| 测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
| 查看景点分类管理功能测试 | 景点分类管理显示成功的情况 | 用户在首页点击“景点分类管理”进入景点分类管理,任性一条景点分类管理,查看详情 | 视频显示成功 | 正确 |
数据信息添加功能测试:
表5.4 数据信息添加功能测试表
| 测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
| 数据信息添加模块测试 | 数据信息添加成功的情况 | 在“数据信息管理”菜单中选择“数据信息添加”,输入数据信息相关信息,输入正确的信息后,点击“提交”按钮。 | 提示添加成功 | 正确 |
| 数据信息添加模块测试 | 数据信息添加失败的情况 | 在“数据信息管理”菜单中选择“数据信息添加”,不输入景点名称,其他信息正常填写后,点击“提交”按钮。 | 提示“添加失败,景点名称不能为空” | 正确 |
5.3 系统测试结果
通过编写旅游大数据可视化分析推荐系统的测试用例,已经检测完毕登录、旅游资讯添加、景点分类管理查看、数据信息添加,通过这4大模块为旅游大数据可视化分析推荐系统的后期推广运营提供了强力的技术支撑。
结论
至此,旅游大数据可视化分析推荐系统已经结束,在开发前做了许多的准备,在本系统的设计和开发过程中阅览和学习了许多文献资料,从中我也收获了很多宝贵的方法和设计思路,对系统的开发也起到了很重要的作用,系统的开发技术选用的都是自己比较熟悉的,比如Python、Django技术、MYSQL,这些技术都是在以前的学习中学到了,其中许多的设计思路和方法都是在以前不断地学习中摸索出来的经验,其实对于我们来说工作量还是比较大的,但是正是由于之前的积累与准备,才能顺利的完成这个项目,由此看来,积累经验跟做好准备是十分重要的事情。
当然在该系统的设计与实现的过程中也离不开老师以及同学们的帮助,正是因为他们的指导与帮助,我才能够成功的在预期内完成了这个系统。同时在这个过程当中我也收获了很多东西,此系统也有需要改进的地方,但是由于专业知识的浅薄,并不能做到十分完美,希望以后有机会可以让其真正的投入到使用之中。
参考文献
[1]侯跃伟,刘孝峰,杜存鹏. 定点形变数据可视化分析系统的研制及应用 [J]. 地震地磁观测与研究, 2023, 44 (06): 154-162.
[2]魏晓玲,刘红英. 基于Python和Django框架的琴房管理系统设计与实现 [J]. 无线互联科技, 2023, 20 (22): 51-53.
[3]姜永成. 基于Django的网络招聘数据可视化分析系统的设计与实现 [J]. 科技资讯, 2023, 21 (19): 57-60. DOI:10.16661/j.cnki.1672-3791.2306-5042-4316.
[4]白富强. 基于B/S架构的收割机轨迹数据可视化分析系统 [J]. 南方农机, 2023, 54 (17): 173-175.
[5]陈俊生,彭莉芬. 基于Hadoop的课程诊改大数据可视化分析研究与应用 [J]. 天津中德应用技术大学学报, 2023, (03): 53-58. DOI:10.16350/j.cnki.cn12-1442/g4.2023.03.001.
[6]王静,蒋萌. 基于数据挖掘的校园大数据可视化分析系统设计 [J]. 自动化与仪器仪表, 2023, (04): 106-111+116. DOI:10.14016/j.cnki.1001-9227.2023.04.106.
[7]Xiya Y ,Xianhe L ,Changping W , et al. Design and Deployment of Django-based Housing Information Management System [J]. Journal of Physics: Conference Series, 2023, 2425 (1):
[8]陈挺,徐胜捷,陈龙,等. 中文专利数据可视化分析系统研究与设计 [J]. 计算机应用与软件, 2023, 40 (01): 24-29.
[9]程传旭,乐万德. 基于特征提取和机器学习的电商数据可视化分析系统设计 [J]. 自动化与仪器仪表, 2022, (11): 146-150. DOI:10.14016/j.cnki.1001-9227.2022.11.146.
[10]邱凯. 基于Hadoop平台的大数据可视化分析实现与应用 [J]. 电子技术与软件工程, 2022, (19): 184-187.
[11]田肖,杨帅鹏,贾会梅,等. 基于大数据的智能数据采集及可视化分析系统设计与研究 [J]. 电子测试, 2022, (16): 64-65+76. DOI:10.16520/j.cnki.1000-8519.2022.16.003.
[12]李林国,查君琪,赵超,等. 基于Hadoop平台的大数据可视化分析实现与应用 [J]. 西安文理学院学报(自然科学版), 2022, 25 (03): 53-58.
[13]黄锦帆,梁少华,张佳. 招聘数据可视化分析系统的设计与实现 [J]. 电脑知识与技术, 2022, 18 (18): 39-41. DOI:10.14004/j.cnki.ckt.2022.1189.
[14]陈文青. 新型基于大数据分析与挖掘的战略决策框架 [J]. 无线电工程, 2022, 52 (05): 824-832.
[15]Ricardo A . Revenge/Porn: Django Unchained, Terence's Eunuchus, and the Role of Roman Slavery in the American Imagination [J]. Arion: A Journal of the Humanities and the Classics, 2022, 23 (1): 91-114.
[16]Chao H L ,Fa S S . Construction of College Students’ Physical Health Data Sharing System Based on Django Framework [J]. Journal of Sensors, 2021, 2021
[17]B S L . Placing Django: Narratives of heritage and race in a Parisian exhibition [J]. French Cultural Studies, 2021, 32 (4): 315-329.
[18]Kruthika A ,Uday R K ,Narendra C B . Document Parsing Tool for Language Translation and Web Crawling using Django REST Framework [J]. Journal of Physics: Conference Series, 2021, 1962 (1):
[19]Costa J . The cultural policies of a popular music venue: the case of Strasbourg's Espace Django [J]. Arts and the Market, 2021, 11 (2): 123-135.
[20]季杰,陈强仁,朱东. 基于互联网大数据的招聘智能分析平台的设计和实现 [J]. 内江科技, 2020, 41 (05): 47-48.
致 谢
“时光荏苒,岁月如梭”,四年的大学生涯在这里即将结束,我也即将离开我的母校,踏入社会,在这离开之际,借此机会,我首选要感谢的就是我的老师们,在这四年的学习、生活中,他们给了我很多的帮助,在我消极的时候鼓励我,帮助我走出困境,学习遇到困难的时候,每位老师都孜孜不倦;其次我要感谢我的指导老师,在开发本旅游大数据可视化分析推荐系统的时候遇到了很多困难,比如前期调查不仔细,功能模块设计的有问题,导师通过细心的沟通、讲解,慢慢让我对系统有了更进一步的了解,在系统开发框架的选择上,导师给我推荐了django,让我在系统的设计上更加省力,在这期间我对这两个框架还不够熟悉,都是导师耐心的讲解、指导,无论多晚,导师有多忙,总是第一时间为我答疑解惑,可以说没有导师的帮助,我是没有办法完成这个旅游大数据可视化分析推荐系统的,在这里我还要感谢我的同学们,他们无论在学习还是在生活中都给予了我很大的帮助,我相信我们的友谊会天长地久。
最后向所有关心我、帮助我的老师及同学们表示衷心的感谢!祝愿我的母校越来越辉煌,祝愿老师们桃李满天下,祝愿同学们前程似锦!
整理归纳不易,点击「分享」和「在看」让更多有需要的人看到,谢谢!
免费领取项目源码,请关注❥点赞收藏并私信博主,谢谢
更多推荐

所有评论(0)