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)) }) }}
+
+