目录
- egg.js 配合 jwt 进行鉴权
- egg.js 配置 mysql 以及简单登录实现
- eggjs+mysql实现图片上传
- eggjs 实现增删改查
- eggjs 搭配 vue+axios 实现登录和获取用户信息
开发
eggjs
添加 mysql
npm install egg-mysql
安装以后,打开 conifg -> plugin.js
, 加入
mysql: {
enable: true,
package: 'egg-mysql',
},
打开 config -> config.default.js
,加入
config.mysql = {
// 单数据库信息配置
client: {
// host
host: 'localhost',
// 端口号
port: '3306',
// 用户名
user: 'root',
// 密码
password: 'root',
// 数据库名
database: 'xxx',
},
app: true,
agent: false,
};
这时候配置大概完成,我们写一个用户登录
的逻辑.
创建 数据库 user `, 表结构为:
创建 app -> service -> user.js
, 写入
// service/user.js
'use strict';
const Service = require('egg').Service;
class UserService extends Service {
async getUserInfo(params) {
const { app } = this;
try {
const result = await app.mysql.get('user', params);
return result;
} catch (error) {
console.log(error);
return null;
}
}
// 通过用户名获取用户信息
async getUserByName(username) {
const { app } = this;
try {
const result = await app.mysql.get('user', { username });
return result;
} catch (error) {
console.log(error);
return null;
}
}
async register(params) {
const { app } = this;
try {
const result = await app.mysql.insert('user', params);
return result;
} catch (error) {
console.log(error);
return null;
}
}
}
module.exports = UserService;
创建 app -> controller -> user.js
// controller/user.js
'use strict';
const Controller = require('egg').Controller;
class UserController extends Controller {
async login() {
const { ctx, app } = this;
const { username, password } = ctx.request.body;
const userInfo = await ctx.service.user.getUserByName(username);
if (!userInfo || !userInfo.id) {
ctx.body = {
code: 500,
msg: '账号不存在',
success: false,
data: null,
};
return;
}
if (userInfo && password !== userInfo.password) {
ctx.body = {
code: 500,
msg: '账号密码错误',
success: false,
data: null,
};
return;
}
// token 生成
const token = app.jwt.sign(
{
id: userInfo.id,
username: userInfo.username,
exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, // token 有效期为 24 小时
},
app.config.jwt.secret
);
ctx.body = {
code: 200,
message: '登录成功',
success: true,
data: {
token,
},
};
},
//获取个人信息
async getUserInfo() {
const { ctx, app } = this;
const token = ctx.request.header.authorization;
const decode = await app.jwt.verify(token, app.config.jwt.secret);
// 通过 token 带过来的 username 获取到个人信息
const userInfo = await ctx.service.user.getUserByName(decode.username);
const defaultAvatar =
'https://profile.csdnimg.cn/4/2/E/3_weixin_38992765';
ctx.body = {
code: 200,
msg: '请求成功',
data: {
id: userInfo.id,
username: userInfo.username,
signature: userInfo.signature || '',
avatar: userInfo.avatar || defaultAvatar,
nickname: userInfo.nickname || '不知名先生',
},
};
}
}
module.exports = UserController;
注册 router
router.post('/api/user/login', controller.user.login);
现在验证效果 账号不存在
密码错误
登录成功
接下来,我们要根据 token
再去获取我们的人员信息等
注册 router
,用户获取个人信息
router.get('/api/user/get_userinfo', _jwt, controller.user.getUserInfo); // 获取用户信息
获取个人信息
我们在写一个注册接口,在 app -> controller -> user.js
添加一个 register
方法
async register() {
const { ctx } = this;
const { username, password, nickname } = ctx.request.body;
const userInfo = await ctx.service.user.getUserByName(username);
// 判断是否已经存在
if (userInfo && userInfo.id) {
ctx.body = {
code: 500,
msg: '账户名已被注册,请重新输入',
data: null,
success: false,
};
return;
}
const defaultAvatar =
'https://profile.csdnimg.cn/4/2/E/3_weixin_38992765';
const result = await ctx.service.user.register({
username,
password,
nickname,
ctime: new Date().getTime(),
signature: '暂无个人签名',
avatar: defaultAvatar,
});
if (result) {
ctx.body = {
code: 200,
msg: '注册成功',
data: null,
success: true,
};
} else {
ctx.body = {
code: 500,
msg: '注册失败',
data: null,
success: false,
};
}
}
注册router
router.post('/api/user/register', controller.user.register);
注册验证