更新记录
1.2.0(2026-10-04)
星云旅行
项目介绍
星云旅行是一个基于 uni-app + uniCloud 的旅游服务平台,提供目的地发现、旅行攻略、行程规划、订单履约等完整链路,支持多平台部署(微信小程序、H5、APP)。
本版本是数据层与接口层的重构版本:把原先散落在各页面 data() 里的硬编码演示数据全部迁移到 uniCloud 数据库表,为每个业务模块建立配套云函数接口,并将 29 个页面改为调用真实接口。同时系统性修复了一批功能缺陷与安全漏洞。
主要功能
核心功能
- 首页:轮播图、分类导航、热门目的地、精选攻略、发现内容(单接口聚合返回)
- 目的地:多条件筛选(区域 / 类型 / 排序 / 关键词)、景点与美食详情、相关攻略推荐
- 攻略:多维度筛选(区域 / 天数 / 旅行方式 / 排序)、每日行程、预算明细、点赞收藏
- 发现:分类浏览、内容流、点赞、评论、发布动态
- 搜索:跨目的地 / 攻略 / 发现三类聚合搜索,支持搜索历史与热门词
- 行程:自定义天数、逐日活动编排、预算明细、增删改查
- 订单:下单、支付、取消、退款、评价、删除、核销码全流程
- 用户中心:资料、收藏、足迹、优惠券、我的攻略、意见反馈、邀请、帮助
本版本优化
- 数据落库:23 张业务表、333 条演示数据,全部以
uniCloud-aliyun/database/xy-*.init_data.json形式随项目导入,开箱即用 - 接口化:42 个云函数接口,
pub/(免登录)与kh/(需登录)分层鉴权 - 安全加固:修复 27 个接口的 uid 越权风险(详见「安全修复」)
- 功能补全:新增 4 个页面,补齐订单详情、核销码、攻略编辑、发布动态
- 体验完善:全页面接入 loading 骨架屏、空状态、下拉刷新、上拉分页
技术栈
前端技术
- 框架:uni-app(Vue 2)
- UI 组件库:vk-uview-ui(easycom 自动引入)
- 状态管理:Vuex
- 样式预处理:SCSS
- 云服务调用:vk-unicloud(
vk.callFunction/vk.userCenter)
后端技术
- 云开发:uniCloud(阿里云)
- 数据库:NoSQL(
vk.baseDao) - 用户系统:uni-id(手机号验证码登录 / 注册)
- 云函数框架:vk-unicloud-router
数据库设计
23 张业务表(xy- 前缀),每张表一个 uniCloud-aliyun/database/xy-xxx.init_data.json,已全部合并进 uniCloud-aliyun/database/db_init.json(共 44 张表)。
| 分类 | 数据表 |
|---|---|
| 内容 | xy-destination(8) xy-attraction(20) xy-food(17) xy-strategy(12) xy-strategy-day(51) xy-strategy-budget(60) xy-discover(12) xy-discover-comment(25) |
| 首页 | xy-banner(4) xy-nav(6) |
| 用户 | xy-collection(8) xy-footprint(12) xy-coupon(8) xy-order(10) xy-trip(3) xy-trip-activity(27) xy-user-profile(1) xy-invite(5) xy-search-history(10) |
| 其他 | xy-feedback(8) xy-help-category(6) xy-help-article(10) xy-hot-search(10) |
接口设计
42 个客户端接口,位于 uniCloud-aliyun/cloudfunctions/router/service/client/。
| 模块 | 数量 | 接口 |
|---|---|---|
| user | 10 | getMyInfo getCollection addCollection removeCollection getFootprint getCoupon getMyStrategy saveStrategy deleteStrategy |
| discover | 5 | pub/getList pub/getDetail kh/like kh/addComment kh/publish |
| search | 5 | pub/search pub/hotList kh/getHistory kh/addHistory kh/clearHistory |
| order | 4 | kh/getList kh/getDetail kh/updateStatus kh/delete |
| trip | 4 | kh/getList kh/getDetail kh/save kh/delete |
| strategy | 3 | pub/getList pub/getDetail pub/like |
| destination | 2 | pub/getList pub/getDetail |
| help | 2 | pub/getList pub/getDetail |
| feedback | 3 | pub/getTypes kh/submit kh/getMyFeedback |
| index / invite | 2 | pub/getHome kh/getInfo |
安全修复
uid 越权漏洞(27 个接口)
重构前所有 kh 接口均从 let { uid } = data 取用户 ID,前端可任意伪造,导致可读写他人订单、行程、收藏、优惠券等数据。已全部改为:
let { data = {}, util, userInfo } = event;
let { vk, db, _ } = util;
// uid 必须从 userInfo._id 取,绝不能从 data 里取(前端可伪造)
let uid = userInfo._id;
同时为所有涉及单条数据的接口补充归属权校验(item.user_id !== uid 直接拒绝)。
Bug 修复
功能缺陷
- 目的地详情页永远显示三亚:
onLoad拿到id后未发起请求,静态渲染了第一条数据。现按 id 真实加载,并接入景点 / 美食 / 相关攻略三个子资源 - 行程规划页日期永远为空:
u-picker单列模式的 confirm 回调返回的是索引数组,原代码按{year, month, day}取值恒得undefined。已改为索引取值并用索引表映射日期 - 行程保存不落库:
saveTrip只弹 toast。现调用client/trip/kh/save写入行程与每日活动,支持编辑态回填与更新 - 筛选结果不稳定:目的地 / 攻略列表用
Math.random()模拟「行程天数」字段做区间筛选,每次筛选结果都不一样。现改为服务端真实字段筛选 - 攻略详情缺少点赞收藏:原本底部无任何操作入口。现补齐点赞、收藏、浏览量与「照着做行程」
- 收藏页条目无法跳转:点击只弹 toast。现按
target_type分别跳转目的地 / 攻略 / 发现详情 - 设置页 7 个死链:
/pages/my/account、/pages/my/privacy等页面均不存在。现改为可用功能(弹窗说明、多语言与货币选择、清除缓存、关于我们) - 隐私政策路径错误:
/pages/my/privacy→/pages/my/privacy-policy - 搜索历史与热门词为静态数组:现从
xy-search-history/xy-hot-search读取,支持清空与累计搜索次数
体验缺陷
- 全页面移除
setTimeout模拟请求,改为真实接口调用 - 全页面补充 loading 骨架屏、
u-empty空状态、下拉刷新、上拉分页 - 清理行程规划页 20 余条
console.log调试语句 - 登录 / 注册页倒计时定时器在
onUnload中清理,避免内存泄漏
新增页面
页面数由 25 增至 29。
| 页面 | 说明 |
|---|---|
pages/my/order-detail.vue |
订单详情:状态头部、出行信息、订单信息、按状态动态渲染操作栏 |
pages/my/order-qrcode.vue |
订单核销码:6 位动态核销码(30 秒自动刷新)、出行信息、一键确认核销 |
pages/strategy/edit.vue |
攻略发布 / 编辑:封面、标题、摘要、概览、标签、天数、旅行方式,支持存草稿 |
pages/discover/publish.vue |
发布动态:正文、标题、最多 9 图、位置、标签 |
项目结构
├── App.vue # 应用入口
├── main.js # 入口 JS
├── pages.json # 页面路由(29 个页面 + 5 个 tabBar)
├── manifest.json # 应用配置
├── app.config.js # vk 框架配置(登录校验、分享白名单、主题色)
├── uni.scss # 全局样式变量
├── common/
│ ├── css/ # 公共样式(7 个 scss)
│ └── function/
│ └── myPubFunction.js # 数据格式化公共函数(vk.myfn.xxx)
├── pages/ # 29 个页面
│ ├── index/index.vue # 首页
│ ├── destination/ # destination.vue 列表、detail.vue 详情
│ ├── strategy/ # strategy.vue 列表、detail.vue 详情、edit.vue 发布编辑
│ ├── discover/ # discover.vue 列表、detail.vue 详情、publish.vue 发布
│ ├── search/search.vue # 全局搜索
│ ├── login/ # login.vue 登录、register.vue 注册
│ ├── my/ # 用户中心 17 个页面
│ └── trip/ # detail.vue 行程详情、planning.vue 行程规划
├── static/
│ ├── logo.png
│ └── tabbar/ # 5 组 tabBar SVG 图标
├── store/ # Vuex(index.js + $app + $user)
├── uni_modules/ # uni-config-center、uni-id、vk-unicloud、vk-uview-ui
├── uniCloud-aliyun/
│ ├── cloudfunctions/router/
│ │ ├── config.js # 云函数配置
│ │ ├── dao/ # 数据访问层
│ │ ├── middleware/ # 中间件
│ │ ├── util/pubFunction.js # 云函数公共方法
│ │ └── service/
│ │ ├── client/ # 客户端接口(本次新增 42 个)
│ │ ├── user/ # 统一用户中心
│ │ ├── admin/ # 管理端
│ │ ├── plugs/ # 插件
│ │ └── template/ # 云函数模板
│ └── database/
│ ├── db_init.json # 数据库初始化(44 张表)
│ ├── JQL查询.jql
│ └── xy-*.schema.json # 23 张业务表结构
│ └── xy-*.init_data.json # 23 张业务表演示数据
├── check_pages.py # 静态检查:方法绑定 / 死链 / 接口存在性
├── check_apis.py # 静态检查:uid 取法 / baseDao 误用 / 语法
└── verify_all.py # 端到端校验:数据一致性 / 字段覆盖 / 接口冗余
开发说明
云函数调用
vk.callFunction({
url: 'client/destination/pub/getList',
needAlert: false, // 关闭框架内置错误弹窗,自行处理
data: {
need_user_info: false, // pub 接口无需登录信息
pageIndex: 1,
pageSize: 10,
keyword: '三亚',
region: '国内',
sort: 'hot'
},
success: (data) => {
if (data.code !== 0) return;
// data.rows / data.total / data.hasMore
},
fail: (err) => { vk.toast(err.msg); },
complete: () => { uni.stopPullDownRefresh(); }
});
数据库操作
统一使用 vk.baseDao:
// 查询(getCount 必须显式开启,否则 total 恒为 0)
await vk.baseDao.select({
dbName: 'xy-destination',
getCount: true,
pageIndex: 1,
pageSize: 10,
whereJson: { region: '国内' }, // 原样透传给 uniCloud .where(),支持 $or / 正则 / _.gte()
sortArr: [{ name: 'views', type: 'desc' }]
});
// 新增(add 不支持 isArray,批量用 adds)
await vk.baseDao.add({ dbName: 'xy-trip', dataJson: {...} });
// 按 id 查(不支持 whereJson,归属权需自行判断)
await vk.baseDao.findById({ dbName: 'xy-order', id });
// 条件更新 / 删除
await vk.baseDao.update({ dbName: 'xy-order', whereJson: { _id, user_id: uid }, dataJson: {...} });
await vk.baseDao.del({ dbName: 'xy-collection', whereJson: { _id: id, user_id: uid } });
登录鉴权
// 前端本地校验(无网络请求)
if (!vk.checkToken()) {
vk.navigateToLogin();
return;
}
// 手机号验证码登录
vk.userCenter.loginBySms({ data: { mobile, code, type: 'login' } });
// 手机号 + 密码注册(仍用 loginBySms)
vk.userCenter.loginBySms({ data: { mobile, code, password, type: 'register' } });
app.config.js 的 checkTokenPages.mode = 1(白名单模式),仅 /pages/my/*、/pages/trip/*、/pages/strategy/edit 需登录,首页与各浏览页免登录。页面跳转必须用 vk.navigateTo 而非 uni.navigateTo,否则该拦截失效。
质量校验脚本
python3 check_pages.py # 页面方法绑定 / 跳转死链 / 接口存在性 / 硬编码残留
python3 check_apis.py # uid 取法 / baseDao API 误用 / node 语法校验
python3 verify_all.py # schema 与 init_data 一致性 / 页面字段覆盖 / 接口冗余
改动代码后建议三项全跑一遍,当前状态全部通过。
安装指南
前置条件
- HBuilderX 编辑器
- DCloud 开发者账号
- uniCloud 云服务空间(阿里云)
导入与初始化
- 在 HBuilderX 中导入项目,关联 uniCloud 云服务空间
- 右键
uniCloud目录 → 运行云服务空间初始化向导(会读取uniCloud-aliyun/database/db_init.json建表并导入演示数据) - 上传
common公共模块与router云函数
演示登录说明
云端短信服务未配置时,登录页会提示使用演示验证码 123456。注册需 6-20 位且同时包含字母与数字的密码。
发布部署
微信小程序
manifest.json配置微信小程序信息- 发行 → 小程序-微信
H5
- 发行 → H5,部署到 Web 服务器
APP
- 发行 → App 云端打包,配置证书
注意事项
- 云函数修改后需重新上传才生效
- 数据库 schema 修改后需同步更新
uniCloud-aliyun/database/xy-xxx.init_data.json中的字段 pub/接口不应出现uid,kh/接口的uid必须来自userInfo._id- 用户输入拼正则前必须转义,否则特殊字符会抛错
- 小程序模板不支持
Math.round()等表达式,需放入computed
License
Apache-2.0
1.1.0(2025-10-06)
星云旅行
项目介绍
星云旅行是一个基于uni-app和uniCloud开发的现代化旅游服务平台,提供景点推荐、旅行攻略、目的地探索等旅游服务功能,支持多平台部署(微信小程序、H5、APP)。本版本重点优化了用户界面体验,采用高质量的Unsplash图片资源替代原有的emoji图标,大幅提升了视觉效果。
主要功能
核心功能
- 首页展示:轮播图、分类导航、热门目的地、精选攻略、发现内容
- 目的地页面:支持多条件筛选(排序方式、目的地类型、行程天数)
- 攻略页面:支持分类筛选、排序方式、行程天数、旅行方式等多维度筛选
- 发现页面:旅游内容发现和详情查看
- 用户系统:个人中心、订单管理、收藏管理等功能
最新优化
- 视觉升级:全面替换emoji图标为高质量Unsplash真实风景图片
- 筛选优化:修复了目的地和攻略页面筛选下拉空白问题
- UI改进:采用uView UI组件库,提供一致的用户体验
- 性能优化:优化了图片加载和页面渲染性能
技术栈
前端技术
- 框架:uni-app (Vue.js跨平台框架)
- UI组件库:vk-uview-ui(已正确配置和引入)
- 状态管理:Vuex
- 样式预处理:SCSS
- 图片资源:Unsplash高质量图片API
后端技术
- 云开发:uniCloud (阿里云)
- 数据库:NoSQL数据库
- 用户系统:uni-id
- 云函数框架:vk-unicloud-router
最近更新内容
- 修复了目的地页面筛选下拉空白问题
- 修复了攻略页面筛选下拉空白问题
- 首页图片全面升级为Unsplash高质量风景图片
- 优化了筛选组件的数据格式和交互体验
项目结构
├── App.vue # 应用入口文件
├── main.js # 应用入口JS
├── pages.json # 页面路由配置
├── manifest.json # 应用配置文件
├── app.config.js # 应用配置文件
├── common/ # 公共资源
│ ├── css/ # 公共样式文件
│ │ ├── activity-styles.scss
│ │ ├── app.scss
│ │ ├── global-styles.scss
│ │ ├── missing-styles.scss
│ │ ├── page-styles.scss
│ │ ├── responsive.scss
│ │ └── uni.scss
│ └── function/ # 公共函数
│ └── myPubFunction.js
├── components/ # 公共组件
├── pages/ # 页面文件
│ ├── index/ # 首页
│ │ └── index.vue # 首页(包含轮播图、分类导航、热门目的地等)
│ ├── login/ # 登录注册
│ │ ├── login.vue # 登录页面
│ │ └── register.vue # 注册页面
│ ├── my/ # 用户中心模块
│ │ ├── my.vue # 个人中心主页
│ │ ├── agreement.vue # 用户协议
│ │ ├── collection.vue # 我的收藏
│ │ ├── coupon.vue # 优惠券
│ │ ├── feedback.vue # 意见反馈
│ │ ├── footprint.vue # 我的足迹
│ │ ├── help.vue # 帮助中心
│ │ ├── invite.vue # 邀请好友
│ │ ├── orders.vue # 我的订单
│ │ ├── privacy-policy.vue # 隐私政策
│ │ ├── setting.vue # 设置页面
│ │ ├── strategy.vue # 我的攻略
│ │ └── trip.vue # 行程管理
│ ├── destination/ # 目的地模块
│ │ ├── destination.vue # 目的地列表(支持多条件筛选)
│ │ └── detail.vue # 目的地详情
│ ├── discover/ # 发现模块
│ │ ├── discover.vue # 发现页面
│ │ └── detail.vue # 发现详情
│ ├── search/ # 搜索功能
│ │ └── search.vue # 搜索页面
│ ├── strategy/ # 攻略模块
│ │ ├── strategy.vue # 攻略列表(支持多维度筛选)
│ │ └── detail.vue # 攻略详情
│ └── trip/ # 行程规划
│ ├── detail.vue # 行程详情
│ └── planning.vue # 行程规划
├── static/ # 静态资源
│ ├── logo.png # 应用Logo
│ └── tabbar/ # 底部导航栏图标
│ ├── destination-active.svg # 目的地激活图标
│ ├── destination.svg # 目的地默认图标
│ ├── discover-active.svg # 发现激活图标
│ ├── discover.svg # 发现默认图标
│ ├── home-active.svg # 首页激活图标
│ ├── home.svg # 首页默认图标
│ ├── profile-active.svg # 个人中心激活图标
│ ├── profile.svg # 个人中心默认图标
│ ├── strategy-active.svg # 攻略激活图标
│ └── strategy.svg # 攻略默认图标
├── store/ # Vuex状态管理
│ ├── index.js # Store入口文件
│ └── modules/ # 状态模块
│ ├── $app.js # 应用状态
│ └── $user.js # 用户状态
├── uni_modules/ # uni-app模块
│ ├── uni-config-center/ # 配置中心
│ ├── uni-id/ # 用户认证系统
│ ├── vk-uni-pay/ # 支付模块
│ ├── vk-unicloud/ # 云开发框架
│ └── vk-uview-ui/ # UI组件库(已正确配置)
├── uniCloud-aliyun/ # uniCloud云开发资源
│ ├── cloudfunctions/ # 云函数
│ │ └── router/ # 路由云函数
│ └── database/ # 数据库配置
│ ├── JQL查询.jql # JQL查询配置
│ └── db_init.json # 数据库初始化
├── uni.scss # 全局样式变量
├── template.h5.html # H5模板文件
├── index.html # 入口HTML文件
├── app.config.js # 应用配置文件
├── package.json # 项目配置
├── package-lock.json # 依赖锁文件
└── unpackage/ # 打包输出目录
└── dist/
└── cache/
安装指南
前置条件
- 安装HBuilderX编辑器
- 注册DCloud开发者账号
- 创建uniCloud云服务空间
项目导入
- 克隆或下载项目代码
- 在HBuilderX中导入项目
- 关联uniCloud云服务空间
云开发环境配置
- 右键点击
uniCloud目录,选择运行云服务空间初始化向导 - 根据提示完成初始化配置
- 上传
common模块和router云函数
前端开发配置
-
main.js已配置uView UI引入
import uView from './uni_modules/vk-uview-ui'; Vue.use(uView); -
App.vue已引入基础样式
<style lang="scss"> @import "./uni_modules/vk-uview-ui/index.scss"; </style> -
uni.scss已引入全局变量
@import "@/uni_modules/vk-uview-ui/theme.scss";
功能页面说明
首页 (pages/index/index.vue)
应用的首页,展示热门景点、推荐旅行路线和优惠活动,包含底部导航栏。
登录页 (pages/login/login.vue)
用户登录界面,支持账号密码登录、短信验证码登录和第三方登录。
用户中心 (pages/profile/profile.vue)
用户个人中心,展示用户基本信息、订单统计、旅行记录和功能入口。
景点详情 (pages/destination/detail.vue)
展示景点详细信息,包括景点介绍、门票价格、开放时间,支持预订和评价功能。
景点分类 (pages/destination/list.vue)
按景点类型浏览的页面,如自然风光、历史文化、主题公园等分类。
消息通知 (pages/notice/index.vue)
展示系统通知、订单状态更新和旅行提醒。
预订服务 (pages/booking/index.vue)
用户预订服务的页面,选择预订时间、地址和服务类型。
搜索页面 (pages/search/index.vue)
提供景点搜索功能,包括搜索历史、热门景点和搜索结果展示。
订单管理 (pages/order/list.vue)
管理用户的预订订单,查看订单状态、行程进度和历史订单。
地址管理 (pages/address/index.vue)
管理常用地址,支持添加、编辑和删除地址。
设置页面 (pages/settings/index.vue)
应用相关设置,包括账号安全、隐私设置、消息通知设置等。
支付页面 (pages/payment/index.vue)
处理订单支付,支持多种支付方式。
评价系统 (pages/evaluation/index.vue)
用户对景点进行评价和反馈的页面。
帮助中心 (pages/help/index.vue & pages/help/detail.vue)
提供常见问题解答、旅行指南和意见反馈功能。
开发说明
云函数调用方式
项目使用vk-unicloud-router框架,通过统一的云函数入口调用各业务逻辑:
vk.callFunction({
url: 'service路径',
data: { /* 请求参数 */ },
success: (res) => { /* 成功回调 */ }
});
数据库操作
使用vk.baseDao API简化数据库操作:
- 支持增删改查基本操作
- 提供连表查询、分页查询等高级功能
- 内置权限控制和数据过滤
发布部署
微信小程序
- 在manifest.json中配置微信小程序信息
- 选择发行 -> 小程序-微信
- 按照提示完成发布流程
H5
- 选择发行 -> H5
- 配置相关参数后生成H5包
- 部署到Web服务器
APP
- 选择发行 -> App云端打包
- 配置应用信息和证书
- 等待打包完成并下载安装包
注意事项
- 开发环境和生产环境需要分别配置
- 敏感信息如AppID、密钥等应配置在安全的地方
- 云函数修改后需要重新上传才能生效
- 数据库 schema 修改后需要同步更新
License
Apache-2.0
平台兼容性
云端兼容性
| 支付宝云 | 腾讯云 | 阿里云 |
|---|---|---|
| √ | √ | √ |
uni-app(4.36)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | - | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| √ | × | × | × |
云函数类插件通用教程
使用云函数类插件的前提是:使用HBuilderX 2.9+

收藏人数:
购买源码授权版(
导入插件并试用
赞赏(0)
下载 266
赞赏 3
下载 35192
赞赏 159
赞赏
京公网安备:11010802035340号