Skip to content

Commit 8e28700

Browse files
committed
改造为路由跳转方式
1 parent acfcf7d commit 8e28700

File tree

8 files changed

+173
-104
lines changed

8 files changed

+173
-104
lines changed

src/element-plus.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import ElementPlus from 'element-plus'
2+
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
3+
import 'element-plus/dist/index.css'
4+
import '@/assets/scss/base.scss'
5+
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
6+
7+
const debounce = (callback, delay) => {
8+
let tid
9+
return function () {
10+
const ctx = self
11+
tid && clearTimeout(tid)
12+
tid = setTimeout(() => {
13+
callback.apply(ctx, arguments)
14+
}, delay)
15+
}
16+
}
17+
18+
export default (app) => {
19+
const _ = window.ResizeObserver
20+
window.ResizeObserver = class ResizeObserver extends _ {
21+
constructor (callback) {
22+
callback = debounce(callback, 20)
23+
super(callback)
24+
}
25+
}
26+
app.use(ElementPlus, {
27+
locale: zhCn
28+
})
29+
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
30+
app.component(key, component)
31+
}
32+
}

src/main.js

+2-11
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,8 @@ import { createApp } from 'vue'
22
import App from './App.vue'
33
import router from './router'
44
import store from './store'
5-
import ElementPlus from 'element-plus'
6-
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
7-
import 'element-plus/dist/index.css'
8-
import '@/assets/scss/base.scss'
9-
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
5+
import useElementPlus from './element-plus'
106

117
const app = createApp(App).use(store).use(router)
12-
app.use(ElementPlus, {
13-
locale: zhCn
14-
})
15-
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
16-
app.component(key, component)
17-
}
8+
useElementPlus(app)
189
app.mount('#app')

src/router/index.js

+30-5
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,40 @@ const routes = [
66
path: '/',
77
name: 'home',
88
component: HomeView,
9-
redirect: '/manager'
9+
redirect: '/manager/manifest'
1010
},
1111
{
1212
path: '/manager',
1313
name: 'manager',
14-
// route level code-splitting
15-
// this generates a separate chunk (about.[hash].js) for this route
16-
// which is lazy-loaded when the route is visited.
17-
component: () => import(/* webpackChunkName: "about" */ '../views/manager/index.vue')
14+
redirect: '/manager/manifest',
15+
component: () => import(/* webpackChunkName: "manager" */ '../views/manager/index.vue'),
16+
children: [
17+
{
18+
path: '/manager/add',
19+
name: 'managerAdd',
20+
component: () => import(/* webpackChunkName: "managerAdd" */ '../views/manager/add.vue')
21+
},
22+
{
23+
path: '/manager/edit',
24+
name: 'managerEdit',
25+
component: () => import(/* webpackChunkName: "managerEdit" */ '../views/manager/add.vue')
26+
},
27+
{
28+
path: '/manager/copy',
29+
name: 'managerCopy',
30+
component: () => import(/* webpackChunkName: "managerCopy" */ '../views/manager/add.vue')
31+
},
32+
{
33+
path: '/manager/list',
34+
name: 'managerList',
35+
component: () => import(/* webpackChunkName: "managerList" */ '../views/manager/list.vue')
36+
},
37+
{
38+
path: '/manager/manifest',
39+
name: 'managerManifest',
40+
component: () => import(/* webpackChunkName: "managerManifest" */ '../views/manager/manifest.vue')
41+
}
42+
]
1843
}
1944
]
2045

src/views/manager/add.vue

