├── static
└── .gitkeep
├── .eslintignore
├── test
└── unit
│ ├── setup.js
│ ├── .eslintrc
│ ├── specs
│ └── HelloWorld.spec.js
│ └── jest.conf.js
├── config
├── prod.env.js
├── test.env.js
├── dev.env.js
└── index.js
├── src
├── assets
│ ├── logo.png
│ ├── favicon.ico
│ ├── LoginLogo.png
│ ├── HomePageLogo.png
│ ├── img
│ │ ├── face_logo.png
│ │ ├── heading.jpg
│ │ └── emoji_sprite.png
│ ├── welcome
│ │ ├── books.png
│ │ ├── folder.png
│ │ ├── mindmap.png
│ │ └── recommand.png
│ ├── RoadmapDefault.png
│ ├── login
│ │ ├── input_user.png
│ │ └── input_password.png
│ └── css
│ │ └── emoji.css
├── apis
│ ├── FeedBackApis.js
│ ├── User.js
│ ├── UserProfileApis.js
│ ├── MindTableEditorApis.js
│ ├── EssayEditorApis.js
│ ├── RoadmapEditorApis.js
│ └── util.js
├── views
│ ├── RoadmapTableView.vue
│ ├── EssayTableView.vue
│ ├── WelcomeCardView.vue
│ ├── ArticleTableView.vue
│ ├── UserLoginView.vue
│ ├── MarkDownEditorView.vue
│ ├── UserRegisterView.vue
│ ├── RoadmapLayout.vue
│ ├── EssayEditor.vue
│ ├── EssayReaderView.vue
│ ├── EssayRoadmapBindReader.vue
│ └── RoadmapReaderView.vue
├── components
│ ├── comment
│ │ ├── children
│ │ │ ├── Emoji.vue
│ │ │ └── EmojiPanel.vue
│ │ └── Comment.vue
│ ├── EssayTableExpand.vue
│ ├── roadmap
│ │ ├── utils
│ │ │ ├── nodeToHTML.js
│ │ │ ├── subnodesToHTML.js
│ │ │ ├── dimensions.js
│ │ │ └── d3.js
│ │ ├── parser
│ │ │ ├── regex.js
│ │ │ └── emojis.js
│ │ ├── style.sass
│ │ └── Roadmap.vue
│ ├── Breadcrumb.js
│ ├── ArticleStatisExpand.vue
│ ├── EditRoadmapDescriptionForm.vue
│ ├── ModifyColor.vue
│ ├── AddCommentForm.vue
│ ├── LoadRoadmapForm.vue
│ ├── DelNodeForm.vue
│ ├── ModifyCommentForm.vue
│ ├── Request.vue
│ ├── FileItem.vue
│ ├── AddNodeForm.vue
│ ├── NoteMarkdown.vue
│ ├── ModifyNodeForm.vue
│ ├── DelConnectionForm.vue
│ ├── AddConnectionForm.vue
│ ├── Likes.vue
│ ├── MindTableExpand.vue
│ ├── ModifyAliasForm.vue
│ ├── UserReportButton.vue
│ ├── DelCommentForm.vue
│ ├── HelloWorld.vue
│ ├── PaperRecommend.vue
│ ├── RoadItemEditor.vue
│ ├── ErrPush.js
│ ├── RoadmapTable.vue
│ ├── TableItemEditor.vue
│ ├── EssayTable.vue
│ ├── ArticleStatistics.vue
│ └── RoadmapWindow.vue
├── App.vue
├── main.js
├── vuex
│ └── index.js
└── router
│ └── index.js
├── .editorconfig
├── .postcssrc.js
├── .gitignore
├── .babelrc
├── index.html
├── README.md
├── .eslintrc.js
└── package.json
/static/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 | /test/unit/coverage/
6 |
--------------------------------------------------------------------------------
/test/unit/setup.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | Vue.config.productionTip = false;
4 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/logo.png
--------------------------------------------------------------------------------
/src/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/favicon.ico
--------------------------------------------------------------------------------
/test/unit/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "jest": true
4 | },
5 | "globals": {
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/assets/LoginLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/LoginLogo.png
--------------------------------------------------------------------------------
/src/assets/HomePageLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/HomePageLogo.png
--------------------------------------------------------------------------------
/src/assets/img/face_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/img/face_logo.png
--------------------------------------------------------------------------------
/src/assets/img/heading.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/img/heading.jpg
--------------------------------------------------------------------------------
/src/assets/welcome/books.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/welcome/books.png
--------------------------------------------------------------------------------
/src/assets/RoadmapDefault.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/RoadmapDefault.png
--------------------------------------------------------------------------------
/src/assets/welcome/folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/welcome/folder.png
--------------------------------------------------------------------------------
/src/assets/welcome/mindmap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/welcome/mindmap.png
--------------------------------------------------------------------------------
/src/assets/img/emoji_sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/img/emoji_sprite.png
--------------------------------------------------------------------------------
/src/assets/login/input_user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/login/input_user.png
--------------------------------------------------------------------------------
/src/assets/welcome/recommand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/welcome/recommand.png
--------------------------------------------------------------------------------
/src/assets/login/input_password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinJieDev/Roadmap-Frontend/HEAD/src/assets/login/input_password.png
--------------------------------------------------------------------------------
/config/test.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const devEnv = require('./dev.env')
4 |
5 | module.exports = merge(devEnv, {
6 | NODE_ENV: '"testing"'
7 | })
8 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/src/apis/FeedBackApis.js:
--------------------------------------------------------------------------------
1 | import { req } from '../apis/util';
2 |
3 | // eslint-disable-next-line import/prefer-default-export
4 | export const createFeedBack = (email, rating, feedback) => req('/api/feedback/', 'POST', {},
5 | { text: JSON.stringify({ email, rating, feedback }) });
6 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | package-lock.json
4 | /dist/
5 | npm-debug.log*
6 | yarn-debug.log*
7 | yarn-error.log*
8 | /test/unit/coverage/
9 |
10 | # sass cache
11 | *.sassc
12 |
13 | # Editor directories and files
14 | .idea
15 | .vscode
16 | *.suo
17 | *.ntvs*
18 | *.njsproj
19 | *.sln
20 |
--------------------------------------------------------------------------------
/src/apis/User.js:
--------------------------------------------------------------------------------
1 | import store from '../vuex/index';
2 |
3 | // eslint-disable-next-line import/prefer-default-export
4 | export const logout = () => {
5 | store.commit('pushAuthToken', '');
6 | };
7 |
8 | export const isLogin = () => !(store.state.authToken === ''
9 | || store.state.authToken === undefined
10 | || store.state.authToken === null);
11 |
--------------------------------------------------------------------------------
/src/views/RoadmapTableView.vue:
--------------------------------------------------------------------------------
1 |
2 |
]*>([^>]*)<\/p>/g;
10 | let match = matchText.exec(html);
11 |
12 | while (match) {
13 | res.push(match[1] || match[2]);
14 | match = matchText.exec(html);
15 | }
16 |
17 | return res.join(' ');
18 | };
19 |
20 | /*
21 | * Extract HREF content from the first link on a node.
22 | */
23 | const getURL = (html) => {
24 | // Match HREF content inside A tags.
25 | const matchURL = /]*href="([^"]*)"[^>]*>[^<]*<\/a>/;
26 | const match = matchURL.exec(html);
27 |
28 | if (match) {
29 | return match[1];
30 | }
31 |
32 | return '';
33 | };
34 |
35 | module.exports = {
36 | getText,
37 | getURL,
38 | };
39 |
--------------------------------------------------------------------------------
/src/components/ArticleStatisExpand.vue:
--------------------------------------------------------------------------------
1 |
2 | Description 注释内容 Roadmap Id Node Name 注释内容 这是一条调试信息 Node Name Url Color Node Name Url Node1 Name Node2 Name Source Node Target Node 修改文献别名(将同步到文献管理中) 是否在改节点使用文献别名 Node Comment Content {{ item.title_zh }} {{ item.authors.join(', ') }} {{ item.summary }} {{authExport.content}}
74 | {{description}}
9 | 新建路书
10 |
11 |
19 | 文献管理
20 |
21 |
29 | 路书管理
30 |
31 |
39 | 文献推荐
40 |
41 | 您的联系方式(E-Mail)
16 |
17 |
18 |
19 | 您对我们网站打多少分?
20 |
22 |
23 | 您对我们网站的建议?
24 |
25 |
5 |
12 |
13 | {{ msg }}
4 | Essential Links
5 |
6 |
48 |
39 | Ecosystem
49 |
50 |
83 |
`
40 | );
41 |
42 | export const customEmojiTemplate = (emoji, category) => (
43 | `
`
44 | );
45 |
46 | /*
47 | * Return the category represented by the given emoji.
48 | */
49 | export const emojiToCategory = emoji => conversionTable[emoji] || '';
50 |
51 | /*
52 | * Convert all emojis to an IMG tag.
53 | * The bitwise magic is explained at http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript
54 | */
55 | export const emojiToIMG = html => (
56 | /* eslint-disable no-bitwise */
57 | html.replace(matchEmojis, (match) => {
58 | switch (match) {
59 | case '🤖':
60 | return '';
61 |
62 | case '🗂':
63 | return '
';
64 |
65 | case '🐙':
66 | return customEmojiTemplate('octocat', 'github');
67 |
68 | case '🔎':
69 | return '
';
70 |
71 | // Regular unicode Emojis.
72 | default: {
73 | // Keep the first 10 bits.
74 | const lead = match.charCodeAt(0) & 0x3FF;
75 | const trail = match.charCodeAt(1) & 0x3FF;
76 |
77 | // 0x[lead][trail]
78 | const unicode = ((lead << 10) + trail).toString(16);
79 |
80 | return emojiTemplate(`1${unicode}`, emojiToCategory(match));
81 | }
82 | }
83 | })
84 | /* eslint-enable no-bitwise */
85 | );
86 |
87 | /*
88 | * Inverse of emojiToCategory, but instead of returning an emoji
89 | * returns an IMG tag corresponding to that emoji.
90 | */
91 | export const categoryToIMG = category => emojiToIMG(revConversionTable[category] || '');
92 |
93 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "roadmap-frontend",
3 | "version": "1.0.0",
4 | "description": "A Vue.js project",
5 | "author": "MinJieDev",
6 | "private": true,
7 | "scripts": {
8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
9 | "start": "npm run dev",
10 | "unit": "jest --config test/unit/jest.conf.js --coverage",
11 | "test": "npm run unit",
12 | "lint": "eslint --ext .js,.vue src test/unit",
13 | "build": "node build/build.js"
14 | },
15 | "dependencies": {
16 | "axios": "^0.19.2",
17 | "bibtex-parse-js": "^0.0.24",
18 | "d3": "^5.16.0",
19 | "dom-to-image": "^2.6.0",
20 | "github-markdown-css": "^4.0.0",
21 | "global": "^4.4.0",
22 | "json-loader": "^0.5.7",
23 | "less-loader": "4.1.0",
24 | "lodash": "^4.17.15",
25 | "prism": "^4.1.2",
26 | "schart.js": "^3.0.0",
27 | "simplemde": "^1.11.2",
28 | "view-design": "^4.2.0",
29 | "vue": "^2.5.2",
30 | "vue-clipboard2": "^0.3.1",
31 | "vue-cookies": "^1.7.0",
32 | "vue-markdown": "^2.2.4",
33 | "vue-mindmap": "^0.0.4",
34 | "vue-router": "^3.0.1",
35 | "vue-schart": "^2.0.0",
36 | "vuedraggable": "^2.23.2",
37 | "vuex": "^3.1.3"
38 | },
39 | "devDependencies": {
40 | "autoprefixer": "^7.1.2",
41 | "babel-core": "^6.22.1",
42 | "babel-eslint": "^8.2.1",
43 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
44 | "babel-jest": "^21.0.2",
45 | "babel-loader": "^7.1.1",
46 | "babel-plugin-dynamic-import-node": "^1.2.0",
47 | "babel-plugin-syntax-jsx": "^6.18.0",
48 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
49 | "babel-plugin-transform-runtime": "^6.22.0",
50 | "babel-plugin-transform-vue-jsx": "^3.5.0",
51 | "babel-preset-env": "^1.3.2",
52 | "babel-preset-stage-2": "^6.22.0",
53 | "chalk": "^2.0.1",
54 | "copy-webpack-plugin": "^4.0.1",
55 | "css-loader": "^0.28.0",
56 | "eslint": "^4.15.0",
57 | "eslint-config-airbnb-base": "^11.3.0",
58 | "eslint-friendly-formatter": "^3.0.0",
59 | "eslint-import-resolver-webpack": "^0.8.3",
60 | "eslint-loader": "^1.7.1",
61 | "eslint-plugin-import": "^2.7.0",
62 | "eslint-plugin-vue": "^4.0.0",
63 | "extract-text-webpack-plugin": "^3.0.0",
64 | "file-loader": "^1.1.4",
65 | "friendly-errors-webpack-plugin": "^1.6.1",
66 | "html-webpack-plugin": "^2.30.1",
67 | "jest": "^22.0.4",
68 | "jest-serializer-vue": "^0.3.0",
69 | "node-notifier": "^5.1.2",
70 | "optimize-css-assets-webpack-plugin": "^3.2.0",
71 | "ora": "^1.2.0",
72 | "portfinder": "^1.0.13",
73 | "postcss-import": "^11.0.0",
74 | "postcss-loader": "^2.0.8",
75 | "postcss-url": "^7.2.1",
76 | "rimraf": "^2.6.0",
77 | "semver": "^5.3.0",
78 | "shelljs": "^0.7.6",
79 | "uglifyjs-webpack-plugin": "^1.1.1",
80 | "url-loader": "^0.5.8",
81 | "vue-jest": "^1.0.2",
82 | "vue-loader": "^13.3.0",
83 | "vue-style-loader": "^4.1.2",
84 | "vue-template-compiler": "^2.5.2",
85 | "webpack": "^3.6.0",
86 | "webpack-bundle-analyzer": "^2.9.0",
87 | "webpack-dev-server": "^2.9.1",
88 | "webpack-merge": "^4.1.0"
89 | },
90 | "engines": {
91 | "node": ">= 6.0.0",
92 | "npm": ">= 3.0.0"
93 | },
94 | "browserslist": [
95 | "> 1%",
96 | "last 2 versions",
97 | "not ie <= 8"
98 | ]
99 | }
100 |
--------------------------------------------------------------------------------
/src/components/PaperRecommend.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | {{ item.title }}
26 |
7 | {{ item.user.username }}
8 |
16 |
5 |
10 |
13 |
16 |
19 |
31 |
32 |
35 |
36 | 路书已绑定:{{ bindRoadmapName }}
20 | 选择引用的路书
23 |
13 |
14 |
15 | 题名
16 |
17 |
30 | 显示名
31 |
32 |
45 | 作者
46 |
47 |
59 | 年份
60 |
61 |
71 | 阅读状态
72 |
73 |
91 | 链接(URL)
92 |
93 |
107 | 期刊/会议
108 |
109 |
122 | 卷号
123 |
124 |
135 | 页面
136 |
137 |
147 |
148 | 引用文献
149 |
150 |
20 |
21 |
44 |
4 | 文献总数
5 |
8 |
9 |
10 |
11 | 阅读进度
12 |
14 |
15 |
27 |
28 | 作者统计
29 |
31 |
51 |
65 |
66 |