背景

当你刚上大学的时候,要想不迷失校园,除了依靠不怎么可靠的路边标识外,总会收到那么一张卡通绘制的校园地图:

这种静态图片可以让我们快速地了解到所需的地理位置信息,但使用和思考过后,会发现以下问题:

  1. 地理位置信息粒度高,而同一个地点通常具有多个服务功能和别名。
  2. 地理位置信息变更导致地图信息过时。一旦服务网点迁移或更名,需要重绘地图,带来一定的延迟和信息滞后。
  3. 入口较深。存储在手机上的地图并不是那么好找,尤其是随着时间的推移。
  4. 无法准确的定位当前所处位置,需要寻找参照物,这是静态地图致命的缺点。
  5. 缺乏更为详细的地点介绍,只能在有限的画面里堆积内容。

为此,我设计了一款校园导览应用,用当下流行的微信小程序结合云开发能力,低成本高效能地解决了以上问题。此外,我还根据对市面上的同类应用进行设计上的研究,在界面和交互设计上做功夫。下面我会进行简短的介绍。

南苑导览


南苑导览是一款由学生独立开发的以地图为载体,提供中山大学南方学院(南苑)具体地点的位置信息、导航、校园历史及文化介绍的小程序。旨在解决校园导航标识不到位、地图形式低效单一、信息设计不够好等问题,为来南苑新人和游客提供更加完美的出行体验。

仅需修改地图配置文件,即可适配任意场景(校园、景区)的小程序个性化地图定制。

技术栈:原生小程序 + TypeScript + gulp + vantUI + 云开发能力

2019 微信小程序高校大赛 · 华南赛区二等奖

南苑导览 · 开发

  1. config 配置
├─ src
├─── config
├───── index.ts // 入口
├───── cloud.ts // 云开发相关配置
├───── info.ts // 应用介绍信息
├───── markerStyle.ts // 地图marker样式
├───── panorama.ts // 第三方全景地图配置(个人类型无webview权限,默认关闭)
└───── secret.ts // 腾讯地图key等敏感信息(可选)
  1. 使用云数据库
// markers表 数据格式
{_id: "5ce8fe1c29c7a8581bc1e989",  // id,云数据库录入upsert更新用type: "生活服务",   // 场景名称icon: "shfw",     // marker默认图标,为场景名称拼音缩写scale: 15.0,   // 场景在地图上的缩放值,可选。已废弃,用includePoints代替position: 0, // 指定在各个场景中的排列顺序data: [   // 该场景下的地点markers{name: "孙中山铜像",   // 地点名称short_name: "铜像", // 名称缩写desc: "中山铜像...", // 描述信息logo: "tx",   // 地点logo,缩写拼音, 如作各院系logo展示icon: "tx@2",   // 自定义marker图标,“@”后数字为图标相较于默认图标的缩放值images: 3,  // 图片数量,作云存储拼接路径用(cloud://cloudRoot/1教/n.jpg)panorama: 0,  // 全景场景idlatitude: "23.635875",  // 经度longitude: "113.678965",  // 纬度contact: { phone: "020-123456", address: "出门左转" }   // 联系方式}]
}

使用 excel 进行数据维护,通过 python pandas 进行数据清洗,使用 jsonlines 库输出符合云数据库的 JSON Lines 格式文件,以 upsert 形式导入数据库。

数据更新流程如下:

  1. 加载并清洗数据
    使用 request 或云数据库进行异步数据请求时。由于 app.js 中的 onLaunch 和首页 index 的 onLoad 的执行顺序不是固定的,所以如果首页有基于 app.js 请求的数据时要注意生命周期的问题。
