<el-form-itemlabel="数据源"><el-selectv-model="form.source_id"filterableplaceholder="请选择数据源"@change="loadSchemas"><el-optionv-for="source in sources":key="source.id":label="`${source.name}(${source.db_type})`":value="source.id"/></el-select></el-form-item>
<el-form-itemlabel="数据库/Schema"><el-selectv-model="form.database"filterableplaceholder="请选择数据库或 Schema":disabled="!form.source_id"@change="loadTables(false)"><el-optionv-for="schema in schemas":key="schema":label="schema":value="schema"/></el-select></el-form-item>
<el-form-itemv-if="form.scope === 'tables'"label="数据表"><el-selectv-model="form.tables"multiplefilterablecollapse-tagscollapse-tags-tooltipplaceholder="请选择数据表"><el-optionv-for="table in tables":key="table.table_name":label="table.table_name":value="table.table_name"/></el-select></el-form-item>
<el-form-itemlabel="Schema/库"><el-selectv-model="sourceForm.schema"filterableallow-create@change="loadTables"><el-optionv-for="schema in schemas":key="schema":label="schema":value="schema"/></el-select></el-form-item>
<el-table:data="rules"size="small"stripeclass="rule-table"><el-table-columnprop="column_name"label="字段"min-width="150"fixed/><el-table-columnprop="data_type"label="类型"width="120"/><el-table-columnlabel="生成策略"min-width="210"><template#default="{row}"><el-selectv-model="row.generator"@change="normalizeRule(row)"><el-optionv-for="o in generatorOptions(row)":key="o.value":label="o.label":value="o.value"/></el-select></template></el-table-column><el-table-columnlabel="参数"min-width="210"><template#default="{row}"><el-inputv-model="row.param":placeholder="paramPlaceholder(row)":disabled="['auto','uuid','name','email','phone'].includes(row.generator)"/></template></el-table-column><el-table-columnlabel="可空"width="85"><template#default="{row}"><el-switchv-model="row.allowNull"size="small":disabled="!row.nullable"/></template></el-table-column></el-table>
<divclass="step"><spanclass="step-no">1</span><divclass="step-content"><b>选择数据源</b><el-selectv-model="form.source"placeholder="请选择数据源"class="source-select"@change="onSourceChange"><el-optionv-for="s in sources":key="s.id":label="`${s.name}(${s.db_type})`":value="s.id"/></el-select></div></div>
<templatev-if="type === 'backup'"><divclass="step"><spanclass="step-no">2</span><divclass="step-content"><b>选择数据库</b><el-selectv-model="form.database"placeholder="请选择数据库/Schema"class="source-select":loading="loadingObjects"@change="loadTables"><el-optionv-for="name in schemas":key="name":label="name":value="name"/></el-select><divclass="scope-choice"><el-radio-groupv-model="form.scope"@change="form.tables = []"><el-radiolabel="database">整个数据库</el-radio><el-radiolabel="tables">指定数据表</el-radio></el-radio-group></div><divv-if="form.scope === 'tables'"class="table-picker"><el-checkbox-groupv-model="form.tables"><el-checkboxv-for="table in tables":key="table.table_name":label="table.table_name">{{table.table_name}}<smallv-if="table.table_comment">({{table.table_comment}})</small></el-checkbox></el-checkbox-group><spanv-if="form.source && !tables.length"class="muted">{{loadingObjects?'正在加载...':'暂无可访问的表'}}</span></div></div></div><divclass="step"><spanclass="step-no">3</span><divclass="step-content"><b>备份范围</b><el-checkboxv-model="form.includeSchema">表结构</el-checkbox><el-checkboxv-model="form.includeData">表数据</el-checkbox><divclass="muted filename-hint">文件名由系统按时间自动生成,完成后显示在备份列表。</div></div></div></template>
<templatev-else-if="type === 'restore'"><divclass="step"><spanclass="step-no">2</span><divclass="step-content"><b>选择目标数据库</b><el-selectv-model="form.database"placeholder="请选择数据库/Schema"class="source-select"@change="form.filename = ''"><el-optionv-for="name in schemas":key="name":label="name":value="name"/></el-select></div></div><divclass="step"><spanclass="step-no">3</span><divclass="step-content"><b>选择匹配的备份版本</b><el-selectv-model="form.filename"placeholder="请选择备份版本"class="source-select"><el-optionv-for="v in matchedVersions":key="v.filename":label="`${v.filename}(${scopeLabel(v)})`" :value="v.filename" /></el-select><divv-if="form.filename && selectedVersion"class="muted version-tables">备份表:{{(selectedVersion.tables||[]).join('、')||'未读取到表信息'}}</div></div></div><divclass="step"><spanclass="step-no">4</span><divclass="step-content"><b>还原范围</b><el-radio-groupv-model="form.scope"><el-radiolabel="database">备份中的整个数据库</el-radio><el-radiolabel="tables">选择备份中的数据表</el-radio></el-radio-group><divv-if="form.scope === 'tables' && selectedVersion"class="table-picker"><el-checkbox-groupv-model="form.tables"><el-checkboxv-for="name in selectedVersion.tables":key="name":label="name">{{name}}</el-checkbox></el-checkbox-group></div><div><el-radio-groupv-model="form.conflict"><el-radiolabel="skip">已有表跳过</el-radio><el-radiolabel="replace">删除后重建</el-radio></el-radio-group></div></div></div></template>
<templatev-if="type === 'backup'"><divclass="step"><spanclass="step-no">2</span><divclass="step-content"><b>选择数据库</b><el-selectv-model="form.database"placeholder="请选择数据库/Schema"class="source-select":loading="loadingObjects"@change="loadTables"><el-optionv-for="name in schemas":key="name":label="name":value="name"/></el-select><divclass="scope-choice"><el-radio-groupv-model="form.scope"@change="form.tables = []"><el-radiolabel="database">整个数据库</el-radio><el-radiolabel="tables">指定数据表</el-radio></el-radio-group></div><divv-if="form.scope === 'tables'"class="table-picker"><el-checkbox-groupv-model="form.tables"><el-checkboxv-for="table in tables":key="table.table_name":label="table.table_name">{{table.table_name}}<smallv-if="table.table_comment">({{table.table_comment}})</small></el-checkbox></el-checkbox-group><spanv-if="form.source && !tables.length"class="muted">{{loadingObjects?'正在加载...':'暂无可访问的表'}}</span></div></div></div><divclass="step"><spanclass="step-no">3</span><divclass="step-content"><b>备份方式</b><el-radio-groupv-model="form.backupMode"><el-radiolabel="full">全量备份</el-radio><el-radiolabel="incremental">增量备份</el-radio></el-radio-group><divclass="muted filename-hint">增量备份保留同样的表结构,仅记录本次任务产生的增量快照。</div></div></div><divclass="step"><spanclass="step-no">4</span><divclass="step-content"><b>备份范围</b><el-checkboxv-model="form.includeSchema">表结构</el-checkbox><el-checkboxv-model="form.includeData">表数据</el-checkbox></div></div></template>
<templatev-else-if="type === 'restore'"><divclass="step"><spanclass="step-no">2</span><divclass="step-content"><b>选择目标数据库</b><el-selectv-model="form.database"placeholder="请选择数据库/Schema"class="source-select"@change="form.filename = ''"><el-optionv-for="name in schemas":key="name":label="name":value="name"/></el-select></div></div><divclass="step"><spanclass="step-no">3</span><divclass="step-content"><b>选择匹配的备份版本</b><el-selectv-model="form.filename"placeholder="请选择备份版本"class="source-select"><el-optionv-for="v in matchedVersions":key="v.filename":label="`${v.filename}(${versionScopeLabel(v)})`" :value="v.filename" /></el-select><divv-if="form.filename && selectedVersion"class="muted version-tables">备份表:{{(selectedVersion.tables||[]).join('、')||'未读取到表信息'}}</div></div></div><divclass="step"><spanclass="step-no">4</span><divclass="step-content"><b>还原范围</b><el-radio-groupv-model="form.scope"><el-radiolabel="database">备份中的整个数据库</el-radio><el-radiolabel="tables">选择备份中的数据表</el-radio></el-radio-group><divv-if="form.scope === 'tables' && selectedVersion"class="table-picker"><el-checkbox-groupv-model="form.tables"><el-checkboxv-for="name in selectedVersion.tables":key="name":label="name">{{name}}</el-checkbox></el-checkbox-group></div><div><el-radio-groupv-model="form.conflict"><el-radiolabel="skip">已有表跳过</el-radio><el-radiolabel="replace">删除后重建</el-radio></el-radio-group></div></div></div></template>
<templatev-else-if="type === 'encrypt' || type === 'decrypt'"><divclass="step"><spanclass="step-no">2</span><divclass="step-content"><b>选择数据库</b><el-selectv-model="form.database"placeholder="请选择数据库/Schema"class="source-select":loading="loadingObjects"@change="loadTables"><el-optionv-for="name in schemas":key="name":label="name":value="name"/></el-select></div></div><divclass="step"><spanclass="step-no">3</span><divclass="step-content"><b>选择数据表</b><el-selectv-model="form.table"placeholder="请选择数据表"class="source-select":loading="loadingObjects"@change="loadColumns"><el-optionv-for="table in tables":key="table.table_name":label="table.table_name":value="table.table_name"/></el-select></div></div><divclass="step"v-if="form.table"><spanclass="step-no">4</span><divclass="step-content"><b>选择处理范围</b><el-radio-groupv-model="form.scope"@change="form.fields = []"><el-radiolabel="table">整张表</el-radio><el-radiolabel="fields">指定字段</el-radio></el-radio-group><divclass="muted filename-hint">整表模式会处理所有字符字段,数字、日期等字段保持原类型。</div><divv-if="form.scope === 'fields'"class="table-picker"><el-checkbox-groupv-model="form.fields"><el-checkboxv-for="column in columns":key="column.column_name":label="column.column_name">{{column.column_name}}<smallv-if="column.column_comment">({{column.column_comment}})</small></el-checkbox></el-checkbox-group><spanv-if="!columns.length"class="muted">暂无可处理字段</span></div></div></div><divclass="step"><spanclass="step-no">{{form.table?5:4}}</span><divclass="step-content"><b>{{type==='encrypt'?'设置加密密码':'输入解密密码'}}</b><el-inputv-model="form.password"type="password"show-passwordclass="password-input"placeholder="至少 4 位"/></div></div></template>