Skip to content

Commit 8384432

Browse files
committed
feat: datasource
1 parent 178d41a commit 8384432

File tree

7 files changed

+123
-33
lines changed

7 files changed

+123
-33
lines changed

backend/apps/datasource/api/datasource.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from fastapi import APIRouter, HTTPException
2-
from ..crud.datasource import get_datasource_list, check_status, create_ds
2+
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds
33
from common.core.deps import SessionDep
44
from ..models.datasource import DatasourceConf, CoreDatasource
55

@@ -14,5 +14,13 @@ def check(session: SessionDep, conf: DatasourceConf):
1414
return check_status(session, conf)
1515

1616
@router.post("/add", response_model=CoreDatasource)
17-
def check(session: SessionDep, ds: CoreDatasource):
17+
def add(session: SessionDep, ds: CoreDatasource):
1818
return create_ds(session, ds)
19+
20+
@router.post("/update", response_model=CoreDatasource)
21+
def update(session: SessionDep, ds: CoreDatasource):
22+
return update_ds(session, ds)
23+
24+
@router.post("/delete/{id}", response_model=CoreDatasource)
25+
def delete(session: SessionDep, id: int):
26+
return delete_ds(session, id)

backend/apps/datasource/crud/datasource.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
from sqlmodel import Session, select
1+
from sqlmodel import select
22
from ..models.datasource import CoreDatasource, DatasourceConf
33
import pyodbc
44
import datetime
5+
from common.core.deps import SessionDep
56

6-
def get_datasource_list(session: Session) -> CoreDatasource:
7-
statement = select(CoreDatasource)
7+
def get_datasource_list(session: SessionDep) -> CoreDatasource:
8+
statement = select(CoreDatasource).order_by(CoreDatasource.create_time.desc())
89
datasource_list = session.exec(statement).fetchall()
910
return datasource_list
1011

