오류 수정, 통계 보강

This commit is contained in:
2025-06-08 20:21:37 +09:00
parent 1a3706d7a5
commit 141a0de6d0
42 changed files with 2645 additions and 799 deletions
+25 -15
View File
@@ -20,7 +20,7 @@
</Column>
<Column field="owner.name" header="모임장" sortable style="width: 15%">
<template #body="slotProps">
{{ slotProps.data.owner?.name || '-' }}
{{ slotProps.data.owner?.name || 'guest' }}
</template>
</Column>
<Column field="memberCount" header="회원 수" sortable style="width: 10%"></Column>
@@ -125,13 +125,16 @@
</div>
</template>
</Column>
<Column field="gender" header="성별" sortable style="min-width: 6rem"></Column>
<Column field="gender" header="성별" sortable style="min-width: 6rem">
<template #body="slotProps">
{{ getGenderLabel(slotProps.data.gender) }}
</template>
</Column>
<Column field="memberType" header="회원 유형" sortable style="min-width: 8rem">
<template #body="slotProps">
<Select v-model="slotProps.data.memberType"
:options="memberTypes"
@change="updateMemberType(slotProps.data)"
:disabled="slotProps.data.memberType === '모임장' && !canChangeOwner" />
<span>
{{ getMemberTypeLabel(slotProps.data.memberType) }}
</span>
</template>
</Column>
<Column field="handicap" header="핸디캡" sortable style="min-width: 6rem"></Column>
@@ -154,7 +157,7 @@
<Button icon="pi pi-trash"
class="p-button-rounded p-button-danger"
@click="confirmDeleteMember(slotProps.data)"
:disabled="slotProps.data.memberType === '모임장'" />
:disabled="slotProps.data.memberType === 'owner'" />
</template>
</Column>
</DataTable>
@@ -172,16 +175,22 @@
</div>
<div class="field mb-3">
<label for="gender">성별</label>
<Select id="gender" v-model="member.gender"
:options="['남성', '여성']" placeholder="성별 선택"
:class="{'p-invalid': memberSubmitted && !member.gender}" class="w-full" />
<Select id="gender" v-model="member.gender"
:options="[{ label: '남성', value: 'male' }, { label: '여성', value: 'female' }]" optionLabel="label" optionValue="value" placeholder="성별 선택"
:class="{'p-invalid': memberSubmitted && !member.gender}" class="w-full" />
<small class="p-error" v-if="memberSubmitted && !member.gender">성별은 필수입니다.</small>
</div>
<div class="field mb-3">
<label for="memberType">회원 유형</label>
<Select id="memberType" v-model="member.memberType"
:options="memberTypes" placeholder="회원 유형 선택"
:class="{'p-invalid': memberSubmitted && !member.memberType}" class="w-full" />
<Select id="memberType" v-model="member.memberType"
:options="[
{ label: '정회원', value: 'regular' },
{ label: '준회원', value: 'associate' },
{ label: '게스트', value: 'guest' },
{ label: '운영진', value: 'manager' },
{ label: '모임장', value: 'owner' }
]" optionLabel="label" optionValue="value" placeholder="회원 유형 선택"
:class="{'p-invalid': memberSubmitted && !member.memberType}" class="w-full" />
<small class="p-error" v-if="memberSubmitted && !member.memberType">회원 유형은 필수입니다.</small>
</div>
<div class="field mb-3">
@@ -234,6 +243,7 @@
</template>
<script setup>
import { getGenderLabel, getMemberTypeLabel } from '@/utils/enumMappings';
import { ref, reactive, onMounted } from 'vue';
import { useToast } from 'primevue/usetoast';
import dayjs from 'dayjs';
@@ -257,7 +267,7 @@ const clubs = ref([]);
const clubMembers = ref([]);
// 회원 유형 목록
const memberTypes = ref(['모임장', '정회원', '준회원', '운영진']);
const memberTypes = ref(['owner', 'regular', 'associate', 'manager']);
// 기능 목록
const allFeatures = ref([
@@ -585,7 +595,7 @@ const openNewMemberDialog = () => {
id: null,
name: '',
gender: null,
memberType: '준회원',
memberType: 'associate',
handicap: 0,
phone: '',
email: ''
@@ -32,7 +32,7 @@
</Column>
<Column field="status" header="상태" sortable style="width: 10%">
<template #body="slotProps">
<Badge :value="getStatusName(slotProps.data.status)" :severity="getStatusSeverity(slotProps.data.status)" />
<Badge :value="getStatusLabel(slotProps.data.status)" :severity="getStatusSeverity(slotProps.data.status)" />
</template>
</Column>
<Column header="작업" style="width: 10%">
@@ -198,6 +198,7 @@
</template>
<script setup>
import { getStatusLabel } from '@/utils/enumMappings';
import { ref, onMounted, computed } from 'vue';
import { useToast } from 'primevue/usetoast';
import axios from 'axios';
@@ -498,7 +499,7 @@ const deleteSubscription = async () => {
};
// 상태 이름 가져오기
const getStatusName = (status) => {
// getStatusName 함수 제거(일원화)
switch (status) {
case 'active':
return '활성';
+8 -2
View File
@@ -41,7 +41,7 @@
</Column>
<Column field="status" header="상태" sortable style="width: 10%">
<template #body="slotProps">
<Badge :value="getStatusName(slotProps.data.status)" :severity="getStatusSeverity(slotProps.data.status)" />
<Badge :value="getStatusLabel(slotProps.data.status)" :severity="getStatusSeverity(slotProps.data.status)" />
</template>
<template #filter="{ filterModel, filterCallback }">
<Select v-model="filterModel.value" @change="filterCallback()" :options="statusOptions" optionLabel="name" optionValue="value" placeholder="상태 선택" class="p-column-filter" />
@@ -123,6 +123,7 @@
</template>
<script setup>
import { getStatusLabel } from '@/utils/enumMappings';
import { ref, onMounted, reactive, computed } from 'vue';
import { useToast } from 'primevue/usetoast';
import adminService from '@/services/adminService';
@@ -155,6 +156,11 @@ const roleOptions = [
// 상태 옵션
const statusOptions = [
{ name: getStatusLabel('active'), value: 'active' },
{ name: getStatusLabel('inactive'), value: 'inactive' },
{ name: getStatusLabel('pending'), value: 'pending' },
{ name: getStatusLabel('suspended'), value: 'suspended' }
];
{ name: '활성', value: 'active' },
{ name: '비활성', value: 'inactive' },
{ name: '정지', value: 'suspended' }
@@ -296,7 +302,7 @@ const getRoleSeverity = (role) => {
};
// 상태 이름 가져오기
const getStatusName = (status) => {
// getStatusName 함수 제거(일원화)
switch (status) {
case 'active':
return '활성';