X\choro 10 meses atrás
pai
commit
3cea9e312c
42 arquivos alterados com 1704 adições e 370 exclusões
  1. BIN
      backend/.vs/ProjectEvaluation/bitforum.metadata.v9.bin
  2. BIN
      backend/.vs/ProjectEvaluation/bitforum.projects.v9.bin
  3. BIN
      backend/.vs/ProjectEvaluation/bitforum.strings.v9.bin
  4. BIN
      backend/.vs/bitforum/CopilotIndices/17.12.38.29086/CodeChunks.db
  5. BIN
      backend/.vs/bitforum/CopilotIndices/17.12.38.29086/SemanticSymbols.db
  6. BIN
      backend/.vs/bitforum/CopilotIndices/17.12.38.29086/SemanticSymbols.db-wal
  7. BIN
      backend/.vs/bitforum/DesignTimeBuild/.dtbcache.v2
  8. BIN
      backend/.vs/bitforum/v17/.futdcache.v2
  9. BIN
      backend/.vs/bitforum/v17/.suo
  10. 91 22
      backend/.vs/bitforum/v17/DocumentLayout.backup.json
  11. 111 47
      backend/.vs/bitforum/v17/DocumentLayout.json
  12. 11 8
      backend/Controllers/Page/DocumentController.cs
  13. 95 22
      backend/Controllers/Page/Faq/CategoryController.cs
  14. 203 0
      backend/Migrations/DefaultDb/20250117140508_SyncWithExistingDb.Designer.cs
  15. 22 0
      backend/Migrations/DefaultDb/20250117140508_SyncWithExistingDb.cs
  16. 200 0
      backend/Migrations/DefaultDb/20250117142625_DeleteContentColumnByFaqCategory.Designer.cs
  17. 28 0
      backend/Migrations/DefaultDb/20250117142625_DeleteContentColumnByFaqCategory.cs
  18. 203 0
      backend/Migrations/DefaultDb/20250117153800_UpdateFields.Designer.cs
  19. 38 0
      backend/Migrations/DefaultDb/20250117153800_UpdateFields.cs
  20. 4 4
      backend/Migrations/DefaultDb/DefaultDbContextModelSnapshot.cs
  21. 14 2
      backend/Models/Page/Document.cs
  22. 4 6
      backend/Models/Page/Faq/Category.cs
  23. 1 1
      backend/Models/Page/Faq/Item.cs
  24. 9 0
      backend/Models/Views/FaqCategoryViewModel.cs
  25. 3 3
      backend/Views/Page/Document/Edit.cshtml
  26. 1 1
      backend/Views/Page/Document/Index.cshtml
  27. 3 3
      backend/Views/Page/Document/Write.cshtml
  28. 151 32
      backend/Views/Page/Faq/Index.cshtml
  29. BIN
      backend/bin/Debug/net8.0/bitforum.dll
  30. BIN
      backend/bin/Debug/net8.0/bitforum.exe
  31. BIN
      backend/bin/Debug/net8.0/bitforum.pdb
  32. BIN
      backend/obj/Debug/net8.0/apphost.exe
  33. 4 5
      backend/obj/Debug/net8.0/bitforum.AssemblyInfo.cs
  34. 1 1
      backend/obj/Debug/net8.0/bitforum.AssemblyInfoInputs.cache
  35. 1 1
      backend/obj/Debug/net8.0/bitforum.csproj.CoreCompileInputs.cache
  36. 1 0
      backend/obj/Debug/net8.0/bitforum.csproj.FileListAbsolute.txt
  37. BIN
      backend/obj/Debug/net8.0/bitforum.dll
  38. BIN
      backend/obj/Debug/net8.0/bitforum.pdb
  39. BIN
      backend/obj/Debug/net8.0/ref/bitforum.dll
  40. BIN
      backend/obj/Debug/net8.0/refint/bitforum.dll
  41. 212 212
      backend/obj/Debug/net8.0/staticwebassets.build.json
  42. 293 0
      backend/obj/Debug/net8.0/staticwebassets.upToDateCheck.txt

BIN
backend/.vs/ProjectEvaluation/bitforum.metadata.v9.bin


BIN
backend/.vs/ProjectEvaluation/bitforum.projects.v9.bin


BIN
backend/.vs/ProjectEvaluation/bitforum.strings.v9.bin


BIN
backend/.vs/bitforum/CopilotIndices/17.12.38.29086/CodeChunks.db


BIN
backend/.vs/bitforum/CopilotIndices/17.12.38.29086/SemanticSymbols.db


BIN
backend/.vs/bitforum/CopilotIndices/17.12.38.29086/SemanticSymbols.db-wal


BIN
backend/.vs/bitforum/DesignTimeBuild/.dtbcache.v2


BIN
backend/.vs/bitforum/v17/.futdcache.v2


BIN
backend/.vs/bitforum/v17/.suo


+ 91 - 22
backend/.vs/bitforum/v17/DocumentLayout.backup.json

