修订说明:根据最新需求调整,底部导航变更为“首页”、“我的订单”、“我的信息”、“我的账户”。打赏支付仅使用钱包余额,采用即时扣款模式。细化帖子详情(专家信息、标签、往期命中)及订单状态逻辑。
本文档为“咕咕嘎嘎论坛”用户端前端的详细设计,基于最新确认的需求编写,指导开发人员使用 Vue 3 + Element Plus 进行工程实现。文档覆盖项目架构、路由、组件拆分、状态管理、样式、接口对接及关键业务流程。
| 类别 | 选型 | 说明 |
|---|---|---|
| 框架 | Vue 3 (Composition API) | 组合式 API,逻辑复用与类型推断 |
| UI 组件库 | Element Plus | 提供统一的企业级 UI 组件 |
| 状态管理 | Pinia | Vue 3 官方推荐,模块化、TypeScript 友好 |
| 路由 | Vue Router 4 | SPA 路由管理 |
| HTTP 客户端 | Axios | 拦截器封装、统一错误处理 |
| CSS 预处理器 | SCSS | 变量、混入、嵌套 |
| 图标库 | Element Plus Icons / 自定义 SVG | 导航及功能图标 |
| 构建工具 | Vite | 快速开发与打包 |
| 适配方案 | postcss-px-to-viewport (可选) | H5 移动端适配,按需启用 |
底部导航四个主 Tab 对应路由,使用 meta.tab 标识:
| 路径 | 页面组件 | Tab 标识 | 说明 |
|---|---|---|---|
/ |
Home | home | 首页(帖子列表、搜索) |
/orders |
Orders | orders | 我的订单(打赏订单) |
/notifications |
Notifications | notifications | 我的信息(系统消息) |
/profile |
Profile | profile | 我的账户(个人中心) |
/post/:id |
PostDetail | - | 帖子详情(从首页进入) |
/wallet |
Wallet | - | 钱包(余额/充值/提现) |
/edit-profile |
EditProfile | - | 修改个人信息 |
/page/privacy |
StaticPage | - | 隐私协议 |
/page/complaint |
StaticPage | - | 投诉反馈 |
/page/contact |
StaticPage | - | 联系客服 |
/page/faq |
StaticPage | - | 常见问题 |
注意:PostDetail 由首页点击进入,不在底部导航,返回时保留浏览位置。
userInfo (id, username, avatar, mobile, role, level, balance, isRealname), tokenfetchUserInfo(), updateBalance(amount), updateProfile(data), logout()isLoggedIn, levelBadge (黄金/钻石/大师)posts, currentStatus (全部/公开/在售/命中/未命中), searchKeyword, paginationfetchPosts(status, keyword), fetchPostDetail(id), loadMore()orders, activeFilter (全部/未支付/已取消/已完成)fetchOrders(filter), createAndPayOrder(postId) (创建并即时支付), cancelOrder(id)messages, unreadCountfetchNotifications(), markRead(id)route.meta.tab 切换激活样式。post { id, title, expertName, tags, price, publishTime, viewCount, status, isTodayNew }el-tag 列表)、价格、发布时间(相对时间)、查看人数图标。当日帖子显示“最新”角标。/post/:id。expert { name, avatar, level, realnameVerified, brief }visible, postTitle, amount, balance@confirm, @cancelel-dialog 模态框,标题“确认打赏”,展示内容:帖子标题、打赏金额、当前钱包余额。确认按钮带 loading,避免重复提交。不允许点击遮罩关闭。endTime (时间戳)@timeoutmm:ss 倒计时,归零触发事件。用于订单未支付倒计时(若存在)。textnoticeTextdescriptionel-empty,自定义图片与文字。el-input 支持标题关键字,el-select 选择状态(全部/公开/在售/命中/未命中),搜索按钮或回车触发。v-infinite-scroll)或分页,空状态使用 EmptyState。onMounted 调用 postStore.fetchPosts。idExpertInfoCard 展示。userStore.balance >= post.price,不足则 ElMessage.warning('余额不足,请先充值') 并引导去钱包。PayConfirm 弹窗,确认后调用 orderStore.createAndPayOrder(postId)。el-tag:已命中/未命中)。el-radio-group 或 el-tabs,选项:全部、未支付、已取消、已完成。EmptyState。el-avatar)、用户名称、等级徽章、用户ID(右侧复制按钮,使用 navigator.clipboard.writeText)。/wallet/page/privacy/page/complaint/page/contact/page/faq/edit-profileel-cell-group 构建菜单。el-statistic 组件。el-dialog,输入金额(充值:模拟增加余额;提现:提交申请,需后台审核,前端仅展示交互)。el-form,提交后调用更新用户信息接口。el-upload 组件,限制大小和格式。type,根据类型渲染不同静态内容(隐私协议等)。目前为占位,内容由后端配置或前端硬编码占位文本。backdrop-filter: blur(12px) 配合半透明背景实现。padding-bottom: env(safe-area-inset-bottom))。box-shadow: 0 2px 8px rgba(0,0,0,0.08),圆角 8px。api/request.ts:
baseURL 来自环境变量。Authorization token。code,非正常时 ElMessage.error;401 清除登录态并跳转登录页。get/post/put/delete 方法。el-select,选项:全部、公开、在售、命中、未命中。el-input,支持防抖 (300ms)。?status=在售&keyword=xx。PayConfirm 弹窗,展示价格和余额。POST /api/orders/pay-direct (或合并创建与支付) 传入 postId,请求头携带幂等键 X-Request-Id。code 对应消息,前端提示,不关闭弹窗或关闭后提示。由于是即时扣款,订单状态直接为“已完成”,不存在未支付状态,因此“订单过期时间”不适用。
el-badge)。localStorage 标记,自动弹出声明弹窗;点击“我已知晓”后标记并关闭。所有接口返回统一结构:{ code: 200, message: "success", data: {...} }
关键接口列表:
| 接口 | 方法 | 说明 |
|---|---|---|
/api/posts |
GET | 获取帖子列表,参数:status, keyword, page, size |
/api/posts/:id |
GET | 帖子详情,包含付费内容(如果已购买) |
/api/posts/:id/pay |
POST | 创建订单并支付,请求体:{ postId } (可省略),header: X-Request-Id |
/api/orders |
GET | 我的订单列表,参数:status (all/unpaid/cancelled/completed) |
/api/notifications |
GET | 系统消息列表 |
/api/notifications/:id/read |
PUT | 标记消息已读 |
/api/user/profile |
GET/PUT | 获取/更新个人信息 |
/api/user/balance |
GET | 获取余额 |
/api/wallet/recharge |
POST | 充值,请求体:{ amount } |
/api/wallet/withdraw |
POST | 提现申请,请求体:{ amount } |
/api/wallet/transactions |
GET | 资金明细,参数:page, size |
/api/config/site |
GET | 获取网站名称、logo、公告等动态配置 |
分页格式:{ list: [], total: 100, page: 1, pageSize: 10 }
ElMessage.error('网络异常,请稍后重试')。message 并提示。v-loading 或骨架屏 el-skeleton;按钮点击后 loading 禁止重复提交。EmptyState 组件。文档版本:v2.0
编写日期:2026-06-14
状态:待评审