[] Todo_List 페이지 생성

This commit is contained in:
김선규 2024-10-04 17:25:36 +09:00
parent e554ba22b3
commit 4781a17b00
38 changed files with 3251 additions and 60 deletions

View File

@ -0,0 +1,3 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATask_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F35f3a54f5acb408a3e219b2de039f1a39557b7e4515f11238cba07b60c0ce_003FTask_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6780d13016c376c4491c5618b257d84da7eacf747ed2719783e775546b79b_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@ -10,4 +10,8 @@
<Folder Include="ㅎNETCORE 학습\.NET\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/WebPathMapping/IgnoredPaths/=WWWROOT_005CBLAZORAPP_002ESTYLES_002ECSS/@EntryIndexedValue">wwwroot\BlazorApp.styles.css</s:String>
<s:String x:Key="/Default/CodeInspection/WebPathMapping/MappedPaths/=WWWROOT_005C_005FFRAMEWORK/@EntryIndexedValue"></s:String>
<s:String x:Key="/Default/CodeInspection/WebPathMapping/PathsInCorrectCasing/=WWWROOT_005CBLAZORAPP_002ESTYLES_002ECSS/@EntryIndexedValue">wwwroot\BlazorApp.styles.css</s:String>
<s:String x:Key="/Default/CodeInspection/WebPathMapping/PathsInCorrectCasing/=WWWROOT_005C_005FFRAMEWORK/@EntryIndexedValue">wwwroot\_framework</s:String></wpf:ResourceDictionary>

View File

@ -1,34 +0,0 @@
@page "/Todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<ul>
@foreach (var todo in todos)
{
<li>
<input type="checkbox" @bind="todo.IsDone"/>
@todo.Title
</li>
}
</ul>
<input placeholder="Something TODO" @bind="newTodo"/>
<button @onclick = "AddTodo">Add Todo</button>
@code {
private List<TodoItem> todos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
}
}
}

View File

@ -0,0 +1,120 @@
@page "/todo"
@rendermode InteractiveServer
<PageTitle>Todo</PageTitle>
<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>
<div style="display: flex; width: 100%;">
<input placeholder="Something TODO" @bind="newTodo" style="flex: 1; box-sizing: content-box;"/>
<button @onclick="AddTodo" style="margin-left: 10px; border-radius: 4px">ADD</button>
</div>
<hr>
<h2>Todo List</h2>
@if (todos.Count <= 0)
{
<p>비어있습니다.</p>
}
<ul style="padding-left: 0;">
@foreach (var todo in todos.Select((item, index) => new { item, index }))
{
<li style="list-style: none; margin-top: 5px; margin-bottom: 5px; position: relative;">
<div class= "list-item" @onclick="() => ToggleTodo(todo.item, todo.index)" style="cursor: pointer;">
<input type="checkbox" @bind="todo.item.IsDone" />
<div class="text-content">
<div class="small-text">
@if (todo.item.IsDone)
{
<del>
<span>생성일: @todo.item.InputDate</span>
</del>
}
else
{
<span>생성일: @todo.item.InputDate</span>
}
</div>
<div class="normal-text">
@if (todo.item.IsDone)
{
<del>
@todo.item.Title
</del>
}
else
{
@todo.item.Title
}
</div>
<div class="small-text">
@if (todo.item.IsDone)
{
<span>마감일: @todo.item.SuccessDate</span>
}
</div>
</div>
</div>
<button class="small-button" @onclick = "() => RemoveList(todo.item, todo.index)" style="position: absolute; right: 4px; bottom: 4px;">
🗑️
</button>
</li>
}
</ul>
@if(doneTodos.Count > 0)
{
<hr>
<h2>Done List</h2>
}
<ul style="padding-left: 0;">
@foreach (var todo in doneTodos.Select((item, index) => new { item, index }))
{
<li style="list-style: none; margin-top: 5px; margin-bottom: 5px; position: relative;">
<div class="list-item" @onclick="() => ToggleTodo(todo.item, todo.index)" style="cursor: pointer;">
<input type="checkbox" @bind="todo.item.IsDone" />
<div class="text-content">
<div class="small-text">
@if (todo.item.IsDone)
{
<del>
<span>생성일: @todo.item.InputDate</span>
</del>
}
else
{
<span>생성일: @todo.item.InputDate</span>
}
</div>
<div class="normal-text">
@if (todo.item.IsDone)
{
<del>
@todo.item.Title
</del>
}
else
{
@todo.item.Title
}
</div>
<div class="small-text">
@if (todo.item.IsDone)
{
<span>마감일: @todo.item.SuccessDate</span>
}
</div>
</div>
</div>
<button class="small-button" @onclick = "() => RemoveList(todo.item, todo.index)" style="position: absolute; right: 4px; bottom: 4px;">
🗑️
</button>
</li>
}
</ul>

View File

