摘要

回青岛之后,也是开始相亲了,相亲肯定约见面的。

想到之前 hr 给我发了 offer,我同意 offer 之后。他又给我发了个欢迎信,仪式感还是满满的。

于是就想效仿欢迎信,实现一个相亲邀约系统,这是独属于码农的浪漫。

正文

借助 ai 原计划一小时实现,但实际耗时从晚上 21 点,搞到次日 2 点。

ai 在实现使用 smtp 发送邮件时,在邮箱未被拦截的情况下,出现偶现不好使的情况,ai 也知道不好使,重复的来回解决,反而越来越复杂,代码越写越多,但始终解决不了根本。最后还得我自己亲自来解决。

使用 Golang 实现类似的功能,还是太爽了,标准库直接四两拨千斤。放一下效果图,体验地址项目源码

下面放一下我让 ai 实现功能的需求文档,可直接粘贴给 ai 复现。

相亲邀约系统需求文档

一、项目概述

1.1 项目背景

相亲邀约系统是一个基于 Web 的轻量级邀约管理工具,旨在帮助用户创建、分享和确认相亲邀约,简化邀约流程。

1.2 项目目标

  • 提供简洁易用的邀请函创建界面
  • 支持通过链接分享邀约
  • 提供受邀人确认/拒绝功能
  • 支持邮件通知机制
  • 记录系统操作日志

1.3 技术栈

  • 后端: Go 语言(1.20.14)
  • 前端: HTML + Tailwind CSS (支持 Chrome 90)
  • 邮件: gomail 库
  • 配置: YAML

二、功能需求

2.1 邀请函创建功能

2.1.1 功能描述

用户可以通过前端表单创建相亲邀请函,填写相关信息后生成唯一邀约链接。

2.1.2 输入字段

字段名字段类型必填说明
邀请人姓名文本发起邀请的人的姓名
被邀请人姓名文本被邀请人的姓名
见面时间文本约定的见面时间(格式:YYYY-MM-DD HH:mm:ss,支持不完整输入自动补零)
见面地点文本约定的见面地点
通知邮箱文本确认后发送通知的邮箱(多个邮箱用英文逗号分隔)
邀请密码密码用于验证启用邮件功能的密码
有效期至文本邀约的有效期截止时间(格式同上)

2.1.3 输出结果

  • 成功:返回唯一邀约 ID 和完整邀约链接
  • 失败:返回错误信息

2.1.4 业务规则

  • 所有必填字段不能为空
  • 有效期必须大于当前时间
  • 邀请密码验证通过才启用邮件功能
  • 默认有效期为当前时间 +1 天
  • 时间输入支持不完整格式(如 "2024-6-6" 自动补为 "2024-06-06 00:00:00")

2.2 邀请函查看功能

2.2.1 功能描述

受邀人通过分享的链接访问邀请函页面,查看邀约详情。

2.2.2 显示内容

  • 邀请人姓名
  • 被邀请人姓名
  • 见面时间
  • 见面地点
  • 有效期至
  • 当前状态(待确认/已确认/已过期)

2.2.3 状态说明

状态说明
待确认邀约已创建,等待受邀人响应
已确认受邀人已同意邀约
已过期超过有效期未响应

2.3 邀请函响应功能

2.3.1 功能描述

受邀人可以对邀约进行确认或拒绝操作。

2.3.2 操作选项

  • 同意:确认参加,状态变为"已确认"
  • 拒绝:暂不参加,状态保持"待确认"(可再次响应)

2.3.3 业务规则

  • 只有"待确认"状态的邀约可以响应
  • 超过有效期的邀约无法响应
  • 同意后触发邮件通知(如果启用)
  • 拒绝操作不改变状态,仅显示提示信息

2.4 邮件通知功能

2.4.1 功能描述

当受邀人确认邀约后,系统自动向指定邮箱发送确认通知邮件。

2.4.2 邮件内容

  • 邮件主题:相亲邀约确认通知
  • 邮件正文:
    • 受邀人姓名
    • 邀请人姓名
    • 见面时间
    • 见面地点
    • 温馨提示

2.4.3 启用条件

  • 邮件配置项 mail.enabled 为 true
  • 创建邀约时提供的 invite_password 与配置中的一致
  • 提供了至少一个通知邮箱

2.5 日志记录功能

2.5.1 功能描述

系统记录关键操作日志,便于追踪和排查问题。

2.5.2 记录内容

