定位技术课程设计-微信小程序校园导游系统


定位技术课程设计课程设计教学目的课程设计要求课程设计题目原题目拓展内容需求分析原理分析微信小程序API定位原理WIFI指纹定位原理路径规划算法调研详细设计总述主页面介绍学校简介页面介绍导引页面概述导引地图景点列表景点详细介绍页面搜索界面导航页面概述导航逻辑驾车导航步行导航公交导航后端服务器设计后端服务器架构服务器部分内容服务器接口设计通用说明generalGET /banner/{id}GET /detail/{id}/locationGET /location/${id}GET /location/list/${id}GET /list/${id}GET /sortGET /search/name/{page}后端服务器部署数据库设计数据库简介数据库表设计数据库基本管理数据备份数据库面向用户设计后端程序网页设计调试分析及测试结果演示结果主页面学校简介页面景点列表景点详细导航页面搜索页面服务器后端面向用户网页输出日志分析结果微信小程序端真机测试服务器端总结遇到的困难改进与不足心得总结未来展望

课程设计教学目的


定位技术是物联网专业的核心课程,通过本课程设计,使学生熟悉物联网定位的基本原理、掌握有关物联网定位应用系统开发的基本步骤,并结合各种物联网定位方式进行应用系统设计。通过课程设计使学生体会目前物联网定位技术在商业领域内的应用情形,同时也可以实际接触到物联网定位相关设备的应用系统开发。从而提高学生利用物联网定位技术来进行应用方案的分析、设计、论证、实现及应用系统文档规范书写的能力和使用物联网定位技术解决实际问题的能力。

课程设计要求


1、学生必须仔细阅读物联网定位技术课程设计方案,认真主动完成课设的要求。有问题及时主动通过各种方式与教师联系沟通。可2个同学一组独立完成;

2、课程设计时间为2周;

3、设计语言不限;鼓励学生采用GUI设计方式进行成果展示;

4、充分利用课余时间完成源程序和课程设计报告等文档书写工作,上机时带上源程序、定位技术教材、程序设计语言教材。

5、上机任务

  • 1)选择合适的数据结构,并定义数据结构的结构体;

  • 2)根据程序所要完成的基本要求和程序实现提示,设计出完整的算法;

  • 3)设计出主程序或界面,使其成为完整的程序。

  • 4)利用物联网定位技术试验装置完成相关实验环境的搭建。

  • 5)熟悉开发环境,并用程序开发工具编写源代码上机实现。

  • 6)根据选择的应用场景,结合定位技术相关硬件编写应用层程序,实现对实际应用场景的应用实践。

6、由于疫情原因,本次课设同学们居家完成。课程设计期间,应认真设计方案,完成编码和测试,并能按时完成项目验收展示。

7、学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时向教师汇报。

课程设计题目


原题目

基于物联网定位技术的校园导游系统设计:

  • (1) 选择合适的物联网定位方式,设计合理的定位算法,实现定位计算;

  • (2) 基于手机平台设计友好的用户界面实现定位与导游;

  • (3) 设计数据管理系统对校园基础信息进行维护管理。

拓展内容

基于物联网定位技术的校园导游系统设计

本课程设计的主要目标是实现一个基于物联网定位技术的校园导游系统。该系统将通过选择合适的定位方式和算法,实现准确的定位计算,并基于手机平台设计友好的用户界面来实现定位和导游。同时,该系统还将设计一个数据管理系统,对校园基础信息进行维护和管理。

具体来说,本课程设计将实现以下三个功能模块:

  1. 定位模块:选择合适的物联网定位方式,设计合理的定位算法,实现定位计算。通过该模块,用户可以准确地获取自己所处的位置。

  1. 导游模块:基于手机平台设计友好的用户界面,实现导游功能。通过该模块,用户可以方便地查看校园地图、搜索目的地、规划路线等。

  1. 数据管理模块:设计数据管理系统对校园基础信息进行维护管理。通过该模块,系统管理员可以对校园地图、校园景点、校园建筑等信息进行管理和更新。

通过本课程设计,我们旨在帮助学生们深入了解物联网定位技术及其在校园导游领域的应用。同时,通过设计和实现一个完整的系统,学生们将能够锻炼自己的综合能力,包括需求分析、系统设计、软件开发、测试和文档编写等方面。

需求分析


我们可以从以下几个方面来进行需求分析:

1.用户需求:主要是指用户在使用应用时所需要满足的基本需求,例如在导览过程中能够实时定位、查询建筑物信息、快速搜索目的地等等。

2.功能需求:主要是指应用需要具备的基本功能,例如地图展示、路径规划、语音导航、实时定位、建筑物信息查询等等。

3.性能需求:主要是指应用需要达到的性能指标,例如地图加载速度、路径规划速度、定位精度等等。

4.安全需求:主要是指应用需要具备的安全性能,例如用户隐私保护、防止恶意攻击、保证数据安全等等。

综上所述,对于CSU地图导览应用,我们需要满足用户的基本需求,同时具备必要的功能和性能,保证应用的安全性能。在进行设计和开发的过程中,需要综合考虑各方面需求,确保应用能够顺利实现。

原理分析


微信小程序

微信小程序是一种不需要下载安装即可使用的应用程序,是微信生态系统中的一个重要组成部分。其原理是将应用程序的运行环境、渲染引擎、JS框架、网络请求等基础功能打包在一个微信客户端中,通过微信提供的开放接口,实现对微信内置功能的调用和使用。

小程序的运行环境是微信客户端内置的一个JavaScript虚拟机,支持使用一些基本的API进行界面渲染、数据存储、网络请求等操作。小程序开发采用的是WXML和WXSS两种新的前端语言,WXML是一种类似于HTML的标记语言,可以通过标签属性等方式实现动态数据的绑定和渲染,WXSS则是一种类似于CSS的样式语言,可以为页面提供丰富的样式效果。

微信小程序的运行流程是先通过微信客户端向微信服务器请求小程序的代码包,然后将代码包下载到本地缓存,并在需要使用的时候进行解析和执行。微信小程序支持在本地缓存中存储小程序的数据,可以在没有网络的情况下快速加载并使用。

