From 712ede9fae4605005d4045de34b26322ad2b2895 Mon Sep 17 00:00:00 2001
From: luckyasme <807254037@qq.com>
Date: Tue, 1 Jul 2025 14:32:08 +0800
Subject: [PATCH] =?UTF-8?q?sync:=20=E5=90=8C=E6=AD=A5website-v2=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 135 +
.npmrc | 2 +
.prettierrc.json | 8 +
Dockerfile | 160 +
LICENSE | 427 ++
app/.env.production | 21 +
app/.vitepress/config.ts | 123 +
app/.vitepress/public/check-dark-mode-v2.js | 19 +
app/.vitepress/public/error.html | 43 +
app/.vitepress/public/favicon.ico | Bin 0 -> 4286 bytes
app/.vitepress/src/@types/type-doc-menu.ts | 11 +
app/.vitepress/src/@types/type-feedback.ts | 8 +
app/.vitepress/src/@types/type-home.ts | 38 +
app/.vitepress/src/@types/type-locale.ts | 1 +
app/.vitepress/src/@types/type-search.ts | 29 +
app/.vitepress/src/@types/type-user.ts | 18 +
app/.vitepress/src/App.vue | 147 +
app/.vitepress/src/NotFound.vue | 47 +
app/.vitepress/src/api/api-analytics.ts | 7 +
app/.vitepress/src/api/api-common.ts | 15 +
app/.vitepress/src/api/api-feedback.ts | 61 +
app/.vitepress/src/api/api-message.ts | 13 +
app/.vitepress/src/api/api-search.ts | 60 +
app/.vitepress/src/api/api-user.ts | 18 +
.../src/assets/category/common/404-dark.png | Bin 0 -> 44371 bytes
.../src/assets/category/common/404.png | Bin 0 -> 34684 bytes
.../category/common/menu-switch-bar.png | Bin 0 -> 613 bytes
.../src/assets/category/docs/docsBugBg.png | Bin 0 -> 2050 bytes
.../assets/category/docs/icon-copy-dark.svg | 3 +
.../src/assets/category/docs/icon-copy.svg | 3 +
.../category/docs/icon-exit-full-screen.svg | 3 +
.../assets/category/docs/icon-full-screen.svg | 3 +
.../src/assets/category/docs/icon-gitee.svg | 4 +
.../src/assets/category/docs/icon-note.svg | 5 +
.../src/assets/category/docs/icon-tip.svg | 5 +
.../src/assets/category/docs/icon-warn.svg | 5 +
.../category/feedback/svg-icons/icon-faq.svg | 4 +
.../feedback/svg-icons/icon-headset.svg | 4 +
.../feedback/svg-icons/icon-score.svg | 3 +
.../assets/category/float/bug-bg-hover.png | Bin 0 -> 1724 bytes
.../src/assets/category/float/bug-bg.png | Bin 0 -> 1524 bytes
.../src/assets/category/footer/atom-logo.png | Bin 0 -> 19228 bytes
.../src/assets/category/footer/atom-logo.svg | 16 +
.../src/assets/category/footer/bilibili.png | Bin 0 -> 3180 bytes
.../assets/category/footer/bilibili_hover.png | Bin 0 -> 3188 bytes
.../src/assets/category/footer/code-xzs.png | Bin 0 -> 7541 bytes
.../src/assets/category/footer/code-zgz-2.png | Bin 0 -> 9054 bytes
.../src/assets/category/footer/code-zgz.jpg | Bin 0 -> 31036 bytes
.../src/assets/category/footer/code-zgz.png | Bin 0 -> 9054 bytes
.../src/assets/category/footer/csdn.png | Bin 0 -> 3970 bytes
.../src/assets/category/footer/csdn_hover.png | Bin 0 -> 3857 bytes
.../assets/category/footer/footer-bg-mo.png | Bin 0 -> 11363 bytes
.../src/assets/category/footer/footer-bg.png | Bin 0 -> 53511 bytes
.../src/assets/category/footer/footer-bg1.png | Bin 0 -> 23691 bytes
.../assets/category/footer/footer-logo1.png | Bin 0 -> 2458 bytes
.../assets/category/footer/footer-logo2.png | Bin 0 -> 2240 bytes
.../src/assets/category/footer/img-gzh.png | Bin 0 -> 6100 bytes
.../src/assets/category/footer/img-xzs.png | Bin 0 -> 5778 bytes
.../src/assets/category/footer/infoq.png | Bin 0 -> 792 bytes
.../src/assets/category/footer/juejin.png | Bin 0 -> 4953 bytes
.../assets/category/footer/juejin_hover.png | Bin 0 -> 5154 bytes
.../src/assets/category/footer/linkdin.png | Bin 0 -> 2311 bytes
.../assets/category/footer/linkdin_hover.png | Bin 0 -> 2215 bytes
.../src/assets/category/footer/oschina.png | Bin 0 -> 4949 bytes
.../assets/category/footer/oschina_hover.png | Bin 0 -> 4658 bytes
.../src/assets/category/footer/police.png | Bin 0 -> 2715 bytes
.../assets/category/footer/reddit-square.png | Bin 0 -> 2134 bytes
.../category/footer/reddit-square_hover.png | Bin 0 -> 1568 bytes
.../category/footer/svg-icons/icon-chat.svg | 4 +
.../footer/svg-icons/icon-quickissue_dark.svg | 5 +
.../svg-icons/icon-quickissue_light.svg | 6 +
.../category/footer/svg-icons/icon-smile.svg | 3 +
.../src/assets/category/footer/toutiao.png | Bin 0 -> 1889 bytes
.../assets/category/footer/toutiao_hover.png | Bin 0 -> 1388 bytes
.../src/assets/category/footer/x.png | Bin 0 -> 2723 bytes
.../src/assets/category/footer/x_hover.png | Bin 0 -> 1808 bytes
.../src/assets/category/footer/youtube.png | Bin 0 -> 1431 bytes
.../assets/category/footer/youtube_hover.png | Bin 0 -> 1167 bytes
.../category/header/annual-report-2024.jpg | Bin 0 -> 23600 bytes
.../src/assets/category/header/logo.svg | 28 +
.../src/assets/category/header/logo_dark.svg | 28 +
.../category/header/nav_background_left.png | Bin 0 -> 54048 bytes
.../category/header/nav_background_right.png | Bin 0 -> 70468 bytes
.../src/assets/category/header/odd.png | Bin 0 -> 140322 bytes
.../src/assets/category/header/report.png | Bin 0 -> 89103 bytes
.../src/assets/category/header/sig.png | Bin 0 -> 72336 bytes
.../src/assets/category/header/summit.png | Bin 0 -> 39432 bytes
.../src/assets/category/home/cloud-bg.png | Bin 0 -> 779 bytes
.../assets/category/home/dev-station-bg.svg | 8 +
.../category/home/edge-computing-bg.png | Bin 0 -> 1179 bytes
.../src/assets/category/home/embedded-bg.png | Bin 0 -> 1019 bytes
.../assets/category/home/home-banner-dark.png | Bin 0 -> 246842 bytes
.../src/assets/category/home/home-banner.png | Bin 0 -> 241253 bytes
.../category/home/install-guide-bg-dark.png | Bin 0 -> 21517 bytes
.../assets/category/home/install-guide-bg.png | Bin 0 -> 24591 bytes
.../category/home/install-guide-mo-bg.png | Bin 0 -> 8154 bytes
.../category/home/install-mo-bg-dark.png | Bin 0 -> 10572 bytes
.../src/assets/category/home/qa-bg-dark.png | Bin 0 -> 23070 bytes
.../src/assets/category/home/qa-bg.png | Bin 0 -> 20522 bytes
.../assets/category/home/qa-mo-bg-dark.png | Bin 0 -> 8919 bytes
.../src/assets/category/home/qa-mo-bg.png | Bin 0 -> 7005 bytes
.../src/assets/category/home/server-bg.png | Bin 0 -> 494 bytes
.../assets/category/home/started-bg-dark.png | Bin 0 -> 22245 bytes
.../src/assets/category/home/started-bg.png | Bin 0 -> 19663 bytes
.../category/home/started-mo-bg-dark.png | Bin 0 -> 9690 bytes
.../assets/category/home/started-mo-bg.png | Bin 0 -> 6574 bytes
.../assets/category/home/svg-icons/cloud.svg | 7 +
.../category/home/svg-icons/dev-station.svg | 8 +
.../home/svg-icons/edge-computing.svg | 5 +
.../category/home/svg-icons/embedded.svg | 5 +
.../assets/category/home/svg-icons/server.svg | 5 +
.../home/svg-icons/virtualization.svg | 5 +
.../category/home/virtualization-bg.png | Bin 0 -> 859 bytes
.../src/assets/category/home/x2-bg-dark.png | Bin 0 -> 21723 bytes
.../src/assets/category/home/x2-bg.png | Bin 0 -> 11492 bytes
.../assets/category/home/x2-mo-bg-dark.png | Bin 0 -> 9707 bytes
.../src/assets/category/home/x2-mo-bg.png | Bin 0 -> 7106 bytes
app/.vitepress/src/assets/style/base.scss | 89 +
.../src/assets/style/element-plus/index.scss | 7 +
.../src/assets/style/element-plus/input.scss | 15 +
.../assets/style/element-plus/pagination.scss | 47 +
.../src/assets/style/element-plus/popper.scss | 8 +
.../assets/style/element-plus/scrollbar.scss | 6 +
.../src/assets/style/element-plus/select.scss | 23 +
.../src/assets/style/element-plus/slider.scss | 65 +
.../src/assets/style/element-plus/table.scss | 119 +
.../src/assets/style/element-plus/var.scss | 19 +
app/.vitepress/src/assets/style/global.scss | 94 +
.../src/assets/style/highlight/index.scss | 8 +
app/.vitepress/src/assets/style/markdown.scss | 541 ++
.../src/assets/style/mixin/common.scss | 65 +
.../src/assets/style/mixin/font.scss | 270 +
.../src/assets/style/mixin/screen.scss | 73 +
.../src/assets/style/theme/anchor.scss | 11 +
.../src/assets/style/theme/breadcrumb.scss | 5 +
.../src/assets/style/theme/button.scss | 46 +
.../src/assets/style/theme/card.scss | 17 +
.../src/assets/style/theme/dark.token.css | 2194 +++++++
.../style/theme/default-light.token.css | 2194 +++++++
.../src/assets/style/theme/dialog.scss | 36 +
.../src/assets/style/theme/dropdown.scss | 3 +
.../src/assets/style/theme/index.scss | 17 +
.../src/assets/style/theme/input.scss | 3 +
.../src/assets/style/theme/link.scss | 19 +
.../src/assets/style/theme/message.scss | 8 +
.../src/assets/style/theme/popup.scss | 16 +
.../src/assets/style/theme/rate.scss | 4 +
.../src/assets/style/theme/result.scss | 3 +
.../src/assets/style/theme/select.scss | 4 +
.../src/assets/style/theme/tab.scss | 79 +
.../src/assets/style/theme/table.scss | 45 +
.../src/assets/style/theme/tag.scss | 6 +
.../src/assets/style/theme/textarea.scss | 15 +
.../src/assets/svg-icons/icon-arrow-right.svg | 3 +
.../assets/svg-icons/icon-chevron-down.svg | 3 +
.../assets/svg-icons/icon-chevron-right.svg | 3 +
.../src/assets/svg-icons/icon-close.svg | 3 +
.../src/assets/svg-icons/icon-copy.svg | 3 +
.../src/assets/svg-icons/icon-delete.svg | 3 +
.../svg-icons/icon-exit-full-screen.svg | 3 +
.../src/assets/svg-icons/icon-expand.svg | 3 +
.../src/assets/svg-icons/icon-full-screen.svg | 3 +
.../src/assets/svg-icons/icon-header-back.svg | 3 +
.../assets/svg-icons/icon-header-delete.svg | 3 +
.../src/assets/svg-icons/icon-header-menu.svg | 3 +
.../src/assets/svg-icons/icon-header-moon.svg | 3 +
.../src/assets/svg-icons/icon-header-next.svg | 3 +
.../assets/svg-icons/icon-header-person.svg | 3 +
.../assets/svg-icons/icon-header-search.svg | 4 +
.../src/assets/svg-icons/icon-link.svg | 4 +
.../src/assets/svg-icons/icon-out-link.svg | 3 +
.../src/assets/svg-icons/icon-outlink.svg | 12 +
.../src/assets/svg-icons/icon-pin.svg | 4 +
.../src/assets/svg-icons/icon-search.svg | 3 +
.../src/assets/svg-icons/icon-sun-outline.svg | 3 +
.../src/assets/svg-icons/icon-tips.svg | 3 +
.../src/assets/svg-icons/icon-top.svg | 4 +
app/.vitepress/src/components/AppFooter.vue | 507 ++
.../src/components/ContentWrapper.vue | 69 +
.../src/components/CookieNotice.vue | 384 ++
.../src/components/FloatingButton.vue | 203 +
.../src/components/FloatingButtonDocs.vue | 769 +++
.../src/components/GiteeViewSource.vue | 137 +
app/.vitepress/src/components/ImgZoomDrag.vue | 319 +
app/.vitepress/src/components/ResultEmpty.vue | 45 +
.../src/components/doc/DocBreadCrumb.vue | 67 +
app/.vitepress/src/components/doc/DocBug.vue | 62 +
.../src/components/doc/DocBugDialog.vue | 394 ++
.../src/components/doc/DocFooter.vue | 174 +
app/.vitepress/src/components/doc/DocMenu.vue | 330 +
.../src/components/doc/DocPagination.vue | 125 +
.../src/components/doc/DocSearch.vue | 267 +
app/.vitepress/src/components/doc/DocType.vue | 209 +
.../src/components/doc/DocTypeMobile.vue | 186 +
.../src/components/doc/DocVersion.vue | 151 +
.../src/components/doc/DocVersionMobile.vue | 148 +
.../components/feedback/FeedbackSlider.vue | 418 ++
.../feedback/FloatingButtonHome.vue | 248 +
.../src/components/header/AppHeader.vue | 167 +
.../src/components/header/HeaderCode.vue | 108 +
.../src/components/header/HeaderLanguage.vue | 202 +
.../src/components/header/HeaderLogin.vue | 137 +
.../src/components/header/HeaderNav.vue | 1134 ++++
.../src/components/header/HeaderNavMoblie.vue | 384 ++
.../src/components/header/HeaderSearch.vue | 574 ++
.../src/components/header/HeaderTheme.vue | 109 +
.../src/components/header/NavContent.vue | 290 +
.../src/components/header/NavLink.vue | 69 +
.../src/components/hooks/useClickOutside.ts | 18 +
.../src/components/markdown/MarkdownImage.vue | 159 +
.../src/components/markdown/MarkdownTitle.vue | 182 +
.../src/components/menu/RecursionMenu.vue | 56 +
.../src/components/menu/RecursionMenuItem.vue | 182 +
.../src/composables/useClipboard.ts | 28 +
.../src/composables/useDebounceSearch.ts | 7 +
app/.vitepress/src/composables/useLocale.ts | 95 +
app/.vitepress/src/composables/useScreen.ts | 150 +
app/.vitepress/src/composables/useSelect.ts | 78 +
app/.vitepress/src/config/data.ts | 1 +
app/.vitepress/src/config/dsl.ts | 10 +
app/.vitepress/src/config/footer.ts | 482 ++
app/.vitepress/src/config/toc.ts | 7 +
app/.vitepress/src/config/version.ts | 234 +
app/.vitepress/src/directives/highlight.ts | 15 +
app/.vitepress/src/directives/index.ts | 8 +
app/.vitepress/src/i18n/common/common-en.ts | 5 +
app/.vitepress/src/i18n/common/common-zh.ts | 5 +
app/.vitepress/src/i18n/common/index.ts | 7 +
app/.vitepress/src/i18n/cookie/cookie-en.ts | 18 +
app/.vitepress/src/i18n/cookie/cookie-zh.ts | 18 +
app/.vitepress/src/i18n/cookie/index.ts | 7 +
app/.vitepress/src/i18n/docs/docs-en.ts | 21 +
app/.vitepress/src/i18n/docs/docs-zh.ts | 21 +
app/.vitepress/src/i18n/docs/index.ts | 7 +
.../src/i18n/feedback/feedback-en.ts | 46 +
.../src/i18n/feedback/feedback-zh.ts | 46 +
app/.vitepress/src/i18n/feedback/index.ts | 7 +
app/.vitepress/src/i18n/footer/footer-en.ts | 12 +
app/.vitepress/src/i18n/footer/footer-zh.ts | 12 +
app/.vitepress/src/i18n/footer/index.ts | 7 +
app/.vitepress/src/i18n/header/header-en.ts | 475 ++
app/.vitepress/src/i18n/header/header-zh.ts | 637 ++
app/.vitepress/src/i18n/header/index.ts | 7 +
app/.vitepress/src/i18n/home/home-en.ts | 8 +
app/.vitepress/src/i18n/home/home-zh.ts | 8 +
app/.vitepress/src/i18n/home/index.ts | 7 +
app/.vitepress/src/i18n/index.ts | 53 +
app/.vitepress/src/i18n/response/index.ts | 7 +
.../src/i18n/response/response-en.ts | 16 +
.../src/i18n/response/response-zh.ts | 16 +
app/.vitepress/src/layouts/LayoutDoc.vue | 691 +++
app/.vitepress/src/shared/analytics/cookie.ts | 32 +
.../src/shared/analytics/directives.ts | 183 +
.../src/shared/analytics/history.ts | 35 +
app/.vitepress/src/shared/analytics/index.ts | 4 +
app/.vitepress/src/shared/analytics/setup.ts | 104 +
.../src/shared/axios/handleError.ts | 22 +
.../src/shared/axios/handleResponse.ts | 5 +
app/.vitepress/src/shared/axios/index.ts | 226 +
app/.vitepress/src/shared/axios/setConfig.ts | 20 +
app/.vitepress/src/shared/cookie.ts | 30 +
app/.vitepress/src/shared/login.ts | 79 +
app/.vitepress/src/stores/common.ts | 91 +
app/.vitepress/src/stores/download.ts | 19 +
app/.vitepress/src/stores/node.ts | 74 +
app/.vitepress/src/stores/user.ts | 66 +
app/.vitepress/src/stores/view.ts | 39 +
app/.vitepress/src/utils/common.ts | 151 +
app/.vitepress/src/utils/cookie.ts | 30 +
app/.vitepress/src/utils/element.ts | 32 +
app/.vitepress/src/utils/locale.ts | 24 +
app/.vitepress/src/utils/scroll-to.ts | 105 +
app/.vitepress/src/utils/tree.ts | 126 +
.../src/views/docs/TheDocsArticle.vue | 151 +
app/.vitepress/src/views/docs/TheDocsNode.vue | 271 +
app/.vitepress/src/views/home/TheHome.vue | 403 ++
.../views/home/components/HomeBannerCard.vue | 96 +
.../views/home/components/HomeSectionCard.vue | 106 +
.../src/views/search/TheSearchResult.vue | 345 ++
app/.vitepress/theme/index.ts | 42 +
app/en/index.md | 9 +
app/vite.config.ts | 49 +
app/zh/index.md | 9 +
deploy/entrypoint.sh | 10 +
deploy/monitor.sh | 33 +
deploy/nginx/nginx.conf | 135 +
deploy/nginx/nginx.portal.conf | 538 ++
env.d.ts | 1 +
eslint.config.js | 32 +
package.json | 73 +
pnpm-lock.yaml | 5429 +++++++++++++++++
scripts/config/new-version.js | 1 +
scripts/gen-toc.js | 436 ++
scripts/merge-upstream.js | 71 +
scripts/merge.js | 363 ++
scripts/pre-dev.js | 197 +
scripts/utils/common.js | 7 +
scripts/utils/file.js | 19 +
scripts/utils/git.js | 47 +
tests/common.test.ts | 88 +
tests/tree.test.ts | 57 +
tsconfig.app.json | 18 +
tsconfig.json | 11 +
tsconfig.node.json | 12 +
304 files changed, 30663 insertions(+)
create mode 100644 .gitignore
create mode 100644 .npmrc
create mode 100644 .prettierrc.json
create mode 100644 Dockerfile
create mode 100644 LICENSE
create mode 100644 app/.env.production
create mode 100644 app/.vitepress/config.ts
create mode 100644 app/.vitepress/public/check-dark-mode-v2.js
create mode 100644 app/.vitepress/public/error.html
create mode 100644 app/.vitepress/public/favicon.ico
create mode 100644 app/.vitepress/src/@types/type-doc-menu.ts
create mode 100644 app/.vitepress/src/@types/type-feedback.ts
create mode 100644 app/.vitepress/src/@types/type-home.ts
create mode 100644 app/.vitepress/src/@types/type-locale.ts
create mode 100644 app/.vitepress/src/@types/type-search.ts
create mode 100644 app/.vitepress/src/@types/type-user.ts
create mode 100644 app/.vitepress/src/App.vue
create mode 100644 app/.vitepress/src/NotFound.vue
create mode 100644 app/.vitepress/src/api/api-analytics.ts
create mode 100644 app/.vitepress/src/api/api-common.ts
create mode 100644 app/.vitepress/src/api/api-feedback.ts
create mode 100644 app/.vitepress/src/api/api-message.ts
create mode 100644 app/.vitepress/src/api/api-search.ts
create mode 100644 app/.vitepress/src/api/api-user.ts
create mode 100644 app/.vitepress/src/assets/category/common/404-dark.png
create mode 100644 app/.vitepress/src/assets/category/common/404.png
create mode 100644 app/.vitepress/src/assets/category/common/menu-switch-bar.png
create mode 100644 app/.vitepress/src/assets/category/docs/docsBugBg.png
create mode 100644 app/.vitepress/src/assets/category/docs/icon-copy-dark.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-copy.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-exit-full-screen.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-full-screen.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-gitee.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-note.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-tip.svg
create mode 100644 app/.vitepress/src/assets/category/docs/icon-warn.svg
create mode 100644 app/.vitepress/src/assets/category/feedback/svg-icons/icon-faq.svg
create mode 100644 app/.vitepress/src/assets/category/feedback/svg-icons/icon-headset.svg
create mode 100644 app/.vitepress/src/assets/category/feedback/svg-icons/icon-score.svg
create mode 100644 app/.vitepress/src/assets/category/float/bug-bg-hover.png
create mode 100644 app/.vitepress/src/assets/category/float/bug-bg.png
create mode 100644 app/.vitepress/src/assets/category/footer/atom-logo.png
create mode 100644 app/.vitepress/src/assets/category/footer/atom-logo.svg
create mode 100644 app/.vitepress/src/assets/category/footer/bilibili.png
create mode 100644 app/.vitepress/src/assets/category/footer/bilibili_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/code-xzs.png
create mode 100644 app/.vitepress/src/assets/category/footer/code-zgz-2.png
create mode 100644 app/.vitepress/src/assets/category/footer/code-zgz.jpg
create mode 100644 app/.vitepress/src/assets/category/footer/code-zgz.png
create mode 100644 app/.vitepress/src/assets/category/footer/csdn.png
create mode 100644 app/.vitepress/src/assets/category/footer/csdn_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/footer-bg-mo.png
create mode 100644 app/.vitepress/src/assets/category/footer/footer-bg.png
create mode 100644 app/.vitepress/src/assets/category/footer/footer-bg1.png
create mode 100644 app/.vitepress/src/assets/category/footer/footer-logo1.png
create mode 100644 app/.vitepress/src/assets/category/footer/footer-logo2.png
create mode 100644 app/.vitepress/src/assets/category/footer/img-gzh.png
create mode 100644 app/.vitepress/src/assets/category/footer/img-xzs.png
create mode 100644 app/.vitepress/src/assets/category/footer/infoq.png
create mode 100644 app/.vitepress/src/assets/category/footer/juejin.png
create mode 100644 app/.vitepress/src/assets/category/footer/juejin_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/linkdin.png
create mode 100644 app/.vitepress/src/assets/category/footer/linkdin_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/oschina.png
create mode 100644 app/.vitepress/src/assets/category/footer/oschina_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/police.png
create mode 100644 app/.vitepress/src/assets/category/footer/reddit-square.png
create mode 100644 app/.vitepress/src/assets/category/footer/reddit-square_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/svg-icons/icon-chat.svg
create mode 100644 app/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_dark.svg
create mode 100644 app/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_light.svg
create mode 100644 app/.vitepress/src/assets/category/footer/svg-icons/icon-smile.svg
create mode 100644 app/.vitepress/src/assets/category/footer/toutiao.png
create mode 100644 app/.vitepress/src/assets/category/footer/toutiao_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/x.png
create mode 100644 app/.vitepress/src/assets/category/footer/x_hover.png
create mode 100644 app/.vitepress/src/assets/category/footer/youtube.png
create mode 100644 app/.vitepress/src/assets/category/footer/youtube_hover.png
create mode 100644 app/.vitepress/src/assets/category/header/annual-report-2024.jpg
create mode 100644 app/.vitepress/src/assets/category/header/logo.svg
create mode 100644 app/.vitepress/src/assets/category/header/logo_dark.svg
create mode 100644 app/.vitepress/src/assets/category/header/nav_background_left.png
create mode 100644 app/.vitepress/src/assets/category/header/nav_background_right.png
create mode 100644 app/.vitepress/src/assets/category/header/odd.png
create mode 100644 app/.vitepress/src/assets/category/header/report.png
create mode 100644 app/.vitepress/src/assets/category/header/sig.png
create mode 100644 app/.vitepress/src/assets/category/header/summit.png
create mode 100644 app/.vitepress/src/assets/category/home/cloud-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/dev-station-bg.svg
create mode 100644 app/.vitepress/src/assets/category/home/edge-computing-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/embedded-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/home-banner-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/home-banner.png
create mode 100644 app/.vitepress/src/assets/category/home/install-guide-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/install-guide-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/install-guide-mo-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/install-mo-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/qa-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/qa-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/qa-mo-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/qa-mo-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/server-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/started-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/started-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/started-mo-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/started-mo-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/cloud.svg
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/dev-station.svg
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/edge-computing.svg
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/embedded.svg
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/server.svg
create mode 100644 app/.vitepress/src/assets/category/home/svg-icons/virtualization.svg
create mode 100644 app/.vitepress/src/assets/category/home/virtualization-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/x2-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/x2-bg.png
create mode 100644 app/.vitepress/src/assets/category/home/x2-mo-bg-dark.png
create mode 100644 app/.vitepress/src/assets/category/home/x2-mo-bg.png
create mode 100644 app/.vitepress/src/assets/style/base.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/index.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/input.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/pagination.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/popper.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/scrollbar.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/select.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/slider.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/table.scss
create mode 100644 app/.vitepress/src/assets/style/element-plus/var.scss
create mode 100644 app/.vitepress/src/assets/style/global.scss
create mode 100644 app/.vitepress/src/assets/style/highlight/index.scss
create mode 100644 app/.vitepress/src/assets/style/markdown.scss
create mode 100644 app/.vitepress/src/assets/style/mixin/common.scss
create mode 100644 app/.vitepress/src/assets/style/mixin/font.scss
create mode 100644 app/.vitepress/src/assets/style/mixin/screen.scss
create mode 100644 app/.vitepress/src/assets/style/theme/anchor.scss
create mode 100644 app/.vitepress/src/assets/style/theme/breadcrumb.scss
create mode 100644 app/.vitepress/src/assets/style/theme/button.scss
create mode 100644 app/.vitepress/src/assets/style/theme/card.scss
create mode 100644 app/.vitepress/src/assets/style/theme/dark.token.css
create mode 100644 app/.vitepress/src/assets/style/theme/default-light.token.css
create mode 100644 app/.vitepress/src/assets/style/theme/dialog.scss
create mode 100644 app/.vitepress/src/assets/style/theme/dropdown.scss
create mode 100644 app/.vitepress/src/assets/style/theme/index.scss
create mode 100644 app/.vitepress/src/assets/style/theme/input.scss
create mode 100644 app/.vitepress/src/assets/style/theme/link.scss
create mode 100644 app/.vitepress/src/assets/style/theme/message.scss
create mode 100644 app/.vitepress/src/assets/style/theme/popup.scss
create mode 100644 app/.vitepress/src/assets/style/theme/rate.scss
create mode 100644 app/.vitepress/src/assets/style/theme/result.scss
create mode 100644 app/.vitepress/src/assets/style/theme/select.scss
create mode 100644 app/.vitepress/src/assets/style/theme/tab.scss
create mode 100644 app/.vitepress/src/assets/style/theme/table.scss
create mode 100644 app/.vitepress/src/assets/style/theme/tag.scss
create mode 100644 app/.vitepress/src/assets/style/theme/textarea.scss
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-arrow-right.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-chevron-down.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-chevron-right.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-close.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-copy.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-delete.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-exit-full-screen.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-expand.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-full-screen.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-back.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-delete.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-menu.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-moon.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-next.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-person.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-header-search.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-link.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-out-link.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-outlink.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-pin.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-search.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-sun-outline.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-tips.svg
create mode 100644 app/.vitepress/src/assets/svg-icons/icon-top.svg
create mode 100644 app/.vitepress/src/components/AppFooter.vue
create mode 100644 app/.vitepress/src/components/ContentWrapper.vue
create mode 100644 app/.vitepress/src/components/CookieNotice.vue
create mode 100644 app/.vitepress/src/components/FloatingButton.vue
create mode 100644 app/.vitepress/src/components/FloatingButtonDocs.vue
create mode 100644 app/.vitepress/src/components/GiteeViewSource.vue
create mode 100644 app/.vitepress/src/components/ImgZoomDrag.vue
create mode 100644 app/.vitepress/src/components/ResultEmpty.vue
create mode 100644 app/.vitepress/src/components/doc/DocBreadCrumb.vue
create mode 100644 app/.vitepress/src/components/doc/DocBug.vue
create mode 100644 app/.vitepress/src/components/doc/DocBugDialog.vue
create mode 100644 app/.vitepress/src/components/doc/DocFooter.vue
create mode 100644 app/.vitepress/src/components/doc/DocMenu.vue
create mode 100644 app/.vitepress/src/components/doc/DocPagination.vue
create mode 100644 app/.vitepress/src/components/doc/DocSearch.vue
create mode 100644 app/.vitepress/src/components/doc/DocType.vue
create mode 100644 app/.vitepress/src/components/doc/DocTypeMobile.vue
create mode 100644 app/.vitepress/src/components/doc/DocVersion.vue
create mode 100644 app/.vitepress/src/components/doc/DocVersionMobile.vue
create mode 100644 app/.vitepress/src/components/feedback/FeedbackSlider.vue
create mode 100644 app/.vitepress/src/components/feedback/FloatingButtonHome.vue
create mode 100644 app/.vitepress/src/components/header/AppHeader.vue
create mode 100644 app/.vitepress/src/components/header/HeaderCode.vue
create mode 100644 app/.vitepress/src/components/header/HeaderLanguage.vue
create mode 100644 app/.vitepress/src/components/header/HeaderLogin.vue
create mode 100644 app/.vitepress/src/components/header/HeaderNav.vue
create mode 100644 app/.vitepress/src/components/header/HeaderNavMoblie.vue
create mode 100644 app/.vitepress/src/components/header/HeaderSearch.vue
create mode 100644 app/.vitepress/src/components/header/HeaderTheme.vue
create mode 100644 app/.vitepress/src/components/header/NavContent.vue
create mode 100644 app/.vitepress/src/components/header/NavLink.vue
create mode 100644 app/.vitepress/src/components/hooks/useClickOutside.ts
create mode 100644 app/.vitepress/src/components/markdown/MarkdownImage.vue
create mode 100644 app/.vitepress/src/components/markdown/MarkdownTitle.vue
create mode 100644 app/.vitepress/src/components/menu/RecursionMenu.vue
create mode 100644 app/.vitepress/src/components/menu/RecursionMenuItem.vue
create mode 100644 app/.vitepress/src/composables/useClipboard.ts
create mode 100644 app/.vitepress/src/composables/useDebounceSearch.ts
create mode 100644 app/.vitepress/src/composables/useLocale.ts
create mode 100644 app/.vitepress/src/composables/useScreen.ts
create mode 100644 app/.vitepress/src/composables/useSelect.ts
create mode 100644 app/.vitepress/src/config/data.ts
create mode 100644 app/.vitepress/src/config/dsl.ts
create mode 100644 app/.vitepress/src/config/footer.ts
create mode 100644 app/.vitepress/src/config/toc.ts
create mode 100644 app/.vitepress/src/config/version.ts
create mode 100644 app/.vitepress/src/directives/highlight.ts
create mode 100644 app/.vitepress/src/directives/index.ts
create mode 100644 app/.vitepress/src/i18n/common/common-en.ts
create mode 100644 app/.vitepress/src/i18n/common/common-zh.ts
create mode 100644 app/.vitepress/src/i18n/common/index.ts
create mode 100644 app/.vitepress/src/i18n/cookie/cookie-en.ts
create mode 100644 app/.vitepress/src/i18n/cookie/cookie-zh.ts
create mode 100644 app/.vitepress/src/i18n/cookie/index.ts
create mode 100644 app/.vitepress/src/i18n/docs/docs-en.ts
create mode 100644 app/.vitepress/src/i18n/docs/docs-zh.ts
create mode 100644 app/.vitepress/src/i18n/docs/index.ts
create mode 100644 app/.vitepress/src/i18n/feedback/feedback-en.ts
create mode 100644 app/.vitepress/src/i18n/feedback/feedback-zh.ts
create mode 100644 app/.vitepress/src/i18n/feedback/index.ts
create mode 100644 app/.vitepress/src/i18n/footer/footer-en.ts
create mode 100644 app/.vitepress/src/i18n/footer/footer-zh.ts
create mode 100644 app/.vitepress/src/i18n/footer/index.ts
create mode 100644 app/.vitepress/src/i18n/header/header-en.ts
create mode 100644 app/.vitepress/src/i18n/header/header-zh.ts
create mode 100644 app/.vitepress/src/i18n/header/index.ts
create mode 100644 app/.vitepress/src/i18n/home/home-en.ts
create mode 100644 app/.vitepress/src/i18n/home/home-zh.ts
create mode 100644 app/.vitepress/src/i18n/home/index.ts
create mode 100644 app/.vitepress/src/i18n/index.ts
create mode 100644 app/.vitepress/src/i18n/response/index.ts
create mode 100644 app/.vitepress/src/i18n/response/response-en.ts
create mode 100644 app/.vitepress/src/i18n/response/response-zh.ts
create mode 100644 app/.vitepress/src/layouts/LayoutDoc.vue
create mode 100644 app/.vitepress/src/shared/analytics/cookie.ts
create mode 100644 app/.vitepress/src/shared/analytics/directives.ts
create mode 100644 app/.vitepress/src/shared/analytics/history.ts
create mode 100644 app/.vitepress/src/shared/analytics/index.ts
create mode 100644 app/.vitepress/src/shared/analytics/setup.ts
create mode 100644 app/.vitepress/src/shared/axios/handleError.ts
create mode 100644 app/.vitepress/src/shared/axios/handleResponse.ts
create mode 100644 app/.vitepress/src/shared/axios/index.ts
create mode 100644 app/.vitepress/src/shared/axios/setConfig.ts
create mode 100644 app/.vitepress/src/shared/cookie.ts
create mode 100644 app/.vitepress/src/shared/login.ts
create mode 100644 app/.vitepress/src/stores/common.ts
create mode 100644 app/.vitepress/src/stores/download.ts
create mode 100644 app/.vitepress/src/stores/node.ts
create mode 100644 app/.vitepress/src/stores/user.ts
create mode 100644 app/.vitepress/src/stores/view.ts
create mode 100644 app/.vitepress/src/utils/common.ts
create mode 100644 app/.vitepress/src/utils/cookie.ts
create mode 100644 app/.vitepress/src/utils/element.ts
create mode 100644 app/.vitepress/src/utils/locale.ts
create mode 100644 app/.vitepress/src/utils/scroll-to.ts
create mode 100644 app/.vitepress/src/utils/tree.ts
create mode 100644 app/.vitepress/src/views/docs/TheDocsArticle.vue
create mode 100644 app/.vitepress/src/views/docs/TheDocsNode.vue
create mode 100644 app/.vitepress/src/views/home/TheHome.vue
create mode 100644 app/.vitepress/src/views/home/components/HomeBannerCard.vue
create mode 100644 app/.vitepress/src/views/home/components/HomeSectionCard.vue
create mode 100644 app/.vitepress/src/views/search/TheSearchResult.vue
create mode 100644 app/.vitepress/theme/index.ts
create mode 100644 app/en/index.md
create mode 100644 app/vite.config.ts
create mode 100644 app/zh/index.md
create mode 100644 deploy/entrypoint.sh
create mode 100644 deploy/monitor.sh
create mode 100644 deploy/nginx/nginx.conf
create mode 100644 deploy/nginx/nginx.portal.conf
create mode 100644 env.d.ts
create mode 100644 eslint.config.js
create mode 100644 package.json
create mode 100644 pnpm-lock.yaml
create mode 100644 scripts/config/new-version.js
create mode 100644 scripts/gen-toc.js
create mode 100644 scripts/merge-upstream.js
create mode 100644 scripts/merge.js
create mode 100644 scripts/pre-dev.js
create mode 100644 scripts/utils/common.js
create mode 100644 scripts/utils/file.js
create mode 100644 scripts/utils/git.js
create mode 100644 tests/common.test.ts
create mode 100644 tests/tree.test.ts
create mode 100644 tsconfig.app.json
create mode 100644 tsconfig.json
create mode 100644 tsconfig.node.json
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e59aab7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,135 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+# mac
+.DS_Store
+
+temp-docs
+.cache
+
+app/zh/docs/**/*
+app/en/docs/**/*
+
+app/.vitepress/.temp
+app/.vitepress/.cache
+app/.vitepress/dist
+app/.vitepress/cache
+app/.vitepress/public/menu/**/*
+app/.vitepress/public/toc/**/*
+app/.vitepress/public/dsl/**/*
+
+.env.development
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..8f46dd2
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,2 @@
+registry=https://registry.npmmirror.com/
+
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..66d4c0d
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": true,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "printWidth": 160,
+ "trailingComma": "es5"
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..8c01d1c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,160 @@
+FROM swr.cn-north-4.myhuaweicloud.com/opensourceway/node:latest as Builder
+
+RUN mkdir -p /home/openeuler/docs
+WORKDIR /home/openeuler/docs
+COPY . /home/openeuler/docs
+
+RUN npm install pnpm -g
+RUN pnpm install
+RUN pnpm build
+
+FROM swr.cn-north-4.myhuaweicloud.com/opensourceway/openeuler/nginx:latest as NginxBuilder
+
+FROM swr.cn-north-4.myhuaweicloud.com/opensourceway/openeuler/base:latest
+
+ENV NGINX_CONFIG_FILE /etc/nginx/nginx.conf
+ENV NGINX_CONFIG_PATH /etc/nginx/
+ENV NGINX_PID /var/run/nginx.pid
+ENV NGINX_USER nginx
+ENV NGINX_GROUP nginx
+ENV NGINX_BIN /usr/share/nginx/sbin/
+ENV NGINX_HOME /usr/share/nginx/
+ENV NGINX_EXE_FILE /usr/share/nginx/sbin/nginx
+ENV DST_PATH /etc/nginx/cert
+
+COPY --from=NginxBuilder /usr/share/nginx /usr/share/nginx
+COPY --from=NginxBuilder /usr/share/nginx/sbin/nginx /usr/share/nginx/sbin/nginx
+COPY --from=NginxBuilder /etc/nginx/modules /etc/nginx/modules
+COPY --from=NginxBuilder /etc/nginx/geoip /etc/nginx/geoip
+COPY --from=NginxBuilder /etc/nginx/mime.types /etc/nginx/mime.types
+COPY --from=Builder /home/openeuler/docs/app/.vitepress/dist /usr/share/nginx/www/
+COPY ./deploy/monitor.sh ./deploy/entrypoint.sh /etc/nginx/
+COPY ./deploy/nginx/nginx.conf /etc/nginx/nginx.conf.template
+
+RUN sed -i "s|repo.openeuler.org|mirrors.nju.edu.cn/openeuler|g" /etc/yum.repos.d/openEuler.repo \
+ && sed -i '/metalink/d' /etc/yum.repos.d/openEuler.repo \
+ && sed -i '/metadata_expire/d' /etc/yum.repos.d/openEuler.repo \
+ && yum update -y \
+ && yum install -y findutils passwd shadow pcre-devel net-tools libmaxminddb libmaxminddb-devel \
+ && find /usr/share/nginx/www -type d -print0| xargs -0 chmod 500 \
+ && find /usr/share/nginx/www -type f -print0| xargs -0 chmod 400 \
+ && touch /var/run/nginx.pid \
+ && groupadd -g 1000 nginx \
+ && useradd -u 1000 -g nginx -s /sbin/nologin nginx \
+ && sed -i '/^PATH="\$HOME\/\.local\/bin:\$HOME\/bin:\$PATH"/d; /^export PATH/d' /home/nginx/.bashrc \
+ && chmod 750 /usr \
+ && chmod 550 /usr/share \
+ && chown -R nginx:nginx /usr/share/nginx \
+ && find /usr/share/nginx -type d -print0 | xargs -0 chmod 500 \
+ && chmod 500 /usr/share/nginx/sbin/nginx \
+ && mkdir -p /var/log/nginx \
+ && mkdir -p /etc/nginx/cert \
+ && chown -R nginx:nginx /etc/nginx/cert \
+ && chmod -R 700 /etc/nginx/cert \
+ && chown -R nginx:nginx /var/log/nginx \
+ && chmod -R 640 /var/log/nginx \
+ && touch /var/log/nginx/error.log \
+ && touch /var/log/nginx/access.log \
+ && chmod 640 /var/log/nginx/error.log \
+ && chmod 640 /var/log/nginx/access.log \
+ && chmod 640 /var/log/dnf.librepo.log \
+ && chmod 640 /var/log/dnf.log \
+ && chmod 640 /var/log/dnf.rpm.log \
+ && chmod 640 /var/log/hawkey.log \
+ && chmod 640 /var/log/*.log \
+ && chmod 440 /etc/nginx/nginx*.conf* \
+ && chown -R nginx:nginx /var/log/nginx/* \
+ && mkdir -p /var/lib/nginx/tmp/client_body \
+ && chown -R nginx:nginx /var/lib/nginx/tmp/client_body \
+ && mkdir -p /var/lib/nginx/tmp/fastcgi \
+ && chown -R nginx:nginx /var/lib/nginx/tmp/fastcgi \
+ && mkdir -p /var/lib/nginx/tmp/proxy \
+ && chown -R nginx:nginx /var/lib/nginx/tmp/proxy \
+ && mkdir -p /var/lib/nginx/tmp/scgi \
+ && chown -R nginx:nginx /var/lib/nginx/tmp/scgi \
+ && mkdir -p /var/lib/nginx/tmp/uwsgi \
+ && chown -R nginx:nginx /var/lib/nginx/tmp/uwsgi \
+ && chmod -R 500 /var/lib/nginx/ \
+ && chmod -R 750 /var/lib/nginx/tmp/proxy \
+ && chown -R nginx:nginx /var/lib/nginx/ \
+ && chown -R nginx:nginx /var/run/nginx.pid \
+ && chmod 640 /var/run/nginx.pid \
+ && chown -R nginx:nginx /etc/nginx \
+ && chmod 550 /etc/nginx \
+ && chmod 550 /etc/nginx/geoip/ \
+ && chmod 440 /etc/nginx/geoip/* \
+ && chmod 550 /etc/nginx/modules \
+ && chmod 440 /etc/nginx/modules/* \
+ && touch /etc/nginx/nginx.conf \
+ && chown nginx:nginx /etc/nginx/nginx.conf \
+ && chmod 640 /etc/nginx/nginx.conf \
+ && chmod 640 /etc/nginx/nginx.conf.template \
+ && chmod 440 /etc/nginx/mime.types \
+ && chmod 700 /var/lib/nginx/tmp/client_body \
+ && lsd() { \
+ local v="$1"; \
+ ls -ld "$v"; \
+ while :; do \
+ v="${v%/*}"; \
+ [[ "$v" && ! -f "$v" ]] || break; \
+ chown root:root "$v"; \
+ done; \
+ }; lsd "$NGINX_HOME" \
+ && lsd() { \
+ local v="$1"; \
+ ls -ld $v; \
+ while :; do \
+ v="${v%/*}"; \
+ [[ "$v" && ! -f "$v" ]] || break; \
+ chmod 550 "$v"; \
+ done; \
+ }; lsd $NGINX_HOME \
+ && lsd() { \
+ local v="$1"; \
+ ls -ld $v; \
+ while :; do \
+ v="${v%/*}"; \
+ [[ "$v" && ! -f "$v" ]] || break; \
+ chown $NGINX_USER:$NGINX_GROUP "$v"; \
+ done; \
+ }; lsd $NGINX_HOME \
+ && rm -rf /usr/share/nginx/html/ \
+ && rm -rf /usr/share/nginx/logs/ \
+ && echo "umask 0027" >> /etc/bashrc \
+ && echo "set +o history" >> /etc/bashrc \
+ && sed -i "s|HISTSIZE=1000|HISTSIZE=0|" /etc/profile \
+ && sed -i "s/PASS_MAX_DAYS.*/PASS_MAX_DAYS 30/" /etc/login.defs \
+ && echo "ALWAYS_SET_PATH yes" >> /etc/login.defs \
+ && chage --maxdays 30 nginx \
+ && passwd -l $NGINX_USER \
+ && yum clean all \
+ && usermod -s /sbin/nologin sync \
+ && usermod -s /sbin/nologin shutdown \
+ && usermod -s /sbin/nologin halt \
+ && echo "export TMOUT=1800 readonly TMOUT" >> /etc/profile \
+ && rm -rf /usr/bin/gdb* \
+ && rm -rf /usr/share/gdb \
+ && rm -rf /usr/share/gcc* \
+ && rm -rf /usr/lib64/python3.11/bdb.py \
+ && rm -rf /usr/lib64/python3.11/pdb.py \
+ && rm -rf /usr/lib64/python3.11/timeit.py \
+ && rm -rf /usr/lib64/python3.11/trace.py \
+ && rm -rf /usr/lib64/python3.11/tracemalloc.py \
+ && rm -rf /usr/share/licenses/glibc \
+ && rm -rf /usr/share/locale/ar \
+ && rm -rf /usr/share/locale/cpp \
+ && yum remove gdb-gdbserver findutils passwd shadow -y
+
+
+RUN chmod 500 /etc/nginx/monitor.sh \
+ && chmod 500 /etc/nginx/entrypoint.sh \
+ && chown nginx:nginx /etc/nginx/monitor.sh \
+ && chown nginx:nginx /etc/nginx/entrypoint.sh \
+ && sed -i "/PATH=/d" /home/nginx/.bashrc \
+ && source /home/nginx/.bashrc
+
+EXPOSE 8080
+
+USER nginx
+
+ENTRYPOINT ["/etc/nginx/entrypoint.sh"]
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..2310559
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,427 @@
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. Additional offer from the Licensor -- Adapted Material.
+ Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material
+ under the conditions of the Adapter's License You apply.
+
+ c. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter's License You apply must be a Creative Commons
+ license with the same License Elements, this version or
+ later, or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition
+ in any reasonable manner based on the medium, means, and
+ context in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+
+ including for purposes of Section 3(b); and
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the "Licensor." The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/app/.env.production b/app/.env.production
new file mode 100644
index 0000000..469e7bc
--- /dev/null
+++ b/app/.env.production
@@ -0,0 +1,21 @@
+VITE_LOGIN_URL = https://id.openeuler.org
+VITE_XSRF_COOKIE_NAME = '_U_T_'
+VITE_XSRF_HEADER_NAME = 'Token'
+VITE_COOKIE_DOMAIN = .openeuler.org
+VITE_MAIN_DOMAIN_URL = https://www.openeuler.org
+
+VITE_SERVICE_DOCS_URL = https://docs.openeuler.org
+VITE_SERVICE_REPO_URL = https://repo.openeuler.openatom.cn
+VITE_SERVICE_DATASTAT_URL = https://datastat.openeuler.org
+VITE_SERVICE_QUICKISSUE_URL = https://quickissue.openeuler.org
+VITE_SERVICE_SOFTWARE_PKG_URL = https://software-pkg.openeuler.org
+VITE_SERVICE_ARTLFS_WEBSITE_URL = https://artlfs-website.openeuler.org
+VITE_SERVICE_SOFTWARE_URL = https://easysoftware.openeuler.org
+VITE_SERVICE_MESSAGE_CENTER_URL = https://message-center.openeuler.org
+VITE_SERVICE_OEAS_URL = https://oeas.openeuler.org
+VITE_SERVICE_MEETING_MINUTES_URL = https://meeting-minutes.openeuler.org
+VITE_SERVICE_CERTIFICATION_URL = https://certification.openeuler.org
+
+VITE_SERVICE_FORUM_URL = https://forum.openeuler.org
+VITE_SERVICE_PKGMANAGE_URL = https://pkgmanage.openeuler.org
+VITE_SERVICE_COMPLIANCE_URL = https://compliance.openeuler.org
diff --git a/app/.vitepress/config.ts b/app/.vitepress/config.ts
new file mode 100644
index 0000000..c594d06
--- /dev/null
+++ b/app/.vitepress/config.ts
@@ -0,0 +1,123 @@
+import type Markdown from 'markdown-it';
+
+export default {
+ base: '/',
+ assetsDir: '/assets',
+ cleanUrls: false,
+ ignoreDeadLinks: true,
+ title: '文档 | openEuler社区',
+ srcExclude: ['**/_menu.md'],
+ head: [
+ [
+ 'link',
+ {
+ rel: 'icon',
+ href: '/favicon.ico?v=2',
+ },
+ ],
+ [
+ 'meta',
+ {
+ name: 'viewport',
+ content: 'width=device-width,initial-scale=1,user-scalable=no',
+ },
+ ],
+ [
+ 'script',
+ {
+ src: '/check-dark-mode-v2.js',
+ },
+ ],
+ ],
+ appearance: false, // enable dynamic scripts for dark mode
+ titleTemplate: true,
+ locales: {
+ root: {
+ lang: 'zh',
+ title: '文档 | openEuler社区',
+ description: 'openEuler文档',
+ },
+ zh: {
+ label: '简体中文',
+ lang: 'zh',
+ title: '文档 | openEuler社区',
+ description: 'openEuler文档',
+ },
+ en: {
+ label: 'English',
+ lang: 'en',
+ title: 'Docs | openEuler',
+ description: 'openEuler docs',
+ },
+ },
+ markdown: {
+ math: true,
+ plantuml: true,
+ theme: {
+ light: 'light-plus',
+ dark: 'dark-plus',
+ },
+ config: (md: Markdown) => {
+ md.renderer.rules.code_inline = (tokens, idx) => {
+ const content = tokens[idx].content;
+ // 转义
+ const escapedContent = md.utils.escapeHtml(content);
+ // 处理双花括号
+ return `${escapedContent}`;
+ };
+
+ // 替换 {{ }} 内容
+ md.renderer.rules.text = (tokens, idx) => {
+ const content = tokens[idx].content;
+ const escapedContent = md.utils.escapeHtml(content);
+ if (/{{(.*?)}}/g.test(content)) {
+ return `${escapedContent}`;
+ }
+ return escapedContent;
+ };
+
+ // 标题处理
+ md.renderer.rules.heading_open = function (tokens, idx, options, _, self) {
+ const aIndex = tokens[idx].attrIndex('id');
+ const id = tokens[idx].attrs?.[aIndex]?.[1];
+ const tag = tokens[idx].tag;
+ const render = self.renderToken(tokens, idx, options);
+ return `${render}${tag === 'h1' || tag === 'h2' ? `${renderContent.replace(/(width|height)=['|"](.*?)['|"]/g, '')}`;
+ }
+
+ return renderContent;
+ };
+
+ const defaultHtmlInlineRender = md.renderer.rules.html_inline;
+ md.renderer.rules.html_inline = function (tokens, idx, options, env, self) {
+ const content = tokens[idx].content;
+ const renderContent = defaultHtmlInlineRender!!(tokens, idx, options, env, self);
+ if (content.includes('
${renderContent.replace(/(width|height)=['|"](.*?)['|"]/g, '')}`;
+ }
+
+ return renderContent;
+ };
+ },
+ },
+};
diff --git a/app/.vitepress/public/check-dark-mode-v2.js b/app/.vitepress/public/check-dark-mode-v2.js
new file mode 100644
index 0000000..81dad74
--- /dev/null
+++ b/app/.vitepress/public/check-dark-mode-v2.js
@@ -0,0 +1,19 @@
+function getCookie(key) {
+ const name = `${encodeURIComponent(key)}=`;
+ const decodedCookies = decodeURIComponent(document.cookie);
+ const cookies = decodedCookies.split('; ');
+ for (let cookie of cookies) {
+ if (cookie.startsWith(name)) {
+ return cookie.substring(name.length);
+ }
+ }
+
+ return null;
+}
+
+const e = getCookie('openEuler-theme-appearance') || 'auto';
+const a = window.matchMedia('(prefers-color-scheme: dark)').matches;
+if (!e || e === 'auto' ? a : e === 'dark') {
+ document.documentElement.classList.add('dark');
+ document.documentElement.setAttribute('data-o-theme', 'dark');
+}
diff --git a/app/.vitepress/public/error.html b/app/.vitepress/public/error.html
new file mode 100644
index 0000000..7dacb97
--- /dev/null
+++ b/app/.vitepress/public/error.html
@@ -0,0 +1,43 @@
+
+
+
Error
+{{ t('common.empty') }}
+ +