feat(forum): add forum prisma models and board constant

This commit is contained in:
zty 2026-07-07 03:21:01 -04:00
parent 9d19f66f28
commit 8cfa20d3aa
2 changed files with 730 additions and 0 deletions

View File

@ -0,0 +1,677 @@
generator client {
provider = "prisma-client-js"
binaryTargets = ["windows"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
// 管理员账号
model Admin {
id String @id // 账号ID A(RRRRRR)
name String @unique // 账号名
password String // 密码
username String // 用户名
type Int @default(1) // 账号类型 1 - 超级管理员, 2 - 管理员
status Int @default(1) // 账号状态 0 - 禁用, 1 - 可用
authz_hist_mgmt Int @default(1) // 历史管理
authz_tmpl_mgmt Int @default(1) // 模板管理
authz_mtrl_mgmt Int @default(1) // 材料管理
authz_audit_mgmt Int @default(1) // 审核管理
authz_acct_mgmt Int @default(1) // 账号管理
authz_sys_cfg Int @default(1) // 系统设置
templates PublicTemplate[]
materials PublicMaterial[]
applied_requests AuditRequest[] @relation("applied_requests")
reviewed_requests AuditRequest[] @relation("reviewed_requests")
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
deleted Int @default(0)
@@map("admin")
}
// 用户账号
model User {
id String @id // 账号ID U(RRRRRR)
name String @unique // 账户名
password String // 密码
username String // 用户名
status Int @default(1) // 账号状态 0 - 禁用, 1 - 可用
projects Project[]
templates SelfTemplate[]
materials SelfMaterial[]
pub_temp_colls PublicTemplateCollection[] // 收藏的公共模板
pub_mtrl_colls PublicMaterialCollection[] // 收藏的公共材料
pub_templates PublicTemplate[]
pub_materials PublicMaterial[]
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
deleted Int @default(0)
phone String? @unique // 手机号(手机注册用户)
@@map("user")
}
// ------
// 项目
model Project {
id String @id // 项目ID P(yMdHmSRR)
name String? // 项目名称
category String? // 项目类型
province String? // 所在省份
city String? // 所在城市
climatic_zone String? // 所在气候区
constr_area Float? // 建筑面积
usage_area Float? // 使用面积
spaces Space[] // 包含空间
status Int @default(0) // 状态 0 - 未生成预测报告, 1 - 已生成预测报告
predicted_at DateTime? // 预测报告生成时间
score Float? // 得分
grade String? // 评级
creator_id String?
creator_name String
creator User? @relation(fields: [creator_id], references: [id], onDelete: SetNull)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("project")
}
// 项目空间
model Space {
id String @id // 空间ID S(yMdHmSRR)
project_id String // 所属项目ID
project Project @relation(fields: [project_id], references: [id], onDelete: Cascade) // 所属项目
name String? // 空间名称
category String? // 空间类型
layout Int? // 空间布局
height Float? // 空间高度
area Float? // 空间面积
volume Float? // 空间体积
env_temp Float? // 环境温度
env_hum Float? // 环境湿度
env_vent_rate Float? // 环境通风换气率
apc_lmt_std_id String? // 空气污染物浓度限值标准ID
apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull) // 空气污染物浓度限值标准
materials Material[] // 包含材料
methanal_c Float? // 甲醛浓度
tvoc_c Float? // TVOC浓度
benzene_c Float? // 苯浓度
toluene_c Float? // 甲苯浓度
p_xylene_c Float? // 二甲苯浓度
methanal_c_exceed Int? // 甲醛是否超标
tvoc_c_exceed Int? // TVOC是否超标
benzene_c_exceed Int? // 苯是否超标
toluene_c_exceed Int? // 甲苯是否超标
p_xylene_c_exceed Int? // 二甲苯是否超标
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("space")
}
// 空间材料
model Material {
id Int @id @default(autoincrement()) // 材料ID
material_id String // 所属材料ID
project_id String // 所属项目ID
space_id String // 所属空间ID
space Space @relation(fields: [space_id], references: [id], onDelete: Cascade) // 所属空间
name String? // 材料名称
category String? // 材料类型
brand String? // 材料品牌
factory String? // 材料厂家
spec String? // 材料规格
eco_level String? // 环保等级
unit String? // 用量单位 AREA - 面积, LEN - 长度
qty Float? // 用量值
methanal Float? // 甲醛
methanal_min_be Float? // 甲醛最低平衡释放量
methanal_be_area Float? // 甲醛平衡释放量范围
methanal_be_roc Float? // 甲醛平衡释放量变化率
tvoc Float? // TVOC
tvoc_min_be Float? // TVOC最低平衡释放量
tvoc_be_area Float? // TVOC平衡释放量范围
tvoc_be_roc Float? // TVOC平衡释放量变化率
benzene Float? // 苯
benzene_min_be Float? // 苯最低平衡释放量
benzene_be_area Float? // 苯平衡释放量范围
benzene_be_roc Float? // 苯平衡释放量变化率
toluene Float? // 甲苯
toluene_min_be Float? // 甲苯最低平衡释放量
toluene_be_area Float? // 甲苯平衡释放量范围
toluene_be_roc Float? // 甲苯平衡释放量变化率
p_xylene Float? // 二甲苯
p_xylene_min_be Float? // 二甲苯最低平衡释放量
p_xylene_be_area Float? // 二甲苯平衡释放量范围
p_xylene_be_roc Float? // 二甲苯平衡释放量变化率
methanal_cr Float? // 甲醛贡献率
tvoc_cr Float? // TVOC贡献率
benzene_cr Float? // 苯贡献率
toluene_cr Float? // 甲苯贡献率
p_xylene_cr Float? // 二甲苯贡献率
methanal_cr_exceed Int? // 甲醛贡献率是否超标
tvoc_cr_exceed Int? // TVOC贡献率是否超标
benzene_cr_exceed Int? // 苯贡献率是否超标
toluene_cr_exceed Int? // 甲苯贡献率是否超标
p_xylene_cr_exceed Int? // 二甲苯贡献率是否超标
is_methanal_ps Int? // 是否为甲醛污染源
is_tvoc_ps Int? // 是否为TVOC污染源
is_benzene_ps Int? // 是否为苯污染源
is_toluene_ps Int? // 是否为甲苯污染源
is_p_xylene_ps Int? // 是否为二甲苯污染源
user_id String
user_name String
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("material")
}
// ------
// 公共项目模板
model PublicTemplate {
id String @id // PT(yMdHmSRR)
name String?
category String?
province String?
city String?
climatic_zone String?
constr_area Float?
usage_area Float?
spaces PublicTemplateSpace[]
display Int @default(0) // 是否展示
collectors PublicTemplateCollection[] // 收藏此模板的用户
pry_no Int @default(0)
score Float?
grade String?
from String?
creator_id String
creator_name String
related_user_id String?
related_user User? @relation(fields: [related_user_id], references: [id], onDelete: SetNull)
related_admin_id String?
related_admin Admin? @relation(fields: [related_admin_id], references: [id], onDelete: SetNull)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("public_template")
}
// 公共项目模板空间
model PublicTemplateSpace {
id String @id // PTS(yMdHmSRR)
project_id String
project PublicTemplate @relation(fields: [project_id], references: [id], onDelete: Cascade)
name String?
category String?
layout Int?
height Float?
area Float?
volume Float?
env_temp Float?
env_hum Float?
env_vent_rate Float?
apc_lmt_std_id String?
apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull)
materials PublicTemplateMaterial[]
methanal_c Float?
tvoc_c Float?
benzene_c Float?
toluene_c Float?
p_xylene_c Float?
methanal_c_exceed Int?
tvoc_c_exceed Int?
benzene_c_exceed Int?
toluene_c_exceed Int?
p_xylene_c_exceed Int?
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("public_template_space")
}
// 公共项目模板材料
model PublicTemplateMaterial {
id Int @id @default(autoincrement())
material_id String
project_id String
space_id String
space PublicTemplateSpace @relation(fields: [space_id], references: [id], onDelete: Cascade)
name String?
category String?
brand String?
factory String?
spec String?
eco_level String?
unit String?
qty Float?
methanal Float?
methanal_min_be Float?
methanal_be_area Float?
methanal_be_roc Float?
tvoc Float?
tvoc_min_be Float?
tvoc_be_area Float?
tvoc_be_roc Float?
benzene Float?
benzene_min_be Float?
benzene_be_area Float?
benzene_be_roc Float?
toluene Float?
toluene_min_be Float?
toluene_be_area Float?
toluene_be_roc Float?
p_xylene Float?
p_xylene_min_be Float?
p_xylene_be_area Float?
p_xylene_be_roc Float?
methanal_cr Float?
tvoc_cr Float?
benzene_cr Float?
toluene_cr Float?
p_xylene_cr Float?
methanal_cr_exceed Int?
tvoc_cr_exceed Int?
benzene_cr_exceed Int?
toluene_cr_exceed Int?
p_xylene_cr_exceed Int?
is_methanal_ps Int?
is_tvoc_ps Int?
is_benzene_ps Int?
is_toluene_ps Int?
is_p_xylene_ps Int?
user_id String
user_name String
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("public_template_material")
}
// ------
// 自建模板
model SelfTemplate {
id String // ST(yMdHmSRR)
name String?
category String?
province String?
city String?
climatic_zone String?
constr_area Float?
usage_area Float?
spaces SelfTemplateSpace[]
score Float?
grade String?
creator_id String
creator_name String
creator User @relation(fields: [creator_id], references: [id], onDelete: Cascade)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@id([id, creator_id])
@@map("self_template")
}
// 自建模板空间
model SelfTemplateSpace {
id String // STS(yMdHmSRR)
project_id String
project SelfTemplate @relation(fields: [project_id, creator_id], references: [id, creator_id], onDelete: Cascade)
name String?
category String?
layout Int?
height Float?
area Float?
volume Float?
env_temp Float?
env_hum Float?
env_vent_rate Float?
apc_lmt_std_id String?
apc_lmt_std ApcLimitStandard? @relation(fields: [apc_lmt_std_id], references: [id], onDelete: SetNull)
materials SelfTemplateMaterial[]
methanal_c Float?
tvoc_c Float?
benzene_c Float?
toluene_c Float?
p_xylene_c Float?
methanal_c_exceed Int?
tvoc_c_exceed Int?
benzene_c_exceed Int?
toluene_c_exceed Int?
p_xylene_c_exceed Int?
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@id([id, project_id])
@@map("self_template_space")
}
// 自建项目模板材料
model SelfTemplateMaterial {
id Int @id @default(autoincrement())
material_id String
project_id String
space_id String
space SelfTemplateSpace @relation(fields: [space_id, project_id], references: [id, project_id], onDelete: Cascade)
name String?
category String?
brand String?
factory String?
spec String?
eco_level String?
unit String?
qty Float?
methanal Float?
methanal_min_be Float?
methanal_be_area Float?
methanal_be_roc Float?
tvoc Float?
tvoc_min_be Float?
tvoc_be_area Float?
tvoc_be_roc Float?
benzene Float?
benzene_min_be Float?
benzene_be_area Float?
benzene_be_roc Float?
toluene Float?
toluene_min_be Float?
toluene_be_area Float?
toluene_be_roc Float?
p_xylene Float?
p_xylene_min_be Float?
p_xylene_be_area Float?
p_xylene_be_roc Float?
methanal_cr Float?
tvoc_cr Float?
benzene_cr Float?
toluene_cr Float?
p_xylene_cr Float?
methanal_cr_exceed Int?
tvoc_cr_exceed Int?
benzene_cr_exceed Int?
toluene_cr_exceed Int?
p_xylene_cr_exceed Int?
is_methanal_ps Int?
is_tvoc_ps Int?
is_benzene_ps Int?
is_toluene_ps Int?
is_p_xylene_ps Int?
user_id String
user_name String
creator_id String
creator_name String
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("self_template_material")
}
// ------
// 公共材料
model PublicMaterial {
material_id String @id // PM(yMdHmSRR)
name String?
category String?
brand String?
factory String?
spec String?
eco_level String?
health_level String?
methanal Float?
methanal_min_be Float?
methanal_be_area Float?
methanal_be_roc Float?
tvoc Float?
tvoc_min_be Float?
tvoc_be_area Float?
tvoc_be_roc Float?
benzene Float?
benzene_min_be Float?
benzene_be_area Float?
benzene_be_roc Float?
toluene Float?
toluene_min_be Float?
toluene_be_area Float?
toluene_be_roc Float?
p_xylene Float?
p_xylene_min_be Float?
p_xylene_be_area Float?
p_xylene_be_roc Float?
sort_order Int @default(0) // 手动排序权重,升序
display Int @default(0) // 是否展示
collectors PublicMaterialCollection[] // 收藏此材料的用户
pry_no Int @default(0)
from String?
creator_id String
creator_name String
related_user_id String?
related_user User? @relation(fields: [related_user_id], references: [id], onDelete: SetNull)
related_admin_id String?
related_admin Admin? @relation(fields: [related_admin_id], references: [id], onDelete: SetNull)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("public_material")
}
// 自建材料
model SelfMaterial {
material_id String // SM(yMdHmSRR)
name String?
category String?
brand String?
factory String?
spec String?
eco_level String?
health_level String?
methanal Float?
methanal_min_be Float?
methanal_be_area Float?
methanal_be_roc Float?
tvoc Float?
tvoc_min_be Float?
tvoc_be_area Float?
tvoc_be_roc Float?
benzene Float?
benzene_min_be Float?
benzene_be_area Float?
benzene_be_roc Float?
toluene Float?
toluene_min_be Float?
toluene_be_area Float?
toluene_be_roc Float?
p_xylene Float?
p_xylene_min_be Float?
p_xylene_be_area Float?
p_xylene_be_roc Float?
sort_order Int @default(0)
creator_id String
creator_name String
creator User @relation(fields: [creator_id], references: [id], onDelete: Cascade)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@id([material_id, creator_id])
@@map("self_material")
}
// ------
// 用户收藏的公共模板
model PublicTemplateCollection {
user_id String
user User @relation(fields: [user_id], references: [id], onDelete: Cascade)
project_id String
project PublicTemplate @relation(fields: [project_id], references: [id], onDelete: Cascade)
@@id([user_id, project_id])
@@map("public_template_collection")
}
// 用户收藏的公共材料
model PublicMaterialCollection {
user_id String
user User @relation(fields: [user_id], references: [id], onDelete: Cascade)
material_id String
material PublicMaterial @relation(fields: [material_id], references: [material_id], onDelete: Cascade)
@@id([user_id, material_id])
@@map("public_material_collection")
}
// ------
// 审核单
model AuditRequest {
id String @id
status Int @default(0)
source_id String?
source_creator_id String?
source String
type String
desc String?
remark String?
reason String?
details AuditRequestDetails[]
auditor_id String?
auditor_name String?
auditor Admin? @relation(name: "reviewed_requests", fields: [auditor_id], references: [id], onDelete: SetNull)
audited_at DateTime?
creator_id String?
creator_name String
creator Admin? @relation(name: "applied_requests", fields: [creator_id], references: [id], onDelete: SetNull)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
@@map("audit_request")
}
// 审核单详情
model AuditRequestDetails {
id Int @id @default(autoincrement())
aduit_request_id String
audit_request AuditRequest @relation(fields: [aduit_request_id], references: [id], onDelete: Cascade)
content Json
@@map("audit_request_details")
}
// ------
// 项目-空间类型
model ProjectSpaceCategory {
pry_no_1 Int @default(0)
pry_no_2 Int @default(0)
project_category String
space_category String
@@id([project_category, space_category])
@@map("project_space_category")
}
// 材料类型
model MaterialCategory {
pry_no_1 Int @default(0)
pry_no_2 Int @default(0)
first_category String
second_category String
unit String?
@@id([first_category, second_category])
@@map("material_category")
}
// 省-市-气候区-温度-湿度
model CityInformation {
pry_no_1 Int @default(0)
pry_no_2 Int @default(0)
province String
city String
climatic_zone String?
env_temp Float
env_hum Float
@@id([province, city])
@@map("city_information")
}
// 空气污染物浓度限值标准
model ApcLimitStandard {
id String @id // 标准ID
methanal_c_lmt Float // 甲醛浓度限值
tvoc_c_lmt Float // TVOC浓度限值
benzene_c_lmt Float // 苯浓度限值
toluene_c_lmt Float // 甲苯浓度限值
p_xylene_c_lmt Float // 二甲苯浓度限值
spaces Space[] // 使用该模板的项目空间
pub_temp_spaces PublicTemplateSpace[] // 使用该标准的公共模板空间
self_temp_spaces SelfTemplateSpace[] // 使用该标准的自建模板空间
@@map("apc_limit_standard")
}
// ------ 论坛 ------
model ForumThread {
id Int @id @default(autoincrement())
board String // 板块(取值属于 FORUM_BOARDS
title String
content String @db.Text
author_id String // User.id
author_name String // 冗余 username
like_count Int @default(0)
reply_count Int @default(0)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
deleted Int @default(0)
replies ForumReply[]
likes ForumThreadLike[]
@@map("forum_thread")
}
model ForumReply {
id Int @id @default(autoincrement())
thread_id Int
thread ForumThread @relation(fields: [thread_id], references: [id], onDelete: Cascade)
floor Int // 楼层
content String @db.Text
author_id String
author_name String
created_at DateTime @default(now())
deleted Int @default(0)
@@map("forum_reply")
}
model ForumThreadLike {
thread_id Int
thread ForumThread @relation(fields: [thread_id], references: [id], onDelete: Cascade)
user_id String
created_at DateTime @default(now())
@@id([thread_id, user_id])
@@map("forum_thread_like")
}

