This is an automated email from the ASF dual-hosted git repository. critas pushed a commit to branch fix_content in repository https://gitbox.apache.org/repos/asf/iotdb-docs.git
commit c9b06ecff5f69920455c9670e3cb03c87fffcad5 Author: CritasWang <[email protected]> AuthorDate: Fri Dec 5 17:24:30 2025 +0800 fix home display error --- pnpm-lock.yaml | 20 +- src/.vuepress/components/ResourceEvaluator.vue | 339 +++++++++++++------------ src/.vuepress/theme.ts | 1 - src/zh/ResourceEvaluator.md | 7 +- 4 files changed, 198 insertions(+), 169 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25bb1d45..c6015021 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -853,51 +853,61 @@ packages: resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/[email protected]': resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/[email protected]': resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/[email protected]': resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/[email protected]': resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} @@ -1466,8 +1476,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - [email protected]: - resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + [email protected]: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} [email protected]: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -4481,7 +4491,7 @@ snapshots: [email protected]([email protected]): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001759 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -4515,7 +4525,7 @@ snapshots: [email protected]: dependencies: - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001759 electron-to-chromium: 1.5.97 node-releases: 2.0.19 update-browserslist-db: 1.1.2([email protected]) @@ -4528,7 +4538,7 @@ snapshots: [email protected]: {} - [email protected]: {} + [email protected]: {} [email protected]: {} diff --git a/src/.vuepress/components/ResourceEvaluator.vue b/src/.vuepress/components/ResourceEvaluator.vue index ccb43738..6be37d01 100644 --- a/src/.vuepress/components/ResourceEvaluator.vue +++ b/src/.vuepress/components/ResourceEvaluator.vue @@ -22,6 +22,7 @@ import { ElButton, ElIcon, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElTo import * as Icons from "@element-plus/icons-vue"; import 'element-plus/theme-chalk/index.css'; import ConfigItem from "./ConfigItem.vue"; +import { ClientOnly } from "vuepress/client"; class Calculator { static add(...args: Array<string | number>): number { @@ -183,256 +184,274 @@ class Calculator { const totalSpaceInBytes = ref(0); const singleSpaceStorage = computed(() => { - let tmp = Calculator.toFixed(Calculator.divide(totalSpaceInBytes.value, 1024, 1024, 1024), 2); - if (tmp >= 1024) { - return Calculator.toFixed(Calculator.divide(totalSpaceInBytes.value, 1024, 1024, 1024, 1024), 2).toString() + ' TB'; - } else { - return tmp.toString() + ' GB'; - } + let tmp = Calculator.toFixed(Calculator.divide(totalSpaceInBytes.value, 1024, 1024, 1024), 2); + if (tmp >= 1024) { + return Calculator.toFixed(Calculator.divide(totalSpaceInBytes.value, 1024, 1024, 1024, 1024), 2).toString() + ' TB'; + } else { + return tmp.toString() + ' GB'; + } }); const doubleSpaceStorage = computed(() => { - let tmp = Calculator.toFixed(Calculator.divide(Calculator.multiply(totalSpaceInBytes.value, 2), 1024, 1024, 1024), 2); - if (tmp >= 1024) { - return Calculator.toFixed(Calculator.divide(Calculator.multiply(totalSpaceInBytes.value, 2), 1024, 1024, 1024, 1024), 2).toString() + ' TB'; - } else { - return tmp.toString() + ' GB'; - } + let tmp = Calculator.toFixed(Calculator.divide(Calculator.multiply(totalSpaceInBytes.value, 2), 1024, 1024, 1024), 2); + if (tmp >= 1024) { + return Calculator.toFixed(Calculator.divide(Calculator.multiply(totalSpaceInBytes.value, 2), 1024, 1024, 1024, 1024), 2).toString() + ' TB'; + } else { + return tmp.toString() + ' GB'; + } }); const configItems = ref([{ - measurementCount: null, - dataType: null, - frequency: null, - frequencyUnit: 'HZ', - averageStringLength: null, + measurementCount: null, + dataType: null, + frequency: null, + frequencyUnit: 'HZ', + averageStringLength: null, }]); const storeInfo = ref({ - storePeriod: null, - storePeriodUnit: 'DAY', - compressionRatio: null, + storePeriod: null, + storePeriodUnit: 'DAY', + compressionRatio: 10, }); const addConfigItem = () => { - configItems.value.push({ - measurementCount: null, - dataType: null, - frequency: null, - frequencyUnit: 'HZ', - averageStringLength: null, - }); + configItems.value.push({ + measurementCount: null, + dataType: null, + frequency: null, + frequencyUnit: 'HZ', + averageStringLength: null, + }); }; const removeConfigItem = (index: number) => { - if (configItems.value.length > 1) { - configItems.value.splice(index, 1); - } else { - alert('至少保留一个配置项'); - } + if (configItems.value.length > 1) { + configItems.value.splice(index, 1); + } else { + alert('至少保留一个配置项'); + } }; const dataTypeBytes: Record<string, number> = { - 'BOOLEAN': 9, - 'INT32': 12, - 'INT64': 16, - 'FLOAT': 12, - 'DOUBLE': 16, - 'TEXT': 8, - 'STRING': 8, - 'BLOB': 8, - 'TIMESTAMP': 16, - 'DATATIME': 12, + 'BOOLEAN': 9, + 'INT32': 12, + 'INT64': 16, + 'FLOAT': 12, + 'DOUBLE': 16, + 'TEXT': 8, + 'STRING': 8, + 'BLOB': 8, + 'TIMESTAMP': 16, + 'DATATIME': 12, }; const storeDurationInDays: Record<string, number> = { - 'DAY': 1, - 'MONTH': 30, - 'YEAR': 365, + 'DAY': 1, + 'MONTH': 30, + 'YEAR': 365, }; const samplingPeriodInSec: Record<string, number> = { - 'HZ': 1, - 'SECOND': 1, - 'MINUTE': 60, - 'HOUR': 3600, - 'DAY': 86400, + 'HZ': 1, + 'SECOND': 1, + 'MINUTE': 60, + 'HOUR': 3600, + 'DAY': 86400, } const calculateSpacePrecise = () => { - let totalSpace = 0; - configItems.value.forEach((item, index) => { - if (item.measurementCount && item.frequency && item.dataType && item.frequencyUnit) { - if (storeInfo.value.storePeriod && storeInfo.value.compressionRatio) { - let measurementCount = item.measurementCount; - let dataTypeSize = dataTypeBytes[item.dataType]; - if (item.dataType === 'STRING' || item.dataType === 'TEXT' || item.dataType === 'BLOB') { - if (item.averageStringLength === null) { - alert('请填写字符串平均长度'); - return; - } - dataTypeSize = Calculator.add(dataTypeSize, Number(item.averageStringLength)); - } - let samplingPeriod = Calculator.multiply(samplingPeriodInSec[item.frequencyUnit], item.frequency); - let samplePerDay = item.frequencyUnit === 'HZ' ? Calculator.multiply(86400, item.frequency) : Calculator.divide(86400, samplingPeriod); - let storePeriodInDay = Calculator.multiply(storeDurationInDays[storeInfo.value.storePeriodUnit], Number(storeInfo.value.storePeriod)); - totalSpace = Calculator.add(totalSpace, Calculator.divide(Calculator.multiply(measurementCount, dataTypeSize, samplePerDay, storePeriodInDay), storeInfo.value.compressionRatio)); - } else { - alert('请完整填写存储周期和压缩比'); - return; - } - } else { - alert(`请完整填写配置项 ${index + 1} 的数据`); + let totalSpace = 0; + configItems.value.forEach((item, index) => { + if (item.measurementCount && item.frequency && item.dataType && item.frequencyUnit) { + if (storeInfo.value.storePeriod && storeInfo.value.compressionRatio) { + let measurementCount = item.measurementCount; + let dataTypeSize = dataTypeBytes[item.dataType]; + if (item.dataType === 'STRING' || item.dataType === 'TEXT' || item.dataType === 'BLOB') { + if (item.averageStringLength === null) { + alert('请填写字符串平均长度'); return; + } + dataTypeSize = Calculator.add(dataTypeSize, Number(item.averageStringLength)); } - }); - totalSpaceInBytes.value = totalSpace; + let samplingPeriod = Calculator.multiply(samplingPeriodInSec[item.frequencyUnit], item.frequency); + let samplePerDay = item.frequencyUnit === 'HZ' ? Calculator.multiply(86400, item.frequency) : Calculator.divide(86400, samplingPeriod); + let storePeriodInDay = Calculator.multiply(storeDurationInDays[storeInfo.value.storePeriodUnit], Number(storeInfo.value.storePeriod)); + totalSpace = Calculator.add(totalSpace, Calculator.divide(Calculator.multiply(measurementCount, dataTypeSize, samplePerDay, storePeriodInDay), storeInfo.value.compressionRatio)); + } else { + alert('请完整填写存储周期和压缩比'); + return; + } + } else { + alert(`请完整填写配置项 ${index + 1} 的数据`); + return; + } + }); + totalSpaceInBytes.value = totalSpace; } </script> <template> - <div class="content-area"> - <div class="title">IoTDB 磁盘资源评估器</div> - <div v-for="(item, index) in configItems" :key="index" class="relative-box"> - <el-button class="add-button" @click="addConfigItem"> - <el-icon><Icons.Plus /></el-icon> - </el-button> - <el-button class="remove-button" @click="removeConfigItem(index)" :disabled="configItems.length <= 1"> - <el-icon><Icons.Minus /></el-icon> - </el-button> - <ConfigItem :index="index + 1" v-model:info="configItems[index]" /> - </div> - <div class="outer-box"> - <el-form :inline="true" class="store-row"> + <ClientOnly> + <div class="calc-content-area"> + <div class="title">IoTDB 磁盘资源评估器</div> + <div v-for="(item, index) in configItems" :key="index" class="relative-box"> + <el-button class="add-button" @click="addConfigItem"> + <el-icon> + <Icons.Plus /> + </el-icon> + </el-button> + <el-button class="remove-button" @click="removeConfigItem(index)" :disabled="configItems.length <= 1"> + <el-icon> + <Icons.Minus /> + </el-icon> + </el-button> + <ConfigItem :index="index + 1" v-model:info="configItems[index]" /> + </div> + <div class="outer-box"> + <el-form :inline="true" class="store-row"> <el-form-item label="存储周期:" label-width="90px"> - <el-input v-model="storeInfo.storePeriod" placeholder="请输入存储周期" type="number" min="0" style="width: 205px;"></el-input> - <el-select v-model="storeInfo.storePeriodUnit" style="width: 80px;"> - <el-option label="天" value="DAY"></el-option> - <el-option label="月" value="MONTH"></el-option> - <el-option label="年" value="YEAR"></el-option> - </el-select> + <el-input v-model="storeInfo.storePeriod" placeholder="请输入存储周期" type="number" min="0" + style="width: 205px;"></el-input> + <el-select v-model="storeInfo.storePeriodUnit" style="width: 80px;"> + <el-option label="天" value="DAY"></el-option> + <el-option label="月" value="MONTH"></el-option> + <el-option label="年" value="YEAR"></el-option> + </el-select> </el-form-item> - <el-form-item label-width="130px" > + <el-form-item label-width="130px"> <template #label> 预估压缩比: <client-only> <el-tooltip placement="top" effect="light" content="原始数据与压缩后数据的体积比值(压缩比 = 原始大小 / 压缩后大小)"> - <el-icon color=""><Icons.QuestionFilled /></el-icon> + <el-icon color=""> + <Icons.QuestionFilled /> + </el-icon> </el-tooltip> </client-only> </template> - <el-input v-model="storeInfo.compressionRatio" type="number" min="0" placeholder="请输入预估压缩比" style="width: 180px;"></el-input> + <el-input v-model="storeInfo.compressionRatio" type="number" min="0" placeholder="请输入预估压缩比" + style="width: 180px;"></el-input> </el-form-item> - </el-form> - </div> - <div class="button-row"> - <el-button class="calculate-button" color="#4c59c7" @click="calculateSpacePrecise()">计算结果</el-button> - </div> - <div class="result-row"> - <el-form :inline="true"> - <el-form-item label-width="200px"> - <template #label> - 每节点共需磁盘空间: - <client-only> - <el-tooltip placement="top" effect="light"> - <template #content> - <ul> - <li>双活为两节点单副本(每台机器按单副本规划资源)</li> - <li>三节点分布式集群推荐使用双副本(每台机器按双副本规划资源)</li> - </ul> - </template> - <el-icon><Icons.QuestionFilled /></el-icon> - </el-tooltip> - </client-only> - </template> - </el-form-item> - - <el-form-item label="单副本空间:" label-width="150px"> - <div class="result-text">{{ singleSpaceStorage }}</div> - </el-form-item> - <el-form-item label="双副本空间:" label-width="150px"> - <div class="result-text">{{ doubleSpaceStorage }}</div> - </el-form-item> - </el-form> + </el-form> + </div> + <div class="button-row"> + <el-button class="calculate-button" color="#4c59c7" @click="calculateSpacePrecise()">计算结果</el-button> + </div> + <div class="result-row"> + <el-form :inline="true"> + <el-form-item label-width="200px"> + <template #label> + 每节点共需磁盘空间: + <client-only> + <el-tooltip placement="top" effect="light"> + <template #content> + <ul> + <li>双活为两节点单副本(每台机器按单副本规划资源)</li> + <li>三节点分布式集群推荐使用双副本(每台机器按双副本规划资源)</li> + </ul> + </template> + <el-icon> + <Icons.QuestionFilled /> + </el-icon> + </el-tooltip> + </client-only> + </template> + </el-form-item> + + <el-form-item label="单副本空间:" label-width="150px"> + <div class="result-text">{{ singleSpaceStorage }}</div> + </el-form-item> + <el-form-item label="双副本空间:" label-width="150px"> + <div class="result-text">{{ doubleSpaceStorage }}</div> + </el-form-item> + </el-form> + </div> </div> - </div> + </ClientOnly> </template> -<style> -#main-content .theme-hope-content { - padding: 0; -} - -header .vp-hero-info { - visibility: hidden; +<style lang="scss"> +.calc-page { + display: flex; + justify-content: center; + margin-top: 50px; + margin-bottom: 50px; + + .vp-page-title, + .vp-page-meta, + .vp-breadcrumb { + display: none; + } } -#main-content .vp-hero-info-wrapper { - visibility: hidden; +.theme-hope-content { + width: 1230px; + max-width: 100% !important; + overflow: auto; } -.content-area { - width: 1230px; - margin-left: -35px; -} +.calc-content-area { + width: 1230px; -.title { + .title { text-align: center; font-size: 28px; font-weight: bold; margin-bottom: 40px; -} + } -.relative-box { + .relative-box { position: relative; -} + } -.add-button { + .add-button { background-color: transparent; border: none; position: absolute; right: 48px; top: 8px; -} + } -.remove-button { + .remove-button { background-color: transparent; border: none; position: absolute; right: 8px; top: 8px; -} + } -.store-row { + .store-row { display: flex; margin-top: 20px; margin-bottom: 20px; -} + } -.button-row { + .button-row { display: flex; justify-content: center; margin-top: 50px; margin-bottom: 30px; -} + } -.calculate-button { - padding: 20px 30px; -} + .calculate-button { + padding: 20px 30px; + } -.result-row { + .result-row { display: flex; justify-content: space-evenly; background-color: #f2f5fc; border-radius: 15px; padding: 30px; margin-bottom: 50px; -} + } -.result-text { + .result-text { color: #4c59c7; font-weight: bold; + } } </style> \ No newline at end of file diff --git a/src/.vuepress/theme.ts b/src/.vuepress/theme.ts index 103997d6..b7ae2c21 100644 --- a/src/.vuepress/theme.ts +++ b/src/.vuepress/theme.ts @@ -19,7 +19,6 @@ import { hopeTheme } from 'vuepress-theme-hope'; import { enNavbar, zhNavbar } from './navbar/index.js'; import { enSidebar, zhSidebar } from './sidebar/index.js'; -import { error } from 'vuepress/utils'; export default hopeTheme( { diff --git a/src/zh/ResourceEvaluator.md b/src/zh/ResourceEvaluator.md index e16bc100..027885c1 100644 --- a/src/zh/ResourceEvaluator.md +++ b/src/zh/ResourceEvaluator.md @@ -1,7 +1,8 @@ --- -home: true -heroText: '' +toc: false +containerClass: 'calc-page' --- + <!-- Licensed to the Apache Software Foundation (ASF) under one @@ -26,4 +27,4 @@ heroText: '' <script setup> import ResourceEvaluator from '@source/.vuepress/components/ResourceEvaluator.vue' -</script> \ No newline at end of file +</script>