@@ -6,6 +6,14 @@
       "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\controllers\\page\\faq\\categorycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:controllers\\page\\faq\\categorycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\faq\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\faq\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\views\\faqcategoryviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\views\\faqcategoryviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
     {
       "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\page\\faq\\category.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
       "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\faq\\category.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -15,8 +23,16 @@
       "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\faq\\item.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\constants\\menudata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:constants\\menudata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\page\\document.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\document.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\document\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\document\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\document\\edit.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\document\\edit.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
     }
   ],
   "DocumentGroupContainers": [
@@ -26,7 +42,7 @@
       "DocumentGroups": [
         {
           "DockedWidth": 200,
-          "SelectedChildIndex": 7,
+          "SelectedChildIndex": 12,
           "Children": [
             {
               "$type": "Bookmark",
@@ -51,27 +67,92 @@
             {
               "$type": "Document",
               "DocumentIndex": 2,
+              "Title": "FaqCategoryViewModel.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Views\\FaqCategoryViewModel.cs",
+              "RelativeDocumentMoniker": "Models\\Views\\FaqCategoryViewModel.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Views\\FaqCategoryViewModel.cs",
+              "RelativeToolTip": "Models\\Views\\FaqCategoryViewModel.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAhAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2025-01-17T16:34:07.431Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 4,
               "Title": "Item.cs",
               "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Item.cs",
               "RelativeDocumentMoniker": "Models\\Page\\Faq\\Item.cs",
               "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Item.cs",
               "RelativeToolTip": "Models\\Page\\Faq\\Item.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAA==",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAB0AAAAbAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T10:55:37.051Z",
+              "WhenOpened": "2025-01-17T16:10:05.653Z",
               "EditorCaption": ""
             },
             {
               "$type": "Document",
-              "DocumentIndex": 1,
+              "DocumentIndex": 7,
+              "Title": "Edit.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Edit.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Document\\Edit.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Edit.cshtml",
+              "RelativeToolTip": "Views\\Page\\Document\\Edit.cshtml",
+              "ViewState": "AgIAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T16:09:21.702Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "Index.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Index.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Document\\Index.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Index.cshtml",
+              "RelativeToolTip": "Views\\Page\\Document\\Index.cshtml",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T16:09:21.109Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 5,
+              "Title": "Document.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Document.cs",
+              "RelativeDocumentMoniker": "Models\\Page\\Document.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Document.cs",
+              "RelativeToolTip": "Models\\Page\\Document.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2025-01-17T16:09:17.952Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 3,
               "Title": "Category.cs",
               "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Category.cs",
               "RelativeDocumentMoniker": "Models\\Page\\Faq\\Category.cs",
               "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Category.cs",
               "RelativeToolTip": "Models\\Page\\Faq\\Category.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAFAAAAAAAAAA==",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABsAAAAbAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T10:39:00.389Z",
+              "WhenOpened": "2025-01-17T15:59:47.814Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "Index.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Faq\\Index.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Faq\\Index.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Faq\\Index.cshtml",
+              "RelativeToolTip": "Views\\Page\\Faq\\Index.cshtml",
+              "ViewState": "AgIAAHoAAAAAAAAAAAAQwIEAAAAeAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T15:56:23.647Z",
               "EditorCaption": ""
             },
             {
@@ -82,22 +163,10 @@
               "RelativeDocumentMoniker": "Controllers\\Page\\Faq\\CategoryController.cs",
               "ToolTip": "E:\\workspace\\bitforum\\backend\\Controllers\\Page\\Faq\\CategoryController.cs",
               "RelativeToolTip": "Controllers\\Page\\Faq\\CategoryController.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAA==",
+              "ViewState": "AgIAABwAAAAAAAAAAAAuwDUAAABSAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T10:32:26.406Z",
+              "WhenOpened": "2025-01-17T15:55:02.561Z",
               "EditorCaption": ""
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 3,
-              "Title": "MenuData.cs",
-              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Constants\\MenuData.cs",
-              "RelativeDocumentMoniker": "Constants\\MenuData.cs",
-              "ToolTip": "E:\\workspace\\bitforum\\backend\\Constants\\MenuData.cs",
-              "RelativeToolTip": "Constants\\MenuData.cs",
-              "ViewState": "AgIAAEIAAAAAAAAAAAAAAGIAAAAaAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T10:30:45.706Z"
             }
           ]
         }

+ 111 - 47
backend/.vs/bitforum/v17/DocumentLayout.json

@@ -3,20 +3,36 @@
   "WorkspaceRootPath": "E:\\workspace\\bitforum\\backend\\",
   "Documents": [
     {
-      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\config.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\config.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\faq\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\faq\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\setting\\register.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
-      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\setting\\register.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\controllers\\page\\faq\\categorycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:controllers\\page\\faq\\categorycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\controllers\\setting\\registercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:controllers\\setting\\registercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\views\\faqcategoryviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\views\\faqcategoryviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\user\\applicationuser.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\user\\applicationuser.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\page\\faq\\category.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\faq\\category.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\page\\faq\\item.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\faq\\item.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\models\\page\\document.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:models\\page\\document.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\document\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\document\\index.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|e:\\workspace\\bitforum\\backend\\views\\page\\document\\edit.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+      "RelativeMoniker": "D:0:0:{07B22B2C-9DC6-4B8E-AA16-8F826E758BDD}|bitforum.csproj|solutionrelative:views\\page\\document\\edit.cshtml||{40D31677-CBC0-4297-A9EF-89D907823A98}"
     }
   ],
   "DocumentGroupContainers": [
@@ -26,7 +42,7 @@
       "DocumentGroups": [
         {
           "DockedWidth": 200,
-          "SelectedChildIndex": 8,
+          "SelectedChildIndex": 11,
           "Children": [
             {
               "$type": "Bookmark",
@@ -42,66 +58,114 @@
             },
             {
               "$type": "Bookmark",
-              "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+              "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
             },
             {
               "$type": "Document",
-              "DocumentIndex": 1,
-              "Title": "Register.cshtml",
-              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Setting\\Register.cshtml",
-              "RelativeDocumentMoniker": "Views\\Setting\\Register.cshtml",
-              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Setting\\Register.cshtml",
-              "RelativeToolTip": "Views\\Setting\\Register.cshtml",
-              "ViewState": "AgIAAD0AAAAAAAAAAAAuwHMAAAAtAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
-              "WhenOpened": "2025-01-17T13:55:20.328Z",
+              "DocumentIndex": 2,
+              "Title": "FaqCategoryViewModel.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Views\\FaqCategoryViewModel.cs",
+              "RelativeDocumentMoniker": "Models\\Views\\FaqCategoryViewModel.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Views\\FaqCategoryViewModel.cs",
+              "RelativeToolTip": "Models\\Views\\FaqCategoryViewModel.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAhAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2025-01-17T16:34:07.431Z",
               "EditorCaption": ""
             },
             {
               "$type": "Document",
-              "DocumentIndex": 3,
-              "Title": "ApplicationUser.cs",
-              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\User\\ApplicationUser.cs",
-              "RelativeDocumentMoniker": "Models\\User\\ApplicationUser.cs",
-              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\User\\ApplicationUser.cs",
-              "RelativeToolTip": "Models\\User\\ApplicationUser.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAA==",
+              "DocumentIndex": 4,
+              "Title": "Item.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Item.cs",
+              "RelativeDocumentMoniker": "Models\\Page\\Faq\\Item.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Item.cs",
+              "RelativeToolTip": "Models\\Page\\Faq\\Item.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAB0AAAAbAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T13:51:58.659Z",
+              "WhenOpened": "2025-01-17T16:10:05.653Z",
               "EditorCaption": ""
             },
             {
-              "$type": "Bookmark",
-              "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+              "$type": "Document",
+              "DocumentIndex": 7,
+              "Title": "Edit.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Edit.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Document\\Edit.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Edit.cshtml",
+              "RelativeToolTip": "Views\\Page\\Document\\Edit.cshtml",
+              "ViewState": "AgIAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T16:09:21.702Z",
+              "EditorCaption": ""
             },
             {
-              "$type": "Bookmark",
-              "Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "Index.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Index.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Document\\Index.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Document\\Index.cshtml",
+              "RelativeToolTip": "Views\\Page\\Document\\Index.cshtml",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T16:09:21.109Z",
+              "EditorCaption": ""
             },
             {
               "$type": "Document",
-              "DocumentIndex": 0,
-              "Title": "Config.cs",
-              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Config.cs",
-              "RelativeDocumentMoniker": "Models\\Config.cs",
-              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Config.cs",
-              "RelativeToolTip": "Models\\Config.cs",
-              "ViewState": "AgIAALYAAAAAAAAAAAAuwOIAAAA0AAAAAAAAAA==",
+              "DocumentIndex": 5,
+              "Title": "Document.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Document.cs",
+              "RelativeDocumentMoniker": "Models\\Page\\Document.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Document.cs",
+              "RelativeToolTip": "Models\\Page\\Document.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T13:49:45.122Z",
+              "WhenOpened": "2025-01-17T16:09:17.952Z",
               "EditorCaption": ""
             },
             {
               "$type": "Document",
-              "DocumentIndex": 2,
-              "Title": "RegisterController.cs",
-              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Controllers\\Setting\\RegisterController.cs",
-              "RelativeDocumentMoniker": "Controllers\\Setting\\RegisterController.cs",
-              "ToolTip": "E:\\workspace\\bitforum\\backend\\Controllers\\Setting\\RegisterController.cs",
-              "RelativeToolTip": "Controllers\\Setting\\RegisterController.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAACQAAAAkAAAAAAAAAA==",
+              "DocumentIndex": 3,
+              "Title": "Category.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Category.cs",
+              "RelativeDocumentMoniker": "Models\\Page\\Faq\\Category.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Models\\Page\\Faq\\Category.cs",
+              "RelativeToolTip": "Models\\Page\\Faq\\Category.cs",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABsAAAAbAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+              "WhenOpened": "2025-01-17T15:59:47.814Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "Index.cshtml",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Faq\\Index.cshtml",
+              "RelativeDocumentMoniker": "Views\\Page\\Faq\\Index.cshtml",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Views\\Page\\Faq\\Index.cshtml",
+              "RelativeToolTip": "Views\\Page\\Faq\\Index.cshtml",
+              "ViewState": "AgIAACAAAAAAAAAAAAAQwDoAAAARAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+              "WhenOpened": "2025-01-17T15:56:23.647Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "CategoryController.cs",
+              "DocumentMoniker": "E:\\workspace\\bitforum\\backend\\Controllers\\Page\\Faq\\CategoryController.cs",
+              "RelativeDocumentMoniker": "Controllers\\Page\\Faq\\CategoryController.cs",
+              "ToolTip": "E:\\workspace\\bitforum\\backend\\Controllers\\Page\\Faq\\CategoryController.cs",
+              "RelativeToolTip": "Controllers\\Page\\Faq\\CategoryController.cs",
+              "ViewState": "AgIAAGgAAAAAAAAAAAAAAEQAAAAQAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2025-01-17T13:49:40.547Z",
+              "WhenOpened": "2025-01-17T15:55:02.561Z",
               "EditorCaption": ""
             }
           ]

+ 11 - 8
backend/Controllers/Page/DocumentController.cs

@@ -14,6 +14,9 @@ namespace bitforum.Controllers.Page
         private readonly ILogger<DocumentController> _logger;
         private readonly DefaultDbContext _db;
         private readonly IConfiguration _config;
+        private readonly string _ViewPath = "~/Views/Page/Document/Index.cshtml";
+        private readonly string _WriteViewPath = "~/Views/Page/Document/Write.cshtml";
+        private readonly string _EditViewPath = "~/Views/Page/Document/Edit.cshtml";
 
         public DocumentController(ILogger<DocumentController> logger, DefaultDbContext db, IConfiguration config)
         {
@@ -34,14 +37,14 @@ namespace bitforum.Controllers.Page
             ViewBag.siteURL = _config["AppConfig:AppName"];
             var viewModel = _db.Document.OrderByDescending(c => c.ID).ToList();
 
-            return View("~/Views/Page/Document/Index.cshtml", viewModel);
+            return View(_ViewPath, viewModel);
         }
 
         [HttpGet("Document/Write")]
         public IActionResult Write()
         {
             ViewBag.siteURL = _config["AppConfig:AppName"];
-            return View("~/Views/Page/Document/Write.cshtml");
+            return View(_WriteViewPath);
         }
 
         [HttpPost("Document/Create")]
@@ -81,7 +84,7 @@ namespace bitforum.Controllers.Page
             {
                 _logger.LogError(e, e.Message);
                 TempData["ErrorMessages"] = e.Message;
-                return View("~/Views/Page/Document/Write.cshtml", request);
+                return View(_WriteViewPath, request);
             }
         }
 
@@ -104,13 +107,13 @@ namespace bitforum.Controllers.Page
                     throw new Exception("사용자 정보를 찾을 수 없습니다.");
                 }
 
-                return View("~/Views/Page/Document/Edit.cshtml", document);
+                return View(_EditViewPath, document);
             }
             catch (Exception e)
             {
                 _logger.LogError(e, e.Message);
                 TempData["ErrorMessages"] = e.Message;
-                return RedirectToAction("Edit", new { id = id });
+                return RedirectToAction("Edit", new { id });
             }
         }
 
@@ -138,7 +141,7 @@ namespace bitforum.Controllers.Page
                     throw new Exception("사용자 정보를 찾을 수 없습니다.");
                 }
 
-                document.IsDisplay = request.IsDisplay;
+                document.IsActive = request.IsActive;
                 document.Code = request.Code;
                 document.Subject = request.Subject;
                 document.Content = request.Content;
@@ -161,7 +164,7 @@ namespace bitforum.Controllers.Page
             {
                 _logger.LogError(e, e.Message);
                 TempData["ErrorMessages"] = e.Message;
-                return View("~/Views/Page/Document/Edit.cshtml", request);
+                return View(_EditViewPath, request);
             }
         }
 
