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 0000000..d28bc8d Binary files /dev/null and b/src/static/base/view/qdself.png differ