router.js
router.get('/register/registerStep3', initMiddleware, controller.default.pass.registerStep3);
router.post('/pass/doRegister', initMiddleware, controller.default.pass.doRegister);
model
app/model/user.js
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
var d = new Date();
const User = new Schema({
password: { type: String },
phone: { type: Number },
last_ip: { type: String },
add_time: {
type: Number,
default: d.getTime()
},
email: { type: String },
status: {
type: Number,
default: d.getTime()
}
});
return mongoose.model('User', User, 'user');
}
註冊頁面
controller
app/controller/default/pass.js
async registerStep3() {
var sign = this.ctx.request.query.sign;
var phone_code = this.ctx.request.query.phone_code;
var msg = this.ctx.request.query.msg || '';
var add_day = await this.service.tools.getDay(); //年月日
var userTempResult = await this.ctx.model.UserTemp.find({ "sign": sign, add_day: add_day });
if (userTempResult.length == 0) {
this.ctx.redirect('/register/registerStep1');
} else {
await this.ctx.render('default/pass/register_step3.html', {
sign: sign,
phone_code: phone_code,
msg: msg
});
}
}
view
appviewdefaultpassregister_step3.html
<form action="/pass/doRegister?_csrf=<%=csrf%>" method="post" id="form">
<input type="hidden" name="sign" value="<%=sign%>" />
<input type="hidden" name="phone_code" value="<%=phone_code%>" />
<div>
<input class="form_input" type="password" id="password" name="password" placeholder="請輸入密碼" />
</div>
<div>
<input class="form_input" type="password" id="rpassword" name="rpassword" placeholder="請輸入確認密碼" />
</div>
<%if(msg){%>
<p style="color:red">
<%=msg%>
</p>
<%}%>
<div class="regist_submit">
<input class="submit" id="nextStep" type="submit" name="submit" value="下一步">
</div>
</form>
$(function() {
$("#form").submit(function() {
var password = $('#password').val();
var rpassword = $('#rpassword').val();
if (password.length < 6) {
alert('用戶名的長度不能小於6位');
return false;
}
if (password != rpassword) {
alert('密碼和確認密碼不一致');
return false;
}
return true;
})
})
效果

提交註冊,跳轉到首頁
controller
app/controller/default/pass.js
async doRegister() {
var sign = this.ctx.request.body.sign;
var phone_code = this.ctx.request.body.phone_code;
var add_day = await this.service.tools.getDay(); //年月日
var password = this.ctx.request.body.password;
var rpassword = this.ctx.request.body.rpassword;
var ip = this.ctx.request.ip.replace(/::ffff:/, '');
if (this.ctx.session.phone_code != phone_code) {
//非法操做
this.ctx.redirect('/pass/registerStep1');
}
var userTempResult = await this.ctx.model.UserTemp.find({ "sign": sign, add_day: add_day });
if (userTempResult.length == 0) {
//非法操做
this.ctx.redirect('/pass/registerStep1');
} else {
//傳入參數正確 執行增長操做
if (password.length < 6 || password != rpassword) {
var msg = '密碼不能小於6位而且密碼和確認密碼必須一致';
this.ctx.redirect('/register/registerStep3?sign=' + sign + '&phone_code=' + phone_code + '&msg=' + msg);
} else {
var userModel = new this.ctx.model.User({
phone: userTempResult[0].phone,
password: await this.service.tools.md5(password),
last_ip: ip
})
//保存用戶
var userReuslt = await userModel.save();
if (userReuslt) {
//獲取用戶信息
var userinfo = await this.ctx.model.User.find({ "phone": userTempResult[0].phone }, '_id phone last_ip add_time email status')
//用戶註冊成功之後默認登陸
//cookies 安全 加密
this.service.cookies.set('userinfo', userinfo[0]);
this.ctx.redirect('/');
}
}
}
}
中間件
app/middleware/init.js
ctx.state.csrf = ctx.csrf; //全局變量
//獲取用戶信息
ctx.state.userinfo = ctx.service.cookies.get('userinfo');
view
app/view/default/public/header.html
<%if(userinfo && userinfo.phone){%>
<li>
<a href="#">
<%=userinfo.phone%>
</a>
</li>
<%}%>
效果