@ -0,0 +1,73 @@
using BlazorApp.PrefixCSharp;
using Microsoft.AspNetCore.Components;
namespace BlazorApp.Components.Pages.TodoPage
{
public partial class Todo : ComponentBase
{
private List<TodoItem> todos = new();
private List<TodoItem> doneTodos = new();
private string? newTodo;
private void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem
{
Id = (new Func<int>(delegate
{
int result = 0;
if (doneTodos.Count > 0)
result = doneTodos[0].Id + 1;
if (todos.Count > 0)
result = todos[todos.Count - 1].Id + 1 > result ? todos[todos.Count - 1].Id + 1 : result;
return result;
}))(),
Title = newTodo,
InputDate = DateTime.Now.ToString("yyyy-MM-dd")
});
newTodo = string.Empty;
}
}
private void ToggleTodo(TodoItem todo, int index)
{
if (todo.IsDone)
{
todo.SuccessDate = string.Empty;
todo.IsDone = Prefix.Toggle(todo.IsDone);
doneTodos.RemoveAt(index);
todos.Add(todo);
todos = SortList(todos);
}
else
{
todo.SuccessDate = DateTime.Now.ToString("yyyy-MM-dd");
todo.IsDone = Prefix.Toggle(todo.IsDone);
todos.RemoveAt(index);
doneTodos.Add(todo);
doneTodos = SortList(doneTodos, true);
}
}
private List<TodoItem> SortList(List<TodoItem> list, bool reverse = false)
{
return reverse ? list.OrderByDescending(todo => todo.Id).ToList() : list.OrderBy(todo => todo.Id).ToList();
}
private void RemoveList(TodoItem todo, int index)
{
if (todo.IsDone)
doneTodos.RemoveAt(index);
else
todos.RemoveAt(index);
}
}
}

View File

@ -0,0 +1,50 @@
.list-item {
display: flex;
align-items: center;
padding: 10px;
border: 1px solid #ddd;
/*margin-bottom: 5px;*/
}
.list-item input[type="checkbox"] {
width: 30px; /* 체크박스 너비 */
height: 30px; /* 체크박스 높이 */
margin-right: 10px;
}
.text-content {
display: flex;
flex-direction: column;
}
.text-content .small-text {
font-size: 10pt;
}
.text-content .normal-text {
display: flex;
flex-wrap: wrap;
font-size: 14pt;
margin: 0;
}
.small-button {
font-size: 12pt;
width: 24px;
height: 24px;
/*padding: 5px 10px;*/
cursor: pointer;
border: none;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.small-button:hover {
background-color: #e9e9e9;
}
.small-button:active {
background-color: #dddddd;
}

View File

@ -0,0 +1,11 @@
namespace BlazorApp;
public class TodoItem
{
public int Id { get; set; }
public string? Title { get; set; }
public bool IsDone { get; set; }
public string InputDate { get; set; } = String.Empty;
public string? SuccessDate { get; set; }
}

View File

@ -0,0 +1,11 @@
namespace BlazorApp.PrefixCSharp;
public class Prefix
{
public static bool Toggle(bool value)
{
if (value)
return false;
return true;
}
}

View File

@ -24,5 +24,4 @@ app.UseAntiforgery();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
app.Run();

View File

@ -1,7 +0,0 @@
namespace BlazorApp;
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; }
}

View File

