From 436948ed3212129795686c57d065b3ad1f734de7 Mon Sep 17 00:00:00 2001 From: jinsir <874871581@qq.com> Date: Sun, 23 Feb 2025 20:23:18 +0800 Subject: [PATCH 1/4] xxx --- .../department/department.controller.ts | 2 +- .../src/models/goods/goods.controller.ts | 41 +++++++++++++ apps/server/src/models/goods/goods.module.ts | 13 ++++ apps/server/src/models/goods/goods.service.ts | 4 ++ apps/server/src/trpc/trpc.module.ts | 2 + apps/web/src/app/main/home/page.tsx | 61 ++++++++++++++++--- config/nginx/conf.d/web.conf | 9 +-- package.json | 3 +- packages/common/prisma/schema.prisma | 50 +++++++++++++-- 9 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 apps/server/src/models/goods/goods.controller.ts create mode 100644 apps/server/src/models/goods/goods.module.ts create mode 100644 apps/server/src/models/goods/goods.service.ts diff --git a/apps/server/src/models/department/department.controller.ts b/apps/server/src/models/department/department.controller.ts index 7c4f063..c871c58 100755 --- a/apps/server/src/models/department/department.controller.ts +++ b/apps/server/src/models/department/department.controller.ts @@ -84,4 +84,4 @@ export class DepartmentController { }; } } -} +} \ No newline at end of file diff --git a/apps/server/src/models/goods/goods.controller.ts b/apps/server/src/models/goods/goods.controller.ts new file mode 100644 index 0000000..f14b858 --- /dev/null +++ b/apps/server/src/models/goods/goods.controller.ts @@ -0,0 +1,41 @@ +import { Controller, Get, Query, Param } from '@nestjs/common'; + +@Controller('goods') +export class GoodsController { + constructor() { + console.log('goods controller') + } + + // 示例1:基本查询参数 + @Get('hello') + getHello(@Query('name') name?: string) { + return { + message: 'Hello World!', + name: name || 'Guest' + }; + } + + // 示例2:路径参数 + @Get('detail/:id') + getDetail(@Param('id') id: string) { + return { + id: id, + detail: `Detail for product ${id}` + }; + } + + // 示例3:多个查询参数 + @Get('search') + searchProducts( + @Query('keyword') keyword: string, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10 + ) { + return { + keyword, + page, + limit, + results: [] + }; + } +} \ No newline at end of file diff --git a/apps/server/src/models/goods/goods.module.ts b/apps/server/src/models/goods/goods.module.ts new file mode 100644 index 0000000..e569130 --- /dev/null +++ b/apps/server/src/models/goods/goods.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { GoodsService } from './goods.service'; +import { GoodsController } from './goods.controller'; + +@Module({ + + providers: [GoodsService], + controllers:[GoodsController] + + +}) + +export class GoodsModule {} \ No newline at end of file diff --git a/apps/server/src/models/goods/goods.service.ts b/apps/server/src/models/goods/goods.service.ts new file mode 100644 index 0000000..8270b7a --- /dev/null +++ b/apps/server/src/models/goods/goods.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class GoodsService {} \ No newline at end of file diff --git a/apps/server/src/trpc/trpc.module.ts b/apps/server/src/trpc/trpc.module.ts index 222c9c9..2f7f3a5 100755 --- a/apps/server/src/trpc/trpc.module.ts +++ b/apps/server/src/trpc/trpc.module.ts @@ -16,6 +16,7 @@ import { RoleMapModule } from '@server/models/rbac/rbac.module'; import { TransformModule } from '@server/models/transform/transform.module'; import { ResourceModule } from '@server/models/resource/resource.module'; +import { GoodsModule } from '@server/models/goods/goods.module'; @Module({ imports: [ @@ -33,6 +34,7 @@ import { ResourceModule } from '@server/models/resource/resource.module'; VisitModule, WebSocketModule, ResourceModule, + GoodsModule, ], controllers: [], providers: [TrpcService, TrpcRouter, Logger], diff --git a/apps/web/src/app/main/home/page.tsx b/apps/web/src/app/main/home/page.tsx index 7c1e5a3..743f588 100755 --- a/apps/web/src/app/main/home/page.tsx +++ b/apps/web/src/app/main/home/page.tsx @@ -1,10 +1,53 @@ -import { api } from "@nice/client" -import { useEffect } from "react" +import { api } from "@nice/client"; +import { apiClient } from "@web/src/utils"; -export default function HomePage() { - const { data } = api.staff.findMany.useQuery({ take: 10 }) - useEffect(() => { - console.log(data) - }, [data]) - return <>Home -} \ No newline at end of file +import { Button, Tag } from "antd"; + +import { useEffect, useMemo, useState } from "react"; +function HomePage() { + // 使用 useQuery 钩子从 API 获取数据 + + const { data } = api.staff.findMany.useQuery({ + take: 10 + }); + + // 定义 counter 状态和更新函数 + const [counter, setCounter] = useState(0); + + // 使用 useMemo 记忆化 counterText,仅在 counter 变化时重新计算 + const counterText = useMemo(() => { + return `当前计数为: ${counter}`; + }, [counter]); + + const getData = async()=>{ + const res = @wait apiClient.get(*/goods/hello*) + console.log(res) + } + + // 使用 useEffect 在 data 变化时打印 data + useEffect(() => { + apiClient.get(“/goods/hello”) + }, [data]); + + return ( +
+ {counterText} +
+ + +
+ {/* 如果 data 存在,遍历并渲染每个项目的 username */} + {data?.map((item) => ( +
+ {item.username} +
+ ))} +
+ ); +} + +export default HomePage; \ No newline at end of file diff --git a/config/nginx/conf.d/web.conf b/config/nginx/conf.d/web.conf index 00fbbf1..bf90259 100755 --- a/config/nginx/conf.d/web.conf +++ b/config/nginx/conf.d/web.conf @@ -27,7 +27,8 @@ server { # 压缩HTTP版本 gzip_http_version 1.1; # 压缩的文件类型 - gzip_types text/plain + gzip_types + text/plain text/css application/json application/javascript @@ -90,8 +91,8 @@ server { add_header 'Access-Control-Allow-Origin' '$http_origin' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' - 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' + add_header 'Access-Control-Allow-Headers' + 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always; } # 内部认证服务位置 @@ -110,4 +111,4 @@ server { proxy_set_header Host $host; proxy_set_header X-Query-Params $query_string; } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 8a85a11..8156253 100755 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "pnpm run --parallel dev", - "db:clear": "pnpm --filter common run db:clear" + "db:clear": "pnpm --filter common run db:clear", + "studio": "pnpm --filter common run studio" }, "keywords": [], "author": "insiinc", diff --git a/packages/common/prisma/schema.prisma b/packages/common/prisma/schema.prisma index 4780725..021f720 100755 --- a/packages/common/prisma/schema.prisma +++ b/packages/common/prisma/schema.prisma @@ -245,13 +245,8 @@ model PostAncestry { // 复合索引优化 // 索引建议 - @@index([ancestorId]) // 针对祖先的查询 - @@index([descendantId]) // 针对后代的查询 - @@index([ancestorId, descendantId]) // 组合索引,用于查询特定的祖先-后代关系 - @@index([relDepth]) // 根据关系深度的查询 - @@map("post_ancestry") -} +} model Message { id String @id @default(cuid()) url String? @@ -328,4 +323,47 @@ model Resource { @@index([type]) @@index([createdAt]) @@map("resource") + } + + +//商品表 +model Goods { + id String @id @default(cuid()) // 商品ID + name String @unique // 商品名称 + description String? // 商品描述 + price Float @default(0.0) // 商品价格 + images String[] @default([]) // 商品图片 + tags Tag[] @relation("GoodsTags") // 多对多关系 + reviews Review[] // 一对多关系 + createdAt DateTime @default(now()) @map("created_at") // 创建时间 + updatedAt DateTime @updatedAt @map("updated_at") // 更新时间 + deletedAt DateTime? @map("deleted_at") // 删除时间,可为空 + @@index([name]) + @@map("goods") +} + +// 标签表 +model Tag { + id String @id @default(cuid()) + name String @unique + goods Goods[] @relation("GoodsTags") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + @@map("tag") +} + +model Review { + id String @id @default(cuid()) + content String + rating Int @default(0) + goodsId String @map("goods_id") + goods Goods @relation(fields: [goodsId], references: [id]) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + @@index([goodsId]) + @@index([rating]) + @@map("review") +} \ No newline at end of file From 10dda206624a915b9a89d48c415f5d2ef012a08a Mon Sep 17 00:00:00 2001 From: weiyida <2465069308@qq.com> Date: Sun, 23 Feb 2025 20:31:20 +0800 Subject: [PATCH 2/4] 2031 --- apps/web/nginx.conf | 0 apps/web/src/App.css | 0 apps/web/src/app/main/home/page.tsx | 53 +++++++++++++++---- apps/web/src/app/main/layout/index.tsx | 0 .../common/container/CollapsibleContent.tsx | 0 .../src/components/common/input/InputList.tsx | 0 apps/web/src/routes/main-route.tsx | 2 +- apps/web/src/utils/index.ts | 0 config/nginx/conf.d/web.conf | 9 ++-- package.json | 5 +- packages/config/src/index.ts | 0 11 files changed, 53 insertions(+), 16 deletions(-) mode change 100644 => 100755 apps/web/nginx.conf mode change 100644 => 100755 apps/web/src/App.css mode change 100644 => 100755 apps/web/src/app/main/layout/index.tsx mode change 100644 => 100755 apps/web/src/components/common/container/CollapsibleContent.tsx mode change 100644 => 100755 apps/web/src/components/common/input/InputList.tsx mode change 100644 => 100755 apps/web/src/routes/main-route.tsx mode change 100644 => 100755 apps/web/src/utils/index.ts mode change 100644 => 100755 packages/config/src/index.ts diff --git a/apps/web/nginx.conf b/apps/web/nginx.conf old mode 100644 new mode 100755 diff --git a/apps/web/src/App.css b/apps/web/src/App.css old mode 100644 new mode 100755 diff --git a/apps/web/src/app/main/home/page.tsx b/apps/web/src/app/main/home/page.tsx index 7c1e5a3..199e3d5 100755 --- a/apps/web/src/app/main/home/page.tsx +++ b/apps/web/src/app/main/home/page.tsx @@ -1,10 +1,45 @@ -import { api } from "@nice/client" -import { useEffect } from "react" - -export default function HomePage() { - const { data } = api.staff.findMany.useQuery({ take: 10 }) - useEffect(() => { +import { api, useStaff } from "@nice/client" +import { useAuth } from "@web/src/providers/auth-provider"; +import { Button, Tag } from "antd"; +import { useEffect, useMemo, useState } from "react"; +function HomePage(){ + const {data} = api.staff.findMany.useQuery({ + take: 10 + }) + const {user,}=useAuth() +const {update,create}=useStaff() + const [counter, setCounter] = useState(0) + const counterText=useMemo(()=>{ + return `当前计数为:${counter}` + },[counter]) + // const test=async ()=>{ + + // await update.mutateAsync({ + // where: { + // username: user?.username + // }, + // data: { + // username: "test" + // } + // }) + // } + useEffect(()=>{ console.log(data) - }, [data]) - return <>Home -} \ No newline at end of file + },[data]) + + return
+ 当前计数为:{counter} +
+ + +
+ { + data?.map(i=>{ + return
i.username
+ }) + } + +
+} +export default HomePage; +// export {HomePage};//main-route那里也需要加括号 \ No newline at end of file diff --git a/apps/web/src/app/main/layout/index.tsx b/apps/web/src/app/main/layout/index.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/common/container/CollapsibleContent.tsx b/apps/web/src/components/common/container/CollapsibleContent.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/components/common/input/InputList.tsx b/apps/web/src/components/common/input/InputList.tsx old mode 100644 new mode 100755 diff --git a/apps/web/src/routes/main-route.tsx b/apps/web/src/routes/main-route.tsx old mode 100644 new mode 100755 index 1c23dc9..4894120 --- a/apps/web/src/routes/main-route.tsx +++ b/apps/web/src/routes/main-route.tsx @@ -6,7 +6,7 @@ export const MainRoute: CustomRouteObject = { element: , children: [ { - index: true, + index: true, //默认为主页,app进入第一次进入这个页面 element: , }, ], diff --git a/apps/web/src/utils/index.ts b/apps/web/src/utils/index.ts old mode 100644 new mode 100755 diff --git a/config/nginx/conf.d/web.conf b/config/nginx/conf.d/web.conf index 00fbbf1..bf90259 100755 --- a/config/nginx/conf.d/web.conf +++ b/config/nginx/conf.d/web.conf @@ -27,7 +27,8 @@ server { # 压缩HTTP版本 gzip_http_version 1.1; # 压缩的文件类型 - gzip_types text/plain + gzip_types + text/plain text/css application/json application/javascript @@ -90,8 +91,8 @@ server { add_header 'Access-Control-Allow-Origin' '$http_origin' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' - 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' + add_header 'Access-Control-Allow-Headers' + 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always; } # 内部认证服务位置 @@ -110,4 +111,4 @@ server { proxy_set_header Host $host; proxy_set_header X-Query-Params $query_string; } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 8a85a11..b351532 100755 --- a/package.json +++ b/package.json @@ -5,8 +5,9 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "pnpm run --parallel dev", - "db:clear": "pnpm --filter common run db:clear" + "dev": "pnpm run --parallel dev", + "db:clear": "pnpm --filter common run db:clear", + "studio": "pnpm --filter common run studio" }, "keywords": [], "author": "insiinc", diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts old mode 100644 new mode 100755 From 6cf6248b59ffe5fee9fc15c33e997a5180edc607 Mon Sep 17 00:00:00 2001 From: weiyida <2465069308@qq.com> Date: Sun, 23 Feb 2025 20:31:53 +0800 Subject: [PATCH 3/4] 2031 --- .../src/models/goods/goods.controller.ts | 39 +++++++++++++++++++ apps/server/src/models/goods/goods.module.ts | 10 +++++ apps/server/src/models/goods/goods.servers.ts | 7 ++++ 3 files changed, 56 insertions(+) create mode 100644 apps/server/src/models/goods/goods.controller.ts create mode 100644 apps/server/src/models/goods/goods.module.ts create mode 100644 apps/server/src/models/goods/goods.servers.ts diff --git a/apps/server/src/models/goods/goods.controller.ts b/apps/server/src/models/goods/goods.controller.ts new file mode 100644 index 0000000..a118d02 --- /dev/null +++ b/apps/server/src/models/goods/goods.controller.ts @@ -0,0 +1,39 @@ +import { Controller, Get, Param, Query } from '@nestjs/common'; + +@Controller('goods') +export class GoodsController { + constructor() { + console.log('goods Controller'); + } + @Get('hello') + getHello(): string { + return 'Hello World!'; + } + + + + // 示例2:路径参数 + @Get('detail/:id') + getDetail(@Param('id') id: string) { + return { + id: id, + detail: `Detail for product ${id}` + }; + } + + // 示例3:多个查询参数 + @Get('search') + searchProducts( + @Query('keyword') keyword: string, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10 + ) { + return { + keyword, + page, + limit, + results: [] + }; + } +} + diff --git a/apps/server/src/models/goods/goods.module.ts b/apps/server/src/models/goods/goods.module.ts new file mode 100644 index 0000000..faadd1e --- /dev/null +++ b/apps/server/src/models/goods/goods.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { GoodsService } from './goods.servers'; +import { GoodsController } from './goods.controller'; + + +@Module({ + providers: [GoodsService], + controllers: [GoodsController] +}) +export class GoodsModule {} diff --git a/apps/server/src/models/goods/goods.servers.ts b/apps/server/src/models/goods/goods.servers.ts new file mode 100644 index 0000000..e000402 --- /dev/null +++ b/apps/server/src/models/goods/goods.servers.ts @@ -0,0 +1,7 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class GoodsService { + +} + From 7e485220fa94e26782135cfe0c9b91591b3bed3f Mon Sep 17 00:00:00 2001 From: weiyida <2465069308@qq.com> Date: Sun, 23 Feb 2025 20:32:01 +0800 Subject: [PATCH 4/4] 02232031 --- .../src/models/message/message.module.ts | 10 +- apps/server/src/trpc/trpc.module.ts | 2 + apps/web/src/app/main/home/page.tsx | 115 ++++++++++++------ apps/web/src/app/main/home/personcard.tsx | 34 ++++++ packages/common/prisma/schema.prisma | 41 +++++++ 5 files changed, 157 insertions(+), 45 deletions(-) create mode 100644 apps/web/src/app/main/home/personcard.tsx diff --git a/apps/server/src/models/message/message.module.ts b/apps/server/src/models/message/message.module.ts index ce83a6e..50a7234 100755 --- a/apps/server/src/models/message/message.module.ts +++ b/apps/server/src/models/message/message.module.ts @@ -6,9 +6,9 @@ import { DepartmentModule } from '../department/department.module'; import { MessageController } from './message.controller'; @Module({ - imports: [DepartmentModule], - providers: [MessageService, MessageRouter, TrpcService], - exports: [MessageService, MessageRouter], - controllers: [MessageController], + imports: [DepartmentModule], // 导入其他模块 + providers: [MessageService, MessageRouter, TrpcService], // 注册服务器,可以被自己使用 + exports: [MessageService, MessageRouter], // 导出服务器 + controllers: [MessageController], // 注册控制器 }) -export class MessageModule { } +export class MessageModule {} diff --git a/apps/server/src/trpc/trpc.module.ts b/apps/server/src/trpc/trpc.module.ts index 222c9c9..2f7f3a5 100755 --- a/apps/server/src/trpc/trpc.module.ts +++ b/apps/server/src/trpc/trpc.module.ts @@ -16,6 +16,7 @@ import { RoleMapModule } from '@server/models/rbac/rbac.module'; import { TransformModule } from '@server/models/transform/transform.module'; import { ResourceModule } from '@server/models/resource/resource.module'; +import { GoodsModule } from '@server/models/goods/goods.module'; @Module({ imports: [ @@ -33,6 +34,7 @@ import { ResourceModule } from '@server/models/resource/resource.module'; VisitModule, WebSocketModule, ResourceModule, + GoodsModule, ], controllers: [], providers: [TrpcService, TrpcRouter, Logger], diff --git a/apps/web/src/app/main/home/page.tsx b/apps/web/src/app/main/home/page.tsx index 199e3d5..5d71745 100755 --- a/apps/web/src/app/main/home/page.tsx +++ b/apps/web/src/app/main/home/page.tsx @@ -1,45 +1,80 @@ -import { api, useStaff } from "@nice/client" -import { useAuth } from "@web/src/providers/auth-provider"; -import { Button, Tag } from "antd"; -import { useEffect, useMemo, useState } from "react"; -function HomePage(){ - const {data} = api.staff.findMany.useQuery({ - take: 10 - }) - const {user,}=useAuth() -const {update,create}=useStaff() - const [counter, setCounter] = useState(0) - const counterText=useMemo(()=>{ - return `当前计数为:${counter}` - },[counter]) - // const test=async ()=>{ +// import { api, useStaff } from "@nice/client" +// //import { useAuth } from "@web/src/providers/auth-provider"; +// import { Button, Tag } from "antd"; +// import { useEffect, useMemo, useState } from "react"; +// import PersonCard from './personcard'; + +// function HomePage(){ +// // function HomePage(){ +// // const {data} = api.staff.findMany.useQuery({ +// // take: 5 +// // }) +// // //const {user,}=useAuth() +// // //const {update,create}=useStaff() +// // const [counter, setCounter] = useState(0) +// // const counterText=useMemo(()=>{ +// // return `当前计数为:${counter}` +// // },[counter]) +// // const test=async ()=>{ - // await update.mutateAsync({ - // where: { - // username: user?.username - // }, - // data: { - // username: "test" - // } - // }) - // } - useEffect(()=>{ - console.log(data) - },[data]) +// // await update.mutateAsync({ +// // where: { +// // username: user?.username +// // }, +// // data: { +// // username: "test" +// // } +// // }) +// // } +// // useEffect(()=>{ +// // console.log(data) +// // },[data]) +// return ( +//
+//