@@ -197,7 +200,7 @@ namespace bitforum.Controllers.Page
             {
                 _logger.LogError(e, e.Message);
                 TempData["ErrorMessages"] = e.Message;
-                return View("~/Views/Page/Document/Index.cshtml");
+                return View(_ViewPath);
             }
         }
     }

+ 95 - 22
backend/Controllers/Page/Faq/CategoryController.cs

@@ -1,6 +1,7 @@
 using System.Diagnostics;
 using bitforum.Models;
 using bitforum.Models.Page.Faq;
+using bitforum.Models.Views;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
@@ -13,6 +14,7 @@ namespace bitforum.Controllers.Page
     {
         private readonly ILogger<CategoryController> _logger;
         private readonly DefaultDbContext _db;
+        private readonly string _ViewPath = "~/Views/Page/Faq/Index.cshtml";
 
         public CategoryController(ILogger<CategoryController> logger, DefaultDbContext db)
         {
@@ -29,36 +31,107 @@ namespace bitforum.Controllers.Page
         [HttpGet("Faq")]
         public IActionResult Index()
         {
+            var viewModel = new FaqCategoryViewModel
+            {
+                FaqCategories = _db.FaqCategory .Include(c => c.FaqItem).OrderByDescending(c => c.Order).ToList()
+            };
 
-            return View();
-        }
+            ViewBag.ItemCounts = viewModel.FaqCategories.ToDictionary(
+                category => category.ID,
+                category => category.FaqItem.Count
+            );
 
-        [HttpGet("Faq/Write")]
-        public IActionResult Write()
-        {
-            return View("~/Views/Page/Document/Write.cshtml");
+            return View(_ViewPath, viewModel);
         }
 
-        /*
-        [HttpPost("Faq/Create")]
-        public async Task<IActionResult> Create(FaqCategory request)
+        [HttpPost]
+        public async Task<IActionResult> Save(FaqCategoryViewModel request)
         {
-        }
+            using var transaction = await _db.Database.BeginTransactionAsync();
 
-        [HttpGet("Faq/Edit/{id}")]
-        public async Task<IActionResult> Edit(int id)
-        {
-        }
+            try
+            {
+                if (request.FaqCategories == null || !request.FaqCategories.Any())
+                {
+                    throw new Exception("저장할 데이터가 없습니다.");
+                }
 
-        [HttpPost("Faq/Update")]
-        public async Task<IActionResult> Update(FaqCategory request)
-        {
-        }
+                if (!ModelState.IsValid)
+                {
+                    throw new Exception("유효성 검사에 실패하였습니다.");
+                }
+                
+                var requestIds = request.FaqCategories.Select(x => x.ID).ToList(); // 요청 데이터의 ID 목록
+                var existingIds = await _db.FaqCategory.Select(c => c.ID).ToListAsync(); // 데이터베이스에 존재하는 ID 목록
+                var idsToDelete = existingIds.Except(requestIds).ToList(); // 삭제 대상 ID: 요청 데이터에 없는 항목
 
-        [HttpGet("Faq/Delete/{id}")]
-        public async Task<IActionResult> Delete(int id)
-        {
+                // 삭제 대상 항목 제거
+                if (idsToDelete.Any())
+                {
+                    var rr = await _db.FaqCategory.Where(c => idsToDelete.Contains(c.ID)).ToListAsync();
+                    _db.FaqCategory.RemoveRange(
+                        rr
+                    );
+                }
+
+                foreach (var row in request.FaqCategories)
+                {
+                    // 중복 확인
+                    if (await _db.FaqCategory.AnyAsync(c => c.Code == row.Code && c.ID != row.ID))
+                    {
+                        throw new Exception($"이미 존재하는 Code 주소입니다: {row.Code}");
+                    }
+
+                    if (row.ID == 0)
+                    {
+                        row.UpdatedAt = null;
+                        row.CreatedAt = DateTime.Now;
+                        await _db.FaqCategory.AddAsync(row);
+                    }
+                    else
+                    {
+                        var existing = await _db.FaqCategory.FirstOrDefaultAsync(c => c.ID == row.ID);
+                        if (existing == null)
+                        {
+                            throw new Exception($"ID {row.ID}에 해당하는 데이터가 없습니다.");
+                        }
+
+                        // 기존 엔터티 업데이트
+                        existing.Code = row.Code;
+                        existing.Subject = row.Subject;
+                        existing.Order = row.Order;
+                        existing.IsActive = row.IsActive;
+                        existing.UpdatedAt = DateTime.Now;
+
+                        _db.FaqCategory.Update(existing);
+                    }
+                }
+
+                int affectedRows = await _db.SaveChangesAsync();
+                if (affectedRows <= 0)
+                {
+                    throw new Exception("FAQ 저장 중 오류가 발생했습니다.");
+                }
+
+                await transaction.CommitAsync();
+                string message = "FAQ 분류가 정상적으로 저장되었습니다.";
+                TempData["SuccessMessage"] = message;
+                _logger.LogInformation(message);
+                return RedirectToAction("Index");
+            }
+            catch (DbUpdateException ex)
+            {
+                await transaction.RollbackAsync();
+                _logger.LogError(ex, ex.InnerException?.Message ?? ex.Message);
+                throw new Exception("데이터 저장 중 오류 발생: " + (ex.InnerException?.Message ?? ex.Message));
+            }
+            catch (Exception e)
+            {
+                await transaction.RollbackAsync();
+                _logger.LogError(e, e.Message);
+                TempData["ErrorMessages"] = e.Message;
+                return View(_ViewPath, request);
+            }
         }
-        */
     }
 }

