Skip to content

Commit 5417eee

Browse files
committed
controller: finish sign controller
1 parent 99adab7 commit 5417eee

File tree

6 files changed

+137
-9
lines changed

6 files changed

+137
-9
lines changed

app/controller/sign.js

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

33
const validator = require('validator');
4+
const utility = require('utility');
5+
const uuid = require('uuid');
46
const Controller = require('egg').Controller;
57

68
const tools = require('../common/tools');
@@ -85,6 +87,130 @@ class SignController extends Controller {
8587
ctx.logout();
8688
ctx.redirect('/');
8789
}
90+
91+
async activeAccount() {
92+
const { ctx, service, config } = this;
93+
const key = validator.trim(ctx.query.key);
94+
const name = validator.trim(ctx.query.name);
95+
96+
const user = await service.user.getUserByLoginName(name);
97+
if (!user) {
98+
throw new Error('[ACTIVE_ACCOUNT] no such user: ' + name);
99+
}
100+
101+
const passhash = user.pass;
102+
if (!user || utility.md5(user.email + passhash + config.session_secret) !== key) {
103+
await ctx.render('notify/notify', { error: '信息有误,帐号无法被激活。' });
104+
return;
105+
}
106+
107+
if (user.active) {
108+
await ctx.render('notify/notify', { error: '帐号已经是激活状态。' });
109+
return;
110+
}
111+
112+
user.active = true;
113+
await user.save();
114+
await ctx.render('notify/notify', { success: '帐号已被激活,请登录' });
115+
}
116+
117+
async showSearchPass() {
118+
await this.ctx.render('sign/search_pass');
119+
}
120+
121+
async updateSearchPass() {
122+
const { ctx, service } = this;
123+
const email = validator.trim(ctx.request.body.email).toLowerCase();
124+
if (!validator.isEmail(email)) {
125+
await this.ctx.render('sign/search_pass', {
126+
error: '邮箱不合法',
127+
email,
128+
});
129+
return;
130+
}
131+
132+
// 动态生成retrive_key和timestamp到users collection,之后重置密码进行验证
133+
const retrieveKey = uuid.v4();
134+
const retrieveTime = Date.now();
135+
136+
const user = await service.user.getUserByMail(email);
137+
if (!user) {
138+
await this.ctx.render('sign/search_pass', {
139+
error: '没有这个电子邮箱。',
140+
email,
141+
});
142+
return;
143+
}
144+
145+
user.retrieve_key = retrieveKey;
146+
user.retrieve_time = retrieveTime;
147+
await user.save();
148+
149+
// 发送重置密码邮件
150+
// mail.sendResetPassMail(email, retrieveKey, user.loginname);
151+
await this.ctx.render('notify/notify', {
152+
success: '我们已给您填写的电子邮箱发送了一封邮件,请在24小时内点击里面的链接来重置密码。',
153+
});
154+
}
155+
156+
async resetPass() {
157+
const { ctx, service } = this;
158+
const key = validator.trim(ctx.query.key || '');
159+
const name = validator.trim(ctx.query.name || '');
160+
161+
const user = await service.user.getUserByNameAndKey(name, key);
162+
if (!user) {
163+
ctx.status = 403;
164+
await this.ctx.render('notify/notify', {
165+
error: '信息有误,密码无法重置。',
166+
});
167+
return;
168+
}
169+
170+
const now = Date.now();
171+
const oneDay = 1000 * 60 * 60 * 24;
172+
if (!user.retrieve_time || now - user.retrieve_time > oneDay) {
173+
ctx.status = 403;
174+
await this.ctx.render('notify/notify', {
175+
error: '该链接已过期,请重新申请。',
176+
});
177+
return;
178+
}
179+
await this.ctx.render('sign/reset', { name, key });
180+
}
181+
182+
async updatePass() {
183+
const { ctx, service } = this;
184+
const psw = validator.trim(ctx.body.psw) || '';
185+
const repsw = validator.trim(ctx.body.repsw) || '';
186+
const key = validator.trim(ctx.body.key) || '';
187+
const name = validator.trim(ctx.body.name) || '';
188+
189+
if (psw !== repsw) {
190+
await this.ctx.render('sign/reset', {
191+
name,
192+
key,
193+
error: '两次密码输入不一致。',
194+
});
195+
return;
196+
}
197+
const user = await service.user.getUserByNameAndKey(name, key);
198+
199+
if (!user) {
200+
await this.ctx.render('notify/notify', {
201+
error: '错误的激活链接',
202+
});
203+
return;
204+
}
205+
const passhash = tools.bhash(psw);
206+
user.pass = passhash;
207+
user.retrieve_key = null;
208+
user.retrieve_time = null;
209+
user.active = true; // 用户激活
210+
211+
await user.save();
212+
await this.ctx.render('notify/notify', { success: '你的密码已重置。' });
213+
}
88214
}
89215

90216
module.exports = SignController;

app/middleware/admin_required.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
module.exports = () => {
4-
/**
4+
/*
55
* 需要管理员权限
66
*/
77

app/middleware/user_required.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
'use strict';
22

33
module.exports = () => {
4-
/**
4+
5+
/*
56
* 需要登录
67
*/
7-
88
return async function(ctx, next) {
99
const { session } = ctx;
1010
if (!session || !session.user || !session.user._id) {

app/router.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ module.exports = app => {
3737
router.get('/signin', sign.showLogin); // 进入登录页面
3838
router.post('/passport/local', localStrategy);
3939
router.all('/signout', sign.signout); // 登出
40-
// router.get('/active_account', sign.activeAccount); // 帐号激活
40+
router.get('/active_account', sign.activeAccount); // 帐号激活
4141

4242
// github oauth
4343
app.passport.mount('github');
4444

45-
// router.get('/search_pass', sign.showSearchPass); // 找回密码页面
46-
// router.post('/search_pass', sign.updateSearchPass); // 更新密码
47-
// router.get('/reset_pass', sign.resetPass); // 进入重置密码页面
48-
// router.post('/reset_pass', sign.updatePass); // 更新密码
45+
router.get('/search_pass', sign.showSearchPass); // 找回密码页面
46+
router.post('/search_pass', sign.updateSearchPass); // 更新密码
47+
router.get('/reset_pass', sign.resetPass); // 进入重置密码页面
48+
router.post('/reset_pass', sign.updatePass); // 更新密码
4949

5050
// user controller
5151
router.get('/user/:name', user.index); // 用户个人主页

config/config.default.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module.exports = appInfo => {
99
// use for cookie sign key, should change to your own and keep security
1010
config.keys = appInfo.name + '_1519887194138_3450';
1111

12+
config.session_secret = 'node_club_secret'; // 务必修改
13+
1214
// add your config here
1315
config.middleware = [
1416
'locals',

test/app/service/user.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const { app, assert } = require('egg-mock/bootstrap');
44

5-
describe('user service', () => {
5+
describe('test/app/service/user.test.js', () => {
66
let loginname,
77
email;
88
before(async function() {

0 commit comments

Comments
 (0)