feat: polish admin UI, phone login, and product details

Switch admin auth to mobile, restyle shell/login with Vuesax icons, and add product detail fields plus public product pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
S. Esmaeili
2026-10-22 17:18:17 +03:30
co-authored by Cursor
parent 789d224ea0
commit 49f30a96b1
54 changed files with 3632 additions and 574 deletions
@@ -0,0 +1,13 @@
-- AlterTable
ALTER TABLE "Product" ADD COLUMN "applications" TEXT[] DEFAULT ARRAY[]::TEXT[],
ADD COLUMN "attributes" JSONB NOT NULL DEFAULT '[]',
ADD COLUMN "brand" TEXT NOT NULL DEFAULT '',
ADD COLUMN "details" TEXT NOT NULL DEFAULT '',
ADD COLUMN "features" TEXT[] DEFAULT ARRAY[]::TEXT[],
ADD COLUMN "minOrder" TEXT NOT NULL DEFAULT '',
ADD COLUMN "origin" TEXT NOT NULL DEFAULT '',
ADD COLUMN "packaging" TEXT NOT NULL DEFAULT '',
ADD COLUMN "seoDescription" TEXT NOT NULL DEFAULT '',
ADD COLUMN "seoTitle" TEXT NOT NULL DEFAULT '',
ADD COLUMN "sizes" TEXT[] DEFAULT ARRAY[]::TEXT[],
ADD COLUMN "standards" TEXT[] DEFAULT ARRAY[]::TEXT[];
@@ -0,0 +1,3 @@
-- Rename login identifier from email to phone
ALTER TABLE "AdminUser" RENAME COLUMN "email" TO "phone";
ALTER INDEX "AdminUser_email_key" RENAME TO "AdminUser_phone_key";
+16 -1
View File
@@ -22,7 +22,7 @@ enum MessageStatus {
model AdminUser {
id Int @id @default(autoincrement())
email String @unique
phone String @unique
name String
passwordHash String
role Role @default(EDITOR)
@@ -114,6 +114,21 @@ model Product {
desc String @default("")
specs String[]
variants String[]
/// long description for the product page; a blank line starts a new paragraph
details String @default("")
brand String @default("")
/// country of manufacture
origin String @default("")
sizes String[] @default([])
standards String[] @default([])
features String[] @default([])
applications String[] @default([])
/// technical specification table: [{ "name": "...", "value": "..." }]
attributes Json @default("[]")
packaging String @default("")
minOrder String @default("")
seoTitle String @default("")
seoDescription String @default("")
imageId Int?
image Media? @relation("ProductImage", fields: [imageId], references: [id], onDelete: SetNull)
gallery ProductImage[]