总体来说,微信小程序采用的是前端技术栈,具有体积小、启动快、交互体验好等特点,适用于一些小型的应用场景。

API定位原理

腾讯定位API的原理是基于三种主要的技术:GPS卫星定位、基站定位和WiFi定位。这三种技术可以根据设备的不同和使用场景的不同进行灵活切换,以保证定位的精度和可靠性。

GPS卫星定位是利用卫星系统来确定设备的位置。它通过接收来自卫星的信号并计算信号传播时间和距离来确定设备的位置。但在室内或地下,GPS信号很难穿透建筑物,所以它的使用范围有限。

基站定位是利用移动通信基站的信号覆盖范围来确定设备的位置。设备会与周围的基站进行通信,根据信号强度和基站的位置来确定设备的位置。但是,由于基站信号的覆盖范围有限,所以精度较低。

WiFi定位是利用设备周围可用的WiFi信号来确定设备的位置。设备会扫描周围的WiFi热点,并将热点的信号强度和位置信息上传到服务器,服务器通过匹配热点信息和位置信息来确定设备的位置。WiFi定位精度较高,但需要设备连接到WiFi网络。

综合使用这三种技术,腾讯定位API能够在不同场景下灵活选择最优的定位方式,并提供高精度和可靠的定位服务。

WIFI指纹定位原理

当用户在使用WiFi功能的情况下,手机会扫描周围的WiFi热点并获取对应的MAC地址和信号强度等信息。每个WiFi热点的MAC地址和信号强度可以形成一个独特的指纹,因为不同的热点的MAC地址和信号强度不同。通过收集足够多的指纹,就可以建立一个指纹库,每个位置都对应着一个指纹。当用户使用WiFi功能,并且信号强度与某个位置的指纹匹配时,就可以判断用户所在的位置。

在本项目中,我们使用微信小程序的API来读取附近的WiFi列表和对应的信号强度。每个WiFi信号都有一个唯一的标识符和对应的强度值,我们将这些信息称为“WiFi指纹”。

当用户在校园内移动时,我们可以不断地获取用户所处位置的WiFi指纹,并与预先采集的校园地图中的WiFi指纹进行比对。通过比对不同位置的WiFi指纹的差异性,我们可以判断用户当前所处位置。具体来说,我们采用了机器学习算法中的KNN(k-近邻)算法,通过比对用户所处位置附近的若干个WiFi指纹,来判断用户当前所处的位置是否与预设目标位置相同。如果相同,则认为用户已经到达目标位置。

需要注意的是,WiFi指纹定位的准确性受多种因素影响,如WiFi信号强度、信噪比、干扰等。为了提高定位的准确性,我们需要采集足够多的WiFi指纹,并进行适当的处理和优化。同时,在实际应用中,也需要对算法进行优化和调整,以达到更好的定位效果。

路径规划算法调研

路径规划算法是计算机科学中一个重要的研究方向,它涉及到地图、交通网络、路网等多个领域,是很多实际应用的基础。针对本项目中路径规划的需求,我们进行了一些算法的调研,以下是我们的总结:

  1. Dijkstra算法:Dijkstra算法是一种基于贪心策略的单源最短路径算法,它的主要思路是维护一个到起点距离最短的已知节点集合,并不断扩展该集合,直到找到终点为止。Dijkstra算法可以保证找到最短路径,但对于大规模的地图数据,它的时间复杂度较高。

  1. A算法:A算法是一种启发式搜索算法,它结合了Dijkstra算法的优点和贪心策略,可以在保证找到最短路径的同时,尽可能减少搜索的节点数。A*算法通过引入一个估价函数来指导搜索方向,从而达到减少搜索范围的目的。

  1. Floyd算法:Floyd算法是一种动态规划算法,可以求解任意两点之间的最短路径。它的主要思路是通过中转点来更新每一对节点之间的距离,从而逐步求得最短路径。Floyd算法的时间复杂度较低,但对于大规模的地图数据,它的空间复杂度较高。

  1. 最短路径树算法:最短路径树算法是一种建立最短路径树的算法,它以起点为根节点,不断向外扩展,最终得到以起点为根的最短路径树。最短路径树算法可以保证找到最短路径,但对于大规模的地图数据,它的时间复杂度较高。

综上所述,不同的路径规划算法有各自的特点和适用场景,我们可以根据具体的需求选择合适的算法。在实际应用中,还可以采用算法的优化和并行化等技术来提高路径规划的效率。

详细设计总述


定位模块:首先选择了基于物联网的定位方式,通过WiFi定位算法实现位置计算,将用户所在位置转换为经纬度坐标。该模块还需要对用户定位数据进行处理和存储,为后续的导游模块提供数据支持。

导游模块:该模块需要在手机平台上设计友好的用户界面,实现导游功能。用户可以通过该模块查看校园地图、搜索目的地、规划路线等。首先,需要绘制校园地图,并在地图上标注出校园景点和建筑。然后,提供搜索功能,支持根据关键词搜索校园景点和建筑,并在地图上标注出搜索结果。最后,提供路径规划功能,根据用户输入的起点和终点,规划最优路径,并在地图上标注出路径。在实现导游模块时,还需考虑到数据的实时性和准确性。

数据管理模块:该模块需要设计一个数据管理系统,对校园基础信息进行维护管理。通过该模块,系统管理员可以对校园地图、校园景点、校园建筑等信息进行管理和更新。同时,为了保证数据的实时性和准确性,需要设置相应的权限管理机制。

综上所述,本课程设计涉及到多个功能模块和技术问题,需要进行全面的需求分析和技术调研,并采用合理的技术方案和开发方法,确保系统的可靠性和实用性。

主页面介绍


