# 羽声语音 H5 项目交接文档 ## 📋 项目概述 **项目名称:** 羽声语音 H5 内嵌页面 **技术栈:** uni-app + Vue.js **开发平台:** HBuilderX **运行环境:** 微信公众号 H5、APP 内嵌 WebView **API 地址:** https://yushengapi.qxyushen.top --- ## 🏗️ 项目结构 ``` 羽声语音H5/ ├── component/ # 公共组件 │ ├── nav.vue # 导航栏组件 │ ├── avatar.vue # 头像组件 │ ├── table.vue # 表格组件 │ ├── newTable.vue # 新版表格组件 │ ├── tab.vue # 标签页组件 │ ├── swiper.vue # 轮播图组件 │ ├── uploadImage.vue # 图片上传组件 │ ├── LevelProgress.vue # 等级进度条组件 │ ├── MiddlePopup.vue # 中间弹窗组件 │ └── headerHeight.vue # 头部高度组件 │ ├── pages/ # 页面目录 │ ├── union/ # 公会相关页面 │ │ ├── index.vue # 公会首页 │ │ ├── list.vue # 公会列表(搜索加入) │ │ ├── agreement.vue # 公会协议 │ │ ├── exitApplication.vue # 退出审核 │ │ ├── historyRecord.vue # 补贴历史记录 │ │ ├── setGroup.vue # 群聊设置 │ │ └── memberList.vue # 群聊成员 │ │ │ ├── other/ # 其他功能页面 │ │ ├── weChatPay.vue # 微信充值页面 ⭐ │ │ ├── taskDesc.vue # 规则说明 │ │ ├── grade.vue # 等级页面 │ │ ├── gradeRule.vue # 等级规则 │ │ ├── income.vue # 邀请收益 │ │ └── aboutUs.vue # 关于我们 │ │ │ ├── prop/ # 道具相关 │ │ └── propMall.vue # 道具商城 │ │ │ └── feedback/ # 反馈相关 │ ├── help.vue # 帮助与反馈 │ ├── customerService.vue # 在线客服 │ ├── feedback.vue # 反馈问题 │ ├── teenage.vue # 青少年模式 │ ├── teenageDetail.vue # 青少年详情 │ ├── problemDetail.vue # 问题详情 │ └── report.vue # 举报 │ ├── until/ # 工具类 │ ├── config.js # 全局配置 ⭐ │ ├── http.js # HTTP 请求封装 │ ├── request.js # Axios 请求拦截器 │ └── wxpay.js # 微信支付工具 ⭐ │ ├── static/ # 静态资源 │ ├── image/ # 图片资源 │ ├── customicons.css # 自定义图标 │ ├── customicons.ttf # 图标字体 │ ├── public.css # 公共样式 │ ├── youshe.ttf # 羽声字体 │ └── che.mp4 # 视频资源 │ ├── uni_modules/ # uni-app 插件 │ ├── uni-ui/ # uni-ui 组件库 │ ├── simple-pdf-viewer/ # PDF 查看器 │ └── ... # 其他 uni-app 官方组件 │ ├── App.vue # 应用入口 ├── main.js # 主入口文件 ├── pages.json # 页面配置 ├── manifest.json # 应用配置 ├── uni.scss # 全局样式变量 └── package.json # 依赖配置 ``` --- ## 🔑 核心功能模块 ### 1. 公会系统 (pages/union/) #### 1.1 公会列表与加入 (list.vue) **功能描述:** - 搜索公会(支持公会ID/昵称) - 查看公会信息(头像、名称、简介、会长、在线人数) - 申请加入公会 - 实名认证检查与跳转 ⭐ **关键逻辑:** ```javascript // 实名认证流程 1. 用户点击"申请"按钮 2. 调用接口检查实名状态 (/api/User/get_user_info) 3. 已实名 → 显示加入确认弹窗 4. 未实名 → 提示跳转 APP 实名认证 5. 从 APP 返回时自动刷新实名状态(onShow 生命周期) ``` **重要更新:** - ✅ 添加了实名状态缓存机制(user_auth_status) - ✅ 添加了防抖机制(3秒内不重复请求) - ✅ 解决了从 APP 返回后仍提示未实名的问题 **与 APP 交互:** ```javascript // iOS window.webkit.messageHandlers.nativeHandler.postMessage({ 'action': 'enterAuthent' }); // Android window.Android.enterAuthent(); ``` #### 1.2 公会首页 (index.vue) - 公会信息展示 - 成员管理 - 公会设置 #### 1.3 其他公会功能 - 退出审核 (exitApplication.vue) - 补贴历史记录 (historyRecord.vue) - 群聊设置 (setGroup.vue) - 群聊成员 (memberList.vue) --- ### 2. 微信充值系统 (pages/other/weChatPay.vue) 未完善⭐ **功能描述:** - 用户输入羽声语音 ID - 选择充值金额(300-10000 金币) - 同意充值协议 - 调起微信公众号支付 **完整支付流程:** ``` 1. 用户输入 ID ↓ 2. 选择充值金额(卡片变绿表示选中) ↓ 3. 勾选"我已阅读并同意《充值协议》" ↓ 4. 点击"立即支付"按钮 ↓ 5. 验证:ID、金额、协议 ↓ 6. 生成订单号(YS + 时间戳 + 随机数) ↓ 7. 调用后端接口创建支付订单 ↓ 8. 调起微信 JS-SDK 支付 ↓ 9. 用户完成支付 ↓ 10. 返回支付结果 ``` **关键代码:** ```javascript // 支付入口 handlePay() { // 1. 验证用户ID // 2. 验证充值金额 // 3. 验证协议同意 // 4. 调用微信支付 const result = await wxPay.pay(payAmount, orderNo, attach); } ``` **支付工具类 (until/wxpay.js):** - 微信环境检测 - 微信授权获取 openid - 初始化微信 JS-SDK - 创建支付订单 - 发起微信支付 - 验证支付结果 **后端接口依赖:** - `/api/wx/auth` - 获取 openid - `/jssdk/config` - 获取 JS-SDK 配置 - `/api/wxpay/unifiedorder` - 创建支付订单 - `/api/wxpay/query` - 查询支付结果 --- ### 3. 其他功能模块 #### 3.1 等级系统 - 等级展示 (grade.vue) - 等级规则说明 (gradeRule.vue) #### 3.2 邀请收益 - 邀请收益统计 (income.vue) #### 3.3 道具商城 - 道具列表与购买 (propMall.vue) #### 3.4 帮助与反馈 - 帮助中心 (help.vue) - 在线客服 (customerService.vue) - 问题反馈 (feedback.vue) - 举报功能 (report.vue) #### 3.5 青少年模式 - 青少年模式设置 (teenage.vue) - 青少年详情 (teenageDetail.vue) --- ## ⚙️ 配置说明 ### 1. 全局配置 (until/config.js) ```javascript // API 基础地址 const BASE_URL = "https://yushengapi.qxyushen.top"; // 图片资源地址 const BASE_IMAGE_URL = "https://yushengapi.qxyushen.top/h5/image/"; // IM 配置 const IM_APP_TOKEN = "67962a777e2b13bc6a4bde3ccd389d1e"; // 主题色 const BASR_COLOR = '#3ABC6D'; // 项目名称 const BASE_NAME = '羽声语音'; ``` **环境切换:** ```javascript // 正式环境 const BASE_URL = "https://yushengapi.qxyushen.top"; // 测试环境 // const BASE_URL = "https://test.vespa.qxyushen.top"; ``` ### 2. 页面配置 (pages.json) - 所有页面使用自定义导航栏 (`navigationStyle: "custom"`) - 部分页面禁用 iOS 左滑返回 (`popGesture: "none"`) ### 3. 应用配置 (manifest.json) - 配置应用名称、版本号 - 配置微信公众号 appid - 配置权限申请 --- ## 🔌 API 接口说明 ### 基础配置 - **Base URL:** `https://yushengapi.qxyushen.top` - **请求方式:** GET / POST / PUT / DELETE - **认证方式:** Token(存储在 localStorage) ### 主要接口列表 #### 用户相关 ``` GET /api/User/get_user_info # 获取用户信息(含实名状态) ``` #### 公会相关 ``` GET /api/Guild/guild_list # 获取公会列表 POST /api/Guild/join_guild # 申请加入公会 ``` #### 支付相关 ``` GET /api/wx/auth # 微信授权获取 openid GET /jssdk/config # 获取微信 JS-SDK 配置 POST /api/wxpay/unifiedorder # 创建支付订单 GET /api/wxpay/query # 查询支付结果 ``` ### 请求示例 ```javascript // GET 请求 http.get('/api/User/get_user_info', { token: uni.getStorageSync('token') }) // POST 请求 http.post('/api/Guild/join_guild', { guild_id: 123, token: uni.getStorageSync('token') }) ``` --- ## 🎨 样式规范 ### 1. 颜色变量 ```scss --primary-color: #3ABC6D; // 主题色(绿色) --subss-color: #3ABC6D; // 辅助色 --font-button-color: #FFFFFF; // 按钮文字色 --font-button-size: 28rpx; // 按钮文字大小 ``` ### 2. 尺寸单位 - 使用 `rpx` 作为响应式单位(750rpx = 屏幕宽度) - 字体大小:24rpx、28rpx、32rpx、44rpx - 圆角:20rpx、44rpx、68rpx ### 3. 公共样式类 ```scss .flex-line // 横向弹性布局 .w-fill // 宽度 100% .truncate // 单行文本省略 .color-3 // 文字颜色 #333 .font-24 // 字体大小 24rpx .font-32 // 字体大小 32rpx .ml-20 // 左边距 20rpx ``` --- ## 🔧 开发环境配置 ### 1. 环境要求 - **Node.js:** v14.0.0+ - **HBuilderX:** 最新版本 - **微信开发者工具:** 用于调试微信公众号功能 ### 2. 安装依赖 ```bash npm install # 或 pnpm install ``` ### 3. 主要依赖 ```json { "axios": "^1.9.0", // HTTP 请求库 "office-viewer": "^0.3.14", // Office 文档查看 "simple-pdf-viewer": "^2.0.3", // PDF 查看 "video-animation-player": "^1.0.5", // 视频播放 "vue-i18n": "^11.1.5" // 国际化 } ``` ### 4. 运行项目 #### 方式一:HBuilderX 1. 使用 HBuilderX 打开项目 2. 选择运行 → 运行到浏览器 / 运行到手机或模拟器 3. 选择运行到微信开发者工具(需配置微信开发者工具路径) #### 方式二:命令行 ```bash # 开发环境 npm run dev:h5 # 生产构建 npm run build:h5 ``` --- ## 📱 与 APP 交互说明 ### 1. 调用 APP 原生功能 #### iOS 交互 ```javascript // 调用 iOS 原生方法 window.webkit.messageHandlers.nativeHandler.postMessage({ 'action': 'enterAuthent' // 跳转实名认证 }); ``` #### Android 交互 ```javascript // 调用 Android 原生方法 window.Android.enterAuthent(); // 跳转实名认证 ``` ### 2. 接收 APP 传递的参数 ```javascript // 在 onLoad 或 onShow 中接收参数 onShow(options) { if (options && options.guild_id) { // 处理 APP 传递的公会 ID this.searchValue = options.guild_id; } } ``` ### 3. 页面生命周期注意事项 - **onShow:** 每次页面显示都会触发(包括从 APP 返回) - **onLoad:** 只在页面首次加载时触发 - **从 APP 返回时:** 使用 onShow 刷新数据状态 --- ## 🐛 常见问题与解决方案 ### 1. 实名认证问题 **问题:** 从 APP 完成实名认证返回后,仍提示未实名 **原因:** - 页面状态未刷新 - 接口缓存导致获取的是旧数据 **解决方案:** ```javascript // 在 onShow 中刷新用户信息 onShow() { this.refreshUserInfo(); // 获取最新实名状态 } // 添加防抖机制避免频繁请求 async refreshUserInfo(force = false) { const now = Date.now(); if (!force && now - this.lastRefreshTime < 3000) { return; // 3秒内不重复请求 } // ... 请求逻辑 } ``` ### 2. 微信支付问题 **问题:** 微信支付调起失败 **可能原因:** 1. 未在微信环境中打开 2. 微信 JS-SDK 未正确初始化 3. 支付参数错误 4. 微信公众号配置问题 **排查步骤:** ```javascript // 1. 检查是否在微信环境 const isWeixin = /micromessenger/i.test(navigator.userAgent); // 2. 检查 JS-SDK 初始化 wx.ready(() => { console.log('微信 JS-SDK 初始化成功'); }); wx.error((err) => { console.error('微信 JS-SDK 初始化失败:', err); }); // 3. 开启调试模式查看详细错误 wx.config({ debug: true, // 开启调试 // ... }); ``` ### 3. 样式兼容问题 **问题:** iOS 和 Android 样式显示不一致 **解决方案:** ```javascript // 获取平台信息 const platform = uni.getSystemInfoSync().platform; // 根据平台设置不同样式 :style="{ marginTop: `${statusBarHeight}${platform === 'ios' ? 'px' : 'dp'}` }" ``` ### 4. 图片加载失败 **问题:** 图片显示不出来 **解决方案:** ```javascript // 使用默认图片 // 图片加载错误处理 handleImageError(e) { e.target.src = this.defaultLogo; } ``` --- ## 🚀 部署说明 ### 1. 构建生产版本 ```bash # H5 构建 npm run build:h5 # 构建产物在 unpackage/dist/build/h5 目录 ``` ### 2. 部署到服务器 ```bash # 将构建产物上传到服务器 scp -r unpackage/dist/build/h5/* user@server:/var/www/html/ # 或使用 FTP 工具上传 ``` ### 3. Nginx 配置示例 ```nginx server { listen 80; server_name your-domain.com; root /var/www/html/h5; index index.html; location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, immutable"; } } ``` ### 4. 微信公众号配置 1. 登录微信公众平台 2. 设置 → 公众号设置 → 功能设置 3. 配置 JS 接口安全域名 4. 配置网页授权域名 5. 配置支付授权目录 --- ## 📝 开发注意事项 ### 1. 代码规范 - 使用 ES6+ 语法 - 组件命名使用 PascalCase - 方法命名使用 camelCase - 常量命名使用 UPPER_CASE - 添加必要的注释 ### 2. 性能优化 - 图片使用 CDN 加载 - 列表使用虚拟滚动(长列表) - 避免在 onShow 中频繁请求接口(添加防抖) - 合理使用缓存(localStorage) ### 3. 安全注意事项 - Token 存储在 localStorage - 敏感信息不要明文存储 - 接口请求添加 Token 验证 - 防止 XSS 攻击(用户输入过滤) ### 4. 测试要点 - 测试不同机型的兼容性(iOS / Android) - 测试微信环境和 APP 内嵌环境 - 测试网络异常情况 - 测试支付流程完整性 - 测试实名认证流程 --- ## 📞 联系方式与资源 ### 技术文档 - [uni-app 官方文档](https://uniapp.dcloud.net.cn/) - [微信 JS-SDK 文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html) - [微信支付文档](https://pay.weixin.qq.com/wiki/doc/api/index.html) ### 相关账号 - **微信公众号:** 羽声语音 - **API 域名:** https://yushengapi.qxyushen.top - **测试环境:** https://test.vespa.qxyushen.top ### 常用命令 ```bash # 安装依赖 npm install # 运行开发环境 npm run dev:h5 # 构建生产版本 npm run build:h5 # 清理缓存 npm run clean ```