发布时间:2026/7/27 18:07:45
<el-input>,而在 Winform 端则渲染为TextBox。## 实践一:Vue+ElementPlus BS 端界面定制生成### 场景描述假设数据库中有User表,包含字段UserName(字符串)、Age(整数)、BirthDate(日期)。我们需要生成一个 ElementPlus 的编辑表单,并对BirthDate字段使用日期选择器组件。### 模板设计DatabaseSharp 会解析字段元数据,并匹配到对应的 ElementPlus 组件。以下是一个简化的模板片段(使用 Python 伪代码):python# 模板:bs_form_template.j2<template> <el-form :model="formData" label-width="100px"> {% for field in fields %} {% if field.type == 'string' %} <el-form-item label="{{ field.comment }}"> <el-input v-model="formData.{{ field.name }}" /> </el-form-item> {% elif field.type == 'date' %} <el-form-item label="{{ field.comment }}"> <el-date-picker v-model="formData.{{ field.name }}" type="date" /> </el-form-item> {% elif field.type == 'int' %} <el-form-item label="{{ field.comment }}"> <el-input-number v-model="formData.{{ field.name }}" :min="0" /> </el-form-item> {% endif %} {% endfor %} </el-form></template><script setup>import { reactive } from 'vue'const formData = reactive({ {% for field in fields %} {{ field.name }}: null, {% endfor %}})</script>### 生成结果当模板引擎处理User表元数据后,会输出以下 Vue 组件代码:vue<template> <el-form :model="formData" label-width="100px"> <el-form-item label="用户名"> <el-input v-model="formData.UserName" /> </el-form-item> <el-form-item label="年龄"> <el-input-number v-model="formData.Age" :min="0" /> </el-form-item> <el-form-item label="出生日期"> <el-date-picker v-model="formData.BirthDate" type="date" /> </el-form-item> </el-form></template><script setup>import { reactive } from 'vue'const formData = reactive({ UserName: null, Age: null, BirthDate: null,})</script>通过这种方式,DatabaseSharp 可以根据字段类型自动选择最合适的 UI 组件,并且通过模板中的条件逻辑,实现对特定字段的定制(如BirthDate使用日期选择器)。## 实践二:Winform 端界面定制生成### 场景描述对于同一个User表,Winform 端需要生成一个包含DataGridView的列表界面,同时提供编辑按钮。由于桌面端控件的差异,模板需要完全不同的输出。### 模板设计Winform 模板使用 C# 代码生成,通过Label和TextBox等控件组合:csharp// 模板:winform_edit_form.j2public partial class {{ table.Name }}EditForm : Form{ private System.Windows.Forms.Label lbl{{ field.Name }}; private System.Windows.Forms.TextBox txt{{ field.Name }}; private System.Windows.Forms.DateTimePicker dtp{{ field.Name }}; private void InitializeComponent() { {% for field in fields %} {% if field.type == 'string' %} this.lbl{{ field.Name }} = new System.Windows.Forms.Label(); this.txt{{ field.Name }} = new System.Windows.Forms.TextBox(); // 设置位置:根据字段索引动态计算 this.lbl{{ field.Name }}.Location = new System.Drawing.Point(10, {{ loop.index0 * 30 }}); this.txt{{ field.Name }}.Location = new System.Drawing.Point(120, {{ loop.index0 * 30 }}); {% elif field.type == 'date' %} this.dtp{{ field.Name }} = new System.Windows.Forms.DateTimePicker(); this.dtp{{ field.Name }}.Location = new System.Drawing.Point(120, {{ loop.index0 * 30 }}); {% elif field.type == 'int' %} this.txt{{ field.Name }} = new System.Windows.Forms.TextBox(); this.txt{{ field.Name }}.Location = new System.Drawing.Point(120, {{ loop.index0 * 30 }}); // 限制输入为数字 this.txt{{ field.Name }}.KeyPress += (s, e) => { if (!char.IsDigit(e.KeyChar)) e.Handled = true; }; {% endif %} {% endfor %} }}### 生成结果当模板引擎处理User表时,会生成如下 C# 代码(部分):csharppublic partial class UserEditForm : Form{ private System.Windows.Forms.Label lblUserName; private System.Windows.Forms.TextBox txtUserName; private System.Windows.Forms.TextBox txtAge; // 整数类型 private System.Windows.Forms.DateTimePicker dtpBirthDate; // 日期类型 private void InitializeComponent() { // 设置用户名字段 this.lblUserName = new System.Windows.Forms.Label(); this.txtUserName = new System.Windows.Forms.TextBox(); this.lblUserName.Location = new System.Drawing.Point(10, 0); this.txtUserName.Location = new System.Drawing.Point(120, 0); // 设置年龄字段 this.txtAge = new System.Windows.Forms.TextBox(); this.txtAge.Location = new System.Drawing.Point(120, 30); this.txtAge.KeyPress += (s, e) => { if (!char.IsDigit(e.KeyChar)) e.Handled = true; }; // 设置出生日期字段 this.dtpBirthDate = new System.Windows.Forms.DateTimePicker(); this.dtpBirthDate.Location = new System.Drawing.Point(120, 60); }}可以看到,同一张表在不同终端下生成了完全不同的界面代码:BS 端使用 Vue 组件,Winform 端使用 WinForms 控件。DatabaseSharp 通过模板分离策略,实现了“一次元数据,多端输出”的目标。## 高级定制:扩展字段属性与业务规则除了基本的字段类型映射,DatabaseSharp 支持通过元数据注解来实现更精细的定制。例如,在数据库注释中添加{required: true}或{placeholder: "请输入用户名"}等标记,模板引擎可以解析这些注解并生成对应代码:python# 模板片段:处理字段注解{% set required = field.annotation.get('required', false) %}{% if required %}<el-form-item label="{{ field.comment }}" :rules="[{ required: true, message: '该项必填' }]">{% else %}<el-form-item label="{{ field.comment }}">{% endif %}这使得 DatabaseSharp 成为高度可配置的生成工具,而不仅仅是简单的类型映射。## 总结DatabaseSharp 通过元数据驱动与多模板引擎的设计,成功实现了对 Vue+ElementPlus BS 端和 Winform 端界面的差异化生成。其核心原理在于:-元数据抽象层:屏蔽数据库差异,提供统一的字段描述。-模板分离策略:为不同终端维护独立模板,通过条件逻辑和注解支持实现精细控制。-可扩展性:通过字段注解和自定义模板,开发者可以注入业务规则,生成满足特定需求的界面代码。这种设计模式不仅提升了代码生成效率,还保证了不同终端代码风格的一致性,同时保留了定制灵活性。对于需要同时维护 BS 端和 Winform 端的项目而言,DatabaseSharp 是一个值得深入研究的工具。