From 87864a1c4f9dda4d284fe63d0995f261fbe017dc Mon Sep 17 00:00:00 2001 From: dxc Date: Wed, 28 Jan 2026 09:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF=E5=92=8C?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E4=BB=B6=E9=A1=B5=E9=9D=A2=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=E8=AF=BB=E5=8F=96=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/models/material.py | 60 ++++++++++++++++-------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/inventory-backend/app/models/material.py b/inventory-backend/app/models/material.py index b1cd976..dfc0260 100644 --- a/inventory-backend/app/models/material.py +++ b/inventory-backend/app/models/material.py @@ -10,53 +10,75 @@ class MaterialBase(db.Model): """ __tablename__ = 'material_base' + # 1. 基础字段 (必须与 SQL 建表语句完全一致) id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False, comment='基础信息名称') - category = db.Column(db.String(100), comment='类别') # 例如: 采购件, 自制件 - material_type = db.Column(db.String(100), comment='类型') # 例如: 电子料, 结构件 (对应前端 type) - spec_model = db.Column(db.String(255), comment='规格型号') # (对应前端 spec) + + # 类别 (对应 SQL: category) + category = db.Column(db.String(100), comment='类别') + + # 类型 (对应 SQL: material_type) -> 前端 prop="type" + material_type = db.Column(db.String(100), comment='类型') + + # 规格型号 (对应 SQL: spec_model) -> 前端 prop="spec" + spec_model = db.Column(db.String(255), comment='规格型号') + unit = db.Column(db.String(50), comment='计量单位') - # 根据你提供的代码,可见等级设为 Integer,默认为 0 + # 可见等级 visibility_level = db.Column(db.Integer, default=0, comment='信息可见等级') - manual_link = db.Column(db.Text, comment='通用说明书链接') # (对应前端 generalManual) - product_image = db.Column(db.Text, comment='通用产品图链接') # (对应前端 generalImage) + # 链接与图片 + manual_link = db.Column(db.Text, comment='通用说明书链接') + product_image = db.Column(db.Text, comment='通用产品图链接') + # 启用状态 (注意:SQL中是 boolean) is_enabled = db.Column(db.Boolean, default=True, comment='是否启用') - # 时间字段(建议加上,用于排序或记录) - create_time = db.Column(db.DateTime, default=datetime.utcnow) - update_time = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + # ============================================================ + # ⚠️ 注意:你之前提供的 SQL 建表语句中【没有】下面这两个时间字段。 + # 如果数据库里没有这两列,代码运行到这里会报错 (UndefinedColumn)。 + # 我先将其注释掉。如果你确认数据库已经 Alter Table 加了这两列,请取消注释。 + # ============================================================ + # create_time = db.Column(db.DateTime, default=datetime.utcnow) + # update_time = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 【核心关联】 - # 关联采购库存表,lazy='dynamic' 允许使用 .count() 等查询方法 + # 关联采购库存表 (StockBuy),lazy='dynamic' 允许后续做 .count() 统计 + # 确保 app/models/stock.py 中有 back_populates='material' stock_buys = db.relationship('StockBuy', back_populates='material', lazy='dynamic') def to_dict(self): """ 序列化方法:将模型转换为字典,供API返回JSON使用 - 此处进行了字段名的映射,以适配 list.vue 前端的 prop 属性 + 这里是解决【前端表格空白】最关键的地方 """ return { 'id': self.id, 'name': self.name, 'category': self.category, - # --- 字段映射区域 (后端字段 -> 前端字段) --- - 'type': self.material_type, # 前端 prop="type" - 'spec': self.spec_model, # 前端 prop="spec" + # ========================================= + # 关键映射区 (解决前后端字段名不一致问题) + # ========================================= + # 数据库叫 material_type -> 前端叫 type + 'type': self.material_type, + + # 数据库叫 spec_model -> 前端叫 spec + 'spec': self.spec_model, + 'unit': self.unit, - # 转为驼峰命名,适配前端习惯 + # 驼峰命名适配 'visibilityLevel': self.visibility_level, 'generalManual': self.manual_link, 'generalImage': self.product_image, - # Element Plus Switch 组件通常接受 1/0 或 true/false - # 这里转为 1/0 方便前端 el-switch :active-value="1" :inactive-value="0" + # 状态处理:前端 Switch 通常接受 boolean 或 1/0 + # 数据库里的 true -> 返回 1 (启用) + # 数据库里的 false/None -> 返回 0 (禁用) 'isEnabled': 1 if self.is_enabled else 0, - # 补充时间信息 - 'createTime': self.create_time.strftime('%Y-%m-%d %H:%M:%S') if self.create_time else None + # 如果上方注释了 create_time,这里也要注释,否则会报错 + # 'createTime': self.create_time.strftime('%Y-%m-%d %H:%M:%S') if hasattr(self, 'create_time') and self.create_time else None } \ No newline at end of file