diff --git a/backend/middleware/requireFeature.js b/backend/middleware/requireFeature.js
index 2d70e30..4e321d7 100644
--- a/backend/middleware/requireFeature.js
+++ b/backend/middleware/requireFeature.js
@@ -4,7 +4,7 @@ const { clubHasFeature } = require('../utils/featureAccess');
function requireFeature(featureCode) {
return async function(req, res, next) {
try {
- const clubId = req.clubId || (req.user && req.user.clubId);
+ const clubId = req.clubId || req.body.clubId || req.params.clubId;
if (!clubId) {
return res.status(400).json({ error: '클럽 정보가 필요합니다.' });
}
diff --git a/backend/models/Event.js b/backend/models/Event.js
index 7454477..3b807d8 100644
--- a/backend/models/Event.js
+++ b/backend/models/Event.js
@@ -97,16 +97,4 @@ Event.associate = (models) => {
});
};
-Event.associate = (models) => {
- Event.belongsTo(models.Club, {
- foreignKey: 'clubId'
- });
- Event.hasMany(models.EventParticipant, {
- foreignKey: 'eventId'
- });
- Event.hasMany(models.EventScore, {
- foreignKey: 'eventId'
- });
-};
-
module.exports = Event;
diff --git a/backend/models/EventParticipant.js b/backend/models/EventParticipant.js
index a5e4d8c..c9fbd2a 100644
--- a/backend/models/EventParticipant.js
+++ b/backend/models/EventParticipant.js
@@ -69,6 +69,7 @@ EventParticipant.associate = (models) => {
EventParticipant.hasMany(models.EventScore, {
foreignKey: 'participantId'
});
+ EventParticipant.belongsTo(models.Member, { foreignKey: 'memberId' });
};
module.exports = EventParticipant;
diff --git a/backend/models/Member.js b/backend/models/Member.js
index bea71f2..a637a9d 100644
--- a/backend/models/Member.js
+++ b/backend/models/Member.js
@@ -75,11 +75,14 @@ const Member = sequelize.define('Member', {
tableName: 'Members',
timestamps: true
});
+Member.associate = (models) => {
+ // User와의 관계 설정
+ Member.belongsTo(User, {foreignKey: 'userId'});
-// User와의 관계 설정
-Member.belongsTo(User, {foreignKey: 'userId'});
-
-// Club과의 관계 설정
-Member.belongsTo(Club, {foreignKey: 'clubId'});
+ // Club과의 관계 설정
+ Member.belongsTo(Club, {foreignKey: 'clubId'});
+ // EventParticipant와의 관계 설정
+ Member.hasMany(models.EventParticipant, { foreignKey: 'memberId' });
+};
module.exports = Member;
diff --git a/backend/routes/clubRoutes.js b/backend/routes/clubRoutes.js
index 390a3a5..2a57178 100644
--- a/backend/routes/clubRoutes.js
+++ b/backend/routes/clubRoutes.js
@@ -22,7 +22,7 @@ router.delete('/', authenticateJWT, clubController.deleteClub);
router.post('/user', authenticateJWT, clubController.getUserClubs);
// 클럽 회원 통계 조회
-router.post('/members/stats', authenticateJWT, requireFeature('statistics'), clubController.getMemberStats);
+router.post('/members/stats', authenticateJWT, clubController.getMemberStats);
// 클럽 회원 목록 조회
router.post('/members', authenticateJWT, clubController.getClubMembers);
@@ -46,10 +46,10 @@ router.post('/meetings/last', authenticateJWT, clubController.getLastMeeting);
router.post('/meetings/recent', authenticateJWT, clubController.getRecentMeetings);
// 점수 통계 조회
-router.post('/scores/stats', authenticateJWT, requireFeature('statistics'), clubController.getScoreStats);
+router.post('/scores/stats', authenticateJWT, clubController.getScoreStats);
// 상위 회원 목록 조회
-router.post('/members/top', authenticateJWT, requireFeature('statistics'), clubController.getTopMembers);
+router.post('/members/top', authenticateJWT, clubController.getTopMembers);
// 새 클럽 생성
router.post('/create', authenticateJWT, clubController.createClub);
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index b7a8b1d..c2d123f 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -173,6 +173,7 @@ const fetchClubs = async () => {
// 첫 번째 클럽의 memberType을 localStorage에 저장
if (clubs.value.length > 0) {
localStorage.setItem('userClubRole', clubs.value[0].memberType || '');
+ localStorage.setItem('clubId', clubs.value[0].id);
}
} catch (error) {
console.error('클럽 목록 로드 실패:', error);
diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue
index 0e20682..d044645 100644
--- a/frontend/src/components/AppHeader.vue
+++ b/frontend/src/components/AppHeader.vue
@@ -91,6 +91,7 @@ const userAvatar = computed(() => user.value?.avatar || '');
// 로그아웃
const logout = () => {
+ user.value = null;
localStorage.removeItem('token');
localStorage.removeItem('clubId');
localStorage.removeItem('userRole');
diff --git a/frontend/src/views/club/EventCalendar.vue b/frontend/src/views/club/EventCalendar.vue
index 02cbd45..d722bd6 100644
--- a/frontend/src/views/club/EventCalendar.vue
+++ b/frontend/src/views/club/EventCalendar.vue
@@ -65,6 +65,7 @@ const fetchEvents = async () => {
loading.value = true;
try {
const eventData = await eventService.getEvents(clubId.value);
+ console.log('eventData', eventData);
events.value = eventData.map(event => ({
id: event.id,
title: event.title,
diff --git a/frontend/src/views/club/EventManagement.vue b/frontend/src/views/club/EventManagement.vue
index 6f06211..6396516 100644
--- a/frontend/src/views/club/EventManagement.vue
+++ b/frontend/src/views/club/EventManagement.vue
@@ -105,6 +105,7 @@
+
@@ -163,6 +164,7 @@ const fetchEvents = async () => {
loading.value = true;
try {
const response = await eventService.getEvents(clubId.value);
+ console.log('eventData', response);
events.value = response;
} catch (error) {
toast.add({