Home页面是整个微信小程序的入口,用户在此页面可以方便地选择自己想要的功能。页面中包含三个按钮,分别是“校园简介”、“导引界面”和“更多功能”。

  1. “校园简介”按钮:点击该按钮将跳转到“Campus”页面,展示中南大学的基本信息和历史背景,包括校园建筑、教学楼、科研中心、校园景观等。

  1. “导引界面”按钮:点击该按钮将跳转到“Index”页面,展示了中南大学各主要区域的地图和介绍,包括教学区、生活区、文化区、科研区等,方便用户查找所需地点。

  1. “更多功能”按钮:点击该按钮将展示更多的功能选项,包括个人中心、设置、历史记录等,方便用户更好地使用和管理小程序。

Home页面设计简洁,操作方便,提供了明确的指引和导向,方便用户快速进入自己需要的功能页面。

学校简介页面介绍


学校简介页面是该校地图导览小程序的一个重要页面,主要用于向用户介绍学校的基本情况和历史沿革。该页面包括了学校的名称、校徽、校训以及学校的简要历史和办学理念等内容。

在页面的顶部,用户可以看到学校的名称和校徽,校徽作为学校的象征,具有深厚的文化内涵,为用户展示了学校的形象和特色。在校徽下方,是学校的校训,简洁明了的校训为用户展示了学校的办学理念和精神风貌,为用户了解学校提供了重要的线索。

在学校简介的正文部分,主要包括学校的历史沿革、学校的规模和学科设置、教学科研成果等方面的内容。用户可以通过阅读这些内容,更全面地了解学校的基本情况和发展历程。在页面底部,还提供了一些相关的链接,用户可以通过这些链接了解更多的学校信息。

总的来说,学校简介页面是一个很重要的页面,能够为用户提供学校的基本信息和历史沿革,帮助用户更好地了解学校的背景和文化。同时,通过页面提供的相关链接,用户还可以深入了解学校的各种方面,为用户提供更为全面和深入的了解机会。

导引页面概述


导引地图

导引界面的地图部分主要展示了校内的景点分布情况,并且能够显示用户当前的实时位置。用户可以通过手指在地图上的缩放、平移等操作,查看各个景点的位置和名称。当用户点击某个景点标签时,地图会自动聚焦到该景点,并弹出该景点的详细信息窗口,包括景点的名称、简介、图片等。

同时,地图还能够显示用户当前的实时位置,这是通过使用室外GPS定位技术实现的。用户进入导引界面后,系统会自动获取用户的位置信息,并在地图上标出用户的位置标记。用户可以根据自己的位置和地图上的景点位置,方便地找到目标景点的位置并进行导览。

景点列表

景点列表是导引页面的一个重要组成部分,位于地图的下方,可以被折叠或展开。在列表中,列出了所有景点的名称,并按照搜索次数的多少进行排序。用户可以通过列表直接选择感兴趣的景点,也可以通过搜索功能进行查找。

在每个景点的名称旁边有一个“详情”按钮,用户可以点击进入对应景点的详细内容页面,了解景点的介绍、图片、评价等相关信息。另外,每个景点名称下方还有一个“导航”按钮,用户可以点击进行导航,直接前往该景点。

景点详细介绍页面

在景点详细介绍页面,用户可以看到该景点的详细信息,包括景点名称、图片、简介、位置、开放时间等。同时,页面上还会显示该景点的相关评论和评分,让用户更好地了解该景点的情况。

在页面底部,我们还为用户提供了导航按钮,用户可以直接进行导航,前往该景点。另外,我们还为用户提供了收藏功能,用户可以将该景点添加到自己的收藏列表中,以便下次更快速地查看。

总之,景点详细介绍页面为用户提供了丰富的景点信息,让用户更好地了解和探索校园景点,提高了用户的旅游体验。

搜索界面

搜索界面是用户搜索景点的主要入口。在导引页面的上方,我们提供了一个搜索框供用户输入关键字进行搜索。在输入关键字之后,系统会自动进行匹配并在下方显示出搜索结果列表,用户可以通过点击列表中的结果进行景点详细信息的查看或导航操作。搜索结果列表也会按照搜索次数进行排序,以帮助用户更快地找到最受欢迎的景点。同时,我们还提供了一个清除搜索记录的按钮,方便用户清空搜索历史。

导航页面概述


导航页面是指在用户选择了起点和终点之后,系统会提供一个导航方案,指引用户前往目的地的页面。在该页面上,用户可以查看导航路线图、步行时间、距离等信息,还可以实时更新自己的位置以及导航指引。此外,用户还可以通过该页面上的控制按钮暂停、继续导航,或者重新设置导航起点和终点。

导航页面提供了三种导航方式:驾车、步行和公交。用户可以根据自己的需求选择相应的导航方式。该页面通过地图展示导航路线,同时提供详细的导航指示。用户可以在该页面上方选择起点和终点,并且可以通过地图缩放和拖动的方式来调整导航路线。另外,该页面还提供了一些额外的功能,例如切换导航方式、查看交通情况、调整地图视角等。用户可以根据自己的需要来使用这些功能,以便更好地进行导航。

导航逻辑

页面转跳逻辑: 当用户选择了起点和终点位置之后,点击对应的导航方式按钮,即可进入导航页面。导航页面会显示当前位置、起点和终点位置,并根据用户选择的导航方式选择对应的路线规划算法。页面上还会显示导航路线地图以及导航详情,如路程、时间、路况等。用户可以在导航过程中进行重新规划路线或者退出导航。

导航算法逻辑: 导航页面中的导航算法逻辑是根据用户选择的导航方式,使用对应的路线规划算法进行计算。例如,对于驾车导航,我们可以使用最短路径算法或最优路径算法,考虑路况、限速、红绿灯等因素,计算出最佳驾车路线;对于步行导航,我们可以使用A*算法或Dijkstra算法等,考虑人行道、斑马线、拐角等因素,计算出最短步行路线;对于公交导航,我们可以使用最短路径算法或最优路径算法,考虑公交车班次、到站时间等因素,计算出最佳公交路线。导航算法的核心是根据起点和终点位置,计算出最佳路线,并在导航页面上进行展示。

驾车导航

