1.用户名密码注册
在app/validate目录下新建normalUserRule.ts
export default {
username: {
type: 'string',
trim: true,
// 只能是数字或字母
format: /^[A-Za-z0-9]{6,}$/,
message: '用户名不符合要求',
},
password: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[,.#%'+*\-:;^_`].*)[,.#%'+*\-:;^_`0-9A-Za-z]{8,}$/,
message: '密码不符合要求',
},
captcha: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^[A-Za-z0-9]{4}$/,
message: '验证码不符合要求',
},
registerType: {
type: 'enum',
values: [ 'normal', 'email', 'phone' ],
},
};
2.邮箱注册
在app/validate目录下新建emailUserRule.ts
export default {
email: {
type: 'string',
trim: true,
format: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
message: '邮箱验不符合要求',
},
password: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[,.#%'+*\-:;^_`].*)[,.#%'+*\-:;^_`0-9A-Za-z]{8,}$/,
message: '密码不符合要求',
},
captcha: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^[A-Za-z0-9]{4}$/,
message: '验证码不符合要求',
},
registerType: {
type: 'enum',
values: [ 'normal', 'email', 'phone' ],
},
};
3.手机注册
在app/validate目录下新建phoneUserRule.ts
export default {
phone: {
type: 'string',
trim: true,
format: /^1[3456789]\d{9}$/,
message: '手机不符合要求',
},
password: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[,.#%'+*\-:;^_`].*)[,.#%'+*\-:;^_`0-9A-Za-z]{8,}$/,
message: '密码不符合要求',
},
captcha: {
type: 'string',
trim: true,
// 必须是数字字母符号组合
format: /^[A-Za-z0-9]{4}$/,
message: '验证码不符合要求',
},
registerType: {
type: 'enum',
values: [ 'normal', 'email', 'phone' ],
},
};
4.使用统一返回格式
在app目录下新建extend目录,并在extend目录下创建context.ts
这个文件主要是统一try和catch应该返回什么内容,你也可以自己定义
module.exports = {
success(data, status = 200, msg = '成功') {
this.status = status;
// this就是ctx对象,在其中可以调用ctx上的其他方法,或访问属性
this.body = {
code: status,
msg,
data,
};
},
error(status = 500, msg = '错误') {
this.status = status;
// this就是ctx对象,在其中可以调用ctx上的其他方法,或访问属性
this.body = {
code: status,
msg,
};
},
};
5.user.ts
import { Controller } from 'egg';
import NormalUserRule from '../validate/normalUserRule';
import EmailUserRule from '../validate/emailUserRule';
import PhoneUserRule from '../validate/phoneUserRule';
const enum RegisterTypeEnum{
Normal='normal',
Email='email',
Phone='phone'
}
export default class UserController extends Controller {
public async create() {
const { ctx } = this;
try {
this.validateUserInfo();
ctx.success({});
} catch (e:any) {
if (e.errors) {
// 校验失败错误为e.errors
ctx.error(400, e.errors);
} else {
// 校验类型不存在错误为e.message
ctx.error(400, e.message);
}
}
}
private validateUserInfo() {
const { ctx } = this;
const data = ctx.request.body;
const registerType = data.registerType;
switch (registerType) {
case RegisterTypeEnum.Normal:
ctx.validate(NormalUserRule, data);
break;
case RegisterTypeEnum.Email:
ctx.validate(EmailUserRule, data);
break;
case RegisterTypeEnum.Phone:
ctx.validate(PhoneUserRule, data);
break;
default:
throw new Error('注册类型不存在');
}
}
}