View File

@ -0,0 +1,53 @@
export enum ID_PREFIX {
ADMIN = 'A',
USER = 'U',
PROJECT = 'P',
SPACE = 'S',
PUB_TEMP = 'PT',
PUB_TEMP_SPACE = 'PTS',
SELF_TEMP = 'ST',
SELF_TEMP_SPACE = 'STS',
PUB_MATERIAL = 'PM',
SELF_MATERIAL = 'SM'
}
export enum DATA_TYPE {
PUBLIC = 'pub',
PRIVATE = 'self'
}
export const IAPIPS_STATIC = 'iapips_static'
export enum ERR_CODE {
// 1xxx - 参数校验相关
INVALID_REQ_DATA = '1000',
ERR_NAME_OR_PSW = '1001',
ERR_PSW = '1002',
ACCT_NAME_EXIST = '1003',
ACCT_NOT_FOUND = '1004',
PROJ_NOT_FOUNT = '1005',
SPACE_NOT_FOUNT = '1006',
MTRL_NOT_FOUNT = '1007',
PROJ_PREDICTED = '1008',
PREDICTION_ERROR = '1009',
INVALID_COLLECT = '1010',
CAT_DUPL = '1011',
CAT_EXIST = '1012',
AUDIT_REQ_EXIST = '1013',
AUDIT_REQ_NOT_FOUND = '1014',
AUDIT_REQ_INVALID_STATUS = '1015',
NO_UPLOAD_FILE = '1016',
SMS_CODE_ERR = '1017',
SMS_RATE_LIMIT = '1018',
// 2xxx - 身份校验相关
UNAUTHORIZED = '2000',
// 3xxx - 权限校验相关
FORBIDDEN = '3000',
FORBIDDEN_ADMIN_TYPE = '3001',
FORBIDDEN_ACCOUNT = '3002',
// 4xxx - 服务端异常相关
UNKNOWN_ERR = '4000'
}
// 论坛板块(固定,不建表)
export const FORUM_BOARDS = ['甲醛治理', '异味TVOC', '环保材料', '装修避坑', '求助问答']