diff --git a/src/pages/base/gzs/jc.vue b/src/pages/base/gzs/jc.vue index ed54c9c..613602c 100644 --- a/src/pages/base/gzs/jc.vue +++ b/src/pages/base/gzs/jc.vue @@ -49,9 +49,9 @@ async function submit() { setData({ sign_file: sign_file.value, }); - uni.reLaunch({ - url: "/pages/base/jc/bm", - }); + uni.reLaunch({ + url: "/pages/base/jc/bm", + }); } diff --git a/src/pages/base/home/xsXz.vue b/src/pages/base/home/xsXz.vue index 1814a2e..0326956 100644 --- a/src/pages/base/home/xsXz.vue +++ b/src/pages/base/home/xsXz.vue @@ -16,7 +16,7 @@ import XsPicker from "@/pages/base/components/XsPicker/index.vue" import { useDataStore } from "@/store/modules/data"; import { useUserStore } from "@/store/modules/user"; const { getGlobal } = useDataStore(); -const { checkXqk, checkJlb, setXsPickerInitialized } = useUserStore(); +const { checkXqk, checkJlb, checkJc, setXsPickerInitialized } = useUserStore(); const switchXs = (xs: any) => { // 设置学生选择器已初始化标记 @@ -26,6 +26,8 @@ const switchXs = (xs: any) => { checkXqk(); } else if (getGlobal.type == 2) { checkJlb(); + } else if (getGlobal.type == 3) { + checkJc(); } else { } } diff --git a/src/pages/base/jc/README.md b/src/pages/base/jc/README.md index 5662603..153da0f 100644 --- a/src/pages/base/jc/README.md +++ b/src/pages/base/jc/README.md @@ -1,78 +1,75 @@ -# JC模块 - 就餐标准管理 +# 就餐模块业务逻辑调整说明 -## 功能概述 +## 概述 +参照选课的处理和业务逻辑,对就餐相关的业务逻辑进行了调整,实现了统一的状态管理和页面跳转逻辑。 -JC模块是用于管理学生就餐标准的前端模块,包含以下主要功能: +## 主要调整 -### 1. 就餐标准列表 (`/pages/base/jc/index.vue`) -- 显示当前学期可用的就餐标准 -- 支持学生选择器切换不同学生 -- 展示就餐标准的基本信息(名称、价格、描述) +### 1. useUserStore中的checkJc方法完善 +- **位置**: `src/store/modules/user.ts` +- **功能**: 根据后端返回的type值进行页面跳转 +- **逻辑**: + - `type = 1`: 未选择(返回可选标准列表)→ 跳转到报名页面 `/pages/base/jc/bm` + - `type = 2`: 待支付 → 跳转到支付页面 `/pages/base/jc/pay/index` + - `type = 3`: 已支付 → 跳转到已选择页面 `/pages/base/jc/index` -### 2. 就餐标准详情 (`/pages/base/jc/detail.vue`) -- 显示就餐标准的详细信息 -- 包含标准描述、使用说明、注意事项等 -- 支持图片展示 +### 2. 页面整合 +- **删除页面**: + - `detail.vue` - 就餐标准详情页面 + - `bm-detail.vue` - 报名详情页面 +- **整合到**: `index.vue` - 已选择就餐标准展示页面 -### 3. 就餐标准报名 (`/pages/base/jc/bm.vue`) -- 支持多选就餐标准 -- 实时计算总金额 -- 确认报名后跳转到支付页面 +### 3. index.vue页面重构 +- **功能**: 展示已选择的就餐标准信息 +- **包含内容**: + - 就餐标准基本信息(名称、价格、描述、有效期) + - 报名信息(报名时间、支付状态、订单号) + - 使用说明 + - 注意事项 +- **状态处理**: + - 有已选择标准:显示详细信息 + - 无已选择标准:显示空状态,提供"立即报名"按钮 -### 4. 支付流程 (`/pages/base/jc/pay/`) -- 支付页面 (`index.vue`):显示报名信息和支付倒计时 -- 支付等待页面 (`wait.vue`):处理支付回调 -- 支付成功页面 (`success.vue`):支付成功提示 -- 支付失败页面 (`fail.vue`):支付失败处理 +### 4. bm.vue页面调整 +- **跳转逻辑**: 已报名时跳转到 `index.vue` 而不是已删除的 `bm-detail.vue` -### 5. 就餐记录 (`/pages/base/jc/record.vue`) -- 显示学生的就餐记录历史 -- 包含就餐日期、状态、地点等信息 +### 5. 后端接口对应 +- **接口**: `/mobile/jz/jc/getJcBzList` +- **返回类型**: `AppJzXsJcVo` +- **type字段含义**: + - `1`: 未选择(返回可选标准列表) + - `2`: 待支付 + - `3`: 已支付 -## 组件结构 +## 页面跳转流程 -### 核心组件 -- `JcBzList` (`/pages/base/components/JcBzList/index.vue`):就餐标准列表组件 -- `JcRecordList` (`/pages/base/components/JcRecordList/index.vue`):就餐记录列表组件 +### 通过launchPage的type=3进入 +1. **useUserStore.toHome(type=3)** → 调用checkJc() +2. **checkJc()** → 调用后端接口获取就餐状态 +3. **根据返回的type值跳转**: + - type=1 → `/pages/base/jc/bm` (报名页面) + - type=2 → `/pages/base/jc/pay/index` (支付页面) + - type=3 → `/pages/base/jc/index` (已选择页面) -### API接口 -所有JC相关的API接口都集中在 `jcApi.ts` 文件中,包括: -- 获取就餐标准列表 -- 获取就餐标准详情 -- 学生报名就餐标准 -- 取消报名 -- 发起支付 -- 查询支付状态 -- 获取就餐记录等 +### 页面间跳转 +- **报名成功** → 跳转到支付页面 +- **支付成功** → 跳转到已选择页面 +- **查看详情** → 在已选择页面中展示完整信息 -## 数据流 +## 技术实现 -1. **报名流程**: - - 学生选择就餐标准 → 确认报名 → 跳转支付页面 → 完成支付 +### 前端 +- **状态管理**: 使用Pinia store管理用户状态和就餐数据 +- **页面路由**: 使用uni.reLaunch进行页面跳转 +- **数据获取**: 通过API接口获取就餐状态和详情信息 -2. **数据存储**: - - 使用 Pinia store 管理状态 - - 本地存储保存选中状态 - - 支付数据通过 store 传递 - -## 技术特点 - -- 采用 Vue 3 Composition API -- 使用 TypeScript 进行类型检查 -- 响应式设计,支持移动端 -- 模块化组件设计 -- 统一的错误处理机制 +### 后端 +- **状态检查**: 通过Redis缓存和数据库查询确定就餐状态 +- **类型定义**: 使用AppJzXsJcVo统一返回格式 +- **业务逻辑**: 参照选课模块的实现方式 ## 注意事项 - -1. 支付倒计时功能需要后端提供倒计时接口 -2. 多选功能需要合理处理数据同步 -3. 支付状态查询需要定时轮询 -4. 图片资源需要正确的路径处理 - -## 扩展建议 - -1. 可以添加就餐标准筛选功能 -2. 支持按时间范围查询就餐记录 -3. 添加就餐统计功能 -4. 支持批量操作就餐标准 \ No newline at end of file +1. 确保后端接口返回的type值与前端期望一致 +2. 页面跳转使用uni.reLaunch确保正确的页面栈管理 +3. 数据获取失败时使用备用方案(跳转到报名页面) +4. 删除的页面文件已清理,避免引用错误 \ No newline at end of file diff --git a/src/pages/base/jc/bm-detail.vue b/src/pages/base/jc/bm-detail.vue deleted file mode 100644 index 3a8c7d0..0000000 --- a/src/pages/base/jc/bm-detail.vue +++ /dev/null @@ -1,295 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/pages/base/jc/bm.vue b/src/pages/base/jc/bm.vue index 86abe52..fc8b166 100644 --- a/src/pages/base/jc/bm.vue +++ b/src/pages/base/jc/bm.vue @@ -170,15 +170,15 @@ const confirmBm = async () => { title: '提示', content: '您已经报名了该就餐标准,是否查看报名详情?', success: (modalRes) => { - if (modalRes.confirm) { - // 跳转到报名详情页面 - uni.redirectTo({ - url: '/pages/base/jc/bm-detail' - }); - } else { - // 返回上一页 - uni.navigateBack(); - } + if (modalRes.confirm) { + // 跳转到已选择页面 + uni.redirectTo({ + url: '/pages/base/jc/index' + }); + } else { + // 返回上一页 + uni.navigateBack(); + } } }); } else { diff --git a/src/pages/base/jc/detail.vue b/src/pages/base/jc/detail.vue deleted file mode 100644 index fb3871d..0000000 --- a/src/pages/base/jc/detail.vue +++ /dev/null @@ -1,285 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/pages/base/jc/index.vue b/src/pages/base/jc/index.vue index 7f52abc..c69d4ac 100644 --- a/src/pages/base/jc/index.vue +++ b/src/pages/base/jc/index.vue @@ -1,42 +1,214 @@ diff --git a/src/pages/system/launchPage/launchPage.vue b/src/pages/system/launchPage/launchPage.vue index c892b40..b124d74 100644 --- a/src/pages/system/launchPage/launchPage.vue +++ b/src/pages/system/launchPage/launchPage.vue @@ -22,6 +22,12 @@ const { setGlobal } = useDataStore(); const userStore = useUserStore(); const isShow = ref(true); +const toLogin = () => { + uni.reLaunch({ + url: "/pages/system/login/login", + }); +}; + onLoad(async (data: any) => { setGlobal(data); if (data && data.openId) { @@ -42,20 +48,12 @@ onLoad(async (data: any) => { } // 直接跳转到首页,关注检查在首页进行 userStore.toHome(data.type); - } else { - uni.reLaunch({ - url: "/pages/system/login/login", - }); + return; } } catch (err) { - uni.reLaunch({ - url: "/pages/system/login/login", - }); + toLogin(); } - } else { - uni.reLaunch({ - url: "/pages/system/login/login", - }); } + toLogin(); }); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 43875b1..4d1e611 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,6 +1,7 @@ import { defineStore } from "pinia"; import { authenticationApi, loginCode, loginPass, weChatLogin, checkOpenId } from "@/api/system/login"; import { checkXsXkByTypeApi, xsKxApi } from "@/api/base/xkApi"; +import { jcGetJcBzListApi } from "@/api/base/jcApi"; import { AUTH_KEY } from "@/config"; import { imagUrl } from "@/utils"; import { useWebSocket } from '@/utils/webSocket/webSocket' @@ -228,6 +229,15 @@ export const useUserStore = defineStore({ url: "/pages/base/home/xsXz", }); } + } else if (type == 3) { + // 俱乐部逻辑: 判断当前学生列表 + if (this.userdata.xsList && this.userdata.xsList.length == 1) { + this.checkJc(); + } else if (this.userdata.xsList && this.userdata.xsList.length > 1) { + uni.reLaunch({ + url: "/pages/base/home/xsXz", + }); + } } else { uni.reLaunch({ url: "/pages/base/home/index", @@ -267,12 +277,11 @@ export const useUserStore = defineStore({ default: // 默认跳转到告知书页面 uni.reLaunch({ - url: "/pages/base/gzs/xqk", + url: "/pages/base/gzs/xkXqk", }); return; } } - // 接口调用失败,使用备用方案 this.checkXqkFallback(); } catch (error) { @@ -303,12 +312,12 @@ export const useUserStore = defineStore({ } } uni.reLaunch({ - url: "/pages/base/gzs/xqk", + url: "/pages/base/gzs/xkXqk", }); } catch (error) { console.error("备用方案也失败:", error); uni.reLaunch({ - url: "/pages/base/gzs/xqk", + url: "/pages/base/gzs/xkXqk", }); } }, @@ -345,7 +354,7 @@ export const useUserStore = defineStore({ default: // 默认跳转到告知书页面 uni.reLaunch({ - url: "/pages/base/gzs/jlb", + url: "/pages/base/gzs/xkJlb", }); return; } @@ -382,12 +391,71 @@ export const useUserStore = defineStore({ } } uni.reLaunch({ - url: "/pages/base/gzs/jlb", + url: "/pages/base/gzs/xkJlb", }); } catch (error) { console.error("备用方案也失败:", error); uni.reLaunch({ - url: "/pages/base/gzs/jlb", + url: "/pages/base/gzs/xkJlb", + }); + } + }, + // 就餐查询 - 优化版本 + async checkJc() { + try { + // 使用getJcBzList接口获取详细就餐信息 + const res = await jcGetJcBzListApi({ + xsId: this.curXs.id + }); + + if (res.resultCode === 1) { + const data = res.result; + const type = data.type; + + switch (type) { + case 1: // 未选择(返回可选标准列表)- 跳转到报名页面 + uni.reLaunch({ + url: "/pages/base/jc/bm", + }); + return; + case 2: // 待支付 - 跳转到支付页面 + uni.reLaunch({ + url: "/pages/base/jc/pay/index", + }); + return; + case 3: // 已支付 - 跳转到已选择页面 + uni.reLaunch({ + url: "/pages/base/jc/index", + }); + return; + default: + // 默认跳转到报名页面 + uni.reLaunch({ + url: "/pages/base/gzs/jc", + }); + return; + } + } + + // 接口调用失败,使用备用方案 + this.checkJcFallback(); + } catch (error) { + console.error("查询就餐状态失败:", error); + // 异常情况,使用备用方案 + this.checkJcFallback(); + } + }, + // 就餐备用检查方案 + async checkJcFallback() { + try { + // 备用方案:直接跳转到报名页面 + uni.reLaunch({ + url: "/pages/base/gzs/jc", + }); + } catch (error) { + console.error("备用方案也失败:", error); + uni.reLaunch({ + url: "/pages/base/gzs/jc", }); } },