diff --git a/backend/my_work/routers/apiCalendar.go b/backend/my_work/routers/apiCalendar.go index ca12de9..5c308cf 100644 --- a/backend/my_work/routers/apiCalendar.go +++ b/backend/my_work/routers/apiCalendar.go @@ -120,7 +120,7 @@ var ( calendarAdmins []uint ) -// CalendarUpdateAdminsCash 更新客户管理员缓存 +// CalendarUpdateAdminsCash func CalendarUpdateAdminsCash() { calendarAdmins = nil calendarAdmins = append(calendarAdmins, 1) // id=1 系统管理员默认拥有所有权限 @@ -152,6 +152,8 @@ func ApiCalendarInit() { Name: "calendar_admin", Type: "usergroup", }) + + CalendarUpdateAdminsCash() } func ApiCalendar(r *gin.RouterGroup) { @@ -429,22 +431,31 @@ func ApiCalendar(r *gin.RouterGroup) { } } + // 查询日历创建者(用于判断权限) + var calendarCreatorID uint + var calendar TabCalendar + if models.DB.Where("id = ?", calendarID).First(&calendar).Error == nil { + calendarCreatorID = calendar.UserID + } + var relist []map[string]interface{} for _, event := range events { eventMap, _ := json.Marshal(event) var item map[string]interface{} json.Unmarshal(eventMap, &item) - // 可编辑条件:事件创建者 或 日历管理员 + // 可编辑条件:事件创建者 或 日历创建者 或 日历管理员 canEdit := false if isLogin { - if event.UserID == currentUserID || slices.Contains(calendarAdmins, currentUserID) { + if event.UserID == currentUserID || calendarCreatorID == currentUserID || slices.Contains(calendarAdmins, currentUserID) { canEdit = true } } item["canEdit"] = canEdit relist = append(relist, item) } + //fmt.Println(calendarAdmins) + //fmt.Println(calendarUserGroup) ReturnJson(ctx, "apiOK", gin.H{"list": relist}) }) @@ -528,8 +539,13 @@ func ApiCalendar(r *gin.RouterGroup) { oldEvent := TabCalendarEvent{} if models.DB.Where("id = ?", eventID).First(&oldEvent).Error == nil { - // 检查权限(只有创建人可以修改) - if oldEvent.UserID != user.ID { + // 检查权限(事件创建人、日历创建人或管理员可修改) + var calendarCreatorID uint + var calendar TabCalendar + if models.DB.Where("id = ?", oldEvent.CalendarID).First(&calendar).Error == nil { + calendarCreatorID = calendar.UserID + } + if !canModifyCalendar(user.ID, oldEvent.UserID) && calendarCreatorID != user.ID { ReturnJson(ctx, "permission_denied", nil) return } @@ -591,8 +607,13 @@ func ApiCalendar(r *gin.RouterGroup) { if err := mapstructure.Decode(data, &from); err == nil { oldEvent := TabCalendarEvent{} if models.DB.Where("id = ?", from.ID).First(&oldEvent).Error == nil { - // 检查权限(只有创建人可以删除) - if oldEvent.UserID != user.ID { + // 检查权限(事件创建人、日历创建人或管理员可删除) + var calendarCreatorID uint + var calendar TabCalendar + if models.DB.Where("id = ?", oldEvent.CalendarID).First(&calendar).Error == nil { + calendarCreatorID = calendar.UserID + } + if !canModifyCalendar(user.ID, oldEvent.UserID) && calendarCreatorID != user.ID { ReturnJson(ctx, "permission_denied", nil) return } diff --git a/backend/my_work/routers/apiSysAdmin.go b/backend/my_work/routers/apiSysAdmin.go index c320e48..ec5f4ad 100644 --- a/backend/my_work/routers/apiSysAdmin.go +++ b/backend/my_work/routers/apiSysAdmin.go @@ -407,6 +407,8 @@ func ApiSysAdmin(r *gin.RouterGroup) { WarehouseUpdateAdminsCash() case "customer_admin": CustomerUpdateAdminsCash() + case "calendar_admin": + CalendarUpdateAdminsCash() } ReturnJson(ctx, "apiOK", nil) diff --git a/backend/my_work/routers/apiUsers.go b/backend/my_work/routers/apiUsers.go index a78b58d..9e26ef9 100644 --- a/backend/my_work/routers/apiUsers.go +++ b/backend/my_work/routers/apiUsers.go @@ -594,6 +594,23 @@ func ApiUser(r *gin.RouterGroup) { } redata["isSysAdmin"] = isSysAdmin + // 获取用户加入的群组列表 + var binds []TabUserGroupBinds + models.DB.Where("user_id = ?", user.ID).Find(&binds) + + var groups []map[string]interface{} + for _, bind := range binds { + var group TabUserGroups + if models.DB.Where("id = ?", bind.GroupID).First(&group).Error == nil { + groups = append(groups, map[string]interface{}{ + "id": group.ID, + "name": group.Name, + "type": group.Type, + }) + } + } + redata["groups"] = groups + ReturnJson(ctx, "apiOK", redata) } diff --git a/frontend/ops_vue_js/src/i18n/en.json b/frontend/ops_vue_js/src/i18n/en.json index 2d47305..d96777f 100644 --- a/frontend/ops_vue_js/src/i18n/en.json +++ b/frontend/ops_vue_js/src/i18n/en.json @@ -442,7 +442,9 @@ "remark_hint": "Remark only", "edit_profile": "Edit Profile", "security": "Security", - "security_description": "Manage your account security settings" + "security_description": "Manage your account security settings", + "my_groups": "My Groups", + "no_groups": "Not joined any groups yet" }, "button": { "submit": "Submit", diff --git a/frontend/ops_vue_js/src/i18n/zh-CN.json b/frontend/ops_vue_js/src/i18n/zh-CN.json index 0093f84..a113cf5 100644 --- a/frontend/ops_vue_js/src/i18n/zh-CN.json +++ b/frontend/ops_vue_js/src/i18n/zh-CN.json @@ -442,7 +442,9 @@ "remark_hint": "仅备注", "edit_profile": "编辑资料", "security": "安全设置", - "security_description": "管理您的账户安全设置" + "security_description": "管理您的账户安全设置", + "my_groups": "我的群组", + "no_groups": "暂未加入任何群组" }, "button": { "submit": "提交", diff --git a/frontend/ops_vue_js/src/stores/user.js b/frontend/ops_vue_js/src/stores/user.js index d035ad7..3afdd63 100644 --- a/frontend/ops_vue_js/src/stores/user.js +++ b/frontend/ops_vue_js/src/stores/user.js @@ -41,6 +41,7 @@ export const useUserStore = defineStore('user', () => { const userInfo = ref(null) // TabUserInfo_ 详情 const userCookie = ref(null) // Cookie session const isLoggedIn = ref(false) + const groups = ref([]) // 用户加入的群组列表 // ── Getters ── const cookieValue = computed(() => userCookie.value?.Value ?? '') @@ -63,6 +64,9 @@ export const useUserStore = defineStore('user', () => { // 是否系统管理员(后端直接返回) const isSysAdmin = ref(false) + // 用户加入的群组名称列表(计算属性) + const groupNames = computed(() => groups.value.map(g => g.name)) + // ── Actions ── function login(cookie) { userCookie.value = cookie @@ -86,6 +90,7 @@ export const useUserStore = defineStore('user', () => { user.value = null userInfo.value = null isSysAdmin.value = false + groups.value = [] isLoggedIn.value = false removeStorage(STORAGE_KEY_COOKIE) } @@ -98,6 +103,8 @@ export const useUserStore = defineStore('user', () => { userInfo.value = data.userInfo ?? null // 存储系统管理员状态 isSysAdmin.value = data.isSysAdmin === true + // 存储用户群组列表 + groups.value = data.groups ?? [] } } catch { // 拦截器已处理错误提示 @@ -123,6 +130,8 @@ export const useUserStore = defineStore('user', () => { userCookie, isLoggedIn, isSysAdmin, + groups, + groupNames, cookieValue, avatarUrl, birthday, diff --git a/frontend/ops_vue_js/src/views/user/MyProfile.vue b/frontend/ops_vue_js/src/views/user/MyProfile.vue index 4d5e193..187f1ad 100644 --- a/frontend/ops_vue_js/src/views/user/MyProfile.vue +++ b/frontend/ops_vue_js/src/views/user/MyProfile.vue @@ -95,6 +95,28 @@ onMounted(() => { + + +
+

+ {{ t('settings.my_groups') }} +

+
+ + + + + {{ group.name }} + +
+
+ {{ t('settings.no_groups') }} +
+