diff --git a/Program/Layout/MainLayout.razor b/Program/Layout/MainLayout.razor index 03b549c..fe3336f 100644 --- a/Program/Layout/MainLayout.razor +++ b/Program/Layout/MainLayout.razor @@ -2,10 +2,8 @@ @implements IDisposable
- @* *@ - @if(isAcademy) {
@@ -52,7 +50,7 @@ @if (LoadingService.IsLoading) { -
+
diff --git a/Program/Layout/MainLayout.razor.cs b/Program/Layout/MainLayout.razor.cs index 56b053c..25dc258 100644 --- a/Program/Layout/MainLayout.razor.cs +++ b/Program/Layout/MainLayout.razor.cs @@ -16,12 +16,14 @@ public partial class MainLayout : LayoutComponentBase, IDisposable // 경로의 시작 부분 // protected bool isHidePrjTop => Navigation.ToBaseRelativePath(Navigation.Uri).StartsWith("auth", StringComparison.OrdinalIgnoreCase); + protected bool isIntro => Navigation.ToBaseRelativePath(Navigation.Uri).StartsWith("am/intro", StringComparison.OrdinalIgnoreCase); // 경로의 끝 부분 protected bool isHidePrjTop => Navigation.ToBaseRelativePath(Navigation.Uri).EndsWith("auth", StringComparison.OrdinalIgnoreCase); protected bool isAcademy => Navigation.ToBaseRelativePath(Navigation.Uri).StartsWith("am", StringComparison.OrdinalIgnoreCase); // 경로 일치 - protected bool isIntro => Navigation.ToBaseRelativePath(Navigation.Uri).Equals("am/intro", StringComparison.OrdinalIgnoreCase); + // protected bool isIntro => Navigation.ToBaseRelativePath(Navigation.Uri).Equals("am/intro", StringComparison.OrdinalIgnoreCase); + protected override void OnInitialized() { diff --git a/Program/Models/AcademyModels.cs b/Program/Models/AcademyModels.cs index 3623fa1..5abc65e 100644 --- a/Program/Models/AcademyModels.cs +++ b/Program/Models/AcademyModels.cs @@ -18,5 +18,5 @@ public class Academy public class SimpleAcademy { public required string bid { get; set; } - public string business_name { get; set; } = string.Empty; + public string name { get; set; } } \ No newline at end of file diff --git a/Program/Services/APIService.cs b/Program/Services/APIService.cs index 2c11090..f177fe8 100644 --- a/Program/Services/APIService.cs +++ b/Program/Services/APIService.cs @@ -1,19 +1,18 @@ using System.Net.Http.Json; +using System.Text.Encodings.Web; +using System.Text.Json; using Front.Program.Models; +using Microsoft.JSInterop; namespace Front.Program.Services; -public class APIService +public class APIService(HttpClient http, + StorageService storageService, + SecureService secureService, + IJSRuntime js) { - private readonly HttpClient _http; - - public APIService(HttpClient http) - { - _http = http; - } - private string ChangeToString(T data) { if (data == null) return string.Empty; @@ -25,9 +24,60 @@ public class APIService public async Task?> GetJsonAsync(string url, TRequest value) { string parameter = ChangeToString(value); - var response = await _http.GetFromJsonAsync>($"{url}?{parameter}"); + var response = await http.GetFromJsonAsync>($"{url}?{parameter}"); return response; } + + public async Task<(bool success,T? data)> GetConnectServerAsnyc(string url) { + var headerValue = await storageService.GetItemAsync("Web-AM-Connect-Key"); + if (string.IsNullOrEmpty(headerValue)) return (false, default); + + var args = new { + url = $"{url}", + method = "GET", + headerKey = "Web-AM-Connect-Key", + headerValue = headerValue, + token = "VO00" + }; + + var response = await js.InvokeAsync( + "fetchWithHeaderAndReturnUrl", + args + ); + + Console.WriteLine($"JSON 응답: {response.ToString()}"); + + if (response.TryGetProperty("data", out var dataElement)) + { + try + { + // 전체 데이터 암호화 저장 + var dataJson = dataElement.ToString(); + var serialData = JsonSerializer.Deserialize(dataJson, + new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + Console.WriteLine("[GetConnectServerAsnyc] 사용자 데이터 Json: " + dataJson); + Console.WriteLine("[GetConnectServerAsnyc] 사용자 데이터 변환: " + serialData.ToString());; + + if (serialData != null) + { + var encryptedData = await secureService.EncryptAsync(dataJson); + await storageService.SetItemAsync("USER_DATA", encryptedData); + return (true, serialData); + } + else + { + Console.WriteLine("사용자 데이터에 필수 정보가 없습니다"); + } + } + catch (Exception ex) + { + Console.WriteLine($"사용자 데이터 처리 중 오류: {ex.Message}"); + } + } + + Console.WriteLine("데이터를 찾을 수 없습니다"); + return (false, default); + } } diff --git a/Program/Services/LoadingService.cs b/Program/Services/LoadingService.cs index 07e8a2c..db976d6 100644 --- a/Program/Services/LoadingService.cs +++ b/Program/Services/LoadingService.cs @@ -2,12 +2,14 @@ using Front.Program.Models; using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; namespace Front.Program.Services; // 뷰를 참조 안하고도 로딩 상태를 알 수 있게 바꾸기 public class LoadingService { + private readonly IJSRuntime _jsRuntime; public bool IsLoading { get; private set; } private bool isNavigationLoading { get; set; } @@ -40,4 +42,29 @@ public class LoadingService } private void NotifyStateChanged() => OnChange?.Invoke(); + + + public LoadingService(IJSRuntime jsRuntime) + { + _jsRuntime = jsRuntime; + } + + public async Task ShowLoadingAsync(bool isNavigation = false) + { + IsLoading = true; + isNavigationLoading = isNavigation; + NotifyStateChanged(); + await _jsRuntime.InvokeVoidAsync("setBodyOverflowHidden", true); + } + + public async Task HideLoadingAsync() + { + if (!isNavigationLoading) + { + IsLoading = false; + NotifyStateChanged(); + await _jsRuntime.InvokeVoidAsync("setBodyOverflowHidden", false); + } + } + } \ No newline at end of file diff --git a/Program/Services/UserStateService.cs b/Program/Services/UserStateService.cs index c9051c4..2fc8fdb 100644 --- a/Program/Services/UserStateService.cs +++ b/Program/Services/UserStateService.cs @@ -5,12 +5,14 @@ using Microsoft.JSInterop; namespace Front.Program.ViewModels; -public class UserStateService(StorageService _storageService,SecureService _secureService, IJSRuntime _js) +public class UserStateService(StorageService _storageService,SecureService _secureService, APIService _APIService, + IJSRuntime _js) { public UserData UserData { get; set; } = new UserData(); public bool isFirstCheck { get; set; } = false; public bool isLogin { get; set; } = false; + public Models.SimpleAcademy[] academyItems = Array.Empty(); public async Task<(bool success, UserData? userData)> GetUserDataFromStorageAsync() @@ -46,59 +48,7 @@ public class UserStateService(StorageService _storageService,SecureService _secu public async Task<(bool success, UserData? userData)> GetUserDataFromServerAsync() { - - var headerValue = await _storageService.GetItemAsync("Web-AM-Connect-Key"); - if (string.IsNullOrEmpty(headerValue)) return (false, null); - - var args = new { - url = "/api/v1/in/user", - method = "GET", - headerKey = "Web-AM-Connect-Key", - headerValue = headerValue, - token = "VO00" - }; - - var response = await _js.InvokeAsync( - "fetchWithHeaderAndReturnUrl", - args - ); - - // var response = await _js.InvokeAsync("fetchWithHeaderAndReturnUrl", - // "/api/v1/in/user/", - // "GET", - // "Web_AM_Connect_Key", - // headerValue); - - Console.WriteLine($"JSON 응답: {response.ToString()}"); - - if (response.TryGetProperty("data", out var dataElement)) - { - try - { - // 전체 데이터 암호화 저장 - var userDataJson = dataElement.ToString(); - var userData = JsonSerializer.Deserialize(userDataJson, - new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); - - if (userData != null && !string.IsNullOrEmpty(userData.Name)) - { - var encryptedData = await _secureService.EncryptAsync(userDataJson); - await _storageService.SetItemAsync("USER_DATA", encryptedData); - return (true, userData); - } - else - { - Console.WriteLine("사용자 데이터에 필수 정보가 없습니다"); - } - } - catch (Exception ex) - { - Console.WriteLine($"사용자 데이터 처리 중 오류: {ex.Message}"); - } - } - - Console.WriteLine("사용자 데이터를 찾을 수 없습니다"); - return (false, null); + return await _APIService.GetConnectServerAsnyc("/api/v1/in/user"); } public async Task GetUserDataAsync() @@ -163,5 +113,38 @@ public class UserStateService(StorageService _storageService,SecureService _secu // return false; } } - -} \ No newline at end of file + + public async Task<(bool success, List? simpleAcademy)> GetAcademy() + { + return await _APIService.GetConnectServerAsnyc>("/api/v1/in/user/academy"); + } + // + // var headerValue = await _storageService.GetItemAsync("Web-AM-Connect-Key"); + // if (string.IsNullOrEmpty(headerValue)) return (false, null); + // + // var args = new { + // url = "/api/v1/in/user/academy", + // method = "GET", + // headerKey = "Web-AM-Connect-Key", + // headerValue = headerValue, + // token = "VO00" + // }; + // + // var response = await _js.InvokeAsync( + // "fetchWithHeaderAndReturnUrl", + // args + // ); + // + // Console.WriteLine($"JSON 응답: {response.ToString()}"); + // + // if (response.TryGetProperty("data", out var dataElement)) + // { + // try + // { + // // 전체 데이터 암호화 저장 + // var userDataJson = dataElement.ToString(); + // var userData = JsonSerializer.Deserialize(userDataJson, + // new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + // } + // } + } \ No newline at end of file diff --git a/Program/Views/Academy/AcademyIntro.razor b/Program/Views/Academy/AcademyIntro.razor index b52829e..e0a9321 100644 --- a/Program/Views/Academy/AcademyIntro.razor +++ b/Program/Views/Academy/AcademyIntro.razor @@ -7,7 +7,7 @@
+ style="background-image: url('Resources/Images/Logo/Crystal_Icon.png');">
@@ -33,12 +33,12 @@ 학원을 선택해주세요.
- @foreach (var academy in academyItems) + @foreach (var academy in UserStateService.academyItems) { -
- @academy.business_name + @academy.name diff --git a/Program/Views/Academy/AcademyIntro.razor.cs b/Program/Views/Academy/AcademyIntro.razor.cs index 3f99336..69e8390 100644 --- a/Program/Views/Academy/AcademyIntro.razor.cs +++ b/Program/Views/Academy/AcademyIntro.razor.cs @@ -12,31 +12,61 @@ public partial class AcademyIntro : ComponentBase, IDisposable [Inject] StorageService StorageService { get; set; } = default!; [Inject] QueryParamService QueryParamService { get; set; } = default!; [Inject] UserStateService UserStateService { get; set; } = default!; - + [Inject] LoadingService LoadingService { get; set; } = default!; + private bool _isProcessing = false; - protected Models.SimpleAcademy[] academyItems = Array.Empty(); + protected override async void OnInitialized() { - Navigation.LocationChanged += HandleLocationChanged; - HandleLocationChanged(this, new LocationChangedEventArgs(Navigation.Uri, false)); - if (!UserStateService.isFirstCheck) await UserStateService.GetUserDataAsync(); - - academyItems = new[] + try { - new SimpleAcademy{ bid = "AA0000", business_name = "테스트 학원1"}, - new SimpleAcademy{ bid = "AA0001", business_name = "테스트 학원2"}, - new SimpleAcademy{ bid = "AA0002", business_name = "테스트 학원3"}, - new SimpleAcademy{ bid = "AA0003", business_name = "테스트 학원4"}, - new SimpleAcademy{ bid = "AA0004", business_name = "테스트 학원5"}, - new SimpleAcademy{ bid = "AA0005", business_name = "테스트 학원6"}, - new SimpleAcademy{ bid = "AA0006", business_name = "테스트 학원7"}, - - }; + Navigation.LocationChanged += HandleLocationChanged; + HandleLocationChanged(this, new LocationChangedEventArgs(Navigation.Uri, false)); + if (!UserStateService.isFirstCheck) + { + LoadingService.ShowLoading(); + await UserStateService.GetUserDataAsync(); + var aca = await UserStateService.GetAcademy(); + + if (aca.success) + { + if (aca.simpleAcademy.Count > 0) + { + UserStateService.academyItems = aca.simpleAcademy.ToArray(); + Console.WriteLine($"academyItems: {UserStateService.academyItems.Length}개"); + } + + Console.WriteLine("아카데미 정보가 없습니다. 로그인 상태를 확인해주세요."); + } + + Console.WriteLine($"academy: {string.Join(", ", UserStateService.academyItems.Select(a => a.name))}"); + } + } + finally + { + LoadingService.HideLoading(); + await InvokeAsync(StateHasChanged); + } + // 유저 값 가져오면서 같이 academy 정보도 가져와야지 + + + + // academyItems = new[] + // { + // new SimpleAcademy{ bid = "AA0000", business_name = "테스트 학원1"}, + // new SimpleAcademy{ bid = "AA0001", business_name = "테스트 학원2"}, + // new SimpleAcademy{ bid = "AA0002", business_name = "테스트 학원3"}, + // new SimpleAcademy{ bid = "AA0003", business_name = "테스트 학원4"}, + // new SimpleAcademy{ bid = "AA0004", business_name = "테스트 학원5"}, + // new SimpleAcademy{ bid = "AA0005", business_name = "테스트 학원6"}, + // new SimpleAcademy{ bid = "AA0006", business_name = "테스트 학원7"}, + + // }; + - await InvokeAsync(StateHasChanged); } public void Dispose() @@ -58,16 +88,30 @@ public partial class AcademyIntro : ComponentBase, IDisposable // 쿼리 파라미터가 있는 경우에만 처리 if (!string.IsNullOrEmpty(uri.Query)) { + LoadingService.ShowLoading(); var queryParam = QueryParamService.ParseQueryParam(uri); await QueryParamService.AuthCheck(queryParam, StorageService); // 유저 정보 확인하는거 (로그인 했으니 값 가져와야지) await UserStateService.GetUserDataAsync(); + var aca = await UserStateService.GetAcademy(); - // 쿼리 파라미터를 제거한 기본 URI로 리다이렉트 + if (aca.success) + { + if (aca.simpleAcademy.Count > 0) + { + UserStateService.academyItems = aca.simpleAcademy.ToArray(); + + Console.WriteLine($"academyItems: {UserStateService.academyItems.Length}개"); + } + Console.WriteLine("아카데미 정보가 없습니다. 로그인 상태를 확인해주세요."); + } + Console.WriteLine($"academy: {string.Join(", ", UserStateService.academyItems.Select(a => a.name))}"); + + // // 쿼리 파라미터를 제거한 기본 URI로 리다이렉트 var baseUri = uri.GetLeftPart(UriPartial.Path); Console.WriteLine($"리다이렉트할 URI: {baseUri}"); - await InvokeAsync(StateHasChanged); // StateHasChanged를 호출하여 UI 업데이트 + // await InvokeAsync(StateHasChanged); // StateHasChanged를 호출하여 UI 업데이트 Navigation.NavigateTo(baseUri, forceLoad: false); } } @@ -77,7 +121,13 @@ public partial class AcademyIntro : ComponentBase, IDisposable } finally { + LoadingService.HideLoading(); _isProcessing = false; + + // var baseUri = uri.GetLeftPart(UriPartial.Path); + // Console.WriteLine($"리다이렉트할 URI: {baseUri}"); + // await InvokeAsync(StateHasChanged); // StateHasChanged를 호출하여 UI 업데이트 + // Navigation.NavigateTo(baseUri, forceLoad: false); } } diff --git a/Program/Views/Academy/AcademyMain.razor b/Program/Views/Academy/AcademyMain.razor new file mode 100644 index 0000000..749e119 --- /dev/null +++ b/Program/Views/Academy/AcademyMain.razor @@ -0,0 +1,6 @@ +@page "/am/main" +

AcademyMain

+ +@code { + +} \ No newline at end of file diff --git a/Program/Views/Academy/AcademyMain.razor.cs b/Program/Views/Academy/AcademyMain.razor.cs new file mode 100644 index 0000000..79abd35 --- /dev/null +++ b/Program/Views/Academy/AcademyMain.razor.cs @@ -0,0 +1,7 @@ +using Microsoft.AspNetCore.Components; + +namespace Front.Program.Views.Academy; + +public partial class AcademyMain : ComponentBase +{ +} \ No newline at end of file diff --git a/Program/Views/Academy/TopNavAcademy.razor b/Program/Views/Academy/TopNavAcademy.razor index 0d18900..de259c5 100644 --- a/Program/Views/Academy/TopNavAcademy.razor +++ b/Program/Views/Academy/TopNavAcademy.razor @@ -18,7 +18,7 @@ @foreach (var academy in academyItems) {
- @academy.business_name + @academy.name }
@@ -26,10 +26,18 @@ }
-