-
-
-
欢迎来到
-
浙江大学学生网络空间安全协会
-
-
-
-
- |
-
-
-
-
+
diff --git a/src/components/admin/AdminAiSchedulePanel.vue b/src/components/admin/AdminAiSchedulePanel.vue
new file mode 100644
index 0000000..7507fb3
--- /dev/null
+++ b/src/components/admin/AdminAiSchedulePanel.vue
@@ -0,0 +1,985 @@
+
+
+
+
+
+
+
+
+
+
+ 大模型 API 配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 排班参数
+
+
+
+
+
用于计算各时间段对应的具体日期(自动显示本周 / 下周 / 下下周)
+
+
+
+
+
+
+
+
+ 本次 AI 排班写入的所有面试记录将统一使用该形式
+
+
+
+
+ - 仅对「已提交问卷且未排班」的纳新者生效
+ - 手动固定排班的同学不会被 AI 覆盖,可在排班看板撤销
+ - 已勾选 {{ selectedVenues.length }} 个场地参与本次排班
+ - 优先满足同学在问卷中选择的时间段偏好
+
+
+
+
+
+
+
+
+
+ 暂无历史记录,完成一次 AI 排班后将展示折线图
+
+
+
+
+
+
+
+
+
+
{{ lastResult.message }}
+
+
未排班同学({{ lastResult.unscheduled_details.length }} 人)
+
+ -
+ {{ person.name }}({{ person.uid }})
+
+
+
+
+
{{ lastResult.llm_summary }}
+
+
+
+
+ | 姓名 |
+ 学号 |
+ 时间段 |
+ 场地 |
+ 面试形式 |
+
+
+
+
+ | {{ row.name }} |
+ {{ row.uid }} |
+ {{ row.display_slot }} |
+ {{ row.venue }} |
+ {{ getInterviewFormatLabel(row.interview_format || form.interview_format) }} |
+
+
+
+
+ 还有 {{ sortedScheduleDetails.length - 8 }} 条,请下载 Excel 排班表查看完整数据
+
+
+
+
+
+
+
+
+
diff --git a/src/components/admin/AdminScheduleBoard.vue b/src/components/admin/AdminScheduleBoard.vue
new file mode 100644
index 0000000..9bb055e
--- /dev/null
+++ b/src/components/admin/AdminScheduleBoard.vue
@@ -0,0 +1,372 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
加载中...
+
+
+
+
+
+
+
+ | 姓名 |
+ 学号 |
+ 专业 |
+ 阶段 |
+
+
+
+
+ | {{ item.name }} |
+ {{ item.uid }} |
+ {{ item.major_name }} |
+ {{ item.interview_status === 'second_round' ? '二面' : '一面' }} |
+
+
+
+
所有同学均已排班
+
+
+
+
+
+
diff --git a/src/components/admin/AdminVenueManager.vue b/src/components/admin/AdminVenueManager.vue
new file mode 100644
index 0000000..45e590b
--- /dev/null
+++ b/src/components/admin/AdminVenueManager.vue
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
加载中...
+
暂无场地,请先添加
+
+
+
+
+
+
diff --git a/src/utils/weekCalendar.js b/src/utils/weekCalendar.js
new file mode 100644
index 0000000..1d59822
--- /dev/null
+++ b/src/utils/weekCalendar.js
@@ -0,0 +1,38 @@
+/** 以周一为一周起点,计算相对基准日的「本周 / 下周 / 下下周」标签。 */
+
+export function toDateOnly(value) {
+ const date = value instanceof Date ? value : new Date(value)
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate())
+}
+
+export function weekStartMonday(value) {
+ const date = toDateOnly(value)
+ const day = date.getDay()
+ const diff = day === 0 ? -6 : 1 - day
+ date.setDate(date.getDate() + diff)
+ return date
+}
+
+export function calendarWeeksAfter(base, target) {
+ const baseStart = weekStartMonday(base)
+ const targetStart = weekStartMonday(target)
+ return Math.round((targetStart - baseStart) / (7 * 24 * 60 * 60 * 1000))
+}
+
+export function formatRelativeWeekLabel(base, target) {
+ const diff = calendarWeeksAfter(base, target)
+ if (diff <= 0) return '本周'
+ if (diff === 1) return '下周'
+ if (diff === 2) return '下下周'
+ return `${diff}周后`
+}
+
+export function isSameCalendarDay(left, right) {
+ const a = toDateOnly(left)
+ const b = toDateOnly(right)
+ return (
+ a.getFullYear() === b.getFullYear()
+ && a.getMonth() === b.getMonth()
+ && a.getDate() === b.getDate()
+ )
+}
diff --git a/src/views/CsaAdminInterview.vue b/src/views/CsaAdminInterview.vue
index a90c1b4..5da1908 100644
--- a/src/views/CsaAdminInterview.vue
+++ b/src/views/CsaAdminInterview.vue
@@ -11,10 +11,10 @@
@update:modelValue="updateGlobalBaseDate"
/>