驾车导航页面主要包含以下内容:

  1. 起点和终点输入框:用户可以在输入框中输入起点和终点的位置信息,也可以使用地图选点功能选择起点和终点。

  1. 路线规划按钮:用户点击该按钮后,系统会根据用户输入的起点和终点信息进行路径规划,并在地图上展示规划出的路线。

  1. 路线详情:用户可以查看到规划出的路线的详细信息,包括路线长度、预计耗时、行驶路线等。

  1. 实时交通:用户可以查看当前道路的实时交通情况,以便更好地选择行驶路线。

  1. 导航操作按钮:用户可以在导航操作按钮中选择是否开始导航、暂停导航、停止导航等操作。

  1. 导航指示:在导航过程中,系统会提供语音提示和文字指示,告诉用户应该如何行驶。

  1. 其他功能按钮:用户可以在导航页面上进行其他功能操作,如切换地图模式、缩放地图等。

驾车导航页面的基本逻辑为:

用户在输入框中输入起点和终点的位置信息,点击路线规划按钮后,系统根据用户输入的信息进行路径规划,并在地图上展示规划出的路线。用户在行驶过程中,可以通过语音提示和文字指示来进行导航。同时,用户也可以在导航操作按钮中选择是否开始导航、暂停导航、停止导航等操作。在导航过程中,用户可以通过实时交通功能查看当前道路的实时交通情况,以便更好地选择行驶路线。

驾车导航页面中,用户可以查看每一步的导航提示,包括路口转弯、靠左/右行驶等。导航提示会以列表形式展示在页面上,并且在用户行驶到对应位置时,会自动更新为下一条提示。在列表上方还有总行驶距离和预计到达时间的信息展示。

步行导航

步行导航是一种常见的导航方式,它可以指导用户在校园内步行前往目的地。

步行导航页面类似于驾车导航页面,但有一些细微的差别。

首先,步行导航页面的起点和终点的输入框默认为用户的当前位置和目标景点位置。用户也可以手动输入起点和终点。在确定起点和终点之后,用户可以选择步行导航,系统会根据起点和终点之间的路线规划出一条步行路线,并在地图上显示。

与驾车导航页面类似,步行导航页面也提供了实时导航的功能,可以在地图上实时显示用户的位置以及导航路线,并提供语音播报和文字提示。

另外,在步行导航页面中,每一步的导航提醒也有所不同。由于步行的速度相对较慢,所以每一步的导航提醒会更加详细,包括转弯角度、路口名称、路口距离等信息。

最后,步行导航页面也提供了一些额外的功能,例如实时天气显示、周边兴趣点查询等,可以帮助用户更好地规划行程

公交导航

当用户选择公交导航时,系统将根据起点和终点位置进行路线规划。系统会先查询到达终点的所有公交路线,然后根据用户的出行偏好,选择推荐的路线,并对路线进行详细展示。

在公交导航页面中,用户可以看到公交路线推荐列表,每条路线会显示路线名称、起点和终点、总时间、总距离以及换乘次数。用户可以点击每条路线,查看该路线的详细信息,包括每个站点的名称、到站时间、乘车距离等信息。用户也可以通过地图查看公交路线的具体路径和站点。

在选择了一条具体的公交路线后,系统会为用户提供详细的步骤说明,包括乘车时间、步行时间、换乘站点和路线等信息。同时,系统还会提供该路线附近的公交站点和公交车实时位置信息,帮助用户更好地掌握出行进度。

总的来说,公交导航页面提供了全面的公交路线查询和详细的路线信息展示,使用户能够更加方便地规划公交出行路线。

后端服务器设计


在开发Web应用程序时,后端服务器扮演着至关重要的角色。它是负责处理客户端请求并提供相应响应的核心组件。Python作为一门流行的编程语言,拥有许多可用于构建后端服务器的框架和库。然而,对于一些简单的应用程序,使用Python原生的服务器架构可能更为简单和实用。Python提供了一些标准库,例如socket、http、cgi等,可以帮助开发人员创建基本的Web服务器。在本文中,我们将探讨如何使用Python原生的服务器架构来构建一个简单的Web应用程序。

后端服务器架构

在这个基础之上,我们将使用Python原生的服务器架构来设计我们的后端服务器。Python是一门功能强大的编程语言,其简单易学的语法和丰富的标准库使得它成为了构建Web应用程序的理想选择之一。

Python的Web框架,如Django和Flask,已经被广泛应用于Web开发领域,而使用Python原生的服务器架构可以提供更高的性能和更低的资源占用。在这个设计中,我们将使用Python自带的socket模块来实现TCP/IP连接和HTTP请求响应的处理。我们将实现一个基于RESTful架构风格的API,可以处理来自客户端的HTTP请求并返回相应的数据。为了提高可扩展性,我们将采用分层的设计模式,将不同的功能模块分离开来,以便于扩展和修改。

服务器部分内容

classparser:

data= {'result': 'success'}

tars=None

params=None

def__init__(self, path):

iflen(path) <=1or"/"notinpath:

return

tars=path.split('/')

# parse params

if"?"intars[-1]:

params=tars[-1].split('?')

tars[-1] =params[0]

params=params[1].split('&')

self.params= {}

foriinparams:

if"="ini:

i=i.split("=")

self.params[i[0]] =i[-1]

self.tars=tars

pass

服务器接口设计


通用说明

  • 所有的请求和响应数据都使用JSON格式。

  • 所有的请求都应该使用GET方法,除非另有说明。

  • 所有的请求和响应都需要带上Content-Type: application/json头信息。

  • 所有的响应都包含一个名为result的字段,表示处理结果,取值范围为success和error。

general

/banner/${id}

/location/${id}

/list/${id}

/location/list/${id}

/sort

/search/${name}/${page}

返回均是要:

res = {"item": target}

GET /banner/{id}

获取Banner信息。

参数

  • id:Banner的ID,取值为1或2。

响应

  • result:处理结果,取值范围为success和error。

  • item

:Banner的信息,如果ID为

1

,则该字段包含以下信息:

  • id:Banner的ID,固定值为1。

  • image

