refactor: dialect使用方式调整

This commit is contained in:
meilin.huang
2024-01-29 16:02:28 +08:00
parent a743a6a05a
commit d0b71a1c40
11 changed files with 61 additions and 74 deletions

View File

@@ -1,17 +1,22 @@
<template>
<div class="layout-search-dialog">
<el-dialog v-model="state.isShowSearch" width="300px" destroy-on-close :modal="false" fullscreen :show-close="false">
<el-autocomplete v-model="state.menuQuery" :fetch-suggestions="menuSearch" placeholder="菜单搜索"
prefix-icon="el-icon-search" ref="layoutMenuAutocompleteRef" @select="onHandleSelect" @blur="onSearchBlur">
<el-autocomplete
v-model="state.menuQuery"
:fetch-suggestions="menuSearch"
placeholder="菜单搜索"
prefix-icon="el-icon-search"
ref="layoutMenuAutocompleteRef"
@select="onHandleSelect"
@blur="onSearchBlur"
>
<template #prefix>
<el-icon class="el-input__icon">
<search />
</el-icon>
</template>
<template #default="{ item }">
<div>
<SvgIcon :name="item.meta.icon" class="mr5" />{{ item.meta.title }}
</div>
<div><SvgIcon :name="item.meta.icon" class="mr5" />{{ item.meta.title }}</div>
</template>
</el-autocomplete>
</el-dialog>
@@ -23,7 +28,7 @@ import { reactive, ref, nextTick } from 'vue';
import { useRouter } from 'vue-router';
import { useRoutesList } from '@/store/routesList';
const layoutMenuAutocompleteRef: any = ref(null);;
const layoutMenuAutocompleteRef: any = ref(null);
const router = useRouter();
const state: any = reactive({
isShowSearch: false,
@@ -54,8 +59,7 @@ const menuSearch = (queryString: any, cb: any) => {
const createFilter = (queryString: any) => {
return (restaurant: any) => {
return (
restaurant.path.toLowerCase().indexOf(queryString.toLowerCase()) > -1 ||
restaurant.meta.title.toLowerCase().indexOf(queryString.toLowerCase()) > -1
restaurant.path.toLowerCase().indexOf(queryString.toLowerCase()) > -1 || restaurant.meta.title.toLowerCase().indexOf(queryString.toLowerCase()) > -1
);
};
};
@@ -97,7 +101,7 @@ const onSearchBlur = () => {
closeSearch();
};
defineExpose({openSearch})
defineExpose({ openSearch });
</script>
<style scoped lang="scss">

View File

@@ -9,10 +9,14 @@
</el-form-item>
<el-form-item prop="type" label="类型" required>
<el-select @change="changeDbType" style="width: 100%" v-model="form.type" placeholder="请选择数据库类型">
<el-option v-for="dt in dbTypes" :key="dt.type" :value="dt.type" :label="dt.label">
<SvgIcon :name="getDbDialect(dt.type).getInfo().icon" :size="18" />
{{ dt.label }}
<el-option v-for="(dbTypeAndDialect, key) in getDbDialectMap()" :key="key" :value="dbTypeAndDialect[0]">
<SvgIcon :name="dbTypeAndDialect[1].getInfo().icon" :size="18" />
{{ dbTypeAndDialect[1].getInfo().name }}
</el-option>
<template #prefix>
<SvgIcon :name="getDbDialect(form.type).getInfo().icon" :size="18" />
</template>
</el-select>
</el-form-item>
<el-form-item v-if="form.type !== DbType.sqlite" prop="host" label="host" required>
@@ -95,7 +99,7 @@ import { ElMessage } from 'element-plus';
import { notBlank } from '@/common/assert';
import { RsaEncrypt } from '@/common/rsa';
import SshTunnelSelect from '../component/SshTunnelSelect.vue';
import { DbType, getDbDialect } from './dialect';
import { DbType, getDbDialect, getDbDialectMap } from './dialect';
import SvgIcon from '@/components/svgIcon/index.vue';
const props = defineProps({
@@ -153,37 +157,6 @@ const rules = {
const dbForm: any = ref(null);
const dbTypes = [
{
type: 'mysql',
label: 'MySQL',
},
{
type: 'mariadb',
label: 'MariaDB',
},
{
type: 'postgres',
label: 'PostgreSQL',
},
{
type: 'dm',
label: 'DM',
},
{
type: 'oracle',
label: 'Oracle',
},
{
type: 'sqlite',
label: 'Sqlite',
},
{
type: 'mssql',
label: 'MSSQL',
},
];
const state = reactive({
dialogVisible: false,
tabActiveName: 'basic',
@@ -222,7 +195,7 @@ watch(props, (newValue: any) => {
state.form = { ...newValue.data };
state.oldUserName = state.form.username;
} else {
state.form = { port: null } as any;
state.form = { port: null, type: DbType.mysql } as any;
state.oldUserName = null;
}
});

View File

@@ -366,6 +366,7 @@ class DMDialect implements DbDialect {
};
dmDialectInfo = {
name: 'DM',
icon: 'iconfont icon-db-dm',
defaultPort: 5236,
formatSqlDialect: 'plsql',

View File

@@ -81,6 +81,11 @@ export const ColumnTypeSubscript = {
// 数据库基础信息
export interface DialectInfo {
/**
* 数据库类型label
*/
name: string;
/**
* 图标
*/
@@ -200,33 +205,28 @@ export interface DbDialect {
}
let mysqlDialect = new MysqlDialect();
let mariadbDialect = new MariadbDialect();
let postgresDialect = new PostgresqlDialect();
let dmDialect = new DMDialect();
let oracleDialect = new OracleDialect();
let sqliteDialect = new SqliteDialect();
let mssqlDialect = new MssqlDialect();
export const getDbDialect = (dbType: string | undefined): DbDialect => {
if (!dbType) {
return mysqlDialect;
}
switch (dbType) {
case DbType.mysql:
return mysqlDialect;
case DbType.mariadb:
return mariadbDialect;
case DbType.postgresql:
return postgresDialect;
case DbType.dm:
return dmDialect;
case DbType.oracle:
return oracleDialect;
case DbType.sqlite:
return sqliteDialect;
case DbType.mssql:
return mssqlDialect;
default:
throw new Error('不支持的数据库');
}
let dbType2DialectMap: Map<string, DbDialect> = new Map();
export const registerDbDialect = (dbType: string, dd: DbDialect) => {
dbType2DialectMap.set(dbType, dd);
};
export const getDbDialectMap = () => {
return dbType2DialectMap;
};
export const getDbDialect = (dbType: string): DbDialect => {
return dbType2DialectMap.get(dbType) || mysqlDialect;
};
(function () {
console.log('init register db dialect');
registerDbDialect(DbType.mysql, mysqlDialect);
registerDbDialect(DbType.mariadb, new MariadbDialect());
registerDbDialect(DbType.postgresql, new PostgresqlDialect());
registerDbDialect(DbType.dm, new DMDialect());
registerDbDialect(DbType.oracle, new OracleDialect());
registerDbDialect(DbType.sqlite, new SqliteDialect());
registerDbDialect(DbType.mssql, new MssqlDialect());
})();

View File

@@ -12,6 +12,7 @@ class MariadbDialect extends MysqlDialect implements DbDialect {
mariadbDialectInfo = {} as DialectInfo;
Object.assign(mariadbDialectInfo, super.getInfo());
mariadbDialectInfo.name = 'MariaDB';
mariadbDialectInfo.icon = 'iconfont icon-mariadb';
return mariadbDialectInfo;
}

View File

@@ -107,6 +107,7 @@ class MssqlDialect implements DbDialect {
};
mssqlDialectInfo = {
name: 'MSSQL',
icon: 'iconfont icon-MSSQLNATIVE',
defaultPort: 1433,
formatSqlDialect: 'transactsql',

View File

@@ -104,6 +104,7 @@ class MysqlDialect implements DbDialect {
};
mysqlDialectInfo = {
name: 'MySQL',
icon: 'iconfont icon-op-mysql',
defaultPort: 3306,
formatSqlDialect: 'mysql',

View File

@@ -154,6 +154,7 @@ class OracleDialect implements DbDialect {
};
oracleDialectInfo = {
name: 'Oracle',
icon: 'iconfont icon-oracle',
defaultPort: 1521,
formatSqlDialect: 'plsql',

View File

@@ -123,6 +123,7 @@ class PostgresqlDialect implements DbDialect {
};
pgDialectInfo = {
name: 'PostgreSQL',
icon: 'iconfont icon-op-postgres',
defaultPort: 5432,
formatSqlDialect: 'postgresql',

View File

@@ -123,6 +123,7 @@ class SqliteDialect implements DbDialect {
};
sqliteDialectInfo = {
name: 'Sqlite',
icon: 'iconfont icon-sqlite',
defaultPort: 0,
formatSqlDialect: 'sql',

View File

@@ -93,7 +93,10 @@ func (me *MachineInfo) IfUseSshTunnelChangeIpPort() error {
func GetSshClient(m *MachineInfo, jumpClient *ssh.Client) (*ssh.Client, error) {
// 递归一直取到底层没有跳板机的机器信息
if m.SshTunnelMachine != nil {
jumpClient, _ = GetSshClient(m.SshTunnelMachine, jumpClient)
jumpClient, err := GetSshClient(m.SshTunnelMachine, jumpClient)
if err != nil {
return nil, err
}
// 新建一个没有跳板机的机器信息
m1 := &MachineInfo{
Ip: m.Ip,