From 4dba93288898e6d723364e7239d38bd5c010b681 Mon Sep 17 00:00:00 2001 From: hb Date: Sat, 9 Aug 2025 11:36:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=B5=84=E6=BA=90=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/BasicTree/Tree.vue | 35 ++-- .../routine/JiaoXueZiYuan/add-resource.vue | 179 +++++++++--------- src/utils/filePreview.ts | 2 +- 3 files changed, 116 insertions(+), 100 deletions(-) diff --git a/src/components/BasicTree/Tree.vue b/src/components/BasicTree/Tree.vue index 31d761e..399decb 100644 --- a/src/components/BasicTree/Tree.vue +++ b/src/components/BasicTree/Tree.vue @@ -30,14 +30,14 @@ :src="item.lastRank ? lastIcon : item.showChild ? currentIcon : defaultIcon"> {{ item.name }} - - + + + :style="{'border-color': !item.lastRank ? '#ccc' : confirmColor}"> @@ -277,17 +277,16 @@ export default { // console.log(this.treeList) }, _treeItemSelect(item, index) { + // 只有叶子节点才能被选择 + if (!item.lastRank) { + // 如果不是叶子节点,不允许选择 + return; + } + if (this.multiple) { - if (!item.lastRank) { - // 父节点多选框:全选/全不选所有子节点 - const allChecked = this._isAllChildrenChecked(item); - this._setAllChildrenChecked(item, !allChecked); - item.checked = !allChecked; - } else { - // 子节点单独切换 - this.treeList[index].checked = !this.treeList[index].checked; - this._updateParentChecked(item); - } + // 子节点单独切换 + this.treeList[index].checked = !this.treeList[index].checked; + this._updateParentChecked(item); this._fixMultiple(index); } else { // 单选逻辑 @@ -496,4 +495,14 @@ export default { opacity: 0.6; } +.tki-tree-check.disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.tki-tree-check.disabled .tki-tree-check-no { + border-color: #ccc !important; + background-color: #f5f5f5; +} + diff --git a/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue b/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue index 0da8039..1b17f8c 100644 --- a/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue +++ b/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue @@ -1,15 +1,5 @@ @@ -152,6 +145,7 @@ import { typesFindTreeApi } from "@/api/base/server"; import { attachmentUpload } from "@/api/system/upload"; import { imagUrl } from "@/utils"; import { useDicStore } from "@/store/modules/dic"; +import BasicTree from "@/components/BasicTree/Tree.vue"; const { findByPid } = useDicStore(); @@ -182,6 +176,9 @@ const formData = reactive({ // 树形数据 const treeData = ref([]); +// 树组件引用 +const treeRef = ref(); + // 提交状态 const isSubmitting = ref(false); @@ -191,15 +188,29 @@ const categoryOptions = ref([]); // 加载资源类别数据 const loadCategoryOptions = async () => { try { + // 使用正确的字典ID const result = await findByPid({ pid: 1391443399 }); - if (result && Array.isArray(result)) { - categoryOptions.value = result.map(item => ({ + + // 检查返回的数据结构 + if (result && result.resultCode === 1 && result.result && Array.isArray(result.result) && result.result.length > 0) { + categoryOptions.value = result.result.map(item => ({ value: item.dictionaryCode, label: item.dictionaryValue })); + } else { + // 如果没有数据,使用默认选项 + categoryOptions.value = [ + { value: '1', label: '课件' }, + { value: '2', label: '教案' }, + { value: '3', label: '学案' }, + { value: '4', label: '作业' }, + { value: '5', label: '试卷' }, + { value: '6', label: '教材' }, + { value: '7', label: '示范课' }, + { value: '8', label: '音视频合集' }, + ]; } } catch (error) { - console.error('加载资源类别失败:', error); // 如果加载失败,使用默认选项 categoryOptions.value = [ { value: '1', label: '课件' }, @@ -214,16 +225,26 @@ const loadCategoryOptions = async () => { } }; -// 返回上一页 -const goBack = () => { - uni.navigateBack(); + + +// 显示资源目录选择树 +const showResourceTypeTree = () => { + if (treeRef.value) { + treeRef.value._show(); + } }; -// 资源目录选择 -const handleResourceTypeChange = (e: any) => { - const index = e.detail.value; - const selectedItem = treeData.value[index]; - formData.resourType = selectedItem.key; +// 树形选择确认 +const onTreeConfirm = (selectedItems: any[]) => { + if (selectedItems.length > 0) { + const selectedItem = selectedItems[0]; // 单选模式 + formData.resourType = selectedItem.key; + } +}; + +// 树形选择取消 +const onTreeCancel = () => { + // 取消选择资源目录 }; // 资源类别选择 @@ -415,7 +436,7 @@ const handleSubmitForm = async () => { id: formData.id }; - console.log('提交参数:', params); + const result = await resourcesSaveApi(params); @@ -457,16 +478,45 @@ const resetFormData = () => { const loadTreeData = async () => { try { const res = await typesFindTreeApi(); - treeData.value = res.result || []; - console.log('树形数据加载完成:', treeData.value); + // 处理返回的数据结构,确保与BasicTree组件兼容 + if (res && Array.isArray(res)) { + treeData.value = res.map(item => ({ + key: item.key || item.id, + title: item.title || item.name, + children: item.children ? item.children.map(child => ({ + key: child.key || child.id, + title: child.title || child.name, + children: child.children || [] + })) : [] + })); + } else { + treeData.value = res.result || []; + } + } catch (error) { - console.error('加载树形数据失败:', error); + + // 如果加载失败,使用空数组 + treeData.value = []; } }; // 获取资源目录文本 const getResourceTypeText = () => { - const selectedItem = treeData.value.find(item => item.key === formData.resourType); + // 递归查找选中的项目 + const findSelectedItem = (items: any[], targetKey: string): any => { + for (const item of items) { + if (item.key === targetKey) { + return item; + } + if (item.children && item.children.length > 0) { + const found = findSelectedItem(item.children, targetKey); + if (found) return found; + } + } + return null; + }; + + const selectedItem = findSelectedItem(treeData.value, formData.resourType); return selectedItem ? selectedItem.title : ''; }; @@ -490,39 +540,7 @@ onMounted(async () => { flex-direction: column; } -.page-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 20rpx 30rpx; - background-color: #ffffff; - border-bottom: 1rpx solid #f0f0f0; - position: sticky; - top: 0; - z-index: 10; -} -.header-left { - display: flex; - align-items: center; - gap: 10rpx; - cursor: pointer; -} - -.back-text { - font-size: 28rpx; - color: #333; -} - -.header-title { - font-size: 32rpx; - font-weight: bold; - color: #333; -} - -.header-right { - width: 80rpx; -} .form-scroll-view { flex: 1; @@ -671,19 +689,8 @@ onMounted(async () => { border-top: 1rpx solid #f0f0f0; } -.cancel-btn { - flex: 1; - padding: 20rpx; - border-radius: 8rpx; - font-size: 28rpx; - font-weight: 500; - border: none; - background: #f5f5f5; - color: #666; -} - .confirm-btn { - flex: 1; + width: 100%; padding: 20rpx; border-radius: 8rpx; font-size: 28rpx; diff --git a/src/utils/filePreview.ts b/src/utils/filePreview.ts index 751cde3..6a6f78c 100644 --- a/src/utils/filePreview.ts +++ b/src/utils/filePreview.ts @@ -230,7 +230,7 @@ export const previewFile = (fileUrl: string, fileName: string, fileType: string) const encodedUrl = btoa(finalFileUrl); console.log('使用kkFileView预览,Base64编码后的URL:', encodedUrl); - const previewUrl = `http://yufangzc.com:8891/onlinePreview?url=${encodeURIComponent(encodedUrl)}`; + const previewUrl = `${KK_FILE_VIEW_URL}/onlinePreview?url=${encodeURIComponent(encodedUrl)}`; console.log('最终预览URL (普通文件):', previewUrl); const needLandscape = ['ppt', 'pptx'].includes(type); From 73c170d83c24b9ba4df3023fcc63926df52d3b89 Mon Sep 17 00:00:00 2001 From: hebo Date: Mon, 11 Aug 2025 21:11:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=80=89=E8=AF=BE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/base/server.ts | 17 +- src/pages.json | 19 + src/pages/base/groupTeaching/dmXkList.vue | 771 ++++++++++----- src/pages/base/groupTeaching/dmXkkcDetail.vue | 177 +++- src/pages/base/groupTeaching/dmXkkcRecord.vue | 443 +++++++++ .../base/groupTeaching/photoXkkcDetail.vue | 419 +++++++++ src/pages/base/groupTeaching/xkList.vue | 491 ++++++---- src/pages/base/groupTeaching/xkkcDetail.vue | 548 +++++++++-- src/pages/base/service/index.vue | 2 +- .../homeSchool/parentAddressBook/detail.vue | 171 +++- .../view/routine/kefuxuncha/xcRecord.vue | 289 ++++++ .../view/routine/kefuxuncha/xcXkList.vue | 378 +++++--- .../view/routine/kefuxuncha/xcXkkcDetail.vue | 882 +++++++----------- src/utils/index.ts | 34 +- 14 files changed, 3405 insertions(+), 1236 deletions(-) create mode 100644 src/pages/base/groupTeaching/dmXkkcRecord.vue create mode 100644 src/pages/base/groupTeaching/photoXkkcDetail.vue create mode 100644 src/pages/view/routine/kefuxuncha/xcRecord.vue diff --git a/src/api/base/server.ts b/src/api/base/server.ts index b1d92e2..244a9cf 100644 --- a/src/api/base/server.ts +++ b/src/api/base/server.ts @@ -94,6 +94,14 @@ export const jsdXkListApi = async (params: any) => { return await get("/mobile/js/xk/list", params); }; +/** + * 获取当前学期教师上课课程列表 + */ +export const getCurrentSemesterTeacherCoursesApi = async (jsId?: string) => { + const params = jsId ? { jsId } : {}; + return await get("/api/xkkc/getCurrentSemesterTeacherCourses", params); +}; + // 选课列表 export const jsdXkkcSaveApi = async (params: any) => { return await post("/api/xkkc/save", params); @@ -357,5 +365,12 @@ export const getByUserIdAndInspectItemIdApi = async (params: any) => { // 清空用户open_id export const clearUserOpenIdApi = async (params: { userId: string }) => { - return await post(`/api/user/clearOpenId?userId=${params.userId}`); + return await post("/api/user/clearUserOpenId", params); +}; + +/** + * 课堂随拍保存API + */ +export const jsdXkkcPhotoSaveApi = async (params: any) => { + return await post("/mobile/js/xk/photo/save", params); }; diff --git a/src/pages.json b/src/pages.json index 13e0a0c..97e95bb 100644 --- a/src/pages.json +++ b/src/pages.json @@ -505,6 +505,25 @@ "enablePullDownRefresh": false } }, + { + "path": "pages/base/groupTeaching/dmXkkcRecord", + "style": { + "navigationBarTitleText": "点名记录", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/groupTeaching/photoXkkcDetail", + "style": { + "navigationBarTitleText": "课堂随拍" + } + }, + { + "path": "pages/view/routine/kefuxuncha/xcRecord", + "style": { + "navigationBarTitleText": "巡查记录" + } + }, { "path": "pages/base/xs/qj/sp", "style": { diff --git a/src/pages/base/groupTeaching/dmXkList.vue b/src/pages/base/groupTeaching/dmXkList.vue index 0d544d9..cbe3e66 100644 --- a/src/pages/base/groupTeaching/dmXkList.vue +++ b/src/pages/base/groupTeaching/dmXkList.vue @@ -3,12 +3,13 @@ - + - {{ xkData.xkmc }} - 选课信息 + + {{ getCurrentSemesterName() }} - 我的课程 + + 暂无课程 - 切换 @@ -19,21 +20,13 @@ {{ xkkc.kcmc }} - - 上课周期类型: - {{ xkkc.skzqlx }} - 上课周期: {{ xkkc.skzqmc }} - 上课开始时间: - {{ xkkc.skkstime }} - - - 上课结束时间: - {{ xkkc.skjstime }} + 上课时间: + {{ formatClassTime(xkkc.skkstime, xkkc.skjstime) }} 开课地点: @@ -43,8 +36,11 @@ 上课人数: {{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }} + 点名 + 点名记录 + @@ -58,29 +54,6 @@ - - - - - - 选择俱乐部 - - - - - - {{ xk.xkmc }} - {{ xk.xkmc }} - - - - - - - - @@ -92,7 +65,7 @@ import { } from "vue"; import { useUserStore } from "@/store/modules/user"; import { useDataStore } from "@/store/modules/data"; -import { jsdXkListApi } from "@/api/base/server"; +import { getCurrentSemesterTeacherCoursesApi } from "@/api/base/server"; import { dmBeforeMinuteApi } from "@/api/system/config/index"; import dayjs from "dayjs"; @@ -101,15 +74,6 @@ const { getData, setData } = useDataStore(); const wdNameList = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]; -// 控制选择器显示状态 -const showXkFlag = ref(false); - -const xkList = ref([]); - -const xkData = ref(); - -const courseInfo = ref({}); - // 课程列表数据 const xkkcList = ref([]); @@ -119,75 +83,126 @@ onMounted(async () => { uni.showLoading({ title: "加载中...", }); - await loadCourseList(); - await loadDmBeforeMinute(); - uni.hideLoading(); + try { + await loadCourseList(); + await loadDmBeforeMinute(); + } catch (error) { + console.error('页面初始化失败:', error); + uni.showToast({ + title: '页面加载失败', + icon: 'none' + }); + } finally { + uni.hideLoading(); + } }); // 加载课程列表 const loadCourseList = async () => { - const res = await jsdXkListApi({ - jsId: getJs.id - }); - if (res.resultCode == 1) { - if (res.result && res.result.length) { - xkList.value = res.result; - switchXk(res.result[0]); - } else { - xkList.value = []; - xkData.value = {}; - xkkcList.value = []; - } - } + try { + const res = await getCurrentSemesterTeacherCoursesApi(getJs.id); + if (res.resultCode == 1) { + if (res.result && res.result.length) { + xkkcList.value = res.result; + // 处理课程周期显示 + processCoursePeriods(); + } else { + xkkcList.value = []; + } + } else { + xkkcList.value = []; + uni.showToast({ + title: res.message || '获取课程列表失败', + icon: 'none' + }); + } + } catch (error) { + console.error('加载课程列表失败:', error); + xkkcList.value = []; + uni.showToast({ + title: '加载课程列表失败', + icon: 'none' + }); + } +}; + +// 处理课程周期显示 +const processCoursePeriods = () => { + for (let i = 0; i < xkkcList.value.length; i++) { + let xkkc = xkkcList.value[i]; + // 判断周期 + switch (xkkc.skzqlx) { + case '每天': + xkkc.skzqmc = "每天"; + break; + case '每周': + const daysOfWeek = xkkc.skzq.split(',').map(Number); + // 从wdNameList读取daysOfWeek对应的周几 + xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); + break; + case '每月': + const daysOfMonth = xkkc.skzq.split(',').map(Number); + // 从根据编号加 + xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); + break; + } + } +}; + +// 获取当前学期名称 +const getCurrentSemesterName = () => { + if (xkkcList.value && xkkcList.value.length > 0) { + // 从第一个课程获取学期名称 + return xkkcList.value[0].xqmc || '当前学期'; + } + return '当前学期'; +}; + +// 格式化上课时间 +const formatClassTime = (startTime: string, endTime: string) => { + if (!startTime || !endTime) { + return ''; + } + + try { + // 尝试解析时间,支持多种格式 + let start, end; + + // 如果是时间格式(HH:mm:ss 或 HH:mm) + if (startTime.includes(':') && !startTime.includes('-') && !startTime.includes('/')) { + start = startTime; + end = endTime; + } else { + // 尝试用 dayjs 解析 + const startDate = dayjs(startTime); + const endDate = dayjs(endTime); + + if (startDate.isValid() && endDate.isValid()) { + start = startDate.format('HH:mm:ss'); + end = endDate.format('HH:mm:ss'); + } else { + // 如果解析失败,直接返回原始值 + return `${startTime}~${endTime}`; + } + } + + return `${start}~${end}`; + } catch (error) { + console.error('时间格式化错误:', error); + // 如果出错,返回原始值 + return `${startTime}~${endTime}`; + } }; // 获取点名时间提前分钟数 const loadDmBeforeMinute = async () => { - const res = await dmBeforeMinuteApi(); - if (res.resultCode == 1) { - // 将res.result从字符串转换成int的number赋给dmBeforeMinute + const res = await dmBeforeMinuteApi(); + if (res.resultCode == 1) { + // 将res.result从字符串转换成int的number赋给dmBeforeMinute dmBeforeMinute.value = parseInt(res.result); - } -} - -// 显示选课选择器 -function clickShowXkSelector() { - if (xkList.value.length > 1) { - showXkFlag.value = true; } } -// 切换选课 -function switchXk(xk: any) { - xkData.value = xk; - xkkcList.value = xk.xkkcs; - showXkFlag.value = false; - for (let i = 0; i < xk.xkkcs.length; i++) { - let xkkc = xk.xkkcs[i]; - // 判断周期 - switch (xkkc.skzqlx) { - case '每天': - xkkc.skzqmc = "每天"; - break; - case '每周': - const daysOfWeek = xkkc.skzq.split(',').map(Number); - // 从wdNameList读取daysOfWeek对应的周几 - xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); - break; - case '每月': - const daysOfMonth = xkkc.skzq.split(',').map(Number); - // 从根据编号加 - xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); - break; - } - } - // 显示切换成功提示 - uni.showToast({ - title: `已切换到${xk.xkmc}`, - icon: "none", - }); -} - // 跳转到点名 const goDm = (xkkc: any) => { const now = dayjs(); @@ -197,50 +212,160 @@ const goDm = (xkkc: any) => { } let mDay = now.date(); const strDate = now.format('YYYY-MM-DD') + ' '; - let dmFlag = false; - let msg = ""; - // 判断周期 - switch (xkkc.skzqlx) { - case '每天': - dmFlag = true; - break; - case '每周': - const daysOfWeek = xkkc.skzq.split(',').map(Number); - dmFlag = daysOfWeek.includes(wDay); - // 从wdNameList读取daysOfWeek对应的周几 - xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); - break; - case '每月': - const daysOfMonth = xkkc.skzq.split(',').map(Number); - dmFlag = daysOfMonth.includes(mDay); - // 从根据编号加 - xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); - break; - } - // 判断日期是否合格 - if (dmFlag) { - // xkkc.skkstime开始时间向前dmBeforeMinute分钟 + let dmFlag = false; + let msg = ""; + // 判断周期 + switch (xkkc.skzqlx) { + case '每天': + dmFlag = true; + break; + case '每周': + const daysOfWeek = xkkc.skzq.split(',').map(Number); + dmFlag = daysOfWeek.includes(wDay); + // 从wdNameList读取daysOfWeek对应的周几 + xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); + break; + case '每月': + const daysOfMonth = xkkc.skzq.split(',').map(Number); + dmFlag = daysOfMonth.includes(mDay); + // 从根据编号加 + xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); + break; + } + // 判断日期是否合格 + if (dmFlag) { + // xkkc.skkstime开始时间向前dmBeforeMinute分钟 const startTime = dayjs(strDate + xkkc.skkstime).subtract(dmBeforeMinute.value, 'minute').format('YYYY-MM-DD HH:mm:ss'); - const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss'); - dmFlag = now.isBefore(endTime) && now.isAfter(startTime) - } else { - msg = "没到点名日期"; - } - if (dmFlag) { - setData(xkkc); - uni.navigateTo({ - url: `/pages/base/groupTeaching/dmXkkcDetail`, - }); - } else { - if (msg === "") { - msg = "没到点名时间"; - } - uni.showToast({ - title: msg, - icon: 'none', - duration: 2000 - }); - } + const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss'); + dmFlag = now.isBefore(endTime) && now.isAfter(startTime) + } else { + msg = "上课时间未到,无法点名"; + } + if (dmFlag) { + setData(xkkc); + uni.navigateTo({ + url: `/pages/base/groupTeaching/dmXkkcDetail`, + }); + } else { + if (msg === "") { + msg = "上课时间未到,无法点名"; + } + uni.showToast({ + title: msg, + icon: 'none', + duration: 2000 + }); + } +}; + +// 跳转到点名记录 +const goRecord = (xkkc: any) => { + const now = dayjs(); + let wDay = now.day(); + if (wDay === 0) { + wDay = 7; + } + let mDay = now.date(); + const strDate = now.format('YYYY-MM-DD') + ' '; + let recordFlag = false; + let msg = ""; + // 判断周期 + switch (xkkc.skzqlx) { + case '每天': + recordFlag = true; + break; + case '每周': + const daysOfWeek = xkkc.skzq.split(',').map(Number); + recordFlag = daysOfWeek.includes(wDay); + // 从wdNameList读取daysOfWeek对应的周几 + xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); + break; + case '每月': + const daysOfMonth = xkkc.skzq.split(',').map(Number); + recordFlag = daysOfMonth.includes(mDay); + // 从根据编号加 + xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); + break; + } + // 判断日期是否合格 + if (recordFlag) { + // xkkc.skkstime开始时间向前dmBeforeMinute分钟 + const startTime = dayjs(strDate + xkkc.skkstime).subtract(dmBeforeMinute.value, 'minute').format('YYYY-MM-DD HH:mm:ss'); + const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss'); + recordFlag = now.isBefore(endTime) && now.isAfter(startTime) + } else { + msg = "上课时间未到,无法查看点名记录"; + } + if (recordFlag) { + setData(xkkc); + uni.navigateTo({ + url: `/pages/base/groupTeaching/dmXkkcRecord`, + }); + } else { + if (msg === "") { + msg = "上课时间未到,无法查看点名记录"; + } + uni.showToast({ + title: msg, + icon: 'none', + duration: 2000 + }); + } +}; + +// 跳转到课堂随拍 +const goPhoto = (xkkc: any) => { + const now = dayjs(); + let wDay = now.day(); + if (wDay === 0) { + wDay = 7; + } + let mDay = now.date(); + const strDate = now.format('YYYY-MM-DD') + ' '; + let photoFlag = false; + let msg = ""; + // 判断周期 + switch (xkkc.skzqlx) { + case '每天': + photoFlag = true; + break; + case '每周': + const daysOfWeek = xkkc.skzq.split(',').map(Number); + photoFlag = daysOfWeek.includes(wDay); + // 从wdNameList读取daysOfWeek对应的周几 + xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); + break; + case '每月': + const daysOfMonth = xkkc.skzq.split(',').map(Number); + photoFlag = daysOfMonth.includes(mDay); + // 从根据编号加 + xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); + break; + } + // 判断日期是否合格 + if (photoFlag) { + // xkkc.skkstime开始时间向前dmBeforeMinute分钟 + const startTime = dayjs(strDate + xkkc.skkstime).subtract(dmBeforeMinute.value, 'minute').format('YYYY-MM-DD HH:mm:ss'); + const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss'); + photoFlag = now.isBefore(endTime) && now.isAfter(startTime) + } else { + msg = "上课时间未到,无法随拍"; + } + if (photoFlag) { + setData(xkkc); + uni.navigateTo({ + url: `/pages/base/groupTeaching/photoXkkcDetail`, + }); + } else { + if (msg === "") { + msg = "上课时间未到,无法随拍"; + } + uni.showToast({ + title: msg, + icon: 'none', + duration: 2000 + }); + } }; // 页面卸载前清除定时器 @@ -251,7 +376,7 @@ onBeforeUnmount(() => { diff --git a/src/pages/base/groupTeaching/dmXkkcDetail.vue b/src/pages/base/groupTeaching/dmXkkcDetail.vue index 9b594de..ee7ebf1 100644 --- a/src/pages/base/groupTeaching/dmXkkcDetail.vue +++ b/src/pages/base/groupTeaching/dmXkkcDetail.vue @@ -43,7 +43,7 @@ @@ -60,7 +60,7 @@ {{ xs.bjmc }} - + 联系家长 - + + + + + + + 正在提交... + + + + diff --git a/src/pages/base/groupTeaching/photoXkkcDetail.vue b/src/pages/base/groupTeaching/photoXkkcDetail.vue new file mode 100644 index 0000000..8b5d78f --- /dev/null +++ b/src/pages/base/groupTeaching/photoXkkcDetail.vue @@ -0,0 +1,419 @@ + + + + + diff --git a/src/pages/base/groupTeaching/xkList.vue b/src/pages/base/groupTeaching/xkList.vue index 3282d34..9334ce5 100644 --- a/src/pages/base/groupTeaching/xkList.vue +++ b/src/pages/base/groupTeaching/xkList.vue @@ -3,12 +3,13 @@ - + - {{ xkData.xkmc }} - 选课信息 + + {{ getCurrentSemesterName() }} - 我的课程 + + 暂无课程 - 切换 @@ -18,22 +19,17 @@ - {{ xkkc.kcmc }} - - 上课周期类型: - {{ xkkc.skzqlx }} + + {{ getStatusText(xkkc) }} + {{ xkkc.kcmc }} 上课周期: {{ xkkc.skzqmc }} - 上课开始时间: - {{ xkkc.skkstime }} - - - 上课结束时间: - {{ xkkc.skjstime }} + 上课时间: + {{ formatClassTime(xkkc.skkstime, xkkc.skjstime) }} 开课地点: @@ -43,8 +39,9 @@ 上课人数: {{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }} + - 详情 + 填报 @@ -58,29 +55,6 @@ - - - - - - 选择俱乐部 - - - - - - {{ xk.xkmc }} - {{ xk.xkmc }} - - - - - - - - @@ -92,7 +66,7 @@ import { } from "vue"; import { useUserStore } from "@/store/modules/user"; import { useDataStore } from "@/store/modules/data"; -import { jsdXkListApi } from "@/api/base/server"; +import { getCurrentSemesterTeacherCoursesApi } from "@/api/base/server"; import dayjs from "dayjs"; const { getJs } = useUserStore(); @@ -100,15 +74,6 @@ const { getData, setData } = useDataStore(); const wdNameList = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]; -// 控制选择器显示状态 -const showXkFlag = ref(false); - -const xkList = ref([]); - -const xkData = ref(); - -const courseInfo = ref({}); - // 课程列表数据 const xkkcList = ref([]); @@ -121,59 +86,118 @@ const loadCourseList = async () => { uni.showLoading({ title: "加载中...", }); - const res = await jsdXkListApi({ - jsId: getJs.id - }); - if (res.resultCode == 1) { - if (res.result && res.result.length) { - xkList.value = res.result; - switchXk(res.result[0]); - } else { - xkList.value = []; - xkData.value = {}; - xkkcList.value = []; - } - } - uni.hideLoading(); + try { + const res = await getCurrentSemesterTeacherCoursesApi(getJs.id); + if (res.resultCode == 1) { + if (res.result && res.result.length) { + xkkcList.value = res.result; + // 处理课程周期显示 + processCoursePeriods(); + } else { + xkkcList.value = []; + } + } else { + xkkcList.value = []; + uni.showToast({ + title: res.resultMessage || '获取课程列表失败', + icon: 'none' + }); + } + } catch (error) { + console.error('加载课程列表失败:', error); + xkkcList.value = []; + uni.showToast({ + title: '加载课程列表失败', + icon: 'none' + }); + } finally { + uni.hideLoading(); + } }; -// 显示选课选择器 -function clickShowXkSelector() { - if (xkList.value.length > 1) { - showXkFlag.value = true; +// 处理课程周期显示 +const processCoursePeriods = () => { + for (let i = 0; i < xkkcList.value.length; i++) { + let xkkc = xkkcList.value[i]; + // 判断周期 + switch (xkkc.skzqlx) { + case '每天': + xkkc.skzqmc = "每天"; + break; + case '每周': + const daysOfWeek = xkkc.skzq.split(',').map(Number); + // 从wdNameList读取daysOfWeek对应的周几 + xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); + break; + case '每月': + const daysOfMonth = xkkc.skzq.split(',').map(Number); + // 从根据编号加 + xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); + break; + } } -} +}; -// 切换选课 -function switchXk(xk: any) { - xkData.value = xk; - xkkcList.value = xk.xkkcs; - showXkFlag.value = false; - for (let i = 0; i < xk.xkkcs.length; i++) { - let xkkc = xk.xkkcs[i]; - // 判断周期 - switch (xkkc.skzqlx) { - case '每天': - xkkc.skzqmc = "每天"; - break; - case '每周': - const daysOfWeek = xkkc.skzq.split(',').map(Number); - // 从wdNameList读取daysOfWeek对应的周几 - xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(','); - break; - case '每月': - const daysOfMonth = xkkc.skzq.split(',').map(Number); - // 从根据编号加 - xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(','); - break; - } - } - // 显示切换成功提示 - uni.showToast({ - title: `已切换到${xk.xkmc}`, - icon: "none", - }); -} +// 获取当前学期名称 +const getCurrentSemesterName = () => { + if (xkkcList.value && xkkcList.value.length > 0) { + // 从第一个课程获取学期名称 + return xkkcList.value[0].xqmc || '当前学期'; + } + return '当前学期'; +}; + +// 格式化上课时间 +const formatClassTime = (startTime: string, endTime: string) => { + if (!startTime || !endTime) { + return ''; + } + + try { + // 尝试解析时间,支持多种格式 + let start, end; + + // 如果是时间格式(HH:mm:ss 或 HH:mm) + if (startTime.includes(':') && !startTime.includes('-') && !startTime.includes('/')) { + start = startTime; + end = endTime; + } else { + // 尝试用 dayjs 解析 + const startDate = dayjs(startTime); + const endDate = dayjs(endTime); + + if (startDate.isValid() && endDate.isValid()) { + start = startDate.format('HH:mm:ss'); + end = endDate.format('HH:mm:ss'); + } else { + // 如果解析失败,直接返回原始值 + return `${startTime}~${endTime}`; + } + } + + return `${start}~${end}`; + } catch (error) { + console.error('时间格式化错误:', error); + // 如果出错,返回原始值 + return `${startTime}~${endTime}`; + } +}; + +// 获取状态文本 +const getStatusText = (xkkc: any) => { + if (!xkkc.kcjsms && !xkkc.jxll) { + return '待填报'; + } + return '已填报'; +}; + +// 获取状态样式类 +const getStatusClass = (xkkc: any) => { + if (!xkkc.kcjsms && !xkkc.jxll) { + return 'pending'; + } + return 'completed'; +}; // 查看课程详情 const goDetail = (xkkc: any) => { @@ -191,7 +215,7 @@ onBeforeUnmount(() => { diff --git a/src/pages/base/service/index.vue b/src/pages/base/service/index.vue index 0b1f6aa..cb0ceea 100644 --- a/src/pages/base/service/index.vue +++ b/src/pages/base/service/index.vue @@ -231,7 +231,7 @@ const sections = reactive([ { id: "r7", icon: "file-text-fill-2", - text: "课程介绍", + text: "课程填报", show: true, permissionKey: "routine-kcjs", // 课程介绍权限编码 path: "/pages/base/groupTeaching/xkList", diff --git a/src/pages/view/homeSchool/parentAddressBook/detail.vue b/src/pages/view/homeSchool/parentAddressBook/detail.vue index 0e68a6b..5dee488 100644 --- a/src/pages/view/homeSchool/parentAddressBook/detail.vue +++ b/src/pages/view/homeSchool/parentAddressBook/detail.vue @@ -6,17 +6,17 @@ {{ xsInfo?.xm }} - {{ xsInfo?.gender }} + {{ getGenderText(xsInfo?.gender) }} {{ xsInfo?.age }}岁 @@ -35,7 +35,11 @@ 出生日期: - {{ xsInfo?.birthDate }} + {{ xsInfo?.birthDate || '未知' }} + + + 年龄: + {{ xsInfo?.age || '未知' }}岁 + + {{ jz.jzxm }} + - {{ jz.jzxm }} + + ({{ jz.jzxsgxId }}) @@ -78,6 +88,7 @@ diff --git a/src/pages/view/routine/kefuxuncha/xcXkList.vue b/src/pages/view/routine/kefuxuncha/xcXkList.vue index 0c2771f..e9f7a1c 100644 --- a/src/pages/view/routine/kefuxuncha/xcXkList.vue +++ b/src/pages/view/routine/kefuxuncha/xcXkList.vue @@ -23,21 +23,13 @@ class="course-item" > {{ xkkc.kcmc }} - - 上课周期类型: - {{ xkkc.skzqlx }} - 上课周期: {{ xkkc.skzqmc }} - 上课开始时间: - {{ xkkc.skkstime }} - - - 上课结束时间: - {{ xkkc.skjstime }} + 上课时间: + {{ formatClassTime(xkkc.skkstime, xkkc.skjstime) }} 开课地点: @@ -49,8 +41,10 @@ >{{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }} + 巡查 + 巡查记录 @@ -110,6 +104,7 @@ import { jsdXkListApi } from "@/api/base/server"; import { useDataStore } from "@/store/modules/data"; import { useUserStore } from "@/store/modules/user"; import { onBeforeUnmount, onMounted, ref } from "vue"; +import dayjs from "dayjs"; const { getJs } = useUserStore(); const { getData, setData } = useDataStore(); @@ -198,6 +193,50 @@ const goXc = (xkkc: any) => { }); }; +// 跳转到巡查记录 +const goRecord = (xkkc: any) => { + setData(xkkc); + uni.navigateTo({ + url: `/pages/view/routine/kefuxuncha/xcRecord`, + }); +}; + +// 格式化课程时间 +const formatClassTime = (startTime: string, endTime: string) => { + if (!startTime || !endTime) { + return ''; + } + + try { + // 尝试解析时间,支持多种格式 + let start, end; + + // 如果是时间格式(HH:mm:ss 或 HH:mm) + if (startTime.includes(':') && !startTime.includes('-') && !startTime.includes('/')) { + start = startTime; + end = endTime; + } else { + // 尝试用 dayjs 解析 + const startDate = dayjs(startTime); + const endDate = dayjs(endTime); + + if (startDate.isValid() && endDate.isValid()) { + start = startDate.format('HH:mm:ss'); + end = endDate.format('HH:mm:ss'); + } else { + // 如果解析失败,直接返回原始值 + return `${startTime}~${endTime}`; + } + } + + return `${start}~${end}`; + } catch (error) { + console.error('时间格式化错误:', error); + // 如果出错,返回原始值 + return `${startTime}~${endTime}`; + } +}; + // 页面卸载前清除定时器 onBeforeUnmount(() => {}); @@ -205,7 +244,7 @@ onBeforeUnmount(() => {}); diff --git a/src/pages/view/routine/kefuxuncha/xcXkkcDetail.vue b/src/pages/view/routine/kefuxuncha/xcXkkcDetail.vue index 8bdc3c9..cde1278 100644 --- a/src/pages/view/routine/kefuxuncha/xcXkkcDetail.vue +++ b/src/pages/view/routine/kefuxuncha/xcXkkcDetail.vue @@ -1,18 +1,7 @@