TDesign中后台管理系统-访问后端服务

news2024/12/24 21:13:02

目录

  • 1 修改后端服务地址
  • 2 解决跨域问题
  • 3 动态获取菜单
  • 4 测试后端接口
  • 5 前后端联调
  • 总结

目前我们已经搭建了TDesign的前端和express的后端,目前是两个独立的应用。通常我们需要把前后端集成在一起,TDesign已经配置了相关的信息,只需要修改后端服务地址及端口就能实现先后端互通。

1 修改后端服务地址

vs code打开我们创建的前端工程,找到.env.development文件
在这里插入图片描述
将配置文件的URL修改为我们的后端地址

VITE_BASE_URL = /
VITE_IS_REQUEST_PROXY = true
VITE_API_URL = http://localhost:3000
VITE_API_URL_PREFIX = /api

2 解决跨域问题

如果是使用默认的express启动代码搭建服务,会遇到跨域问题,我们需要引入cors中间件来解决跨域的问题

打开后端工程,安装cors包

npm install cors --save

在这里插入图片描述
修改index.js文件,增加跨域支持的代码

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

这里的origin是你的前端的工程的地址

3 动态获取菜单

我们目前的菜单是需要从服务接口获取数据的,要想开发后端接口,需要先创建数据库表,数据库我们选择mysql,以下是建表语句

