From ec293fa8b23837e779d84dae3e8ebdbdd69491f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E7=9D=BF=20=E5=BC=A0?= Date: Mon, 12 Oct 2026 15:37:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=A0=A1=E9=AA=8C=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=92=8C=E8=A7=84=E6=A0=BC=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/Materials.vue | 8 ++++++++ internal/handler/api.go | 4 ++-- internal/service/material.go | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/Materials.vue b/frontend/src/views/Materials.vue index c058c028..56b47b81 100644 --- a/frontend/src/views/Materials.vue +++ b/frontend/src/views/Materials.vue @@ -510,6 +510,14 @@ async function handleSave() { ElMessage.warning('请填写物料名称') return } + if (Array.from(form.name).length > 200) { + ElMessage.warning('物料名称过长,请小于200字') + return + } + if (Array.from(form.spec || '').length > 200) { + ElMessage.warning('物料规格过长,请小于200字') + return + } saveLoading.value = true try { const formData = toMaterialPayload(form) diff --git a/internal/handler/api.go b/internal/handler/api.go index ac16f83d..6a2eabe1 100644 --- a/internal/handler/api.go +++ b/internal/handler/api.go @@ -332,7 +332,7 @@ func (h *Handler) CreateMaterial(c *gin.Context) { material, err := h.materialSvc.Create(&req, operator) if err != nil { - if errors.Is(err, service.ErrInvalidMaterialCategory) || errors.Is(err, service.ErrInvalidMaterialUnit) { + if errors.Is(err, service.ErrInvalidMaterialCategory) || errors.Is(err, service.ErrInvalidMaterialUnit) || errors.Is(err, service.ErrMaterialNameTooLong) || errors.Is(err, service.ErrMaterialSpecTooLong) { response.BadRequest(c, err.Error()) return } @@ -371,7 +371,7 @@ func (h *Handler) UpdateMaterial(c *gin.Context) { material, err := h.materialSvc.Update(orgID, id, &req, operator) if err != nil { - if errors.Is(err, service.ErrInvalidMaterialCategory) || errors.Is(err, service.ErrInvalidMaterialUnit) { + if errors.Is(err, service.ErrInvalidMaterialCategory) || errors.Is(err, service.ErrInvalidMaterialUnit) || errors.Is(err, service.ErrMaterialNameTooLong) || errors.Is(err, service.ErrMaterialSpecTooLong) { response.BadRequest(c, err.Error()) return } diff --git a/internal/service/material.go b/internal/service/material.go index 7492cb3f..25041a1b 100644 --- a/internal/service/material.go +++ b/internal/service/material.go @@ -4,6 +4,7 @@ import ( "database/sql" "errors" "log" + "unicode/utf8" "github.com/wmms/wmms/internal/model" "github.com/wmms/wmms/internal/repository" @@ -11,6 +12,12 @@ import ( var ErrInvalidMaterialCategory = errors.New("请选择有效的小类类型") +var ErrMaterialNameTooLong = errors.New("物料名称过长,请小于200字") +var ErrMaterialSpecTooLong = errors.New("物料规格过长,请小于200字") + +const maxMaterialNameLength = 200 +const maxMaterialSpecLength = 200 + // ErrInvalidMaterialUnit 表示物料引用的基本单位无效:要么不属于当前公司, // 要么已停用。创建以及"改选"单位时都要求是本公司启用中的单位。 var ErrInvalidMaterialUnit = errors.New("请选择有效的单位") @@ -65,6 +72,12 @@ func (s *MaterialService) Create(req *model.CreateMaterialRequest, operator stri if organizationID <= 0 { return nil, ErrInvalidOrganizationID } + if utf8.RuneCountInString(req.Name) > maxMaterialNameLength { + return nil, ErrMaterialNameTooLong + } + if utf8.RuneCountInString(req.Spec) > maxMaterialSpecLength { + return nil, ErrMaterialSpecTooLong + } if err := s.validateCategory(req.CategoryID, organizationID); err != nil { return nil, err } @@ -184,6 +197,12 @@ func (s *MaterialService) Update(organizationID, id int64, req *model.UpdateMate if err != nil { return nil, err } + if utf8.RuneCountInString(req.Name) > maxMaterialNameLength { + return nil, ErrMaterialNameTooLong + } + if utf8.RuneCountInString(req.Spec) > maxMaterialSpecLength { + return nil, ErrMaterialSpecTooLong + } if req.CategoryID == nil || *req.CategoryID <= 0 { return nil, ErrInvalidMaterialCategory }