TDesign中后台管理系统-用户登录

简介: TDesign中后台管理系统-用户登录

中后台系统第一个要实现的功能就是登录了,我们通常的逻辑是让用户在登录页面输入用户名和密码,调用后端接口去验证用户的合法性,然后根据接口返回的结果进行进一步的路由。本篇我们就介绍一下用户登录功能的开发过程。

1 创建用户表

用户表的话我们设计两个字段,用户名和密码,建表语句如下

CREATE TABLE `users`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

2 开发后端接口

后端我们使用express框架,把涉及到用户的接口单独拆分到user.js中。打开后端的工程,新建一个user.js文件

因为需要给密码加密,我们引入一个加密的包,在Terminal里输入安装命令

npm install bcryptjs --save

在验证用户名和密码都正确后,给前端返回一个token,我们需要安装支持token的包

npm install jsonwebtoken --save

后端接口需要解析json数据,需要安装json解析包

npm install body-parser --save

包安装好了之后,在user.js中贴入如下代码,来验证用户名和密码

const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
// 创建 MySQL 连接池
const pool = require('./database');
// 用户登录
router.post('/login', (req, res) => {
  const { username, password } = req.body;
  console.log(username, password)
  // 检查用户名是否存在
  pool.query('SELECT * FROM users WHERE username = ?', [username], (error, results) => {
    if (error) throw error;
    console.log(results)
    if (results.length === 0) {
      res.status(401).json({ code: 401, message: 'Invalid username or password' });
    } else {
      const user = results[0];
      // 验证密码是否匹配
      bcrypt.compare(password, user.password, (err, result) => {
        if (err) throw err;
        console.log("验证密码", result)
        if (result) {
          // 生成 JWT 令牌
          const token = jwt.sign({ id: user.id, username: user.username }, 'your_secret_key', { expiresIn: '1h' });
          res.status(200).json({ code: 200, message: "登录成功", data: token });
        } else {
          res.status(401).json({ code: 401, message: 'Invalid username or password' });
        }
      });
    }
  });
});
  module.exports = router;

然后在index.js里注册用户路由

const express = require('express');
const app = express();
const cors = require('cors');
const menuROuter = require('./menu')
const userRoutes = require('./user');
const bodyParser = require('body-parser');
// 定义路由
app.use(bodyParser.json());
app.get('/', (req, res) => {
  res.send('Hello, World!');
});
app.use(cors({
  origin: 'http://localhost:3002',
  credentials: true
}));
app.use('/api/get-menu-list',menuROuter);
app.use('/api/user',userRoutes);
// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

3 测试接口

我们后端接口写好了之后需要进行测试,使用postman测试我们的接口

注意这里我们是post请求,body要选择json然后按照json的语法去构造参数,在Header里要设置我们的格式是json

4 修改登录页面调用后端接口

模板里给的是mock调用,我们需要真实的调用后端接口,找到store文件夹下的user.ts,改造登录方式为调用后端接口

import { defineStore } from 'pinia';
import { usePermissionStore } from '@/store';
import type { UserInfo } from '@/types/interface';
import { login } from '@/api/login';
const InitUserInfo: UserInfo = {
  name: '', // 用户名,用于展示在页面右上角头像处
  roles: [], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
};
export const useUserStore = defineStore('user', {
  state: () => ({
    token: 'main_token', // 默认token不走权限
    userInfo: { ...InitUserInfo },
  }),
  getters: {
    roles: (state) => {
      return state.userInfo?.roles;
    },
  },
  actions: {
    async login(userInfo: Record<string, unknown>) {
      const res = await login(userInfo.account.toString(),userInfo.password.toString());
      if (res.code === 200) {
        this.token = res.data;
      } else {
        throw res;
      }
    },
    async getUserInfo() {
      const mockRemoteUserInfo = async (token: string) => {
        if (token === 'main_token') {
          return {
            name: 'Tencent',
            roles: ['all'], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
          };
        }
        return {
          name: 'td_dev',
          roles: ['UserIndex', 'DashboardBase', 'login'], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
        };
      };
      const res = await mockRemoteUserInfo(this.token);
      this.userInfo = res;
    },
    async logout() {
      this.token = '';
      this.userInfo = { ...InitUserInfo };
    },
  },
  persist: {
    afterRestore: () => {
      const permissionStore = usePermissionStore();
      permissionStore.initRoutes();
    },
    key: 'user',
    paths: ['token'],
  },
});