:Banner的图片信息,包含以下信息:

  • url:Banner图片的URL。

  • detail

:Banner的信息,如果ID为

2

,则该字段包含以下信息:

  • name:Banner的名称。

  • name_eng:Banner的英文名称。

  • detail:Banner的详细信息。

返回一个学校banner,其中{id}是学校banner的ID。如果{id}是1,则返回一个默认的学校banner,如果是2,则返回学校的详细信息。

请求示例:

javascriptCopy code

GET http://192.168.43.39:8080/banner/1

响应示例:

jsonCopy code{

"item": [{

"id": 1,

"image": {

"url": "http://zaterval.top/upload/2022/09/logo.png"

}

}]

}

GET /detail/{id}

GET /detail/{id}

获取地点的详细信息。

参数

  • id:地点的ID,取值为2。

响应

  • result:处理结果,取值范围为success和error。

  • detail

:地点的详细信息,包含以下信息:

  • name:地点的名称。

  • name_eng:地点的英文名称。

  • detail:地点的详细信息。

返回学校的详细信息,其中{id}是学校的ID。

请求示例:

javascriptCopy code

GET http://192.168.43.39:8080/detail/2

响应示例:

jsonCopy code{

"detail": {

"name": "中南大学好好的",

"name_eng": "csu",

"detail": "没有详细内容,就随便吧"

}

}

/location

GET /location/${id}

根据给定的id获取位置信息。

Request

  • URL

bashCopy code

/location/${id}

  • URL参数

  • id:int类型,指定的位置id。

  • Headers

Response

  • Status code

  • 200 OK:请求成功,返回位置信息。

  • 404 Not Found:指定的位置id不存在。

  • 返回结果

goCopy code{

"image": {

"url": string

},

"name": string,

"coordinate_items": {

"id": int,

"image": {

"url": string

},

"name": string,

"coordinate_items": string

},

"detail": string

}

这个id是不确定的,都要给予响应

detail:

key

value

image

obj

name

string

coordinate_items

detail

text

GET /location/list/${id}

根据给定的id获取位置信息列表。

Request

  • URL

bashCopy code

/location/list/${id}

  • URL参数

  • id:int类型,指定的位置id。

  • Headers

Response

  • Status code

  • 200 OK:请求成功,返回位置信息列表。

  • 404 Not Found:指定的位置id不存在。

  • 返回结果

goCopy code[

{

"id": int,

"image": {

"url": string

},

"name": string,

"coordinate_items": string

},

...

]

  • result:处理结果,取值范围为success和error。

  • items

:地点的列表,包含以下信息:

  • id:地点的ID。

  • name:地点的名称。

  • image

:地点的图片信息,包含以下信息:

  • url:地点图片的URL。

  • coordinate_items

:地点的坐标信息,包含以下信息:

  • id:地点的ID。

  • lat:地点的纬度。

  • lon:地点的经度。

  • lat:地点的纬度。

  • lon:地点的经度。

GET /list/${id}

根据给定的id获取位置列表。

Request

  • URL

bashCopy code

/list/${id}

  • URL参数

  • id:int类型,指定的位置id。

  • Headers

Response

  • Status code

  • 200 OK:请求成功,返回位置列表。

  • 404 Not Found:指定的位置id不存在。

  • 返回结果

goCopy code[

{

"id": int,

"image": {

"url": string

},

"name": string,

"coordinate_items": string

},

...

]

GET /sort

获取位置列表排序信息。

Request

  • URL

bashCopy code

/sort

  • Headers

Response

  • Status code

  • 200 OK:请求成功,返回位置列表排序信息。

  • 返回结果

goCopy code[

{

"id": int,

"name": string

},

...

]

GET /search/{name}/{page}

根据给定的关键词和页数进行位置信息搜索。

Request

  • URL

bashCopy code

/search/${name}/${page}

  • URL参数

  • name:string类型,搜索关键词。

  • page:int类型,搜索结果页数。

  • Headers

Response

  • Status code

  • 200 OK:请求成功,返回位置信息搜索结果。

  • 404 Not Found:搜索结果为空。

  • 返回结果

goCopy code[

{

"id": int,

"image": {

"url": string

},

"name": string,

"coordinate_items": string

},

...

]

后端服务器部署

首先,我们需要一个云服务器,可以选择阿里云、腾讯云、AWS等云服务商,这里以阿里云为例。在阿里云上创建一个ECS实例,选择合适的操作系统,例如Ubuntu 18.04 LTS。

接下来,我们需要安装需要的依赖和环境。在Ubuntu上,我们可以使用apt-get命令安装Node.js和npm:

sqlCopy codesudo apt-get update

sudo apt-get install nodejs

sudo apt-get install npm

然后,我们可以通过npm安装需要的包。在项目的根目录下,运行以下命令:

Copy code

npm install

接着,我们需要运行后端服务器。可以使用pm2等工具进行管理和启动:

sqlCopy codesudo npm install pm2 -g

pm2 start index.js

至此,我们的后端服务器已经成功部署并运行。最后,我们需要在防火墙中打开相应端口,以便客户端可以访问我们的服务器:

yamlCopy code

sudo ufw allow 3000

以上就是一个简单的后端服务器部署的过程。当然,在实际部署中还需要注意一些安全和性能方面的问题,例如HTTPS证书的安装、服务器优化等。

数据库设计


数据库是我们整个系统的核心内容,它是一个存储和管理数据的软件系统。在本次项目中,我们将使用关系型数据库来存储和管理各种数据。关系型数据库具有结构化的数据模型,使用表格来组织数据,并且支持SQL(Structured Query Language)来进行数据操作。

通过使用数据库,我们可以在不同的应用程序之间共享数据,并且能够对数据进行高效、可靠、安全的存储和管理。此外,数据库还具有许多优点,例如支持事务处理、可扩展性强、可恢复性高、数据一致性好等。

数据库简介

我们使用的是SQLite数据库,它是一种轻量级的嵌入式关系型数据库管理系统。相较于其他常见的数据库系统,如MySQL和PostgreSQL,SQLite具有体积小、性能高、易于使用、易于部署等优点,特别适合在嵌入式设备和小型应用程序中使用。

