基于Android的太原市景点推荐系统的设计与实现

news2024/11/23 12:21:55

毕业设计

基于Android的太原市景点

推荐系统的设计与实现

1.课题意义及目标

随着人们生活水平的提高,外出旅游已经成了人们放松休闲的主要活动之一。现在移动端设备已是人们必备,最重要的是携带方便,基于Android的太原市景点推荐系统可以让人们更好的了解太原市的景点信息,方便游客更好的选择。

2.主要任务

(1)了解景点信息以及分析需要实现的功能以及细节内容,并搭建框架。

(2)进行各个景点的信息的收集整理,并添加到对应的功能模块中。

(3)添加简单的地图功能以及公交查询功能。

(4)实现自驾游地图导航功能(选做)

(5)为了游客记录出行心得,添加记事本模块,并进行增删改查功能的的实现。

3.主要参考资料

[1] 崔玥.蓉城旅游管理系统设计与实现[D].四川:电子科技大学,2013.

[2] 吴晓红.基于Android的旅游景区自助导游系统的设计与实现[J].新疆大学信息科学与工程学院,2013,(28):61.

[3] 贺全荣.暑期自助游手机来搞定[J].2012,(11):28.

4.进度安排

设计(论文)各阶段名称起 止 日 期
1查阅文献,提交开题报告12月15日~03月01日12月15
2搜集整理景点信息,分析功能模块并搭建框架03月02日~04月04日
3系统总体设计,并完成可视化交互界面的设计04月05日~04月14日
4功能模块的设计04月15日~05月20日
5完成毕业设计论文及答辩工作05月21日~06月22日

摘要