+23-15
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@
3636
</el-col>
3737
<el-col :span="8">
3838
<el-form-item label="默认运行" prop="defaultRun">
39-
<el-switch
40-
v-model="form.defaultRun"
41-
active-text="开启"
42-
inactive-text="关闭"
43-
/>
39+
<el-switch v-model="form.defaultRun" active-text="开启" inactive-text="关闭" />
4440
</el-form-item>
4541
</el-col>
4642
</el-row>
@@ -51,21 +47,18 @@
5147
<el-input v-model="form.desc" type="textarea" :rows="5"></el-input>
5248
</el-form-item>
5349
<el-form-item>
54-
<el-button type="primary" @click="onConfirm">{{ active === 'edit' ? '修改' : '添加' }}</el-button>
50+
<el-button type="primary" @click="onConfirm">{{ route.name === 'managerEdit' ? '修改' : '添加' }}</el-button>
5551
</el-form-item>
5652
</el-form>
5753
</template>
5854
<script setup>
5955
import { v4 as uuid } from 'uuid'
60-
import { ref, defineEmits, defineProps, watch } from 'vue'
56+
import { ref, defineProps, watch } from 'vue'
6157
import { manifest } from './common'
62-
63-
const emit = defineEmits(['back'])
64-
58+
import { useRoute } from 'vue-router'
59+
import router from '@/router'
60+
const route = useRoute()
6561
const props = defineProps({
66-
active: {
67-
type: String
68-
},
6962
row: {
7063
type: Object,
7164
default: () => ({})
@@ -101,16 +94,31 @@ const onConfirm = () => {
10194
commands: tableData.value
10295
})
10396
setTimeout(() => {
104-
emit('back')
97+
router.replace({
98+
name: 'managerList'
99+
})
105100
}, 500)
106101
}
107102
watch(() => props.active, () => {
108103
form.value = defaultRef().form
109104
})
105+
watch(() => route.name, () => {
106+
if (/^manager/.test(route.name)) {
107+
if (route.query.uuid) {
108+
form.value = tableData.value.find((item) => item.uuid === route.query.uuid)
109+
} else {
110+
form.value = defaultRef().form
111+
}
112+
}
113+
}, {
114+
immediate: true
115+
})
110116
</script>
111117
<style lang="scss" scoped>
112118
.el-form-item {
113-
.el-select, :deep(.el-input,.el-select) {
119+
120+
.el-select,
121+
:deep(.el-input, .el-select) {
114122
width: 100%;
115123
}
116124
}

src/views/manager/common.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
1+
import { reactive } from 'vue'
12
import { useStorage } from '@vueuse/core'
2-
import { ElMessage } from 'element-plus'
3+
import { ElMessage, ElMessageBox } from 'element-plus'
34

45
import api from '@/api'
56
import { downloadFile } from '@/utils'
67

8+
const state = reactive({
9+
import: false,
10+
export: false
11+
})
12+
713
export const manifest = useStorage(
814
'manifest',
915
{},
1016
localStorage,
1117
{ mergeDefaults: true }
1218
)
1319

20+
export const handleImportBefore = (event) => {
21+
if (!state.import) {
22+
ElMessageBox.confirm('导入配置后, 将会覆盖当前配置, 是否确认?', {
23+
title: '确认导入配置',
24+
type: 'warning'
25+
}).then(() => {
26+
state.import = true
27+
event.target.click()
28+
}).catch(console.log)
29+
event.stopPropagation()
30+
}
31+
}
1432
export const handleImport = async (file) => {
1533
try {
1634
const data = await file.text()
@@ -22,6 +40,19 @@ export const handleImport = async (file) => {
2240
return false
2341
}
2442

43+
export const handleExportBefore = (event) => {
44+
if (!state.export) {
45+
manifest.value.path && ElMessageBox.confirm(`是否要导出配置到 ${manifest.value.path}`, {
46+
title: '确认导出配置',
47+
type: 'warning'
48+
}).then(() => {
49+
state.export = true
50+
handleExport()
51+
}).catch(console.log)
52+
} else {
53+
handleExport()
54+
}
55+
}
2556
export const handleExport = () => {
2657
api.export(manifest.value).then(() => {
2758
ElMessage.success('导出成功')

src/views/manager/index.vue

+29-26
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,37 @@
11
<template>
22
<el-container>
33
<el-aside width="240px">
4-
<el-row @click="active = 'manifest'">
5-
配置
6-
</el-row>
7-
<el-row @click="active = 'list'">
8-
命令列表
9-
</el-row>
10-
<el-row @click="active = 'add'">
11-
新增命令
4+
<el-row v-for="(item, index) in menus" :key="index" :class="{ 'active': item.name === route.name }"
5+
@click="handleClick(item.name)">
6+
{{ item.label }}
127
</el-row>
138
</el-aside>
149
<el-main>
15-
<Add :active="active" v-if="['add', 'edit', 'copy'].includes(active)" :row="activeRow" @back="active = 'list'" />
16-
<List v-if="active === 'list'" @open="handleOpen" @edit="row => handleEdit('edit', row)"
17-
@copy="row => handleEdit('copy', row)" />
18-
<Manifest v-if="active === 'manifest'" />
10+
<router-view></router-view>
1911
</el-main>
2012
</el-container>
2113
</template>
2214
<script setup>
23-
import api from '@/api'
2415
import { ref } from 'vue'
25-
import Add from './add'
26-
import List from './list'
27-
import Manifest from './manifest'
28-
const active = ref('manifest')
29-
const activeRow = ref({})
30-
const handleEdit = (type, row) => {
31-
active.value = type
32-
activeRow.value = row
33-
}
34-
const handleOpen = (row) => {
35-
api.open(row)
16+
import { useRoute } from 'vue-router'
17+
import router from '@/router'
18+
const route = useRoute()
19+
const menus = ref([
20+
{
21+
name: 'managerManifest',
22+
label: '配置'
23+
},
24+
{
25+
name: 'managerList',
26+
label: '命令列表'
27+
},
28+
{
29+
name: 'managerAdd',
30+
label: '新增命令'
31+
}
32+
])
33+
const handleClick = (active) => {
34+
router.push({ name: active })
3635
}
3736
</script>
3837
<style lang="scss" scoped>
@@ -47,11 +46,15 @@ const handleOpen = (row) => {
4746
.el-row {
4847
padding: 10px;
4948
cursor: pointer;
50-
transition: all 1s;
49+
transition: all .3s;
50+
color: #555;
5151
5252
&:hover {
5353
color: #111;
54-
background: #eee;
54+
}
55+
56+
&.active {
57+
color: var(--el-color-primary);
5558
}
5659
}
5760
}

src/views/manager/list.vue

+24-16
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,39 @@
11
<template>
2-
<el-table :data="tableData">
3-
<el-table-column type="index" label="序号" width="64" />
4-
<el-table-column prop="name" label="脚本名称" />
2+
<el-table :data="tableData" @dblclick="row => handleRow('managerEdit', row)">
3+
<el-table-column type="index" label="序号" width="60" />
4+
<el-table-column prop="name" label="名称" width="120" />
5+
<el-table-column prop="port" label="端口" width="120" />
6+
<el-table-column prop="nodeVersion" label="node版本" width="90" />
7+
<el-table-column prop="terminal" label="终端" width="64" />
58
<el-table-column prop="path" label="脚本路径" />
6-
<el-table-column prop="port" label="端口" />
79
<el-table-column prop="keywords" label="关键词" />
8-
<el-table-column prop="nodeVersion" label="node版本" />
9-
<el-table-column prop="terminal" label="终端" />
1010
<el-table-column prop="desc" label="备注" />
1111
<el-table-column prop="handle" label="操作" width="240">
1212
<template #default="{ row }">
13-
<el-button type="info" size="small" @click="emit('open', row)">打开路径</el-button>
14-
<el-button type="warning" size="small" @click="emit('edit', row)">修改</el-button>
15-
<el-button type="primary" size="small" @click="emit('copy', row)">复制</el-button>
13+
<el-button type="info" size="small" @click="handleOpen(row)">打开路径</el-button>
14+
<el-button type="warning" size="small" @click="handleRow('managerEdit', row)">修改</el-button>
15+
<el-button type="primary" size="small" @click="handleRow('managerCopy', row)">复制</el-button>
1616
</template>
1717
</el-table-column>
1818
</el-table>
19-
<el-space>
20-
<el-button type="info" @click="handleOutput">输出配置</el-button>
21-
<el-button type="success" @click="handleDownload">导出配置</el-button>
22-
</el-space>
2319
</template>
2420

2521
<script setup>
26-
import { ref, defineEmits } from 'vue'
27-
import { handleOutput, handleDownload, manifest } from './common'
28-
const emit = defineEmits(['edit', 'copy', 'open'])
22+
import { ref } from 'vue'
23+
import api from '@/api'
24+
import { manifest } from './common'
25+
import router from '@/router'
26+
const handleRow = (type, row) => {
27+
router.push({
28+
name: type,
29+
query: {
30+
uuid: row.uuid
31+
}
32+
})
33+
}
34+
const handleOpen = (row) => {
35+
api.open(row)
36+
}
2937
const tableData = ref(manifest.value.commands)
3038
</script>
3139
<style scoped>

0 commit comments

Comments
 (0)