Files
web_huakui_server/app/service/contactusser/contactus.go
T
rootandClaude Opus 4.7 85c0071fd8 feat: 从黄果 NET hgdjnet-server 9bfbafe 导入 HKDJ 官网后端
来源:hgdjnet-server 9bfbafe10d417deea959bd53117bc88a10e60a83
项目身份 HKDJ / JHA-216,独立官网仓库,Jenkins 守卫键 hkdjnet
测试目录 /server/hkdj_net,App/Web API 30331/30332

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-16 11:20:04 +08:00

94 lines
2.8 KiB
Go

package contactusser
import (
"context"
"hkdj-web-server/app/api/proto"
"hkdj-web-server/pub/common/srvdef"
"hkdj-web-server/pub/models/contactusmod"
"net/mail"
"strings"
"time"
"unicode/utf8"
)
const (
contactUsMaxEmailLen = 100
contactUsMaxTitleLen = 100
contactUsMaxContentLen = 1000
contactUsMaxAttachmentNum = 9
contactUsSubmitMessage = "提交成功,我们会在24小时内回复。"
)
const (
ContactUsTypeOrder int32 = 1 // 订单问题
ContactUsTypeAccount int32 = 2 // 账号问题
ContactUsTypeFeature int32 = 3 // 功能问题
ContactUsTypeExp int32 = 4 // 体验问题
ContactUsTypeOther int32 = 5 // 其他
)
// AddContactUs 提交联系我们记录
func AddContactUs(ctx context.Context, userId int64, req *proto.ContactUsAddReq) (*proto.ContactUsAddResp, *srvdef.SrvErr) {
if req == nil || userId <= 0 {
return nil, srvdef.New(srvdef.ErrParamError, "", "")
}
email := strings.TrimSpace(req.Email)
if !isValidEmail(email) || utf8.RuneCountInString(email) > contactUsMaxEmailLen {
return nil, srvdef.New(srvdef.ErrParamError, "邮箱格式错误")
}
if !isValidContactUsType(req.Type) {
return nil, srvdef.New(srvdef.ErrParamError, "问题类型无效")
}
title := strings.TrimSpace(req.Title)
if title == "" || utf8.RuneCountInString(title) > contactUsMaxTitleLen {
return nil, srvdef.New(srvdef.ErrParamError, "标题不能为空且不能超过100字")
}
content := strings.TrimSpace(req.Content)
if content == "" || utf8.RuneCountInString(content) > contactUsMaxContentLen {
return nil, srvdef.New(srvdef.ErrParamError, "内容不能为空且不能超过1000字")
}
attachments := normalizeAttachments(req.Attachments)
if len(attachments) > contactUsMaxAttachmentNum {
return nil, srvdef.New(srvdef.ErrParamError, "附件不能超过9个")
}
now := time.Now()
doc := &contactusmod.ContactUs{
UserId: userId,
Email: email,
QuestionType: req.Type,
Title: title,
Content: content,
Attachments: attachments,
Status: 0,
CreatedAt: now,
UpdatedAt: now,
}
if err := contactusmod.InsertOneContactUs(ctx, doc); err != nil {
return nil, err
}
return &proto.ContactUsAddResp{Message: contactUsSubmitMessage}, nil
}
func isValidEmail(email string) bool {
if email == "" {
return false
}
_, err := mail.ParseAddress(email)
return err == nil
}
func isValidContactUsType(questionType int32) bool {
return questionType >= ContactUsTypeOrder && questionType <= ContactUsTypeOther
}
func normalizeAttachments(rawAttachments []string) []string {
attachments := make([]string, 0, len(rawAttachments))
for _, attachment := range rawAttachments {
attachment = strings.TrimSpace(attachment)
if attachment != "" {
attachments = append(attachments, attachment)
}
}
return attachments
}