@ -7,9 +7,287 @@
"targets": {
".NETCoreApp,Version=v8.0": {
"BlazorApp/1.0.0": {
"dependencies": {
"Microsoft.AspNetCore.SignalR": "1.1.0"
},
"runtime": {
"BlazorApp.dll": {}
}
},
"Microsoft.AspNetCore.Authentication.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.AspNetCore.Authorization/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.AspNetCore.Authorization.Policy/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Authentication.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Authorization": "2.2.0"
}
},
"Microsoft.AspNetCore.Connections.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Features": "2.2.0",
"System.IO.Pipelines": "4.5.2"
}
},
"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0",
"Microsoft.Extensions.Hosting.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Features": "2.2.0",
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.Http/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0",
"Microsoft.AspNetCore.WebUtilities": "2.2.0",
"Microsoft.Extensions.ObjectPool": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0",
"Microsoft.Net.Http.Headers": "2.2.0"
}
},
"Microsoft.AspNetCore.Http.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Features": "2.2.0",
"System.Text.Encodings.Web": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Connections/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.Authorization.Policy": "2.2.0",
"Microsoft.AspNetCore.Hosting.Abstractions": "2.2.0",
"Microsoft.AspNetCore.Http": "2.2.0",
"Microsoft.AspNetCore.Http.Connections.Common": "1.1.0",
"Microsoft.AspNetCore.Routing": "2.2.0",
"Microsoft.AspNetCore.WebSockets": "2.2.0",
"Newtonsoft.Json": "11.0.2",
"System.Security.Principal.Windows": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Connections.Common/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.Connections.Abstractions": "2.2.0",
"Newtonsoft.Json": "11.0.2",
"System.Buffers": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Extensions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0",
"Microsoft.Extensions.FileProviders.Abstractions": "2.2.0",
"Microsoft.Net.Http.Headers": "2.2.0",
"System.Buffers": "4.5.0"
}
},
"Microsoft.AspNetCore.Http.Features/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.AspNetCore.Routing/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Extensions": "2.2.0",
"Microsoft.AspNetCore.Routing.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.ObjectPool": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0"
}
},
"Microsoft.AspNetCore.Routing.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0"
}
},
"Microsoft.AspNetCore.SignalR/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Connections": "1.1.0",
"Microsoft.AspNetCore.SignalR.Core": "1.1.0"
}
},
"Microsoft.AspNetCore.SignalR.Common/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.Connections.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0",
"Newtonsoft.Json": "11.0.2",
"System.Buffers": "4.5.0"
}
},
"Microsoft.AspNetCore.SignalR.Core/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.Authorization": "2.2.0",
"Microsoft.AspNetCore.SignalR.Common": "1.1.0",
"Microsoft.AspNetCore.SignalR.Protocols.Json": "1.1.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"System.Reflection.Emit": "4.3.0",
"System.Threading.Channels": "4.5.0"
}
},
"Microsoft.AspNetCore.SignalR.Protocols.Json/1.1.0": {
"dependencies": {
"Microsoft.AspNetCore.SignalR.Common": "1.1.0",
"Newtonsoft.Json": "11.0.2"
}
},
"Microsoft.AspNetCore.WebSockets/2.2.0": {
"dependencies": {
"Microsoft.AspNetCore.Http.Extensions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
"Microsoft.Extensions.Options": "2.2.0",
"System.Net.WebSockets.WebSocketProtocol": "4.5.1"
}
},
"Microsoft.AspNetCore.WebUtilities/2.2.0": {
"dependencies": {
"Microsoft.Net.Http.Headers": "2.2.0",
"System.Text.Encodings.Web": "4.5.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": {},
"Microsoft.Extensions.FileProviders.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "2.2.0"
}
},
"Microsoft.Extensions.Hosting.Abstractions/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.FileProviders.Abstractions": "2.2.0",
"Microsoft.Extensions.Logging.Abstractions": "2.2.0"
}
},
"Microsoft.Extensions.Logging.Abstractions/2.2.0": {},
"Microsoft.Extensions.ObjectPool/2.2.0": {},
"Microsoft.Extensions.Options/2.2.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
"Microsoft.Extensions.Primitives": "2.2.0",
"System.ComponentModel.Annotations": "4.5.0"
}
},
"Microsoft.Extensions.Primitives/2.2.0": {
"dependencies": {
"System.Memory": "4.5.1",
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
}
},
"Microsoft.Net.Http.Headers/2.2.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "2.2.0",
"System.Buffers": "4.5.0"
}
},
"Microsoft.NETCore.Platforms/2.0.0": {},
"Microsoft.NETCore.Targets/1.1.0": {},
"Newtonsoft.Json/11.0.2": {
"runtime": {
"lib/netstandard2.0/Newtonsoft.Json.dll": {
"assemblyVersion": "11.0.0.0",
"fileVersion": "11.0.2.21924"
}
}
},
"System.Buffers/4.5.0": {},
"System.ComponentModel.Annotations/4.5.0": {},
"System.IO/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0",
"System.Text.Encoding": "4.3.0",
"System.Threading.Tasks": "4.3.0"
}
},
"System.IO.Pipelines/4.5.2": {},
"System.Memory/4.5.1": {},
"System.Net.WebSockets.WebSocketProtocol/4.5.1": {
"runtime": {
"lib/netcoreapp2.1/System.Net.WebSockets.WebSocketProtocol.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.26606.5"
}
}
},
"System.Reflection/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.IO": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Reflection.Emit/4.3.0": {
"dependencies": {
"System.IO": "4.3.0",
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Reflection.Emit.ILGeneration/4.3.0": {
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Reflection.Primitives/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
},
"System.Runtime/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0"
}
},
"System.Runtime.CompilerServices.Unsafe/4.5.1": {},
"System.Security.Principal.Windows/4.5.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0"
}
},
"System.Text.Encoding/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
},
"System.Text.Encodings.Web/4.5.0": {},
"System.Threading.Channels/4.5.0": {},
"System.Threading.Tasks/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.0.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
}
}
},
@ -18,6 +296,349 @@
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.AspNetCore.Authentication.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VloMLDJMf3n/9ic5lCBOa42IBYJgyB1JhzLsL68Zqg+2bEPWfGBj/xCJy/LrKTArN0coOcZp3wyVTZlx0y9pHQ==",
"path": "microsoft.aspnetcore.authentication.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.authentication.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Authorization/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/L0W8H3jMYWyaeA9gBJqS/tSWBegP9aaTM0mjRhxTttBY9z4RVDRYJ2CwPAmAXIuPr3r1sOw+CS8jFVRGHRezQ==",
"path": "microsoft.aspnetcore.authorization/2.2.0",
"hashPath": "microsoft.aspnetcore.authorization.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Authorization.Policy/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aJCo6niDRKuNg2uS2WMEmhJTooQUGARhV2ENQ2tO5443zVHUo19MSgrgGo9FIrfD+4yKPF8Q+FF33WkWfPbyKw==",
"path": "microsoft.aspnetcore.authorization.policy/2.2.0",
"hashPath": "microsoft.aspnetcore.authorization.policy.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Connections.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==",
"path": "microsoft.aspnetcore.connections.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==",
"path": "microsoft.aspnetcore.hosting.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==",
"path": "microsoft.aspnetcore.hosting.server.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==",
"path": "microsoft.aspnetcore.http/2.2.0",
"hashPath": "microsoft.aspnetcore.http.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==",
"path": "microsoft.aspnetcore.http.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http.Connections/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZcwAM9rE5yjGC+vtiNAK0INybpKIqnvB+/rntZn2/CPtyiBAtovVrEp4UZOoC31zH5t0P78ix9gLNJzII/ODsA==",
"path": "microsoft.aspnetcore.http.connections/1.1.0",
"hashPath": "microsoft.aspnetcore.http.connections.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http.Connections.Common/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mYk5QUUjyXQmlyDHWDjkLYDArt97plwe6KsDsNVhDEQ+HgZMKGjISyM6YSA7BERQNR25kXBTbIYfSy1vePGQgg==",
"path": "microsoft.aspnetcore.http.connections.common/1.1.0",
"hashPath": "microsoft.aspnetcore.http.connections.common.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http.Extensions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==",
"path": "microsoft.aspnetcore.http.extensions/2.2.0",
"hashPath": "microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Http.Features/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==",
"path": "microsoft.aspnetcore.http.features/2.2.0",
"hashPath": "microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Routing/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-jAhDBy0wryOnMhhZTtT9z63gJbvCzFuLm8yC6pHzuVu9ZD1dzg0ltxIwT4cfwuNkIL/TixdKsm3vpVOpG8euWQ==",
"path": "microsoft.aspnetcore.routing/2.2.0",
"hashPath": "microsoft.aspnetcore.routing.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Routing.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lRRaPN7jDlUCVCp9i0W+PB0trFaKB0bgMJD7hEJS9Uo4R9MXaMC8X2tJhPLmeVE3SGDdYI4QNKdVmhNvMJGgPQ==",
"path": "microsoft.aspnetcore.routing.abstractions/2.2.0",
"hashPath": "microsoft.aspnetcore.routing.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.SignalR/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-V5X5XkeAHaFyyBOGPrddVeqTNo6zRPJNS5PRhlzEyBXiNG9AtqUbMyWFdZahQyMiIWJau550z59A4kdC9g5I9A==",
"path": "microsoft.aspnetcore.signalr/1.1.0",
"hashPath": "microsoft.aspnetcore.signalr.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.SignalR.Common/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TyLgQ4y4RVUIxiYFnHT181/rJ33/tL/NcBWC9BwLpulDt5/yGCG4EvsToZ49EBQ7256zj+R6OGw6JF+jj6MdPQ==",
"path": "microsoft.aspnetcore.signalr.common/1.1.0",
"hashPath": "microsoft.aspnetcore.signalr.common.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.SignalR.Core/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mk69z50oFk2e89d3F/AfKeAvP3kvGG7MHG4ErydZiUd3ncSRq0kl0czq/COn/QVKYua9yGr2LIDwuR1C6/pu8Q==",
"path": "microsoft.aspnetcore.signalr.core/1.1.0",
"hashPath": "microsoft.aspnetcore.signalr.core.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.SignalR.Protocols.Json/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BOsjatDJnvnnXCMajOlC0ISmiFnJi/EyJzMo0i//5fZJVCLrQ4fyV/HzrhhAhSJuwJOQDdDozKQ9MB9jHq84pg==",
"path": "microsoft.aspnetcore.signalr.protocols.json/1.1.0",
"hashPath": "microsoft.aspnetcore.signalr.protocols.json.1.1.0.nupkg.sha512"
},
"Microsoft.AspNetCore.WebSockets/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZpOcg2V0rCwU9ErfDb9y3Hcjoe7rU42XlmUS0mO4pVZQSgJVqR+DfyZtYd5LDa11F7bFNS2eezI9cBM3CmfGhw==",
"path": "microsoft.aspnetcore.websockets/2.2.0",
"hashPath": "microsoft.aspnetcore.websockets.2.2.0.nupkg.sha512"
},
"Microsoft.AspNetCore.WebUtilities/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==",
"path": "microsoft.aspnetcore.webutilities/2.2.0",
"hashPath": "microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
"path": "microsoft.extensions.configuration.abstractions/2.2.0",
"hashPath": "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.FileProviders.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==",
"path": "microsoft.extensions.fileproviders.abstractions/2.2.0",
"hashPath": "microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.Hosting.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==",
"path": "microsoft.extensions.hosting.abstractions/2.2.0",
"hashPath": "microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==",
"path": "microsoft.extensions.logging.abstractions/2.2.0",
"hashPath": "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.ObjectPool/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==",
"path": "microsoft.extensions.objectpool/2.2.0",
"hashPath": "microsoft.extensions.objectpool.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
"path": "microsoft.extensions.options/2.2.0",
"hashPath": "microsoft.extensions.options.2.2.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
"path": "microsoft.extensions.primitives/2.2.0",
"hashPath": "microsoft.extensions.primitives.2.2.0.nupkg.sha512"
},
"Microsoft.Net.Http.Headers/2.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==",
"path": "microsoft.net.http.headers/2.2.0",
"hashPath": "microsoft.net.http.headers.2.2.0.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==",
"path": "microsoft.netcore.platforms/2.0.0",
"hashPath": "microsoft.netcore.platforms.2.0.0.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
"path": "microsoft.netcore.targets/1.1.0",
"hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512"
},
"Newtonsoft.Json/11.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IvJe1pj7JHEsP8B8J8DwlMEx8UInrs/x+9oVY+oCD13jpLu4JbJU2WCIsMRn5C4yW9+DgkaO8uiVE5VHKjpmdQ==",
"path": "newtonsoft.json/11.0.2",
"hashPath": "newtonsoft.json.11.0.2.nupkg.sha512"
},
"System.Buffers/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==",
"path": "system.buffers/4.5.0",
"hashPath": "system.buffers.4.5.0.nupkg.sha512"
},
"System.ComponentModel.Annotations/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==",
"path": "system.componentmodel.annotations/4.5.0",
"hashPath": "system.componentmodel.annotations.4.5.0.nupkg.sha512"
},
"System.IO/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
"path": "system.io/4.3.0",
"hashPath": "system.io.4.3.0.nupkg.sha512"
},
"System.IO.Pipelines/4.5.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NOC/SO4gSX6t0tB25xxDPqPEzkksuzW7NVFBTQGAkjXXUPQl7ZtyE83T7tUCP2huFBbPombfCKvq1Ox1aG8D9w==",
"path": "system.io.pipelines/4.5.2",
"hashPath": "system.io.pipelines.4.5.2.nupkg.sha512"
},
"System.Memory/4.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sDJYJpGtTgx+23Ayu5euxG5mAXWdkDb4+b0rD0Cab0M1oQS9H0HXGPriKcqpXuiJDTV7fTp/d+fMDJmnr6sNvA==",
"path": "system.memory/4.5.1",
"hashPath": "system.memory.4.5.1.nupkg.sha512"
},
"System.Net.WebSockets.WebSocketProtocol/4.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FquLjdb/0CeMqb15u9Px6TwnyFl306WztKWu6sKKc5kWPYMdpi5BFEkdxzGoieYFp9UksyGwJnCw4KKAUfJjrw==",
"path": "system.net.websockets.websocketprotocol/4.5.1",
"hashPath": "system.net.websockets.websocketprotocol.4.5.1.nupkg.sha512"
},
"System.Reflection/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
"path": "system.reflection/4.3.0",
"hashPath": "system.reflection.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
"path": "system.reflection.emit/4.3.0",
"hashPath": "system.reflection.emit.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit.ILGeneration/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
"path": "system.reflection.emit.ilgeneration/4.3.0",
"hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512"
},
"System.Reflection.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
"path": "system.reflection.primitives/4.3.0",
"hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512"
},
"System.Runtime/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
"path": "system.runtime/4.3.0",
"hashPath": "system.runtime.4.3.0.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/4.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==",
"path": "system.runtime.compilerservices.unsafe/4.5.1",
"hashPath": "system.runtime.compilerservices.unsafe.4.5.1.nupkg.sha512"
},
"System.Security.Principal.Windows/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==",
"path": "system.security.principal.windows/4.5.0",
"hashPath": "system.security.principal.windows.4.5.0.nupkg.sha512"
},
"System.Text.Encoding/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
"path": "system.text.encoding/4.3.0",
"hashPath": "system.text.encoding.4.3.0.nupkg.sha512"
},
"System.Text.Encodings.Web/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==",
"path": "system.text.encodings.web/4.5.0",
"hashPath": "system.text.encodings.web.4.5.0.nupkg.sha512"
},
"System.Threading.Channels/4.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-MEH06N0rIGmRT4LOKQ2BmUO0IxfvmIY/PaouSq+DFQku72OL8cxfw8W99uGpTCFf2vx2QHLRSh374iSM3asdTA==",
"path": "system.threading.channels/4.5.0",
"hashPath": "system.threading.channels.4.5.0.nupkg.sha512"
},
"System.Threading.Tasks/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
"path": "system.threading.tasks/4.3.0",
"hashPath": "system.threading.tasks.4.3.0.nupkg.sha512"
}
}
}

