diff --git a/src/api/base/server.ts b/src/api/base/server.ts
index d082d1b..c3c4709 100644
--- a/src/api/base/server.ts
+++ b/src/api/base/server.ts
@@ -18,6 +18,21 @@ export const xkgzsApi = async (params: any) => {
return await get("/api/gzs/findPage", params);
};
+/**
+ * 获取最新兴趣课选课信息
+ */
+export const getLatestInterestCourseApi = async (params: any) => {
+ return await get("/api/xk/getLatestInterestCourse", params);
+};
+
+/**
+ * 获取当前学期教师上课课程列表
+ */
+export const getCurrentSemesterTeacherCoursesApi = async (jsId?: string) => {
+ const params = jsId ? { jsId } : {};
+ return await get("/api/xkkc/getCurrentSemesterTeacherCourses", params);
+};
+
/**
* 获取当前学期和周次
*/
diff --git a/src/pages/base/components/XkkcList/index.vue b/src/pages/base/components/XkkcList/index.vue
index de308e9..6f70e67 100644
--- a/src/pages/base/components/XkkcList/index.vue
+++ b/src/pages/base/components/XkkcList/index.vue
@@ -20,6 +20,10 @@
{{ xkkc.hasNum || 0 }}
| {{ xkkc.maxNum || 0 }}
+
+
+ {{ xkkc.studyTime }}
+
{
}
// xkkc.hasNum--;
} else {
- // 如果是未选中,判断是否已选满
+ // 选择课程时的验证逻辑
const maxNum = xkkc.maxNum || 0;
const hasNum = xkkc.hasNum || 0;
- if (maxNum > hasNum) {
- if (props.multiple) {
- // 如果是多选,则添加到已选数组
- if (!selectedXkkcIds.includes(xkkc.id)) {
- selectedXkkcIds.push(xkkc.id);
- // xkkc.hasNum++;
- }
- } else {
- // 如果是单选,则清空已选数组并添加当前课程
- selectedXkkcIds = [xkkc.id];
- // 清理选中状态
- xkkcList.value.forEach((xkkc: any) => {
- xkkc.isSelected = false;
- });
- }
- xkkc.isSelected = true;
+
+ if (maxNum <= hasNum) {
+ uni.showToast({
+ title: '该课程已满员',
+ icon: 'none',
+ duration: 2000
+ });
+ return;
}
+
+ // 检查上课时间是否重复
+ if (xkkc.studyTime && props.multiple) {
+ const hasTimeConflict = xkkcList.value.some((item: any) => {
+ // 检查已选课程中是否有相同上课时间
+ return item.isSelected &&
+ item.id !== xkkc.id &&
+ item.studyTime === xkkc.studyTime;
+ });
+
+ if (hasTimeConflict) {
+ uni.showToast({
+ title: '上课时间重复,请重新选择!',
+ icon: 'none',
+ duration: 3000
+ });
+ return;
+ }
+ }
+
+ // 通过验证,可以选课
+ if (props.multiple) {
+ // 如果是多选,则添加到已选数组
+ if (!selectedXkkcIds.includes(xkkc.id)) {
+ selectedXkkcIds.push(xkkc.id);
+ }
+ } else {
+ // 如果是单选,则清空已选数组并添加当前课程
+ selectedXkkcIds = [xkkc.id];
+ // 清理选中状态
+ xkkcList.value.forEach((item: any) => {
+ item.isSelected = false;
+ });
+ }
+ xkkc.isSelected = true;
}
// 更新本地存储
uni.setStorageSync("selectedXkkcIds", selectedXkkcIds);
@@ -214,12 +245,24 @@ if (props.xk && props.xk.xkkcs) {
.register-info {
font-size: 14px;
color: #666;
+ margin-bottom: 8px;
.register-count {
color: #2879ff;
}
}
+ .study-time-info {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 8px;
+
+ .study-time {
+ color: #ff6b35;
+ font-weight: 500;
+ }
+ }
+
.selected-mark {
position: absolute;
top: -6px;
diff --git a/src/pages/base/xk/qk/xqk.vue b/src/pages/base/xk/qk/xqk.vue
index b677c0c..a017a23 100644
--- a/src/pages/base/xk/qk/xqk.vue
+++ b/src/pages/base/xk/qk/xqk.vue
@@ -51,9 +51,9 @@ const selectedXkkcIds = ref([]);
const xsFlag = ref(true);
-// 检查选课是否已结束
+// 检查选课是否已结束(保留作为备用验证)
const checkEnrollmentStatus = (xk: any) => {
- if (!xk || !xk.xkjstime) return;
+ if (!xk || !xk.xkjstime) return false;
const now = new Date().getTime();
const endTime = new Date(xk.xkjstime).getTime();
@@ -76,7 +76,7 @@ const switchXk = (xk: any) => {
selectedXkkcIds.value = [];
uni.setStorageSync("selectedXkkcIds", []);
- // 检查选课状态
+ // 备用验证:检查选课状态(主要验证已在xkXqk.vue中完成)
if (checkEnrollmentStatus(xk)) {
return;
}
@@ -86,7 +86,7 @@ const switchXs = (xs: any) => {
xsFlag.value = false;
}
-// 选课时间结束
+// 选课时间结束(保留作为备用验证)
const xkTimeOver = (val: any) => {
console.log('选课时间结束:', val);
// 选课开始时不再跳转,让用户继续选课
@@ -109,7 +109,7 @@ const submit = async () => {
return;
}
- // 检查选课时间
+ // 检查选课时间(保留作为备用验证)
if (curXk.value && curXk.value.xkkstime) {
const now = dayjs().valueOf();
const startTime = dayjs(curXk.value.xkkstime).valueOf();
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
index fbfb419..fb7bedc 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 { getLatestInterestCourseApi } from "@/api/base/server";
import { jcGetJcBzListApi } from "@/api/base/jcApi";
import { AUTH_KEY } from "@/config";
import { imagUrl } from "@/utils";
@@ -244,9 +245,77 @@ export const useUserStore = defineStore({
});
}
},
+ // 验证选课状态(时间验证)- 通用版本
+ async validateEnrollmentStatus(xklxId: string, courseType: string = '兴趣课') {
+ try {
+ // 获取选课信息进行验证
+ const res = await getLatestInterestCourseApi({ xklxId });
+ const xkInfo = res.result;
+
+ if (!xkInfo) {
+ uni.showToast({
+ title: '获取选课信息失败',
+ icon: 'none'
+ });
+ return false;
+ }
+
+ // 检查选课状态:如果 xkzt 等于 0,表示未发布
+ if (xkInfo.xkzt === 0) {
+ // 选课未发布,跳转到课程报名尚未开放页面
+ uni.setStorageSync('title', courseType);
+ uni.reLaunch({
+ url: "/pages/base/xk/qk/wks",
+ });
+ return false;
+ }
+
+ // 检查选课是否已结束
+ if (xkInfo.xkjstime) {
+ const now = new Date().getTime();
+ const endTime = new Date(xkInfo.xkjstime).getTime();
+
+ if (now > endTime) {
+ // 选课已结束,跳转到结束页面
+ const courseInfo = encodeURIComponent(JSON.stringify(xkInfo));
+ uni.navigateTo({
+ url: `/pages/base/xk/qk/yjz?courseInfo=${courseInfo}`
+ });
+ return false;
+ }
+ }
+
+ // 所有验证通过
+ return true;
+
+ } catch (error) {
+ console.error('验证选课状态失败:', error);
+ uni.showToast({
+ title: '验证选课状态失败',
+ icon: 'none'
+ });
+ return false;
+ }
+ },
+
+ // 验证兴趣课选课状态(保持向后兼容)
+ async validateInterestCourseEnrollmentStatus() {
+ return this.validateEnrollmentStatus("962488654", "兴趣课");
+ },
+
+ // 验证俱乐部选课状态
+ async validateClubEnrollmentStatus() {
+ return this.validateEnrollmentStatus("816059832", "俱乐部");
+ },
// 校验兴趣课 - 优化版本
async checkXqk() {
try {
+ // 先验证选课状态(时间验证)
+ const validateResult = await this.validateInterestCourseEnrollmentStatus();
+ if (!validateResult) {
+ return; // 验证失败,已处理跳转
+ }
+
// 使用getXsKx接口获取详细选课信息
const res = await xsKxApi({
xsId: this.curXs.id,
@@ -264,9 +333,9 @@ export const useUserStore = defineStore({
url: "/pages/base/xk/pay/index",
});
return;
- case 2: // 可选课列表 - 跳转到抢课页面
+ case 2: // 可选课列表 - 跳转到告知书页
uni.reLaunch({
- url: "/pages/base/xk/qk/xqk",
+ url: "/pages/base/gzs/xkXqk",
});
return;
case 3: // 已支付 - 跳转到详情页
@@ -324,6 +393,12 @@ export const useUserStore = defineStore({
// 校验俱乐部 - 优化版本
async checkJlb() {
try {
+ // 先验证俱乐部选课状态(时间验证)
+ const validateResult = await this.validateClubEnrollmentStatus();
+ if (!validateResult) {
+ return; // 验证失败,已处理跳转
+ }
+
// 使用getXsKx接口获取详细选课信息
const res = await xsKxApi({
xsId: this.curXs.id,
@@ -341,9 +416,9 @@ export const useUserStore = defineStore({
url: "/pages/base/xk/pay/index",
});
return;
- case 2: // 可选课列表 - 跳转到抢课页面
+ case 2: // 可选课列表 - 跳转到告知书
uni.reLaunch({
- url: "/pages/base/xk/qk/jlb",
+ url: "/pages/base/gzs/xkJlb",
});
return;
case 3: // 已支付 - 跳转到详情页