You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by ov...@apache.org on 2020/06/17 11:17:08 UTC
[incubator-echarts-handbook] 04/11: feat: dynamic nav
This is an automated email from the ASF dual-hosted git repository.
ovilia pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-echarts-handbook.git
commit 7875afb6f6c47adb47522100f568c02be39ad303
Author: Ovilia <zw...@gmail.com>
AuthorDate: Wed Apr 8 13:59:25 2020 +0800
feat: dynamic nav
---
README.md | 25 ++++---
components/partials/Sidebar.vue | 113 ++++++++++++++----------------
configs/config.js | 3 +
contents/zh/chart-types/bar.md | 3 -
contents/zh/chart-types/bar/simple-bar.md | 1 +
contents/zh/chart-types/line.md | 4 ++
contents/zh/posts.js | 24 ++++---
layouts/default.vue | 19 +++--
nuxt.config.js | 13 ++--
package-lock.json | 41 +++++++++--
package.json | 5 +-
pages/zh/_post.vue | 6 +-
static/images/demo.png | Bin 0 -> 25960 bytes
store/index.js | 11 ++-
14 files changed, 157 insertions(+), 111 deletions(-)
diff --git a/README.md b/README.md
index fb7e13b..717982f 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,23 @@
# echarts-handbook
-## Build Setup
+## Init
```bash
-# install dependencies
-$ npm install
+npm install
+```
+
+## Dev
-# serve with hot reload at localhost:3000
-$ npm run dev
+```bash
+npm run dev
+```
-# build for production and launch server
-$ npm run build
-$ npm run start
+## Release
-# generate static project
-$ npm run generate
+```bash
+npm run generate
```
-For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).
+## Writing
+
+Add `.md` files under `contents/zh/` or `contents/en/`, and fill in the info in `contents/zh/posts.js` and `contents/en/posts.js`.
diff --git a/components/partials/Sidebar.vue b/components/partials/Sidebar.vue
index 00a1510..61d0162 100644
--- a/components/partials/Sidebar.vue
+++ b/components/partials/Sidebar.vue
@@ -1,44 +1,18 @@
<template>
<div class="bd-sidebar border-bottom-0 col-md-3 col-xl-2 col-12">
- active: {{ active }}. {{ posts }}
+ <!-- active: {{ active }}. {{ posts }} -->
<div class="bd-docs-nav">
- <div class="bd-toc-item">
- <a href="#" class="bd-toc-link">开始</a>
- <ul class="nav bd-sidenav">
- <li class="nav-item">
- <a href="#" class="nav-link">第一个 ECharts 图表</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">定制主题样式</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">基本概念</a>
- </li>
- </ul>
- </div>
- <div class="bd-toc-item">
- <a href="#" class="bd-toc-link nuxt-link-exact-active">图表类型</a>
- <ul class="nav bd-sidenav">
- <li class="nav-item">
- <a href="#" class="nav-link">折线图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">柱状图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">饼图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">散点图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">涟漪散点图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">雷达图</a>
- </li>
- <li class="nav-item">
- <a href="#" class="nav-link">树图</a>
+ <div class="bd-toc-item level0" v-for="level0Post in $store.state.posts.zh">
+ <a class="bd-toc-link">{{ level0Post.title }}</a>
+ <ul class="nav bd-sidenav level1" v-if="level0Post.children">
+ <li class="nav-item" v-for="level1Post in level0Post.children">
+ <a :href="level1Post.children ? 'javascript:;' : rootPath + level0Post.dir + '_' + level1Post.dir"
+ class="nav-link">{{ level1Post.title }}</a>
+ <ul class="nav bd-sidenav level2" v-if="level1Post.children">
+ <li class="nav-item" v-for="level2Post in level1Post.children">
+ <a :href="rootPath + level0Post.dir + '_' + level1Post.dir + '_' + level2Post.dir" class="nav-link">{{ level2Post.title }}</a>
+ </li>
+ </ul>
</li>
</ul>
</div>
@@ -49,11 +23,13 @@
<script lang="ts">
import Vue from 'vue';
-export default {
- props: ['active', 'posts'],
- async asyncData() {
+export default Vue.extend({
+ computed: {
+ rootPath(): string {
+ return this.$store.state.config.rootPath + '/' + this.$store.state.locale + '/';
+ }
}
-};
+});
</script>
@@ -62,29 +38,42 @@ export default {
padding: 20px;
}
-.bd-toc-item {
- margin-bottom: 20px;
-}
+ .bd-toc-item {
+ margin-bottom: 20px;
+ }
-.bd-sidenav {
- margin-top: 10px;
- display: none;
-}
+ .bd-sidenav {
+ margin-top: 5px;
+ display: none;
+ }
-.nav {
- display: block;
-}
+ .bd-sidenav.level2 {
+ margin: 0 0 0 15px;
+ }
-.bd-toc-link {
- font-weight: bold;
- color: #444;
-}
+ .bd-toc-link {
+ font-weight: bold;
+ color: #444;
+ }
-.nav-link {
- color: #555;
-}
+ .nav {
+ display: block;
+ }
- .nav-link:hover {
- text-decoration: underline;
- }
+ .nav-link {
+ padding: 5px;
+ color: #666;
+ }
+
+ .level1 .nav-link {
+ padding: 5px 0;
+ }
+
+ .level2 .nav-link {
+ color: #444;
+ }
+
+ .nav-link:hover {
+ text-decoration: underline;
+ }
</style>
diff --git a/configs/config.js b/configs/config.js
new file mode 100644
index 0000000..1300256
--- /dev/null
+++ b/configs/config.js
@@ -0,0 +1,3 @@
+export default {
+ rootPath: '/echarts-handbook/dist'
+};
diff --git a/contents/zh/chart-types/bar.md b/contents/zh/chart-types/bar.md
deleted file mode 100644
index 6a7c644..0000000
--- a/contents/zh/chart-types/bar.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# bar
-
-this is bar.
diff --git a/contents/zh/chart-types/bar/simple-bar.md b/contents/zh/chart-types/bar/simple-bar.md
new file mode 100644
index 0000000..0c004b3
--- /dev/null
+++ b/contents/zh/chart-types/bar/simple-bar.md
@@ -0,0 +1 @@
+# 最简单的柱状图
diff --git a/contents/zh/chart-types/line.md b/contents/zh/chart-types/line.md
index 9ba27d0..1424711 100644
--- a/contents/zh/chart-types/line.md
+++ b/contents/zh/chart-types/line.md
@@ -18,3 +18,7 @@ option = {
}]
};
```
+
+引用图片的方法:(这个图片实际存放地址在 `static/images/demo.png`)
+
+![图片说明](${rootPath}/images/demo.png)
diff --git a/contents/zh/posts.js b/contents/zh/posts.js
index 6ed4426..db6e8ca 100644
--- a/contents/zh/posts.js
+++ b/contents/zh/posts.js
@@ -1,10 +1,16 @@
-export default [
+export default [{
+ title: '图表类型',
+ dir: 'chart-types',
+ children: [{
+ title: '折线图',
+ dir: 'line'
+ },
{
- title: '图表类型',
- dir: 'chart-types',
- children: [
- 'line',
- 'bar'
- ]
- }
-];
+ title: '柱状图',
+ dir: 'bar',
+ children: [{
+ title: '最简单的柱状图',
+ dir: 'simple-bar'
+ }]
+ }]
+}];
diff --git a/layouts/default.vue b/layouts/default.vue
index 2df84c7..c76ccbd 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -4,8 +4,7 @@
<div class="container-fluid">
<div class="row flex-xl-nowrap2">
- {{aaaa}}
- <!-- <sidebar :posts="posts" active="bar" /> -->
+ <sidebar />
<div class="bd-content col-md-9 col-xl-8 col-12 pb-md-3 pl-md-5">
<div class="post-content content">
@@ -22,16 +21,22 @@ import Vue from 'vue';
import Navigator from '~/components/partials/Navigator.vue';
import Sidebar from '~/components/partials/Sidebar.vue';
-export default {
+export default Vue.extend({
components: {
Navigator,
Sidebar
},
- asyncData: ({ req }) => ({
- aaaa: (req ? req.headers['user-agent'] : (typeof navigator !== 'undefined' ? navigator.userAgent : 'No user agent (generated)'))
- })
-}
+ computed: {
+ // posts(): string {
+ // return this.$store.state.posts.zh;
+ // }
+ },
+
+ methods: {
+
+ }
+});
</script>
<style>
diff --git a/nuxt.config.js b/nuxt.config.js
index c22928b..d43bffc 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -1,11 +1,12 @@
import enPosts from './contents/en/posts';
import zhPosts from './contents/zh/posts';
+import config from './configs/config';
export default {
mode: 'universal',
router: {
- base: '/echarts-booklet/dist'
+ base: config.rootPath
},
/*
@@ -103,15 +104,15 @@ function generateRoutes(postTree, dir, routes) {
}
postTree.forEach(info => {
- if (!info) {
+ if (!info || typeof info !== 'object') {
return;
}
- else if (typeof info === 'string') {
- routes.push(dir + info);
- }
- else if (typeof info === 'object' && info.children) {
+ if (info.children) {
generateRoutes(info.children, dir + info.dir + '_', routes);
}
+ else {
+ routes.push(dir + info.dir);
+ }
});
return routes;
}
diff --git a/package-lock.json b/package-lock.json
index 16169e4..a2b4c2d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "echarts-booklet",
+ "name": "echarts-handbook",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
@@ -1481,6 +1481,15 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
+ "file-loader": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
+ "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
+ "requires": {
+ "loader-utils": "^1.2.3",
+ "schema-utils": "^2.5.0"
+ }
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -5346,12 +5355,26 @@
}
},
"file-loader": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
- "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz",
+ "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==",
+ "dev": true,
"requires": {
- "loader-utils": "^1.2.3",
- "schema-utils": "^2.5.0"
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^2.6.5"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ }
}
},
"file-uri-to-path": {
@@ -7404,6 +7427,12 @@
"object-visit": "^1.0.0"
}
},
+ "markdown-image-loader": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-image-loader/-/markdown-image-loader-2.0.0.tgz",
+ "integrity": "sha512-osIW6Iww9CXPMuHTIwy30ZO/eSqDrOT80KADupmB+EUDc8xuQMo65Ob/h5SyFts6r2+cl1krzGN5vTED7uhmwQ==",
+ "dev": true
+ },
"markdown-it": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
diff --git a/package.json b/package.json
index e49696b..0537008 100644
--- a/package.json
+++ b/package.json
@@ -24,9 +24,12 @@
"babel-eslint": "^10.0.1",
"eslint": "^6.1.0",
"eslint-plugin-nuxt": ">=0.4.2",
+ "file-loader": "^6.0.0",
"front-matter": "^3.1.0",
"frontmatter-markdown-loader": "^3.3.0",
+ "markdown-image-loader": "^2.0.0",
"markdown-it": "^10.0.0",
- "raw-loader": "^4.0.0"
+ "raw-loader": "^4.0.0",
+ "webpack": "^4.42.1"
}
}
diff --git a/pages/zh/_post.vue b/pages/zh/_post.vue
index 61dab77..807c0f4 100644
--- a/pages/zh/_post.vue
+++ b/pages/zh/_post.vue
@@ -6,6 +6,7 @@
import fm from 'front-matter';
import MarkdownIt from 'markdown-it';
import Vue from 'vue';
+import config from '../../configs/config';
const md = new MarkdownIt();
@@ -13,12 +14,9 @@ export default Vue.extend({
components: {
},
async asyncData({params}) {
- // const posts = await import('~/contents/zh/posts.js');
- // console.log('===================', posts)
-
params.post = params.post.split('_').join('/');
const fileContent = await import(`~/contents/zh/${params.post}.md`);
- const res = fm(fileContent.default);
+ const res = fm(fileContent.default.split('${rootPath}').join(config.rootPath));
return {
attributes: res.attributes,
content: md.render(res.body)
diff --git a/static/images/demo.png b/static/images/demo.png
new file mode 100644
index 0000000..478f548
Binary files /dev/null and b/static/images/demo.png differ
diff --git a/store/index.js b/store/index.js
index fd0dcb1..c487d4e 100644
--- a/store/index.js
+++ b/store/index.js
@@ -1,14 +1,21 @@
+import zhPosts from '~/contents/zh/posts.js';
+import config from '~/configs/config';
+
export const state = () => ({
filled: false,
docVersion: '',
ghVersion: '',
visibleAffix: false,
- locale: 'en',
+ locale: 'zh',
lang: {},
menu: {},
homepage: {},
adBlocked: false,
- focusMode: false
+ focusMode: false,
+ posts: {
+ zh: zhPosts
+ },
+ config: config
})
export const mutations = {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org