From e7a726af5693d15dd50ed4437930ecb29432aa57 Mon Sep 17 00:00:00 2001 From: hebo Date: Mon, 16 Mar 2026 15:19:39 +0800 Subject: [PATCH] =?UTF-8?q?SAAS=E6=A8=A1=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/base/xkApi.ts | 7 + src/config.ts | 33 +++- src/pages/base/gzs/index.vue | 14 +- src/pages/base/home/index.vue | 20 +- src/pages/base/jc/bm.vue | 46 +++-- .../base/xk/components/XkPicker/index.vue | 32 +++- .../base/xk/components/XkkcList/index.vue | 17 +- src/pages/base/xk/detail.vue | 175 ++++++++++++++---- src/pages/base/xk/pay/index.vue | 36 +--- src/pages/base/xk/qk/index.vue | 18 +- src/pages/base/xk/qk/jlb.vue | 6 +- src/pages/base/xk/qk/wks.vue | 11 +- src/pages/base/xk/qk/xqk.vue | 3 + src/pages/base/xk/qk/yjz.vue | 49 +++-- src/pages/base/xszp/detail.vue | 56 +----- src/pages/base/xszp/submit.vue | 10 +- src/store/modules/menu.ts | 4 +- src/utils/pageUtil.ts | 34 ++-- src/utils/request/index.ts | 12 +- 19 files changed, 374 insertions(+), 209 deletions(-) diff --git a/src/api/base/xkApi.ts b/src/api/base/xkApi.ts index 55a9360..181c05c 100644 --- a/src/api/base/xkApi.ts +++ b/src/api/base/xkApi.ts @@ -8,6 +8,13 @@ export const checkXsXkApi = async (params: any) => { return await get("/mobile/jz/checkXsXk", params); }; +/** + * 校验学生选课并附带告知书内容(聚合接口,KQK 时一次返回选课状态与告知书,减少二次请求) + */ +export const checkXsXkWithGzsApi = async (params: any) => { + return await get("/mobile/jz/checkXsXkWithGzs", params); +}; + /** * 学生已选课程列表 */ diff --git a/src/config.ts b/src/config.ts index b7a1482..b2b0335 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,22 +1,32 @@ -const ip: string = "127.0.0.1:8897"; -const fwqip: string = "127.0.0.1:8897"; -//const ip: string = "lzcxsx.cn"; -//const fwqip: string = "lzcxsx.cn"; +// 测试环境 / 正式环境:开发时用测试地址,打包时用正式地址 +const isDev = process.env.NODE_ENV === "development"; +const ip: string = isDev ? "127.0.0.1:8897" : "lzcxsx.cn"; +const fwqip: string = isDev ? "127.0.0.1:8897" : "lzcxsx.cn"; + //const ip: string = "zhxy.yufangzc.com"; //const fwqip: string = "zhxy.yufangzc.com"; +//const ip: string = "lzcxsx.cn"; +//const fwqip: string = "lzcxsx.cn"; + //打包服务器接口代理标识 const SERVERAGENT: string = "/jzd-api"; //本地代理url地址,配置了就启动代理,没配置就不启动代理 export const HOMEAGENT: string = ""; +// 开发环境下,手机/平板访问时(非localhost)使用当前页面 host,避免 127.0.0.1 指向设备自身导致请求失败 +function getDevBaseUrl(): string { + if (typeof window !== "undefined" && window.location?.hostname && window.location.hostname !== "localhost" && window.location.hostname !== "127.0.0.1") { + return `http://${window.location.hostname}:8897/zhxy`; + } + return `http://${ip}/zhxy`; +} // 接口地址 export const BASE_URL: string = - process.env.NODE_ENV == "development" ? `http://${ip}/zhxy` : SERVERAGENT; -// WebSocket地址 -export const BASE_WS_URL: string = - process.env.NODE_ENV == "development" ? `ws://${ip}` : `wss://${fwqip}`; + process.env.NODE_ENV == "development" ? getDevBaseUrl() : SERVERAGENT; +// WebSocket地址:开发环境用 ws(无 SSL),正式环境用 wss +export const BASE_WS_URL: string = isDev ? `ws://${ip}` : `wss://${ip}`; //图片地址 -// export const BASE_IMAGE_URL: string = process.env.NODE_ENV == "development" ? `https://${ip}` : `http://${fwqip}`; -export const BASE_IMAGE_URL: string = `http://${fwqip}`; +// export const BASE_IMAGE_URL: string = process.env.NODE_ENV == "development" ? `https://${ip}` : `https://${fwqip}`; +export const BASE_IMAGE_URL: string = `https://${fwqip}`; // kkFileView预览服务地址 export const KK_FILE_VIEW_URL: string = `https://${fwqip}/kkpro`; //存token的key @@ -33,3 +43,6 @@ export const WHITELIST: WhiteList = []; export const THEMECOLOR: string = "#35468C"; // 启动vconsole export const ENABLE_VCONSOLE: boolean = false; // process.env.NODE_ENV != "development"; + +/** 就餐报名成功后跳转的支付链接(后续可改为接口/动态配置) */ +export const JC_PAY_REDIRECT_URL: string = "https://app.xiaoyuan.ccb.com/LHECRESM/V6/JFPAGENEW/index.html#/?schoolId=213245500"; diff --git a/src/pages/base/gzs/index.vue b/src/pages/base/gzs/index.vue index 8a73dc0..fab0b8f 100644 --- a/src/pages/base/gzs/index.vue +++ b/src/pages/base/gzs/index.vue @@ -25,13 +25,15 @@ @@ -351,12 +426,26 @@ const teachingPhilosophy = computed(() => { line-height: 1.6; .teaching-phase { - margin-bottom: 10px; + margin-bottom: 20px; &:last-child { margin-bottom: 0; } } + + .phase-title { + display: block; + font-weight: 600; + color: #333; + margin-bottom: 8px; + } + + .phase-content { + display: block; + font-size: 14px; + color: #666; + line-height: 1.6; + } .empty-data { display: flex; @@ -372,6 +461,26 @@ const teachingPhilosophy = computed(() => { } } +.attachment-list { + .attachment-item { + display: flex; + align-items: center; + padding: 12px 0; + border-bottom: 1px solid #f0f0f0; + + &:last-child { + border-bottom: none; + } + } + + .attachment-name { + flex: 1; + margin-left: 10px; + font-size: 14px; + color: #333; + } +} + .bottom-action { padding: 15px; margin-top: 20px; diff --git a/src/pages/base/xk/pay/index.vue b/src/pages/base/xk/pay/index.vue index ccc8519..2f1d332 100644 --- a/src/pages/base/xk/pay/index.vue +++ b/src/pages/base/xk/pay/index.vue @@ -30,8 +30,8 @@ - - 取消报名 + + 返回 {{ isPaySubmitting ? '支付中...' : '立即支付' }} @@ -54,9 +54,6 @@ const { getQk } = useDataStore(); // 为支付按钮创建防抖函数和状态 const { isProcessing: isPaySubmitting, debounce: payDebounce } = useDebounce(2000); -// 为取消报名按钮创建防抖函数和状态 -const { isProcessing: isCancelSubmitting, debounce: cancelDebounce } = useDebounce(2000); - const qk = ref({}); // 总金额 const totalJe = ref(0); @@ -168,40 +165,13 @@ const startCountdown = () => { }, 1000); }; -// 返回上一页 +// 返回首页 const goBack = () => { uni.reLaunch({ url: '/pages/base/home/index' }); }; -// 取消报名 -const cancelRegistration = () => { - uni.showModal({ - title: "取消报名", - content: "确定要取消报名吗?", - success: cancelDebounce(async (res) => { - if (res.confirm) { - try { - const res = await jzXkCancelApi({ - xsId: qk.value.xsId, - xkId: qk.value.xkId - }); - if (res.resultCode === 1) { - uni.showLoading({ title: "取消报名中,请稍后..." }); - } else { - uni.showToast({ title: res.message, icon: "none" }); - goBack(); - } - } catch (error) { - console.log(error); - goBack(); - } - } - }), - }); -}; - // 立即支付 const payNow = payDebounce(async () => { try { diff --git a/src/pages/base/xk/qk/index.vue b/src/pages/base/xk/qk/index.vue index f5a4985..583ec5c 100644 --- a/src/pages/base/xk/qk/index.vue +++ b/src/pages/base/xk/qk/index.vue @@ -74,9 +74,12 @@ const checkEnrollmentStatus = (xk: any) => { const endTime = new Date(xk.xkjstime).getTime(); if (now > endTime) { - // 选课已结束,跳转到结束页面 + // 选课已结束,用 redirectTo 替换当前页,避免浏览器返回时回到选课页 + console.log('[qk/index] 跳转 yjz,xk 数据:', xk); + console.log('[qk/index] xk 字段:', { xkmc: xk?.xkmc, xkkstime: xk?.xkkstime, xkjstime: xk?.xkjstime }); const courseInfo = encodeURIComponent(JSON.stringify(xk)); - uni.navigateTo({ + console.log('[qk/index] courseInfo 长度:', courseInfo.length); + uni.redirectTo({ url: `/pages/base/xk/qk/yjz?courseInfo=${courseInfo}` }); return true; @@ -119,11 +122,14 @@ const changeXkkc = (ids: any) => { selectedXkkcIds.value = ids; } -// 回到首页 +// 返回(有页面栈则返回上一页,否则回首页) const goBack = () => { - uni.reLaunch({ - url: '/pages/base/home/index' - }); + const pages = getCurrentPages(); + if (pages.length > 1) { + uni.navigateBack(); + } else { + uni.reLaunch({ url: '/pages/base/home/index' }); + } } // 提交选课 diff --git a/src/pages/base/xk/qk/jlb.vue b/src/pages/base/xk/qk/jlb.vue index f9533b5..92d635c 100644 --- a/src/pages/base/xk/qk/jlb.vue +++ b/src/pages/base/xk/qk/jlb.vue @@ -59,9 +59,11 @@ const checkEnrollmentStatus = (xk: any) => { const endTime = new Date(xk.xkjstime).getTime(); if (now > endTime) { - // 选课已结束,跳转到结束页面 + // 选课已结束,用 redirectTo 替换当前页,避免浏览器返回时回到选课页 + console.log('[qk/jlb] 跳转yjz,传入的xk:', xk); + console.log('[qk/jlb] xk.xkmc:', xk?.xkmc, 'xk.xkkstime:', xk?.xkkstime, 'xk.xkjstime:', xk?.xkjstime); const courseInfo = encodeURIComponent(JSON.stringify(xk)); - uni.navigateTo({ + uni.redirectTo({ url: `/pages/base/xk/qk/yjz?courseInfo=${courseInfo}` }); return true; diff --git a/src/pages/base/xk/qk/wks.vue b/src/pages/base/xk/qk/wks.vue index 9e40829..8811ab8 100644 --- a/src/pages/base/xk/qk/wks.vue +++ b/src/pages/base/xk/qk/wks.vue @@ -53,11 +53,14 @@ const { getData } = useDataStore(); const title = ref(""); -// 返回首页 +// 返回(有页面栈则返回上一页,否则回首页) const goHome = () => { - uni.reLaunch({ - url: "/pages/base/home/index" - }); + const pages = getCurrentPages(); + if (pages.length > 1) { + uni.navigateBack(); + } else { + uni.reLaunch({ url: "/pages/base/home/index" }); + } }; onLoad((options:any) => { diff --git a/src/pages/base/xk/qk/xqk.vue b/src/pages/base/xk/qk/xqk.vue index 66ac83d..853d857 100644 --- a/src/pages/base/xk/qk/xqk.vue +++ b/src/pages/base/xk/qk/xqk.vue @@ -60,7 +60,10 @@ const checkEnrollmentStatus = (xk: any) => { if (now > endTime) { // 选课已结束,跳转到结束页面 + console.log('[qk/xqk] 跳转 yjz,xk 数据:', xk); + console.log('[qk/xqk] xk 字段:', { xkmc: xk?.xkmc, xkkstime: xk?.xkkstime, xkjstime: xk?.xkjstime }); const courseInfo = encodeURIComponent(JSON.stringify(xk)); + console.log('[qk/xqk] courseInfo 长度:', courseInfo.length); uni.navigateTo({ url: `/pages/base/xk/qk/yjz?courseInfo=${courseInfo}` }); diff --git a/src/pages/base/xk/qk/yjz.vue b/src/pages/base/xk/qk/yjz.vue index 8345691..77665e9 100644 --- a/src/pages/base/xk/qk/yjz.vue +++ b/src/pages/base/xk/qk/yjz.vue @@ -72,8 +72,8 @@ diff --git a/src/pages/base/xszp/submit.vue b/src/pages/base/xszp/submit.vue index 29a53ec..38f7096 100644 --- a/src/pages/base/xszp/submit.vue +++ b/src/pages/base/xszp/submit.vue @@ -354,7 +354,7 @@ const generateFormSchema = () => { } }; } else if (zplx.zpfl === "scsp") { - // 上传视频 + // 上传视频(视频大小限制 50MB) componentConfig = { component: "ImageVideoUpload", componentProps: { @@ -363,7 +363,13 @@ const generateFormSchema = () => { enableFile: false, maxVideoCount: 30, uploadApi: attachmentUpload, - compressConfig: COMPRESS_PRESETS.medium, + compressConfig: { + ...COMPRESS_PRESETS.medium, + video: { + ...COMPRESS_PRESETS.medium.video, + maxSize: 50 * 1024 * 1024 + } + }, videoList: formData.value[fieldName] || [], showSectionTitle: false } diff --git a/src/store/modules/menu.ts b/src/store/modules/menu.ts index 26e24a2..2328748 100644 --- a/src/store/modules/menu.ts +++ b/src/store/modules/menu.ts @@ -2,9 +2,9 @@ import { defineStore } from "pinia"; import type { MobileMenuTreeNode } from "@/api/system/menu"; export const useMenuStore = defineStore({ - id: "app-Menu", + id: "app-Menu-jzd", state: () => ({ - /** 树形菜单数据,持久化到 localStorage key: app-Menu */ + /** 树形菜单数据,持久化到 localStorage key: app-Menu-jzd(家长端,与教师端 app-Menu-jsd 区分,避免同域下菜单互相覆盖) */ mobileMenu: [] as MobileMenuTreeNode[], }), getters: { diff --git a/src/utils/pageUtil.ts b/src/utils/pageUtil.ts index 9ace9fc..9307fa8 100644 --- a/src/utils/pageUtil.ts +++ b/src/utils/pageUtil.ts @@ -1,4 +1,4 @@ -import { checkXsXkApi, checkXkTfApi } from "@/api/base/xkApi"; +import { checkXsXkWithGzsApi, checkXkTfApi } from "@/api/base/xkApi"; import { useUserStore } from "@/store/modules/user"; import { useDataStore } from "@/store/modules/data"; const userStore = useUserStore(); @@ -75,7 +75,7 @@ export const PageUtils = { * @param xklxId */ async checkQkLogic(xklxId: string) { - const res: any = await checkXsXkApi({ + const res: any = await checkXsXkWithGzsApi({ xsId: userStore.getCurXs.id, njmcId: userStore.getCurXs.njmcId, xklxId: xklxId, @@ -94,35 +94,35 @@ export const PageUtils = { const result = res.result || {}; // 记录到缓存数据中 dataStore.setQk(result); - // 状态判断 + // 状态判断(使用 navigateTo 保留页面栈,支持浏览器返回) switch (result.xsXkStatus) { - case 'WFB': { // KQK可抢课 - uni.reLaunch({ + case 'WFB': { // 未开放 + uni.navigateTo({ url: "/pages/base/xk/qk/wks?xklxId=" + xklxId, }); } break; - case 'KQK': { // KQK可抢课 - uni.reLaunch({ + case 'KQK': { // 可抢课-告知书 + uni.navigateTo({ url: "/pages/base/gzs/index?lxId=" + xklxId, }); } break; - case 'QKZ': { // QKZ抢课中 - uni.reLaunch({ + case 'QKZ': { // 抢课中 + uni.navigateTo({ url: "/pages/base/xk/qk/index?xklxId=" + xklxId, }); } break; - case 'YQK': { // YQK已选课 - uni.reLaunch({ + case 'YQK': { // 已选课 + uni.navigateTo({ url: "/pages/base/xk/pay/index?xklxId=" + xklxId, }); } break; - case 'DZF': { // DZF待支付 - uni.reLaunch({ + case 'DZF': { // 待支付 + uni.navigateTo({ url: "/pages/base/xk/pay/index?xklxId=" + xklxId, }); } break; - case 'YZF': { // YZF已支付 - uni.reLaunch({ + case 'YZF': { // 已支付 + uni.navigateTo({ url: "/pages/base/xk/pay/success?xklxId=" + xklxId, }); } break; @@ -166,9 +166,9 @@ export const PageUtils = { } }, - // 判断就餐逻辑 + // 判断就餐逻辑(使用 navigateTo 保留页面栈,支持浏览器返回) async checkJcLogic() { - uni.reLaunch({ + uni.navigateTo({ url: "/pages/base/jc/bm", }); }, diff --git a/src/utils/request/index.ts b/src/utils/request/index.ts index 7fb37f6..9087573 100644 --- a/src/utils/request/index.ts +++ b/src/utils/request/index.ts @@ -120,14 +120,14 @@ export function get( } else { if (res.resultCode) { if (res.resultCode != RESULT_CODE_NOT_LOGIN) { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常1"); reject(res); } } else { if (res.rows) { resolve(res); } else { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常2"); reject(res); } } @@ -169,14 +169,14 @@ export function post( } else { if (res.resultCode) { if (res.resultCode != RESULT_CODE_NOT_LOGIN) { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常3"); reject(res); } } else { if (res.rows) { resolve(res); } else { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常4"); reject(res); } } @@ -216,14 +216,14 @@ export function file( } else { if (res.resultCode) { if (res.resultCode != RESULT_CODE_NOT_LOGIN) { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常5"); reject(res); } } else { if (res.rows) { resolve(res); } else { - showToast(res.message || "接口异常"); + showToast(res.message || "接口异常6"); reject(res); } }