diff --git a/.workbuddy/memory/2026-05-06.md b/.workbuddy/memory/2026-05-06.md index d7df543..dc4afb5 100644 --- a/.workbuddy/memory/2026-05-06.md +++ b/.workbuddy/memory/2026-05-06.md @@ -132,3 +132,16 @@ **修复**(`CalendarDetail.vue` `handleKeyDown` Ctrl+C 分支): - 检测 `end` 是否为 Date 实例,如果是则用本地日期方法转为 `YYYY-MM-DD` 字符串再存入 clipboard + +## 新增:编辑事件窗口显示创建者 + +**功能**:编辑事件模态框标题居中显示「xxx 创建」 + +**实现**(参考 ScheduleView.vue): +- 导入 `useUsersStore`,添加 `usersStore` +- `pageData.eventBindUserID`:数组,每项 `{ eventID, userID }` +- `getUserIdFromEventID(eventID)`:通过事件ID查创建者用户ID +- `getUsernameFromUserID(userID)`:调用 `usersStore.getUsernameFromUserID(userID)`(有缓存) +- `getEvents` 中遍历事件时 `pageData.value.eventBindUserID.push({ eventID: item.ID, userID: item.UserID })` +- 模态框标题新增 `
` 居中显示 +- i18n:`calendar.created_by` = "{name} 创建" / "Created by {name}" diff --git a/frontend/ops_vue_js/src/i18n/en.json b/frontend/ops_vue_js/src/i18n/en.json index ba71fb3..30b61b6 100644 --- a/frontend/ops_vue_js/src/i18n/en.json +++ b/frontend/ops_vue_js/src/i18n/en.json @@ -663,6 +663,7 @@ "paste_event": "Paste Event", "copy_success": "Event copied", "paste_success": "Event pasted", - "no_event_to_paste": "No event to paste" + "no_event_to_paste": "No event to paste", + "created_by": "Created by {name}" } } diff --git a/frontend/ops_vue_js/src/i18n/zh-CN.json b/frontend/ops_vue_js/src/i18n/zh-CN.json index c71ac91..6d1562b 100644 --- a/frontend/ops_vue_js/src/i18n/zh-CN.json +++ b/frontend/ops_vue_js/src/i18n/zh-CN.json @@ -664,6 +664,7 @@ "paste_event": "粘贴日程", "copy_success": "日程已复制", "paste_success": "日程已粘贴", - "no_event_to_paste": "没有可粘贴的日程" + "no_event_to_paste": "没有可粘贴的日程", + "created_by": "{name} 创建" } } diff --git a/frontend/ops_vue_js/src/views/calendar/CalendarDetail.vue b/frontend/ops_vue_js/src/views/calendar/CalendarDetail.vue index 07612aa..9eb6186 100644 --- a/frontend/ops_vue_js/src/views/calendar/CalendarDetail.vue +++ b/frontend/ops_vue_js/src/views/calendar/CalendarDetail.vue @@ -10,6 +10,7 @@ import { useI18n } from "vue-i18n" import { usePageTitle } from "@/composables/usePageTitle" import { useToastStore } from "@/stores/toast" import { useUserStore } from "@/stores/user" +import { useUsersStore } from "@/stores/users" import { calendarApi } from "@/api/calendar" import { useDateUtils } from "@/composables/useDateUtils" import DatatimePickerForFullCalendar from "@/components/datatimePickerForFullCalendar.vue" @@ -20,6 +21,7 @@ const router = useRouter() const { t, locale } = useI18n() const toast = useToastStore() const userStore = useUserStore() +const usersStore = useUsersStore() const DateUtils = useDateUtils() const calendarId = ref(parseInt(route.params.id)) @@ -62,6 +64,7 @@ const pageData = ref({ lastEventClickID: 0, submitChecked: false, lastEventsSnapshot: null, + eventBindUserID: [], // 事件ID → 创建者UserID 映射 }) const showDeleteModal = ref(false) @@ -103,6 +106,18 @@ function closeContextMenu() { contextMenu.value.visible = false } +// 通过事件ID获取创建者用户ID +function getUserIdFromEventID(eventID) { + const target = pageData.value.eventBindUserID.find(item => item.eventID === eventID) + return target ? target.userID : 0 +} + +// 通过用户ID获取用户名 +function getUsernameFromUserID(userID) { + if (userID == 0) return "" + return usersStore.getUsernameFromUserID(userID) +} + function copyEvent() { if (!contextMenu.value.eventInfo) return clipboard.value = { ...contextMenu.value.eventInfo } @@ -297,8 +312,13 @@ async function getEvents() { if (errCode === 0) { calendarOptions.value.events = [] + pageData.value.eventBindUserID = [] ;(data.list || []).forEach(item => { const canEdit = item.canEdit === true + pageData.value.eventBindUserID.push({ + eventID: item.ID, + userID: item.UserID, + }) calendarOptions.value.events.push({ id: item.ID, title: item.Title, @@ -724,6 +744,19 @@ onMounted(() => { : t("calendar.view_event") }}
+
+ avatar + + {{ t("calendar.created_by", { name: getUsernameFromUserID(getUserIdFromEventID(eventData.id)) }) }} + +