Binary file not shown.

View File

@ -42,6 +42,12 @@
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Microsoft.AspNetCore.SignalR": {
"target": "Package",
"version": "[1.1.0, )"
}
},
"imports": [
"net461",
"net462",

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("BlazorApp")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e554ba22b3f3cdd8bd0ce3cb5c93355b57e25261")]
[assembly: System.Reflection.AssemblyProductAttribute("BlazorApp")]
[assembly: System.Reflection.AssemblyTitleAttribute("BlazorApp")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
dde306ccf7bf4bb8d082a60aec7ba74921708f37594eac062aeef1d7dbc4376b
0d413a05c0600afacbfef2252958fa268ae4252fd91bc9042018004bdc1236f9

View File

@ -34,10 +34,6 @@ build_metadata.AdditionalFiles.CssScope =
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50cy9QYWdlcy9Ib21lLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/Components/Pages/Todo.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50cy9QYWdlcy9Ub2RvLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/Components/Pages/Weather.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50cy9QYWdlcy9XZWF0aGVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
@ -57,3 +53,7 @@ build_metadata.AdditionalFiles.CssScope = b-fekawvbbds
[/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50cy9MYXlvdXQvTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-zswk0q6kaa
[/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/Components/Pages/TodoPage/Todo.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50cy9QYWdlcy9Ub2RvUGFnZS9Ub2RvLnJhem9y
build_metadata.AdditionalFiles.CssScope = b-n64y2ur3f8

View File

@ -1 +1 @@
0b4a6664a422117388860abdb563a3db32bb8de9362e58982c645637e7d5a02f
3607e99c4bc36a4bae6dfb6e1b940004d67160fc7f174a874004b6f7cde31fdd

View File

@ -6,6 +6,9 @@
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/bin/Debug/net8.0/BlazorApp.runtimeconfig.json
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/bin/Debug/net8.0/BlazorApp.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/bin/Debug/net8.0/BlazorApp.pdb
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/bin/Debug/net8.0/Newtonsoft.Json.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/bin/Debug/net8.0/System.Net.WebSockets.WebSocketProtocol.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.csproj.AssemblyReference.cache
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.GeneratedMSBuildEditorConfig.editorconfig
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.AssemblyInfoInputs.cache
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.AssemblyInfo.cs
@ -22,8 +25,10 @@
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/scopedcss/Components/Layout/NavMenu.razor.rz.scp.css
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/scopedcss/bundle/BlazorApp.styles.css
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/scopedcss/projectbundle/BlazorApp.bundle.scp.css
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.csproj.Up2Date
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/refint/BlazorApp.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.pdb
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/BlazorApp.genruntimeconfig.cache
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/ref/BlazorApp.dll
/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/Debug/net8.0/scopedcss/Components/Pages/TodoPage/Todo.razor.rz.scp.css

View File

@ -0,0 +1,51 @@
/* todo 용 CSS */
.list-item[b-n64y2ur3f8] {
display: flex;
align-items: center;
padding: 10px;
border: 1px solid #ddd;
/*margin-bottom: 5px;*/
}
.list-item input[type="checkbox"][b-n64y2ur3f8] {
width: 30px; /* 체크박스 너비 */
height: 30px; /* 체크박스 높이 */
margin-right: 10px;
}
.text-content[b-n64y2ur3f8] {
display: flex;
flex-direction: column;
}
.text-content .small-text[b-n64y2ur3f8] {
font-size: 10pt;
}
.text-content .normal-text[b-n64y2ur3f8] {
display: flex;
flex-wrap: wrap;
font-size: 14pt;
margin: 0;
}
.small-button[b-n64y2ur3f8] {
font-size: 12pt;
width: 24px;
height: 24px;
/*padding: 5px 10px;*/
cursor: pointer;
border: none;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.small-button:hover[b-n64y2ur3f8] {
background-color: #e9e9e9;
}
.small-button:active[b-n64y2ur3f8] {
background-color: #dddddd;
}

View File

@ -206,3 +206,55 @@ main[b-fekawvbbds] {
overflow-y: auto;
}
}
/* _content/BlazorApp/Components/Pages/TodoPage/Todo.razor.rz.scp.css */
/* todo 용 CSS */
.list-item[b-n64y2ur3f8] {
display: flex;
align-items: center;
padding: 10px;
border: 1px solid #ddd;
/*margin-bottom: 5px;*/
}
.list-item input[type="checkbox"][b-n64y2ur3f8] {
width: 30px; /* 체크박스 너비 */
height: 30px; /* 체크박스 높이 */
margin-right: 10px;
}
.text-content[b-n64y2ur3f8] {
display: flex;
flex-direction: column;
}
.text-content .small-text[b-n64y2ur3f8] {
font-size: 10pt;
}
.text-content .normal-text[b-n64y2ur3f8] {
display: flex;
flex-wrap: wrap;
font-size: 14pt;
margin: 0;
}
.small-button[b-n64y2ur3f8] {
font-size: 12pt;
width: 24px;
height: 24px;
/*padding: 5px 10px;*/
cursor: pointer;
border: none;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.small-button:hover[b-n64y2ur3f8] {
background-color: #e9e9e9;
}
.small-button:active[b-n64y2ur3f8] {
background-color: #dddddd;
}

View File

@ -206,3 +206,55 @@ main[b-fekawvbbds] {
overflow-y: auto;
}
}
/* _content/BlazorApp/Components/Pages/TodoPage/Todo.razor.rz.scp.css */
/* todo 용 CSS */
.list-item[b-n64y2ur3f8] {
display: flex;
align-items: center;
padding: 10px;
border: 1px solid #ddd;
/*margin-bottom: 5px;*/
}
.list-item input[type="checkbox"][b-n64y2ur3f8] {
width: 30px; /* 체크박스 너비 */
height: 30px; /* 체크박스 높이 */
margin-right: 10px;
}
.text-content[b-n64y2ur3f8] {
display: flex;
flex-direction: column;
}
.text-content .small-text[b-n64y2ur3f8] {
font-size: 10pt;
}
.text-content .normal-text[b-n64y2ur3f8] {
display: flex;
flex-wrap: wrap;
font-size: 14pt;
margin: 0;
}
.small-button[b-n64y2ur3f8] {
font-size: 12pt;
width: 24px;
height: 24px;
/*padding: 5px 10px;*/
cursor: pointer;
border: none;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.small-button:hover[b-n64y2ur3f8] {
background-color: #e9e9e9;
}
.small-button:active[b-n64y2ur3f8] {
background-color: #dddddd;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,58 @@
{
"version": 2,
"dgSpecHash": "l5xqho5lZk0=",
"dgSpecHash": "v0jUQFxr6ag=",
"success": true,
"projectFilePath": "/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/BlazorApp.csproj",
"expectedPackageFiles": [],
"expectedPackageFiles": [
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.authentication.abstractions/2.2.0/microsoft.aspnetcore.authentication.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.authorization/2.2.0/microsoft.aspnetcore.authorization.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.authorization.policy/2.2.0/microsoft.aspnetcore.authorization.policy.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.connections.abstractions/2.2.0/microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.hosting.abstractions/2.2.0/microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.hosting.server.abstractions/2.2.0/microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http/2.2.0/microsoft.aspnetcore.http.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http.abstractions/2.2.0/microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http.connections/1.1.0/microsoft.aspnetcore.http.connections.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http.connections.common/1.1.0/microsoft.aspnetcore.http.connections.common.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http.extensions/2.2.0/microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.http.features/2.2.0/microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.routing/2.2.0/microsoft.aspnetcore.routing.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.routing.abstractions/2.2.0/microsoft.aspnetcore.routing.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.signalr/1.1.0/microsoft.aspnetcore.signalr.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.signalr.common/1.1.0/microsoft.aspnetcore.signalr.common.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.signalr.core/1.1.0/microsoft.aspnetcore.signalr.core.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.signalr.protocols.json/1.1.0/microsoft.aspnetcore.signalr.protocols.json.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.websockets/2.2.0/microsoft.aspnetcore.websockets.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.aspnetcore.webutilities/2.2.0/microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.configuration.abstractions/2.2.0/microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/2.2.0/microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.fileproviders.abstractions/2.2.0/microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.hosting.abstractions/2.2.0/microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.logging.abstractions/2.2.0/microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.objectpool/2.2.0/microsoft.extensions.objectpool.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.options/2.2.0/microsoft.extensions.options.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.extensions.primitives/2.2.0/microsoft.extensions.primitives.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.net.http.headers/2.2.0/microsoft.net.http.headers.2.2.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.netcore.platforms/2.0.0/microsoft.netcore.platforms.2.0.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/microsoft.netcore.targets/1.1.0/microsoft.netcore.targets.1.1.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/newtonsoft.json/11.0.2/newtonsoft.json.11.0.2.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.buffers/4.5.0/system.buffers.4.5.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.componentmodel.annotations/4.5.0/system.componentmodel.annotations.4.5.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.io/4.3.0/system.io.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.io.pipelines/4.5.2/system.io.pipelines.4.5.2.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.memory/4.5.1/system.memory.4.5.1.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.net.websockets.websocketprotocol/4.5.1/system.net.websockets.websocketprotocol.4.5.1.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.reflection/4.3.0/system.reflection.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.reflection.emit/4.3.0/system.reflection.emit.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.reflection.emit.ilgeneration/4.3.0/system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.reflection.primitives/4.3.0/system.reflection.primitives.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.runtime/4.3.0/system.runtime.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.runtime.compilerservices.unsafe/4.5.1/system.runtime.compilerservices.unsafe.4.5.1.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.security.principal.windows/4.5.0/system.security.principal.windows.4.5.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.text.encoding/4.3.0/system.text.encoding.4.3.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.text.encodings.web/4.5.0/system.text.encodings.web.4.5.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.threading.channels/4.5.0/system.threading.channels.4.5.0.nupkg.sha512",
"/Users/seankim/.nuget/packages/system.threading.tasks/4.3.0/system.threading.tasks.4.3.0.nupkg.sha512"
],
"logs": []
}

View File

@ -1 +1 @@
"restore":{"projectUniqueName":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/BlazorApp.csproj","projectName":"BlazorApp","projectPath":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/BlazorApp.csproj","outputPath":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/8.0.401/PortableRuntimeIdentifierGraph.json"}}
"restore":{"projectUniqueName":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/BlazorApp.csproj","projectName":"BlazorApp","projectPath":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/BlazorApp.csproj","outputPath":"/Users/seankim/1.Program/Project(ASP)/BlazorApp/BlazorApp/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Microsoft.AspNetCore.SignalR":{"target":"Package","version":"[1.1.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/8.0.401/PortableRuntimeIdentifierGraph.json"}}

View File

@ -1 +1 @@
17274215440122346
17278343012828191

View File

@ -1 +1 @@
17274215440122346
17278343012828191

View File

@ -169,5 +169,88 @@ public class TodoItem
---
## 2. 영화 데이터베이스 페이지 만들기
-
## 2. SignalR 사용
### 개요
### SignalR 이란?
- 앱에 실시간 웹 기능을 추가하는 것을 간소화하는 오픈 소스 라이브러리이다.
- 실시간 웹 기능을 사용하며 서버측 코드에서 클라이언트에 컨텐츠를 즉시 푸시 할 수 있다.
- 서버와 클라이언트 RPC(원격 프로시저 호출)를 만들기 위한 API를 제공한다.
- RPC는 서버 쪽 .NET Core 코드의 클라이언트에서 함수를 호출한다.
#### SignalR 사용에 적합한 기능
1. 서버에서 자주 업데이트가 필요한 앱
- e.g. 게임, SNS, 지도 등
2. 대시보드 및 모니터링 앱
- 대시보드, 업데이트 및 경고 등
3. 공동 작업 앱
- 화이트보드, 모임 소프트웨어 등
4. 알림이 필요로 하는 앱
#### 허브
- SignalR은 허브를 사용해 클라이언트와 서버 간에 통신을 한다.
- 허브는 클라이언트와 서버가 서로 메서드를 호출할 수 있게한다.
- 메서드 호출이란 클라이언트와 서버에서 정의된 특정 로직을 실행하는 것을 의미한다.
- 메서드가 매개변수 전달할 때, `데이터의 형식`을 명확하게 지정할 수 있다. 이를 통해 모델 바인딩 사용이 가능하다.
- 역직렬화를 통해 클라이언트와 서버간 데이터를 사용하는데 2가지 프로토콜을 제공한다.
1. JSON 기반 텍스트 프로토콜
2. MessagePack : 데이터를 이진 형식으로 보내는 방식으로, JSON보다 크기가 더 작으므로 통신 속도를 높일 수 있다.
- 클라이언트 또는 서버가 허브를 통해 데이터를 보낼 때, 그 데이터는 직렬화 방식으로 전송되며 이를 다시 원래 방식으로 돌리는게 역직렬화이다.
### <del>Blazor를 사용한 SignalR
- <del>이 예제를 만들기 위해서는 이 프로젝트 말고 다른 하나의 프로젝트도 필요로 한다.
- <del>이 프로젝트의 경우는 이 예제의 `서버`로서 사용할 예정
### <del>라이브러리 추가
- <del>Nuget 패키지 관리 > Microsoft.AspNetCore.SignalR.Client > 설치 > 미리보기 안내 나오면 확인 선택 > 라이선스 승인 동의 선택
> 이건 조금 더 학습하고 다시 해보는 걸로
## 예제 학습
1. 간단한 To-Do 리스트 애플리케이션
• 목표: Blazor의 기본적인 컴포넌트 구조와 데이터 바인딩을 학습
• 포인트:
• 컴포넌트 생성 및 렌더링
• 데이터 바인딩 (@bind)
• 이벤트 핸들링
• 설명: 사용자가 할 일을 입력하고, 목록에서 완료된 할 일을 삭제하는 간단한 애플리케이션
2. Form 처리 및 유효성 검사 예제
• 목표: Blazor의 폼 처리와 유효성 검사 기능을 익힘
• 포인트:
• 폼 데이터 바인딩
• 데이터 유효성 검사 (Validation)
• 설명: 사용자 입력 폼을 만들어서 기본적인 유효성 검사를 진행. 예를 들어, 사용자 이름과 이메일 주소 입력 폼을 구현해 보세요.
3. Dependency Injection (DI)를 사용하는 블로그 앱
• 목표: Blazor의 DI 패턴을 이해하고 데이터 관리
• 포인트:
@inject 사용
• 서비스 라이프사이클 관리 (싱글턴, 트랜지언트, 스코프드)
• 설명: 블로그 포스트를 추가, 삭제, 수정할 수 있는 간단한 블로그 앱을 만들어보세요. 데이터를 관리하는 서비스 클래스를 DI로 주입해 데이터를 처리합니다.
4. Blazor와 SignalR을 이용한 채팅 애플리케이션
• 목표: 실시간 데이터 전송 및 SignalR 사용 학습
• 포인트:
• SignalR 허브와 클라이언트 간의 실시간 통신
• 클라이언트와 서버 간 양방향 데이터 전송
• 설명: 사용자가 채팅 메시지를 실시간으로 주고받는 간단한 채팅 애플리케이션을 만들어보세요.
5. Flight Seat Selection Screen
• 목표: 사용자 인터페이스 커스터마이징 및 고급 컴포넌트 처리
• 포인트:
• 이미지 위에 버튼 오버레이
• 사용자의 좌석 선택 기능 구현
• 설명: 좌석 선택을 위한 UI를 구현하며, 복잡한 사용자 인터페이스를 다루는 방법을 연습할 수 있습니다.
6. Blazor State Management 프로젝트
• 목표: 상태 관리(State Management) 방법을 학습
• 포인트:
• Cascading Parameters, Application State
• LocalStorage 또는 SessionStorage 사용
• 설명: 상태 관리가 필요한 쇼핑 카트 시스템을 만들어서 사용자가 선택한 상품을 저장하고, 해당 데이터를 세션이나 애플리케이션 전반에 걸쳐 유지하는 예제를 구현해보세요.