refactor: IFrame

This commit is contained in:
xingyu 2022-11-22 21:55:31 +08:00
parent d604c6c5fb
commit 557f2937f5
6 changed files with 221 additions and 213 deletions

View File

@ -1,13 +1,39 @@
<template>
<ContentWrap title="数据库文档">
<!-- 操作工具栏 -->
<div class="mb-10px">
<XButton
type="primary"
preIcon="ep:download"
:title="t('action.export') + ' HTML'"
@click="handleExport('HTML')"
/>
<XButton
type="primary"
preIcon="ep:download"
:title="t('action.export') + ' Word'"
@click="handleExport('Word')"
/>
<XButton
type="primary"
preIcon="ep:download"
:title="t('action.export') + ' Markdown'"
@click="handleExport('Markdown')"
/>
</div>
<IFrame v-if="!loding" v-loading="loding" :src="src" />
</ContentWrap>
</template>
<script setup lang="ts"> <script setup lang="ts">
import { IFrame } from '@/components/IFrame'
import * as DbDocApi from '@/api/infra/dbDoc'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import download from '@/utils/download' import download from '@/utils/download'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { IFrame } from '@/components/IFrame'
import * as DbDocApi from '@/api/infra/dbDoc'
const { t } = useI18n() // const { t } = useI18n() //
const loding = ref(true)
const src = ref('') const src = ref('')
const loding = ref(true)
/** 页面加载 */ /** 页面加载 */
const init = async () => { const init = async () => {
const res = await DbDocApi.exportHtmlApi() const res = await DbDocApi.exportHtmlApi()
@ -16,40 +42,16 @@ const init = async () => {
src.value = blobUrl src.value = blobUrl
loding.value = false loding.value = false
} }
/** 处理导出 HTML */ /** 处理导出 */
const handleExportHtml = async () => { const handleExport = async (type: string) => {
const res = await DbDocApi.exportHtmlApi() const res = await DbDocApi.exportHtmlApi()
download.html(res, '数据库文档.html') if (type === 'HTML') { download.html(res, '数据库文档.html') }
} if (type === 'Word') { download.word(res, '数据库文档.doc') }
/** 处理导出 Word */ if(type === 'Markdown') {download.markdown(res, '数据库文档.md')}
const handleExportWord = async () => {
const res = await DbDocApi.exportHtmlApi()
download.word(res, '数据库文档.doc')
}
/** 处理导出 Markdown */
const handleExportMarkdown = async () => {
const res = await DbDocApi.exportHtmlApi()
download.markdown(res, '数据库文档.md')
} }
onMounted(async () => { onMounted(async () => {
await init() await init()
}) })
</script> </script>
<template>
<ContentWrap title="数据库文档" message="https://doc.iocoder.cn/db-doc/">
<!-- 操作工具栏 -->
<div class="mb-10px">
<el-button type="primary" @click="handleExportHtml">
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') + ' HTML' }}
</el-button>
<el-button type="primary" @click="handleExportWord">
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') + ' Word' }}
</el-button>
<el-button type="primary" @click="handleExportMarkdown">
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') + ' Markdown' }}
</el-button>
</div>
<IFrame v-if="!loding" v-loading="loding" :src="src" />
</ContentWrap>
</template>

View File

@ -1,12 +1,13 @@
<script setup lang="ts">
import { IFrame } from '@/components/IFrame'
import { ref } from 'vue'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/druid/index.html')
</script>
<template> <template>
<ContentWrap> <ContentWrap>
<IFrame :src="src" /> <IFrame :src="src" />
</ContentWrap> </ContentWrap>
</template> </template>
<script setup lang="ts">
import { ref } from 'vue'
import { IFrame } from '@/components/IFrame'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/druid/index.html')
</script>

View File

@ -1,157 +1,3 @@
<script setup lang="ts">
import { onBeforeMount, ref } from 'vue'
import * as RedisApi from '@/api/infra/redis'
import { DICT_TYPE } from '@/utils/dict'
import * as echarts from 'echarts'
import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
import {
ElRow,
ElCard,
ElCol,
ElTable,
ElTableColumn,
ElScrollbar,
ElDescriptions,
ElDescriptionsItem,
ElMessage
} from 'element-plus'
const cache = ref<RedisMonitorInfoVO>()
const keyListLoad = ref(true)
const keyList = ref<RedisKeyInfo[]>([])
//
const readRedisInfo = async () => {
const data = await RedisApi.getCacheApi()
cache.value = data
loadEchartOptions(data.commandStats)
const redisKeysInfo = await RedisApi.getKeyDefineListApi()
keyList.value = redisKeysInfo
keyListLoad.value = false //
}
//
const commandStatsRef = ref<HTMLElement>()
const usedmemory = ref<HTMLDivElement>()
const loadEchartOptions = (stats) => {
const commandStats = [] as any[]
const nameList = [] as string[]
stats.forEach((row) => {
commandStats.push({
name: row.command,
value: row.calls
})
nameList.push(row.command)
})
const commandStatsInstance = echarts.init(commandStatsRef.value!, 'macarons')
commandStatsInstance.setOption({
title: {
text: '命令统计',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
type: 'scroll',
orient: 'vertical',
right: 30,
top: 10,
bottom: 20,
data: nameList,
textStyle: {
color: '#a1a1a1'
}
},
series: [
{
name: '命令',
type: 'pie',
radius: [20, 120],
center: ['40%', '60%'],
data: commandStats,
roseType: 'radius',
label: {
show: true
},
emphasis: {
label: {
show: true
},
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
})
const usedMemoryInstance = echarts.init(usedmemory.value!, 'macarons')
usedMemoryInstance.setOption({
title: {
text: '内存使用情况',
left: 'center'
},
tooltip: {
formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human
},
series: [
{
name: '峰值',
type: 'gauge',
min: 0,
max: 100,
progress: {
show: true
},
detail: {
formatter: cache.value!.info.used_memory_human
},
data: [
{
value: parseFloat(cache.value!.info.used_memory_human),
name: '内存消耗'
}
]
}
]
})
}
const dialogVisible = ref(false)
const keyTemplate = ref('')
const cacheKeys = ref()
const cacheForm = ref<{
key: string
value: string
}>({
key: '',
value: ''
})
const openKeyTemplate = async (row: RedisKeyInfo) => {
keyTemplate.value = row.keyTemplate
cacheKeys.value = await RedisApi.getKeyListApi(row.keyTemplate)
dialogVisible.value = true
}
const handleDeleteKey = async (row) => {
RedisApi.deleteKeyApi(row)
ElMessage.success('删除成功')
}
const handleDeleteKeys = async (row) => {
RedisApi.deleteKeysApi(row)
ElMessage.success('删除成功')
}
const handleKeyValue = async (row) => {
const res = await RedisApi.getKeyValueApi(row)
cacheForm.value = res
}
onBeforeMount(() => {
readRedisInfo()
})
</script>
<template> <template>
<el-scrollbar height="calc(100vh - 88px - 40px - 50px)"> <el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
<el-row> <el-row>
@ -282,6 +128,163 @@ onBeforeMount(() => {
</el-row> </el-row>
</XModal> </XModal>
</template> </template>
<script setup lang="ts">
import { onBeforeMount, ref } from 'vue'
import {
ElRow,
ElCard,
ElCol,
ElTable,
ElTableColumn,
ElScrollbar,
ElDescriptions,
ElDescriptionsItem
} from 'element-plus'
import * as echarts from 'echarts'
import { DICT_TYPE } from '@/utils/dict'
import { useI18n } from '@/hooks/web/useI18n'
import { useMessage } from '@/hooks/web/useMessage'
import * as RedisApi from '@/api/infra/redis'
import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
const { t } = useI18n() //
const message = useMessage() //
const cache = ref<RedisMonitorInfoVO>()
const keyListLoad = ref(true)
const keyList = ref<RedisKeyInfo[]>([])
//
const readRedisInfo = async () => {
const data = await RedisApi.getCacheApi()
cache.value = data
loadEchartOptions(data.commandStats)
const redisKeysInfo = await RedisApi.getKeyDefineListApi()
keyList.value = redisKeysInfo
keyListLoad.value = false //
}
//
const commandStatsRef = ref<HTMLElement>()
const usedmemory = ref<HTMLDivElement>()
const loadEchartOptions = (stats) => {
const commandStats = [] as any[]
const nameList = [] as string[]
stats.forEach((row) => {
commandStats.push({
name: row.command,
value: row.calls
})
nameList.push(row.command)
})
const commandStatsInstance = echarts.init(commandStatsRef.value!, 'macarons')
commandStatsInstance.setOption({
title: {
text: '命令统计',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
type: 'scroll',
orient: 'vertical',
right: 30,
top: 10,
bottom: 20,
data: nameList,
textStyle: {
color: '#a1a1a1'
}
},
series: [
{
name: '命令',
type: 'pie',
radius: [20, 120],
center: ['40%', '60%'],
data: commandStats,
roseType: 'radius',
label: {
show: true
},
emphasis: {
label: {
show: true
},
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
})
const usedMemoryInstance = echarts.init(usedmemory.value!, 'macarons')
usedMemoryInstance.setOption({
title: {
text: '内存使用情况',
left: 'center'
},
tooltip: {
formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human
},
series: [
{
name: '峰值',
type: 'gauge',
min: 0,
max: 100,
progress: {
show: true
},
detail: {
formatter: cache.value!.info.used_memory_human
},
data: [
{
value: parseFloat(cache.value!.info.used_memory_human),
name: '内存消耗'
}
]
}
]
})
}
const dialogVisible = ref(false)
const keyTemplate = ref('')
const cacheKeys = ref()
const cacheForm = ref<{
key: string
value: string
}>({
key: '',
value: ''
})
const openKeyTemplate = async (row: RedisKeyInfo) => {
keyTemplate.value = row.keyTemplate
cacheKeys.value = await RedisApi.getKeyListApi(row.keyTemplate)
dialogVisible.value = true
}
const handleDeleteKey = async (row) => {
RedisApi.deleteKeyApi(row)
message.success(t('common.delSuccess'))
}
const handleDeleteKeys = async (row) => {
RedisApi.deleteKeysApi(row)
message.success(t('common.delSuccess'))
}
const handleKeyValue = async (row) => {
const res = await RedisApi.getKeyValueApi(row)
cacheForm.value = res
}
onBeforeMount(() => {
readRedisInfo()
})
</script>
<style scoped> <style scoped>
.redis { .redis {
height: 600px; height: 600px;

View File

@ -1,12 +1,12 @@
<script setup lang="ts">
import { IFrame } from '@/components/IFrame'
import { ref } from 'vue'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/admin/applications')
</script>
<template> <template>
<ContentWrap> <ContentWrap>
<IFrame :src="src" /> <IFrame :src="src" />
</ContentWrap> </ContentWrap>
</template> </template>
<script setup lang="ts">
import { ref } from 'vue'
import { IFrame } from '@/components/IFrame'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/admin/applications')
</script>

View File

@ -1,11 +1,12 @@
<script setup lang="ts">
import { IFrame } from '@/components/IFrame'
import { ref } from 'vue'
const src = ref('http://skywalking.shop.iocoder.cn')
</script>
<template> <template>
<ContentWrap> <ContentWrap>
<IFrame :src="src" /> <IFrame :src="src" />
</ContentWrap> </ContentWrap>
</template> </template>
<script setup lang="ts">
import { ref } from 'vue'
import { IFrame } from '@/components/IFrame'
const src = ref('http://skywalking.shop.iocoder.cn')
</script>

View File

@ -1,12 +1,13 @@
<script setup lang="ts">
import { IFrame } from '@/components/IFrame'
import { ref } from 'vue'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/doc.html')
</script>
<template> <template>
<ContentWrap> <ContentWrap>
<IFrame :src="src" /> <IFrame :src="src" />
</ContentWrap> </ContentWrap>
</template> </template>
<script setup lang="ts">
import { ref } from 'vue'
import { IFrame } from '@/components/IFrame'
const BASE_URL = import.meta.env.VITE_BASE_URL
const src = ref(BASE_URL + '/doc.html')
</script>