diff --git a/Program.cs b/Program.cs index 5ad3930..8608b7e 100644 --- a/Program.cs +++ b/Program.cs @@ -38,6 +38,7 @@ builder.Services.AddScoped(); // builder.Services.AddRazorPages(); // builder.Services.AddServerSideBlazor(); builder.Services.AddScoped(); +builder.Services.AddScoped(); await builder.Build().RunAsync(); diff --git a/Program/Layout/MainLayout.razor b/Program/Layout/MainLayout.razor index d784598..d99eecd 100644 --- a/Program/Layout/MainLayout.razor +++ b/Program/Layout/MainLayout.razor @@ -1,30 +1,39 @@ -@inherits LayoutComponentBase +@inherits LayoutComponentBase @implements IDisposable
@* *@ - - @if (!isHidePrjTop) + + @if(isAcademy) { - +
+ + +
+
+ +
+
+ @Body +
+
+
} - - -
- - @* *@ - @* *@ - + else + { + @if (!isHidePrjTop) + { + + } - @*
*@
@Body
-
+ } diff --git a/Program/Layout/MainLayout.razor.cs b/Program/Layout/MainLayout.razor.cs index cdfeb2a..bc7af06 100644 --- a/Program/Layout/MainLayout.razor.cs +++ b/Program/Layout/MainLayout.razor.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using Front.Program.Views.Project; +using Front.Program.Views.Academy; using Front.Program.Services; namespace Front.Program.Layout; @@ -22,6 +23,7 @@ public partial class MainLayout : LayoutComponentBase, IDisposable // 경로의 끝 부분 protected bool isHidePrjTop => Navigation.ToBaseRelativePath(Navigation.Uri).EndsWith("auth", StringComparison.OrdinalIgnoreCase); + protected bool isAcademy => Navigation.ToBaseRelativePath(Navigation.Uri).StartsWith("am", StringComparison.OrdinalIgnoreCase); protected override void OnInitialized() { diff --git a/Program/Services/UserService.cs b/Program/Services/UserService.cs new file mode 100644 index 0000000..29595fc --- /dev/null +++ b/Program/Services/UserService.cs @@ -0,0 +1,133 @@ +using System.Text.Json; +using Microsoft.JSInterop; + +namespace Front.Program.Services; + +public class UserService +{ + private readonly StorageService _storageService; + private readonly SecureService _secureService; + private readonly IJSRuntime _js; + private readonly ILogger _logger; + + public UserService( + StorageService storageService, + SecureService secureService, + IJSRuntime js, + ILogger logger) + { + _storageService = storageService; + _secureService = secureService; + _js = js; + _logger = logger; + } + + public class UserData + { + public string Uid { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public DateTime? Birth { get; set; } + public string Type { get; set; } = string.Empty; + public string? DeviceId { get; set; } + public bool AutoLoginYn { get; set; } + public DateTime LoginDate { get; set; } + public string? PushToken { get; set; } + } + + public async Task<(bool success, UserData? userData)> GetUserData() + { + try + { + // 1. 먼저 저장된 데이터 확인 + var encryptedUserData = await _storageService.GetItemAsync("USER_DATA"); + if (!string.IsNullOrEmpty(encryptedUserData)) + { + try + { + var decryptedUserData = await _secureService.DecryptAsync(encryptedUserData); + var userData = JsonSerializer.Deserialize(decryptedUserData); + if (userData != null && !string.IsNullOrEmpty(userData.Name)) + { + _logger.LogInformation("저장된 사용자 데이터 로드 성공"); + return (true, userData); + } + } + catch (Exception ex) + { + _logger.LogWarning($"저장된 사용자 데이터 복호화 실패: {ex.Message}"); + await _storageService.RemoveItemAsync("USER_DATA"); + } + } + + // 2. API 호출 + var headerValue = await _storageService.GetItemAsync("Web_AM_Connect_Key"); + if (string.IsNullOrEmpty(headerValue)) + { + _logger.LogWarning("연결 키가 없습니다"); + return (false, null); + } + + _logger.LogInformation("세션 API 호출 시작"); + var response = await _js.InvokeAsync("fetchWithHeaderAndReturnUrl", + "/api/v1/in/user/auth/session", + "GET", + "Web_AM_Connect_Key", + headerValue); + + if (response.TryGetProperty("data", out var dataElement)) + { + try + { + // 전체 데이터 암호화 저장 + var userDataJson = dataElement.ToString(); + var userData = JsonSerializer.Deserialize(userDataJson); + + if (userData != null && !string.IsNullOrEmpty(userData.Name)) + { + var encryptedData = await _secureService.EncryptAsync(userDataJson); + await _storageService.SetItemAsync("USER_DATA", encryptedData); + await _storageService.SetItemAsync("Web_AM_Connect_Key", headerValue); + + _logger.LogInformation($"사용자 데이터 저장 성공: {userData.Name}"); + return (true, userData); + } + else + { + _logger.LogWarning("사용자 데이터에 필수 정보가 없습니다"); + return (false, null); + } + } + catch (Exception ex) + { + _logger.LogError($"사용자 데이터 처리 중 오류: {ex.Message}"); + return (false, null); + } + } + + _logger.LogWarning("사용자 데이터를 찾을 수 없습니다"); + return (false, null); + } + catch (Exception ex) + { + _logger.LogError($"사용자 데이터 조회 중 오류: {ex.Message}"); + return (false, null); + } + } + + public async Task ClearUserData() + { + try + { + await _storageService.RemoveItemAsync("USER_DATA"); + await _storageService.RemoveItemAsync("USER"); + await _storageService.RemoveItemAsync("Web_AM_Connect_Key"); + _logger.LogInformation("사용자 데이터 삭제 성공"); + return true; + } + catch (Exception ex) + { + _logger.LogError($"사용자 데이터 삭제 중 오류: {ex.Message}"); + return false; + } + } +} \ No newline at end of file diff --git a/Program/Views/Academy/AcademyIntro.razor b/Program/Views/Academy/AcademyIntro.razor new file mode 100644 index 0000000..1a0ef2b --- /dev/null +++ b/Program/Views/Academy/AcademyIntro.razor @@ -0,0 +1,30 @@ +@page "/am/intro" + +
+
+
+
+
+
+
+
+
+
+