操作类型记录信息
邮件发送收件人、发件人、主题、SSL 配置、发送结果
创建邀约邀约 ID、邀请人、被邀请人、时间、地点
获取邀约邀约 ID
响应邀约邀约 ID、操作类型
邀约同意邀约 ID、邀请人、被邀请人
邀约拒绝邀约 ID、邀请人、被邀请人
完整邀约数据创建邀约时记录完整的 JSON 数据

2.5.3 日志格式

text
1
[YYYY-MM-DD HH:mm:ss] 操作类型 - 参数信息

三、非功能需求

3.1 性能要求

  • 系统启动时间 < 5 秒
  • API 响应时间 < 500ms
  • 支持并发访问(使用互斥锁保证数据安全)

3.2 可用性要求

  • 界面采用新拟态设计风格
  • 响应式布局,支持移动端访问
  • 操作反馈清晰(成功/失败提示)

3.3 可配置性要求

  • 服务端口可配置
  • 路由前缀可配置
  • 邮件服务器(SMTP)可配置
  • 日志功能可开关

四、接口设计

4.1 API 接口

4.1.1 创建邀约

  • 接口路径: {route_prefix}/api/create
  • 请求方法: POST
  • 请求体:
json
1
2
3
4
5
6
7
8
9
{
  "inviter": "张三",
  "name": "李四",
  "time": "2024-06-06 14:30:00",
  "location": "星巴克咖啡厅",
  "receivers": "user1@example.com,user2@example.com",
  "invite_password": "我是你爸爸",
  "expires_at": "2024-06-07T18:00:00"
}
  • 响应(成功):
json
1
2
3
4
{
  "id": "abc123xyz",
  "url": "http://localhost:54191/date/invite/abc123xyz"
}
  • 响应(失败):
json
1
2
3
{
  "error": "缺少必填字段: inviter"
}

4.1.2 获取邀约详情

  • 接口路径: {route_prefix}/api/invite/{id}
  • 请求方法: GET
  • 响应(成功):
json
1
2
3
4
5
6
7
8
9
{
  "id": "abc123xyz",
  "inviter": "张三",
  "name": "李四",
  "time": "2024-06-06 14:30:00",
  "location": "星巴克咖啡厅",
  "status": "pending",
  "expires_at": "2024-06-07 18:00:00"
}

4.1.3 响应邀约

  • 接口路径: {route_prefix}/api/respond
  • 请求方法: POST
  • 请求体:
json
1
2
3
4
{
  "id": "abc123xyz",
  "action": "agree"
}
  • 响应(成功):
json
1
2
3
4
{
  "status": "success",
  "message": "邀约确认成功!"
}

4.2 页面路由

路径页面
{route_prefix}/邀请函创建页面
{route_prefix}/invite/{id}邀请函详情页面

五、配置说明

5.1 配置文件结构(config.yaml)

yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server:
  port: 54191                    # 服务端口
  route_prefix: "/date"          # 路由前缀
  invite_password: "我是你爸爸"      # 邀请密码

mail:
  enabled: true                  # 是否启用邮件功能
  port: 66                       # SMTP 端口
  host: smtp.mxhichina.com       # SMTP 主机
  username: user@example.com     # 发件人邮箱
  password: password             # 邮箱密码
  protocol: smtp                 # 协议
  ssl: false                     # 是否使用 SSL

log:
  enabled: true                  # 是否启用日志
  file_path: tmp.log             # 日志文件路径

六、数据结构

6.1 邀请函结构(Invitation)

字段类型说明
IDstring唯一标识符(Base64 编码,20 字符)
Inviterstring邀请人姓名
Namestring被邀请人姓名
Timestring见面时间
Locationstring见面地点
Receiversstring通知邮箱列表
ExpiresAttime.Time有效期截止时间
Statusstring状态(pending/confirmed/expired)
CreatedAttime.Time创建时间
EmailEnabledbool是否启用邮件通知

七、部署说明

7.1 运行环境

  • Go 1.16+
  • 支持 YAML 配置文件读取

7.2 启动方式

bash
1
go run main.go

7.3 测试命令

bash
1
go test -v -run TestSendEmail

八、界面设计

8.1 设计风格

  • 新拟态(Neumorphism)设计风格
  • 渐变背景色
  • 柔和的阴影效果
  • 流畅的交互动画

8.2 主要页面

  1. 创建邀约页:表单输入 + 结果展示
  2. 邀约详情页:信息展示 + 确认/拒绝按钮

九、安全考虑

9.1 数据安全

  • 邀约数据存储在内存中(程序重启后丢失)
  • 邀请密码用于验证邮件功能权限
  • 日志中不记录敏感信息(密码)

9.2 访问控制

  • 邀约链接包含唯一 ID,无额外认证
  • 邮件功能需要密码验证