+ 203 - 0
backend/Migrations/DefaultDb/20250117140508_SyncWithExistingDb.Designer.cs

@@ -0,0 +1,203 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20250117140508_SyncWithExistingDb")]
+    partial class SyncWithExistingDb
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "8.0.0")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("bitforum.Models.Config", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Key")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Value")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Key")
+                        .IsUnique();
+
+                    b.ToTable("Config");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Document", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<string>("Content")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisplay")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_Document_Code")
+                        .IsUnique();
+
+                    b.ToTable("Document");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<string>("Content")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_FaqCategory_Code")
+                        .IsUnique();
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqCategory_Order");
+
+                    b.ToTable("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Answer")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("CategoryID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CategoryID");
+
+                    b.HasIndex(new[] { "IsActive" }, "IX_FaqItem_IsActive");
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqItem_Order");
+
+                    b.ToTable("FaqItem");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.HasOne("bitforum.Models.Page.Faq.FaqCategory", "FaqCategory")
+                        .WithMany("FaqItem")
+                        .HasForeignKey("CategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Navigation("FaqItem");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 22 - 0
backend/Migrations/DefaultDb/20250117140508_SyncWithExistingDb.cs

@@ -0,0 +1,22 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    /// <inheritdoc />
+    public partial class SyncWithExistingDb : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+
+        }
+    }
+}

+ 200 - 0
backend/Migrations/DefaultDb/20250117142625_DeleteContentColumnByFaqCategory.Designer.cs

@@ -0,0 +1,200 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20250117142625_DeleteContentColumnByFaqCategory")]
+    partial class DeleteContentColumnByFaqCategory
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "8.0.0")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("bitforum.Models.Config", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Key")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Value")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Key")
+                        .IsUnique();
+
+                    b.ToTable("Config");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Document", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<string>("Content")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisplay")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_Document_Code")
+                        .IsUnique();
+
+                    b.ToTable("Document");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_FaqCategory_Code")
+                        .IsUnique();
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqCategory_Order");
+
+                    b.ToTable("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Answer")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("CategoryID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CategoryID");
+
+                    b.HasIndex(new[] { "IsActive" }, "IX_FaqItem_IsActive");
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqItem_Order");
+
+                    b.ToTable("FaqItem");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.HasOne("bitforum.Models.Page.Faq.FaqCategory", "FaqCategory")
+                        .WithMany("FaqItem")
+                        .HasForeignKey("CategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Navigation("FaqItem");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 28 - 0
backend/Migrations/DefaultDb/20250117142625_DeleteContentColumnByFaqCategory.cs

@@ -0,0 +1,28 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    /// <inheritdoc />
+    public partial class DeleteContentColumnByFaqCategory : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "Content",
+                table: "FaqCategory");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "Content",
+                table: "FaqCategory",
+                type: "nvarchar(max)",
+                nullable: true);
+        }
+    }
+}

+ 203 - 0
backend/Migrations/DefaultDb/20250117153800_UpdateFields.Designer.cs