11-
def check_status(session: Session, conf: DatasourceConf):
12+
def check_status(session: SessionDep, conf: DatasourceConf):
1213
conn_str = (
1314
"DRIVER={MySQL ODBC 9.3 Unicode Driver};" # todo driver config
1415
f"SERVER={conf.host};"
@@ -30,10 +31,28 @@ def check_status(session: Session, conf: DatasourceConf):
3031
if conn is not None:
3132
conn.close()
3233

33-
def create_ds(session: Session, ds: CoreDatasource):
34+
def create_ds(session: SessionDep, ds: CoreDatasource):
3435
record = CoreDatasource(**ds.model_dump())
3536
record.create_time = datetime.datetime.now()
3637
record.status = "Success" # todo check status
3738
session.add(record)
3839
session.commit()
39-
return record
40+
return record
41+
42+
def update_ds(session: SessionDep, ds: CoreDatasource):
43+
ds.id = int(ds.id)
44+
term = session.exec(select(CoreDatasource).where(CoreDatasource.id == ds.id)).first()
45+
update_data = ds.model_dump(exclude_unset=True)
46+
for field, value in update_data.items():
47+
setattr(term, field, value)
48+
session.add(term)
49+
session.commit()
50+
return ds
51+
52+
def delete_ds(session: SessionDep, id: int):
53+
term = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first()
54+
session.delete(term)
55+
session.commit()
56+
return {
57+
"message": f"Datasource with ID {id} deleted successfully."
58+
}

backend/apps/datasource/models/datasource.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ class CoreDatasource(SQLModel, table=True):
1515
status: str = Field(max_length=64, nullable=True)
1616

1717
class DatasourceConf(BaseModel):
18-
host: str
19-
port: int
20-
username: str
21-
password: str
22-
database: str
23-
driver: str
18+
host: str = ''
19+
port: int = 0
20+
username: str = ''
21+
password: str = ''
22+
database: str = ''
23+
driver: str = ''

frontend/src/api/datasource.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@ import { request } from '@/utils/request'
33
export const datasourceApi = {
44
check: (data: any) => request.post('/datasource/check', data),
55
add: (data: any) => request.post('/datasource/add', data),
6-
list: () => request.get('/datasource/list')
6+
list: () => request.get('/datasource/list'),
7+
update: (data: any) => request.post('/datasource/update', data),
8+
delete: (id: Number) => request.post(`/datasource/delete/${id}`)
79
}

frontend/src/utils/request.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ class HttpService {
164164
// ElMessage.error(errorMessage)
165165
ElMessage({
166166
message: errorMessage,
167-
type: 'error'
167+
type: 'error',
168+
showClose: true
168169
})
169170
}
170171

frontend/src/views/ds/form.vue

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<el-input v-model="form.name" />
1010
</el-form-item>
1111
<el-form-item label="Description">
12-
<el-input v-model="form.desc" :rows="2" type="textarea" />
12+
<el-input v-model="form.description" :rows="2" type="textarea" />
1313
</el-form-item>
1414
<el-form-item label="Type">
1515
<el-select v-model="form.type" placeholder="Select Type">
@@ -37,26 +37,29 @@
3737
<el-input v-model="form.database" />
3838
</el-form-item>
3939

40-
<el-form-item>
40+
<div style="display: flex;justify-content: flex-end;">
41+
<el-button @click="close">Cancel</el-button>
4142
<el-button @click="check">Test Connect</el-button>
4243
<el-button type="primary" @click="save">Save</el-button>
43-
</el-form-item>
44+
</div>
4445
</el-form>
4546
</el-dialog>
4647
</template>
4748
<script lang="ts" setup>
48-
import { reactive } from 'vue'
4949
import { ref } from 'vue'
5050
import { datasourceApi } from '@/api/datasource'
5151
52+
const emit = defineEmits(['refresh'])
53+
5254
const dialogVisible = ref<boolean>(false)
5355
const dsType = [
5456
{label:"MySQL", value:"mysql"}
5557
]
56-
const form = reactive({
58+
const form = ref<any>({
5759
name:'',
58-
desc:'',
60+
description:'',
5961
type:'mysql',
62+
driver:'',
6063
host:'',
6164
port:0,
6265
username:'',
@@ -65,19 +68,51 @@ const form = reactive({
6568
configuration: ''
6669
})
6770
68-
const open = () => {
71+
const close = () => {
72+
dialogVisible.value = false
73+
}
74+
75+
const open = (item: any) => {
76+
if (item) {
77+
form.value.id = item.id
78+
form.value.name = item.name
79+
form.value.description = item.description
80+
form.value.type = item.type
81+
const configuration = JSON.parse(item.configuration)
82+
form.value.host = configuration.host
83+
form.value.port = configuration.port
84+
form.value.username = configuration.username
85+
form.value.password = configuration.password
86+
form.value.database = configuration.database
87+
}
6988
dialogVisible.value = true
7089
}
7190
7291
const save = () => {
73-
form.configuration = JSON.stringify({host:form.host,port:form.port,username:form.username,password:form.password,database:form.database})
74-
datasourceApi.add(form).then((res: any) => {
75-
console.log(res)
92+
form.value.configuration = JSON.stringify({
93+
host:form.value.host,
94+
port:form.value.port,
95+
username:form.value.username,
96+
password:form.value.password,
97+
database:form.value.database
7698
})
99+
if (form.value.id) {
100+
datasourceApi.update(form.value).then((res) => {
101+
console.log(res)
102+
close()
103+
emit('refresh')
104+
})
105+
} else {
106+
datasourceApi.add(form.value).then((res: any) => {
107+
console.log(res)
108+
close()
109+
emit('refresh')
110+
})
111+
}
77112
}
78113
79114
const check = () => {
80-
datasourceApi.check(form).then((res: any) => {
115+
datasourceApi.check(form.value).then((res: any) => {
81116
console.log(res)
82117
})
83118
}

frontend/src/views/ds/index.vue

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</el-input>
1515
</div>
1616

17-
<el-button type="primary" :icon="IconOpeAdd" @click="addDs">Add Datasource</el-button>
17+
<el-button type="primary" :icon="IconOpeAdd" @click="editDs()">Add Datasource</el-button>
1818
</div>
1919

2020
<div class="connections-container">
@@ -33,17 +33,17 @@
3333
</div>
3434
<div class="connection-status" :class="`${getStatus(ds.status)}`">{{ ds.status }}</div>
3535
<div class="connection-actions">
36-
<button class="action-btn">
36+
<button class="action-btn" @click="editDs(ds)">
3737
<el-icon><IconOpeEdit /></el-icon>
3838
</button>
39-
<button class="action-btn">
39+
<button class="action-btn" @click="deleteDs(ds)">
4040
<el-icon><IconOpeDelete /></el-icon>
4141
</button>
4242
</div>
4343
</div>
4444
</div>
4545
</div>
46-
<DsForm ref="dsForm"/>
46+
<DsForm ref="dsForm" @refresh="refresh"/>
4747
</template>
4848
<script lang="ts" setup>
4949
import IconOpeAdd from '@/assets/svg/operate/ope-add.svg'
@@ -54,6 +54,7 @@ import { ref, onMounted } from 'vue'
5454
import DsForm from './form.vue'
5555
import { datasourceApi } from '@/api/datasource'
5656
import { datetimeFormat } from '@/utils/utils'
57+
import { ElMessageBox } from 'element-plus'
5758
5859
const search = ref<string>('')
5960
const dsForm = ref()
@@ -71,8 +72,8 @@ const getStatus = (status: string) => {
7172
}
7273
}
7374
74-
const addDs = () => {
75-
dsForm.value.open()
75+
const refresh = () => {
76+
list()
7677
}
7778
7879
const list = () => {
@@ -81,6 +82,30 @@ const list = () => {
8182
})
8283
}
8384
85+
const editDs = (item: any = {}) => {
86+
dsForm.value.open(item)
87+
}
88+
89+
const deleteDs = (item: any) => {
90+
ElMessageBox.confirm(
91+
'Delete this datasource?',
92+
'Delete',
93+
{
94+
confirmButtonText: 'Confirm',
95+
cancelButtonText: 'Cancel',
96+
type: 'warning',
97+
}
98+
)
99+
.then(() => {
100+
datasourceApi.delete(item.id).then(() => {
101+
console.log('success')
102+
list()
103+
})
104+
})
105+
.catch(() => {
106+
})
107+
}
108+
84109
onMounted(() => {
85110
list()
86111
})

0 commit comments

Comments
 (0)