학원을 위한 통합 플랫폼

+
+ +
+
+

Terms of Service · Privacy Policy · Contact Us

+

© 2024 AcaMate. All rights reserved.

+
+
+
+
diff --git a/Program/Views/Academy/AcademyIntro.razor.cs b/Program/Views/Academy/AcademyIntro.razor.cs new file mode 100644 index 0000000..d123ded --- /dev/null +++ b/Program/Views/Academy/AcademyIntro.razor.cs @@ -0,0 +1,7 @@ +using Microsoft.AspNetCore.Components; + +namespace Front.Program.Views.Academy; + +public partial class AcademyIntro : ComponentBase +{ +} \ No newline at end of file diff --git a/Program/Views/Academy/LeftSideAcademy.razor b/Program/Views/Academy/LeftSideAcademy.razor new file mode 100644 index 0000000..30f4a05 --- /dev/null +++ b/Program/Views/Academy/LeftSideAcademy.razor @@ -0,0 +1,70 @@ +
+
+
+ 프로필 +
+
+ +
AcaMate
+ +

Parent

+
+
+
+ + + \ No newline at end of file diff --git a/Program/Views/Academy/LeftSideAcademy.razor.cs b/Program/Views/Academy/LeftSideAcademy.razor.cs new file mode 100644 index 0000000..c8b78ca --- /dev/null +++ b/Program/Views/Academy/LeftSideAcademy.razor.cs @@ -0,0 +1,7 @@ +using Microsoft.AspNetCore.Components; + +namespace Front.Program.Views.Academy; + +public partial class LeftSideAcademy : ComponentBase +{ +} \ No newline at end of file diff --git a/Program/Views/Academy/TopNavAcademy.razor b/Program/Views/Academy/TopNavAcademy.razor new file mode 100644 index 0000000..75ea618 --- /dev/null +++ b/Program/Views/Academy/TopNavAcademy.razor @@ -0,0 +1,18 @@ +
+
+
+ Icon +
+ +
+ + +
\ No newline at end of file diff --git a/Program/Views/Academy/TopNavAcademy.razor.cs b/Program/Views/Academy/TopNavAcademy.razor.cs new file mode 100644 index 0000000..3379259 --- /dev/null +++ b/Program/Views/Academy/TopNavAcademy.razor.cs @@ -0,0 +1,6 @@ +using Microsoft.AspNetCore.Components; + +namespace Front.Program.Views.Academy; + +public partial class TopNavAcademy : ComponentBase +{} \ No newline at end of file diff --git a/Program/Views/Project/About.razor b/Program/Views/Project/About.razor index 253bb73..be214b3 100644 --- a/Program/Views/Project/About.razor +++ b/Program/Views/Project/About.razor @@ -167,8 +167,8 @@
- -
+ +
@@ -179,6 +179,19 @@