@@ -0,0 +1,203 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20250117153800_UpdateFields")]
+    partial class UpdateFields
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "8.0.0")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("bitforum.Models.Config", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Key")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Value")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Key")
+                        .IsUnique();
+
+                    b.ToTable("Config");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Document", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<string>("Content")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_Document_Code")
+                        .IsUnique();
+
+                    b.HasIndex(new[] { "IsActive" }, "IX_Document_IsActive")
+                        .IsUnique();
+
+                    b.ToTable("Document");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex(new[] { "Code" }, "IX_FaqCategory_Code")
+                        .IsUnique();
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqCategory_Order");
+
+                    b.ToTable("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Answer")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("CategoryID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CategoryID");
+
+                    b.HasIndex(new[] { "IsActive" }, "IX_FaqItem_IsActive");
+
+                    b.HasIndex(new[] { "Order" }, "IX_FaqItem_Order");
+
+                    b.ToTable("FaqItem");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqItem", b =>
+                {
+                    b.HasOne("bitforum.Models.Page.Faq.FaqCategory", "FaqCategory")
+                        .WithMany("FaqItem")
+                        .HasForeignKey("CategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FaqCategory");
+                });
+
+            modelBuilder.Entity("bitforum.Models.Page.Faq.FaqCategory", b =>
+                {
+                    b.Navigation("FaqItem");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 38 - 0
backend/Migrations/DefaultDb/20250117153800_UpdateFields.cs

@@ -0,0 +1,38 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace bitforum.Migrations.DefaultDb
+{
+    /// <inheritdoc />
+    public partial class UpdateFields : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.RenameColumn(
+                name: "IsDisplay",
+                table: "Document",
+                newName: "IsActive");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Document_IsActive",
+                table: "Document",
+                column: "IsActive",
+                unique: true);
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropIndex(
+                name: "IX_Document_IsActive",
+                table: "Document");
+
+            migrationBuilder.RenameColumn(
+                name: "IsActive",
+                table: "Document",
+                newName: "IsDisplay");
+        }
+    }
+}

+ 4 - 4
backend/Migrations/DefaultDb/DefaultDbContextModelSnapshot.cs

@@ -69,7 +69,7 @@ namespace bitforum.Migrations.DefaultDb
                     b.Property<DateTime?>("CreatedAt")
                         .HasColumnType("datetime2");
 
-                    b.Property<bool>("IsDisplay")
+                    b.Property<bool>("IsActive")
                         .HasColumnType("bit");
 
                     b.Property<string>("Subject")
@@ -88,6 +88,9 @@ namespace bitforum.Migrations.DefaultDb
                     b.HasIndex(new[] { "Code" }, "IX_Document_Code")
                         .IsUnique();
 
+                    b.HasIndex(new[] { "IsActive" }, "IX_Document_IsActive")
+                        .IsUnique();
+
                     b.ToTable("Document");
                 });
 
@@ -104,9 +107,6 @@ namespace bitforum.Migrations.DefaultDb
                         .HasMaxLength(30)
                         .HasColumnType("nvarchar(30)");
 
-                    b.Property<string>("Content")
-                        .HasColumnType("nvarchar(max)");
-
                     b.Property<DateTime?>("CreatedAt")
                         .HasColumnType("datetime2");
 

+ 14 - 2
backend/Models/Page/Document.cs

@@ -1,33 +1,45 @@
 using Microsoft.EntityFrameworkCore;
+using System.ComponentModel;
 using System.ComponentModel.DataAnnotations;
 
 namespace bitforum.Models.Page
 {
     [Index(nameof(Code), Name = "IX_Document_Code", IsUnique = true)]
+    [Index(nameof(IsActive), Name = "IX_Document_IsActive", IsUnique = true)]
     public class Document
     {
         [Key]
         public int ID { get; set; }
 
-        public bool IsDisplay { get; set; } = false;
-
+        [Required]
+        [DisplayName("주소")]
         [DataType(DataType.Text)]
         [MaxLength(30)]
         [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "Code는 영문 및 숫자로만 구성되어야 합니다.")]
         public string Code { get; set; }
 
+        [Required]
+        [DisplayName("제목")]
         [DataType(DataType.Text)]
         [MaxLength(120)]
         public string Subject { get; set; }
 
+        [DisplayName("내용")]
         [DataType(DataType.Html)]
         public string? Content { get; set; } = null;
 
+        [Required]
+        [DisplayName("사용 여부")]
+        public bool IsActive { get; set; } = false;
+
+        [DisplayName("조회 수")]
         public int Views { get; set; } = 0;
 
+        [Display(Name = "수정일시")]
         [DataType(DataType.DateTime)]
         public DateTime? UpdatedAt { get; set; } = null;
 
+        [Display(Name = "등록일시")]
         [DataType(DataType.DateTime)]
         public DateTime? CreatedAt { get; set; } = null;
     }

+ 4 - 6
backend/Models/Page/Faq/Category.cs

@@ -11,21 +11,19 @@ namespace bitforum.Models.Page.Faq
         [Key]
         public int ID { get; set; }
 
+        [Required]
         [DisplayName("주소")]
         [DataType(DataType.Text)]
         [MaxLength(30)]
         [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "Code는 영문 및 숫자로만 구성되어야 합니다.")]
         public string Code { get; set; }
 
-        [DisplayName("제목")]
+        [Required]
+        [DisplayName("분류 명")]
         [DataType(DataType.Text)]
         [MaxLength(255)]
         public string Subject { get; set; }
 
-        [DisplayName("내용")]
-        [DataType(DataType.Html)]
-        public string? Content { get; set; } = null;
-
         [Required]
         [DisplayName("순서")]
         public int Order { get; set; } = 0;
@@ -42,6 +40,6 @@ namespace bitforum.Models.Page.Faq
         [DataType(DataType.DateTime)]
         public DateTime? CreatedAt { get; set; } = null;
 
-        public virtual List<FaqItem> FaqItem { get; set; }
+        public virtual List<FaqItem> FaqItem { get; set; } = new List<FaqItem>();
     }
 }

+ 1 - 1
backend/Models/Page/Faq/Item.cs

@@ -45,6 +45,6 @@ namespace bitforum.Models.Page.Faq
         [DataType(DataType.DateTime)]
         public DateTime? CreatedAt { get; set; } = null;
 
-        public virtual FaqCategory FaqCategory { get; set; }
+        public virtual FaqCategory FaqCategory { get; set; } = new FaqCategory();
     }
 }

+ 9 - 0
backend/Models/Views/FaqCategoryViewModel.cs

@@ -0,0 +1,9 @@
+using bitforum.Models.Page.Faq;
+
+namespace bitforum.Models.Views
+{
+    public class FaqCategoryViewModel
+    {
+        public List<FaqCategory> FaqCategories { get; set; } = new List<FaqCategory>();
+    }
+}

+ 3 - 3
backend/Views/Page/Document/Edit.cshtml

@@ -14,14 +14,14 @@
         <input type="hidden" asp-for="ID" />
 
         <div class="row mb-2">