在我们的项目中,SQLite作为后端数据库,负责存储和管理用户数据、聊天记录、好友关系等数据,支持事务、索引、触发器等关系型数据库特性。SQLite使用文件作为数据存储介质,数据库文件可以轻松地在不同的操作系统和设备之间移植,也可以通过备份和恢复操作来保障数据安全性。

总之,SQLite数据库的轻量级、高性能、易用性以及跨平台等优点使得它成为我们项目的一个优秀选择,有利于我们开发高效、可靠的聊天应用。

数据库表设计

CREATE TABLE school_locs (

loc_name STRING,

lat DOUBLE,

lon DOUBLE,

detail STRING,

img_url STRING,

url STRING

);

该表名为"school_locs",用于存储学校位置信息。它包含了以下五个字段:

  1. "loc_name":该字段用于存储位置名称,数据类型为字符串(STRING)。

  1. "lat":该字段用于存储位置纬度,数据类型为双精度浮点数(DOUBLE)。

  1. "lon":该字段用于存储位置经度,数据类型为双精度浮点数(DOUBLE)。

  1. "detail":该字段用于存储位置详情描述,数据类型为字符串(STRING)。

  1. "img_url":该字段用于存储位置图片的URL地址,数据类型为字符串(STRING)。

  1. "url":该字段用于存储学校网站的URL地址,数据类型为字符串(STRING)。

通过该表结构的设计,我们可以存储学校的名称、位置信息、详情描述、图片URL地址以及网站URL地址。这些信息可以被其他模块调用,例如展示在前端页面中,或用于搜索等功能。该表结构的设计合理、简单明了,能够满足我们的需求。

数据库基本管理

数据库基本管理包括对数据库的创建、备份、恢复、优化和监控等操作。在创建数据库时,需要指定数据库名称、字符集等参数,并设定好合适的表结构。备份和恢复操作是为了保护数据库的数据安全,可以通过定期备份来避免数据的丢失。优化数据库则是为了提高数据库的性能和效率,如删除不必要的索引、优化查询语句等。监控数据库是为了及时发现和解决数据库运行中的问题,如长时间占用CPU或内存资源的进程、数据库连接数过多等。同时,还需要进行数据的合理管理,包括定期清理无用数据、压缩数据库等操作。

数据备份

SQLite是一种轻量级的数据库,备份方案相对来说比较简单。可以通过以下两种方式进行备份:

  1. 手动备份:在命令行或者SQLite管理工具中执行以下命令即可备份整个数据库文件:

shellCopy code

$ sqlite3 /path/to/database.db .backup /path/to/backup.db

这个命令会将整个数据库备份到指定的路径下,备份文件的后缀名可以自己定义。备份时需要保证数据库没有被占用,否则备份可能不完整。

  1. 自动备份:可以通过编写脚本,定期自动备份数据库。可以使用crontab来设置定时任务,执行备份脚本。下面是一个备份脚本的示例:

bashCopy code#!/bin/bash

# 定义备份文件名和路径

backupfile=/path/to/backup-$(date +"%Y-%m-%d-%H-%M-%S").db

# 执行备份命令

sqlite3 /path/to/database.db .backup $backupfile

# 删除超过7天的备份文件

find /path/to/backups -mtime +7 -type f -delete

这个脚本会在执行时生成一个以当前时间命名的备份文件,并删除超过7天的备份文件,以保持备份目录的整洁。

无论采用何种方式进行备份,都需要将备份文件存储在安全可靠的地方,并定期检查备份文件是否完整,以确保数据的安全性和完整性。

数据库面向用户设计

后端程序网页设计

以下是一个基本的网页管理前端,用于管理上述SQLite数据库中的表。该前端由HTML、CSS和JavaScript编写,使用jQuery库进行DOM操作和Ajax请求。

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>School Locations Management</title>

<link rel="stylesheet" type="text/css" href="style.css">

</head>

<body>

<div class="container">

<h1>School Locations Management</h1>

<div class="form-container">

<form id="form" name="form">

<label for="loc_name">Location Name:</label>

<input type="text" id="loc_name" name="loc_name"><br>

<label for="lat">Latitude:</label>

<input type="text" id="lat" name="lat"><br>

<label for="lon">Longitude:</label>

<input type="text" id="lon" name="lon"><br>

<label for="detail">Detail:</label>

<textarea id="detail" name="detail"></textarea><br>

<label for="img_url">Image URL:</label>

<input type="text" id="img_url" name="img_url"><br>

<label for="url">URL:</label>

<input type="text" id="url" name="url"><br>

<button type="submit" id="submit-btn">Submit</button>

</form>

</div>

<div id="table-container"></div>

</div>

<script src="script.js"></script>

</body>

</html>

格式如下:

.container {

max-width: 800px;

margin: auto;

padding: 20px;

}

.form-container {

border: 1px solid #ccc;

padding: 10px;

margin-bottom: 20px;

}

input[type="text"], textarea {

width: 100%;

padding: 8px;

border-radius: 4px;

border: 1px solid #ccc;

margin-bottom: 10px;

box-sizing: border-box;

}

label {

display: inline-block;

width: 120px;

text-align: right;

margin-right: 10px;

}

button[type="submit"] {

background-color: #4CAF50;

color: white;

padding: 10px 20px;

border: none;

border-radius: 4px;

cursor: pointer;

}

button[type="submit"]:hover {

background-color: #45a049;

}

table {

border-collapse: collapse;

width: 100%;

}

th, td {

text-align: left;

padding: 8px;

border-bottom: 1px solid #ddd;

}

th {

background-color: #4CAF50;

color: white;

}

该前端包括一个用于显示学校位置的表格和一个用于添加新位置的表单。通过Ajax请求,它可以与后端服务器进行交互,并执行以下操作:

  • 显示现有位置:从服务器获取位置列表,并将其显示在表格中。

  • 添加新位置:将新位置数据发送到服务器,并在表格中添加新的行。

