# tripChina
**Repository Path**: docevan/tripChina
## Basic Information
- **Project Name**: tripChina
- **Description**: No description available
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-20
- **Last Updated**: 2025-11-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 打卡中国 - 旅游足迹记录应用
基于 UniApp 和腾讯云开发(CloudBase)的旅游打卡应用,支持 **H5** 和 **微信小程序**。用户可以记录旅游足迹、管理心愿清单、查看个人统计,探索中国的美丽风景。
[](https://github.com/TencentCloudBase/CloudBase-AI-ToolKit)
> 本项目基于 [**CloudBase AI ToolKit**](https://github.com/TencentCloudBase/CloudBase-AI-ToolKit) 开发,通过AI提示词和 MCP 协议+云开发,让开发更智能、更高效,支持AI生成全栈代码、一键部署至腾讯云开发(免服务器)、智能日志修复。
## 项目特点
- 🗺️ **打卡地图** - 在地图上记录旅游足迹,可视化展示已打卡的省份和城市
- ❤️ **心愿清单** - 收藏想去的地方,支持3D游览功能解锁
- 📊 **个人统计** - 详细的旅游数据统计和成就系统
- 🏛️ **景区详情** - 丰富的景区信息展示和用户评价系统
- 🚀 基于 UniApp 构建,一套代码多端运行
- ⚡ 使用 Vue 3 Composition API 构建现代化 UI
- 🌐 支持 **H5** 和 **微信小程序**,其他平台适配开发中
- 🎁 深度集成腾讯云开发 CloudBase,提供一站式后端云服务
- 📱 完整的 TypeScript 支持,提供更好的开发体验
- 🗺️ **双地图服务** - 支持高德地图和腾讯地图,用户可自由切换
- 🔒 **安全密钥管理** - 腾讯地图API密钥存储在云函数中,确保安全性
## 项目架构
### 前端架构
- **框架**:UniApp (基于 Vue 3)
- **构建工具**:Vite
- **多端支持**:H5、微信小程序(其他平台适配开发中)
- **状态管理**:Vue 3 Reactivity API
- **类型支持**:TypeScript
### 云开发资源
本项目使用了以下腾讯云开发(CloudBase)资源:
- **身份认证**:用于用户登录和身份验证(匿名登录)
- **云数据库**:存储用户打卡记录、心愿清单、景区数据等
- **云函数**:实现打卡管理、心愿清单管理、景区查询、统计等业务逻辑
- **云存储**:存储景区图片等静态资源
- **静态网站托管**:用于部署 H5 版本
### 第三方服务集成
- **高德地图API**:提供地图显示、位置服务、POI搜索、路径规划等功能
- **高德地图服务**:通过云函数封装高德地图API,提供统一的后端服务接口
- **腾讯地图API**:提供地图显示、位置服务、POI搜索、路径规划等功能(新增)
- **腾讯地图服务**:通过云函数封装腾讯地图API,提供统一的后端服务接口(新增)
### 数据库设计
- **user_checkins** - 用户打卡记录
- **user_wishlist** - 用户心愿清单
- **user_attraction_status** - 用户景区状态(已打卡、已心愿等)
- **attractions** - 景区基础数据(包含5A级景区信息)
## 目录结构
```
├── src/
│ ├── pages/ # 页面文件
│ │ ├── index/ # 首页
│ │ │ ├── index.vue
│ │ │ └── index.json
│ │ ├── checkin-map/ # 打卡地图页面
│ │ │ ├── checkin-map.vue
│ │ │ └── checkin-map.json
│ │ ├── wishlist/ # 心愿清单页面
│ │ │ ├── wishlist.vue
│ │ │ └── wishlist.json
│ │ ├── stats/ # 个人统计页面
│ │ │ ├── stats.vue
│ │ │ └── stats.json
│ │ ├── attraction-detail/ # 景区详情页面
│ │ │ ├── attraction-detail.vue
│ │ │ └── attraction-detail.json
│ │ └── demo/ # 云开发演示页面
│ │ ├── demo.vue
│ │ └── demo.json
│ ├── utils/ # 工具函数和云开发初始化
│ │ ├── adapter.js # UniApp 适配器
│ │ ├── cloudbase.ts # 云开发配置
│ │ └── index.ts # 通用工具函数
│ ├── static/ # 静态资源
│ ├── App.vue # 应用入口组件
│ ├── main.ts # 应用入口文件
│ ├── pages.json # 页面路由配置
│ └── manifest.json # 应用配置文件
├── cloudfunctions/ # 云函数目录
│ ├── hello/ # 示例云函数
│ │ ├── index.js
│ │ └── package.json
│ ├── initAttractions/ # 初始化景区数据
│ │ ├── index.js
│ │ └── package.json
│ ├── checkinManager/ # 打卡管理
│ │ ├── index.js
│ │ └── package.json
│ ├── wishlistManager/ # 心愿清单管理
│ │ ├── index.js
│ │ └── package.json
│ ├── attractionManager/ # 景区管理
│ │ ├── index.js
│ │ └── package.json
│ ├── amapService/ # 高德地图服务
│ │ ├── index.js
│ │ └── package.json
│ ├── httpRequest/ # HTTP请求代理
│ │ ├── index.js
│ │ └── package.json
│ └── httpRequestCore/ # HTTP请求核心
│ ├── index.js
│ └── package.json
├── index.html # H5 模板
├── vite.config.ts # Vite 配置
├── tsconfig.json # TypeScript 配置
├── package.json # 项目依赖
├── cloudbaserc.json # CloudBase CLI 配置
└── README.md # 项目说明
```
## 功能说明
### 🗺️ 打卡地图
- **高德地图集成**:基于高德地图API的交互式地图显示
- **实时定位**:获取用户当前位置并在地图上标记
- **景点搜索**:支持关键词搜索景点、城市
- **附近景点**:基于位置查找附近景点并在地图上标记
- **地图控制**:缩放、平移、切换地图类型
- **位置打卡**:支持当前位置快速打卡
- **路径规划**:提供景点间的路径规划功能
### ❤️ 心愿清单
- 添加/移除心愿景区
- 心愿分类管理(想去、必去、推荐)
- 优先级排序功能
- 3D游览功能解锁
### 📊 个人统计
- 打卡地图可视化展示
- 景区等级分布图表
- 月度打卡统计
- 成就系统(省份收集者、景区达人等)
### 🏛️ 景区详情
- 景区基本信息、图片、介绍
- 门票价格、开放时间、交通信息
- 用户评价和打卡记录
- 相关推荐景区
- 3D游览链接
## 开始使用
前提条件
- 安装 Node.js (版本 16 或更高)
- 安装 HBuilderX 或其他支持 UniApp 的开发工具
- 腾讯云开发账号 (可在[腾讯云开发官网](https://tcb.cloud.tencent.com/)注册)
安装依赖
```bash
npm install
```
配置云开发环境
1. 打开 `src/utils/cloudbase.ts` 文件
2. 将 `ENV_ID` 变量的值修改为您的云开发环境 ID
```typescript
const ENV_ID = 'your-env-id'; // 替换为您的云开发环境ID
```
配置高德地图API
1. 在[高德开放平台](https://lbs.amap.com/)注册账号并创建应用
2. 获取API Key
3. 在 `cloudfunctions/amapService/index.js` 中配置API Key:
```javascript
const AMAP_API_KEY = 'your-amap-api-key'; // 替换为您的高德地图API Key
```
4. 重新部署 `amapService` 云函数
云开发环境配置
#### 1. 开启匿名登录
在云开发控制台的【环境】->【登录授权】中开启匿名登录。
#### 2. 配置安全域名(H5 端)
在云开发控制台的【环境】->【安全配置】->【WEB 安全域名】中添加:
- 开发域名:`http://localhost:5173`(本地开发)
- 生产域名:您的实际部署域名
#### 3. 配置小程序域名(微信小程序)
在微信小程序管理后台的【开发】->【开发管理】->【开发设置】->【服务器域名】中配置:
**request 合法域名:**
```
https://tcb-api.tencentcloudapi.com
https://your-env-id.service.tcloudbase.com
```
**uploadFile 合法域名:**
```
https://cos.ap-shanghai.myqcloud.com
```
**downloadFile 合法域名:**
```
https://your-env-id.tcb.qcloud.la
https://cos.ap-shanghai.myqcloud.com
```
> 注意:请将 `your-env-id` 替换为您的实际环境 ID,地域根据您的云开发环境所在地域调整。
#### 4. 配置腾讯地图服务(新增)
**获取腾讯地图API密钥:**
1. 访问 [腾讯位置服务控制台](https://lbs.qq.com/console/mykey.html)
2. 创建应用并获取API密钥
3. 在云开发控制台设置环境变量 `TENCENT_MAP_KEY`
**配置域名白名单:**
在腾讯位置服务控制台添加以下域名:
- 开发环境:`localhost:3000`
- 生产环境:您的实际域名
**部署腾讯地图云函数:**
```bash
# 部署腾讯地图服务云函数
tcb functions:deploy tencentMapService
```
本地开发
```bash
# H5 开发
npm run dev:h5
# 微信小程序开发
npm run dev:mp-weixin
# 注意:目前仅支持 H5 和微信小程序,其他平台适配开发中
```
构建生产版本
```bash
# 构建 H5 版本
npm run build:h5
# 构建微信小程序
npm run build:mp-weixin
# 注意:目前仅支持 H5 和微信小程序构建
```
## 云开发使用示例
通过 `src/utils/cloudbase.ts` 访问云开发服务:
```typescript
import { app, ensureLogin } from './utils/cloudbase'
// 确保用户已登录
await ensureLogin();
// 打卡管理
const checkinResult = await app.callFunction({
name: 'checkinManager',
data: {
action: 'addCheckin',
data: {
province: '北京',
city: '北京市',
note: '打卡天安门'
}
}
});
// 心愿清单管理
const wishlistResult = await app.callFunction({
name: 'wishlistManager',
data: {
action: 'addToWishlist',
data: {
attractionId: 'attraction_id',
wishType: '想去',
priority: 3
}
}
});
// 景区查询
const attractionResult = await app.callFunction({
name: 'attractionManager',
data: {
action: 'getAttractionsByLocation',
data: { province: '北京', limit: 10 }
}
});
// 获取统计数据
const statsResult = await app.callFunction({
name: 'checkinManager',
data: { action: 'getCheckinStats' }
});
// 高德地图服务
// 搜索景点
const searchResult = await app.callFunction({
name: 'amapService',
data: {
action: 'searchPoi',
data: {
keywords: '故宫',
city: '北京',
types: '风景名胜'
}
}
});
// 获取附近景点
const nearbyResult = await app.callFunction({
name: 'amapService',
data: {
action: 'getNearbyAttractions',
data: {
location: '116.397128,39.916527',
radius: 10000
}
}
});
// 逆地理编码(坐标转地址)
const reverseGeocodeResult = await app.callFunction({
name: 'amapService',
data: {
action: 'reverseGeocode',
data: {
location: '116.397128,39.916527'
}
}
});
```
## 部署指南
### 部署云函数
可以使用 CloudBase CLI 或 MCP 工具部署云函数:
```bash
# 使用 CloudBase CLI
tcb functions:deploy hello
```
### 部署到云开发静态网站托管(H5版本)
1. 构建 H5 版本:`npm run build:h5`
2. 登录腾讯云开发控制台
3. 进入您的环境 -> 静态网站托管
4. 上传 `dist/build/h5` 目录中的文件
### 微信小程序发布
1. 构建微信小程序版本:`npm run build:mp-weixin`
2. 使用微信开发者工具打开 `dist/build/mp-weixin` 目录
3. 上传代码包并发布
## 平台适配状态
### ✅ 已适配平台
#### H5 端
- ✅ 完全支持所有云开发功能
- ✅ 支持本地开发和生产部署
- ✅ 已配置相关安全域名
#### 微信小程序
- ✅ 完全支持所有云开发功能
- ✅ 支持本地开发和发布
- ✅ 已配置相关域名白名单
### 🚧 开发中平台
#### 支付宝小程序
- 🚧 适配开发中
#### App 端
- 🚧 适配开发中
#### 其他小程序平台
- 🚧 适配开发中
## 功能演示
项目包含完整的旅游打卡功能:
- **打卡地图**: 在地图上记录和查看旅游足迹
- **心愿清单**: 管理想去的地方,解锁3D游览
- **个人统计**: 查看详细的旅游数据和成就
- **景区详情**: 浏览景区信息,进行打卡和评价
- **云开发功能**: 认证、数据库、云函数等基础功能
访问各个页面体验完整功能。
## 使用 CloudBase CLI 部署
```bash
# 安装 CloudBase CLI
npm install -g @cloudbase/cli
# 登录
tcb login
# 部署到云开发
tcb framework deploy
```
## 技术栈
- **UniApp** - 跨平台应用开发框架
- **Vue 3** - 渐进式 JavaScript 框架
- **TypeScript** - JavaScript 的超集,提供类型支持
- **Vite** - 下一代前端构建工具
- **CloudBase JS SDK** - 腾讯云开发 JavaScript SDK
## 开发注意事项
1. **环境变量**: 确保正确配置云开发环境 ID
2. **安全域名**: 根据部署平台配置相应的安全域名
3. **权限配置**: 注意数据库集合的读写权限设置
4. **跨端兼容**: 部分 API 在不同平台表现可能不同,注意测试
5. **Babel 插件**: 项目已配置 `@babel/plugin-transform-private-property-in-object` 插件,解决微信小程序编译时的 Babel 依赖问题
## 常见问题
### 微信小程序编译错误
如果遇到 `@babel/plugin-proposal-private-property-in-object` 相关的编译错误,请确保已安装正确的 Babel 插件:
```bash
npm install @babel/plugin-transform-private-property-in-object --save-dev
```
项目已配置使用最新的 `@babel/plugin-transform-private-property-in-object` 插件替代已废弃的 `@babel/plugin-proposal-private-property-in-object`。
### CloudBase SDK 警告
#### wx.getSystemInfoSync 废弃警告
在微信小程序中运行时,可能会看到 `wx.getSystemInfoSync is deprecated` 的警告。这是 CloudBase SDK 内部使用的微信 API 已废弃导致的,属于正常现象,不影响功能使用。
**解决方案:**
- 这些警告来自 CloudBase SDK 内部,项目代码已优化为使用单例模式避免重复初始化
- 等待 CloudBase 官方更新 SDK 以使用新的 API
- 当前版本已更新到 `@cloudbase/js-sdk@2.18.0` 以减少警告
#### CloudBase 实例重复创建警告
如果看到 `every cloudbase instance should has only one auth object` 警告,说明 CloudBase 实例被重复创建。
**解决方案:**
项目已实现单例模式,确保 CloudBase 实例只创建一次:
```typescript
// 单例模式,避免重复创建实例
let appInstance: any = null;
let isInitializing = false;
export const getApp = () => {
if (!appInstance && !isInitializing) {
isInitializing = true;
appInstance = init();
isInitializing = false;
}
return appInstance;
};
```
### 高德地图 JSAPI 错误
#### AMap JSAPI can only be used in Browser
在微信小程序中运行时,可能会看到 `AMap JSAPI can only be used in Browser` 错误。这是因为高德地图的 JSAPI 只能在浏览器环境中使用,不能在微信小程序中直接使用。
**解决方案:**
项目已使用 UniApp 的条件编译功能,确保高德地图相关代码只在 H5 端加载:
```typescript
// 在页面中条件导入
// #ifdef H5
import MapService from '../../components/MapService.vue'
import { loadAMap } from '../../utils/amapLoader'
// #endif
// 在组件中条件使用
// #ifdef H5
await loadAMap()
// #endif
```
**平台支持说明:**
- **H5 端**:使用高德地图 JSAPI 提供完整的地图功能
- **微信小程序**:使用微信小程序原生地图组件 `