-            <label for="IsDisplay" class="col-sm-2 col-form-label">사용 여부</label>
+            <label for="IsActive" class="col-sm-2 col-form-label">사용 여부</label>
             <div class="col-sm-10 align-content-center">
                 <div class="form-check-inline">
-                    <input type="checkbox" asp-for="IsDisplay" class="form-check-input" />
+                    <input type="checkbox" asp-for="IsActive" class="form-check-input" />
                     <label class="form-check-label" for="IsDisplay">
                         사용합니다.
                     </label>
-                    <span asp-validation-for="IsDisplay" class="text-danger"></span>
+                    <span asp-validation-for="IsActive" class="text-danger"></span>
                 </div>
             </div>
         </div>

+ 1 - 1
backend/Views/Page/Document/Index.cshtml

@@ -3,7 +3,7 @@
     ViewData["Title"] = "문서 관리";
 }
 
-<div class="container">
+<div class="container-fluid">
     <h3>@ViewData["Title"]</h3>
     <hr />
 

+ 3 - 3
backend/Views/Page/Document/Write.cshtml

@@ -12,14 +12,14 @@
 
     <form name="f_admin_write" id="fAdminWrite" method="post" accept-charset="utf-8" autocomplete="off" asp-controller="Document" asp-action="Create">
         <div class="row mb-2">
-            <label for="IsDisplay" class="col-sm-2 col-form-label">사용 여부</label>
+            <label for="IsActive" class="col-sm-2 col-form-label">사용 여부</label>
             <div class="col-sm-10 align-content-center">
                 <div class="form-check-inline">
-                    <input type="checkbox" asp-for="IsDisplay" class="form-check-input" />
+                    <input type="checkbox" asp-for="IsActive" class="form-check-input" />
                     <label class="form-check-label" for="IsDisplay">
                         사용합니다.
                     </label>
-                    <span asp-validation-for="IsDisplay" class="text-danger"></span>
+                    <span asp-validation-for="IsActive" class="text-danger"></span>
                 </div>
             </div>
         </div>

+ 151 - 32
backend/Views/Page/Faq/Index.cshtml

@@ -1,9 +1,10 @@
-@model List<bitforum.Models.Page.Document>
+@model bitforum.Models.Views.FaqCategoryViewModel
 @{
-    ViewData["Title"] = "문서 관리";
+    ViewData["Title"] = "FAQ 관리";
+    var total = (Model?.FaqCategories?.Count ?? 0).ToString("N0");
 }
 
-<div class="container">
+<div class="container-fluid">
     <h3>@ViewData["Title"]</h3>
     <hr />
 
@@ -11,65 +12,83 @@
 
     <div class="row g-2 align-items-end">
         <div class="col">
-            Total : @((Model?.Count ?? 0).ToString("N0"))
+            Total : @total
         </div>
         <div class="col text-end">
-            <a class="btn btn-sm btn-success" asp-controller="Document" asp-action="Write">새로등록</a>
+            <button type="button" id="btnAdd" class="btn btn-sm btn-primary" form="fAdminWrite">추가</button>
+            <button type="submit" id="btnSave" class="btn btn-sm btn-success" form="fAdminWrite">저장</button>
         </div>
     </div>
 
     <div class="table-responsive">
+        <form id="fAdminWrite" asp-action="Save" method="post" accept-charset="utf-8" autocomplete="off"></form>
+
         <table class="table table-striped table-bordered table-hover mt-3">
             <colgroup>
-                <col width="5%"/>
-                <col width="*"/>
-                <col width="25%"/>
-                <col width="10%"/>
-                <col width="9%"/>
-                <col width="9%"/>
-                <col width="8%"/>
+                <col width="5%" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
+                <col width="*" />
             </colgroup>
             <thead>
                 <tr class="text-center">
                     <th>ID</th>
-                    <th>제목</th>
-                    <th>주소</th>
-                    <th>조회 수</th>
+                    <th>Code</th>
+                    <th>분류 명</th>
+                    <th>게시글 수</th>
+                    <th>순서</th>
+                    <th>사용</th>
                     <th>등록일시</th>
                     <th>수정일시</th>
                     <th>비고</th>
                 </tr>
             </thead>
-            <tbody>
-                @if (Model == null || !Model.Any())
+            <tbody id="categories">
+                @if (Model?.FaqCategories == null || !Model.FaqCategories.Any())
                 {
                     <tr>
-                        <td colspan="7" class="text-center align-middle">No Data.</td>
+                        <td colspan="9" class="text-center align-middle">No Data.</td>
                     </tr>
                 }
                 else
                 {
-                    @foreach (var row in Model)
+                    @foreach (var row in Model.FaqCategories)
                     {
-                        string url = $"https://{ViewBag.siteURL}/{row.Code}";
+                        var index = Model.FaqCategories.IndexOf(row);
+                        var faqItemRows = (ViewBag?.ItemCounts != null && ViewBag.ItemCounts.ContainsKey(row.ID) ? ViewBag.ItemCounts[row.ID] : 0);
 
-                        <tr class="text-center align-middle">
-                            <td>@row.ID</td>
-                            <td>@row.Subject</td>
+                        <tr class="align-middle text-center">
+                            <td>
+                                <input type="text" name="FaqCategories[@index].ID" readonly class="form-control-plaintext text-center" required form="fAdminWrite" value="@row.ID" />
+                            </td>
                             <td>
-                                <a href="@url" target="_blank" rel="external">
-                                    @url
-                                </a>
+                                <input type="text" name="FaqCategories[@index].Code" class="form-control" maxlength="30" required form="fAdminWrite" value="@row.Code" />
                             </td>
-                            <td>@row.Views</td>
-                            <td>@row.CreatedAt</td>
-                            <td>@row.UpdatedAt</td>
                             <td>
-                                <div class="d-grid gap-2">
-                                    <a class="btn btn-sm btn-info text-white" asp-controller="Document" asp-action="Edit" asp-route-id="@row.ID">수정</a>
-                                    <a class="btn btn-sm btn-danger text-white btn-delete-row" asp-controller="Document" asp-action="Delete" asp-route-id="@row.ID">삭제</a>
+                                <input type="text" name="FaqCategories[@index].Subject" class="form-control" maxlength="255" required form="fAdminWrite" value="@row.Subject" />
+                            </td>
+                            <td>@faqItemRows</td>
+                            <td>
+                                <input type="number" name="FaqCategories[@index].Order" class="form-control" min="-999" max="999" required form="fAdminWrite" value="@row.Order" />
+                            </td>
+                            <td>
+                                <div class="form-check-inline">
+                                    <input class="form-check-input" type="checkbox" id="FaqCategories_@(index)_IsActive" name="FaqCategories[@index].IsActive" @(Model.FaqCategories[index].IsActive ? "checked" : "") form="fAdminWrite" value="true" />
+                                    <label class="form-check-label" for="FaqCategories_@(index)_IsActive">
+                                        사용
+                                    </label>
                                 </div>
                             </td>
+                            <td><input type="text" name="FaqCategories[@index].CreatedAt" readonly class="form-control-plaintext text-center" form="fAdminWrite" value="@row.CreatedAt" /></td>
+                            <td><input type="text" name="FaqCategories[@index].UpdatedAt" readonly class="form-control-plaintext text-center" form="fAdminWrite" value="@row.UpdatedAt" /></td>
+                            <td>
+                                <button type="button" class="btn btn-danger btn-sm btn-delete">삭제</button>
+                            </td>
                         </tr>
                     }
                 }