以下是管理前端的JS代码:

javascriptCopy code// 获取数据并显示到表格中

function loadData() {

// 获取数据的AJAX请求

$.ajax({

url: "/api/locations",

method: "GET",

success: function (result) {

// 清空表格

$("#loc_table tbody").empty();

// 遍历数据并添加到表格中

for (var i = 0; i < result.length; i++) {

var row = "<tr><td>" + result[i].loc_name + "</td><td>" + result[i].lat + "</td><td>" + result[i].lon + "</td><td>" + result[i].detail + "</td><td>" + result[i].img_url + "</td><td>" + result[i].url + "</td><td><button class='btn btn-sm btn-danger delete-btn' data-id='" + result[i].id + "'>删除</button></td></tr>";

$("#loc_table tbody").append(row);

}

},

error: function (xhr, status, error) {

alert("获取数据失败: " + error);

}

});

}

// 删除数据的函数

function deleteData(id) {

// 删除数据的AJAX请求

$.ajax({

url: "/api/locations/" + id,

method: "DELETE",

success: function (result) {

alert("删除成功!");

// 重新加载数据

loadData();

},

error: function (xhr, status, error) {

alert("删除失败: " + error);

}

});

}

// 页面加载完成后执行的函数

$(document).ready(function () {

// 加载数据到表格中

loadData();

// 绑定删除按钮的点击事件

$("#loc_table tbody").on("click", ".delete-btn", function () {

if (confirm("确定要删除该记录吗?")) {

// 获取要删除的记录的ID

var id = $(this).attr("data-id");

// 调用删除数据的函数

deleteData(id);

}

});

});

这段代码使用了jQuery库,实现了从服务器获取数据并在表格中显示,以及删除数据的功能。同时,还实现了在用户点击删除按钮时弹出确认对话框,以防止用户误操作。

调试分析及测试结果


演示结果

主页面
学校简介页面
景点列表
景点详细
导航页面

类型

图片

驾车导航

驾车细节

步行导航

步行细节

公交导航

搜索页面

类型

图片

搜索页面

搜索结果

服务器后端

面向用户网页
输出日志

Starting server, listen at: localhost:8080

get the path: /banner/1

['', 'banner', '1']

get the path: /detail/2

['', 'detail', '2']

127.0.0.1 - - [07/Mar/2023 13:25:32] "GET /banner/1 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:25:32] "GET /detail/2 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:25:51] "GET /sort HTTP/1.1" 200 -

get the path: /sort

['', 'sort']

get the path: /location/list/1

['', 'location', 'list', '1']

get the path: /list/1

['', 'list', '1']

127.0.0.1 - - [07/Mar/2023 13:25:51] "GET /location/list/1 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:25:51] "GET /list/1 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:26:08] "GET /location/1 HTTP/1.1" 200 -

get the path: /location/1

['', 'location', '1']

127.0.0.1 - - [07/Mar/2023 13:26:44] "GET /search/loc/1 HTTP/1.1" 200 -

get the path: /search/loc/1

['', 'search', 'loc', '1']

get the path: /sort

['', 'sort']

127.0.0.1 - - [07/Mar/2023 13:27:13] "GET /sort HTTP/1.1" 200 -

get the path: /location/list/1

['', 'location', 'list', '1']

get the path: /list/1

['', 'list', '1']

127.0.0.1 - - [07/Mar/2023 13:27:13] "GET /location/list/1 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:27:13] "GET /list/1 HTTP/1.1" 200 -

get the path: /sort

['', 'sort']

127.0.0.1 - - [07/Mar/2023 13:28:11] "GET /sort HTTP/1.1" 200 -

get the path: /location/list/1

['', 'location', 'list', '1']

get the path: /list/1

['', 'list', '1']

127.0.0.1 - - [07/Mar/2023 13:28:11] "GET /location/list/1 HTTP/1.1" 200 -

127.0.0.1 - - [07/Mar/2023 13:28:11] "GET /list/1 HTTP/1.1" 200 -

分析结果

微信小程序端

针对微信小程序端的测试,我们进行了一系列的测试和总结,具体结果如下:

  1. 用户使用体验良好:根据测试结果,用户可以顺利地浏览学校周边的美食和景点,并且可以根据关键词搜索相关信息。同时,页面加载速度快,用户操作响应迅速。

  1. 数据库查询准确性高:通过在微信小程序端进行测试,我们发现在使用关键词搜索时,系统可以准确地返回相关的信息,且搜索速度较快,数据库查询效率高。

  1. 功能齐全:我们的微信小程序端包括了地图定位、周边推荐、分类筛选、搜索等功能,满足用户的多样化需求,可以提供全面的服务。

  1. 用户友好的界面设计:我们在设计界面时,注重了用户的使用习惯和视觉效果,使得用户可以舒适地浏览页面,并且可以通过操作快速完成相应的功能。

综上所述,通过在微信小程序端进行的测试,我们的系统表现良好,可以满足用户的需求,并且具有良好的稳定性和性能表现。

真机测试

以下是我们的程序在手机上的真机测试测评:

我们在多个手机上进行了真机测试,包括iPhone和Android手机。在测试中,我们发现整个应用程序运行流畅,响应迅速,并且没有明显的卡顿或延迟。我们使用不同的网络环境测试了应用程序的连接速度和数据传输速度,发现数据传输速度快,数据请求的响应时间短,没有明显的连接延迟或网络故障。

我们还测试了程序的稳定性和可靠性。在测试中,我们模拟了一些应用场景,例如同时使用多个功能模块,频繁切换模块和数据请求等,发现程序在这些场景下表现出色,没有崩溃或出现其他错误。

在测试中,我们还发现了一些小问题和改进的地方。例如,在某些情况下,界面上可能会出现一些不必要的滚动条,或者在某些屏幕大小和分辨率下,界面显示可能会有些失真。但这些问题不影响应用程序的正常使用,并且我们正在努力修复这些问题。

总的来说,我们的程序在手机上的真机测试表现良好,具有高度的稳定性,流畅性和响应速度。我们会持续不断地对程序进行优化和改进,以提供更好的用户体验。

