From eb0750d9fda1da4e4bb33895733a8983165fe16d Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Sun, 9 Nov 2025 16:31:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E5=AE=9E=E7=8E=B0=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD-=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=88=86=E7=B1=BB=E5=88=97=E8=A1=A8=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A8=A1=E6=9D=BF-=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E7=BC=96=E8=BE=91=E5=92=8C=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20-=20=E9=9B=86=E6=88=90=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=94=A8=E4=BA=8E=E7=BC=96=E8=BE=91=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E8=B7=9F=E8=B8=AA=20-=20=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=95=B0=E6=8D=AE=E6=8C=81=E4=B9=85=E5=8C=96=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20-=20=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BB=A5=E5=8C=85=E5=90=AB=E5=88=86=E7=B1=BB=E7=9B=B8?= =?UTF-8?q?=E5=85=B3SQL=E8=84=9A=E6=9C=AC=E8=B7=AF=E5=BE=84=20-=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=88=86=E7=B1=BB=E7=9A=84=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E6=9F=A5=E9=80=BB=E8=BE=91=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E4=BF=9D=E5=AD=98=E5=92=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84SQL=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sportsstore/admin/categories_handler.go | 34 ++++++++++- 32-platform/sportsstore/config.json | 4 +- .../models/repo/sql_category_save.go | 34 +++++++++++ .../sportsstore/models/repo/sql_repo.go | 4 +- 32-platform/sportsstore/models/repository.go | 2 + 32-platform/sportsstore/sql/save_category.sql | 2 + .../sportsstore/sql/update_category.sql | 3 + 32-platform/sportsstore/store.db | Bin 20480 -> 20480 bytes .../templates/admin_categories.html | 57 ++++++++++++++++++ 9 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 32-platform/sportsstore/models/repo/sql_category_save.go create mode 100644 32-platform/sportsstore/sql/save_category.sql create mode 100644 32-platform/sportsstore/sql/update_category.sql create mode 100644 32-platform/sportsstore/templates/admin_categories.html diff --git a/32-platform/sportsstore/admin/categories_handler.go b/32-platform/sportsstore/admin/categories_handler.go index 398f115..25b1b98 100644 --- a/32-platform/sportsstore/admin/categories_handler.go +++ b/32-platform/sportsstore/admin/categories_handler.go @@ -2,15 +2,45 @@ package admin import ( "platform/http/actionresults" + "platform/http/handing" + "platform/sessions" "sportstore/models" + "sportstore/store" ) type CategoriesHandler struct { models.Repository + handing.URLGenerator + sessions.Session } -func (handler CategoriesHandler) GetData() string { - return "This is the categories handler" +type CategoryTemplateContext struct { + Categories []models.Category + EditId int + EditUrl string + SaveUrl string +} + +const CategoryEditKey = "category_edit" + +func (handler CategoriesHandler) GetData() actionresults.ActionResult { + context := CategoryTemplateContext{ + Categories: handler.GetCategories(), + EditId: handler.Session.GetValueDefault(CategoryEditKey, 0).(int), + EditUrl: store.MustGenerateUrl(handler.URLGenerator, CategoriesHandler.PostCategoryEdit), + SaveUrl: store.MustGenerateUrl(handler.URLGenerator, CategoriesHandler.PostCategorySave), + } + return actionresults.NewTemplateAction("admin_categories.html", context) +} + +func (handler CategoriesHandler) PostCategoryEdit(ref EditReference) actionresults.ActionResult { + handler.Session.SetValue(CategoryEditKey, ref.ID) + return actionresults.NewRedirectAction(store.MustGenerateUrl(handler.URLGenerator, AdminHandler.GetSection, "Categories")) +} +func (handler CategoriesHandler) PostCategorySave(c models.Category) actionresults.ActionResult { + handler.SaveCategory(&c) + handler.Session.SetValue(CategoryEditKey, 0) + return actionresults.NewRedirectAction(store.MustGenerateUrl(handler.URLGenerator, AdminHandler.GetSection, "Categories")) } func (handler CategoriesHandler) GetSelect(current int) actionresults.ActionResult { diff --git a/32-platform/sportsstore/config.json b/32-platform/sportsstore/config.json index 26e9bce..b273b22 100644 --- a/32-platform/sportsstore/config.json +++ b/32-platform/sportsstore/config.json @@ -33,7 +33,9 @@ "SaveOrder": "sql/save_order.sql", "SaveOrderLine": "sql/save_order_line.sql", "SaveProduct": "sql/save_product.sql", - "UpdateProduct": "sql/update_product.sql" + "UpdateProduct": "sql/update_product.sql", + "SaveCategory": "sql/save_category.sql", + "UpdateCategory": "sql/update_category.sql" } } } \ No newline at end of file diff --git a/32-platform/sportsstore/models/repo/sql_category_save.go b/32-platform/sportsstore/models/repo/sql_category_save.go new file mode 100644 index 0000000..ee5acdc --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_category_save.go @@ -0,0 +1,34 @@ +package repo + +import "sportstore/models" + +func (repo *SqlRepository) SaveCategory(c *models.Category) { + if c.ID == 0 { + result, err := repo.Commands.SaveCategory.ExecContext(repo.Context, c.CategoryName) + if err != nil { + repo.Logger.Panicf("Cannot exec SaveCategory command: %v ", err.Error()) + return + } + id, err := result.LastInsertId() + if err != nil { + repo.Logger.Panicf("Cannot exec SaveCategory get LastInsertId: %v ", err.Error()) + return + } + c.ID = int(id) + return + } else { + result, err := repo.Commands.UpdateCategory.ExecContext(repo.Context, c.CategoryName, c.ID) + if err != nil { + repo.Logger.Panicf("Cannot exec UpdateCategory command: %v ", err.Error()) + return + } + rowsAffected, err := result.RowsAffected() + if err != nil { + repo.Logger.Panicf("Cannot exec UpdateCategory get RowsAffected: %v ", err.Error()) + return + } + if rowsAffected != 1 { + repo.Logger.Panicf("Got exec UpdateCategory unexpected rows affected: %v ", rowsAffected) + } + } +} diff --git a/32-platform/sportsstore/models/repo/sql_repo.go b/32-platform/sportsstore/models/repo/sql_repo.go index 3e50d8f..0b8c102 100644 --- a/32-platform/sportsstore/models/repo/sql_repo.go +++ b/32-platform/sportsstore/models/repo/sql_repo.go @@ -32,5 +32,7 @@ type SqlCommands struct { SaveOrder, SaveOrderLine, SaveProduct, - UpdateProduct *LoggedStmt + UpdateProduct, + SaveCategory, + UpdateCategory *LoggedStmt } diff --git a/32-platform/sportsstore/models/repository.go b/32-platform/sportsstore/models/repository.go index a9509d6..fe6edbf 100644 --- a/32-platform/sportsstore/models/repository.go +++ b/32-platform/sportsstore/models/repository.go @@ -13,6 +13,8 @@ type Repository interface { GetCategories() []Category + SaveCategory(*Category) + GetOrder(id int) Order GetOrders() []Order diff --git a/32-platform/sportsstore/sql/save_category.sql b/32-platform/sportsstore/sql/save_category.sql new file mode 100644 index 0000000..62a1abc --- /dev/null +++ b/32-platform/sportsstore/sql/save_category.sql @@ -0,0 +1,2 @@ +INSERT INTO Categories (Name) +VALUES (?) \ No newline at end of file diff --git a/32-platform/sportsstore/sql/update_category.sql b/32-platform/sportsstore/sql/update_category.sql new file mode 100644 index 0000000..1326901 --- /dev/null +++ b/32-platform/sportsstore/sql/update_category.sql @@ -0,0 +1,3 @@ +UPDATE Categories +SET Name = ? +WHERE Id = ? \ No newline at end of file diff --git a/32-platform/sportsstore/store.db b/32-platform/sportsstore/store.db index 2527476da69f54b23860810698344efc2bab185b..09f65e73b7f2bae5ee12fd70e705f48dcdb6fc8e 100644 GIT binary patch delta 166 zcmZozz}T>Wae}mOG!8J`m$8_<$Byp!4V Lc5dEp=O_pOQ-3kv delta 179 zcmZozz}T>Wae}m<5(5JRD-grLzKJ@ + + + Id + Name + + + + + {{ range $context.Categories }} + + {{ if ne $context.EditId .ID }} + + {{ .ID }} + {{ .CategoryName }} + +
+ + +
+ + + {{ else }} + +
+ + + + + +
+ + {{ end }} + + + {{ end }} + + {{ if eq $context.EditId 0 }} + + + Add New Product + + +
+ - + + + + +
+ + + {{ end }} + \ No newline at end of file