From 15e8626280981d1d8a6583daba9bef6b11ed5dcc Mon Sep 17 00:00:00 2001
From: Marek Goc
Date: Mon, 23 Mar 2026 14:04:53 +0100
Subject: [PATCH] routing
---
app/model/product.go | 29 ++--
app/repos/categoriesRepo/categoriesRepo.go | 15 +--
app/service/menuService/menuService.go | 10 +-
bo/components.d.ts | 1 +
bo/src/layouts/default.vue | 52 ++++++-
bo/src/layouts/empty.vue | 2 +-
bo/src/router/index.ts | 81 ++++++++---
bo/src/router/menu.ts | 8 ++
bo/src/views/CategoryView.vue | 21 +++
bo/src/views/LoginView.vue | 5 +-
bo/src/views/NotFoundView.vue | 7 +
bo/src/views/PasswordRecoveryView.vue | 119 ++++++++--------
bo/src/views/RegisterView.vue | 4 +
bo/src/views/ResetPasswordForm.vue | 147 ++++++++++----------
bo/src/views/VerifyEmailView.vue | 150 +++++++++++----------
15 files changed, 401 insertions(+), 250 deletions(-)
create mode 100644 bo/src/router/menu.ts
create mode 100644 bo/src/views/CategoryView.vue
create mode 100644 bo/src/views/NotFoundView.vue
diff --git a/app/model/product.go b/app/model/product.go
index eb63f68..3c8faae 100644
--- a/app/model/product.go
+++ b/app/model/product.go
@@ -82,18 +82,27 @@ type ProductFilters struct {
}
type ScannedCategory struct {
- CategoryID uint `gorm:"column:ID;primaryKey"`
- Name string `gorm:"column:name"`
- Active uint `gorm:"column:active"`
- Position uint `gorm:"column:position"`
- ParentID uint `gorm:"column:id_parent"`
- IsRoot uint `gorm:"column:is_root_category"`
+ CategoryID uint `gorm:"column:ID;primaryKey"`
+ Name string `gorm:"column:name"`
+ Active uint `gorm:"column:active"`
+ Position uint `gorm:"column:position"`
+ ParentID uint `gorm:"column:id_parent"`
+ IsRoot uint `gorm:"column:is_root_category"`
+ LinkRewrite string `gorm:"column:link_rewrite"`
+ IsoCode string `gorm:"column:iso_code"`
}
type Category struct {
- CategoryID uint `json:"category_id" form:"category_id"`
- Name string `json:"name" form:"name"`
- Active uint `json:"active" form:"active"`
- Subcategories []Category `json:"subcategories" form:"subcategories"`
+ CategoryID uint `json:"category_id" form:"category_id"`
+ Label string `json:"label" form:"label"`
+ // Active bool `json:"active" form:"active"`
+ Params CategpryParams `json:"params" form:"params"`
+ Children []Category `json:"children" form:"children"`
+}
+
+type CategpryParams struct {
+ CategoryID uint `json:"category_id" form:"category_id"`
+ LinkRewrite string `json:"link_rewrite" form:"link_rewrite"`
+ Locale string `json:"locale" form:"locale"`
}
type FeatVal = map[uint][]uint
diff --git a/app/repos/categoriesRepo/categoriesRepo.go b/app/repos/categoriesRepo/categoriesRepo.go
index 1713441..1556f59 100644
--- a/app/repos/categoriesRepo/categoriesRepo.go
+++ b/app/repos/categoriesRepo/categoriesRepo.go
@@ -26,15 +26,14 @@ func (repo *CategoriesRepo) GetAllCategories(id_lang uint) ([]model.ScannedCateg
ps_category.active AS active,
ps_category_shop.position AS position,
ps_category.id_parent AS id_parent,
- ps_category.is_root_category AS is_root_category
+ ps_category.is_root_category AS is_root_category,
+ ps_category_lang.link_rewrite AS link_rewrite,
+ ps_lang.iso_code AS iso_code
FROM ps_category
- LEFT JOIN ps_category_lang
- ON ps_category_lang.id_category = ps_category.id_category
- AND ps_category_lang.id_shop = ?
- AND ps_category_lang.id_lang = ?
- LEFT JOIN ps_category_shop
- ON ps_category_shop.id_category = ps_category.id_category
- AND ps_category_shop.id_shop = ?`,
+ LEFT JOIN ps_category_lang ON ps_category_lang.id_category = ps_category.id_category AND ps_category_lang.id_shop = ? AND ps_category_lang.id_lang = ?
+ LEFT JOIN ps_category_shop ON ps_category_shop.id_category = ps_category.id_category AND ps_category_shop.id_shop = ?
+ JOIN ps_lang ON ps_lang.id_lang = ps_category_lang.id_lang
+ `,
constdata.SHOP_ID, id_lang, constdata.SHOP_ID).
Scan(&allCategories).Error
diff --git a/app/service/menuService/menuService.go b/app/service/menuService/menuService.go
index 13a6a89..1244075 100644
--- a/app/service/menuService/menuService.go
+++ b/app/service/menuService/menuService.go
@@ -64,7 +64,7 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate
node := s.scannedToNormalCategory((*all_categories)[index])
for i := 0; i < len((*children_indices)[index]); i++ {
- node.Subcategories = append(node.Subcategories, s.createTree((*children_indices)[index][i].Index, all_categories, children_indices))
+ node.Children = append(node.Children, s.createTree((*children_indices)[index][i].Index, all_categories, children_indices))
}
return node
@@ -72,10 +72,12 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate
func (s *MenuService) scannedToNormalCategory(scanned model.ScannedCategory) model.Category {
var normal model.Category
- normal.Active = scanned.Active
+ // normal.Active = scanned.Active
normal.CategoryID = scanned.CategoryID
- normal.Name = scanned.Name
- normal.Subcategories = []model.Category{}
+ normal.Label = scanned.Name
+ // normal.Active = scanned.Active == 1
+ normal.Params = model.CategpryParams{CategoryID: normal.CategoryID, LinkRewrite: scanned.LinkRewrite, Locale: scanned.IsoCode}
+ normal.Children = []model.Category{}
return normal
}
diff --git a/bo/components.d.ts b/bo/components.d.ts
index 622aa17..3425316 100644
--- a/bo/components.d.ts
+++ b/bo/components.d.ts
@@ -41,6 +41,7 @@ declare module 'vue' {
UInput: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Input.vue')['default']
UInputNumber: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/InputNumber.vue')['default']
UModal: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Modal.vue')['default']
+ UNavigationMenu: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/NavigationMenu.vue')['default']
UPagination: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Pagination.vue')['default']
USelect: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/Select.vue')['default']
USelectMenu: typeof import('./node_modules/@nuxt/ui/dist/runtime/components/SelectMenu.vue')['default']
diff --git a/bo/src/layouts/default.vue b/bo/src/layouts/default.vue
index 1e86a0a..9f19d9e 100644
--- a/bo/src/layouts/default.vue
+++ b/bo/src/layouts/default.vue
@@ -1,14 +1,56 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bo/src/layouts/empty.vue b/bo/src/layouts/empty.vue
index e8cfec0..e665e66 100644
--- a/bo/src/layouts/empty.vue
+++ b/bo/src/layouts/empty.vue
@@ -1,7 +1,7 @@
-
+
\ No newline at end of file
diff --git a/bo/src/views/LoginView.vue b/bo/src/views/LoginView.vue
index 20cec7b..f85d2c3 100644
--- a/bo/src/views/LoginView.vue
+++ b/bo/src/views/LoginView.vue
@@ -4,8 +4,8 @@ import { useRouter, useRoute } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { useValidation } from '@/composable/useValidation'
import type { FormError } from '@nuxt/ui'
-import { useI18n } from 'vue-i18n'
import { i18n } from '@/plugins/02_i18n'
+import Empty from '@/layouts/empty.vue'
const router = useRouter()
const route = useRoute()
@@ -52,9 +52,11 @@ const PrivacyComponent = computed(() =>
import(`@/components/terms/${i18n.locale.value}_PrivacyPolicyView.vue`).catch(() => import('@/components/terms/en_PrivacyPolicyView.vue')),
),
)
+
+
@@ -163,4 +165,5 @@ const PrivacyComponent = computed(() =>
+
diff --git a/bo/src/views/NotFoundView.vue b/bo/src/views/NotFoundView.vue
new file mode 100644
index 0000000..4e3e4fc
--- /dev/null
+++ b/bo/src/views/NotFoundView.vue
@@ -0,0 +1,7 @@
+
+
+
404
+
Page not found
+
Go back home
+
+
\ No newline at end of file
diff --git a/bo/src/views/PasswordRecoveryView.vue b/bo/src/views/PasswordRecoveryView.vue
index dd8fada..265011c 100644
--- a/bo/src/views/PasswordRecoveryView.vue
+++ b/bo/src/views/PasswordRecoveryView.vue
@@ -5,6 +5,7 @@ import { useAuthStore } from '@/stores/auth'
import { useValidation } from '@/composable/useValidation'
import type { FormError } from '@nuxt/ui'
import { i18n } from '@/plugins/02_i18n'
+import Empty from '@/layouts/empty.vue'
const router = useRouter()
const authStore = useAuthStore()
@@ -36,70 +37,74 @@ function validate(): FormError[] {
-
-
-
-
+
+
-
+
-
-
-
-
{{ $t('general.check_your_email') }}
-
- {{ $t('general.password_reset_link_sent_notice') }}
-
-
- {{ $t('general.back_to_sign_in') }}
-
-
-
+
+
+
+
{{ $t('general.check_your_email') }}
+
+ {{ $t('general.password_reset_link_sent_notice') }}
+
+
+ {{ $t('general.back_to_sign_in') }}
+
+
+
-
-
-
- {{ $t('general.enter_email_for_password_reset') }}
-
-
+
+
+
+ {{ $t('general.enter_email_for_password_reset') }}
+
+
-
-
+
+
-
-
-
+
+
+
-
- {{ $t('general.send_password_reset_link') }}
-
-
+
+ {{ $t('general.send_password_reset_link') }}
+
+
-
-
-
- {{ $t('general.dont_have_an_account') }}
-
+
+
-
+
diff --git a/bo/src/views/RegisterView.vue b/bo/src/views/RegisterView.vue
index 71dc802..e329afc 100644
--- a/bo/src/views/RegisterView.vue
+++ b/bo/src/views/RegisterView.vue
@@ -1,4 +1,5 @@
+
@@ -110,6 +111,7 @@
+
-
-
-
-
-
-
-
-
- {{ $t('general.password_updated') }}
-
-
- {{ $t('general.password_updated_description') }}
-
-
- {{ $t('general.back_to_sign_in') }}
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('general.reset_password') }}
-
-
-
-
-
+
+
+
+
+ {{ $t('general.password_updated') }}
+
+
+ {{ $t('general.password_updated_description') }}
+
+
{{ $t('general.back_to_sign_in') }}
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('general.reset_password') }}
+
+
+
+
+
+ {{ $t('general.back_to_sign_in') }}
+
+
+
+
+
-
+
diff --git a/bo/src/views/VerifyEmailView.vue b/bo/src/views/VerifyEmailView.vue
index 11b594c..2aa281a 100644
--- a/bo/src/views/VerifyEmailView.vue
+++ b/bo/src/views/VerifyEmailView.vue
@@ -4,6 +4,7 @@ import { useRouter, useRoute } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useFetchJson } from '@/composable/useFetchJson'
import { i18n } from '@/plugins/02_i18n'
+import Empty from '@/layouts/empty.vue'
const { t, te } = useI18n()
const router = useRouter()
@@ -66,81 +67,84 @@ function goToLogin() {
-
-
-
-
-
-
+
+
+
+
+
-
TimeTracker
+
+
+
+
+
+
+
+ {{ $t('verify_email.verifying') }}
+
+
+
+
+
+
+
+ {{ $t('verify_email.success_title') }}
+
+
+ {{ $t('verify_email.success_message') }}
+
+
+
+
+
+
+
+ {{ $t('verify_email.error_title') }}
+
+
+ {{ $t('verify_email.error_message') }}
+
+
+
+
+
+
+
{{ $t('verify_email.redirect_message') }}
+
{{ $t('verify_email.go_to_login') }}
+
+
+
+ {{ $t('verify_email.go_to_login') }}
+
+
+
+
{{ $t('verify_email.please_wait') }}
+
+
+
+
+
+ {{ $t('verify_email.already_registered') }}
+ {{
+ $t('general.sign_in')
+ }}
+
+
+
+
+
-
-
-
-
-
-
-
- {{ $t('verify_email.verifying') }}
-
-
-
-
-
-
-
- {{ $t('verify_email.success_title') }}
-
-
- {{ $t('verify_email.success_message') }}
-
-
-
-
-
-
-
- {{ $t('verify_email.error_title') }}
-
-
- {{ $t('verify_email.error_message') }}
-
-
-
-
-
-
-
{{ $t('verify_email.redirect_message') }}
-
{{ $t('verify_email.go_to_login') }}
-
-
-
- {{ $t('verify_email.go_to_login') }}
-
-
-
-
{{ $t('verify_email.please_wait') }}
-
-
-
-
-
- {{ $t('verify_email.already_registered') }}
- {{ $t('general.sign_in')
- }}
-
-
-
-
-
-
+