主页

+// {/* 调用 PersonCard 组件 */} +// +//
+// ); +// }; - return
- 当前计数为:{counter} -
- - -
- { - data?.map(i=>{ - return
i.username
+ +// // return
+// // 当前计数为:{counter} +// //
+// // +// // +// //
+ + + +// export default HomePage; +// // export {HomePage};//main-route那里也需要加括号 + +import React, { useEffect } from 'react'; +import { api } from "@nice/client" + +function PersonCard(){ + const {data} = api.staff.findMany.useQuery({ + take: 15 }) - } -
+ useEffect(()=>{ + console.log(data) + },[data]) + + + return ( +
+ {data?.map((i, index) => ( +
+
+

{i.username}

+
+
+ ))} +
+ ); } -export default HomePage; -// export {HomePage};//main-route那里也需要加括号 \ No newline at end of file + +export default PersonCard; \ No newline at end of file diff --git a/apps/web/src/app/main/home/personcard.tsx b/apps/web/src/app/main/home/personcard.tsx new file mode 100644 index 0000000..cc211ad --- /dev/null +++ b/apps/web/src/app/main/home/personcard.tsx @@ -0,0 +1,34 @@ +import React, { useEffect } from 'react'; +import { api } from "@nice/client" +import { apiClient } from '@web/src/utils'; + +function PersonCard(){ + const {data} = api.staff.findMany.useQuery({ + take: 10 + }) + + useEffect(()=>{ + + console.log(data) + },[data]) + + const getdata=async ()=>{ + const res=await apiClient.get("/goods/hello") + console.log(res) + } + + + return ( +
+ {data?.map((i, index) => ( +
+
+

{i.username}

+
+
+ ))} +
+ ); +} + +export default PersonCard; \ No newline at end of file diff --git a/packages/common/prisma/schema.prisma b/packages/common/prisma/schema.prisma index 4780725..474035c 100755 --- a/packages/common/prisma/schema.prisma +++ b/packages/common/prisma/schema.prisma @@ -329,3 +329,44 @@ model Resource { @@index([createdAt]) @@map("resource") } + +//商品表 +model Goods { + id String @id @default(cuid()) // 商品ID + name String @unique // 商品名称 + description String? // 商品描述 + price Float @default(0.0) // 商品价格 + images String[] @default([]) // 商品图片 + tags Tag[] @relation("GoodsTags") // 多对多关系 + reviews Review[] // 一对多关系 + createdAt DateTime @default(now()) @map("created_at") // 创建时间 + updatedAt DateTime @updatedAt @map("updated_at") // 更新时间 + deletedAt DateTime? @map("deleted_at") // 删除时间,可为空 + @@index([name]) + @@map("goods") +} + +// 标签表 +model Tag { + id String @id @default(cuid()) + name String @unique + goods Goods[] @relation("GoodsTags") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + @@map("tag") +} + +model Review { + id String @id @default(cuid()) + content String + rating Int @default(0) + goodsId String @map("goods_id") + goods Goods @relation(fields: [goodsId], references: [id]) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + @@index([goodsId]) + @@index([rating]) + @@map("review") +}