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 实现了组件化开发。希望这篇博客能帮助到那些需要动态生成代码的开发者们。

相关推荐
垣宇15 小时前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
爱吃南瓜的北瓜15 小时前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
翻滚吧键盘15 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js
浪九天16 小时前
node.js的版本管理
node.js
浪九天18 小时前
node.js的常用指令
node.js
浪九天21 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
小纯洁w1 天前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
熬夜不洗澡1 天前
Node.js中不支持require和import两种导入模块的混用
node.js
bubusa~>_<1 天前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
天下皆白_唯我独黑1 天前
npm 安装扩展遇到证书失效解决方案
前端·npm·node.js