@qq33357486/oh-my-task 1.4.24 → 1.4.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -93
- package/dist/api/routes/auth.d.ts.map +1 -1
- package/dist/api/routes/auth.js +6 -9
- package/dist/api/routes/auth.js.map +1 -1
- package/dist/services/user.service.d.ts +3 -2
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +17 -13
- package/dist/services/user.service.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,21 +1,38 @@
|
|
|
1
1
|
# oh-my-task
|
|
2
2
|
|
|
3
|
-
AI
|
|
3
|
+
面向个人、小团队和 AI Agent 的轻量任务管理系统。用一个统一入口管理项目、版本、任务、排期、REST API 和 MCP 协作。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**公共服务**:[https://task.duojie.games](https://task.duojie.games)<br>
|
|
6
|
+
**自托管**:Docker 一条命令启动,数据保存在你自己的 SQLite 文件中。
|
|
6
7
|
|
|
7
|
-
-
|
|
8
|
-
- **智能排期** — 自动跳过周末和中国法定节假日
|
|
9
|
-
- **MCP 集成** — 11 个工具,AI 助手直接管理任务
|
|
10
|
-
- **管理后台** — 统计面板、用户管理、系统配置
|
|
11
|
-
- **权限体系** — 首位用户自动成为管理员,Session + Bearer Token 双认证
|
|
12
|
-
- **Docker 部署** — 零配置一键启动
|
|
8
|
+

|
|
13
9
|
|
|
14
|
-
##
|
|
10
|
+
## 为什么使用 oh-my-task
|
|
15
11
|
|
|
16
|
-
|
|
12
|
+
- **适合真实项目推进**:按项目、版本、主任务、子任务组织工作,不只是普通 TODO。
|
|
13
|
+
- **版本生命周期清晰**:创建 → 启动/锁定 → 完成 → 归档,适合阶段性交付。
|
|
14
|
+
- **智能排期**:根据预计天数自动计算排期,并跳过周末和中国法定节假日。
|
|
15
|
+
- **AI 协作友好**:提供 REST API 和 MCP 工具,AI 助手可以直接创建、查询、推进和完成任务。
|
|
16
|
+
- **公共服务与自托管并存**:可以直接使用 `task.duojie.games`,也可以部署到自己的服务器。
|
|
17
|
+
- **权限与后台**:支持 Session 登录、Bearer Token、用户管理、系统配置和统计面板。
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
## 直接使用公共服务
|
|
20
|
+
|
|
21
|
+
1. 打开 [task.duojie.games](https://task.duojie.games)。
|
|
22
|
+
2. 注册账号并创建项目。
|
|
23
|
+
3. 创建版本和任务,或在设置页创建 Token 后接入 MCP。
|
|
24
|
+
|
|
25
|
+
公共服务适合快速开始、个人项目和轻量团队协作。如果你需要完全掌控数据,可以使用下面的 Docker 自托管方式。
|
|
26
|
+
|
|
27
|
+
## 页面预览
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
## Docker 自托管
|
|
34
|
+
|
|
35
|
+
一条命令启动:
|
|
19
36
|
|
|
20
37
|
```bash
|
|
21
38
|
docker run -d --name oh-my-task \
|
|
@@ -24,7 +41,7 @@ docker run -d --name oh-my-task \
|
|
|
24
41
|
ghcr.io/qq33357486/oh-my-task:latest
|
|
25
42
|
```
|
|
26
43
|
|
|
27
|
-
|
|
44
|
+
使用 `docker-compose.yml`:
|
|
28
45
|
|
|
29
46
|
```yaml
|
|
30
47
|
services:
|
|
@@ -45,16 +62,16 @@ services:
|
|
|
45
62
|
docker compose up -d
|
|
46
63
|
```
|
|
47
64
|
|
|
48
|
-
|
|
65
|
+
访问 `http://localhost:17173` 打开 Web 界面。空库初始化时,首位注册用户会自动成为管理员。
|
|
49
66
|
|
|
50
|
-
|
|
67
|
+
## 本地开发
|
|
51
68
|
|
|
52
69
|
```bash
|
|
53
70
|
# 安装依赖
|
|
54
71
|
npm install
|
|
55
72
|
cd web && npm install && cd ..
|
|
56
73
|
|
|
57
|
-
#
|
|
74
|
+
# 构建后端和前端
|
|
58
75
|
npm run build
|
|
59
76
|
cd web && npm run build && cd ..
|
|
60
77
|
|
|
@@ -68,26 +85,20 @@ PowerShell:
|
|
|
68
85
|
$env:WEB_DIST_PATH = "web/dist"; $env:API_PORT = "17173"; npm start
|
|
69
86
|
```
|
|
70
87
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
### 前端热更新调试(可选)
|
|
88
|
+
开发时也可以分别启动后端和 Vite:
|
|
74
89
|
|
|
75
90
|
```bash
|
|
76
91
|
npm run dev
|
|
77
92
|
cd web && npm run dev
|
|
78
93
|
```
|
|
79
94
|
|
|
80
|
-
Vite
|
|
95
|
+
Vite 的 `http://localhost:5173` 仅用于前端热更新调试;正式入口、Docker 和功能 QA 都使用统一端口 `17173`。
|
|
81
96
|
|
|
82
97
|
## 配置 MCP
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
oh-my-task 通过**项目名称**来区分不同项目,建议将 MCP 配置在**项目级**(如 `.cursor/mcp.json`、`.claude/mcp.json`),而非全局配置。这样每个项目使用各自的项目名,AI 工具自动定位到正确的任务空间。
|
|
99
|
+
在 Web 设置页创建 Token:右上角 → 设置 → 创建 Token。
|
|
87
100
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
在项目根目录创建 `.cursor/mcp.json` 或 `.claude/mcp.json`:
|
|
101
|
+
oh-my-task 通过**项目名称**区分不同任务空间,推荐把 MCP 配置放在项目级文件中,例如 `.cursor/mcp.json` 或 `.claude/mcp.json`。
|
|
91
102
|
|
|
92
103
|
```json
|
|
93
104
|
{
|
|
@@ -96,8 +107,8 @@ oh-my-task 通过**项目名称**来区分不同项目,建议将 MCP 配置在
|
|
|
96
107
|
"command": "npx",
|
|
97
108
|
"args": ["@qq33357486/oh-my-task"],
|
|
98
109
|
"env": {
|
|
99
|
-
"OMT_SERVER_URL": "
|
|
100
|
-
"OMT_TOKEN": "你的Token",
|
|
110
|
+
"OMT_SERVER_URL": "https://task.duojie.games",
|
|
111
|
+
"OMT_TOKEN": "你的 Token",
|
|
101
112
|
"OMT_PROJECT_NAME": "当前项目名称"
|
|
102
113
|
}
|
|
103
114
|
}
|
|
@@ -105,57 +116,39 @@ oh-my-task 通过**项目名称**来区分不同项目,建议将 MCP 配置在
|
|
|
105
116
|
}
|
|
106
117
|
```
|
|
107
118
|
|
|
108
|
-
|
|
119
|
+
如果使用本地 Docker 服务,把 `OMT_SERVER_URL` 改为:
|
|
109
120
|
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
"mcpServers": {
|
|
113
|
-
"oh-my-task": {
|
|
114
|
-
"command": "npx",
|
|
115
|
-
"args": ["@qq33357486/oh-my-task"],
|
|
116
|
-
"env": {
|
|
117
|
-
"OMT_SERVER_URL": "http://localhost:17173",
|
|
118
|
-
"OMT_TOKEN": "你的Token",
|
|
119
|
-
"OMT_PROJECT_NAME": "项目名称"
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
121
|
+
```text
|
|
122
|
+
http://localhost:17173
|
|
124
123
|
```
|
|
125
124
|
|
|
126
|
-
### MCP
|
|
125
|
+
### MCP 工具
|
|
127
126
|
|
|
128
127
|
| 工具 | 说明 |
|
|
129
|
-
|
|
128
|
+
| --- | --- |
|
|
130
129
|
| `init_project` | 初始化项目 |
|
|
131
130
|
| `create_task` | 创建任务 |
|
|
132
131
|
| `list_tasks` | 列出任务 |
|
|
133
132
|
| `get_task` | 获取任务详情 |
|
|
134
|
-
| `activate_task` |
|
|
135
|
-
| `complete_task` |
|
|
133
|
+
| `activate_task` | 开始任务 |
|
|
134
|
+
| `complete_task` | 完成任务 |
|
|
136
135
|
| `delete_task` | 删除任务 |
|
|
137
136
|
| `create_version` | 创建版本 |
|
|
138
137
|
| `list_versions` | 列出版本 |
|
|
139
138
|
| `get_current_task` | 获取当前进行中的主任务及子任务 |
|
|
140
|
-
| `auto_schedule` |
|
|
139
|
+
| `auto_schedule` | 自动排期并跳过节假日 |
|
|
141
140
|
|
|
142
|
-
##
|
|
141
|
+
## 常见使用方式
|
|
143
142
|
|
|
144
|
-
|
|
143
|
+
创建版本:
|
|
145
144
|
|
|
146
|
-
```
|
|
145
|
+
```text
|
|
147
146
|
创建版本 v1.0:用户系统
|
|
148
147
|
```
|
|
149
148
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
```
|
|
153
|
-
在 v1.0 下创建任务:用户登录功能
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### 3. 批量创建
|
|
149
|
+
批量创建任务:
|
|
157
150
|
|
|
158
|
-
```
|
|
151
|
+
```text
|
|
159
152
|
在 v1.0 下批量创建任务:
|
|
160
153
|
- 用户登录
|
|
161
154
|
- 登录表单
|
|
@@ -164,56 +157,42 @@ oh-my-task 通过**项目名称**来区分不同项目,建议将 MCP 配置在
|
|
|
164
157
|
- 列表页面
|
|
165
158
|
```
|
|
166
159
|
|
|
167
|
-
|
|
160
|
+
推进任务:
|
|
168
161
|
|
|
169
|
-
```
|
|
162
|
+
```text
|
|
170
163
|
开始做「用户登录功能」
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
任务状态变为进行中。
|
|
174
|
-
|
|
175
|
-
### 5. 完成任务
|
|
176
|
-
|
|
177
|
-
```
|
|
178
164
|
「用户登录功能」做完了
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
### 6. 版本生命周期
|
|
182
|
-
|
|
183
|
-
```
|
|
184
|
-
启动版本 v1.0 → 锁定版本,不能再添加任务
|
|
185
|
-
完成版本 v1.0 → 所有任务完成
|
|
186
|
-
归档版本 v1.0 → 移入归档
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### 7. 查看当前任务
|
|
190
|
-
|
|
191
|
-
```
|
|
192
165
|
当前在做什么?
|
|
193
166
|
```
|
|
194
167
|
|
|
195
|
-
|
|
168
|
+
自动排期:
|
|
196
169
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
```
|
|
170
|
+
```text
|
|
200
171
|
给 v1.0 的任务自动排期,从下周一开始
|
|
201
172
|
```
|
|
202
173
|
|
|
203
|
-
自动跳过周末和中国法定节假日。
|
|
204
|
-
|
|
205
174
|
## 环境变量
|
|
206
175
|
|
|
207
176
|
| 变量 | 说明 | 默认值 |
|
|
208
|
-
|
|
177
|
+
| --- | --- | --- |
|
|
209
178
|
| `API_PORT` | Web/API 统一服务端口 | `17173` |
|
|
210
179
|
| `DB_PATH` | SQLite 数据库路径 | `./data/data.db` |
|
|
211
180
|
| `WEB_DIST_PATH` | 前端构建产物目录 | `web/dist` |
|
|
212
|
-
| `
|
|
213
|
-
| `
|
|
214
|
-
| `
|
|
181
|
+
| `FRONTEND_URL` | Vite 调试模式 CORS origin | `http://localhost:5173` |
|
|
182
|
+
| `SESSION_SECRET` | Session 密钥 | `omt-session-secret-change-in-production` |
|
|
183
|
+
| `OMT_SERVER_URL` | MCP/API 服务地址 | `http://localhost:17173` |
|
|
184
|
+
| `OMT_TOKEN` | MCP Bearer Token | 空 |
|
|
185
|
+
| `OMT_PROJECT_NAME` | MCP 默认项目名称 | 空 |
|
|
186
|
+
|
|
187
|
+
## 技术栈
|
|
188
|
+
|
|
189
|
+
- 后端:Express.js + TypeScript + SQLite
|
|
190
|
+
- 前端:React 19 + Vite + TanStack Query + Tailwind CSS 4
|
|
191
|
+
- AI 协作:REST API + MCP stdio server
|
|
192
|
+
- 部署:Docker / Node.js 统一服务入口
|
|
215
193
|
|
|
216
|
-
##
|
|
194
|
+
## 链接
|
|
217
195
|
|
|
218
|
-
- [
|
|
219
|
-
- [
|
|
196
|
+
- 公共服务:[https://task.duojie.games](https://task.duojie.games)
|
|
197
|
+
- 英文版:[README_EN.md](README_EN.md)
|
|
198
|
+
- GitHub:[https://github.com/qq33357486/oh-my-task](https://github.com/qq33357486/oh-my-task)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/api/routes/auth.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAExB,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,WAAW;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB;CACF;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/api/routes/auth.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAExB,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,WAAW;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB;CACF;AAwPD,eAAe,MAAM,CAAC"}
|
package/dist/api/routes/auth.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
|
-
import { createUser, loginUser, getUserById, toPublicUser, changePassword,
|
|
2
|
+
import { createUser, loginUser, getUserById, toPublicUser, changePassword, sendPasswordResetCode, resetPassword, sendEmailCode, verifyEmailCode } from '../../services/user.service.js';
|
|
3
3
|
import { isRegistrationEnabled } from '../../services/config.service.js';
|
|
4
4
|
import { ensureDefaultToken } from '../../services/token.service.js';
|
|
5
5
|
import { getDb } from '../../db/connection.js';
|
|
@@ -184,13 +184,10 @@ router.post('/forgot-password', async (req, res) => {
|
|
|
184
184
|
res.status(400).json({ success: false, error: '请输入邮箱地址' });
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
|
-
|
|
188
|
-
if (resetToken) {
|
|
189
|
-
console.log(`[Password Reset] Token for ${email}: ${resetToken}`);
|
|
190
|
-
}
|
|
187
|
+
await sendPasswordResetCode(email);
|
|
191
188
|
res.json({
|
|
192
189
|
success: true,
|
|
193
|
-
message: '
|
|
190
|
+
message: '如果该邮箱已注册,您将收到密码重置验证码'
|
|
194
191
|
});
|
|
195
192
|
}
|
|
196
193
|
catch (error) {
|
|
@@ -200,12 +197,12 @@ router.post('/forgot-password', async (req, res) => {
|
|
|
200
197
|
});
|
|
201
198
|
router.post('/reset-password', async (req, res) => {
|
|
202
199
|
try {
|
|
203
|
-
const {
|
|
204
|
-
if (!
|
|
200
|
+
const { email, code, new_password } = req.body;
|
|
201
|
+
if (!email || !code || !new_password) {
|
|
205
202
|
res.status(400).json({ success: false, error: '缺少必填字段' });
|
|
206
203
|
return;
|
|
207
204
|
}
|
|
208
|
-
await resetPassword({
|
|
205
|
+
await resetPassword({ email, code, newPassword: new_password });
|
|
209
206
|
res.json({ success: true, message: '密码重置成功,请使用新密码登录' });
|
|
210
207
|
}
|
|
211
208
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/api/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/api/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACxL,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAQxB;;GAEG;AACH,SAAS,oBAAoB,CAAC,GAAY;IACxC,iBAAiB;IACjB,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,YAAY,CAAC,IAAI,CAA8D,CAAC;QACzF,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YAEnB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;OAK9B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAoC,CAAC;YAEjD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,IAAI,EAAE,CAAC;oBACT,WAAW;oBACX,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACjG,OAAO,YAAY,CAAC,IAAI,CAA8D,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,UAAU;AACV,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,WAAW;QACX,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAuB,CAAC;YAC/F,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAuB,CAAC;QAC/F,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YACD,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC;YACnC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACrE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5B,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QAE7B,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAErC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5B,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QAE7B,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;aACzB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACrD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,IAAI;SACL;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpE,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QAEhG,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpE,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAEnC,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QAEhE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAClE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAuB,CAAC;IAC/F,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC;IAEzC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,IAAI,qBAAqB,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;KAClF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -23,7 +23,8 @@ export interface ChangePasswordParams {
|
|
|
23
23
|
newPassword: string;
|
|
24
24
|
}
|
|
25
25
|
export interface ResetPasswordParams {
|
|
26
|
-
|
|
26
|
+
email: string;
|
|
27
|
+
code: string;
|
|
27
28
|
newPassword: string;
|
|
28
29
|
}
|
|
29
30
|
/**
|
|
@@ -60,7 +61,7 @@ export declare function changePassword(params: ChangePasswordParams): Promise<bo
|
|
|
60
61
|
/**
|
|
61
62
|
* 生成密码重置令牌
|
|
62
63
|
*/
|
|
63
|
-
export declare function
|
|
64
|
+
export declare function sendPasswordResetCode(email: string): Promise<boolean>;
|
|
64
65
|
/**
|
|
65
66
|
* 使用重置令牌重置密码
|
|
66
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAcjE;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAInD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,qBAAqB,CAAC,CAS5G;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAWrG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BnF;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAcjE;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAInD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,qBAAqB,CAAC,CAS5G;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAWrG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BnF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2B3E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAI9C"}
|
|
@@ -165,35 +165,39 @@ export async function changePassword(params) {
|
|
|
165
165
|
/**
|
|
166
166
|
* 生成密码重置令牌
|
|
167
167
|
*/
|
|
168
|
-
export function
|
|
168
|
+
export async function sendPasswordResetCode(email) {
|
|
169
|
+
if (!validateEmail(email)) {
|
|
170
|
+
throw new Error('邮箱格式无效');
|
|
171
|
+
}
|
|
169
172
|
const db = getDb();
|
|
170
173
|
const normalizedEmail = normalizeEmail(email);
|
|
171
174
|
const user = db.prepare('SELECT * FROM users WHERE email = ?').get(normalizedEmail);
|
|
172
175
|
if (!user) {
|
|
173
|
-
return
|
|
176
|
+
return false;
|
|
174
177
|
}
|
|
175
|
-
const
|
|
176
|
-
const expiresAt = new Date(Date.now() +
|
|
178
|
+
const code = String(Math.floor(100000 + Math.random() * 900000));
|
|
179
|
+
const expiresAt = new Date(Date.now() + 5 * 60 * 1000).toISOString();
|
|
177
180
|
db.prepare(`
|
|
178
181
|
UPDATE users SET reset_token = ?, reset_token_expires = ? WHERE id = ?
|
|
179
|
-
`).run(
|
|
180
|
-
|
|
182
|
+
`).run(code, expiresAt, user.id);
|
|
183
|
+
await sendEmail(normalizedEmail, '密码重置验证码 - oh-my-task', `您的密码重置验证码是:${code}\n验证码 5 分钟内有效,请勿泄露给他人。`);
|
|
184
|
+
return true;
|
|
181
185
|
}
|
|
182
186
|
/**
|
|
183
187
|
* 使用重置令牌重置密码
|
|
184
188
|
*/
|
|
185
189
|
export async function resetPassword(params) {
|
|
186
|
-
const {
|
|
190
|
+
const { email, code, newPassword } = params;
|
|
187
191
|
const db = getDb();
|
|
192
|
+
const normalizedEmail = normalizeEmail(email);
|
|
188
193
|
const user = db.prepare(`
|
|
189
|
-
SELECT * FROM users WHERE
|
|
190
|
-
`).get(
|
|
191
|
-
if (!user) {
|
|
192
|
-
throw new Error('
|
|
194
|
+
SELECT * FROM users WHERE email = ?
|
|
195
|
+
`).get(normalizedEmail);
|
|
196
|
+
if (!user || !user.reset_token || user.reset_token !== code) {
|
|
197
|
+
throw new Error('验证码错误或已过期');
|
|
193
198
|
}
|
|
194
|
-
// 检查 token 是否过期(使用 JavaScript Date 比较,避免 SQLite 字符串格式差异)
|
|
195
199
|
if (!user.reset_token_expires || new Date(user.reset_token_expires) <= new Date()) {
|
|
196
|
-
throw new Error('
|
|
200
|
+
throw new Error('验证码错误或已过期');
|
|
197
201
|
}
|
|
198
202
|
const passwordCheck = validatePasswordStrength(newPassword);
|
|
199
203
|
if (!passwordCheck.valid) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAS9C,uCAAuC;AACvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+C,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;IACpD,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,CACb,KAAK,EACL,oBAAoB,EACpB,YAAY,IAAI,wBAAwB,CACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,IAAY;IACzD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,aAAa;AACb,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,IAAY;IAC9D,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC7F,CAAC;
|
|
1
|
+
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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"}
|