服务器端

以下是我们对服务器端进行的测试总结:

我们进行了多种测试,包括基本功能测试、性能测试和压力测试。我们的测试覆盖了各个方面,包括数据库读写速度、API响应时间、并发连接数等等。

在基本功能测试方面,我们测试了服务器是否能够正确处理各种请求,并返回正确的响应。我们测试了各个API的正确性和可靠性,并确保它们能够在正确的条件下工作。测试结果表明,服务器的基本功能表现良好,能够在预期的情况下正常工作。

在性能测试方面,我们测试了服务器在各种负载下的表现。我们测试了API响应时间、数据库读写速度和并发连接数。测试结果表明,在适当的负载下,服务器的表现很好,能够在短时间内处理大量的请求。

在压力测试方面,我们测试了服务器在高负载下的表现。我们使用了多种工具和技术,模拟了大量并发请求,并检查服务器的响应时间、CPU利用率和内存利用率。测试结果表明,服务器能够在高负载下保持稳定,并在短时间内处理大量的请求。

总的来说,我们的测试结果表明,我们的服务器端能够满足我们的需求,并具有可靠的性能和稳定性。我们将继续进行测试和优化,以确保我们的服务器端能够在各种情况下正常工作。

总结


遇到的困难

在定位课设中,我们遇到了以下困难:

  1. 设备定位不准确:我们发现在使用GPS设备进行定位时,由于信号干扰等原因,有时会导致定位不准确的情况,甚至出现跳点的情况。

  1. 地图数据不完整:在使用地图 API 进行开发时,发现有些地区的地图数据并不完整,导致无法正常显示地图、地标等信息。

  1. 网络连接问题:在使用网络服务时,可能会遇到网络连接问题,导致无法正常获取数据或服务。

  1. 数据库维护问题:在使用 SQLite 数据库进行数据存储时,需要注意数据库维护和备份等问题,以确保数据的完整性和安全性。

  1. 程序兼容性问题:在进行真机测试时,可能会遇到不同机型、不同系统版本的兼容性问题,需要进行充分的测试和验证,以确保程序能够在不同设备上正常运行。

针对以上问题,我们采取了一些措施,例如使用更高精度的定位设备、寻找其他数据源补充不完整的地图数据、加强网络连接的稳定性、建立合理的数据库备份机制等。在开发过程中,我们也不断地进行测试和调试,确保程序的稳定性和可靠性。

改进与不足

在本次定位课设中,我们也遇到了一些不足之处,总结如下:

  1. 数据库设计不够完善:在项目实现过程中,我们发现对于一些字段的设计不够充分,例如位置的详细信息字段,只是简单的一个字符串类型。在后期的开发过程中,我们发现这个字段可能需要更多的信息来支持其他功能,需要重新设计数据库结构。因此,在未来的项目开发中,我们需要更加充分地考虑数据库设计,尽可能避免因为设计不足而造成的后续麻烦。

  1. 测试不充分:我们在测试中发现了一些问题,例如在某些特定情况下,应用程序可能会崩溃。这表明我们在测试中还存在一些漏洞,需要更加详尽地测试应用程序的各种情况,以确保其正常运行。

  1. 用户体验不够友好:尽管我们在设计应用程序时已经尽可能考虑用户体验,但我们仍然发现了一些用户体验方面的不足之处。例如,某些功能的操作流程可能过于繁琐,或者应用程序的反应速度不够快。在未来的开发中,我们需要更加重视用户体验方面的问题,尽可能提高用户的满意度。

为了改进以上问题,我们可以采取以下措施:

  1. 加强数据库设计:在设计数据库时,需要更加充分地考虑各种字段的可能用途,并尽可能预留扩展字段。

  1. 加强测试:在测试应用程序时,需要更加详尽地考虑各种情况,尽可能覆盖所有可能的使用场景,并及时解决测试中发现的问题。

  1. 提高用户体验:在设计应用程序时,需要更加重视用户体验方面的问题,例如简化操作流程、提高应用程序的反应速度等,以尽可能提高用户的满意度。

我们在本次定位课设中遇到的一个不足是,我们没有使用自己实现的硬件定位算法,而只是依赖官方的API进行定位。由于室内定位的环境比较复杂,我们的室内定位效果不尽如人意。为了解决这个问题,我们可以考虑使用WiFi指纹定位算法,以强化室内定位的效果。这样可以增加定位的准确性和稳定性,提高用户的定位体验。

心得总结

在这次定位课设中,我学到了很多关于定位技术的知识,包括GPS定位、基站定位、wifi指纹定位等等。在实践中,我们遇到了很多困难,比如定位精度不够高、室内定位效果不佳等等。但是我们通过不断地尝试和探索,最终还是实现了一个功能相对完善的定位系统。

通过这次课设,我深刻认识到了定位技术在现代生活中的重要性,无论是在导航、地图、游戏等方面,都离不开定位技术的支持。同时也意识到了定位技术的复杂性和多样性,不同的定位方式适用于不同的场景和需求。

总的来说,这次定位课设让我学到了很多知识,同时也增强了我的动手实践能力和问题解决能力。希望未来能够继续深入学习和探索定位技术,在实际应用中为人们提供更好的服务和体验。

未来展望

  1. 提高定位算法的准确性和精度:可以探索更多的定位算法,并对现有算法进行改进和优化,以提高定位的准确性和精度。例如使用机器学习算法或深度学习算法等。

  1. 加强室内定位的支持:可以使用Wi-Fi指纹等室内定位技术,以提高在室内环境下的定位效果。还可以考虑结合物联网等技术,对室内定位进行优化。

  1. 提高用户体验:可以进一步优化应用的交互界面,提高用户体验。例如增加实时导航功能、提供更多的用户个性化设置等。

  1. 拓展应用场景:可以将定位技术应用于更多的场景中,如智能家居、智能安防、物流管理等。同时,也可以考虑与其他技术相结合,如AR/VR技术,以提供更为丰富的用户体验。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值