- 后端新增邮箱绑定/验证、忘记密码/重置密码、修改密码接口 - users 表新增 nickname、avatar 字段,含迁移脚本 - 新增 PUT /api/auth/me 更新头像和昵称 - 新增 POST /api/auth/change-password 修改密码(需旧密码) - 前端新增 ProfileModal 个人中心(头像上传、昵称、邀请码、邮箱绑定、修改密码、退出) - LoginModal 新增忘记密码流程 - UserMenu 点击头像直接打开个人中心 - server/lib/email.ts:nodemailer 邮件发送封装 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import nodemailer from 'nodemailer'
|
||
|
||
const transporter = nodemailer.createTransport({
|
||
host: 'smtp.126.com',
|
||
port: 465,
|
||
secure: true,
|
||
auth: {
|
||
user: 'mikivl@126.com',
|
||
pass: process.env.EMAIL_PASS!,
|
||
},
|
||
})
|
||
|
||
export async function sendVerifyCode(to: string, code: string) {
|
||
await transporter.sendMail({
|
||
from: '"MikiVL 笔记" <mikivl@126.com>',
|
||
to,
|
||
subject: '邮箱验证码',
|
||
text: `你的验证码是:${code},10 分钟内有效。`,
|
||
html: `<p style="font-family:sans-serif">你的验证码是:<strong style="font-size:1.2em;letter-spacing:0.1em">${code}</strong>,10 分钟内有效。</p>`,
|
||
})
|
||
}
|
||
|
||
export async function sendResetCode(to: string, code: string) {
|
||
await transporter.sendMail({
|
||
from: '"MikiVL 笔记" <mikivl@126.com>',
|
||
to,
|
||
subject: '重置密码验证码',
|
||
text: `你的重置密码验证码是:${code},10 分钟内有效。如非本人操作请忽略。`,
|
||
html: `<p style="font-family:sans-serif">你的重置密码验证码是:<strong style="font-size:1.2em;letter-spacing:0.1em">${code}</strong>,10 分钟内有效。如非本人操作请忽略。</p>`,
|
||
})
|
||
}
|