From 1a154398b9ea2c453e7ae8e86279e63b93fac36c Mon Sep 17 00:00:00 2001 From: hebo Date: Tue, 30 Sep 2025 21:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=88=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages.json | 8 + src/pages/system/launchPage/launchPage.vue | 42 +- src/pages/view/routine/qd/confirmself.vue | 717 +++++++++++++++++++ src/pages/view/routine/qd/index.vue | 151 +++- src/pages/view/routine/qd/selectTeachers.vue | 59 +- src/static/base/view/qdself.png | Bin 0 -> 3778 bytes 6 files changed, 933 insertions(+), 44 deletions(-) create mode 100644 src/pages/view/routine/qd/confirmself.vue create mode 100644 src/static/base/view/qdself.png diff --git a/src/pages.json b/src/pages.json index abf0bfc..1c23ea3 100644 --- a/src/pages.json +++ b/src/pages.json @@ -694,6 +694,14 @@ "navigationStyle": "custom" } }, + { + "path": "pages/view/routine/qd/confirmself", + "style": { + "navigationBarTitleText": "签到确认", + "navigationStyle": "custom" + } + }, + { "path": "pages/view/routine/JiaoXueZiYuan/add-resource", "style": { diff --git a/src/pages/system/launchPage/launchPage.vue b/src/pages/system/launchPage/launchPage.vue index db60bbd..1d3b571 100644 --- a/src/pages/system/launchPage/launchPage.vue +++ b/src/pages/system/launchPage/launchPage.vue @@ -54,34 +54,27 @@ async function forceRefreshPermission(changeTime?: string): Promise { } } -function goByJs(js: any) { - // 检查是否有签到相关参数 - const globalData = getGlobal; - console.log('goByJs - globalData:', globalData); - console.log('goByJs - js:', js); - - if (globalData && globalData.qdId) { +function goByqd(data: any) { + if (data && data.qdId) { // 有签到参数,重定向到签到确认页面 - let confirmUrl = `/pages/view/routine/qd/confirm?qdId=${globalData.qdId}`; - if (globalData.rqgqtime) { - confirmUrl += `&rqgqtime=${globalData.rqgqtime}`; + let confirmUrl = `/pages/view/routine/qd/confirm?qdId=${data.qdId}`; + if (data.rqgqtime) { + confirmUrl += `&rqgqtime=${data.rqgqtime}`; } - if (globalData.timestampqd) { - confirmUrl += `×tampqd=${globalData.timestampqd}`; + if (data.timestampqd) { + confirmUrl += `×tampqd=${data.timestampqd}`; } - + console.log('重定向到签到确认页面:', confirmUrl); uni.reLaunch({ url: confirmUrl }); return; } - - if (getGlobal && getGlobal.type === '1') { - uni.reLaunch({ - url: "/pages/view/routine/xk/qd?from=login" - }); - } + +} + +function goByJs(js: any) { if (js.confirmStatus == "A") { // 跳转到自助服务首页 uni.reLaunch({ @@ -102,20 +95,15 @@ function goByJs(js: any) { onLoad(async (data: any) => { console.log('launchPage onLoad - 接收到的参数:', data); - if (data && data.openId) { - setGlobal(data); - console.log('launchPage onLoad - 设置global数据后:', getGlobal); - try { const res = await checkOpenId({ openId: data.openId, appCode: "JS", }); - - console.log('launchPage onLoad - checkOpenId结果:', res); - - if (res.resultCode == 1 && res.result) { + if (data && data.qdId) { + goByqd(data); + }else if (res.resultCode == 1 && res.result) { // 执行登录操作 afterLoginAction(res.result); diff --git a/src/pages/view/routine/qd/confirmself.vue b/src/pages/view/routine/qd/confirmself.vue new file mode 100644 index 0000000..3fdd9d5 --- /dev/null +++ b/src/pages/view/routine/qd/confirmself.vue @@ -0,0 +1,717 @@ + + + + + \ No newline at end of file diff --git a/src/pages/view/routine/qd/index.vue b/src/pages/view/routine/qd/index.vue index 3144069..ec54748 100644 --- a/src/pages/view/routine/qd/index.vue +++ b/src/pages/view/routine/qd/index.vue @@ -84,22 +84,34 @@ - - - + + + 二维码 + + + + 签到 + + + + 详情 + + + + 推送 + @@ -124,6 +136,7 @@ import { qdFindPageApi } from "@/api/base/server"; import { ref, reactive, onMounted } from "vue"; import { onShow } from "@dcloudio/uni-app"; +import { useUserStore } from "@/store/modules/user"; interface QdItem { id: string; @@ -149,6 +162,9 @@ const searchForm = reactive({ const dataList = ref([]); const isLoading = ref(false); +// 气泡提示显示状态 +const showTooltip = ref(true); + // 开始时间选择 const onStartTimeChange = (e: any) => { searchForm.startTime = e.detail.value; @@ -258,6 +274,43 @@ const goToQRCode = (id: string) => { }); }; +// 跳转到签到页面 +const goToSignIn = (id: string) => { + // 获取用户store + const userStore = useUserStore(); + + // 获取缓存的教师信息 + const jsData = userStore.getJs; + + // 找到对应的签到项目 + const qdItem = dataList.value.find(item => item.id === id); + + if (!qdItem) { + uni.showToast({ title: '签到信息不存在', icon: 'none' }); + return; + } + + // 验证发布者权限 + if (jsData && jsData.id && qdItem.jsId) { + if (jsData.id !== qdItem.jsId) { + uni.showToast({ + title: '只有发布者才能使用点击签到功能', + icon: 'none', + duration: 3000 + }); + return; + } + } else { + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }); + return; + } + + // 权限验证通过,跳转到签到页面 + uni.navigateTo({ + url: `/pages/view/routine/qd/confirmself?qdId=${id}` + }); +}; + // 页面显示时刷新数据 onShow(() => { getQdList(); @@ -266,6 +319,11 @@ onShow(() => { // 页面加载时也调用一次 onMounted(() => { getQdList(); + + // 6秒后隐藏气泡提示 + setTimeout(() => { + showTooltip.value = false; + }, 6000); }); @@ -474,6 +532,14 @@ onMounted(() => { display: flex; gap: 10px; + .action-item { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + padding: 5px; + } + .footer-action-icon { padding: 5px; } @@ -484,6 +550,22 @@ onMounted(() => { cursor: pointer; } + .qdself-icon { + width: 22px; + height: 22px; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + transform: scale(1.1); + opacity: 0.8; + } + + &:active { + transform: scale(0.95); + } + } + .details-icon { width: 22px; height: 22px; @@ -498,6 +580,43 @@ onMounted(() => { } } +// 气泡提示样式 +.tooltip { + position: absolute; + top: -35px; + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.8); + color: white; + padding: 4px 8px; + border-radius: 4px; + font-size: 12px; + white-space: nowrap; + z-index: 1000; + animation: tooltipFadeIn 0.3s ease-out; + + &::after { + content: ''; + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + border: 4px solid transparent; + border-top-color: rgba(0, 0, 0, 0.8); + } +} + +@keyframes tooltipFadeIn { + from { + opacity: 0; + transform: translateX(-50%) translateY(-5px); + } + to { + opacity: 1; + transform: translateX(-50%) translateY(0); + } +} + // 新增按钮 - 固定在底部 .add-button-fixed { position: fixed; diff --git a/src/pages/view/routine/qd/selectTeachers.vue b/src/pages/view/routine/qd/selectTeachers.vue index b1d4153..e01f9cc 100644 --- a/src/pages/view/routine/qd/selectTeachers.vue +++ b/src/pages/view/routine/qd/selectTeachers.vue @@ -42,8 +42,23 @@ + + + {{ getSecondSelectLabel() }} + + + + + - + {{ getSecondSelectLabel() }} @@ -60,6 +75,11 @@ 💡 提示:选择"所有老师"将直接加载所有教师数据 + + + 💡 提示:选择"自定义教师"可以手动选择特定的教师 + + @@ -159,6 +179,7 @@ import { kmFindAllApi, zwFindAllApi } from "@/api/base/server"; +import BasicJsPicker from '@/components/BasicJsPicker/Picker.vue'; interface TeacherInfo { id: string; @@ -177,8 +198,13 @@ const selectedTeachers = ref([]); const isLoading = ref(false); const showModal = ref(false); // 控制多选弹窗的显示 +// 自定义教师选择相关 +const customTeacherPickerRef = ref(null); +const customSelectedTeachers = ref([]); + // 选择类别选项 const selectTypeOptions = [ + { value: 0, label: '自定义教师' }, { value: 1, label: '所有老师' }, { value: 2, label: '按科目' }, { value: 3, label: '按班主任' }, @@ -207,6 +233,8 @@ const getZwTypeText = () => { // 获取第二个选择框的标签 const getSecondSelectLabel = () => { switch (selectType.value) { + case 0: + return '选择教师'; case 1: return '年级/班级'; case 2: @@ -241,6 +269,12 @@ const onSelectTypeChange = async (e: any) => { selectType.value = selectTypeOptions[e.detail.value].value; selectTwoType.value = []; selectedTeachers.value = []; + customSelectedTeachers.value = []; + + // 如果选择"自定义教师",清空选择 + if (selectType.value === 0) { + return; + } // 如果选择"所有老师",直接加载所有教师数据 if (selectType.value === 1) { @@ -293,6 +327,25 @@ const confirmMultiSelect = () => { loadTeachers(); }; +// 自定义教师选择变化处理 +const onCustomTeacherChange = (teachers: any[]) => { + console.log('自定义教师选择变化:', teachers); + + // 更新自定义选择的教师ID列表 + customSelectedTeachers.value = teachers.map(teacher => teacher.value || teacher.id); + + // 转换为统一的教师信息格式 + selectedTeachers.value = teachers.map(teacher => ({ + id: teacher.id || teacher.value, + jsxm: teacher.jsxm || teacher.label, + jsId: teacher.id || teacher.value, + dzzw: teacher.dzzw || '', + qtzw: teacher.qtzw || '' + })); + + console.log('处理后的自定义教师数据:', selectedTeachers.value); +}; + // 从localStorage加载所有教师数据 const loadAllTeachersFromStorage = async () => { try { @@ -1114,6 +1167,10 @@ const ensureTeacherDataCached = async () => { position: relative; } +.custom-teacher-picker { + flex: 1; +} + .selected-items-display { display: flex; justify-content: space-between; diff --git a/src/static/base/view/qdself.png b/src/static/base/view/qdself.png new file mode 100644 index 0000000000000000000000000000000000000000..d28bc8dfd72582352be5dee6926b59944239bc01 GIT binary patch literal 3778 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 literal 0 HcmV?d00001