Skip to content

Commit 9ae7905

Browse files
committed
feat(datasource): Add database icon and add extra jdbc string for connect
1 parent 4cb7de7 commit 9ae7905

File tree

5 files changed

+31
-23
lines changed

5 files changed

+31
-23
lines changed

backend/apps/datasource/api/datasource.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import APIRouter
1+
from fastapi import APIRouter, File, UploadFile
22
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \
33
execSql, update_table_and_fields, getTablesByDs, chooseTables, preview
44
from common.core.deps import SessionDep
@@ -78,3 +78,9 @@ async def edit_local(session: SessionDep, data: EditObj):
7878
@router.post("/previewData/{id}")
7979
async def edit_local(session: SessionDep, id: int, data: EditObj):
8080
return preview(session, id, data)
81+
82+
83+
@router.post("/uploadExcel/")
84+
async def upload_excel(session: SessionDep, file: UploadFile = File(...)):
85+
# todo
86+
pass

backend/apps/datasource/models/datasource.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class DatasourceConf(BaseModel):
6666
password: str = ''
6767
database: str = ''
6868
driver: str = ''
69+
extraJdbc: str = ''
6970

7071

7172
class TableSchema:

backend/apps/db/db.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
1+
import json
2+
import urllib.parse
3+
from typing import Any
4+
15
from sqlalchemy import create_engine, text, Result
26
from sqlalchemy.orm import sessionmaker
7+
38
from apps.datasource.models.datasource import DatasourceConf, CoreDatasource, TableSchema, ColumnSchema
4-
import urllib.parse
5-
from typing import Any
6-
import json
79
from apps.datasource.utils.utils import aes_decrypt
8-
from common.core.deps import SessionDep
910

1011

1112
def get_uri(ds: CoreDatasource):
1213
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
1314
db_url: str
1415
if ds.type == "mysql":
15-
db_url = f"mysql+pymysql://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}"
16+
if conf.extraJdbc is not None and conf.extraJdbc != '':
17+
db_url = f"mysql+pymysql://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}?{urllib.parse.quote(conf.extraJdbc)}"
18+
else:
19+
db_url = f"mysql+pymysql://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}"
1620
else:
1721
raise 'The datasource type not support.'
1822
return db_url
1923

2024

2125
def get_session(ds: CoreDatasource):
22-
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
23-
db_url: str
24-
if ds.type == "mysql":
25-
db_url = f"mysql+pymysql://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}"
26-
else:
27-
raise 'The datasource type not support.'
28-
engine = create_engine(db_url)
26+
engine = create_engine(get_uri(ds))
2927
session_maker = sessionmaker(bind=engine)
3028
session = session_maker()
3129
return session
@@ -100,4 +98,3 @@ def exec_sql(ds: CoreDatasource, sql: str):
10098
result.close()
10199
if session is not None:
102100
session.close()
103-

frontend/src/views/ds/form.vue

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
<el-form-item label="Database">
4545
<el-input v-model="config.database" />
4646
</el-form-item>
47+
<el-form-item label="Extra JDBC String">
48+
<el-input v-model="config.extraJdbc" />
49+
</el-form-item>
4750
</el-form>
4851
</div>
4952
<div v-show="active === 2" class="container">
@@ -106,6 +109,7 @@ const config = ref<any>({
106109
username:'',
107110
password:'',
108111
database:'',
112+
extraJdbc:''
109113
})
110114
111115
const close = () => {
@@ -133,6 +137,7 @@ const open = (item: any, editTable: boolean = false) => {
133137
config.value.username = configuration.username
134138
config.value.password = configuration.password
135139
config.value.database = configuration.database
140+
config.value.extraJdbc = configuration.extraJdbc
136141
}
137142
138143
if (editTable) {
@@ -165,6 +170,7 @@ const open = (item: any, editTable: boolean = false) => {
165170
username:'',
166171
password:'',
167172
database:'',
173+
extraJdbc:'',
168174
}
169175
}
170176
dialogVisible.value = true
@@ -178,13 +184,7 @@ const save = async(formEl: FormInstance | undefined) => {
178184
.filter((ele: any) => {return checkList.value.includes(ele.tableName)})
179185
.map((ele: any) => {return {"table_name": ele.tableName, "table_comment": ele.tableComment}})
180186
181-
form.value.configuration = encrypted(JSON.stringify({
182-
host:config.value.host,
183-
port:config.value.port,
184-
username:config.value.username,
185-
password:config.value.password,
186-
database:config.value.database
187-
}))
187+
buildConf()
188188
if (form.value.id) {
189189
if (!isEditTable.value) {
190190
// only update datasource config info
@@ -217,7 +217,8 @@ const buildConf = () => {
217217
port:config.value.port,
218218
username:config.value.username,
219219
password:config.value.password,
220-
database:config.value.database
220+
database:config.value.database,
221+
extraJdbc:config.value.extraJdbc
221222
}))
222223
}
223224

frontend/src/views/ds/index.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
v-for="ds in dsList"
2626
>
2727
<div class="connection-icon">
28-
<i class="mdi mdi-database"></i>
28+
<Icon>
29+
<MysqlDs v-if="ds.type === 'mysql'"/>
30+
</Icon>
2931
</div>
3032
<div class="connection-details">
3133
<div class="connection-name">{{ ds.name }}</div>
@@ -49,6 +51,7 @@
4951
import IconOpeAdd from '@/assets/svg/operate/ope-add.svg'
5052
import IconOpeEdit from '@/assets/svg/operate/ope-edit.svg'
5153
import IconOpeDelete from '@/assets/svg/operate/ope-delete.svg'
54+
import MysqlDs from '@/assets/svg/ds/mysql-ds.svg'
5255
import { Search, List, CreditCard } from '@element-plus/icons-vue'
5356
import { ref, onMounted } from 'vue'
5457
import DsForm from './form.vue'

0 commit comments

Comments
 (0)