© 2024 AcaMate. All rights reserved.

-
+ + + @* *@ diff --git a/Program/Views/Project/Auth.razor b/Program/Views/Project/Auth.razor index 64926a8..253f87f 100644 --- a/Program/Views/Project/Auth.razor +++ b/Program/Views/Project/Auth.razor @@ -1,5 +1,5 @@ @page "/auth" -@page "/academy/auth" +@page "/am/auth"

로그인

diff --git a/Program/Views/Project/PageIndicator.razor b/Program/Views/Project/PageIndicator.razor index 0ba87a6..66a6365 100644 --- a/Program/Views/Project/PageIndicator.razor +++ b/Program/Views/Project/PageIndicator.razor @@ -1,5 +1,3 @@ -

PageIndicator

- @if (Type == IndicateType.Page) {
diff --git a/Program/Views/Project/RedirectPage.razor.cs b/Program/Views/Project/RedirectPage.razor.cs index 05c2e91..94f9f91 100644 --- a/Program/Views/Project/RedirectPage.razor.cs +++ b/Program/Views/Project/RedirectPage.razor.cs @@ -9,6 +9,6 @@ public partial class RedirectPage : ComponentBase protected override void OnInitialized() { - NavigationManager.NavigateTo("/about",true); + NavigationManager.NavigateTo("/am/intro",true); } } \ No newline at end of file diff --git a/Program/Views/Project/TopProjectNav.razor.cs b/Program/Views/Project/TopProjectNav.razor.cs index 00bf7bf..7257127 100644 --- a/Program/Views/Project/TopProjectNav.razor.cs +++ b/Program/Views/Project/TopProjectNav.razor.cs @@ -10,8 +10,7 @@ namespace Front.Program.Views.Project; public partial class TopProjectNav : ComponentBase { [Inject] NavigationManager NavigationManager { get; set; } = default!; - [Inject] StorageService StorageService { get; set; } = default!; - [Inject] SecureService SecureService { get; set; } = default!; + [Inject] UserService UserService { get; set; } = default!; [Inject] IJSRuntime JS { get; set; } = default!; @@ -23,110 +22,123 @@ public partial class TopProjectNav : ComponentBase protected override async Task OnInitializedAsync() { - Console.WriteLine("TopNAV 확인"); - isLogin = bool.TryParse(await StorageService.GetItemAsync("IsLogin"), out var result) && result; - // if (!isLogin && !string.IsNullOrEmpty(UserName)) return; - if (!isLogin) return; // && !string.IsNullOrEmpty(UserName)) return; + var (success, userData) = await UserService.GetUserData(); + if (success && userData != null) + { + Console.WriteLine(userData.Name); + UserName = userData.Name; + isLogin = true; + } + // isLogin = bool.TryParse(await StorageService.GetItemAsync("IsLogin"), out var result) && result; + // // if (!isLogin && !string.IsNullOrEmpty(UserName)) return; + // if (!isLogin) return; // && !string.IsNullOrEmpty(UserName)) return; - try - { - var encryptedName = await StorageService.GetItemAsync("USER"); - Console.WriteLine($"{encryptedName}"); - if (!string.IsNullOrEmpty(encryptedName)) - { - try - { - UserName = await SecureService.DecryptAsync(encryptedName); - Console.WriteLine($"세션 스토리지에서 가져온 사용자 이름: '{UserName}'"); + // try + // { + // var encryptedName = await StorageService.GetItemAsync("USER"); + // Console.WriteLine($"{encryptedName}"); + // if (!string.IsNullOrEmpty(encryptedName)) + // { + // try + // { + // UserName = await SecureService.DecryptAsync(encryptedName); + // Console.WriteLine($"세션 스토리지에서 가져온 사용자 이름: '{UserName}'"); - return; - } - catch (Exception ex) - { - Console.WriteLine($"이름 복호화 중 오류 발생: {ex.Message}"); - await StorageService.RemoveItemAsync("USER"); - } - } + // return; + // } + // catch (Exception ex) + // { + // Console.WriteLine($"이름 복호화 중 오류 발생: {ex.Message}"); + // await StorageService.RemoveItemAsync("USER"); + // } + // } - // apiSender.js의 함수를 사용하여 연결 키 가져오기 - var headerValue = await StorageService.GetItemAsync("Web_AM_Connect_Key"); - Console.WriteLine($"세션 스토리지에서 가져온 헤더 값: '{headerValue}'"); + // // apiSender.js의 함수를 사용하여 연결 키 가져오기 + // var headerValue = await StorageService.GetItemAsync("Web_AM_Connect_Key"); + // Console.WriteLine($"세션 스토리지에서 가져온 헤더 값: '{headerValue}'"); - if (string.IsNullOrEmpty(headerValue)) - { - Console.WriteLine("연결 키가 없습니다"); - return; - } + // if (string.IsNullOrEmpty(headerValue)) + // { + // Console.WriteLine("연결 키가 없습니다"); + // return; + // } - // apiSender.js의 함수를 사용하여 API 호출 - Console.WriteLine("세션 API 호출 시작"); - var response = await JS.InvokeAsync("fetchWithHeaderAndReturnUrl", - "/api/v1/in/user/auth/session", - "GET", - "Web_AM_Connect_Key", - headerValue); + // // apiSender.js의 함수를 사용하여 API 호출 + // Console.WriteLine("세션 API 호출 시작"); + // var response = await JS.InvokeAsync("fetchWithHeaderAndReturnUrl", + // "/api/v1/in/user/auth/session", + // "GET", + // "Web_AM_Connect_Key", + // headerValue); - Console.WriteLine($"세션 API 응답 타입: {response.ValueKind}"); - Console.WriteLine($"세션 API 응답 내용: {response}"); + // Console.WriteLine($"세션 API 응답 타입: {response.ValueKind}"); + // Console.WriteLine($"세션 API 응답 내용: {response}"); - if (response.ValueKind == JsonValueKind.Null || response.ValueKind == JsonValueKind.Undefined) - { - Console.WriteLine("응답이 null이거나 undefined입니다"); - return; - } + // if (response.ValueKind == JsonValueKind.Null || response.ValueKind == JsonValueKind.Undefined) + // { + // Console.WriteLine("응답이 null이거나 undefined입니다"); + // return; + // } - try - { - if (response.TryGetProperty("status", out var statusElement)) - { - Console.WriteLine($"status 요소 타입: {statusElement.ValueKind}"); - if (statusElement.TryGetProperty("code", out var codeElement)) - { - var code = codeElement.GetString(); - Console.WriteLine($"응답 코드: {code}"); + // try + // { + // if (response.TryGetProperty("status", out var statusElement)) + // { + // Console.WriteLine($"status 요소 타입: {statusElement.ValueKind}"); + // if (statusElement.TryGetProperty("code", out var codeElement)) + // { + // var code = codeElement.GetString(); + // Console.WriteLine($"응답 코드: {code}"); - if (code == "000") - { - if (response.TryGetProperty("data", out var dataElement)) - { - Console.WriteLine($"data 요소 타입: {dataElement.ValueKind}"); - if (dataElement.TryGetProperty("name", out var nameElement)) - { - UserName = nameElement.GetString() ?? "이름 없음"; - isLogin = true; - Console.WriteLine($"NM: {UserName}"); - var encryptedUserName = await SecureService.EncryptAsync(UserName); - Console.WriteLine($"NM: {encryptedUserName}"); - await StorageService.SetItemAsync("USER", encryptedUserName); - await StorageService.SetItemAsync("Web_AM_Connect_Key", headerValue); - Console.WriteLine($"로그인된 사용자: {UserName}"); - return; - } - } - } - else { - if (isLogin) { - isLogin = false; - await StorageService.SetItemAsync("IsLogin","false"); - } - - - } - } - } - Console.WriteLine("로그인되지 않은 상태"); - } - catch (Exception ex) - { - Console.WriteLine($"응답 처리 중 오류 발생: {ex.Message}"); - Console.WriteLine($"응답 처리 스택 트레이스: {ex.StackTrace}"); - } - } - catch (Exception ex) - { - Console.WriteLine($"세션 확인 중 오류 발생: {ex.Message}"); - Console.WriteLine($"스택 트레이스: {ex.StackTrace}"); - } + // if (code == "000") + // { + // if (response.TryGetProperty("data", out var dataElement)) + // { + // Console.WriteLine($"data 요소 타입: {dataElement.ValueKind}"); + + // // 전체 data를 JSON 문자열로 변환 + // var userDataJson = dataElement.ToString(); + + // // 전체 데이터 암호화 + // var encryptedUserData = await SecureService.EncryptAsync(userDataJson); + // await StorageService.SetItemAsync("USER_DATA", encryptedUserData); + + // // 기존 name 처리 로직 + // if (dataElement.TryGetProperty("name", out var nameElement)) + // { + // UserName = nameElement.GetString() ?? "이름 없음"; + // isLogin = true; + // Console.WriteLine($"NM: {UserName}"); + // var encryptedUserName = await SecureService.EncryptAsync(UserName); + // Console.WriteLine($"NM: {encryptedUserName}"); + // await StorageService.SetItemAsync("USER", encryptedUserName); + // await StorageService.SetItemAsync("Web_AM_Connect_Key", headerValue); + // Console.WriteLine($"로그인된 사용자: {UserName}"); + // return; + // } + // } + // } + // else { + // if (isLogin) { + // isLogin = false; + // await StorageService.SetItemAsync("IsLogin","false"); + // } + // } + // } + // } + // Console.WriteLine("로그인되지 않은 상태"); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"응답 처리 중 오류 발생: {ex.Message}"); + // Console.WriteLine($"응답 처리 스택 트레이스: {ex.StackTrace}"); + // } + // } + // catch (Exception ex) + // { + // Console.WriteLine($"세션 확인 중 오류 발생: {ex.Message}"); + // Console.WriteLine($"스택 트레이스: {ex.StackTrace}"); + // } } public void OnClickMenuDown() @@ -145,19 +157,13 @@ public partial class TopProjectNav : ComponentBase if (isOpen) isOpen = !isOpen; NavigationManager.NavigateTo("/auth"); } + public async Task OnClickLogout() { - // var isRemoved = await StorageService.RemoveItemAsync("USER"); - if (await StorageService.RemoveItemAsync("IsLogin")) { - isLogin = false; - if (await StorageService.RemoveItemAsync("USER")) { - UserName = null; - Console.WriteLine("LOGOUT"); - } - } - else + if (await UserService.ClearUserData()) { - Console.WriteLine("로그아웃 처리 중 오류가 발생했습니다."); + isLogin = false; + UserName = null; } } } \ No newline at end of file diff --git a/_Imports.razor b/_Imports.razor index 90b8058..bf9db61 100644 --- a/_Imports.razor +++ b/_Imports.razor @@ -10,6 +10,6 @@ @using Front.Program.Layout @using Front.Program.Views.Project -@* @using Front.Program.Views.Academy *@ +@using Front.Program.Views.Academy