登录
1. 登录演示
登录
⬇️登录返回数据⬇️
{}
2. 实现方式
2.1. 前端实现
- 判断开发环境
import.meta.env.DEV
- 调用登录接口
fetch(`${baseUrl}/users/login`, { ... })
- 保存 token
localStorage.setItem("token", result.data.token)
- 展示用户信息
resultLogin.value = result
vue
<script setup>
import { ref, reactive } from "vue";
const baseUrl = import.meta.env.DEV
? "http://localhost:13000"
: "https://zichin.com/blogapi";
const params = reactive({
username: "aaa",
password: "123",
});
const resultLogin = ref({});
const doLogin = async () => {
const result = await fetch(`${baseUrl}/users/login`, {
method: "POST",
body: JSON.stringify(params),
headers: {
"Content-Type": "application/json",
},
}).then((res) => res.json());
localStorage.setItem("token", result.data.token);
resultLogin.value = result;
};
</script>
vue
<template>
<div class="loginform-container">
<h3>登录</h3>
<el-form :model="params" label-width="auto" style="max-width: 600px">
<el-form-item label="username">
<el-input v-model="params.username" />
</el-form-item>
<el-form-item label="password">
<el-input v-model="params.password" type="password" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="doLogin()">登录</el-button>
</el-form-item>
</el-form>
<p>⬇️登录返回数据⬇️</p>
<p>{{ resultLogin }}</p>
</div>
</template>
vue
<style lang="scss">
.loginform-container {
h3 {
margin-bottom: 20px;
}
}
</style>
2.2. 后端实现
- 新增路由
router/users.js
- 查询是否有该用户
SELECT * FROM users WHERE username = ?
- 校验密码
if (item.password === password)
- 生成 token
const token = jwt.sign({ username, password }, mySecretKey)
- 返回数据
resp.data.token = token
js
const Router = require("koa-router");
const db = require("./../utils/db");
const { mySecretKey } = require("./../utils/config");
const jwt = require("jsonwebtoken");
const router = new Router();
// 新增数据
router.post("/users/login", async (ctx) => {
const { username, password } = ctx.request.body;
const rows = await db.query("SELECT * FROM users WHERE username = ?", [
username,
]);
const resp = { data: {}, success: false, message: "" };
if (rows.length) {
const [item] = rows;
if (item.password === password) {
// 生成token, 过期时间2小时
const token = jwt.sign({ username, password }, mySecretKey, {
expiresIn: 60 * 60 * 2,
});
resp.success = true;
resp.message = "登录成功";
resp.data.token = token;
} else {
resp.message = "密码错误";
}
} else {
resp.message = "用户不存在";
}
ctx.body = resp;
});
js
const mysql = require("mysql");
const dbconfig = require("./config");
const pool = mysql.createPool(dbconfig);
function query(sql, values) {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
reject(err);
} else {
connection.query(sql, values, (error, results) => {
connection.release();
if (error) {
reject(error);
} else {
resolve(results);
}
});
}
});
});
}
module.exports = {
query,
};
js
const dbconfig = {
host: "82.156.xxx.xxx", // 数据库地址
user: "db_name_xxx", // 数据库用户
password: "db_password_xxx", // 数据库密码
database: "my_blog", // 选中数据库
charset: "utf8mb4",
};
const mySecretKey = "我的自定义秘钥";
json
{
"name": "statistics",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"server": "nodemon app.js",
"git": "git add . && git commit -m \"update\" && git push"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jsonwebtoken": "^9.0.2",
"koa": "^2.15.0",
"koa-bodyparser": "^4.4.1",
"koa-jwt": "^4.0.4",
"koa-router": "^12.0.1",
"koa2-cors": "^2.0.6",
"mysql": "^2.18.1",
"nodemon": "^3.0.3"
}
}