Node.js 根据表结构动态生成目标代码

文章目录


前言

在现代的前端开发中,使用 Vue3 搭配 Element Plus 进行组件化开发已经成为一种常见的实践。最近,我在一个项目中需要根据数据库表结构动态生成表格代码,这让我经历了一次从 MySQL 到 SQL Server 的旅程,并学习了如何使用 ejs 模版引擎来生成代码。在这篇博客中,我将介绍如何使用 mysql2/promise 和 mssql 库连接数据库,以及如何利用 ejs 动态生成代码。

项目背景

我们需要在 Vue3 项目中封装一个 <my-table> 组件,该组件的表格列(tableColumns)需要根据数据库表结构动态生成。为了实现这一点,我搭建了一个 Node.js 服务,通过查询数据库表结构来生成表格代码。

使用的技术栈

  • Vue3 :使用 setup 语法和 Element Plus 组件库。
  • Node.js:用于连接数据库并生成代码。
  • mysql2/promisemssql:用于连接 MySQL 和 SQL Server 数据库。
  • ejs:用于动态生成模板代码。

步骤一:设置 Node.js 项目

首先,创建一个新的 Node.js 项目并安装所需的库:

bash 复制代码
mkdir dynamic-table-generator
cd dynamic-table-generator
npm init -y
npm install express ejs mssql

步骤二:连接 SQL Server 数据库

由于我们的数据库是 SQL Server,我们使用 mssql 库来进行连接:

javascript 复制代码
// db.js
const sql = require('mssql');

const config = {
  user: 'your_username',
  password: 'your_password',
  server: 'your_server',
  database: 'your_database',
  options: {
    encrypt: true, // 使用 SSL 连接
    enableArithAbort: true
  }
};

const connectToDatabase = async () => {
  try {
    await sql.connect(config);
    console.log('Connected to the database!');
  } catch (err) {
    console.error('Database connection failed: ', err);
  }
};

module.exports = {
  connectToDatabase,
  sql
};

步骤三:查询数据库表结构

我们需要查询数据库以获取表的结构信息:

javascript 复制代码
// getTableStructure.js
const { sql } = require('./db');

const getTableStructure = async (tableName) => {
  try {
    const result = await sql.query`SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ${tableName}`;
    return result.recordset;
  } catch (err) {
    console.error('Error fetching table structure: ', err);
  }
};

module.exports = getTableStructure;

步骤四:生成模板代码

使用 ejs 动态生成 Vue3 表格代码:

注意 其中用<%- %> 代替 <%= %> 来保留 tsx中的<> 尖括号。

javascript 复制代码
// generateTemplate.js
const ejs = require('ejs');
const fs = require('fs');

const generateTemplate = (columns) => {
  const template = `
<template>
  <my-table :columns="tableColumns"></my-table>
</template>

<script setup>
import { reactive } from 'vue';

const tableColumns = reactive([
  <% columns.forEach(column => { %>
  {
    prop: '<%= column.COLUMN_NAME %>',
    label: '<%= column.COLUMN_NAME %>',
    minWidth: 120,
    align: 'center',
    render(param: { row: any; index: number }) {
      const { row, index } = param;
      <% if (column.COLUMN_NAME.endsWith('Time') || column.COLUMN_NAME.endsWith('Date')) { %>
      return <>{formatDateTime(row.<%= column.COLUMN_NAME %>)}</>;
      <% } else { %>
      return <>{row.<%= column.COLUMN_NAME %>}</>;
      <% } %>
    }
  },
  <% }) %>
]);
</script>
  `;

  const result = ejs.render(template, { columns });

  fs.writeFileSync('output.vue', result);
};

module.exports = generateTemplate;

步骤五:整合所有功能

搭建一个 Express 服务,处理生成代码的请求:

javascript 复制代码
// server.js
const express = require('express');
const { connectToDatabase } = require('./db');
const getTableStructure = require('./getTableStructure');
const generateTemplate = require('./generateTemplate');

const app = express();
const PORT = 3000;

app.get('/generate-template', async (req, res) => {
  const tableName = req.query.table;
  const columns = await getTableStructure(tableName);
  generateTemplate(columns);
  res.send('Template generated successfully!');
});

connectToDatabase().then(() => {
  app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
  });
});

总结

通过以上步骤,我们成功地搭建了一个 Node.js 服务,能够根据 SQL Server 数据库中的表结构动态生成 Vue3 表格代码。我们使用 mssql 库连接数据库,ejs 模板引擎生成代码,并结合 Vue3Element Plus 实现了组件化开发。希望这篇博客能帮助到那些需要动态生成代码的开发者们。

相关推荐
FungLeo35 分钟前
成为全栈·Node 后端篇·文件上传:R2 / 本地磁盘双实现与签名直传
node.js·文件上传·成为全栈·cloudflare r2·文件去重
FungLeo2 小时前
成为全栈·Node 后端篇·认证方案:JWT 还是 Session
node.js·jwt·session·认证方案
FungLeo7 小时前
成为全栈·Node 后端篇·文章 CRUD 与投稿状态机
node.js·状态机·crud·成为全栈
晴天1610 小时前
Webpack3/4/5 核心差异、性能升级与迁移实战指南-Day38
webpack·node.js
大牧师11 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
wxwx_bscxy32221 小时前
NodeJS 高校学业预警系统10551
mysql·node.js·vue·高校学业预警
FungLeo1 天前
成为全栈·Node 后端篇·列表接口三件套:分页、筛选、排序
node.js·列表排序·列表分页·成为全栈·列表接口设计·列表筛选
晴天161 天前
浏览器中ESM与AMD模块共存的解决方案
前端·node.js
晴天161 天前
Node.js 模块化混合开发指南:CommonJS / ESM 混用适配方案与落地配置
node.js
FungLeo1 天前
成为全栈·Node 后端篇·分类与标签:多对多关系的建模与查询
node.js·成为全栈·分类与标签·多对多关系建模·多对多关系查询