@@ -77,3 +96,103 @@
         </table>
     </div>
 </div>
+
+<script type="module">
+    $(function() {
+        let $categories = $("#categories");
+        let total = Number(@total);
+
+        // 추가
+        $(document).on("click", "#btnAdd", function() {
+            if (total <= 0) {
+                $categories.empty();
+            }
+
+            let tableRow = `
+                <tr class="align-middle text-center">
+                    <td>-</td>
+                    <td>
+                        <input type="text" name="FaqCategories[${total}].Code" class="form-control" maxlength="30" required form="fAdminWrite" />
+                    </td>
+                    <td>
+                        <input type="text" name="FaqCategories[${total}].Subject" class="form-control" maxlength="255" required form="fAdminWrite" />
+                    </td>
+                    <td>-</td>
+                    <td>
+                        <input type="number" name="FaqCategories[${total}].Order" class="form-control" min="-999" max="999" required form="fAdminWrite" />
+                    </td>
+                    <td>
+                        <div class="form-check-inline">
+                            <input class="form-check-input" type="checkbox" id="FaqCategories_${total}_IsActive" name="FaqCategories[${total}].IsActive" checked form="fAdminWrite" value="true" />
+                            <label class="form-check-label" for="FaqCategories_${total}_IsActive">
+                                사용
+                            </label>
+                        </div>
+                    </td>
+                    <td>-</td>
+                    <td>-</td>
+                    <td>
+                        <button type="button" class="btn btn-danger btn-sm btn-delete">삭제</button>
+                    </td>
+                </tr>
+            `;
+
+            $categories.append(tableRow);
+            total++;
+            recalculateIndices();
+        });
+
+        // 삭제
+        $(document).on("click", "button.btn-delete", function(e) {
+            e.target.closest("tr").remove();
+            total--;
+
+            if (total <= 0) {
+                $categories.append(
+                    `<tr><td colspan="9" class="text-center align-middle">No Data.</td></tr>`
+                );
+                total = 0;
+             } else {
+                recalculateIndices();
+             }
+        });
+
+        // 저장
+        $(document).on("click", "#btnSave", function() {
+            if (confirm("저장 하시겠습니까?")) {
+                document.getElementById("fAdminWrite").submit();
+            }
+            return false;
+        });
+
+        // 인덱스 재계산 함수
+        function recalculateIndices() {
+            $categories.find("tr").each(function(index, tr) {
+                $(tr)
+                    .find("input, label")
+                    .each(function() {
+                        let name = $(this).attr("name");
+                        let id = $(this).attr("id");
+
+                        if (name) {
+                            $(this).attr("name", name.replace(/\[\d+\]/, `[${index}]`));
+                        }
+
+                        if (id) {
+                            $(this).attr("id", id.replace(/_\d+_/, `_${index}_`));
+                        }
+                    });
+
+                // 인덱스 기반으로 라벨의 `for` 속성도 수정
+                $(tr)
+                    .find("label")
+                    .each(function() {
+                        let labelFor = $(this).attr("for");
+                        if (labelFor) {
+                            $(this).attr("for", labelFor.replace(/_\d+_/, `_${index}_`));
+                        }
+                    });
+            });
+        }
+    });
+</script>

BIN
backend/bin/Debug/net8.0/bitforum.dll


BIN
backend/bin/Debug/net8.0/bitforum.exe


BIN
backend/bin/Debug/net8.0/bitforum.pdb


BIN
backend/obj/Debug/net8.0/apphost.exe


+ 4 - 5
backend/obj/Debug/net8.0/bitforum.AssemblyInfo.cs

@@ -1,10 +1,9 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     이 코드는 도구를 사용하여 생성되었습니다.
-//     런타임 버전:4.0.30319.42000
+//     This code was generated by a tool.
 //
-//     파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
-//     이러한 변경 내용이 손실됩니다.
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
@@ -15,7 +14,7 @@ using System.Reflection;
 [assembly: System.Reflection.AssemblyCompanyAttribute("bitforum")]
 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d0dac867f954604339372cf0cc37d6b3ae08dbb3")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9bb28e4b1894457fa7b529c5db64fe8bd27103f2")]
 [assembly: System.Reflection.AssemblyProductAttribute("bitforum")]
 [assembly: System.Reflection.AssemblyTitleAttribute("bitforum")]
 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

+ 1 - 1
backend/obj/Debug/net8.0/bitforum.AssemblyInfoInputs.cache

@@ -1 +1 @@
-e6ec48d21fa2a2b16952a30d8812051d863652b2d76fe16cb95efb05fc2f0387
+96e111cad15f8680d7cd8721d345d39de8d7fb605f744f0995b09fbe0794a016

+ 1 - 1
backend/obj/Debug/net8.0/bitforum.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-c5b279fecc0a2a5e5fc321eb8eb9114a86197051585e88cafa83fddc8abff7d8
+2a60147307099777cd9f328ca5b2f06604d6db929516b44f01addedfb6000f2e

+ 1 - 0
backend/obj/Debug/net8.0/bitforum.csproj.FileListAbsolute.txt

@@ -262,3 +262,4 @@ E:\workspace\bitforum\backend\obj\Debug\net8.0\refint\bitforum.dll
 E:\workspace\bitforum\backend\obj\Debug\net8.0\bitforum.pdb
 E:\workspace\bitforum\backend\obj\Debug\net8.0\bitforum.genruntimeconfig.cache
 E:\workspace\bitforum\backend\obj\Debug\net8.0\ref\bitforum.dll
+E:\workspace\bitforum\backend\obj\Debug\net8.0\staticwebassets.upToDateCheck.txt

BIN
backend/obj/Debug/net8.0/bitforum.dll


BIN
backend/obj/Debug/net8.0/bitforum.pdb


BIN
backend/obj/Debug/net8.0/ref/bitforum.dll


BIN
backend/obj/Debug/net8.0/refint/bitforum.dll


Diferenças do arquivo suprimidas por serem muito extensas
+ 212 - 212
backend/obj/Debug/net8.0/staticwebassets.build.json


+ 293 - 0
backend/obj/Debug/net8.0/staticwebassets.upToDateCheck.txt

