2026-02-05 17:29:37 +09:00

172 lines
7.7 KiB
PHP

@extends('admin.layouts.app')
@section('title', '내 정보')
@section('page_title', '내 정보')
@section('page_desc', '프로필/연락처/보안 상태')
@section('content')
<section class="a-page">
<div class="a-grid a-grid--me">
<article class="a-card">
<div class="a-card__head">
<div>
<div class="a-card__title">기본 정보</div>
<div class="a-card__desc a-muted">이메일은 변경 불가</div>
</div>
</div>
<form method="POST" action="{{ route('admin.me.update') }}" class="a-form" onsubmit="this.querySelector('button[type=submit]').disabled=true;">
@csrf
<div class="a-field">
<label class="a-label">이메일</label>
<input class="a-input" value="{{ $me->email }}" disabled>
</div>
<div class="a-field">
<label class="a-label" for="nickname">닉네임</label>
<input
class="a-input"
id="nickname"
name="nickname"
placeholder="예: super admin"
value="{{ old('nickname', $me->nickname ?? '') }}"
>
@error('nickname')<div class="a-error">{{ $message }}</div>@enderror
</div>
<div class="a-field">
<label class="a-label" for="name">성명(본명)</label>
<input
class="a-input"
id="name"
name="name"
value="{{ old('name', $me->name ?? '') }}"
>
@error('name')<div class="a-error">{{ $message }}</div>@enderror
</div>
<div class="a-field">
<label class="a-label" for="phone">휴대폰</label>
<input class="a-input" id="phone" name="phone" placeholder="01012345678" value="{{ old('phone', $phone_plain ?? '') }}">
@error('phone')<div class="a-error">{{ $message }}</div>@enderror
</div>
<button class="a-btn a-btn--primary" type="submit" style="margin-top:12px;">
저장
</button>
</form>
</article>
<article class="a-card">
<div class="a-card__head">
<div>
<div class="a-card__title">보안</div>
<div class="a-card__desc a-muted">비밀번호 변경 2FA 상태</div>
</div>
</div>
@php
$hasSecret = !empty($me->totp_secret_enc);
$isVerified = !empty($me->totp_verified_at);
$isEnabled = (int)($me->totp_enabled ?? 0) === 1;
@endphp
<div class="a-meinfo">
<div class="a-meinfo__row">
<div class="a-meinfo__k">2FA 모드</div>
<div class="a-meinfo__v">
<span class="a-pill">{{ ($isEnabled=='1') ? 'google TOPT' : 'SMS' }}</span>
</div>
</div>
<div class="a-meinfo__row">
<div class="a-meinfo__k">TOTP</div>
<div class="a-meinfo__v">
@php
$hasSecret = !empty($me->totp_secret_enc); // 버튼 기준 (등록 플로우 진입 여부)
$isVerified = !empty($me->totp_verified_at); // 등록 완료 여부
$isModeOtp = (int)($me->totp_enabled ?? 0) === 1; // 현재 로그인 인증 방식 표시용(조건 X)
@endphp
{{-- 1) 등록 상태 표시 (등록/미등록/진행중) --}}
@if($hasSecret && $isVerified)
<span class="a-pill a-pill--ok">TOTP 등록됨</span>
<span class="a-muted" style="margin-left:8px; font-size:12px;">
<BR>({{ $me->totp_verified_at }})
</span>
@elseif($hasSecret && !$isVerified)
<span class="a-pill a-pill--warn">등록 진행중</span>
<span class="a-muted" style="margin-left:8px; font-size:12px;">
(인증코드 확인 필요)
</span>
@else
<span class="a-pill a-pill--muted">미등록</span>
@endif
</div>
</div>
<div class="a-meinfo__row">
<div class="a-meinfo__k"> 역할</div>
<div class="a-meinfo__v">
<div class="a-chips">
@forelse(($roles ?? []) as $r)
<span class="a-chip">
{{ $r['name'] }}
<span class="a-chip__sub">{{ $r['code'] }}</span>
</span>
@empty
<span class="a-muted">부여된 역할이 없습니다.</span>
@endforelse
</div>
</div>
</div>
<div class="a-meinfo__row">
<div class="a-meinfo__k"> 권한</div>
<div class="a-meinfo__v">
<div class="a-chips">
@forelse(($perms ?? []) as $p)
<span class="a-chip">{{ $p['code'] }}</span>
@empty
<span class="a-muted">권한 정보가 없습니다.</span>
@endforelse
</div>
</div>
</div>
<div class="a-meinfo__row">
<div class="a-meinfo__k">최근 로그인</div>
<div class="a-meinfo__v">
{{ $me->last_login_at ? $me->last_login_at : '-' }}
</div>
</div>
</div>
<a class="a-btn a-btn--highlight" href="{{ route('admin.me.password.form') }}" style="margin-top:12px;">
비밀번호 변경
</a>
<div class="a-muted" style="font-size:12px; margin-top:10px;">
<div style="margin-top:10px;">
@if(!$hasSecret)
<a class="a-btn a-btn--primary a-btn--sm" style="width:auto;"
href="{{ route('admin.security') }}">
Google OTP 등록
</a>
@else
<a class="a-btn a-btn--ghost a-btn--sm" style="width:auto;"
href="{{ route('admin.security') }}">
2FA 인증방법 변경 / Google OTP 관리
</a>
@endif
</div>
</div>
</article>
</div>
</section>
@endsection