diff --git a/src/components/LcglSpList/index.vue b/src/components/LcglSpList/index.vue index 98dd224..516125e 100644 --- a/src/components/LcglSpList/index.vue +++ b/src/components/LcglSpList/index.vue @@ -48,9 +48,9 @@ import { getByYwIdAndYwTypeApi } from "@/api/base/lcglSpApi"; const props = withDefaults(defineProps<{ ywId: string, ywType: string, - showSqr: boolean, - showSpr: boolean, - showCsr: boolean, + showSqr?: boolean, + showSpr?: boolean, + showCsr?: boolean, }>(), { ywId: '', ywType: '', diff --git a/src/pages/base/home/index.vue b/src/pages/base/home/index.vue index af2e379..7badc76 100644 --- a/src/pages/base/home/index.vue +++ b/src/pages/base/home/index.vue @@ -3,14 +3,14 @@ - + - + 新增学生 @@ -24,13 +24,8 @@ - + @@ -48,12 +43,7 @@ - + @@ -100,7 +90,7 @@ const getCurrentChangeTime = () => { try { const userDataStr = uni.getStorageSync('app-user'); if (!userDataStr) return null; - + const userData = typeof userDataStr === 'string' ? JSON.parse(userDataStr) : userDataStr; return userData?.changeTime || null; } catch (error) { @@ -121,7 +111,7 @@ const hasPermissionDirect = (permissionKey: string) => { const userStore = useUserStore(); const permissions = userStore.getAuth; if (!permissions || permissions.length === 0) return false; - + const uniquePermissions = [...new Set(permissions)]; return uniquePermissions.includes(permissionKey); }; @@ -130,7 +120,7 @@ const hasPermissionDirect = (permissionKey: string) => { const checkAndRefreshStudentInfo = async () => { const lastRefreshTime = getLastRefreshTime; const currentTime = Date.now(); - + if (!lastRefreshTime || (currentTime - lastRefreshTime) > REFRESH_INTERVAL) { await refreshStudentInfo(); setLastRefreshTime(currentTime); @@ -145,7 +135,7 @@ const refreshStudentInfo = async () => { // 更新学生列表 if (response.result.xsList && response.result.xsList.length > 0) { updateStudentList(response.result.xsList); - + // 更新当前学生信息(保持当前选中的学生) const currentXsId = curXs.value?.id; if (currentXsId) { @@ -182,10 +172,10 @@ const menuItems = ref([ permissionKey: "school-cjcx", // 成绩查询权限编码 }, { - title: "在线请假", - icon: "/static/base/home/draft-line.png", - path: "/pages/base/qj/index", - permissionKey: "school-zxqj", // 在线请假权限编码 + title: "在线请假", + icon: "/static/base/home/draft-line.png", + path: "/pages/base/qj/index", + permissionKey: "school-zxqj", // 在线请假权限编码 }, // TODO:需求待协商硬件对接 // { @@ -238,7 +228,7 @@ const menuItems = ref([ title: "就餐报名", icon: "/static/base/home/contacts-book-3-line.png", path: "/pages/base/gzs/index", - permissionKey: "school-jcjf", + permissionKey: "school-jcjf", action: 'jf', lxId: 'JC', }, @@ -267,15 +257,15 @@ const announcements = ref([]) let curXs = computed(() => getCurXs) let pageParams = ref({ - page: 1, - rows: 10, + page: 1, + rows: 10, appCode: getAppCode }) const goToGlxs = () => { - uni.navigateTo({ - url: "/pages/base/home/glxs", - }); + uni.navigateTo({ + url: "/pages/base/home/glxs", + }); } // 处理菜单点击 @@ -299,13 +289,13 @@ function switchXs(xs: any) { // 跳转到详情页面 function goToDetail(notice: any) { - setData(notice) - uni.navigateTo({ - url: '/pages/base/home/detail' - }) + setData(notice) + uni.navigateTo({ + url: '/pages/base/home/detail' + }) } -const getArticleList = async () => { +const getArticleList = async () => { if (curXs.value && curXs.value.njmcId) { const params = { page: pageParams.value.page, @@ -316,13 +306,13 @@ const getArticleList = async () => { fbNjmcId: curXs.value.njmcId, // 学生所在年级 releaseFlag: 'A' // 发布状态:有效 }; - + getNoticeListApi(params).then(res => { announcements.value = res.rows; }) - .catch((error) => { - // 接口调用失败 - }); + .catch((error) => { + // 接口调用失败 + }); } }; @@ -339,10 +329,10 @@ onMounted(async () => { } }, 100); } - + // 初始化时检查是否需要刷新学生信息 await checkAndRefreshStudentInfo(); - + // 检查权限缓存,确保权限数据是最新的 const userStore = useUserStore(); const changeTime = userStore.getChangeTime; @@ -350,11 +340,11 @@ onMounted(async () => { // 如果有changeTime,检查是否需要刷新权限 const { PermissionCacheManager } = await import('@/utils/permission'); const cacheInfo = PermissionCacheManager.getCacheInfo(); - + if (cacheInfo.hasCache && cacheInfo.changeTime) { const serverTime = new Date(changeTime).getTime(); const cacheTime = new Date(cacheInfo.changeTime).getTime(); - + if (serverTime > cacheTime) { // 服务器时间更新,刷新权限缓存 const { refreshPermissionCache } = await import('@/utils/permission'); @@ -365,7 +355,7 @@ onMounted(async () => { } } } - + // 检查用户是否已关注服务号 await checkSubscribeStatus(); }); @@ -374,7 +364,7 @@ onMounted(async () => { const checkSubscribeStatus = async () => { const userStore = useUserStore(); const userInfo = userStore.getUser; - + if (userInfo && !userInfo.subscribed) { // 延迟显示关注提醒,避免与启动页面冲突 setTimeout(() => { @@ -441,18 +431,18 @@ watch(curXs, (newXs, oldXs) => { overflow: hidden; .banner-content { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + .banner-img { width: 100%; height: 100%; object-fit: cover; } - + .banner-overlay { position: absolute; top: 0; @@ -463,7 +453,7 @@ watch(curXs, (newXs, oldXs) => { display: flex; align-items: center; justify-content: center; - + } } @@ -473,7 +463,7 @@ watch(curXs, (newXs, oldXs) => { bottom: 0; display: flex; align-items: center; - justify-content: center; + justify-content: center; gap: 4px; padding: 8px 16px; background: linear-gradient(135deg, #4A90E2 0%, #357ABD 100%); @@ -487,7 +477,7 @@ watch(curXs, (newXs, oldXs) => { flex-shrink: 0; min-width: 60px; height: 16px; - + text { line-height: 1; } @@ -497,20 +487,20 @@ watch(curXs, (newXs, oldXs) => { /* 功能菜单 */ .menu-section { margin-bottom: 25px; - + .section-title { display: flex; align-items: center; margin-bottom: 20px; padding: 0 5px; - + .title-text { font-size: 18px; font-weight: 600; color: #303133; position: relative; padding-left: 12px; - + &::before { content: ''; position: absolute; @@ -523,7 +513,7 @@ watch(curXs, (newXs, oldXs) => { border-radius: 2px; } } - + .title-line { flex: 1; height: 1px; @@ -531,7 +521,7 @@ watch(curXs, (newXs, oldXs) => { margin-left: 20px; } } - + .grid-menu { display: grid; grid-template-columns: repeat(3, 1fr); @@ -540,7 +530,7 @@ watch(curXs, (newXs, oldXs) => { border-radius: 16px; box-shadow: 0 8px 32px rgba(74, 144, 226, 0.2); border: 1px solid rgba(255, 255, 255, 0.8); - + .grid-item { display: flex; flex-direction: column; @@ -550,12 +540,12 @@ watch(curXs, (newXs, oldXs) => { transition: all 0.3s ease; border-radius: 12px; position: relative; - + &:active { transform: scale(0.95); background-color: rgba(74, 144, 226, 0.05); } - + .grid-icon-container { position: relative; width: 48px; @@ -564,7 +554,7 @@ watch(curXs, (newXs, oldXs) => { display: flex; align-items: center; justify-content: center; - + .icon-background { position: absolute; top: 0; @@ -575,7 +565,7 @@ watch(curXs, (newXs, oldXs) => { background: linear-gradient(135deg, #f0f4ff 0%, #e6f0ff 100%); box-shadow: 0 2px 8px rgba(74, 144, 226, 0.15); } - + .grid-icon { position: relative; z-index: 1; @@ -584,7 +574,7 @@ watch(curXs, (newXs, oldXs) => { object-fit: contain; } } - + .grid-text { font-size: 13px; font-weight: 500; @@ -603,14 +593,14 @@ watch(curXs, (newXs, oldXs) => { align-items: center; margin-bottom: 20px; padding: 0 5px; - + .title-text { font-size: 18px; font-weight: 600; color: #303133; position: relative; padding-left: 12px; - + &::before { content: ''; position: absolute; @@ -623,7 +613,7 @@ watch(curXs, (newXs, oldXs) => { border-radius: 2px; } } - + .title-line { flex: 1; height: 1px; @@ -631,7 +621,7 @@ watch(curXs, (newXs, oldXs) => { margin-left: 20px; } } - + .notice-list { .notice-item { display: flex; @@ -643,12 +633,12 @@ watch(curXs, (newXs, oldXs) => { box-shadow: 0 8px 24px rgba(74, 144, 226, 0.18); border: 1px solid rgba(255, 255, 255, 0.8); transition: all 0.3s ease; - + &:active { transform: translateY(-2px); box-shadow: 0 12px 36px rgba(74, 144, 226, 0.25); } - + .notice-icon { width: 50px; height: 50px; @@ -661,13 +651,13 @@ watch(curXs, (newXs, oldXs) => { box-shadow: 0 2px 8px rgba(74, 144, 226, 0.15); flex-shrink: 0; } - + .notice-content { flex: 1; display: flex; flex-direction: column; min-width: 0; - + .notice-title { font-size: 15px; font-weight: 600; @@ -680,7 +670,7 @@ watch(curXs, (newXs, oldXs) => { -webkit-box-orient: vertical; line-height: 1.3; } - + .notice-desc { font-size: 13px; color: #606266; @@ -693,19 +683,19 @@ watch(curXs, (newXs, oldXs) => { flex: 1; line-height: 1.4; } - + .notice-footer { display: flex; align-items: center; justify-content: space-between; - + .notice-date { font-size: 12px; color: #909399; font-weight: 400; line-height: 1; } - + .notice-arrow { width: 20px; height: 20px;