摘 要
随着大数据时代的来临,数据分析和挖掘成为了各行各业决策和优化的关键。这项基于Spark的汽车销售数据分析项目旨在利用Spark的分布式计算能力和Vue前端框架,实现对大规模汽车销售数据的全面分析。首先,通过爬取各大汽车销售网站的数据,包括销售数量、价格、车型、地区等多维度信息,建立完整的数据集。随后,利用Spark进行数据清洗,包括去重、缺失值处理、异常值检测等,确保数据质量和准确性。接着,利用Spark进行数据处理和分析,探索不同地区、车型的销售趋势和关联性,发现潜在的市场机会和挑战。同时,结合Vue前端框架实现数据可视化展示,包括生成各类图表、报表等形式,使复杂的数据分析结果以直观方式展现给用户,帮助决策者更好地理解数据。此外,项目还支持功能如列表展示、添加数据、查看详情、查询、重置筛选条件、导出数据、删除记录、下载导入文档、数据导入等操作。通过销售排名、汽车名称、汽车品牌等关键指标进行搜索和筛选,进一步提升用户体验和数据分析效率。整个项目旨在为汽车行业提供全面、准确的数据支持,帮助企业制定更精准的营销策略和业务决策,推动行业的数字化转型和持续创新。
关键词:Spark、汽车销售数据分析、Vue、爬取、数据清洗、大数据。
Analysis of Automobile Sales Data Based on Spark
Abstract
With the advent of the big data era, data analysis and mining have become the key to decision-making and optimization in various industries. This Spark based automotive sales data analysis project aims to utilize Spark's distributed computing power and Vue front-end framework to achieve comprehensive analysis of large-scale automotive sales data. Firstly, by crawling data from major automotive sales websites, including multidimensional information such as sales quantity, price, vehicle model, and region, a complete dataset is established. Subsequently, Spark is used for data cleaning, including deduplication, missing value handling, outlier detection, etc., to ensure data quality and accuracy. Next, using Spark for data processing and analysis, exploring sales trends and correlations across different regions and models, and identifying potential market opportunities and challenges. At the same time, combining the Vue front-end framework to achieve data visualization display, including generating various forms of charts, reports, etc., to present complex data analysis results to users in an intuitive way, helping decision-makers better understand the data. In addition, the project also supports functions such as list display, adding data, viewing details, querying, resetting filtering conditions, exporting data, deleting records, downloading and importing documents, and importing data. Search and filter through key indicators such as sales ranking, car name, and car brand to further improve user experience and data analysis efficiency. The entire project aims to provide comprehensive and accurate data support for the automotive industry, help enterprises formulate more accurate marketing strategies and business decisions, and promote the digital transformation and continuous innovation of the industry.
Keywords:Spark, automotive sales data analysis, Vue, crawling, data cleaning, big data.
目录
1绪论
1.1 研究背景
随着信息技术的迅速发展和大数据时代的到来,数据已经成为各行业决策和优化的核心资源。汽车销售行业作为一个庞大而充满活力的市场,面临着激烈的竞争和不断变化的消费者需求。在这样的背景下,有效地收集、整合和分析汽车销售数据,洞察市场趋势、把握消费者偏好、优化销售策略,对汽车企业提升竞争力、实现可持续发展至关重要。
传统的数据分析方法往往面临数据处理能力和分析模型复杂性的限制,难以应对海量数据的挑战。而Spark作为一款开源的大数据处理框架,具备强大的分布式计算能力和灵活的数据处理能力,为汽车销售数据分析提供了全新的解决方案。通过利用Spark的高效计算引擎和丰富的数据分析工具,汽车企业能够快速处理和深入分析销售数据,发现数据中潜藏的价值。
此外,随着网络技术的发展,越来越多的销售数据以非结构化文本形式存在,例如社交媒体上的用户评论和论坛讨论。这些文本数据蕴含着丰富的消费者意见和市场需求信息,对汽车企业具有重要的商业价值。因此,结合爬虫技术来抓取这些非结构化文本数据,并将其与结构化销售数据相结合,可以为汽车企业提供更全面、更深入的市场洞察。
综上所述,基于Spark的汽车销售数据分析系统的研究背景在于应对大数据时代的挑战,利用先进的数据处理和分析技术,实现对汽车销售数据的全面、深入挖掘,助力汽车企业在竞争激烈的市场中保持领先地位并实现可持续发展。
1.2 研究意义
在汽车销售行业中,实施基于Spark的数据分析系统具有重要的研究意义。这一系统可以帮助企业快速处理和深入分析海量销售数据,揭示市场趋势、消费者需求和潜在商机。通过数据洞察,企业能够更精确地制定销售策略,优化产品组合,提高市场响应速度,从而在竞争激烈的市场中获得竞争优势。
同时,该系统能够整合各种数据来源,包括结构化数据和非结构化文本数据,为企业提供全面、多维度的市场画像。这不仅增强了企业对市场的理解,还帮助企业及时捕捉市场变化,调整经营策略,以适应复杂多变的市场环境。
此外,基于Spark的数据分析系统具有高效、可扩展的特点,能够处理不断增长的数据量和分析需求。随着企业业务的扩展,系统可以持续升级和扩展,与企业发展保持同步,为企业提供持续的数据支持和分析服务。
综上所述,基于Spark的汽车销售数据分析系统的研究意义在于提升企业的市场竞争力、优化销售策略、实现可持续发展,并为企业决策提供有力支持,助力企业在大数据时代中取得成功。
1.3 国内外研究现状
国内研究现状:
随着大数据技术在中国的不断发展和普及,越来越多的汽车企业开始关注并应用大数据来优化其销售策略。基于Spark的汽车销售数据分析系统在国内得到了日益增加的研究和应用。一些大型汽车企业已建立了自己的大数据平台,利用Spark等分布式计算框架对销售数据进行处理和分析。这些系统不仅实现了销售数据的实时监控和预警,还提供了多维度的数据分析报告,为企业决策提供支持。
同时,国内的研究机构和高校也在积极探索基于Spark的汽车销售数据分析系统的理论和技术。他们通过深入研究汽车市场特点和需求,结合Spark的优势,开发了适用于汽车销售数据分析的算法和模型。这些研究成果推动了汽车销售数据分析系统技术的进步,为汽车企业的实际应用提供了理论支持。
国外研究现状:
在国际上,Spark作为一款开源的大规模数据处理框架,得到了广泛的应用和认可。在汽车销售数据分析领域,虽然国外汽车市场与国内存在差异,但基于Spark的数据分析系统同样具有重要的研究价值和应用前景。一些国际知名的汽车企业已开始尝试利用Spark等大数据技术对销售数据进行分析。他们通过建立大数据平台,整合全球销售数据,运用先进算法和模型进行深度分析。这些系统帮助企业洞察市场趋势和消费者需求,为战略规划和决策提供支持。
此外,国外学术界也在开展基于Spark的汽车销售数据分析系统研究。通过研究汽车市场特点和规律,结合Spark技术,提出创新算法和模型。这些研究推动了汽车销售数据分析系统技术的进步,为国际汽车企业提供有益参考。
综上所述,基于Spark的汽车销售数据分析系统在国内外均备受关注和研究。随着大数据技术的不断完善,这一系统将在汽车销售行业中发挥重要作用,为企业决策和优化提供有力支持。
1.4 论文组成结构
第一章是绪论,本文章的开头部分,对本题目的研究背景意义和研究现状等一些做文字性的描述。
第二章研究了Spark的汽车销售数据分析系统的所采用的开发技术和开发工具。
第三章是系统分析部分,包括系统总体需求描述、功能性角度分析系统需求、非功能性等各个方面分析系统是否可以实现。
第四章是系统设计部分,本文章的重要部分,提供了系统架构的详细设计和一些主要功能模块的设计说明。
第五章是系统的具体实现,介绍系统的各个模块的具体实现。
第六章在前几章的基础上对系统进行测试和运行。
最后对系统进行了认真的总结,以此对未来有一个新的展望。
2开发工具及相关技术介绍
2.1开发技术说明
本系统前端部分基于MVVM模式进行开发,采用B/S模式,后端部分基于python的spark框架进行开发。
前端部分:前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库使页面快速成型,可适应PC端、平板端、手机端等不同屏幕大小尺寸的完美布局展示。
后端部分:采用spark作为开发框架,同时集成Redis等相关技术。
2.2Python简介
Python 是一个高层次的脚本语言结合了解释性、编译性、互动性和面向对象的。Python 的设计,相比其他语言经常使用英文关键字和其他语言的一些标点符号,它具有比其他语言更有特色语法结构,具有很强的可读性。
解释型语言:类似于Python和Perl语言,这意味着开发过程中没有了编译这个环节。
交互式语言:可以在一个 Python 提示符 >>> 后直接执行代码。
面向对象语言:Python支持面向对象的风格或代码封装在对象的编程技术。
2.3 spark框架介绍
Spark Streaming:构建在Spark上处理Stream数据的框架,基本的原理是将Stream数据分成小的时间片段(几秒),以类似batch批量处理的方式来处理这小部分数据。Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+),虽然比不上专门的流式数据处理软件,也可以用于实时计算,另一方面相比基于Record的其它处理框架(如Storm),一部分窄依赖的RDD数据集可以从源数据重新计算达到容错处理目的。此外小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法。方便了一些需要历史数据和实时数据联合分析的特定应用场合。
2.4Mysql数据库
Mysql 经过多次的更新,功能层面已经非常的丰富和完善了,从Mysql4版本到5版本进行了比较大的更新,在商业的实际使用中取得了很好的实际应用效果。最新版本的Mysql支持对信息的压缩,同时还能进行加密能更好的满足对信息安全性的需求。同时经过系统的多次更新,数据库自身的镜像功能也得到了很大的增强,运行的流畅度和易用性方面有了不小的进步,驱动的使用和创建也更加的高效快捷。最大的变动还是进行了空间信息的显示优化,能更加方便的在应用地图上进行坐标的标注和运算。强大的备份功能也保证了用户使用的过程会更加安心,同时支持的Office特性还支持用户的自行安装和使用。在信息的显示形式上也进行了不小的更新,增加了两个非常使用的显示区,一个是信息区,对表格和文字进行了分类处理,界面的显示更加清爽和具体。第二是仪表的信息控件,能在仪表信息区进行信息的显示,同时还能进行多个信息的比对,为用户的实际使用带来了很大的便捷。
针对本文中设计的Spark的汽车销售数据分析系统在实际的实现过程中,最终选择Mysql数据库的主要原因在于在企业的应用系统应用及开发的过程中会存在大量的数据库比较频繁的操作,而且数据的安全性要求也是非常的高。综合这些因素,最终选择安全性系数比较高的Mysql来对Spark的汽车销售数据分析系统后台数据进行存储操作。
数据库管理系统的总体结构图如下图所示。
图2-1 数据库组成结构
2.5 B/S体系工作原理
B/S架构采取浏览器请求,服务器响应的工作模式。
用户可以通过浏览器去访问Internet上由Web服务器产生的文本、数据、图片、动画、视频点播和声音等信息;
而每一个Web服务器又可以通过各种方式与数据库服务器连接,大量的数据实际存放在数据库服务器中;
从Web服务器上下载程序到本地来执行,在下载过程中若遇到与数据库有关的指令,由Web服务器交给数据库服务器来解释执行,并返回给Web服务器,Web服务器又返回给用户。在这种结构中,将许许多多的网连接到一块,形成一个巨大的网,即全球网。而各个企业可以在此结构的基础上建立自己的Internet。
在 B/S 模式中,用户是通过浏览器针对许多分布于网络上的服务器进行请求访问的,浏览器的请求通过服务器进行处理,并将处理结果以及相应的信息返回给浏览器,其他的数据加工、请求全部都是由Web Server完成的。通过该框架结构以及植入于操作系统内部的浏览器,该结构已经成为了当今软件应用的主流结构模式。
3系统分析
3.1 可行性分析
在软件开发的过程中,可行性分析是至关重要的,它旨在评估问题的可行性,以便尽可能快地解决,同时也要考虑到不同的解决方案的优势和劣势,以及实施这些方案所带来的经济效益。通过对Spark的汽车销售数据分析系统的可行性分析,我们可以从技术、操作和经济三个方面来评估其可行性,从而为其提供有效的支持和保障。
3.1.1 技术可行性
从技术可行性角度来看,Spark作为一款成熟、稳定的大规模数据处理框架,在多个行业已得到广泛验证。其强大的分布式计算能力和灵活的数据处理能力为汽车销售数据分析提供了坚实的技术基础。结合爬虫技术,可以有效抓取和整合各种来源的销售数据,进一步丰富数据源,提高分析的全面性和准确性。同时,结合Vue前端框架,可以实现数据可视化展示,为决策提供直观的支持。现有的数据分析和挖掘算法也可以与Spark框架结合,实现高效的数据处理和分析。因此,基于Spark的汽车销售数据分析系统在技术上是完全可行的,有望为汽车企业提供强大的数据支持和分析服务。
3.1.2 经济可行性
尽管基于Spark的汽车销售数据分析系统的初始投资可能相对较高,包括硬件设备的购置、软件开发和系统集成等成本,但考虑到其能够为企业带来的长期效益,这一投资是完全值得的。系统有助于企业更精准地制定销售策略,优化产品组合,提高市场响应速度,增加销售收入和市场份额。此外,系统还能够降低企业运营成本,减少人力和物力的浪费,提高决策效率和准确性。从经济角度看,基于Spark的汽车销售数据分析系统具有高性价比,能够为企业带来长期的经济效益。结合Vue前端框架,实现数据可视化展示,进一步提升系统的经济价值和用户体验。
3.1.3 操作可行性
在操作可行性方面,基于Spark的汽车销售数据分析系统的设计考虑到了用户友好性和易用性。通过提供直观的操作界面和简洁的操作流程,使用户能够轻松上手并高效使用系统。系统还提供了详细的使用说明和技术支持,帮助用户更好地理解和应用系统功能。此外,系统具有高度的可扩展性和灵活性,可以根据企业的具体需求进行定制和扩展,以满足不断变化的分析需求。因此,从操作角度看,基于Spark的汽车销售数据分析系统是完全可行的,能够为企业提供便捷、高效的数据分析服务。结合Vue前端框架,实现用户友好的数据展示和操作界面,进一步提升系统的操作便捷性和用户体验。
3.2 需求分析
为了满足用户的需求,Spark的汽车销售数据分析系统将系统划分为两个部分:管理员和普通用户,每个部分都有独特的功能,以便更加便捷地管理信息。此外,系统还具有简单易操作的特点,可以更加精确、全面地实现用户的需求。以下是关于该功能的详细描述:
管理员功能介绍:
登录:管理员需要通过用户名和密码进行登录,以获取管理员权限。
(1)后台首页:管理员在后台首页可以直观地看到汽车排名统计折线图,掌握各品牌汽车的排名变化趋势;通过汽车销量统计折线图,快速了解各时段的销售情况;国家占比统计折线图则帮助管理员分析不同国家在汽车市场中的占比情况;车型占比统计折线图则展示了各种车型在销售中的比例分布。
(2)系统用户管理:管理员在系统用户管理模块中,具备对用户的全面管理能力。他们可以添加新用户,为团队扩充成员;同时,管理员也有权限删除不再需要的用户账户,确保系统安全。对于普通用户的信息,管理员可以进行修改,以适应团队或项目的变化需求。此外,管理员还能够查询用户信息,了解每位用户的角色和权限,以便进行针对性的管理。
(3)汽车排名管理:管理员可以在汽车排名模块中,通过列表查看所有汽车的排名情况。他们可以添加新的排名数据,或对已有数据进行查询、重置、导出和删除操作。此外,管理员还可以下载导入文档,并导入新的排名数据。对于特定的汽车,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索,以快速定位并管理相关数据。
(4)汽车销量管理:在汽车销量模块中,管理员拥有全面的管理权限。他们可以查看销量列表,了解每款汽车的销售情况;添加新的销量数据;查询、重置、导出和删除现有数据。同时,管理员还可以下载并导入文档,方便数据的批量处理。为了快速定位和筛选数据,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索。
(5)价格对比管理:管理员可以在价格对比管理模块中管理汽车的价格信息。他们可以查看价格列表,添加新的价格对比数据,或根据需要对现有数据进行查询、重置、导出和删除。此外,管理员还可以下载并导入文档,方便数据的批量处理。为了更准确地比较价格,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索。
(6)国家占比管理:在国家占比模块,管理员可以管理汽车的销售国家数据。他们可以查看销售国家的占比列表,添加新的国家数据,或查询、重置、导出和删除现有数据。管理员还可以下载并导入文档,以便快速处理数据。为了定位特定国家的销售数据,管理员可以通过销售排名、汽车名称、汽车品牌或出产国家进行搜索。
(7)品牌销量管理:管理员可以在品牌销量管理模块中查看各品牌汽车的销量情况。他们可以列出所有品牌的销量数据,添加新的销量记录,或查询、重置、导出和删除现有数据。此外,管理员还可以下载并导入文档,方便数据的批量处理。为了快速定位特定品牌的销量数据,管理员可以通过汽车名称或汽车品牌进行搜索。
(8)车型占比管理:在车型占比管理模块中,管理员可以管理各车型在销售中的占比情况。他们可以查看车型占比列表,添加新的车型数据,或根据需要对现有数据进行查询、重置、导出和删除。为了定位特定车型的占比数据,管理员可以通过汽车名称、汽车品牌或车辆类型进行搜索。
根据以上功能需求分析得出管理员用例图如下所示。
图3-1 管理员用例图
3.3 系统操作流程
3.3.1信息添加流程
Spark的汽车销售数据分析系统可以实现快速、准确地收集和处理各种信息,而且在使用过程中,只有在按照指定的界面和指定的参考文献,才能够正确地获取和处理信息,而若信息未能满足预期,就会被退出第一步,并且在第二步中,还会继续检查信息的准确性,以确保最终的结果能够满足预期的目标。
图3-3 信息添加流程图
3.3.2信息删除流程
无论是何种用户角色,只要进入了不正常的系统操作界面,就可以使用不同的信息内容来进行操作。当用户尝试删除系统中的数据时,必须先ACK这些数据是否已经被删除,如果没有,就应该按照图3-4的指示进行操作,以免影响系统的正常运行。
图3-4信息删除流程图
3.4本章小结
本章主要通过对Spark的汽车销售数据分析系统的可行性分析、功能需求分析、系统用例分析,确定整个Spark的汽车销售数据分析系统要实现的功能。同时也为Spark的汽车销售数据分析系统的代码实现和测试提供了标准。
4系统设计
4.1 系统架构设计
当前,B/S架构的数据访问模式已经大大改善:用户只需要打开网站,就能够获取系统的信息,而且,系统会根据用户的需要,自动响应并解决所有的问题。此外,用户还能够查阅服务器的处理结果,从而更好地了解数据的流转情况。Spark的汽车销售数据分析系统采用三层结构,即视觉-模拟-决策层。其中,视觉层负责接收来自用户的信息并将其呈现给用户;而模拟层则负责完成与用户有关的任务,包括组织信息、进行流程优化、提升用户体验。决策层则负责协商决策,并确保两层结果的一致性。
系统架构图如下图所示。
图4-1 系统架构图
4.2 系统功能结构
一旦您访问了这款应用,您需要完成一项重大的任务:通过认证,获得相应的权限。一旦您完成了认证,您将可以访问到一些关于您的服务,包括:后台首页、系统用户、汽车排名管理、汽车销量管理、价格对比管理、国家占比管理、品牌销量管理、车型占比管理等。这个界面非常清晰明了,通过指引您就能轻松地完成各种任务。
系统的功能结构图如下所示。
图4-2 系统功能结构图
4.3 数据库设计
一个优秀的系统必须具备完善的后台数据库,就像建筑物一样,它不是一蹴而就的,而是需要经过精心设计,以确保其稳固可靠。只有将数据库设计得完善,并且考虑到各个方面,才能保证系统的可靠性,避免出现任何问题。
4.3.1 概念模型设计
下面是整个系统中主要的数据库表总E-R实体关系图。
图4-3 系统E-R图
4.3.2 逻辑结构设计
在这一步中,我们将概念转换为实际的数据。由于数据库中包含了大量的信息,我们只展示了一些表格。
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 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 | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | brand_proportion_id | int | 10 | 0 | N | Y | 国家占比ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
9 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
10 | vehicle_type | varchar | 64 | 0 | Y | N | 车辆类型 | |
11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | brand_sales_id | int | 10 | 0 | N | Y | 品牌销量ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
9 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
10 | vehicle_type | varchar | 64 | 0 | Y | N | 车辆类型 | |
11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | car_ranking_id | int | 10 | 0 | N | Y | 汽车排名ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
9 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
10 | vehicle_type | varchar | 64 | 0 | Y | N | 车辆类型 | |
11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | car_sales_id | int | 10 | 0 | N | Y | 汽车销量ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
9 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
10 | vehicle_type | varchar | 64 | 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 | price_comparison_id | int | 10 | 0 | N | Y | 价格对比ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
9 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
10 | vehicle_type | varchar | 64 | 0 | Y | N | 车辆类型 | |
11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表proportion_of_vehicle_models (车型占比)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | proportion_of_vehicle_models_id | int | 10 | 0 | N | Y | 车型占比ID | |
2 | sales_ranking | varchar | 64 | 0 | Y | N | 销售排名 | |
3 | car_name | varchar | 64 | 0 | Y | N | 汽车名称 | |
4 | automobile_brand | varchar | 64 | 0 | Y | N | 汽车品牌 | |
5 | guiding_price | varchar | 64 | 0 | Y | N | 指导价格 | |
6 | monthly_sales_volume | varchar | 64 | 0 | Y | N | 月销售量 | |
7 | annual_sales | varchar | 64 | 0 | Y | N | 年销售量 | |
8 | country_of_origin | varchar | 64 | 0 | Y | N | 出产国家 | |
9 | body_structure | varchar | 64 | 0 | Y | N | 车身结构 | |
10 | vehicle_type | varchar | 64 | 0 | Y | N | 车辆类型 | |
11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | user_phone_number | varchar | 64 | 0 | Y | N | 用户电话 | |
5 | user_address | varchar | 64 | 0 | Y | N | 用户地址 | |
6 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
7 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
8 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 更新时间: |
5系统实现
5.1 管理员模块的实现
5.1.1 管理员登录界面
管理员直接登录界面输入账号和密码,完成验证,然后进行拼图验证,接着点击“登录”按钮。系统在用户数据库表中会对管理员的账号进行匹配,如果账号和密码正确,管理员就会成功登录到系统的后台首页管理界面;否则,系统会提示相应的信息,并将管理员返回到登录界面,返回到登录的界面,其登录主界面展示如下图所示。
图5-1 用户登录界面
登录关键代码如下:
def Login(self, ctx):
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))
5.1.2 后台首页界面
管理员在后台首页可以直观地看到汽车排名统计折线图,掌握各品牌汽车的排名变化趋势;通过汽车销量统计折线图,快速了解各时段的销售情况;国家占比统计折线图则帮助管理员分析不同国家在汽车市场中的占比情况;车型占比统计折线图则展示了各种车型在销售中的比例分布,其首页主界面展示如下图所示。
图5-2后台首页界面
5.1.3 系统用户管理界面
管理员在系统用户管理模块中,具备对用户的全面管理能力。他们可以添加新用户,为团队扩充成员;同时,管理员也有权限删除不再需要的用户账户,确保系统安全。对于普通用户的信息,管理员可以进行修改,以适应团队或项目的变化需求。此外,管理员还能够查询用户信息,了解每位用户的角色和权限,以便进行针对性的管理。系统用户界面如下图所示。
图5-3系统用户管理界面
5.1.4 汽车排名管理界面
管理员可以在汽车排名模块中,通过列表查看所有汽车的排名情况。他们可以添加新的排名数据,或对已有数据进行查询、重置、导出和删除操作。此外,管理员还可以下载导入文档,并导入新的排名数据。对于特定的汽车,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索,以快速定位并管理相关数据。汽车排名管理界面如下图所示。
图5-4汽车排名管理界面图
5.1.5 汽车销量管理界面
在汽车销量模块中,管理员拥有全面的管理权限。他们可以查看销量列表,了解每款汽车的销售情况;添加新的销量数据;查询、重置、导出和删除现有数据。同时,管理员还可以下载并导入文档,方便数据的批量处理。为了快速定位和筛选数据,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索。汽车销量管理界面如下图所示。
图5-5汽车销量管理界面图
5.1.6 价格对比管理界面
管理员可以在价格对比管理模块中管理汽车的价格信息。他们可以查看价格列表,添加新的价格对比数据,或根据需要对现有数据进行查询、重置、导出和删除。此外,管理员还可以下载并导入文档,方便数据的批量处理。为了更准确地比较价格,管理员可以通过销售排名、汽车名称或汽车品牌进行搜索。价格对比管理界面如下图所示。
图5-6价格对比界面
5.1.7 国家占比管理界面
在国家占比统计模块,管理员可以管理汽车的销售国家数据。他们可以查看销售国家的占比列表,添加新的国家数据,或查询、重置、导出和删除现有数据。管理员还可以下载并导入文档,以便快速处理数据。为了定位特定国家的销售数据,管理员可以通过销售排名、汽车名称、汽车品牌或出产国家进行搜索。国家占比管理界面如下图所示。
图5-7国家占比管理界面
国家占比管理关键代码如下:
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": "已存在"}}
5.1.8 品牌销量管理界面
管理员可以在品牌销量管理模块中查看各品牌汽车的销量情况。他们可以列出所有品牌的销量数据,添加新的销量记录,或查询、重置、导出和删除现有数据。此外,管理员还可以下载并导入文档,方便数据的批量处理。为了快速定位特定品牌的销量数据,管理员可以通过汽车名称或汽车品牌进行搜索。
图5-8品牌销量管理界面
5.1.9 车型占比管理界面
在车型占比管理模块中,管理员可以管理各车型在销售中的占比情况。他们可以查看车型占比列表,添加新的车型数据,或根据需要对现有数据进行查询、重置、导出和删除。为了定位特定车型的占比数据,管理员可以通过汽车名称、汽车品牌或车辆类型进行搜索。车型占比管理界面如下图所示。
图5-10车型占比界面
6系统测试
6.1系统测试的目的
系统开发到了最后一个阶段那就是系统测试,系统测试对软件的开发其实是非常有必要的。因为没什么系统一经开发出来就可能会尽善尽美,再厉害的系统开发工程师也会在系统开发的时候出现纰漏,系统测试能够较好的改正一些bug,为后期系统的维护性提供很好的支持。通过系统测试,开发人员也可以建立自己对系统的信心,为后期的系统版本的跟新提供支持。
6.2 系统测试用例
系统测试包括:用户登录功能测试、汽车销量查看功能测试、汽车排名添加、汽车品牌搜索、密码修改功能测试,如表6-1、6-2、6-3、6-4、6-5所示:
表6-1 用户登录功能测试表
用例名称 | 用户登录系统 |
目的 | 测试用户通过正确的用户名和密码可否登录功能 |
前提 | 未登录的情况下 |
测试流程 | 1) 进入登录页面 2) 输入正确的用户名和密码 |
预期结果 | 用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入 |
实际结果 | 实际结果与预期结果一致 |
汽车销量查看功能测试:
表6-2汽车销量查看功能测试表
用例名称 | 汽车销量查看 |
目的 | 测试汽车销量查看功能 |
前提 | 管理员登录 |
测试流程 | 点击汽车销量列表 |
预期结果 | 可以查看到所有汽车销量 |
实际结果 | 实际结果与预期结果一致 |
管理员添加汽车排名界面测试:
表6-3 管理员添加汽车排名界面测试表
用例名称 | 汽车排名添加测试用例 |
目的 | 测试汽车排名添加功能 |
前提 | 管理员正常登录情况下 |
测试流程 | 1)管理员点击汽车排名管理,然后点击汽车排名,点击添加后并填写信息。 2)点击进行提交。 |
预期结果 | 提交以后,页面首页会显示新的汽车排名 |
实际结果 | 实际结果与预期结果一致 |
汽车品牌搜索功能测试:
表6-4汽车品牌搜索功能测试表
用例名称 | 汽车品牌搜索测试 |
目的 | 测试汽车品牌搜索功能 |
前提 | 无 |
测试流程 | 1)在搜索框填入搜索关键字。 2)点击搜索按钮。 |
预期结果 | 页面显示包含有搜索关键字的汽车品牌信息 |
实际结果 | 实际结果与预期结果一致 |
密码修改功能测试:
表6-5 密码修改功能测试表
用例名称 | 密码修改测试用例 |
目的 | 测试管理员密码修改功能 |
前提 | 管理员用户正常登录情况下 |
测试流程 | 1)管理员密码修改并完成填写。 2)点击进行提交。 |
预期结果 | 使用新的密码可以登录 |
实际结果 | 实际结果与预期结果一致 |
6.3 系统测试结果
通过编写Spark的汽车销售数据分析系统的测试用例,已经检测完毕用户登录模块、汽车排名查看模块、汽车销量添加模块、汽车品牌搜索模块、密码修改功能测试,通过这5大模块为Spark的汽车销售数据分析系统的后期推广运营提供了强力的技术支撑。
结论
在设计Spark的汽车销售数据分析系统时,我将四年学习的专业知识整合运用,着手开发这一网站系统,旨在通过互联网实现信息化。然而,这一过程并非一帆风顺,我面临着技术问题和缺乏单独开发程序经验的挑战。特别是在涉及大数据方面的数据分析和处理时,我遇到了许多困难。这让我开始怀疑自己的能力,自信心受到了打击。
尽管如此,我没有放弃,而是迅速调整了自己的状态。我主动与老师和同学讨论,寻求解决问题的方法。他们的建议和支持帮助我克服了困难,重新找回了对项目的信心。在毕业设计中,我意识到这是对我四年学习成果的综合考验,不仅可以巩固专业知识,还能让我运用所学技能进行实践,提升自己的能力。
通过实现Spark的汽车销售数据分析系统,我不仅加深了对以往知识的理解,还学到了大数据处理和分析的相关技术。这个过程让我更加深入地了解了技术的应用,同时也促使我对跨学科效果有了更深入的认识。尽管在系统开发过程中遇到了各种困难,但我通过不断的研究和探索,逐渐解决了问题。虽然系统仍然存在不足,但我从中获得了更多的信心和动力。
回顾整个毕业设计的过程,我意识到其中蕴含了无数次的努力和汗水,也积累了许多宝贵的经验。尽管有挑战和困难,但这些都是我成长的过程。我相信通过这样的经历,我将在未来的工作中继续努力,不断提升自己在计算机技术领域的能力,实现更多的需求功能。我对未来充满信心,相信自己可以胜任更多的工作,并在工作领域做出更大的贡献。
参考文献
[1]Zhang X . Python Programming Teaching Platform Based on Cloud Computing Technology [J]. Computer Informatization and Mechanical System, 2024, 7 (2): 61-65.
[2]Wang R ,Huang Z ,Zhang J , et al. Constructing oxygen-deficient shell on Li-rich cathodes by spark plasma sintering for high-performance lithium-ion batteries [J]. Next Materials, 2024, 4 100195-.
[3]甘艳华. Spark流式计算商品关注度系统 [J]. 福建电脑, 2024, 40 (03): 86-91. DOI:10.16707/j.cnki.fjpc.2024.03.017.
[4]王松玉,贾丝雨. S集团创维新能源汽车营销策划及其销售数据分析 [J]. 内燃机与配件, 2023, (24): 120-122.
[5]Xiao Z ,Ali Y ,Xin W , et al. Sports Work Strategy of College Counselors Based on MySQL Database Big Data Analysis [J]. International Journal of Information Technology and Web Engineering (IJITWE), 2023, 18 (1): 1-14.
[6]林梅,张友友,林莉. 基于新媒体环境下成都某汽车销售集团跨界合作可行性研究 [J]. 现代营销(下旬刊), 2023, (07): 62-64.
[7]郑寒,马新波. 某SUV车型销售实践及其数据分析 [J]. 内燃机与配件, 2022, (21): 111-113.
[8]陈思思. 网约车发展对汽车销售影响的实证研究[D]. 北方工业大学, 2022.
[9]周家杰. 基于大数据分析双螺旋式品牌消费指数研究 中国汽车品牌消费指数实证研究 [J]. 汽车与配件, 2022, (04): 46-51.
[10]唐小翠,狄宇涛,陈曾友,等. 基于平滑指数法的中国汽车销量预测 [J]. 大众标准化, 2021, (16): 55-57.
[11]张译,秦佳良. 消费者购买新能源汽车意愿影响因素分析 [J]. 经济研究导刊, 2021, (20): 41-45+106.
[12]张建国. 基于POI数据的沈阳中心城区现状土地用途识别与分析研究[D]. 沈阳建筑大学, 2021.
[13]杨玉蒙. 基于网络搜索数据的电动汽车销量预测[D]. 西南财经大学, 2021.
[14]王如意. 新能源汽车“车补”转“桩补”的政策影响研究[D]. 东北财经大学, 2020. [15]蒋翠清,王香香,王钊. 基于消费者关注度的汽车销量预测方法研究 [J]. 数据分析与知识发现, 2021, 5 (01): 128-139.
[16]谭涛,黄泽涛,林雁玲,等. 大数据驱动的我国新能源汽车需求分析 [J]. 可再生能源, 2020, 38 (07): 967-971.
[17]孙新. 引入网络搜索数据的品牌汽车销量预测[D]. 首都经济贸易大学, 2020.
[18]章金成. 基于网络口碑和搜索数据的汽车销量预测研究[D]. 青岛大学, 2020.
[19]张淑桂. 大数据分析技术在汽车销售客户分级管理方案中的应用综述 [J]. 电脑知识与技术, 2020, 16 (07): 7-9.
[20]官维. 某汽车销售公司数据仓库项目的构建及应用研究 [J]. 软件工程, 2019, 22 (11): 31-34.
致谢
眨眼之间,大学生活就要结束了。在本文的最后,我要感谢我和蔼可亲的导师、团结有爱的同学的帮助和鼓励。此刻,我找不到感谢之词可以用来表达我最深切的感激之情。尤其感谢我的指导老师,在选题的过程中与我进行了深入的交流,在毕业设计期间给我提供了一些指导。四年的学习生活让我受益良多,老师们的丰富的学术知识、认真负责的学习态度让我受益匪浅。在此,我深深地感谢那些曾经给予我帮助和指导的老师!
我们的论文得益于许多学者的贡献,他们的研究成果为我们提供了宝贵的指导,使我们能够更好地完成这篇文章。感谢我的同学和朋友在我的写作以及排版过程中给予热情的帮助,才使得我比较顺利的完成了这篇论文。
感谢大学里遇见的朋友,你们在我这四年里留下无数的温暖和快乐,让我对这个校园多了一份留念。最后,感谢我的父母、辅导员张老师、班长白海鹏,以及室友们对我大学生活上的关心和理解,让我能保持乐观和追求我所热爱的。尽管我的能力有限,但我仍然尽力去完善这篇论文,并且诚挚地希望各位老师和学友能够给予宝贵的指导与意见!
免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-