当你刚上大学的时候,要想不迷失校园,除了依靠不怎么可靠的路边标识外,总会收到那么一张卡通绘制的校园地图:
这种静态图片可以让我们快速地了解到所需的地理位置信息,但使用和思考过后,会发现以下问题:
为此,我设计了一款校园导览应用,用当下流行的微信小程序结合云开发能力,低成本高效能地解决了以上问题。此外,我还根据对市面上的同类应用进行设计上的研究,在界面和交互设计上做功夫。下面我会进行简短的介绍。
南苑导览是一款由学生独立开发的以地图为载体,提供中山大学南方学院(南苑)具体地点的位置信息、导航、校园历史及文化介绍的小程序。旨在解决校园导航标识不到位、地图形式低效单一、信息设计不够好等问题,为来南苑新人和游客提供更加完美的出行体验。
<div align=center>
仅需修改地图配置文件,即可适配任意场景(校园、景区)的小程序个性化地图定制。
技术栈:原生小程序 + TypeScript + gulp + vantUI + 云开发能力
2019 微信小程序高校大赛 · 华南赛区二等奖
</div>
├─ src
├─── config
├───── index.ts // 入口
├───── cloud.ts // 云开发相关配置
├───── info.ts // 应用介绍信息
├───── markerStyle.ts // 地图marker样式
├───── panorama.ts // 第三方全景地图配置(个人类型无webview权限,默认关闭)
└───── secret.ts // 腾讯地图key等敏感信息(可选)
// 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, // 全景场景id
latitude: "23.635875", // 经度
longitude: "113.678965", // 纬度
contact: { phone: "020-123456", address: "出门左转" } // 联系方式
}
]
}
使用 excel 进行数据维护,通过 python pandas 进行数据清洗,使用 jsonlines 库输出符合云数据库的 JSON Lines 格式文件,以 upsert 形式导入数据库。
数据更新流程如下:
// 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都要有一个id
for (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;
}
// 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();
}
<!-- 地点详情页 轮播图 -->
<swiper
indicator-dots="{{imgUrls.length > 1}}"
autoplay="{{true}}"
interval="3000"
duration="1000"
>
<block wx:for="{{imgUrls}}" wx:key="{{index}}">
<swiper-item>
<image
src="{{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 的经验。为此,我做出了多项改良:
"navigationStyle": "custom"
接下来获取胶囊按钮位置信息:
bounding: wx.getMenuButtonBoundingClientRect();
动态地设置样式:
<!-- SIDE MENU -->
<view
class="sidebar"
hidden="{{toggleRoutes}}"
style="top:{{bounding.height + bounding.top + 10}}px"
>
...
</view>
把最主要的定位、搜索和路线推荐功能在视觉上成为整体,通过点击 FAB 弹出菜单选项。侧边栏的地点场景菜单设计为下拉滚动,注意使用半遮设计来提醒用户滚动。同时,为了让界面更加精简,侧边菜单会在点击 FAB(Float Action Button)和母按钮时 toggle 显示与隐藏。
windowWidth: wx.getSystemInfoSync().screenWidth;
<scroll-view class="route" scroll-x scroll-into-view="{{focusPointId}}">
<view
class="points"
style="width:{{routes[routeIndex].count * 140 < windowWidth ? windowWidth : routes[routeIndex].count * 140}}rpx;"
>
...
</view>
</scroll-view>
云开发让小程序开发者无需搭建服务器,使用平台提供的 API 即可快速地进行业务开发、上线和迭代,免费的基础版完全可以满足中小应用的需求。「南苑导览」借助腾讯云开发能力,上线以来,帮助到了许许多多的新生和来客,实现了产品价值。最后,期望官方早日开放自定义地图底图能力,让开发者能够个性化地图,探索出更多的应用场景!
https://github.com/TencentCloudBase/Good-practice-tutorial-recommended
如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。