随着移动通信与计算机互联网技术的迅猛发展,手机已成为现代人们工作生活必不可少的通讯和娱乐工具。旅游作为一种精神享受和休闲游乐的新型产业,走信息化`高速发展道路,能随时随地获取旅游相关信息已成为旅游者们的迫切需求。

本文通过分析 Android 的体系架构及应用程序的组成,利用Java和SQLite技术,构建了一个基于Android的太原市的景点推荐系统。该景点推荐系统主要包括主界面、景点信息介绍、写微记、搜索以及定位导航等。主界面以图文并茂的方式展示了数十个景点简略信息;景点信息介绍界面从八个方面详细介绍了景点;微记可以增删改差,并且具有分享功能,增加互动;搜索功能可以快速搜索景点名称,查看相关景点信息;定位导航功能首先需要进行当前位置的定位,获取地址以及经纬度,然后进行路线规划,获取导航路线、距离并预测行驶时间,可实现语音播报。

关键词:Android,旅游,数据库,百度地图api

The Design and Implementation of the Recommendation System of the Scenic Spots in Taiyuan Based on Android

Abstract

With the rapid development of mobile communications and computer Internet technology, mobile phone has become a indispensable tool of communication and entertainment for people’s work and life. When it comes to tourism, as a new kind of spiritual enjoyment and leisure amusement industry, it can anytime and anywhere access to travel information by using new information-based high-speed development road ,which has become the urgent need of tourists.

This paper analyzes the architecture of Android and its application, and constructs a recommendation system based on Android for Taiyuan city based on SQLite and Java technology. The main attractions of the system including the main interface, attractions information, writing searching and positioning navigation,etc.Main interface with illustrations show dozens of attractions brief information. It introduces the scenic spot information interface from eight aspects in detail introduced the attractions. Micro minds

has the increase, delete, modify, query functions,and has the share function.It increases interaction.Search function can quickly search for the name of the attractions,and view the relevant information attractions. Positioning and navigation function needs to locate the current position and gets address as well as the latitude and longitude, and route planning, obtaining navigation routes, distance and prediction of travel time and voice broadcasting can be realized.

Key:Android,travel,database,baidu map api

目录

1 绪论11

1.1 研究背景及意义11

1.2 国内外进展11

1.3 本文的工作22

2 Android环境搭建和关键技术33

2.1 Android环境搭建33

2.1.1 JDK安装33

2.1.2 Eclipse的安装44

2.1.3 SDK版本下载44

2.2 关键技术的实现55

2.2.1 百度地图API key的获取55

2.2.2 Android定位1010

3 需求分析1212

3.1 需求概述1212

3.2 可行性分析1212

3.2.1 系统可行性1212

3.2.2 技术可行性1212

3.3 系统需求分析1313

3.4 外部接口需求1313

3.5 性能需求1313

3.6 安全需求1414

3.7 软件环境1414

4 概要设计1515

4.1 系统总体设计1515

4.1.1 系统架构设计1515

4.1.2 系统结构1515

4.2 系统接口设计1818

4.3 数据存储设计1818

4.3.1 ContentProvider存储1818

4.3.2 SQLite数据库存储1919

5 详细设计2020

5.1 界面设计2020

5.1.1 主界面设计2020

5.1.2 搜索界面设计2121

5.1.3 景点信息界面设计2222

5.1.4 微记模块设计2424

5.1.5 定位导航模块设计2828

5.1.6 返回键的监听3131

5.2 数据库设计3232

5.2.1 景点信息表jingdian3232

5.2.2 搜索记录表history3333

5.2.3 微记内容表 noteitems3434

6 测试3535

6.1 主界面加载问题3535

6.2 景点信息界面dialog显示问题3636

7 结论3737

参考文献3838

致谢3939

1 绪论

1.1 研究背景及意义

现在人们生活水平普遍提高,外出旅游成为日常生活的一部分。目前,游客获取旅游信息的主要方式是咨询旅行社或上网查询,这种方式获取的旅游信息比较粗略,不直观,不灵活。随着移动网络的飞速发展和安卓智能手机的普及,使游客在安卓智能手机上实现旅游信息方便快捷的查询成为可能。

太原市是山西省的省会,别称并州,古称晋阳,也称“龙城”,国家历史文化古城、

国家园林城市、是一座具有4700年历史,2500多年建城历史的古都。下辖地区地区

有6个市辖区、3个县、一个县级市,拥有古镇乡村、自然景观、展馆、公园等多个

类型的大大小小数十个景点。

基于移动端的景点推荐软件的实现,可以代替游客了解景点信息的传统方式,更

方便,更快捷。人们可以通过安卓手机快捷实时的查询旅游信息,从而为制定旅游计

划提供决策支持[4]。

1.2 国内外进展

随着经济的稳步发展和人民生活水平的日益提高,旅游活动逐渐成为人们生活中的一个重要内容,促进了国内旅游市场的蓬勃发展[1]。Android一词的本意指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的的开源手机操作系统的名称[2]。在移动互联网和移动终端大发展的趋势下,各类移动应用也在蓬勃发展[3],手机也是人们出行的必须品,人们越来越希望有一款智能化的简单易于用户使用的智能旅游信息软件,来更好的为人们出行服务。

目前,有很多景点信息的软件,这些软件都是全国性的,没有一款针对具体地方的景点信息推荐的软件,广而不精[5]。在网上查询信息的时候,会对于一些小的景点很难查到详细的信息。现如今国内存在的软件有一些,例如“景点通”,是一款可以帮助经常旅游的用户轻松掌握旅途景点的手机应用[13],有任意缩放的精美地图功能,景区内旅行线路规划,还有详实的景点内各个POI介绍。还有一款软件就是“自游e派”,可实现上千个景点的深度语音讲解,知名景点的电子导览图,用手机记录轨迹、拍照、写微游记、微博分享、并在地图、卫星地球上展示出来。

旅游信息化已经在发达国家经历了几十年的发展。我国旅游业信息化开始于20世纪80年代初期,起步比较晚,基础比较薄弱,整体水平较低[6]。目前我国大多数旅游管理系统均是面向旅游者的,以各单独旅游景区为单位的景区内部“查询系统”,查询的内容仅仅为景区内景点、线路和各服务点信息。以一个地区为基础的旅游信息系统,涵盖区域内各旅游资源的系统少之又少[7]。

以地区为单位的基于Android的景点推荐系统,更加方便的为本地区游客随时随地出行提供选择。

1.3 本文的工作

现在主流的手机操作系统有Android和IOS[12]。Android有成熟的技术和广泛的市场,在这种的基础下,为了满足人们的需求,设计并实现了基于Android的太原市景点推荐系统。

本文的主要工作如下:

  1. 熟悉Android操作系统开发需要用到知识和开发方式,充分利用Android的
    成熟技术以及接口。
  2. 根据需求分析,分析系统可行性以及技术可行性,了解用户人群的操作习惯
    以及逻辑判断,根据这些开发出能最大程度的满足客户的需求的功能模块。
    (3) 对系统的功能模块、所用接口、以及数据库进行概要设计。
    (4) 系统功能模块的实现,例如各个界面的设计,地图定位导航的前期工作申请key值以及后续开发,详细的数据库设计,所用到的表以及字段等。
    (5) 进行测试工作,发现问题并解决问题,完善界面优化性能。最后进行总结和展望。
    2 Android环境搭建和关键技术
    2.1 Android环境搭建
    2.1.1 JDK安装
    首先需要下载JDK,安装到固定目录下(目录最好没有中文或者空格等字符,否则有时会出错),然后环境变量设置如下:

    1. 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
    2. JAVA_HOME值为:E:\Aid E\eclipse\jdk(你安装JDK的目录
    3. CLASSPATH值为:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.ja
      r;%JAVA_HOME%\bin;
    4. Path: 在开始追加 %JAVA_HOME%\bin;
    5. NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳
      过[11]。
      安装完成之后,打开cmd窗口,输入java–version 查看JDK的版本信息。出
      现类似图2.1的内容表示安装成功了:

图 2.1 测试jdk是否安装成功
2.1.2 Eclipse的安装
Eclipse的安装选择是ADT Bundle。ADT Bundle包含了Eclipse、ADT插件和SDK Tools,是已经集成好的IDE,只需安装好JDK即可开始开发。
2.1.3 SDK版本下载
Android有很多版本,从1.x已经发展到现在的Android5.1,随着版本的更新,增加了很多新的功能,也替换了一些旧的功能。
进入sdk目录下,打开安装程序,选择相应的版本号进行下载。由于现在Google受到限制,有时候会出现没有可选包以及下载结果为uninstalled。所以需要进行一些设置。

      1. 首先需要修改hosts文件:打开“C:\Windows\System32\drivers\etc”路径下的hosts文件(以记事本的方式打开)。然后加上以下内容203.208.46.146 http://dl.google.com 和203.208.46.146 http://dl-ssl.google.com。

(2) 其次需要添加镜像,步骤如下:

启动 Android SDK Manager ,打开主界面,依次选择『Tools』、『Options…』,

弹出『Android SDK Manager – Settings』窗口;

在『Android SDK Manager – Settings』窗口中,在『HTTP Proxy Server」和「H

TTP Proxy Port』输入框内填入镜像服务器地址(不包含http://,如图2.2)和端口,并且选中『Force https://... sources to be fetched using http://...』复选框。设置完成后单击『Close』按钮关闭『Android SDK Manager – Settings』窗口返回到主界面;

依次选择『Packages』、『Reload』。

图 2.2 SDK添加镜像

2.2 关键技术的实现

2.2.1 百度地图API key的获取

  1. 登录百度帐号
    访问API控制台页面,若您未登录百度账号,将会进入百度账号登录页面,如图2.3所示。

图 2.3 登录百度帐号界面

  1. 登录API控制台
    登录会跳转到API控制台服务,具体如图2.4所示。

图 2.4 登录API控制台界面

  1. 创建应用
    如图2.5,点击”创建应用”,进入创建AK页面,输入应用名称,将应用类型改为:“Android SDK”,如图2.6所示。

图 2.5 应用列表界面

图 2.6 选择应用类型界面

  1. 配置应用
    应用类型选为“Android SDK”后,需要配置应用的安全码,如图2.7所示。
  2. 获取安全码

输入“安全码”。安全码的组成规则为:Android签名证书的sha1值+“;”+packagename(即:数字签名+分号+包名)。注意:中间的分号为英文状态下的分号!您可以通过两种方法来获取Android签名证书的sha1值:(需事先配置好Android环境)

获取sha1值

第一种方法:使用keytool

第1步:运行进入控制台,如图2.8所示。

第2步:定位到.android文件夹下,输入cd .android,如图2.9所示。

图 2.7 创建应用界面

图2.8 cmd界面

图 2.9 .android路径下

第3步:输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android,在图2.10中输入),例如:其中keytool为jdk自带工具;keystorefile为Android 签名证书文件。

图 2.10 输入密钥口令

最终得到的sha1值如图2.11所示。

图 2.11 sha1值

第二种方法:在eclipse中查看

windows -> preferance -> android -> build。如图2.12所示。

图2.12 eclipse查看sha1值

获取包名

包名是Android应用程序本身在AndroidManifest.xml 中定义的名称,如图2.13所示红色部分。

图2.13 包名

随后就可以在开发中使用所申请的key值了。

2.2.2 Android定位

  1. 导入库文件

在相关下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中,建议全部放入,程序兼容性会大大提升,将locSDK_5.X.jar文件拷贝到工程的libs目录下,这样您就可以在程序中使用百度定位SDK了。

(2) 设置AndroidManifest.xml

每个app拥有自己单独的定位service,需要在application中添加如图2.14所示的内容,用来声明service组件。

图 2.14 service组件

(3) 声明使用权限。具体内容如图2.16所示:

(4) 设置AcessKey

使用SDK5.0需要在Mainfest.xml设置Accesskey,设置有误会引起定位和

地理围栏服务不能正常使用,必须进行Accesskey的正确设置。

通过在application标签中加入如图2.15所示的内容来设置AccessKey。

图 2.15 key值设置

图2.16 使用权限

3 需求分析

3.1 需求概述

随着信息技术的进步,人们所要求的生活质量不断提高,尤其是移动端互联技术的快速发展,电脑端的查询已经无法满足人们的需求了,获取便捷、有效信息的及时性和方便性已经成为人们的基本要求。本系统的主要目的是为旅游服务提供一种便于携带操作方便的导航系统,用于太原市的旅游景点。还能够提供快速的景点信息查询、写微记并进行QQ或者朋友圈分享以及地图导航等功能。

3.2 可行性分析

3.2.1 系统可行性

伴随着经济不断发展,旅游产业也蓬勃发展,人们旅游的次数越来越多。有计划性的假期远游,去外省甚至出出国;还有就是在平时的节假日周末在周边旅游景点即兴出游。人们需要一款了解景点信息的便携式设备的软件。针对太原市景点的推荐系统,开发在移动端,极大的方便了游客在太原市内以及周边景点的出行。

3.2.2 技术可行性

PC端即使可以查看景点信息,但是出行在外,携带PC断,不太方便;手机上网也可以查看景点信息,但是信息比较分散。该软件是针对太原市景点信息的收集,基于移动端的android平台进行开发。Android技术是开源的,研究开发很方便,一般大型的项目庞大的数据都是使用SQL Server或者Oracle数据库,但是Android端一般都是小型的数据,使用MySql或者SQLite数据库,本系统使用的就是轻型数据库SQLite,地图定位导航使用百度地图SDK,这些都是免费提供给开发者使用的。系统开发好之后,进行打包,将apk文件安装到手机上,就可以进行使用。每一个景点信息都是通过数据库保存,所以查询景点信息不需要联网,就可以查询相应的景点信息。只有在微记进行分享以及定位导航的时候需要进行联网。所以说基于Android的太原市景点推荐系统的技术是非常可行的。

3.3 系统需求分析

景点推荐系统主要是以文字和图片的形式为大家提供服务,同时拥有友好方便快捷的操作界面,Android系统现在己经在广泛的应用于手机领域。本系统主要针对Android手机,充分利用Android的优势开发一款针对太原市景点的推荐系统。其需求包括:

(1) 用户界面:初始化用户界面主要用于向用户展示粗略的景点信息。景点信息以列表形式显示,图文并茂。还有图片轮显,以及一些功能控件。

(2) 景点信息:用户界面是对景点的粗略展示,点击单一景点,就会进入相应的

景点的详细介绍,展示了关于这个景点的多个信息数据。为了满足用户的需求,提高体验度,增加了进入上一个景点、下一个景点按钮,方便用户快速浏览多个景点信息。

(3) 搜索景点:为了方便用户快速查找相应的景点,增加了搜索景点功能,点击

搜索框,进入搜索界面,为了使用户体验更人性化,还增加了搜索历史纪录以及删除搜索历史记录功能,以及友好性提示。

(4) 写微记:游客出行结束后,难免会有游行心得,故增加了写微记模块,也就

是一个简单的记事本功能,可以记录心得。为了更加人性化,增加了分享功能,比如分享给QQ好友、朋友圈等,增加用户体验。

(5) 地图导航:利用百度地图api,增加每个景点的地图导航功能,方便用户出行,

实现路径规划,实时导航。

3.4 外部接口需求

现在移动端的地图开发只能有两个选择,一个是Google地图,一个是百度地图,使用百度地图写好的接口,直接进行二次开发使用就可以了[10]。

3.5 性能需求

手机软件要有良好的用户体验,良好的用户体验体现在以下几个方面:

(1) 界面友好

用户界面要简洁直观,设计合理,方便用户操作,让用户操作起来比较舒服,并且UI视觉效应好。

(2) 快速响应

快速处理用户的输入或请求,对于需要长时间处理的部分就会对用户进行友好提示,告知用户该操作正在运行,或者使用进度条,让用户进行等待。

  1. 有好提示

当一些操作无法在进行下去的时候,就会进行相关提示。

(4) 屏幕适配

适合多个版本以及不同分辨率的屏幕。

3.6 安全需求

Android所设计的应用,在默认情况下,是没有权限对其他应用程序、操作系统或者用户进行有害操作。例如连接网络、访问通讯录、访问短信和通话记录、读取用户的一些隐私数据,还有保持设备活动等等的操作。在开发过程中,必须在清单文件的代码中声明这些权限,如果没有进行这不操作,应用在运行过程中执行需要权限才可以执行的操作时,就会直接崩掉[8]。即使授予了权限,在应用执行需要权限的操作时,Android系统本身也会友好提示应用正在执行某操作,询问是否允许。

3.7 软件环境

操作系统:Android1.5以上;

数据库:SQLite;

开发工具:Android ADT,DDMS,Eclipse

4 概要设计

4.1 系统总体设计

4.1.1 系统架构设计

本系统设计的基于Android的太原市景点推荐系统,主要包括微记模块、搜索模块、主界面、内容模块以及导航模块等。如图4.1:

图4.1 系统结构图

4.1.2 系统结构

  1. 初始化界面主要用于向用户展示粗略的景点信息,包括跳转微记按钮、景点搜索框、景点图片的轮显、已经景点信息列表等。如图4.2:

图 4.2 用户界面结构图

  1. 搜索界面主要用于用户快捷搜索指定的景点,然后查看景点信息,结构如图4.3所示。搜索框在不为空的情况下(也就是输入内容之后),可以进行清空;点击搜索按钮,列表界面会显示搜索内容的列表;默认情况下列表内容是显示搜索记录列表,而且还带有清空历史记录按钮,使功能更加人性化。

图 4.3 搜索界面结构图

  1. 写微记界面结构如图4.4所示,主要是显示微记的列表,其中的操作按钮还有以下功能,如图4.5所示,点击写微记,就会进入微记界面,点击删除,就会进入删除微记界面,可以批量删除。

图 4.4 微记界面结构图
(4)微记界面有一个大的区域,还有一个分享按钮,可以通过选择分享到QQ还是分享到朋友圈;再有就是一个选择背景颜色的dialog弹框,可以更换背景颜色。完之后,点击手机的返回键即可自动保存操作。
(5)景点信息界面主要是从八个方面展示一个景点大部分系信息,如图4.6,有名称、介绍、类型、建议游玩时间、门票价格、开放时间以及地址。景点介绍只在界面展示了一部分,点击详细信息按钮,可以弹出对话框展示全部的景点介绍。为了方便快速浏览其他景点,就添加了两个按钮“上一个”和“下一个”;而且还有导航按钮,可以进入地图,实现导航。

图 4.5 微记界面操作按钮结构图

图 4.6 景点信息界面结构图
4.2 系统接口设计
现在的Android开发者越来越多,很多Android系统的应用程序也都需要进行地图开发,使用定位、导航等功能。国内开发者大多数使用百度地图API进行地图开发,这是百度免费提供给开发者的接口。提供基本地图展现、搜索、定位、逆/地理编码、路线规划、LBS云存储与检索等功能,适用于PC端、移动端、服务器等多种设备,多种操作系统下的地图应用开发。
4.3 数据存储设计
Android系统的数据存储方式主要有四种,分别是:SharedPreference、SQLite、ContentProvider以及文件存储[9]。在本系统中,综合运用了多种存储方式,从而达到数据及时高效地保存共享。
4.3.1 ContentProvider存储
Content Provider,即内容提供商或者内容提供器。
在Android中,ContentProvider是一种数据包装器,适合在不同进程间实现信息的共享。例如,我们可以用ContentProvider来封装以SQLite作为的数据源,这样就可以很好的为其他应用提供信息共享服务。其他应用在访问ContentProvider时,可以使用一组类似REST的URI的方式进行数据操作,大大简化了读写信息的复杂度。例如,如果要从封装图书数据库的ContentProvider获取一组图书,需要使用类似以下形式的URI:content://com.scott.book.BookProvider/books而要从图书数据库中获取指定图书(比如23号图书),需要使用类似以下形式的URI:content://com.scott.book.BookProvider/books/23。
ContentProvider是一个抽象类,定义了一系列操作数据的方法模板,BookProvider需要实现这些方法,实现图书信息的各种操作。
现在知道了具体的URI之后,我们又如何操作进而取得数据呢?此时,我们就要了解ContentResolver这个类,它跟ContentProvider是对应的关系,我们正是通过它来与ContentProvider进行数据交换的。android.content.Context类为我们定义了getContentResolver()方法,用于获取一个ContentResolver对象,如果我们在运行期可以通过
getContext()获取当前Context实例对象,可以通过这个实例对象所提供的getContentResolver()方法获取到ContentResolver类型的实例对象,进而可以操作对应的数据。
ContentProvider对于Android应用而言,组件必须相互独立,如果这些Android应用之间需要实现实时的数据交换。例如我们开发里一个发送短信的程序,当发送短信时需要从联系人管理应用中读取指定联系人的数据—-这就需要多个应用程序之间进行实时的数据交换。
4.3.2 SQLite数据库存储
在Android开发项目中生成的SQLite数据库会保存在各自的应用程序目录下,例如/data/data/<package name>/databases[14] 。应用程序生成的数据库文件是私有的,只有创建这个数据库的应用程序可以访问,进行增删改差[15]。如果需要在其他应用程序中访问,就需要使用ContentProvider。
5 详细设计
5.1 界面设计
Android系统定义了4个重要的组件,分别是Activity、Intent、ContentProvider以及BroadcastReciver[6]。
Activity是Android应用中负责与用户交互的组件——大致上把它想象成Swing编程中的JFrame控件。不过它与JFrame的区别在于:JFrame本身可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显示指定组件
太原市景点推荐系统的界面由Android Activity构成,通过Intent、Servcie 和ContentProvider完成与Android系统框架的交互。
5.1.1 主界面设计
系统启动后进入SplashAcitivty设计的界面,只显示一张图片,两秒后会自动跳转到主界面,如图 5.1 所示。在这个界面主要包括三部分:自定义标题栏、图片轮显以及景点列表。主界面被设计成MainActivity类,首先要设计自定义标题栏就要把原有的标题栏取消掉,在代码中的setContentView()方法前面加上requestWindowFeature(Window.FEATURE_NO_TITLE);这样就可以设置无标题模式,然后根据自己的需要进行标题栏布局。
图片轮显是通过ViewPager来实现的,找几张固定图片资源,加载到ViewPager控件中,然后通过scheduleAtFixedRate()方法控制执行频率,调用线程每3秒切换一次图片。
ListView是列表形式,景点列表就是通过这个控件来显示的,列表的每一条称为一个item,每一个item都显示了一张图片,已经景点名称和简略的景点介绍。布局采用的是相对布局RelativeLayout,显示图片用的是ImageView控件,将图片放在res/drawable目录下,通过TextView显示两条文字信息,而且设置android:maxLines=”2″属性来控制最大显示两行。

图5.1 主界面 图5.2搜索记录界面
5.1.2 搜索界面设计
搜索界面设计成SearchAcitivty类,界面主要显示一个搜索框,搜索按钮,以及标题栏下方的列表。标题栏下方的列表有两个ListView,但是这两个ListView不会同时显示,进入搜索界面主要显示的搜索记录列表,根据输入框内容搜索到的相应景点的列表,只有在点击搜索按钮之后才会出现,如图5.2所示,实现这个效果所用的方法是setVisibility(int visibility)。所传值为View.VISIBLE或者View.GON;顾名思义,gone是隐藏,visible是显示,根据逻辑判断来决定是显示还是隐藏。
因为查询数据库比较耗时,为了方便搜索,将所有景点的名称都写在了JingdianName类中的String类型的names数组中。查询式只需要先和names数组中的值匹配。如5.3所示,输入“迎泽”,点击搜索之后,会出现两个值,这是通过for循环遍历names数组,挨个调用contains()方法,判断是否包含输入的字符,然后把所有满足条件的值都取出来,然后放到list集合中,最后添加到ListView进行显示,如果没有搜索到相应的景点,会通过Toast提示“没有该景点”。而且点击搜索按钮之后,会将输入的值存入数据库的表history中。最后会显示在历史记录的ListView中。当点击清除历史记录按钮的时候,会调用db.execSQL(“delete from ” + Contance.HISTORY_TABLENAME),来删除表数据,但是不会删除表结构,这样只清空数据,之后还可以继续保存。

图 5.3 搜索内容界面 图5.4 景点信息界面
不管是历史记录列表,还是搜索内容列表,点击条目,会调用equals(),对names进行判断,查询是否有一样的值,如果没有,就会提示没有该景点,如果有的话,就会查询数据库,跳转到相应的景点信息界面。
5.1.3 景点信息界面设计
景点信息界面设计成了SingleActivity,如图5.4所示,景点信息界面8个字段名称对景点进行介绍,通过点击返回按钮,会返回到主界面,点击按钮“上一个”和“下一个”会切换到相应的景点,顺序和主界面的景点列表的景点排列顺序是一致的。当到达第一个或者最后一个景点的时候,分别判断id==1和id==JingdianName.names.
length是否成立,然后提示“已经是第一个景点了”和“已经是最后一个景点了”。由于景点介绍内容比较多,如果全部罗列出来就会使界面有点长,所以设置景点信息的属性android:maxLines=”4″,即最大行数为4,android:ellipsize=”end”属性是设置超出的部分显示省略号,“end”值是将省略号显示在结尾。在此添加了“[详细介绍]”,点击之后会显示如图5.5所示的内容:

图 5.5 景点介绍详细信息
这是一个自定义对话框AlertDialog。首先自定义一个布局,然后通过下列代码将这个view填充到dialog中:
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 获得layout的填充器
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.content_dialog, null);
builder.setView(view);
右上角有个图片按钮,点击的时候,就会调用dialog.dismiss()方法,关闭对话框。“上一个”和“下一个”按钮,判断点击按钮的id,当点击上一个按钮的时候,就会传值-1,当点击下一个按钮的时候,就会传值1,然后将当前景点的id和传入的值进行运算,得到新的id,然后查询数据库,刷新界面的值,由于刷新UI容易造成阻塞,所以通过Handler进行实现,
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,换一种说法,发送消息和接收消息不是同步的处理。主线程中做耗时操作,会造成阻塞,非主线程中更新UI会报错。 一般处理相对耗时比较长的操作,都用到了这种机制。
只要在需要执行刷新操作时,Message msg = new Message();得到一个Message,然后设置标识符msg.what = 100;然后设置传送的数据msg.obj = list;(要提前把查询到的数据库的各个字段信息放到list集合中),最后调用handler.sendMessage(msg);来发送数据。在外围new一个handler,然后通过匹配标识符,然后执行setText()来重新设置显示信息的值。
界面还有一个“到这去”的选项,点击这个就会跳转到导航界面,进行导航。
5.1.4 微记模块设计

    1. 微记主界面设计成WeijiActivity,如图5.6所示,主要是由微记列表和操作按钮选项组成的。微记列表是用ListView控件显示的,主要显示内容、日期和时间这三个内容。当点击操作按钮之后,会弹出如图5.7所示的自定义dialog。

图 5.6 微记界面 图5.7 微记操作选项
dialog有三个选项,分别是写微记、删除和取消。对dialog视图实现的步骤如下:
① 首先获得视图
② 指定dialog的主题风格
③ 设置dialog的视图view,并给定宽高
④ 调用getWindow(),表示获得这个Activity的Window对象,这样这可以以同样的方式改变这个Activity的属性.
⑤ 设置显示动画
⑥ 保证按钮水平满屏
⑦ 设置显示位置
⑧ 设置点击外围解散
这三个选项都是以按钮控件实现的,背景和点击效果需要设置按钮的属性android
:background=”@drawable/pop_dialog_cancel_selector”,只需要在res/drawable下写上相应的xml文件。对于设置按钮的圆角corners,设置各个角的radius为5dp即可。对于按钮的按下pressed以及获得焦点focused等的效果,需要用到selector背景选择器进行设置。
对于dialog的弹入弹出效果,需要用动画来实现,只需要在res文件夹下创建anim文件夹,在其中写下相应的xml文件,文件内容如下:
<translate
android:duration=”500″
android:fromXDelta=”0″
android:fromYDelta=”1000″
android:toXDelta=”0″
android:toYDelta=”0″ />
Duration是设置延迟时间,意思是500ms之后执行动画,其他属性是设置动画弹出的X轴和Y轴的起始位置。

    1. 单击dialog的删除按钮,会进入删除微记界面。删除微记界面是设计成了WeijiDeleteActivity。如图5.8所示,界面主要是由列表和两个按钮组成的。列表的每一项都是由内容和一个CheckBox组成的,CheckBox的初始状态是默认不选中的,只需要设置属性android:isChecked=”false”.当大量选中需要删除的微记的时候,用isSelected是否被选中来将这些状态都保存在了一个Map集合中,最后点击确定按钮的时候,传递这些选中的值,将微记显示页面的对应的微记删除掉。然后重新查询数据并显示新的列表。

图 5.8 删除微记界面

    1. 当点击写微记按钮或者直接点击微记,都会进入微记界面。不过不同的是,点击写微记,进入的是空白的微记界面;当直接点击微记,会显示如图5.9所示的界面,原本内容都会显示在里面。微记界面被设计成了WeijiNoteActivity,主要显示左上角的时间,以及分享按钮、更换背景颜色按钮,以及一个区域框。

图 5.9 微记界面

 左上角的时间是获取的系统当前时间,实现获得日期的代码内容如下:

public static String getDate() {

Calendar c = Calendar.getInstance();

int theYear = c.get(Calendar.YEAR) – 1900;

int theMonth = c.get(Calendar.MONTH);

int theDay = c.get(Calendar.DAY_OF_MONTH);

return (new Date(theYear, theMonth, theDay)).toString();

}

获得时间的代码如下:

public static String getTime() {

Calendar c = Calendar.getInstance();

int theHour = c.get(Calendar.HOUR_OF_DAY);

int theMinute = c.get(Calendar.MINUTE);

int theSecond = c.get(Calendar.SECOND);

return (new Time(theHour, theMinute, theSecond)).toString();

}

( 点击右上角的分享按钮,会出现如图5.10所示的样子。

图5.10 微记分享界面

实现这个功能不只需要如下几行代码即可:

private void shareNote() {

String strContent = et_content.getText().toString();

Intent intent = new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_TEXT, strContent);

intent.setType(“text/plain”);

this.startActivity(intent);

}

Intent是意图,可以接受相应意图的程序,都可以调用。

 右上角还有设置背景颜色的按钮,点击就会弹出五种颜色供选择,背景不是直接设置颜色,而是由图片构成。对颜色选择进行监听,当选取颜色的时候,首先获得对应颜色图片的id,然后赋值给mBackgroud_color,最后调用setBackgroudResource

(mBackgroud_color)方法,设置背景颜色。

最后点击返回键的时候,就会保存一切数据,不过首先判断是新建的微记,还是更新的微记。需要通过ContentValues保存的字段有内容、日期、时间以及背景颜色四个值,微记通过ContentProvider保存的,访问ContentProvider程序通过ContentResolver接口可以访问ContentProvider共享的数据,在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例,最后通过调用ContentResolver的insert()方法,将保存的ContentValues中的数据,通过匹配相应的uri进行保存更新。

5.1.5 定位导航模块设计

为了满足自驾游,开发了定位导航模块。定位界面主要设计成LocationActivity,当从景点信息界面进入到导航界面的时候,就会获取当前进入时所在的景点名称。例如,在汾河公园的信息界面,点击按钮“到这去”,就会进入定位界面,首先是通过

putExtra(key,value)方法传递景点名称,进入导航界面的时候,自动初始化Intent

Intent = getIntent();然后通过getStringExtra(key),匹配相应的key值,这就是所谓的键值对。获取到传递过来的景点名称,通过setText()方法,自动将终点景点设置成目的地。起点是获取当前的位置,如果不获取当前的位置,直接点击导航,会通过equals()方法判断起点的EditText是否空值,(所谓的空值是字符串长度为空,而不是null,只有当没有初始化的时候,才会为空,否则只是长度为空),如果为空的话,就会通过Toast提示“请先定位当前位置”,如图5.11所示。

图 5.11 定位之前界面 图5.12 定位之后界面

起点的EditText中已经给了提示“点击获取我的位置”,这是通过设置hint现实的,而且设置属性android:textColorHint=”#0000FF”设置显示颜色为蓝色。而且设置了起点和终点的EditText属性android:focusable=”false”,也就是不能获得焦点,当然也就不可以。然后只设置了onClickListener监听事件对其进行监听。当点击的时候,就会调用定位代码进行定位。这个过程总共获取三个值,一个是当前地址addr,一个是经度Longitude,还有一个是纬度Latitude。当时只将当前地址addr显示在起点的EditText框中,结果如图5.12所示。经纬度保存起来,用来传递到导航界面,进行导航。

当定位到当前位置的时候,点击开始导航按钮,就会进入路线规划界面。界面设计成RoutePlanActivity。起点是当前位置,终点是景点名称,进入界面首先会自动算路,通过设置算路结果监听器IRouteResultObserver,可以获取算路的结果,起点的经纬度是定位界面定位之后,保存起来,然后通过Intent传递到算路界面,终点的经纬度是事先将45个景点经纬度,分别写到double类型的数组longitude和latitude中。得到景点名称,然后通过for循环遍历存放景点名称的names数组,得到所在位置的position,然后去除longitude和latitude相应position的值,用来作为导航终点的经纬度。

经纬度是double类型的,要通过计算得到int类型的经纬度,代码如下:

sX = (int) (nowLatitude * 1e5);

sY = (int) (nowLongitude * 1e5);

eX = (int) (endLatitude * 1e5);

eY = (int) (endLongitude * 1e5);

得到起点和终点的地址和经纬度之后,就可以进行算路了:最后的算路结果如图5.13所示。

图5.13 算路界面 图 5.14 导航过程

导航的语音播报是可以选择的,可以选择是否需要语音导航,只要加上libejTTS.so

就可以实现语音播放了。

算路成功后会获得算路结果RoutePlanModel,然后即可以根据算路结果发起导航,导航方式分为模拟导航和真实GPS导航两种。进入到模拟导航或者GPS导航后,点击转向标按钮即可以切换到文字导航,在文字导航界面,可以切换到HUD模式。选择模拟导航,会自动播放一遍导航过程,语音播报方向、距离、路况、减速限速等。

导航过程如图5.14所示。

5.1.6 返回键的监听

Android手机一般都自带三个操作键,分别是Back键、Home键以及Menu键。这些键都是为了方便用户操作手机。每个应用程序想要用户在程序界面点击这些操作键达到预期的效果,都需要进行监听。Home键和Menu键可以不设置,但是绝大多数Back键都设置,应为Back对于应用程序多页面之间的逻辑切换起到了至关重要的作用。点击返回键的之后,需要返回到哪个界面,当前界面是否finish()掉,执行什么操作,都是需要对返回键进行监听,在相应的重写方法中执行所需代码。

直接获取按钮按下事件,此方法兼容Android 1.0到Android 2.1 也是常规方法,直接重写Activity的onKeyDown方法即可。

本系统中用到了连续按下两次返回键退出程序的方法。只需要判断是按下的返回键,然后进行“再按一次退出程序”提示,监听是否在2秒内又一次按下返回键,如果是就会执行System.exit(0)退出程序。代码如下:

private long exitTime = 0; // 返回键退出的时间

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK

&& event.getAction() == KeyEvent.ACTION_DOWN) {

if ((System.currentTimeMillis() – exitTime) > 2000) {

Toast.makeText(getApplicationContext(),”再按一次退出程序”,Toast.LENGTH_SHORT).show();

exitTime = System.currentTimeMillis();

} else {

finish();

System.exit(0);

}

return true;

}

return super.onKeyDown(keyCode, event);

}

而对于Android 2.0开始又多出了一种新的方法,对于Activity 可以单独获取Back键的按下事件,直接重写onBackPressed方法即可。

5.2 数据库设计

本系统的数据库中用到的表主要是存放景点信息的表jingdian、存放搜索历史记录的表history以及存放微记内容的表noteitems。

5.2.1 景点信息表jingdian

景点信息表jingdian的表结构如表5.1所示,加上id总共有9个字段,id是用来查询的,其他8个字段是用来存放需要显示的数据库。

表 5.1 景点信息表

字段名称数据类型非空含义
_idintegerNPK景点ID
mingchengtextY景点名称
jieshaotextY景点介绍
leixingtextY景点类型
jijietextY最佳季节
jianyitextY建议游玩
menpiaotextY门票价格
shijiantextY开放时间
dizhitextY地址

Jingdian表是事先生成了“jingdian_db”数据库中,说明这个一个外部资源文件。Android要使用外部资源文件一般有两种方法,分别是:

  1. 第一种是res目录下存放的可编译的资源文件:
    这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;
  2. 第二种是assets目录下存放的原生资源文件:

因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通R.XXX.ID的方式访问它们。我们不能通过该资源的绝对路径去访问它们,因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/res和被绑定在apk里,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有。

不过Android系统提供了一个AssetManager工具类,它提供对应用程序的原始资源文件进行访问;这个类提供了一个低级别的API,它允许以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。通过getAssets()方法获取AssetManager对象。

我们首先要做的是把数据库文件“jingdian_db”复制到代码工程的assets文件夹下,assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。

  1. 先在Activity里面调用getAssets()来获取AssetManager引用。

(2) 再用AssetManager的open(String fileName)方法则指定读取的文件以及访问模式就能得到输入流InputStream。

(3) 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。

(4) 调用AssetManager.close()关闭AssetManager。

这种形式的导入之后,打开数据库的方式也不一样,不是SQLiteDatabase db = getWritableDatabase()/getReadableDatabase();而是SQLiteDatabase sqLite = SQLiteData

base.openOrCreateDatabase(data/data/包名/files/数据库名称, null);随后就可以其他方式

一样读取数据库了。

5.2.2 搜索记录表history

搜索记录表history很简单,只有两个字段,一个是_id,一个是h_name字段,只需要在第一次搜索的时候创建数据库,并建立history表,之后每次清空搜索记录的时候,只删除表数据,不删除表结构,就不用在创建数据库了。

public static final String HISTORY_TABLENAME = “history”;

public static final String CREAT_HISTORY = “create table ” + HISTORY_TABLENAME+ “(_id integer primary key autoincrement, h_name text not null)”;

db.execSQL(Contance.CREAT_HISTORY);

表结构如表5.2所示:

表 5.2 搜索记录表

字段名称数据类型非空含义
_idintegerNPK存放ID
h_nametextY景点名称

5.2.3 微记内容表 noteitems

微记内容表noteitems有5个字段,创建语句如下:

String sql_noteitems = “CREATE TABLE ” + TABLE_NOTEITEMS + ” (“

+ NoteItems._ID + ” INTEGER PRIMARY KEY AUTOINCREMENT ,”

+ NoteItems.CONTENT + ” TEXT,” + NoteItems.UPDATE_DATE

+ ” TEXT,” + NoteItems.UPDATE_TIME + ” TEXT,”

+ NoteItems.BACKGROUND_COLOR + ” INTEGER,”

+ ” INTEGER” + “);”;

db.execSQL(sql_noteitems);

表结构如表5.3所示:

表 5.3 微记内容表

字段名称数据类型非空含义
_idintegerNPK微记ID
contenttextN微记内容
update_datetextN微记日期
update_timetextN微记时间
backgroud_colorintegerN背景颜色ID

6 测试

6.1 主界面加载问题

主界面的景点信息列表是以图片+文字的形式展示的,图片存放在res/drawable目录下,进入主界面的时候,ListView需要填充数据并显示,这是就要加载文字和图片资源。加载文字并没有什么,但是由于图片有将近50张,每一张图片有100kb左右。一次性加载大量资源是会耗时的,有时会加载不成功,即使加载成功了,滑动起来会非常的不流畅,有时候直接造成ANR(系统无响应:应用一般在5s后还是没有反应,就会抱着个错,然后程序会自动退出)。通过Log信息查看错误信息,报的错误是OOM(out of memory:内存溢出,也就是所谓的内存耗尽)。

这时的就用到了“二次裁剪”。顾名思义,二次裁剪就是对图片进行加工,是图片占用的内存更小。

Bitmap是Android系统中图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。利用Bitmap-

Factory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options。利用Options的下列属性,可以指定

decode的选项:

  1. inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义

在Bitmap.Config中。缺省值是ARGB_8888。

(2) inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,即

decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。

(3) inSampleSize 设置decode时的缩放比例。

先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息;利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据。先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。

具体步骤如下:

① 给定BitmapFactory设置解码的参数

② 从解码器中获取原始图片的高度,这样就避免了直接申请内存控件

③ inJustDecodeBounds如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,

④ 但是Options的outAbc中解出了图像的基本信息。

⑤ 设置属性inSampleSize,值表示缩略图大小为原始图片大小的几分之一

⑥ 压缩完后便可以将inJustDecodeBounds设置为false了

6.2 景点信息界面dialog显示问题

景点信息界面的景点介绍是通过dialog显示,由于内容多的时候,dialog也无法一次性显示这么多内容,所以需要加上滚动条ScrollView,否则下方的内容不显示。由于设置属性不当,但只最下方的一行没有显示出来,也就是无法滚动到最低端,

原因是在TextView中设置了Androidᄃ:layout_marginTop=”20dp”,导致marginTop之后,scrollView初始显示的位置向下移动了20dp,为了让它正常显示,最后在代码里面设置一下scrollView的初始显示位置就可以了。

7 结论

未来的社会越来越智能化以及信息化,新技术越来越多,手机终端已经成了信息化和智能化的载体。

基于Android的太原市景点推荐系统是为了满足对太原市旅游景点信息的空间信息的直观表示的需求,整合了太原市景点的资源,根据客户需求的功能进行了详细的设计与是实现。本文为了方便游客分享出行新的,增加了微记模块并且实现了分享功能;为了方便旅客出行,增加了导航模块,快速定位当前位置,并规划合理路线进行目的地的导航。

基于Android的太原市景点推荐系统只是一个初具模型的应用,创新程度以及技术能力有限。后期发展可以继续优化界面功能,以及一些算法。为了增强互动性,增加用户登录功能,使用服务器交互数据,用更多的图片来展示景点的风貌。地图方面不断的完善,进行定点查询,更加精准的定位以及导航。为了适应更多的平台,进行IOS断开发,以及网页端的开发。最后加上景点周围的美食、酒店等资源,使本系统更加贴近生活,功能更加完善,平台更加广泛,方便大家的旅游生活,增加旅游乐趣。

参考文献

[1] 崔玥.蓉城旅游管理系统设计与实现[D].四川:电子科技大学,2013.

[2] 陈德武,魏新建,王万里.基于安卓的西北地区旅游信息查询系统[J].中国石油勘探开发研究院西北分院地球物理研究所,2014,(01):74.

[3] 孙国平.基于Android的景区景点路线推荐服务研究[J].沈阳市勘察测绘研究院,2014,(04):72.

[4] 吴晓红.基于Android的旅游景区自助导游系统的设计与实现[J].新疆大学信息科学与工程学院,2013,(28):61.

[5] 廖克书,胡涛,罗锋.基于Android的恩施大峡谷移动旅游景点综合系统的应用

研究[J].湖北民族学院信息工程学院,2013,(18):23-24.

[6] 夏飞阳.基于Android手机平台的自助旅游系统的的设计与实现[D].广东:华南理工大学,2012.

[7] 侯风波.基于Android系统的徐水旅游信息系统地实现[D].四川:电子科技大学,2012.

[8] 贺全荣.暑期自助游手机来搞定[J].2012,(11):28.

[9] 郭霖.第一行代码–Android[M].北京:人民邮电出版社,2014:2-3.

[10] Landscape Studies at Sutton Common(South Yorkshire),and Meare Village East(Somerset)[J].Journal of Archaeological Science,2001,28:365-375.

[11] 青岛东合信息技术有限公司.Android程序设计[M].北京:电子工业出版社,2012.2:24-25,

187-193.

[12] 窦长娥,刘仁义,刘南.基于 ArcIMS 的旅游地理信息系统设计与实现[J].计算机应用研究,2006,25(3):160-164.

[13] Visval ingam.M.Visualization in GIS,Cartography and Visc Visualization in Geographical Information System.Edited by Hilary M.Hearnshaw&David J.Urwin.1994.P18-25.

[14] http://www.sqlite.org/releaselog/3_7_10.html SQLite Release 3.7.10 On 2012 January 16.

[15] 王倩, 基于 C/S 结构的内存数据库研究与设计[D].东北大学:东北大学,2008.

致谢

首先要感谢指导教师刘海静老师,对我的多次指导。我深深受益于老师的关心、爱护和谆谆教导。她作为老师,点拨迷津,让人如沐春风,获益匪浅。能在刘海静老师的指导监督下完成大学最后的任务,我为自己感到庆幸。在此谨向老师表示我最诚挚的敬意和感谢!

我还要感谢所有教导过我、关心过我的老师。我的班主任张麟华老师以及太原工业学院教育过我的老师们。你们为我的学业倾注了大量心血,你们为人师表的风范令我敬仰,严谨治学的态度令我敬佩。

在此要感谢太原工业学院,给了我一个宽阔的学习平台,让我不断吸取新知,充实自己。

最后需要特别感谢的是我的父母。父母的养育之恩无以为报,他们是我十多年求学路上的坚强后盾,在我面临人生选择的迷茫之际,为我排忧解难,他们对我无私的爱与照顾是我不断前进的动力。

谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数图互通公用房基础数据管理与维护

公用房情况信息化&#xff0c;包括公用房位置、面积参数等&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现二级单位对分配公用房的管理&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现公用房使用人&#xff0c;对使用公用房的管理&#…

C++ Reference: Standard C++ Library reference: Containers: list: list: clear

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/clear/ 公有成员函数 <list> std::list::clear C98 void clear(); C11 void clear() noexcept;清除内容 从list容器中删除所有元素&#xff08;已销毁&#xff09;&#xff0c;并将容器的size保留为…

设计模式-外观模式

前言 在聊外观模式之前&#xff0c;我们先来聊聊体检过程。一般体检过程就是我们根据网上预定得日期空腹去体检中心。根据预定得项目&#xff0c;有一般检查、内科、外科、眼科、彩超、心电图、血常规、尿常规等等项目。 而我们往往第一次去是不知道这些房间是在哪里的&#…

XenServer7.6安装教程

XenServer7.6安装安装步骤其他XenServer 7.0 系统 yum 出错解决办法XenServer其他部署问题安装步骤 进入系统启动界面 > 按回车&#xff0c;等待加载&#xff1a; 1、键盘布局选择 > 选择us&#xff1a; 2、欢迎界面 > 选择ok&#xff1a; 3、用户协议 > 选…

【大数据入门核心技术-Flume】(三)使用Flume采集数据到HDFS

目录 一、准备工作 1、Hadoop环境安装 2、Flume安装部署 二、采集数据到HDFS 1、配置任务文件 2、启动传输 3、查看是否同步成功 三、常见问题 1、运行flume-ng agent时报错com.google.common.base.Preconditions.checkArgument 2、ERR: File name has been re-used w…

tomcat配置https

tomcat配置前提需要开放需要配置端口&#xff0c;尤其是云服务器需要单独去提供商控制面板放行好再进行配置HTTPS&#xff0c;常见配置的端口&#xff1a;443、8443&#xff0c;另外配置过程如果项目正常运行&#xff0c;建议备份一份配置文件。 tomcat配置https步骤 一、我们…

EEMD(集合经验模态分解)

1. EEMD(集合经验模态分解)的概念 EEMD(Ensemble Empirical Mode Decomposition)是最常见的一种EMD改进方法。他的优势主要是解决EMD方法中的模态混叠现象。 说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中…

更多自有品牌创新好物,尽在2023深圳国际自有品牌展暨新消品展

受整体环境的影响&#xff0c;以及内容购物、兴趣电商、O2O、团长等新消费方式崛起&#xff0c;传统商场、大卖场等实体零售市场发展呈下滑趋势。让零售行业可以重拾信心&#xff0c;迫切需要寻找新的业绩突破形式。这些年自有品牌&#xff0c;被越来越多的国内零售商所关注&am…

BL101助力于采集光伏电流电压

能源危机在世界范围内愈演愈烈&#xff0c; 俄乌冲突后&#xff0c;美国加大对俄罗斯能源的制裁力度&#xff0c;禁止从俄罗斯进口能源&#xff0c;也想办法让其欧洲盟友对俄罗斯进行抵制。导致油价高企&#xff0c;天然气价格也是一路飙升。各国都在发展新能源&#xff0c;风电…

【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

只要浏览器播放视频时用的是<video>&#xff0c;而且当前页面只有这一个视频&#xff0c;就可以用这个脚本。 刚好也是世界杯 CSDN 博客的活动了&#xff0c;虽然对活动没什么兴趣但是还是写一句和活动相关的话吧——世界杯为什么要看直播呢&#xff01;不如一起来倍速观…

ssm+Vue计算机毕业设计校园洗衣机预约系统(程序+LW文档)

ssmVue计算机毕业设计校园洗衣机预约系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

Linux内存查看通用方法(二): kernel空间

接上文&#xff1a; Linux内存查看通用方法&#xff08;一&#xff09;&#xff1a; user空间_红桃Jk的博客-CSDN博客_linux内存查看在嵌入式linux上&#xff0c;统计内存情况的一般方法https://blog.csdn.net/qq_34597963/article/details/126023451?spm1001.2014.3001.5501…

用 CSS 从零写一个时间轴效果

时间轴效果介绍 在前端开发中&#xff0c;我们会遇到一些场景特别适合用时间轴来展示&#xff0c;例如下面按照日期时间来记录发生的事件&#xff1a; 还可以做成下面这种比较流行的左右对称卡片风格的时间轴&#xff1a; 如果再稍加装饰&#xff0c;还能有更加高大上的效果&a…

跨域的部分理解

1、跨域的原理 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。 同源策略&#xff0c;是浏览器对 JavaScript 实施的安全限制&#xff0c;只要协议、域名、端口有任何一个不同&#xff0c;都被当作是不同的域。 跨域原理&#xff0c;即是通…

量子计算(十四):超导量子芯片

文章目录 超导量子芯片 超导量子芯片 超导量子计算是基于超导电路的量子计算方案&#xff0c;其核心器件是超导约瑟夫森结。超导量子电路在设计、制备和测量等方面&#xff0c;与现有的集成电路技术具有较高的兼容性&#xff0c;对量子比特的能级与耦合可以实现非常灵活的设计…

node.js按照和配置环境变量

下载地址 选择自己适合的版本 Download | Node.js 安装 傻瓜式安装就好了 安装完成后 查看是否安装成功 打开黑窗口 node -v npm -v 配置全局安装的模块路径和缓存路径 在nodejs根目录,创建node_global&#xff0c;node_cache文件夹 命令提示符 以管理员方式运行 我的目…

基于springboot疫情防控期间某村外出务工人员信息管理系统设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期…

Oracle建表与创建序列

目录 一、简单建表 二、查看表结构(在Xshell中输入才能够执行) 三、设置自增序列 (一)普通自增序列 1.创建序列&#xff0c;oracle中没有自增&#xff0c;创建序列相当于等差数列自增 2.删除序列 3.建表的同时设置主键自增的步骤 (二)复杂序列 1.复杂序列模板 2.复杂…

架构设计(二):数据库复制

架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 CSDN&#xff1a;架构设计&#xff08;二&#xff09;&#xff1a;数据库复制 在架…

100-数据结构与算法(下篇)

现在我们续写上一章博客的内容&#xff08;即99章博客的内容&#xff09; 快速排序&#xff1a; 同冒泡排序一样&#xff0c;快速排序也属于交换排序&#xff0c;通过元素之间的比较和交换位置来达到排序的目的 不同的是&#xff0c;冒泡排序在每一轮中只把1个元素冒泡到数列…