Skip to content

Commit 0179b3d

Browse files
committed
feat: datasource ui
1 parent 6948523 commit 0179b3d

File tree

4 files changed

+79
-92
lines changed

4 files changed

+79
-92
lines changed

frontend/src/api/datasource.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { request } from '@/utils/request'
2+
3+
export const datasourceApi = {
4+
check: (data: any) => request.post('/datasource/check', data),
5+
add: (data: any) => request.post('/datasource/add', data),
6+
list: () => request.get('/datasource/list')
7+
}

frontend/src/utils/utils.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const getCheckDate = (timestamp: any) => {
2+
if (!timestamp) return false
3+
const dt = new Date(timestamp)
4+
if (isNaN(dt.getTime())) return false
5+
return dt
6+
}
7+
8+
export const datetimeFormat = (timestamp: any) => {
9+
const dt = getCheckDate(timestamp)
10+
if (!dt) return timestamp
11+
12+
const y = dt.getFullYear()
13+
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
14+
const d = (dt.getDate() + '').padStart(2, '0')
15+
const hh = (dt.getHours() + '').padStart(2, '0')
16+
const mm = (dt.getMinutes() + '').padStart(2, '0')
17+
const ss = (dt.getSeconds() + '').padStart(2, '0')
18+
19+
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
20+
}

frontend/src/views/ds/form.vue

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@
88
<el-form-item label="Name">
99
<el-input v-model="form.name" />
1010
</el-form-item>
11+
<el-form-item label="Description">
12+
<el-input v-model="form.desc" :rows="2" type="textarea" />
13+
</el-form-item>
14+
<el-form-item label="Type">
15+
<el-select v-model="form.type" placeholder="Select Type">
16+
<el-option
17+
v-for="item in dsType"
18+
:key="item.value"
19+
:label="item.label"
20+
:value="item.value"
21+
/>
22+
</el-select>
23+
</el-form-item>
1124
<el-form-item label="Host/Ip">
1225
<el-input v-model="form.host" />
1326
</el-form-item>
@@ -25,7 +38,7 @@
2538
</el-form-item>
2639

2740
<el-form-item>
28-
<el-button>Test Connect</el-button>
41+
<el-button @click="check">Test Connect</el-button>
2942
<el-button type="primary" @click="save">Save</el-button>
3043
</el-form-item>
3144
</el-form>
@@ -34,22 +47,39 @@
3447
<script lang="ts" setup>
3548
import { reactive } from 'vue'
3649
import { ref } from 'vue'
50+
import { datasourceApi } from '@/api/datasource'
51+
3752
const dialogVisible = ref<boolean>(false)
53+
const dsType = [
54+
{label:"MySQL", value:"mysql"}
55+
]
3856
const form = reactive({
3957
name:'',
58+
desc:'',
59+
type:'mysql',
4060
host:'',
4161
port:0,
4262
username:'',
4363
password:'',
44-
database:''
64+
database:'',
65+
configuration: ''
4566
})
4667
4768
const open = () => {
4869
dialogVisible.value = true
4970
}
5071
5172
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)
76+
})
77+
}
5278
79+
const check = () => {
80+
datasourceApi.check(form).then((res: any) => {
81+
console.log(res)
82+
})
5383
}
5484
5585
defineExpose({ open })

frontend/src/views/ds/index.vue

Lines changed: 20 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<div class="connections-container">
2121
<div
2222
class="connection-card"
23-
v-for="ds in mockData"
23+
v-for="ds in dsList"
2424
>
2525
<div class="connection-icon">
2626
<i class="mdi mdi-database"></i>
@@ -29,7 +29,7 @@
2929
<div class="connection-name">{{ ds.name }}</div>
3030
<div class="connection-type">{{ ds.type }}</div>
3131
<div class="connection-host">{{ ds.host }}</div>
32-
<div class="connection-last">{{ ds.create_time }}</div>
32+
<div class="connection-last">{{ datetimeFormat(ds.create_time) }}</div>
3333
</div>
3434
<div class="connection-status" :class="`${getStatus(ds.status)}`">{{ ds.status }}</div>
3535
<div class="connection-actions">
@@ -50,111 +50,41 @@ import IconOpeAdd from '@/assets/svg/operate/ope-add.svg'
5050
import IconOpeEdit from '@/assets/svg/operate/ope-edit.svg'
5151
import IconOpeDelete from '@/assets/svg/operate/ope-delete.svg'
5252
import { Search } from '@element-plus/icons-vue'
53-
import { ref } from 'vue'
53+
import { ref, onMounted } from 'vue'
5454
import DsForm from './form.vue'
55+
import { datasourceApi } from '@/api/datasource'
56+
import { datetimeFormat } from '@/utils/utils'
5557
5658
const search = ref<string>('')
5759
const dsForm = ref()
58-
59-
const mockData = [
60-
{
61-
name:'1',
62-
type:'mysql',
63-
host: '1.1.1.1',
64-
description:'description',
65-
create:'admin',
66-
create_time:'2025-04-22',
67-
status:'On'
68-
},
69-
{
70-
name:'2',
71-
type:'mysql',
72-
host: '1.1.1.1',
73-
description:'description',
74-
create:'admin',
75-
create_time:'2025-04-22',
76-
status:'Off'
77-
},
78-
{
79-
name:'3',
80-
type:'mysql',
81-
host: '1.1.1.1',
82-
description:'description',
83-
create:'admin',
84-
create_time:'2025-04-22',
85-
status:'Check'
86-
},
87-
{
88-
name:'1',
89-
type:'mysql',
90-
host: '1.1.1.1',
91-
description:'description',
92-
create:'admin',
93-
create_time:'2025-04-22',
94-
status:'On'
95-
},
96-
{
97-
name:'2',
98-
type:'mysql',
99-
host: '1.1.1.1',
100-
description:'description',
101-
create:'admin',
102-
create_time:'2025-04-22',
103-
status:'Off'
104-
},
105-
{
106-
name:'3',
107-
type:'mysql',
108-
host: '1.1.1.1',
109-
description:'description',
110-
create:'admin',
111-
create_time:'2025-04-22',
112-
status:'Check'
113-
},
114-
{
115-
name:'1',
116-
type:'mysql',
117-
host: '1.1.1.1',
118-
description:'description',
119-
create:'admin',
120-
create_time:'2025-04-22',
121-
status:'On'
122-
},
123-
{
124-
name:'2',
125-
type:'mysql',
126-
host: '1.1.1.1',
127-
description:'description',
128-
create:'admin',
129-
create_time:'2025-04-22',
130-
status:'Off'
131-
},
132-
{
133-
name:'3',
134-
type:'mysql',
135-
host: '1.1.1.1',
136-
description:'description',
137-
create:'admin',
138-
create_time:'2025-04-22',
139-
status:'Check'
140-
}
141-
]
60+
const dsList = ref<any>([])
14261
14362
const getStatus = (status: string) => {
144-
if (status === 'On') {
63+
if (status === 'Success') {
14564
return 'connected'
14665
}
147-
if (status === 'Off') {
66+
if (status === 'Fail') {
14867
return 'failed'
14968
}
150-
if (status === 'Check') {
69+
if (status === 'Checking') {
15170
return 'needs-verification'
15271
}
15372
}
15473
15574
const addDs = () => {
15675
dsForm.value.open()
15776
}
77+
78+
const list = () => {
79+
datasourceApi.list().then((res) => {
80+
dsList.value = res
81+
})
82+
}
83+
84+
onMounted(() => {
85+
list()
86+
})
87+
15888
</script>
15989
<style lang="less" scoped>
16090
.header{

0 commit comments

Comments
 (0)