这里将调用后端接口的代码单独封装一下,在src/api目录下新建一个login.ts文件,输入如下代码

// store/actions.ts
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
export const login = (username: string, password: string): Promise<any> => {
  return new Promise((resolve, reject) => {
    const requestConfig: AxiosRequestConfig = {
      url: 'http://localhost:3000/api/user/login',
      method: 'post',
      data: {
        username,
        password,
      },
      headers: {
        'Content-Type': 'application/json',
      },
    };
    axios(requestConfig)
      .then((response: AxiosResponse) => {
        const result = response.data;
        if (result.code === 200 && result.message === '登录成功') {
          resolve(result);
        } else {
          reject(new Error(result.message));
        }
      })
      .catch((error) => {
        reject(error);
      });
  });
};

我们使用axios库去请求后端接口,需要先安装一下库

npm install axios --save

代码写好之后,启动前后端项目

node index.js //启动后端项目命令
npm run dev //启动前端项目命令

最终效果

总结

我们本篇讲解了TDesign实现登录的过程,需要先创建用户表,然后编写后端登录代码,编写前端代码调用后端接口。

总体上流程并不复杂,主要是要熟悉axios库的用法即可。

相关文章
|
前端开发 关系型数据库 MySQL
TDesign中后台管理系统-访问后端服务
TDesign中后台管理系统-访问后端服务
|
算法 安全 网络安全
非对称加密算法RSA
RSA是一种基于数论的非对称加密算法,依赖大整数质因数分解的困难性保证安全性。它生成公钥和私钥,公钥加密,私钥解密,适用于数据加密、数字签名和互联网安全等领域。尽管计算效率低、适合小量数据处理,但由于其兼容性、安全性和广泛应用于SSL/TLS、数字签名等,RSA仍是主流加密算法之一。
635 2
|
Python
Python3,2行代码,多种方法,直接把网页内容转换成PDF文档和图片。
Python3,2行代码,多种方法,直接把网页内容转换成PDF文档和图片。
740 0
|
存储 安全 数据安全/隐私保护
Token 是什么?全面解析身份认证中的 Token 机制
本文全面解析Token在身份认证中的核心机制,涵盖JWT、Session Token、OAuth等类型,深入讲解其工作原理、安全性策略、生命周期管理及实际应用场景,助力开发者构建安全高效的现代Web应用认证体系。
5252 3
|
5月前
|
弹性计算 测试技术 API
阿里云轻量应用服务器 200M 峰值带宽:实际性能、适用场景与使用注意事项
在选择阿里云轻量应用服务器时,“200M 峰值带宽” 是很多用户关注的核心参数 —— 毕竟这个带宽数值看起来远超普通家庭宽带,能支撑大文件传输、多用户同时访问等需求。但不少人会疑惑:“200M 峰值带宽是一直能跑满吗?实际速度能到多少?适合我的业务吗?” 本文结合最新的实测数据和官方说明,用通俗的语言拆解 200M 峰值带宽的真实含义、实际性能表现,同时明确适用场景和使用限制,帮大家避免 “误以为带宽能持续跑满” 的误区,精准判断是否适配自身需求。
|
JavaScript 小程序 C++
TDesign 中后台系统搭建
TDesign 中后台系统搭建
|
前端开发
css 设置背景色渐变、字体颜色渐变
css 设置背景色渐变、字体颜色渐变
|
数据采集 Java Python
优化数据的抓取规则:减少无效请求
本文详细介绍了一种高效抓取贝壳等二手房平台房价信息的方法,重点在于过滤无效链接和减少冗余请求。文章首先分析了目标数据和平台特点,然后提出了URL过滤、分页控制、动态设置User-Agent和Cookies、代理IP轮换及多线程优化等策略。最后,提供了一个结合代理IP技术的Python爬虫代码示例,展示了如何具体实现上述优化措施,从而显著提升数据抓取的稳定性和效率。
406 26
优化数据的抓取规则:减少无效请求
|
Prometheus 监控 Cloud Native
介绍如何使用Prometheus进行监控
介绍如何使用Prometheus进行监控
1866 3
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
850 0

热门文章

最新文章