CREATE TABLE `menu`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `redirect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `parent_id` int(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `parent_id`(`parent_id`) USING BTREE,
  CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `menu` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

表建好之后,需要先创建一个菜单的路由,在工程的根目录创建一个menu.js文件
在这里插入图片描述
我们后端服务需要访问数据库,需要将数据库的连接拆分到一个文件中,再创建一个database.js文件
在这里插入图片描述
访问数据库需要用到mysql库,安装一下

npm install mysql --save

在这里插入图片描述
在database.js里输入数据库连接代码

const mysql = require('mysql');

// 创建数据库连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: '******',
  database: 'diancan',
});

module.exports = pool;

在配置文件中输入数据库的名称、用户名、密码和访问地址

然后在menu.js中输入获取菜单的方法

const express = require('express');
const router = express.Router();
const pool = require('./database');

function fetchMenuItems(parentId = null) {
    console.log('parentid', parentId)
    return new Promise((resolve, reject) => {
        if (parentId == null) {
            pool.query('SELECT * FROM menu WHERE parent_id is null ', [parentId], (error, results) => {
                if (error) {
                    reject(error);
                } else {
                    resolve(results);
                }
            });
        } else {
            pool.query('SELECT * FROM menu WHERE parent_id = ?', [parentId], (error, results) => {
                if (error) {
                    reject(error);
                } else {
                    resolve(results);
                }
            });
        }

    });
}

async function buildMenuTree(parentId = null) {
    const menuItems = await fetchMenuItems(parentId);
    console.log('menuItems', menuItems)
    const menuTree = [];
    for (const item of menuItems) {
        const children = await buildMenuTree(item.id);
        const menuItem = {
            id: item.id,
            path: item.path,
            name: item.name,
            component: item.component,
            redirect: item.redirect,
            title: item.title,
            icon: item.icon,
        };
        if (children.length > 0) {
            menuItem.children = children;
        }
        menuTree.push(menuItem);
    }
    console.log("menuTree", menuTree)
    return menuTree;
}


router.get('/', async (req, res) => {
    try {
        const menuTree = await buildMenuTree();
        res.json({code:0,data:{list:menuTree}});
    } catch (error) {
        console.error('Database query error:', error);
        res.status(500).json({ error: 'Internal server error' });
    }
});

module.exports = router;

然后将menu的路由注册到启动文件里,修改index.js

const express = require('express');
const app = express();
const cors = require('cors');
const menuROuter = require('./menu')
// 定义路由
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.listen(3000, () => {
  console.log('Server is running on port 3000');
});

4 测试后端接口

我们接口写好之后,需要进行测试,可以使用Postman,输入我们的接口地址进行测试
在这里插入图片描述
如果看到正常返回说明我们的接口已经写好了

5 前后端联调

后端调试好了之后,启动我们的前端工程,从登录页进行测试,看是否可以正常登录,并且菜单可以正常渲染出来
在这里插入图片描述

总结

前后端集成,需要后端先写好接口,并且前端能够正常访问,我们需要解决跨域的问题,数据库访问的问题以及动态构造菜单的接口。总体上只要熟悉开发流程,就可以按照自己的需要完成功能的开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存分析工具之Mat

自定义类MatClazz内存个数为9521。当前对象占用内存为16个字节。不包括其属性bytes的字节数。 通过查看MatClazz引用的类之byte数组之bytes。其单个数组占用的字节数为10256。整个内存MatClazz中属性bytes占用的byte[]字节数为97746376,与直方图统计趋近。 通过选…

Mac 终端快捷键设置:如何给 Mac 中的 Terminal 设置 Ctrl+Alt+T 快捷键快速启动

Mac 电脑中正常是没有直接打开终端命令行的快捷键指令的,但可以通过 commandspace 打开聚焦搜索,然后输入 ter 或者 terminal 全拼打开。但习惯了 linux 的同学会觉得这个操作很别扭。于是我们希望能通过键盘按键直接打开。 操作流程如下: 1…

Linux的xshell和xftp工具的使用

这里写目录标题 第一章、xshell工具和xftp的使用1.1)xshell下载与安装1.2)xshell连接1.3)xftp下载安装和连接1.4)xftp使用 第一章、xshell工具和xftp的使用 1.1)xshell下载与安装 ①用来远程操作Linux虚拟机系统 两个…

Mac 安装配置adb命令环境(详细步骤)

一、注意:前提要安装java环境。 因为android sdk里边开发的一些包都是依赖java语言的,所以,首先要确保已经配置了java环境。 二、在Mac下配置android adb命令环境,配置方式如下: 1、下载并安装IDE (andr…

python+opencv实现显示摄像头,截取相关图片,录取相关视频

实时显示摄像头图像 按下空格键,截取图片 按下tab键,开始录制摄像内容,再次按下,结束录制 按下Esc键,关闭窗口 import cv2 import numpy#第几章图片 img_count0InitVideoFalse #第几个视频 video_count0 video_flagFa…

分治法 Divide and Conquer

1.分治法 分治法(Divide and Conquer)是一种常见的算法设计思想,它将一个大问题分解成若干个子问题,递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。分治法通常包含三个步骤: 1. Divid…

C 语言 - 存储类说明符

【预备知识】 1)C 语言 - 存储时期 2)C 语言 - 链接属性 3)C 语言 - 作用域 1. 分类: C 语言为变量提供了 5 中不同的存储模型(即存储类)。 (此外还有基于指针的第 6 种存储模型&#xff0c…

【外卖系统】文件上传与下载

文件上传 文件上传又称upload,将本地图片、视频等文件上传到服务器上,供其他用户下载或者浏览。 form表单:HTML中的form元素用于创建一个包含表单字段的区域,用户可以在该区域输入数据,并通过提交表单将数据发送到服务…

MySQL初探

Background 通过阅读小林coding,大致了解了mysql数据库的种种特点,与之前学的数据库实现大体思路相同,感觉学习不能停留在理论层面,要调研生产级别的中间件实现。 一条代码运行在mysql上的流程 1. 连接的过程需要先经过 TCP 三次…

[回馈]ASP.NET Core MVC开发实战之商城系统(四)

经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,ba…

Structure Guided Lane Detection 论文精度

结构导向车道检测 摘要 近年来,随着深度神经网络和自动驾驶的快速发展,车道检测取得了长足的进步。然而,主要存在三个问题,包括车道的特征化、场景与车道之间的结构关系建模以及对车道的更多贡献(如实例和类型&#…

手搓 自然语言模型 各种对比数据

基础模型和设计思想 最优网络结构 import paddle import numpy as np from tqdm import tqdm class EmMask(paddle.nn.Layer):def __init__(self, voc_size19, hidden_size256, max_len48):super(EmMask, self).__init__()# 定义输入序列和标签序列self.embedding_layer pad…

Unity3d C#快速打开萤石云监控视频流(ezopen)支持WebGL平台,替代UMP播放视频流的方案(含源码)

前言 Universal Media Player算是视频流播放功能常用的插件了,用到现在已经不知道躺了多少坑了,这个插件虽然是白嫖的,不过被甲方和领导吐槽的就是播放视频流的速度特别慢,可能需要几十秒来打开监控画面,等待的时间较…

我的第一个前端(VS code ,Node , lite-server简易服务器,npm 运行)

第一种方式:使用Visual Studio Code创建并运行 第一个前端项目的步骤,如下: 1. 下载和安装Visual Studio Code: 访问Visual Studio Code官方网站(Visual Studio Code - Code Editing. Redefined)并根据你…

二十三种设计模式第二十篇--备忘录模式

备忘录模式,备忘录模式属于行为型模式。它允许在不破坏封装的情况下捕获和恢复对象的内部状态。保存一个对象的某个状态,以便在适当的时候恢复对象,该模式通过创建一个备忘录对象来保存原始对象的状态,并将其存储在一个负责管理备…

133. 克隆图

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List&…

互联网医院系统开发:打造便捷高效的医疗服务平台

随着互联网技术的飞速发展,互联网医院系统的出现为医疗行业带来了许多新的机遇和优势。互联网医院系统是一种基于互联网技术的医疗服务平台,旨在提供便捷、高效、个性化的医疗服务。下面将介绍互联网医院系统开发的优势。   提供便捷的医疗服务&#x…

【模仿学习】:离线和在线模仿

一、说明 模仿学习(Imitation Learning )是机器学习的一种,代理通过观察和模仿专家的行为来学习。在这种方法中,为代理提供了一组所需行为的演示或示例,并通过尝试复制专家的行为来学习输入观察和输出操作之间的映射。…

【单机多卡】torch改造代码为DDP单机多卡分布式并行

torch分布式数据并行DDPtorch.nn.parallel.DistributedDataParallel代码修改记录。(要求pytorch_version>1.0) 目录 1.🍄🍄要修改的地方概览 2.✏️✏️初始化 3.✏️✏️设置当前进程GPU 4.✏️✏️设置sampler 5.✏️✏…

HTML笔记(1)

介绍 浏览器中内置了HTML的解析引擎,通过解析标记语言来展现网页;HTML标签都是预定义好的;Java工程师:后台代码的编写,和数据库打交道,把数据给网页前端的工程师;网页前端工程师:写H…