摘要
回青岛之后,也是开始相亲了,相亲肯定约见面的。
想到之前 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
| |
三、非功能需求
3.1 性能要求
- 系统启动时间 < 5 秒
- API 响应时间 < 500ms
- 支持并发访问(使用互斥锁保证数据安全)
3.2 可用性要求
- 界面采用新拟态设计风格
- 响应式布局,支持移动端访问
- 操作反馈清晰(成功/失败提示)
3.3 可配置性要求
- 服务端口可配置
- 路由前缀可配置
- 邮件服务器(SMTP)可配置
- 日志功能可开关
四、接口设计
4.1 API 接口
4.1.1 创建邀约
- 接口路径:
{route_prefix}/api/create - 请求方法: POST
- 请求体:
json
| |
- 响应(成功):
json
| |
- 响应(失败):
json
| |
4.1.2 获取邀约详情
- 接口路径:
{route_prefix}/api/invite/{id} - 请求方法: GET
- 响应(成功):
json
| |
4.1.3 响应邀约
- 接口路径:
{route_prefix}/api/respond - 请求方法: POST
- 请求体:
json
| |
- 响应(成功):
json
| |
4.2 页面路由
| 路径 | 页面 |
|---|---|
{route_prefix}/ | 邀请函创建页面 |
{route_prefix}/invite/{id} | 邀请函详情页面 |
五、配置说明
5.1 配置文件结构(config.yaml)
yaml
| |
六、数据结构
6.1 邀请函结构(Invitation)
| 字段 | 类型 | 说明 |
|---|---|---|
| ID | string | 唯一标识符(Base64 编码,20 字符) |
| Inviter | string | 邀请人姓名 |
| Name | string | 被邀请人姓名 |
| Time | string | 见面时间 |
| Location | string | 见面地点 |
| Receivers | string | 通知邮箱列表 |
| ExpiresAt | time.Time | 有效期截止时间 |
| Status | string | 状态(pending/confirmed/expired) |
| CreatedAt | time.Time | 创建时间 |
| EmailEnabled | bool | 是否启用邮件通知 |
七、部署说明
7.1 运行环境
- Go 1.16+
- 支持 YAML 配置文件读取
7.2 启动方式
bash
| |
7.3 测试命令
bash
| |
八、界面设计
8.1 设计风格
- 新拟态(Neumorphism)设计风格
- 渐变背景色
- 柔和的阴影效果
- 流畅的交互动画
8.2 主要页面
- 创建邀约页:表单输入 + 结果展示
- 邀约详情页:信息展示 + 确认/拒绝按钮
九、安全考虑
9.1 数据安全
- 邀约数据存储在内存中(程序重启后丢失)
- 邀请密码用于验证邮件功能权限
- 日志中不记录敏感信息(密码)
9.2 访问控制
- 邀约链接包含唯一 ID,无额外认证
- 邮件功能需要密码验证