@@ -0,0 +1,293 @@
+wwwroot\css\account.css
+wwwroot\css\account.min.css
+wwwroot\css\admin.css
+wwwroot\css\admin.min.css
+wwwroot\css\site.css
+wwwroot\css\site.min.css
+wwwroot\images\favicon.ico
+wwwroot\js\func.js
+wwwroot\js\site.js
+wwwroot\lib\bootstrap\dist\css\bootstrap.css
+wwwroot\lib\bootstrap\dist\css\bootstrap.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.css
+wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.min.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.css.map
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.min.css
+wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.min.css.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.esm.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.esm.js.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.esm.min.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.esm.min.js.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.js.map
+wwwroot\lib\bootstrap\dist\js\bootstrap.min.js
+wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map
+wwwroot\lib\bootstrap\LICENSE
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.css
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.css.map
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.js
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.js.map
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.umd.js
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5.umd.js.map
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5-content.css
+wwwroot\lib\ckeditor\ckeditor5\ckeditor5-editor.css
+wwwroot\lib\ckeditor\ckeditor5\translations\af.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\af.js
+wwwroot\lib\ckeditor\ckeditor5\translations\af.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ar.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ar.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ar.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ast.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ast.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ast.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\az.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\az.js
+wwwroot\lib\ckeditor\ckeditor5\translations\az.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bg.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\bg.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bg.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bn.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\bn.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bn.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bs.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\bs.js
+wwwroot\lib\ckeditor\ckeditor5\translations\bs.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ca.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ca.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ca.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\cs.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\cs.js
+wwwroot\lib\ckeditor\ckeditor5\translations\cs.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\da.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\da.js
+wwwroot\lib\ckeditor\ckeditor5\translations\da.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\de.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\de.js
+wwwroot\lib\ckeditor\ckeditor5\translations\de.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\de-ch.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\de-ch.js
+wwwroot\lib\ckeditor\ckeditor5\translations\de-ch.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\el.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\el.js
+wwwroot\lib\ckeditor\ckeditor5\translations\el.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\en.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en-au.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\en-au.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en-au.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en-gb.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\en-gb.js
+wwwroot\lib\ckeditor\ckeditor5\translations\en-gb.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\eo.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\eo.js
+wwwroot\lib\ckeditor\ckeditor5\translations\eo.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\es.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\es.js
+wwwroot\lib\ckeditor\ckeditor5\translations\es.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\es-co.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\es-co.js
+wwwroot\lib\ckeditor\ckeditor5\translations\es-co.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\et.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\et.js
+wwwroot\lib\ckeditor\ckeditor5\translations\et.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\eu.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\eu.js
+wwwroot\lib\ckeditor\ckeditor5\translations\eu.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fa.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\fa.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fa.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fi.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\fi.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fi.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fr.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\fr.js
+wwwroot\lib\ckeditor\ckeditor5\translations\fr.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\gl.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\gl.js
+wwwroot\lib\ckeditor\ckeditor5\translations\gl.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\gu.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\gu.js
+wwwroot\lib\ckeditor\ckeditor5\translations\gu.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\he.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\he.js
+wwwroot\lib\ckeditor\ckeditor5\translations\he.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hi.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\hi.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hi.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hr.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\hr.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hr.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hu.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\hu.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hu.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hy.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\hy.js
+wwwroot\lib\ckeditor\ckeditor5\translations\hy.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\id.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\id.js
+wwwroot\lib\ckeditor\ckeditor5\translations\id.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\it.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\it.js
+wwwroot\lib\ckeditor\ckeditor5\translations\it.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ja.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ja.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ja.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\jv.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\jv.js
+wwwroot\lib\ckeditor\ckeditor5\translations\jv.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\kk.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\kk.js
+wwwroot\lib\ckeditor\ckeditor5\translations\kk.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\km.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\km.js
+wwwroot\lib\ckeditor\ckeditor5\translations\km.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\kn.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\kn.js
+wwwroot\lib\ckeditor\ckeditor5\translations\kn.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ko.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ko.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ko.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ku.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ku.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ku.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\lt.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\lt.js
+wwwroot\lib\ckeditor\ckeditor5\translations\lt.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\lv.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\lv.js
+wwwroot\lib\ckeditor\ckeditor5\translations\lv.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ms.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ms.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ms.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\nb.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\nb.js
+wwwroot\lib\ckeditor\ckeditor5\translations\nb.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ne.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ne.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ne.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\nl.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\nl.js
+wwwroot\lib\ckeditor\ckeditor5\translations\nl.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\no.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\no.js
+wwwroot\lib\ckeditor\ckeditor5\translations\no.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\oc.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\oc.js
+wwwroot\lib\ckeditor\ckeditor5\translations\oc.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pl.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\pl.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pl.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pt.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\pt.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pt.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pt-br.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\pt-br.js
+wwwroot\lib\ckeditor\ckeditor5\translations\pt-br.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ro.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ro.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ro.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ru.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ru.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ru.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\si.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\si.js
+wwwroot\lib\ckeditor\ckeditor5\translations\si.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sk.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sk.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sk.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sl.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sl.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sl.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sq.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sq.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sq.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sr.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sr.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sr.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sr-latn.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sr-latn.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sr-latn.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sv.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\sv.js
+wwwroot\lib\ckeditor\ckeditor5\translations\sv.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\th.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\th.js
+wwwroot\lib\ckeditor\ckeditor5\translations\th.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ti.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ti.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ti.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tk.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\tk.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tk.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tr.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\tr.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tr.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tt.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\tt.js
+wwwroot\lib\ckeditor\ckeditor5\translations\tt.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ug.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ug.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ug.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\uk.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\uk.js
+wwwroot\lib\ckeditor\ckeditor5\translations\uk.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ur.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\ur.js
+wwwroot\lib\ckeditor\ckeditor5\translations\ur.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\uz.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\uz.js
+wwwroot\lib\ckeditor\ckeditor5\translations\uz.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\vi.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\vi.js
+wwwroot\lib\ckeditor\ckeditor5\translations\vi.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\zh.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\zh.js
+wwwroot\lib\ckeditor\ckeditor5\translations\zh.umd.js
+wwwroot\lib\ckeditor\ckeditor5\translations\zh-cn.d.ts
+wwwroot\lib\ckeditor\ckeditor5\translations\zh-cn.js
+wwwroot\lib\ckeditor\ckeditor5\translations\zh-cn.umd.js
+wwwroot\lib\ckeditor\index.html
+wwwroot\lib\ckeditor\LICENSE.md
+wwwroot\lib\ckeditor\README.md
+wwwroot\lib\jquery\dist\jquery.js
+wwwroot\lib\jquery\dist\jquery.min.js
+wwwroot\lib\jquery\dist\jquery.min.map
+wwwroot\lib\jquery\LICENSE.txt
+wwwroot\lib\jquery-validation\dist\additional-methods.js
+wwwroot\lib\jquery-validation\dist\additional-methods.min.js
+wwwroot\lib\jquery-validation\dist\jquery.validate.js
+wwwroot\lib\jquery-validation\dist\jquery.validate.min.js
+wwwroot\lib\jquery-validation\LICENSE.md
+wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js
+wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js
+wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff