更新记录

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 云服务空间(阿里云)

导入与初始化

  1. 在 HBuilderX 中导入项目,关联 uniCloud 云服务空间
  2. 右键 uniCloud 目录 → 运行云服务空间初始化向导(会读取 uniCloud-aliyun/database/db_init.json 建表并导入演示数据)
  3. 上传 common 公共模块与 router 云函数

演示登录说明

云端短信服务未配置时,登录页会提示使用演示验证码 123456。注册需 6-20 位且同时包含字母与数字的密码。

发布部署

微信小程序

  1. manifest.json 配置微信小程序信息
  2. 发行 → 小程序-微信

H5

  1. 发行 → H5,部署到 Web 服务器

APP

  1. 发行 → App 云端打包,配置证书

注意事项

  1. 云函数修改后需重新上传才生效
  2. 数据库 schema 修改后需同步更新 uniCloud-aliyun/database/xy-xxx.init_data.json 中的字段
  3. pub/ 接口不应出现 uid,kh/ 接口的 uid 必须来自 userInfo._id
  4. 用户输入拼正则前必须转义,否则特殊字符会抛错
  5. 小程序模板不支持 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云服务空间

项目导入

  1. 克隆或下载项目代码
  2. 在HBuilderX中导入项目
  3. 关联uniCloud云服务空间

云开发环境配置

  1. 右键点击uniCloud目录,选择运行云服务空间初始化向导
  2. 根据提示完成初始化配置
  3. 上传common模块和router云函数

前端开发配置

  1. main.js已配置uView UI引入

    import uView from './uni_modules/vk-uview-ui';
    Vue.use(uView);
  2. App.vue已引入基础样式

    <style lang="scss">
    @import "./uni_modules/vk-uview-ui/index.scss";
    </style>
  3. 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简化数据库操作:

  • 支持增删改查基本操作
  • 提供连表查询、分页查询等高级功能
  • 内置权限控制和数据过滤

发布部署

微信小程序

  1. 在manifest.json中配置微信小程序信息
  2. 选择发行 -> 小程序-微信
  3. 按照提示完成发布流程

H5

  1. 选择发行 -> H5
  2. 配置相关参数后生成H5包
  3. 部署到Web服务器

APP

  1. 选择发行 -> App云端打包
  2. 配置应用信息和证书
  3. 等待打包完成并下载安装包

注意事项

  1. 开发环境和生产环境需要分别配置
  2. 敏感信息如AppID、密钥等应配置在安全的地方
  3. 云函数修改后需要重新上传才能生效
  4. 数据库 schema 修改后需要同步更新

License

Apache-2.0


平台兼容性

云端兼容性

支付宝云 腾讯云 阿里云
√ √ √

uni-app(4.36)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ √ √ √ √ √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ √ √ √ √ √ - √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
√ × × ×

云函数类插件通用教程

使用云函数类插件的前提是:使用HBuilderX 2.9+


隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。