1.验证码
npm i svg-captcha
1.1前端代码
<el-form >
<el-form-item prop="captcha" label="验证码" class="captcha-container" >
<div class="captcha">
<img :src="code.captcha" @click="resetCaptcha">
</div>
<el-input v-model="form.captcha" placeholder="请输入验证码"></el-input>
</el-form-item>
</el-form>
methods:{
resetCaptcha(){
this.code.captcha = '/api/captcha?_t'+new Date().getTime()
},
},
data(){
return {
form:{
captcha:""
},
rules:{
captcha:[
{ required:true, message:"请输入验证码" },
],
},
code:{
captcha:"/api/captcha"
}
}
1.2后端代码
module.exports = app => {
const { router, controller } = app
const jwt = app.middleware.jwt({ app })
router.get('/', controller.home.index)
router.get('/captcha', controller.util.captcha)
}
class UtilController extends BaseController {
async captcha() {
const captcha = svgCaptcha.create({
size: 4,
fontSize: 50,
width: 100,
height: 40,
noise: 3,
})
console.log('captcha=>', captcha.text)
this.ctx.session.captcha = captcha.text
this.ctx.response.type = 'image/svg+xml'
this.ctx.body = captcha.data
}
}
2.邮件验证
npm i nodemailer
2.1前端代码
<el-form>
<el-form-item prop="email" label="邮箱">
<el-input v-model="form.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item prop="emailcode" label="验证码" >
<el-button @click="sendEmailCode" :disabled="send.timer>0" type='primary'>
{{sendText}}
</el-button>
<el-input v-model="form.emailcode" placeholder="请输入邮件验证码"></el-input>
</el-form-item>
</el-form>
methods:{
async sendEmailCode(){
await this.$http.get('/sendcode?email='+this.form.email)
this.send.timer = 10
this.timer = setInterval(()=>{
this.send.timer -= 1
if(this.send.timer===0){
clearInterval(this.timer)
}
},1000)
},
},
computed:{
sendText(){
if(this.send.timer<=0){
return '发送'
}
return `${this.send.timer}s后发送`
}
},
data(){
return {
send:{
timer:0
},
form:{
email:"xxxxx@qq.com",
},
rules:{
email:[
{ required:true, message:"请输入邮箱" },
{ type:'email', message:"请输入正确的邮箱格式" },
],
emailcode:[
{ required:true, message:"请输入邮箱验证码" },
],
},
}
}
2.2后端代码
module.exports = app => {
const { router, controller } = app
const jwt = app.middleware.jwt({ app })
router.get('/', controller.home.index)
router.get('/sendcode', controller.util.sendcode)
}
class UtilController extends BaseController {
async sendcode() {
const { ctx } = this
const email = ctx.query.email
const code = Math.random().toString().slice(2, 6)
console.log('邮箱' + email + '验证码:' + code)
ctx.session.emailcode = code
const subject = '验证码'
const text = ''
const html = `<h2>xxxx</h2><span>${code}</span></a>`
const hasSend = await this.service.tools.sendMail(email, subject, text, html)
if (hasSend) {
this.message('发送成功')
} else {
this.error('发送失败')
}
}
}
const nodemailer = require('nodemailer')
const userEmail = 'xxxx@163.com'
const transporter = nodemailer.createTransport({
service: '163',
secureConnection: true,
auth: {
user: userEmail,
pass: 'xxxxx',
},
})
class ToolService extends Service {
async sendMail(email, subject, text, html) {
console.log(email, subject, html)
const mailOptions = {
from: userEmail,
cc: userEmail,
to: email,
subject,
text,
html,
}
try {
await transporter.sendMail(mailOptions)
return true
} catch (err) {
console.log('email error', err)
return false
}
}
}
3.格式校验
npm i egg-validate -s
exports.validate = {
enable: true,
package: 'egg-validate',
}
const BaseController = require('./base')
const createRule = {
email: { type: 'email' },
nickname: { type: 'string' },
passwd: { type: 'string' },
captcha: { type: 'string' },
}
class UserController extends BaseController {
async register() {
const { ctx } = this
try {
ctx.validate(createRule)
} catch (e) {
return this.error('参数校验失败', -1, e.errors)
}
...
}
}
module.exports = UserController