Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,48 @@ export default [
rules: {
'vue/multi-word-component-names': 'off',
},
},
{
languageOptions: {
globals: {
// Browser globals
window: 'readonly',
document: 'readonly',
navigator: 'readonly',
localStorage: 'readonly',
sessionStorage: 'readonly',
console: 'readonly',
alert: 'readonly',
confirm: 'readonly',
prompt: 'readonly',
setTimeout: 'readonly',
setInterval: 'readonly',
fetch: 'readonly',
XMLHttpRequest: 'readonly',
URL: 'readonly',
URLSearchParams: 'readonly',
atob: 'readonly',
btoa: 'readonly',
// Vite globals
import: 'readonly',
process: 'readonly',
// Service Worker globals
self: 'readonly',
caches: 'readonly',
// Web API
Notification: 'readonly',
ServiceWorker: 'readonly',
PushManager: 'readonly',
PushSubscription: 'readonly',
// Web Storage API
Storage: 'readonly',
StorageEvent: 'readonly',
// Web Socket
WebSocket: 'readonly',
// Web Workers
Worker: 'readonly',
SharedWorker: 'readonly',
},
},
}
]
77 changes: 72 additions & 5 deletions src/components/home/HomeworkGrid.vue
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,9 @@
variant="tonal"
@click="handleCardClick('dialog', subject.name)"
>
<v-icon start size="small">mdi-plus</v-icon>
<v-icon start size="small">
{{ isReadOnlyToken ? 'mdi-cancel' : 'mdi-plus' }}
</v-icon>
{{ subject.name }}
</v-chip>
</div>
Expand All @@ -165,7 +167,9 @@
:key="subject.name"
@click="handleCardClick('dialog', subject.name)"
>
<v-icon start> mdi-plus</v-icon>
<v-icon start>
{{ isReadOnlyToken ? 'mdi-cancel' : 'mdi-plus' }}
</v-icon>
{{ subject.name }}
</v-btn>
</v-btn-group>
Expand All @@ -183,8 +187,14 @@
{{ subject.name }}
</v-card-title>
<v-card-text class="text-center">
<v-icon color="grey" size="small"> mdi-plus</v-icon>
<div class="text-caption text-grey">点击添加作业</div>
<template v-if="isReadOnlyToken">
<v-icon color="grey" size="small"> mdi-cancel </v-icon>
<div class="text-caption text-grey"> 当日无作业 </div>
</template>
<template v-else>
<v-icon color="grey" size="small"> mdi-plus </v-icon>
<div class="text-caption text-grey"> 点击添加作业 </div>
</template>
</v-card-text>
</v-card>
</TransitionGroup>
Expand Down Expand Up @@ -233,10 +243,17 @@ export default {
},
},
emits: ["open-dialog", "open-attendance", "disabled-click"],
mounted() {
data() {
return {
isReadOnlyToken: false,
}
},
async mounted() {
/* eslint-disable no-undef */
this.resizeObserver = new ResizeObserver(() => {
this.resizeAllGridItems();
});
/* eslint-enable no-undef */

// Observe the grid container for width changes
if (this.$refs.gridContainer) {
Expand All @@ -256,6 +273,9 @@ export default {
});
}
});

// 检查只读状态
await this.checkReadOnlyStatus();
},
updated() {
// When items change, re-observe new items
Expand All @@ -276,6 +296,53 @@ export default {
}
},
methods: {
async checkReadOnlyStatus() {
// 尝试获取父组件中的StudentNameManager引用
try {
// 在Vue 2中,通过$parent或$root访问父组件
let manager = null;

// 首先尝试直接访问父组件的引用
if (this.$parent && this.$parent.$refs && this.$parent.$refs.studentNameManager) {
manager = this.$parent.$refs.studentNameManager;
} else if (this.$root && this.$root.$refs && this.$root.$refs.studentNameManager) {
manager = this.$root.$refs.studentNameManager;
}

if (manager && typeof manager.isReadOnly !== 'undefined') {
this.isReadOnlyToken = manager.isReadOnly;
} else {
// 如果无法直接访问manager,尝试通过全局设置获取token信息
// 这里需要使用utils/settings中的函数
const { getSetting } = await import('@/utils/settings');
const token = getSetting('server.kvToken');

if (token) {
// 通过API获取token信息来判断是否只读
const { default: axios } = await import('@/axios/axios');
const serverUrl = getSetting('server.domain');

if (serverUrl) {
try {
const tokenResponse = await axios.get(`${serverUrl}/kv/_token`, {
headers: {
Authorization: `Bearer ${token}`
}
});

if (tokenResponse.data && typeof tokenResponse.data.isReadOnly !== 'undefined') {
this.isReadOnlyToken = tokenResponse.data.isReadOnly;
}
} catch (err) {
console.error('获取Token信息失败:', err);
}
}
}
}
} catch (error) {
console.error('检查只读状态失败:', error);
}
},
resizeGridItem(item) {
const grid = this.$refs.gridContainer;
if (!grid) return;
Expand Down
Loading