// index
async loadMarkers() {let markers;if (app.globalData.config.debug) {// 本地markers = mockMarkers;} else {// 云await wx.cloud.callFunction({name: "loadMarkers"}).then((res: any) => {markers = res.result.data;});}app.globalData.markers = markers;
}clearMarkers(markers: any[]) {let num = 0;  // 每个marker都要有一个idfor (const i of markers) {for (const j of i.data) {j.id = num;num += 1;j.iconPath = `/assets/images/markers/${j.icon ? j.icon : i.icon}.png`;...// 自定义气泡样式j.callout = Object.assign({ content: j.short_name ? j.short_name : j.name },app.globalData.config.markerStyle.calloutStyle);}}return markers;
}
  1. 巧用 MapContext
    你不需要去手动地为每个场景设置 scale,用 includePoints 即可让地图视野自动覆盖到当前所有 POI。
    你也不需要去手动地去获取权限设置用户位置,用 moveToLocation 即可轻松定位。
// index
onReady() {this.setData!({mapContext: wx.createMapContext("map")});
}includePoints(padding: number) {this.data.mapContext.includePoints({padding: [padding, padding, padding, padding],points: this.data.markers});
}locate() {this.data.mapContext.moveToLocation();
}
  1. 使用云存储管理图片
    添加新图片时,直接修改 images 字段即可,文件夹目录为地点名称。
<!-- 地点详情页 轮播图 -->
<swiperindicator-dots="{{imgUrls.length > 1}}"autoplay="{{true}}"interval="3000"duration="1000"
><block wx:for="{{imgUrls}}" wx:key="{{index}}"><swiper-item><imagesrc="{{item}}"class="slide"data-id="{{index}}"bindtap="previewImage"/></swiper-item></block>
</swiper>
for (let i = 0; i < marker.images; i++) {imgUrls.push(this.data.cloudRoot +"images/" +(marker.short_name || marker.name) +"/" +i +".jpg");
}

南苑导览 · 设计

如果你在微信上搜索「导览」二字,看到的小程序大多都是一个模板,页面层级深,界面拥挤,列表式的信息展示并不符合我们日常使用地图 APP 的经验。为此,我做出了多项改良:

  1. 更好的视野 - 自定义导航栏与侧边栏
    因为只有特定的页面需要使用自定义导航栏,所以只需要设置页面级的 config:
  "navigationStyle": "custom"

接下来获取胶囊按钮位置信息:

bounding: wx.getMenuButtonBoundingClientRect();

动态地设置样式:

<!-- SIDE MENU -->
<viewclass="sidebar"hidden="{{toggleRoutes}}"style="top:{{bounding.height + bounding.top + 10}}px"
>...
</view>
  1. FAB 与侧边栏设计

把最主要的定位、搜索和路线推荐功能在视觉上成为整体,通过点击 FAB 弹出菜单选项。侧边栏的地点场景菜单设计为下拉滚动,注意使用半遮设计来提醒用户滚动。同时,为了让界面更加精简,侧边菜单会在点击 FAB(Float Action Button)和母按钮时 toggle 显示与隐藏。

  1. 用点击代替滚动 - scroll-into-view
    在路线面板和搜索页中,使用到了 scroll-view 组件,利用其 scroll-into-view 特性,实现点击代替滚动的操作,同时也能起到提醒后置选项的作用。

windowWidth: wx.getSystemInfoSync().screenWidth;
<scroll-view class="route" scroll-x scroll-into-view="{{focusPointId}}"><viewclass="points"style="width:{{routes[routeIndex].count * 140 < windowWidth ? windowWidth : routes[routeIndex].count * 140}}rpx;">...</view>
</scroll-view>
  1. 更好的视角 - 全景功能
    结合 web-view 和全景服务平台,可以为一款地图导览应用增色不少。

总结

云开发让小程序开发者无需搭建服务器,使用平台提供的 API 即可快速地进行业务开发、上线和迭代,免费的基础版完全可以满足中小应用的需求。「南苑导览」借助腾讯云开发能力,上线以来,帮助到了许许多多的新生和来客,实现了产品价值。最后,期望官方早日开放自定义地图底图能力,让开发者能够个性化地图,探索出更多的应用场景!

源码地址

https://github.com/TencentCloudBase/Good-practice-tutorial-recommended


如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~

借助小程序·云开发制作校园导览小程序丨实战相关推荐

  1. 小程序云开发_借助小程序云开发制作校园导览小程序丨实战

    导语 偌大校园,寻路犯难.没关系!本文教你借助云开发制作精美校园导览小程序,带你走遍校园的每个角落,发现不一样的风景. 背景 刚入学的新生要想不迷失在偌大的校园,除了依靠不怎么可靠的路边标识外,总会收 ...

  2. 基于微信小程序云开发(校园许愿墙app)2.0稳定版,以发布上线

    大家好~我是c站的一个小博主,我会定期更新博文,本篇是围绕微信小程序基于腾讯云开发展开的一个项目,如果看着还不错,或者对您有帮助的话,可以进我的专栏看看我的小程序的其他作品https://blog.c ...

  3. 毕业设计——基于小程序云开发的校园二手交易平台(附源码)

    本系统基于微信小程序云开发,采用小程序原生框架,不需要后端开发,数据库和CMS云开发全帮你搞定,对后端开发能力薄弱的同学超友好的有木有,只要你学过HTML+CSS+JS就能实现所有功能. 一.功能介绍 ...

  4. 微信小程序|基于小程序+云开发制作一个菜谱小程序

    今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力. 一.小程序 1. 创建小程序

  5. 小程序点击调转带参数_带你走遍苏大的每个角落,校园导览小程序上线!

    精彩推荐 1. 招新 | 携手趁韶华,约你同做"校媒人"! 2. 迎新现场 | 今天,"小20"是苏大的主角 3. 苏州大学与亨通集团签订战略合作协议 钟楼.红 ...

  6. 基于微信小程序云开发的医院体检预约小程序源码,医院体检预约小程序源码,实现体检预约管理、体检预约凭证、预约数据查看导出 版权申诉

    功能介绍 对于医院体检科室和体检机构而言,每天的体检人数分布也不太均衡,若很多人集中在 某些天体检,会出现「医生强度大.体检人排队久」的问题.采用体检预约小程序进行体检预约数管理,体检人可预约到更广的 ...

  7. 基于微信小程序云开发的校园类平台

    这期给大家介绍一个我压箱底的项目,一个集二手市场.兼职发布.失物招领.代取快递等功能为一身的校园类平台. 前端使用ColorUI,后端使用微信小程序云开发. 现在已经上线发布,并且长期运营维护. 大家 ...

  8. 云开发制作二手商城微信小程序

    从零到有云开发制作二手商城微信小程序 步入大三,和几个小伙伴用三周时间一起制作了一个小程序. 我们刚开始尝试了微信JS前端+JAVA后台的方法,但是由于缺少前端后台传数据的知识,最终选择了云开发的方式 ...

  9. 基于小程序+云开发制作一个文件传输助手小程序

    微信文件传输助手是真人?基于云开发制作一个文件传输助手小程序,你发给ta的小秘密,只有你自己知道. 开发步骤 一.创建小程序 二.云开发配置 环境配置 绑定云环境 三.页面设计 首页 详情页 底部弹窗 ...

最新文章

  1. Java学习之do-while-if语句实操
  2. Swift 异常处理
  3. bootstrap的td可以增加title样式_3.CSS样式的三种使用方式
  4. autocad 二次开发 拆分图纸_AutoCAD二次开发技术在工程图纸绘制中的应用
  5. ansys matlab 调用,matlab 调用ansys (转载)
  6. MYSQL 查看表上索引的 1 方法
  7. Tiktok下载量激增至20亿次,视频带货或将席卷海外,跨境电商的风口
  8. 安卓的自动启动设置界面的启动代码
  9. Linux驱动之定时器(mod_timer)
  10. VC与VS的版本对应关系,VC到底是什么?为啥总提示缺少VC
  11. python 安装包时出现:SyntaxError: invalid syntax
  12. windows2003视频教程
  13. 服务器lsass系统错误,lsass.exe系统错误如何解决?
  14. 曾经爱过就是彼此的慈悲
  15. 积分商城有哪些基本的功能呢?
  16. 解决anaconda下Spyder的tensorflow不能用karas的原因,用anaconda安装最新的TensorFlow版本
  17. IBM结盟飞康VTL提供高性能备份与重复数据删除
  18. 支付宝手机唤起app支付
  19. wifi信号衰减与距离关系_wifi无线信号传输衰减和距离的关系公式[室内定位]
  20. Python爬虫实战(一) — Pixabay图片下载器

热门文章

  1. 基于Javaweb的问卷调查系统
  2. 微信Web APP应用
  3. 开发工程师必备的一直网站
  4. 【软件下载】Excel下载 word下载 官方 官网下载 原始镜像 开发工具 开发软件下载
  5. 大数据扫黄,是怎样发现你的?
  6. Springboot Mybatis MySQL读写分离及事物配置
  7. 关于汽车信息安全测试的公司-阿古斯
  8. Windows分盘,c盘已经满了,但d盘还有内存。
  9. 域格4G模块专网设置说明
  10. lzx和网页之间脚本交互调试方式