You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2019/11/03 16:10:51 UTC

[incubator-apisix-dashboard] branch feature-remove-useless-files created (now 0bda9b3)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a change to branch feature-remove-useless-files
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git.


      at 0bda9b3  remove i18n

This branch includes the following new commits:

     new 06873f3  remove useless codes
     new 0bda9b3  remove i18n

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-apisix-dashboard] 01/02: remove useless codes

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch feature-remove-useless-files
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git

commit 06873f374b043a2f2a7b3e04f3b7d022ac600dda
Author: juzhiyuan <jj...@gmail.com>
AuthorDate: Sun Nov 3 21:37:09 2019 +0800

    remove useless codes
---
 README.md                                          |   4 -
 package.json                                       |   1 -
 public/img/icons/android-chrome-192x192.png        | Bin 2484 -> 0 bytes
 public/img/icons/android-chrome-512x512.png        | Bin 7168 -> 0 bytes
 public/img/icons/apple-touch-icon-120x120.png      | Bin 1536 -> 0 bytes
 public/img/icons/apple-touch-icon-152x152.png      | Bin 1921 -> 0 bytes
 public/img/icons/apple-touch-icon-180x180.png      | Bin 2020 -> 0 bytes
 public/img/icons/apple-touch-icon-60x60.png        | Bin 803 -> 0 bytes
 public/img/icons/apple-touch-icon-76x76.png        | Bin 964 -> 0 bytes
 public/img/icons/apple-touch-icon.png              | Bin 2020 -> 0 bytes
 public/img/icons/msapplication-icon-144x144.png    | Bin 1947 -> 0 bytes
 public/img/icons/mstile-150x150.png                | Bin 1786 -> 0 bytes
 public/img/icons/safari-pinned-tab.svg             | 112 -----
 public/manifest.json                               |  20 -
 src/App.vue                                        |   7 +-
 src/components/DropdownMenu/index.vue              | 132 ------
 src/components/ErrorLog/index.vue                  | 124 -----
 src/components/GithubCorner/index.vue              |  90 ----
 src/components/MaterialInput/index.vue             | 393 ---------------
 src/components/PanThumb/index.vue                  | 143 ------
 src/components/RightPanel/index.vue                | 170 -------
 src/components/TextHoverEffect/Mallki.vue          | 133 ------
 src/components/UploadImage/index.vue               | 174 -------
 src/directives/el-draggable-dialog/index.ts        |  92 ----
 src/directives/index.ts                            |  20 -
 src/directives/permission/index.ts                 |  37 --
 src/directives/waves/index.ts                      |  63 ---
 src/directives/waves/waves.css                     |  26 -
 src/filters/index.ts                               |  34 --
 src/lang/es.ts                                     | 134 ------
 src/lang/index.ts                                  |  12 -
 src/lang/ja.ts                                     | 134 ------
 src/layout/components/Navbar/index.vue             |   2 -
 src/layout/components/Settings/index.vue           | 144 ------
 src/layout/components/index.ts                     |   1 -
 src/layout/index.vue                               |   3 +-
 src/main.ts                                        |  16 +-
 src/pwa/components/ServiceWorkerUpdatePopup.vue    |  86 ----
 src/pwa/register-service-worker.ts                 |  59 ---
 src/pwa/service-worker.js                          |  33 --
 src/router/index.ts                                |  46 +-
 src/store/index.ts                                 |   2 -
 src/store/modules/error-log.ts                     |  57 ---
 src/utils/error-log.ts                             |  42 --
 src/views/dashboard/admin/components/BarChart.vue  |  92 ----
 src/views/dashboard/admin/components/BoxCard.vue   | 137 ------
 src/views/dashboard/admin/components/LineChart.vue | 121 -----
 .../dashboard/admin/components/PanelGroup.vue      | 250 ----------
 src/views/dashboard/admin/components/PieChart.vue  |  69 ---
 .../dashboard/admin/components/RadarChart.vue      | 104 ----
 .../dashboard/admin/components/TodoList/Todo.vue   |  92 ----
 .../dashboard/admin/components/TodoList/index.vue  | 528 ---------------------
 .../admin/components/TransactionTable.vue          |  71 ---
 src/views/dashboard/admin/index.vue                | 157 ------
 src/views/dashboard/editor/index.vue               |  94 ----
 src/views/dashboard/index.vue                      |  33 --
 src/views/error-page/401.vue                       | 148 ------
 src/views/error-page/404.vue                       | 302 ------------
 src/views/login/auth-redirect.vue                  |  39 --
 src/views/login/components/SocialSignin.vue        | 108 -----
 src/views/login/index.vue                          |   4 +-
 src/views/profile/components/Account.vue           |  57 ---
 src/views/profile/components/Activity.vue          | 217 ---------
 src/views/profile/components/Timeline.vue          |  68 ---
 src/views/profile/components/UserCard.vue          | 167 -------
 src/views/profile/index.vue                        | 126 -----
 src/views/redirect/index.vue                       |  37 --
 vue.config.js                                      |   7 -
 yarn.lock                                          |   9 -
 69 files changed, 5 insertions(+), 5578 deletions(-)

diff --git a/README.md b/README.md
index f0886dc..b0a4c10 100644
--- a/README.md
+++ b/README.md
@@ -34,18 +34,14 @@ Dashboard for APISIX & based on ElementUI.
 ```bash
 ├── public                     # public static assets (directly copied)
 │   │── favicon.ico            # favicon
-│   │── manifest.json          # PWA config file
 │   └── index.html             # index.html template
 ├── src                        # main source code
 │   ├── api                    # api service
 │   ├── assets                 # module assets like fonts, images (processed by webpack)
 │   ├── components             # global components
-│   ├── directives             # global directives
-│   ├── filters                # global filter
 │   ├── icons                  # svg icons
 │   ├── lang                   # i18n language
 │   ├── layout                 # global layout
-│   ├── pwa                    # PWA service worker related files
 │   ├── router                 # router
 │   ├── store                  # store
 │   ├── styles                 # global css
diff --git a/package.json b/package.json
index 76372f5..b190750 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,6 @@
     "@vue/cli-plugin-e2e-cypress": "^3.8.0",
     "@vue/cli-plugin-e2e-nightwatch": "^4.0.5",
     "@vue/cli-plugin-eslint": "^3.8.0",
-    "@vue/cli-plugin-pwa": "^3.8.0",
     "@vue/cli-plugin-typescript": "^3.8.1",
     "@vue/cli-plugin-unit-jest": "^3.8.0",
     "@vue/cli-service": "^3.8.4",
diff --git a/public/img/icons/android-chrome-192x192.png b/public/img/icons/android-chrome-192x192.png
deleted file mode 100644
index 6c882c4..0000000
Binary files a/public/img/icons/android-chrome-192x192.png and /dev/null differ
diff --git a/public/img/icons/android-chrome-512x512.png b/public/img/icons/android-chrome-512x512.png
deleted file mode 100644
index e056f49..0000000
Binary files a/public/img/icons/android-chrome-512x512.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon-120x120.png b/public/img/icons/apple-touch-icon-120x120.png
deleted file mode 100644
index 580c58a..0000000
Binary files a/public/img/icons/apple-touch-icon-120x120.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon-152x152.png b/public/img/icons/apple-touch-icon-152x152.png
deleted file mode 100644
index ecdc132..0000000
Binary files a/public/img/icons/apple-touch-icon-152x152.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon-180x180.png b/public/img/icons/apple-touch-icon-180x180.png
deleted file mode 100644
index 094ac70..0000000
Binary files a/public/img/icons/apple-touch-icon-180x180.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon-60x60.png b/public/img/icons/apple-touch-icon-60x60.png
deleted file mode 100644
index aebdaeb..0000000
Binary files a/public/img/icons/apple-touch-icon-60x60.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon-76x76.png b/public/img/icons/apple-touch-icon-76x76.png
deleted file mode 100644
index 04da253..0000000
Binary files a/public/img/icons/apple-touch-icon-76x76.png and /dev/null differ
diff --git a/public/img/icons/apple-touch-icon.png b/public/img/icons/apple-touch-icon.png
deleted file mode 100644
index 094ac70..0000000
Binary files a/public/img/icons/apple-touch-icon.png and /dev/null differ
diff --git a/public/img/icons/msapplication-icon-144x144.png b/public/img/icons/msapplication-icon-144x144.png
deleted file mode 100644
index 843dcd1..0000000
Binary files a/public/img/icons/msapplication-icon-144x144.png and /dev/null differ
diff --git a/public/img/icons/mstile-150x150.png b/public/img/icons/mstile-150x150.png
deleted file mode 100644
index a8e8654..0000000
Binary files a/public/img/icons/mstile-150x150.png and /dev/null differ
diff --git a/public/img/icons/safari-pinned-tab.svg b/public/img/icons/safari-pinned-tab.svg
deleted file mode 100644
index 673e7b0..0000000
--- a/public/img/icons/safari-pinned-tab.svg
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="520.000000pt" height="520.000000pt" viewBox="0 0 520.000000 520.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.11, written by Peter Selinger 2001-2013
-</metadata>
-<g transform="translate(0.000000,520.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M1897 4883 c-3 -3 -39 -7 -79 -9 -66 -4 -125 -10 -138 -14 -3 -1 -13
--2 -22 -1 -10 1 -18 -3 -18 -10 0 -9 -3 -9 -14 0 -11 9 -18 8 -30 -5 -10 -9
--20 -14 -23 -11 -3 4 -15 1 -27 -5 -11 -7 -24 -13 -28 -14 -5 -1 -9 -2 -10 -4
--2 -1 -10 -3 -19 -5 -10 -1 -40 -14 -67 -28 -28 -14 -53 -23 -56 -20 -3 3 -8
--2 -12 -11 -3 -9 -10 -14 -14 -11 -4 3 -13 -2 -20 -10 -7 -8 -16 -12 -21 -9
--5 3 -9 0 -9 -6 0 -6 -4 -8 -10 -5 -5 3 -10 2 -10 -3 0 -5 -16 -17 -35 -28
--19 -10 -35 -23 -35 -28 0 -5 -3 -7 -6 -3 -6 6 -36 -16 -62 -45 -9 -9 -19 -15
--24 -12 -4 3 -8 1 -8 -5 0 -5 -9 -13 -20 -16 -11 -4 -18 -10 -15 -15 3 -4 -10
--17 -28 -29 -17 -11 -27 -21 -22 -21 6 0 -3 -9 -20 -20 -16 -11 -25 -20 -20
--20 6 -1 -1 -7 -15 -15 -14 -8 -21 -14 -16 -15 5 0 -3 -11 -18 -25 -14 -13
--26 -29 -26 -35 0 -6 -4 -8 -10 -5 -5 3 -10 3 -10 -2 0 -4 -13 -22 -28 -39
--60 -70 -72 -84 -72 -90 0 -4 -11 -17 -26 -30 -14 -13 -21 -24 -17 -24 4 0 3
--4 -2 -8 -18 -12 -66 -82 -58 -82 4 0 0 -5 -9 -11 -10 -5 -18 -14 -18 -20 0
--9 -8 -21 -38 -54 -7 -8 -10 -15 -6 -15 3 0 1 -6 -5 -13 -6 -8 -7 -18 -3 -23
-4 -5 3 -6 -2 -2 -10 9 -46 -44 -46 -67 0 -8 -6 -18 -13 -22 -7 -4 -19 -23 -26
--40 -8 -18 -18 -33 -23 -33 -5 0 -7 -4 -3 -9 3 -5 -2 -17 -11 -25 -8 -9 -12
--16 -9 -16 4 0 0 -11 -9 -25 -9 -14 -13 -25 -9 -25 5 0 3 -4 -2 -8 -6 -4 -25
--41 -44 -82 -18 -41 -37 -84 -41 -95 -33 -73 -59 -136 -60 -143 -3 -28 -14
--52 -23 -52 -6 0 -8 -3 -4 -6 3 -3 -4 -31 -15 -62 -11 -32 -21 -61 -22 -67 -1
--5 -4 -14 -8 -20 -3 -5 -9 -26 -14 -45 -11 -49 -11 -49 -14 -55 -1 -3 -4 -9
--5 -15 -1 -5 -4 -12 -5 -15 -1 -3 -4 -9 -5 -15 -1 -5 -3 -11 -5 -12 -1 -2 -3
--12 -5 -23 -4 -23 -10 -46 -24 -93 -5 -18 -10 -35 -10 -37 -1 -3 -1 -6 -2 -7
-0 -2 -2 -19 -5 -37 -2 -19 -10 -39 -17 -43 -7 -4 -8 -8 -1 -8 7 0 5 -23 -7
--67 -9 -38 -19 -90 -23 -118 -3 -27 -8 -68 -11 -90 -3 -22 -7 -53 -10 -70 -27
--163 -27 -652 0 -813 3 -17 7 -46 10 -62 11 -66 17 -93 29 -134 7 -23 12 -50
-10 -59 -1 -9 3 -17 9 -17 5 0 7 -3 4 -7 -4 -3 -2 -12 3 -19 6 -6 10 -16 9 -20
--1 -5 1 -18 5 -29 31 -81 36 -98 32 -103 -3 -2 3 -17 14 -32 11 -15 17 -30 13
--34 -3 -3 0 -6 7 -6 7 0 10 -3 7 -6 -3 -4 -1 -16 5 -28 7 -11 13 -23 13 -26 0
--3 7 -16 15 -30 8 -14 15 -27 15 -30 4 -18 30 -60 37 -60 4 0 7 -3 6 -7 -3 -9
-62 -106 74 -111 4 -2 8 -9 8 -16 0 -6 9 -18 20 -26 11 -8 20 -20 20 -27 0 -7
-7 -13 15 -13 8 0 15 -4 15 -9 0 -13 58 -70 64 -63 3 3 6 -2 6 -11 0 -10 7 -17
-15 -17 8 0 15 -4 15 -10 0 -5 4 -10 10 -10 5 0 23 -14 40 -31 16 -18 30 -28
-30 -23 0 5 5 1 11 -8 5 -10 17 -18 24 -18 8 0 15 -4 15 -8 0 -5 16 -14 35 -22
-19 -8 35 -17 35 -22 0 -4 6 -8 13 -9 6 0 34 -11 62 -24 27 -13 53 -21 57 -19
-5 3 8 1 8 -3 0 -8 77 -35 105 -38 6 0 15 -4 22 -8 6 -4 23 -8 37 -9 14 -1 26
--5 26 -8 0 -6 33 -11 78 -13 12 -1 22 -3 22 -6 0 -4 19 -7 43 -9 55 -3 69 -6
-85 -15 6 -5 12 -5 12 0 0 4 14 8 30 8 17 0 30 -2 30 -5 0 -7 96 -3 109 4 5 3
-12 0 14 -6 4 -10 6 -9 6 1 1 11 4 11 16 1 8 -7 15 -8 15 -4 0 5 19 10 43 12
-57 3 91 7 102 13 6 3 20 4 33 3 12 0 22 2 22 7 0 4 12 6 28 5 15 -2 31 -1 37
-2 5 4 28 8 50 9 21 2 42 7 45 11 3 4 19 8 35 10 55 4 82 9 92 15 5 3 23 9 39
-12 38 8 58 13 62 15 2 3 6 4 52 14 19 4 44 11 55 16 21 9 73 22 77 18 2 -1 14
-5 28 12 14 8 30 15 35 16 6 2 20 5 32 8 11 2 35 12 52 20 17 9 33 16 36 16 19
-1 199 74 207 85 4 5 8 6 8 2 0 -5 15 1 33 12 19 11 37 18 40 14 4 -3 7 -1 7 5
-0 7 3 11 8 10 4 -2 73 30 153 70 80 39 149 72 153 72 4 0 14 7 23 15 8 8 19
-13 24 10 5 -4 9 -1 9 5 0 7 6 10 12 8 7 -3 18 0 25 6 25 22 38 31 48 32 25 2
-74 27 69 35 -3 5 -2 8 3 7 11 -3 56 12 72 25 7 6 20 12 29 13 8 2 18 6 21 11
-11 15 45 38 37 26 -4 -7 -3 -13 2 -13 6 0 12 7 16 15 3 8 12 15 20 15 8 0 17
-6 19 13 8 18 8 2 10 -373 l2 -345 88 -1 87 -1 0 126 c1 69 1 255 1 413 l-1
-287 40 17 c21 10 37 21 34 26 -5 8 10 12 35 9 7 -2 10 2 6 8 -5 10 7 15 28 12
-4 0 7 3 7 9 0 5 16 17 35 26 19 9 35 21 35 26 0 5 4 7 9 4 5 -4 11 -3 13 1 1
-5 35 28 73 53 39 25 72 48 73 53 2 4 8 5 13 1 5 -3 12 2 15 10 3 9 10 14 14
-11 4 -3 11 2 14 11 3 8 10 12 16 9 5 -3 10 1 10 10 0 9 4 14 9 11 5 -3 20 5
-34 18 14 13 28 21 31 19 3 -3 8 2 12 11 3 9 15 16 26 16 10 0 16 5 13 10 -3 6
-2 13 11 17 18 7 50 31 86 65 10 10 21 18 24 18 6 0 47 36 106 92 15 14 28 24
-28 22 0 -3 48 43 108 103 108 109 252 281 252 302 0 6 4 11 9 11 9 0 32 37 78
-130 16 30 31 57 35 58 5 2 8 12 8 21 0 10 3 21 7 24 13 13 45 113 67 208 40
-176 22 407 -48 593 -32 85 -91 204 -113 228 -9 10 -13 18 -9 18 4 0 -4 15 -18
-33 -15 19 -26 37 -26 40 0 11 -119 168 -179 236 -81 93 -142 151 -216 205 -22
-17 -42 33 -45 36 -3 4 -21 15 -40 26 -19 10 -37 22 -40 25 -3 3 -20 14 -37 23
--18 9 -33 21 -33 26 0 6 -6 10 -14 10 -8 0 -21 6 -28 13 -7 7 -28 20 -45 28
--18 7 -33 17 -33 20 0 4 -11 10 -24 13 -14 3 -31 12 -38 19 -16 15 -70 41 -80
-39 -5 -1 -8 2 -8 6 0 5 -16 14 -35 22 -19 8 -35 18 -35 24 0 5 -3 6 -7 3 -3
--4 -12 -2 -20 4 -7 6 -13 8 -13 3 0 -5 -4 -4 -8 3 -4 6 -14 13 -22 15 -8 2
--21 9 -28 16 -8 7 -17 10 -22 7 -5 -3 -10 -2 -12 2 -4 10 -80 47 -90 45 -5 -1
--8 3 -8 9 0 6 -7 9 -15 5 -8 -3 -15 -1 -15 4 0 6 -7 10 -15 10 -8 0 -15 5 -15
-11 0 5 -5 7 -10 4 -6 -3 -10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6
--13 8 -13 3 0 -5 -4 -3 -9 4 -4 7 -18 14 -29 15 -12 1 -22 5 -22 10 0 4 -4 5
--10 2 -5 -3 -10 -1 -10 4 0 6 -7 11 -15 11 -15 0 -23 3 -81 33 -17 9 -34 14
--38 10 -3 -3 -6 -1 -6 6 0 7 -4 9 -10 6 -5 -3 -10 -2 -10 4 0 6 -7 7 -17 4
--10 -4 -14 -2 -9 5 4 7 -1 10 -14 7 -11 -2 -20 1 -20 6 0 6 -4 7 -10 4 -5 -3
--10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6 -13 8 -13 4 0 -4 -6 -2
--14 4 -8 7 -27 14 -42 17 -16 3 -33 9 -40 15 -6 5 -14 6 -17 2 -4 -3 -7 -2 -7
-4 0 5 -7 10 -15 11 -8 1 -22 3 -30 4 -8 1 -15 5 -15 10 0 4 -8 8 -18 8 -10 0
--24 6 -31 13 -11 10 -12 9 -6 -3 7 -12 6 -13 -6 -4 -8 5 -48 21 -89 33 -41 13
--86 28 -100 34 -14 6 -29 9 -34 8 -5 -1 -21 2 -35 8 -14 5 -35 12 -46 17 -11
-4 -31 9 -45 11 -14 2 -32 7 -40 10 -8 4 -19 8 -25 9 -5 1 -12 3 -15 4 -3 1
--12 3 -20 5 -8 1 -71 15 -139 30 -68 15 -137 28 -155 30 -17 2 -31 4 -31 5 0
-1 -11 3 -25 5 -14 1 -43 5 -65 9 -22 4 -71 9 -110 12 -130 10 -154 12 -163 18
--5 3 -12 3 -15 -1z"/>
-<path d="M4526 1543 c-2 -2 -12 -5 -23 -7 -37 -8 -111 -47 -151 -81 -43 -37
--92 -113 -95 -145 -1 -11 -4 -20 -8 -20 -13 0 -1 -156 16 -195 18 -42 108
--135 131 -135 8 0 14 -3 14 -8 0 -8 103 -58 160 -77 3 -1 18 -7 33 -13 16 -7
-32 -12 36 -12 5 0 14 -7 21 -15 7 -8 16 -12 21 -9 5 3 9 2 9 -3 0 -4 12 -14
-28 -21 32 -14 90 -67 113 -102 18 -28 24 -150 8 -150 -6 0 -8 -4 -5 -8 7 -11
--31 -72 -44 -72 -6 0 -9 -4 -6 -9 3 -5 -17 -18 -46 -30 -54 -23 -191 -30 -203
--11 -3 6 -15 10 -26 10 -10 0 -19 5 -19 10 0 6 -4 10 -10 10 -20 0 -63 56 -80
-102 -9 26 -16 66 -15 88 1 22 -1 40 -4 41 -3 0 -43 1 -89 2 -66 2 -82 -1 -83
--13 -1 -8 -2 -22 -3 -30 -1 -8 2 -23 7 -32 5 -12 4 -18 -5 -18 -9 0 -9 -3 0
--12 7 -7 12 -21 12 -33 0 -36 48 -124 88 -162 52 -49 72 -65 72 -57 0 4 8 0
-18 -9 10 -10 22 -14 25 -10 4 3 7 2 7 -4 0 -5 6 -10 13 -11 6 -1 28 -5 47 -9
-31 -6 200 -9 248 -3 19 2 34 8 103 39 64 30 143 110 155 158 4 13 9 23 13 23
-12 0 21 188 10 210 -4 8 -13 30 -19 48 -7 17 -17 32 -23 32 -6 0 -8 2 -5 6 7
-7 -72 89 -94 97 -10 3 -18 11 -18 17 0 6 -4 8 -10 5 -5 -3 -10 -3 -10 2 0 4
--15 14 -32 22 -18 8 -36 18 -39 23 -3 5 -16 10 -27 11 -12 1 -22 4 -22 8 0 4
--10 10 -22 14 -31 10 -37 12 -43 15 -3 1 -8 3 -12 5 -47 12 -136 59 -168 87
--32 27 -58 75 -50 88 3 6 3 10 -2 10 -4 0 -8 14 -8 30 -1 17 3 30 8 30 4 0 5
-4 2 10 -18 28 60 110 120 125 39 11 125 12 125 3 0 -5 9 -8 20 -8 26 0 86 -54
-105 -94 9 -18 16 -48 17 -67 l1 -36 89 0 88 1 0 38 c0 21 -4 38 -8 38 -4 0 -9
-11 -10 25 -7 93 -141 235 -221 235 -12 0 -21 4 -21 8 0 7 -197 12 -204 5z"/>
-</g>
-</svg>
diff --git a/public/manifest.json b/public/manifest.json
deleted file mode 100644
index 4ae8ce3..0000000
--- a/public/manifest.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "name": "Dashboard for APISIX",
-  "short_name": "APISIX",
-  "icons": [
-    {
-      "src": "./img/icons/android-chrome-192x192.png",
-      "sizes": "192x192",
-      "type": "image/png"
-    },
-    {
-      "src": "./img/icons/android-chrome-512x512.png",
-      "sizes": "512x512",
-      "type": "image/png"
-    }
-  ],
-  "start_url": "./index.html",
-  "display": "standalone",
-  "background_color": "#fff",
-  "theme_color": "#4DBA87"
-}
diff --git a/src/App.vue b/src/App.vue
index 4104bbe..adf2931 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -20,19 +20,14 @@
 <template>
   <div id="app">
     <router-view />
-    <service-worker-update-popup />
   </div>
 </template>
 
 <script lang="ts">
 import { Component, Vue } from 'vue-property-decorator'
-import ServiceWorkerUpdatePopup from '@/pwa/components/ServiceWorkerUpdatePopup.vue'
 
 @Component({
-  name: 'App',
-  components: {
-    ServiceWorkerUpdatePopup
-  }
+  name: 'App'
 })
 export default class extends Vue {}
 </script>
diff --git a/src/components/DropdownMenu/index.vue b/src/components/DropdownMenu/index.vue
deleted file mode 100644
index 5db76ff..0000000
--- a/src/components/DropdownMenu/index.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :class="{active: isActive}"
-    class="share-dropdown-menu"
-  >
-    <div class="share-dropdown-menu-wrapper">
-      <span
-        class="share-dropdown-menu-title"
-        @click.self="clickTitle"
-      >{{ title }}</span>
-      <div
-        v-for="(item, index) of items"
-        :key="index"
-        class="share-dropdown-menu-item"
-      >
-        <a
-          v-if="item.href"
-          :href="item.href"
-          target="_blank"
-        >{{ item.title }}</a>
-        <span v-else>{{ item.title }}</span>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'DropdownMenu'
-})
-export default class extends Vue {
-  @Prop({ default: () => [] }) private items!: any[]
-  @Prop({ default: 'vue' }) private title!: string
-
-  private isActive = false
-
-  private clickTitle() {
-    this.isActive = !this.isActive
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-$item-length: 10; // Should be no less than items.length
-$transition-time: .1s;
-
-.share-dropdown-menu {
-  width: 250px;
-  position: relative;
-  z-index: 1;
-
-  &-title {
-    width: 100%;
-    display: block;
-    cursor: pointer;
-    background: black;
-    color: white;
-    height: 60px;
-    line-height: 60px;
-    font-size: 20px;
-    text-align: center;
-    z-index: 2;
-    transform: translate3d(0,0,0);
-  }
-
-  &-wrapper {
-    position: relative;
-  }
-
-  &-item {
-    text-align: center;
-    position: absolute;
-    width: 100%;
-    background: #e0e0e0;
-    line-height: 60px;
-    height: 60px;
-    cursor: pointer;
-    font-size: 20px;
-    opacity: 1;
-    transition: transform 0.28s ease;
-
-    &:hover {
-      background: black;
-      color: white;
-    }
-
-    @for $i from 1 through $item-length {
-      &:nth-of-type(#{$i}) {
-        z-index: -1;
-        transition-delay: $i*$transition-time;
-        transform: translate3d(0, -60px, 0);
-      }
-    }
-  }
-
-  &.active {
-    .share-dropdown-menu-wrapper {
-      z-index: 1;
-    }
-
-    .share-dropdown-menu-item {
-      @for $i from 1 through $item-length {
-        &:nth-of-type(#{$i}) {
-         transition-delay: ($item-length - $i)*$transition-time;
-          transform: translate3d(0, ($i - 1)*60px, 0);
-        }
-      }
-    }
-  }
-}
-</style>
diff --git a/src/components/ErrorLog/index.vue b/src/components/ErrorLog/index.vue
deleted file mode 100644
index 13890f0..0000000
--- a/src/components/ErrorLog/index.vue
+++ /dev/null
@@ -1,124 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div v-if="errorLogs.length>0">
-    <el-badge
-      :is-dot="true"
-      style="line-height: 25px; margin-top: -5px;"
-      @click.native="dialogTableVisible=true"
-    >
-      <el-button
-        style="padding: 8px 10px;"
-        size="small"
-        type="danger"
-      >
-        <svg-icon name="bug" />
-      </el-button>
-    </el-badge>
-
-    <el-dialog
-      :visible.sync="dialogTableVisible"
-      width="80%"
-      append-to-body
-    >
-      <div slot="title">
-        <span style="padding-right: 10px;">Error Log</span>
-        <el-button
-          size="mini"
-          type="primary"
-          icon="el-icon-delete"
-          @click="clearAll"
-        >
-          Clear All
-        </el-button>
-      </div>
-      <el-table
-        :data="errorLogs"
-        border
-      >
-        <el-table-column label="Message">
-          <template slot-scope="{row}">
-            <div>
-              <span class="message-title">Msg:</span>
-              <el-tag type="danger">
-                {{ row.err.message }}
-              </el-tag>
-            </div>
-            <br>
-            <div>
-              <span
-                class="message-title"
-                style="padding-right: 10px;"
-              >Info: </span>
-              <el-tag type="warning">
-                {{ row.vm.$vnode.tag }} error in {{ row.info }}
-              </el-tag>
-            </div>
-            <br>
-            <div>
-              <span
-                class="message-title"
-                style="padding-right: 16px;"
-              >Url: </span>
-              <el-tag type="success">
-                {{ row.url }}
-              </el-tag>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="Stack">
-          <template slot-scope="scope">
-            {{ scope.row.err.stack }}
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-dialog>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { ErrorLogModule } from '@/store/modules/error-log'
-
-@Component({
-  name: 'ErrorLog'
-})
-export default class extends Vue {
-  private dialogTableVisible = false
-
-  get errorLogs() {
-    return ErrorLogModule.logs
-  }
-
-  private clearAll() {
-    this.dialogTableVisible = false
-    ErrorLogModule.ClearErrorLog()
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.message-title {
-  font-size: 16px;
-  color: #333;
-  font-weight: bold;
-  padding-right: 8px;
-}
-</style>
diff --git a/src/components/GithubCorner/index.vue b/src/components/GithubCorner/index.vue
deleted file mode 100644
index 30332c0..0000000
--- a/src/components/GithubCorner/index.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <a
-    href="https://github.com/armour/vue-typescript-admin-template"
-    target="_blank"
-    class="github-corner"
-    aria-label="View source on Github"
-  >
-    <svg
-      width="80"
-      height="80"
-      viewBox="0 0 250 250"
-      style="fill:#40c9c6; color:#fff;"
-      aria-hidden="true"
-    >
-      <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
-      <path
-        d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
-        fill="currentColor"
-        style="transform-origin: 130px 106px;"
-        class="octo-arm"
-      />
-      <path
-        d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L [...]
-        fill="currentColor"
-        class="octo-body"
-      />
-    </svg>
-  </a>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'GithubCorner'
-})
-export default class extends Vue {}
-</script>
-
-<style lang="scss" scoped>
-.github-corner:hover .octo-arm {
-  animation: octocat-wave 560ms ease-in-out
-}
-
-@keyframes octocat-wave {
-  0%,
-  100% {
-    transform: rotate(0)
-  }
-
-  20%,
-  60% {
-    transform: rotate(-25deg)
-  }
-
-  40%,
-  80% {
-    transform: rotate(10deg)
-  }
-}
-
-@media (max-width:500px) {
-  .github-corner:hover .octo-arm {
-    animation: none
-  }
-
-  .github-corner .octo-arm {
-    animation: octocat-wave 560ms ease-in-out
-  }
-}
-</style>
diff --git a/src/components/MaterialInput/index.vue b/src/components/MaterialInput/index.vue
deleted file mode 100644
index 728c932..0000000
--- a/src/components/MaterialInput/index.vue
+++ /dev/null
@@ -1,393 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :class="computedClasses"
-    class="material-input__component"
-  >
-    <div :class="{iconClass: icon}">
-      <i
-        v-if="icon"
-        :class="['el-icon-' + icon]"
-        class="el-input__icon material-input__icon"
-      />
-      <input
-        v-if="type === 'email'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :required="required"
-        type="email"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <input
-        v-if="type === 'url'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :required="required"
-        type="url"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <input
-        v-if="type === 'number'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :step="step"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :max="max"
-        :min="min"
-        :minlength="minlength"
-        :maxlength="maxlength"
-        :required="required"
-        type="number"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <input
-        v-if="type === 'password'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :max="max"
-        :min="min"
-        :required="required"
-        type="password"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <input
-        v-if="type === 'tel'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :required="required"
-        type="tel"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <input
-        v-if="type === 'text'"
-        v-model="currentValue"
-        :name="name"
-        :placeholder="fillPlaceHolder"
-        :readonly="readonly"
-        :disabled="disabled"
-        :autocomplete="autoComplete"
-        :minlength="minlength"
-        :maxlength="maxlength"
-        :required="required"
-        type="text"
-        class="material-input"
-        @focus="handleFocus"
-        @blur="handleBlur"
-        @input="handleInput"
-      >
-      <span class="material-input-bar" />
-      <label class="material-label">
-        <slot />
-      </label>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-// Source: https://github.com/wemake-services/vue-material-input/blob/master/src/components/MaterialInput.vue
-import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
-
-@Component({
-  name: 'MaterialInput'
-})
-export default class extends Vue {
-  @Prop({ default: '' }) private icon!: string
-  @Prop({ default: '' }) private name!: string
-  @Prop({ default: 'text' }) private type!: string
-  @Prop({ default: () => [] }) private value!: (string | number)[]
-  @Prop({ default: null }) private placeholder!: string | null
-  @Prop({ default: false }) private readonly!: boolean
-  @Prop({ default: false }) private disabled!: boolean
-  @Prop({ default: '' }) private min!: string
-  @Prop({ default: '' }) private max!: string
-  @Prop({ default: '' }) private step!: string
-  @Prop({ default: 0 }) private minlength!: number
-  @Prop({ default: 0 }) private maxlength!: number
-  @Prop({ default: true }) private required!: boolean
-  @Prop({ default: 'off' }) private autoComplete!: string
-  @Prop({ default: true }) private validateEvent!: boolean
-
-  private currentValue = this.value
-  private focus = false
-  private fillPlaceHolder: string | null = null
-
-  get computedClasses() {
-    return {
-      'material--active': this.focus,
-      'material--disabled': this.disabled,
-      'material--raised': Boolean(this.focus || this.currentValue) // has value
-    }
-  }
-
-  @Watch('value')
-  private onValueChange(value: (string | number)[]) {
-    this.currentValue = value
-  }
-
-  private handleInput(event: KeyboardEvent) {
-    const value = (event.target as HTMLInputElement).value
-    this.$emit('input', value)
-    if (this.$parent.$options.name === 'ElFormItem') {
-      if (this.validateEvent) {
-        this.$parent.$emit('el.form.change', [value])
-      }
-    }
-    this.$emit('change', value)
-  }
-
-  private handleFocus(event: FocusEvent) {
-    this.focus = true
-    this.$emit('focus', event)
-    if (this.placeholder && this.placeholder !== '') {
-      this.fillPlaceHolder = this.placeholder
-    }
-  }
-
-  private handleBlur(event: FocusEvent) {
-    this.focus = false
-    this.$emit('blur', event)
-    this.fillPlaceHolder = null
-    if (this.$parent.$options.name === 'ElFormItem') {
-      if (this.validateEvent) {
-        this.$parent.$emit('el.form.blur', [this.currentValue])
-      }
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-// Fonts:
-$font-size-base: 16px;
-$font-size-small: 18px;
-$font-size-smallest: 12px;
-$font-weight-normal: normal;
-$font-weight-bold: bold;
-$apixel: 1px;
-
-// Utils
-$spacer: 12px;
-$transition: 0.2s ease all;
-$index: 0px;
-$index-has-icon: 30px;
-
-// Theme:
-$color-white: white;
-$color-grey: #9E9E9E;
-$color-grey-light: #E0E0E0;
-$color-blue: #2196F3;
-$color-red: #F44336;
-$color-black: black;
-
-// Base clases:
-%base-bar-pseudo {
-  content: '';
-  height: 1px;
-  width: 0;
-  bottom: 0;
-  position: absolute;
-  transition: $transition;
-}
-
-// Mixins:
-@mixin slided-top() {
-  top: - ($font-size-base + $spacer);
-  left: 0;
-  font-size: $font-size-base;
-  font-weight: $font-weight-bold;
-}
-
-// Component:
-.material-input__component {
-  margin-top: 36px;
-  position: relative;
-
-  * {
-    box-sizing: border-box;
-  }
-
-  .iconClass {
-    .material-input__icon {
-      position: absolute;
-      left: 0;
-      line-height: $font-size-base;
-      color: $color-blue;
-      top: $spacer;
-      width: $index-has-icon;
-      height: $font-size-base;
-      font-size: $font-size-base;
-      font-weight: $font-weight-normal;
-      pointer-events: none;
-    }
-
-    .material-label {
-      left: $index-has-icon;
-    }
-
-    .material-input {
-      text-indent: $index-has-icon;
-    }
-  }
-
-  .material-input {
-    font-size: $font-size-base;
-    padding: $spacer $spacer $spacer - $apixel * 10 $spacer / 2;
-    display: block;
-    width: 100%;
-    border: none;
-    line-height: 1;
-    border-radius: 0;
-
-    &:focus {
-      outline: none;
-      border: none;
-      border-bottom: 1px solid transparent; // fixes the height issue
-    }
-  }
-
-  .material-label {
-    font-weight: $font-weight-normal;
-    position: absolute;
-    pointer-events: none;
-    left: $index;
-    top: 0;
-    transition: $transition;
-    font-size: $font-size-small;
-  }
-
-  .material-input-bar {
-    position: relative;
-    display: block;
-    width: 100%;
-
-    &:before {
-      @extend %base-bar-pseudo;
-      left: 50%;
-    }
-
-    &:after {
-      @extend %base-bar-pseudo;
-      right: 50%;
-    }
-  }
-
-  // Disabled state:
-  &.material--disabled {
-    .material-input {
-      border-bottom-style: dashed;
-    }
-  }
-
-  // Raised state:
-  &.material--raised {
-    .material-label {
-      @include slided-top();
-    }
-  }
-
-  // Active state:
-  &.material--active {
-    .material-input-bar {
-      &:before,
-      &:after {
-        width: 50%;
-      }
-    }
-  }
-}
-
-.material-input__component {
-  background: $color-white;
-
-  .material-input {
-    background: none;
-    color: $color-black;
-    text-indent: $index;
-    border-bottom: 1px solid $color-grey-light;
-  }
-
-  .material-label {
-    color: $color-grey;
-  }
-
-  .material-input-bar {
-    &:before,
-    &:after {
-      background: $color-blue;
-    }
-  }
-
-  // Active state:
-  &.material--active {
-    .material-label {
-      color: $color-blue;
-    }
-  }
-
-  // Errors:
-  &.material--has-errors {
-    &.material--active .material-label {
-      color: $color-red;
-    }
-
-    .material-input-bar {
-      &:before,
-      &:after {
-        background: transparent;
-      }
-    }
-  }
-}
-</style>
diff --git a/src/components/PanThumb/index.vue b/src/components/PanThumb/index.vue
deleted file mode 100644
index ef68d23..0000000
--- a/src/components/PanThumb/index.vue
+++ /dev/null
@@ -1,143 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :style="{zIndex: zIndex, height: height, width: width}"
-    class="pan-item"
-  >
-    <div class="pan-info">
-      <div class="pan-info-roles-container">
-        <slot />
-      </div>
-    </div>
-    <div
-      :style="{backgroundImage: `url(${image})`}"
-      class="pan-thumb"
-    />
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'PanThumb'
-})
-export default class extends Vue {
-  @Prop({ required: true }) private image!: string
-  @Prop({ default: '150px' }) private width!: string
-  @Prop({ default: '150px' }) private height!: string
-  @Prop({ default: 1 }) private zIndex!: number
-}
-</script>
-
-<style lang="scss" scoped>
-.pan-item {
-  width: 200px;
-  height: 200px;
-  border-radius: 50%;
-  display: inline-block;
-  position: relative;
-  cursor: default;
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
-
-  &:hover .pan-thumb {
-    transform: rotate(-110deg);
-  }
-
-  &:hover .pan-info p a {
-    opacity: 1;
-    transform: translateX(0px) rotate(0deg);
-  }
-}
-
-.pan-info {
-  position: absolute;
-  width: inherit;
-  height: inherit;
-  border-radius: 50%;
-  overflow: hidden;
-  box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);
-
-  .pan-info-roles-container {
-    padding: 20px;
-    text-align: center;
-  }
-
-  h3 {
-    color: #fff;
-    text-transform: uppercase;
-    position: relative;
-    letter-spacing: 2px;
-    font-size: 18px;
-    margin: 0 60px;
-    padding: 22px 0 0 0;
-    height: 85px;
-    font-family: 'Open Sans', Arial, sans-serif;
-    text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);
-  }
-
-  p {
-    color: #fff;
-    padding: 10px 5px;
-    font-style: italic;
-    margin: 0 30px;
-    font-size: 12px;
-    border-top: 1px solid rgba(255, 255, 255, 0.5);
-
-    a {
-      display: block;
-      color: #333;
-      width: 80px;
-      height: 80px;
-      background: rgba(255, 255, 255, 0.3);
-      border-radius: 50%;
-      color: #fff;
-      font-style: normal;
-      font-weight: 700;
-      text-transform: uppercase;
-      font-size: 9px;
-      letter-spacing: 1px;
-      padding-top: 24px;
-      margin: 7px auto 0;
-      font-family: 'Open Sans', Arial, sans-serif;
-      opacity: 0;
-      transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;
-      transform: translateX(60px) rotate(90deg);
-
-      &:hover {
-        background: rgba(255, 255, 255, 0.5);
-      }
-    }
-  }
-}
-
-.pan-thumb {
-  width: 100%;
-  height: 100%;
-  background-position: center center;
-  background-size: cover;
-  border-radius: 50%;
-  overflow: hidden;
-  position: absolute;
-  transform-origin: 95% 40%;
-  transition: all 0.3s ease-in-out;
-}
-</style>
diff --git a/src/components/RightPanel/index.vue b/src/components/RightPanel/index.vue
deleted file mode 100644
index 0a26157..0000000
--- a/src/components/RightPanel/index.vue
+++ /dev/null
@@ -1,170 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    ref="rightPanel"
-    :class="{show: show}"
-    class="rightPanel-container"
-  >
-    <div class="rightPanel-background" />
-    <div class="rightPanel">
-      <div
-        class="handle-button"
-        :style="{'top': buttonTop+'px','background-color': theme}"
-        @click="show=!show"
-      >
-        <i :class="show?'el-icon-close':'el-icon-setting'" />
-      </div>
-      <div class="rightPanel-items">
-        <slot />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
-import { addClass, removeClass } from '@/utils'
-import { SettingsModule } from '@/store/modules/settings'
-
-@Component({
-  name: 'RightPanel'
-})
-export default class extends Vue {
-  @Prop({ default: false }) private clickNotClose!: boolean
-  @Prop({ default: 250 }) private buttonTop!: number
-
-  private show = false
-
-  get theme() {
-    return SettingsModule.theme
-  }
-
-  @Watch('show')
-  private onShowChange(value: boolean) {
-    if (value && !this.clickNotClose) {
-      this.addEventClick()
-    }
-    if (value) {
-      addClass(document.body, 'showRightPanel')
-    } else {
-      removeClass(document.body, 'showRightPanel')
-    }
-  }
-
-  mounted() {
-    this.insertToBody()
-  }
-
-  beforeDestroy() {
-    const elx = this.$refs.rightPanel as Element
-    elx.remove()
-  }
-
-  private addEventClick() {
-    window.addEventListener('click', this.closeSidebar)
-  }
-
-  private closeSidebar(ev: MouseEvent) {
-    const parent = (ev.target as HTMLElement).closest('.rightPanel')
-    if (!parent) {
-      this.show = false
-      window.removeEventListener('click', this.closeSidebar)
-    }
-  }
-
-  private insertToBody() {
-    const elx = this.$refs.rightPanel as Element
-    const body = document.querySelector('body')
-    if (body) {
-      body.insertBefore(elx, body.firstChild)
-    }
-  }
-}
-</script>
-
-<style lang="scss">
-.showRightPanel {
-  overflow: hidden;
-  position: relative;
-  width: calc(100% - 15px);
-}
-</style>
-
-<style lang="scss" scoped>
-.rightPanel-background {
-  position: fixed;
-  top: 0;
-  left: 0;
-  opacity: 0;
-  transition: opacity .3s cubic-bezier(.7, .3, .1, 1);
-  background: rgba(0, 0, 0, .2);
-  z-index: -1;
-}
-
-.rightPanel {
-  width: 100%;
-  max-width: 260px;
-  height: 100vh;
-  position: fixed;
-  top: 0;
-  right: 0;
-  box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);
-  transition: all .25s cubic-bezier(.7, .3, .1, 1);
-  transform: translate(100%);
-  background: #fff;
-  z-index: 40000;
-}
-
-.show {
-  transition: all .3s cubic-bezier(.7, .3, .1, 1);
-
-  .rightPanel-background {
-    z-index: 20000;
-    opacity: 1;
-    width: 100%;
-    height: 100%;
-  }
-
-  .rightPanel {
-    transform: translate(0);
-  }
-}
-
-.handle-button {
-  width: 48px;
-  height: 48px;
-  position: absolute;
-  left: -48px;
-  text-align: center;
-  font-size: 24px;
-  border-radius: 6px 0 0 6px !important;
-  z-index: 0;
-  cursor: pointer;
-  pointer-events: auto;
-  color: #fff;
-  line-height: 48px;
-
-  i {
-    font-size: 24px;
-    line-height: 48px;
-  }
-}
-</style>
diff --git a/src/components/TextHoverEffect/Mallki.vue b/src/components/TextHoverEffect/Mallki.vue
deleted file mode 100644
index d061566..0000000
--- a/src/components/TextHoverEffect/Mallki.vue
+++ /dev/null
@@ -1,133 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <a
-    :class="className"
-    class="link--mallki"
-    href="#"
-  >
-    {{ text }}
-    <span :data-letters="text" />
-    <span :data-letters="text" />
-  </a>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'Mallki'
-})
-export default class extends Vue {
-  @Prop({ default: '' }) private className!: string
-  @Prop({ default: 'vue-typescript-admin' }) private text!: string
-}
-</script>
-
-<style lang="scss" scoped>
-/* Mallki */
-
-.link--mallki {
-  font-weight: 800;
-  color: #4dd9d5;
-  font-family: 'Dosis', sans-serif;
-  -webkit-transition: color 0.5s 0.25s;
-  transition: color 0.5s 0.25s;
-  overflow: hidden;
-  position: relative;
-  display: inline-block;
-  line-height: 1;
-  outline: none;
-  text-decoration: none;
-
-  &:hover {
-    -webkit-transition: none;
-    transition: none;
-    color: transparent;
-
-    &::before {
-      -webkit-transform: translate3d(100%, 0, 0);
-      transform: translate3d(100%, 0, 0);
-    }
-
-    span::before {
-      -webkit-transition-delay: 0.3s;
-      transition-delay: 0.3s;
-      -webkit-transform: translate3d(0, 0, 0);
-      transform: translate3d(0, 0, 0);
-      -webkit-transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);
-      transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);
-    }
-  }
-
-  &::before {
-    content: '';
-    width: 100%;
-    height: 6px;
-    margin: -3px 0 0 0;
-    background: #3888fa;
-    position: absolute;
-    left: 0;
-    top: 50%;
-    -webkit-transform: translate3d(-100%, 0, 0);
-    transform: translate3d(-100%, 0, 0);
-    -webkit-transition: -webkit-transform 0.4s;
-    transition: transform 0.4s;
-    -webkit-transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);
-    transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);
-  }
-
-  span {
-    position: absolute;
-    height: 50%;
-    width: 100%;
-    left: 0;
-    top: 0;
-    overflow: hidden;
-
-    &::before {
-      content: attr(data-letters);
-      color: red;
-      position: absolute;
-      left: 0;
-      width: 100%;
-      color: #3888fa;
-      -webkit-transition: -webkit-transform 0.5s;
-      transition: transform 0.5s;
-    }
-
-    &:nth-child(2) {
-      top: 50%;
-    }
-
-    &:first-child::before {
-      top: 0;
-      -webkit-transform: translate3d(0, 100%, 0);
-      transform: translate3d(0, 100%, 0);
-    }
-
-    &:nth-child(2)::before {
-      bottom: 0;
-      -webkit-transform: translate3d(0, -100%, 0);
-      transform: translate3d(0, -100%, 0);
-    }
-  }
-}
-</style>
diff --git a/src/components/UploadImage/index.vue b/src/components/UploadImage/index.vue
deleted file mode 100644
index 0bcd3e0..0000000
--- a/src/components/UploadImage/index.vue
+++ /dev/null
@@ -1,174 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="upload-container">
-    <el-upload
-      :data="dataObj"
-      :multiple="false"
-      :show-file-list="false"
-      :on-success="handleImageSuccess"
-      class="image-uploader"
-      drag
-      action="https://httpbin.org/post"
-    >
-      <i class="el-icon-upload" />
-      <div class="el-upload__text">
-        将文件拖到此处,或<em>点击上传</em>
-      </div>
-    </el-upload>
-    <div class="image-preview image-app-preview">
-      <div
-        v-show="imageUrl.length>1"
-        class="image-preview-wrapper"
-      >
-        <img :src="imageUrl">
-        <div class="image-preview-action">
-          <i
-            class="el-icon-delete"
-            @click="rmImage"
-          />
-        </div>
-      </div>
-    </div>
-    <div class="image-preview">
-      <div
-        v-show="imageUrl.length>1"
-        class="image-preview-wrapper"
-      >
-        <img :src="imageUrl">
-        <div class="image-preview-action">
-          <i
-            class="el-icon-delete"
-            @click="rmImage"
-          />
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'UploadImage'
-})
-export default class extends Vue {
-  @Prop({ default: '' }) private value!: string
-
-  private tempUrl = ''
-  private dataObj = { token: '', key: '' }
-
-  get imageUrl() {
-    return this.value
-  }
-
-  private emitInput(value: string) {
-    this.$emit('input', value)
-  }
-
-  private rmImage() {
-    this.emitInput('')
-  }
-
-  private handleImageSuccess(res: any) {
-    this.emitInput(res.files.file)
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.upload-container {
-  width: 100%;
-  position: relative;
-  @include clearfix;
-
-  .image-uploader {
-    width: 35%;
-    float: left;
-  }
-
-  .image-preview {
-    width: 200px;
-    height: 200px;
-    position: relative;
-    border: 1px dashed #d9d9d9;
-    float: left;
-    margin-left: 50px;
-
-    .image-preview-wrapper {
-      position: relative;
-      width: 100%;
-      height: 100%;
-
-      img {
-        width: 100%;
-        height: 100%;
-      }
-    }
-
-    .image-preview-action {
-      position: absolute;
-      width: 100%;
-      height: 100%;
-      left: 0;
-      top: 0;
-      cursor: default;
-      text-align: center;
-      color: #fff;
-      opacity: 0;
-      font-size: 20px;
-      background-color: rgba(0, 0, 0, .5);
-      transition: opacity .3s;
-      cursor: pointer;
-      text-align: center;
-      line-height: 200px;
-
-      .el-icon-delete {
-        font-size: 36px;
-      }
-    }
-
-    &:hover {
-      .image-preview-action {
-        opacity: 1;
-      }
-    }
-  }
-
-  .image-app-preview {
-    width: 320px;
-    height: 180px;
-    position: relative;
-    border: 1px dashed #d9d9d9;
-    float: left;
-    margin-left: 50px;
-
-    .app-fake-conver {
-      height: 44px;
-      position: absolute;
-      width: 100%; // background: rgba(0, 0, 0, .1);
-      text-align: center;
-      line-height: 64px;
-      color: #fff;
-    }
-  }
-}
-</style>
diff --git a/src/directives/el-draggable-dialog/index.ts b/src/directives/el-draggable-dialog/index.ts
deleted file mode 100644
index ab18af5..0000000
--- a/src/directives/el-draggable-dialog/index.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { DirectiveOptions } from 'vue'
-
-export const elDraggableDialog: DirectiveOptions = {
-  bind(el, _, vnode) {
-    const dragDom = el.querySelector('.el-dialog') as HTMLElement
-    const dialogHeaderEl = el.querySelector('.el-dialog__header') as HTMLElement
-    dragDom.style.cssText += ';top:0px;'
-    dialogHeaderEl.style.cssText += ';cursor:move;'
-
-    dialogHeaderEl.onmousedown = (e) => {
-      const disX = e.clientX - dialogHeaderEl.offsetLeft
-      const disY = e.clientY - dialogHeaderEl.offsetTop
-
-      const dragDomWidth = dragDom.offsetWidth
-      const dragDomHeight = dragDom.offsetHeight
-
-      const screenWidth = document.body.clientWidth
-      const screenHeight = document.body.clientHeight
-
-      const minDragDomLeft = dragDom.offsetLeft
-      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
-
-      const minDragDomTop = dragDom.offsetTop
-      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
-
-      let styleLeftStr = getComputedStyle(dragDom)['left']
-      let styleTopStr = getComputedStyle(dragDom)['top']
-      if (!styleLeftStr || !styleTopStr) return
-      let styleLeft: number
-      let styleTop: number
-
-      // Format may be "##%" or "##px"
-      if (styleLeftStr.includes('%')) {
-        styleLeft = +document.body.clientWidth * (+styleLeftStr.replace(/%/g, '') / 100)
-        styleTop = +document.body.clientHeight * (+styleTopStr.replace(/%/g, '') / 100)
-      } else {
-        styleLeft = +styleLeftStr.replace(/px/g, '')
-        styleTop = +styleTopStr.replace(/px/g, '')
-      }
-
-      document.onmousemove = (e) => {
-        let left = e.clientX - disX
-        let top = e.clientY - disY
-
-        // Handle edge cases
-        if (-(left) > minDragDomLeft) {
-          left = -minDragDomLeft
-        } else if (left > maxDragDomLeft) {
-          left = maxDragDomLeft
-        }
-        if (-(top) > minDragDomTop) {
-          top = -minDragDomTop
-        } else if (top > maxDragDomTop) {
-          top = maxDragDomTop
-        }
-
-        // Move current element
-        dragDom.style.cssText += `;left:${left + styleLeft}px;top:${top + styleTop}px;`
-
-        // Emit onDialogDrag event
-        // See https://stackoverflow.com/questions/49264426/vuejs-custom-directive-emit-event
-        if (vnode.componentInstance) {
-          vnode.componentInstance.$emit('onDialogDrag')
-        } else if (vnode.elm) {
-          vnode.elm.dispatchEvent(new CustomEvent('onDialogDrag'))
-        }
-      }
-
-      document.onmouseup = () => {
-        document.onmousemove = null
-        document.onmouseup = null
-      }
-    }
-  }
-}
diff --git a/src/directives/index.ts b/src/directives/index.ts
deleted file mode 100644
index fb4a3b7..0000000
--- a/src/directives/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export * from './el-draggable-dialog'
-export * from './permission'
-export * from './waves'
diff --git a/src/directives/permission/index.ts b/src/directives/permission/index.ts
deleted file mode 100644
index c4f558e..0000000
--- a/src/directives/permission/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { DirectiveOptions } from 'vue'
-import { UserModule } from '@/store/modules/user'
-
-export const permission: DirectiveOptions = {
-  inserted(el, binding) {
-    const { value } = binding
-    const roles = UserModule.roles
-    if (value && value instanceof Array && value.length > 0) {
-      const permissionRoles = value
-      const hasPermission = roles.some(role => {
-        return permissionRoles.includes(role)
-      })
-      if (!hasPermission) {
-        el.parentNode && el.parentNode.removeChild(el)
-      }
-    } else {
-      throw new Error(`need roles! Like v-permission="['admin','editor']"`)
-    }
-  }
-}
diff --git a/src/directives/waves/index.ts b/src/directives/waves/index.ts
deleted file mode 100644
index 5916d96..0000000
--- a/src/directives/waves/index.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import './waves.css'
-import { DirectiveOptions } from 'vue'
-
-export const waves: DirectiveOptions = {
-  bind(el, binding) {
-    el.addEventListener('click', e => {
-      const customOpts = Object.assign({}, binding.value)
-      const opts = Object.assign({
-        ele: el, // 波纹作用元素
-        type: 'hit', // hit 点击位置扩散 center中心点扩展
-        color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
-      }, customOpts)
-      const target: HTMLElement = opts.ele
-      if (target) {
-        target.style.position = 'relative'
-        target.style.overflow = 'hidden'
-        const rect = target.getBoundingClientRect()
-        let ripple = target.querySelector('.waves-ripple') as HTMLElement
-        if (!ripple) {
-          ripple = document.createElement('span')
-          ripple.className = 'waves-ripple'
-          ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
-          target.appendChild(ripple)
-        } else {
-          ripple.className = 'waves-ripple'
-        }
-        switch (opts.type) {
-          case 'center':
-            ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
-            ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
-            break
-          default:
-            ripple.style.top =
-              (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||
-                document.body.scrollTop) + 'px'
-            ripple.style.left =
-              (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||
-                document.body.scrollLeft) + 'px'
-        }
-        ripple.style.backgroundColor = opts.color
-        ripple.className = 'waves-ripple z-active'
-        return false
-      }
-    }, false)
-  }
-}
diff --git a/src/directives/waves/waves.css b/src/directives/waves/waves.css
deleted file mode 100644
index af7a7ef..0000000
--- a/src/directives/waves/waves.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.waves-ripple {
-    position: absolute;
-    border-radius: 100%;
-    background-color: rgba(0, 0, 0, 0.15);
-    background-clip: padding-box;
-    pointer-events: none;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-    -webkit-transform: scale(0);
-    -ms-transform: scale(0);
-    transform: scale(0);
-    opacity: 1;
-}
-
-.waves-ripple.z-active {
-    opacity: 0;
-    -webkit-transform: scale(2);
-    -ms-transform: scale(2);
-    transform: scale(2);
-    -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
-    transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
-    transition: opacity 1.2s ease-out, transform 0.6s ease-out;
-    transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
-}
\ No newline at end of file
diff --git a/src/filters/index.ts b/src/filters/index.ts
deleted file mode 100644
index 96e3c08..0000000
--- a/src/filters/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Set utils function parseTime to filter
-export { parseTime } from '@/utils'
-
-// Filter for article status
-export const articleStatusFilter = (status: string) => {
-  const statusMap: { [key: string]: string } = {
-    published: 'success',
-    draft: 'info',
-    deleted: 'danger'
-  }
-  return statusMap[status]
-}
-
-// Filter to uppercase the first character
-export const uppercaseFirstChar = (str: string) => {
-  return str.charAt(0).toUpperCase() + str.slice(1)
-}
diff --git a/src/lang/es.ts b/src/lang/es.ts
deleted file mode 100644
index f2dc889..0000000
--- a/src/lang/es.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export default {
-  route: {
-    dashboard: 'Panel de control',
-    documentation: 'Documentación',
-    guide: 'Guía',
-    permission: 'Permisos',
-    icons: 'Iconos',
-    components: 'Componentes',
-    charts: 'Gráficos',
-    barChart: 'Bar Chart',
-    lineChart: 'Gráfico de líneas',
-    mixedChart: 'Mixed Chart',
-    table: 'Tabla',
-    tab: 'Pestaña',
-    form: 'Formulario',
-    page404: '404',
-    errorLog: 'Registro de errores',
-    mergeHeader: 'Merge Header',
-    pdf: 'PDF',
-    theme: 'Tema',
-    i18n: 'I18n',
-    profile: 'Profile'
-  },
-  navbar: {
-    logOut: 'Salir',
-    dashboard: 'Panel de control',
-    github: 'Github',
-    theme: 'Tema',
-    size: 'Tamaño global',
-    profile: 'Profile'
-  },
-  login: {
-    title: 'Formulario de acceso',
-    logIn: 'Acceso',
-    username: 'Usuario',
-    password: 'Contraseña',
-    any: 'nada',
-    thirdparty: 'Conectar con',
-    thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !'
-  },
-  documentation: {
-    documentation: 'Documentación',
-    github: 'Repositorio Github'
-  },
-  permission: {
-    createRole: 'Nuevo rol',
-    editPermission: 'Permiso de edición',
-    roles: 'Tus permisos',
-    switchRoles: 'Cambiar permisos',
-    tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.',
-    delete: 'Borrar',
-    confirm: 'Confirmar',
-    cancel: 'Cancelar'
-  },
-  guide: {
-    description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',
-    button: 'Ver guía'
-  },
-  components: {
-    documentation: 'Documentación',
-    stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',
-    imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'
-  },
-  table: {
-    dynamicTips1: 'Fixed header, sorted by header order',
-    dynamicTips2: 'Not fixed header, sorted by click order',
-    dragTips1: 'Orden por defecto',
-    dragTips2: 'The after dragging order',
-    title: 'Título',
-    importance: 'Importancia',
-    type: 'Tipo',
-    remark: 'Remark',
-    search: 'Buscar',
-    add: 'Añadir',
-    export: 'Exportar',
-    reviewer: 'Reviewer',
-    id: 'ID',
-    date: 'Fecha',
-    author: 'Autor',
-    readings: 'Lector',
-    status: 'Estado',
-    actions: 'Acciones',
-    edit: 'Editar',
-    publish: 'Publicar',
-    draft: 'Draft',
-    delete: 'Eliminar',
-    cancel: 'Cancelar',
-    confirm: 'Confirmar'
-  },
-  errorLog: {
-    tips: 'Please click the bug icon in the upper right corner',
-    description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
-    documentation: 'Documento de introducción'
-  },
-  pdf: {
-    tips: 'Here we use window.print() to implement the feature of downloading PDF.'
-  },
-  theme: {
-    change: 'Cambiar tema',
-    documentation: 'Documentación del tema',
-    tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'
-  },
-  tagsView: {
-    refresh: 'Actualizar',
-    close: 'Cerrar',
-    closeOthers: 'Cerrar otros',
-    closeAll: 'Cerrar todos'
-  },
-  settings: {
-    title: 'Page style setting',
-    theme: 'Theme Color',
-    showTagsView: 'Show Tags-View',
-    showSidebarLogo: 'Show Sidebar Logo',
-    fixedHeader: 'Fixed Header',
-    sidebarTextTheme: 'Sidebar Text Theme'
-  }
-}
diff --git a/src/lang/index.ts b/src/lang/index.ts
index 891a31d..2671616 100644
--- a/src/lang/index.ts
+++ b/src/lang/index.ts
@@ -23,14 +23,10 @@ import { getLanguage } from '@/utils/cookies'
 // element-ui built-in lang
 import elementEnLocale from 'element-ui/lib/locale/lang/en'
 import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'
-import elementEsLocale from 'element-ui/lib/locale/lang/es'
-import elementJaLocale from 'element-ui/lib/locale/lang/ja'
 
 // User defined lang
 import enLocale from './en'
 import zhLocale from './zh'
-import esLocale from './es'
-import jaLocale from './ja'
 
 Vue.use(VueI18n)
 
@@ -42,14 +38,6 @@ const messages = {
   zh: {
     ...zhLocale,
     ...elementZhLocale
-  },
-  es: {
-    ...esLocale,
-    ...elementEsLocale
-  },
-  ja: {
-    ...jaLocale,
-    ...elementJaLocale
   }
 }
 
diff --git a/src/lang/ja.ts b/src/lang/ja.ts
deleted file mode 100644
index 44012f2..0000000
--- a/src/lang/ja.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export default {
-  route: {
-    dashboard: 'トップ',
-    documentation: 'ドキュメント',
-    guide: 'ガイド',
-    permission: '権限',
-    icons: 'アイコン',
-    components: 'コンポーネント',
-    charts: 'チャート',
-    barChart: 'Barチャート',
-    lineChart: 'Lineチャート',
-    mixedChart: 'Mixedチャート',
-    table: 'Table',
-    tab: 'Tab',
-    form: 'フォーム',
-    page404: '404',
-    errorLog: 'エラーログ',
-    mergeHeader: 'ヘッダーマージ',
-    pdf: 'PDF',
-    theme: 'テーマ変更',
-    i18n: '多言語',
-    profile: 'プロフィール'
-  },
-  navbar: {
-    dashboard: 'トップ',
-    github: 'GitHub',
-    logOut: 'ログアウト',
-    profile: 'プロフィール',
-    theme: 'テーマ変更',
-    size: '画面サイズ'
-  },
-  login: {
-    title: 'ユーザログイン',
-    logIn: 'ログイン',
-    username: 'ユーザ名',
-    password: 'パスワード',
-    any: 'any',
-    thirdparty: '外部IDでログイン',
-    thirdpartyTips: 'ローカル環境ではログインできません。実装が必要です。'
-  },
-  documentation: {
-    documentation: 'ドキュメント',
-    github: 'Github Link'
-  },
-  permission: {
-    createRole: 'ロール追加',
-    editPermission: 'ロール変更',
-    roles: 'ロール',
-    switchRoles: 'ロール切替',
-    tips: 'v-permissionは使えない時があります。例えば: Element-UI の el-tab、 el-table-column 及び他の dom。v-ifを使う必要があります。',
-    delete: '削除',
-    confirm: '確認',
-    cancel: 'キャンセル'
-  },
-  guide: {
-    description: 'ガイドは各機能の説明です。',
-    button: 'ガイドを見る'
-  },
-  components: {
-    documentation: 'ドキュメント',
-    stickyTips: 'ページの指定位置へスクロールした場合、表示されます。',
-    imageUploadTips: 'mockjsは使えないため、カスタマイズしています。公式の最新バージョンを使ってください。'
-  },
-  table: {
-    dynamicTips1: '先頭は固定、最後に追加',
-    dynamicTips2: '戦後に追加せず、指定列に追加',
-    dragTips1: 'デフォルト順番',
-    dragTips2: 'Drag後の順番',
-    title: 'タイトル',
-    importance: '重要',
-    type: 'タイプ',
-    remark: '評価',
-    search: '検索',
-    add: '追加',
-    export: 'エクスポート',
-    reviewer: 'レビュアー',
-    id: '番号',
-    date: '日時',
-    author: '作成者',
-    readings: '閲覧数',
-    status: 'ステータス',
-    actions: '操作',
-    edit: '編集',
-    publish: '公開',
-    draft: '下書き',
-    delete: 'キャンセル',
-    cancel: 'キャンセル',
-    confirm: '確認'
-  },
-  errorLog: {
-    tips: '右上のbugアイコンをクリックしてください。',
-    description: '管理画面はspaを使う場合が多い、ユーザ体現向上はできますが、想定外エラーが発生する場合があります。Vueはそのエラーハンドリング機能を提供し、エラーレポートができます。',
-    documentation: 'ドキュメント'
-  },
-  pdf: {
-    tips: 'window.print() を使ってPDFダウンロードしています。'
-  },
-  theme: {
-    change: 'テーマ切替',
-    documentation: 'ドキュメント',
-    tips: 'Tips: テーマの切り替え方法はnavbarのtheme-pickと異なります、使い方はドキュメントを確認してください。'
-  },
-  tagsView: {
-    refresh: '更新',
-    close: '閉じる',
-    closeOthers: 'その他閉じる',
-    closeAll: 'すべて閉じる'
-  },
-  settings: {
-    title: 'システムテーマ',
-    theme: 'テーマ色',
-    showTagsView: 'Tags-View 開く',
-    showSidebarLogo: 'Show Sidebar Logo',
-    fixedHeader: 'Fixed Header',
-    sidebarTextTheme: 'Sidebar Text Theme'
-  }
-}
diff --git a/src/layout/components/Navbar/index.vue b/src/layout/components/Navbar/index.vue
index 981e26f..f9221fe 100644
--- a/src/layout/components/Navbar/index.vue
+++ b/src/layout/components/Navbar/index.vue
@@ -63,7 +63,6 @@ import { Component, Vue } from 'vue-property-decorator'
 import { AppModule } from '@/store/modules/app'
 import { UserModule } from '@/store/modules/user'
 import Breadcrumb from '@/components/Breadcrumb/index.vue'
-import ErrorLog from '@/components/ErrorLog/index.vue'
 import Hamburger from '@/components/Hamburger/index.vue'
 import HeaderSearch from '@/components/HeaderSearch/index.vue'
 import LangSelect from '@/components/LangSelect/index.vue'
@@ -74,7 +73,6 @@ import SizeSelect from '@/components/SizeSelect/index.vue'
   name: 'Navbar',
   components: {
     Breadcrumb,
-    ErrorLog,
     Hamburger,
     HeaderSearch,
     LangSelect,
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
deleted file mode 100644
index 6f9f5c8..0000000
--- a/src/layout/components/Settings/index.vue
+++ /dev/null
@@ -1,144 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="drawer-container">
-    <div>
-      <h3 class="drawer-title">
-        {{ $t('settings.title') }}
-      </h3>
-
-      <div class="drawer-item">
-        <span>{{ $t('settings.theme') }}</span>
-        <theme-picker
-          style="float: right;height: 26px;margin: -3px 8px 0 0;"
-          @change="themeChange"
-        />
-      </div>
-
-      <div class="drawer-item">
-        <span>{{ $t('settings.showTagsView') }}</span>
-        <el-switch
-          v-model="showTagsView"
-          class="drawer-switch"
-        />
-      </div>
-
-      <div class="drawer-item">
-        <span>{{ $t('settings.showSidebarLogo') }}</span>
-        <el-switch
-          v-model="showSidebarLogo"
-          class="drawer-switch"
-        />
-      </div>
-
-      <div class="drawer-item">
-        <span>{{ $t('settings.fixedHeader') }}</span>
-        <el-switch
-          v-model="fixedHeader"
-          class="drawer-switch"
-        />
-      </div>
-
-      <div class="drawer-item">
-        <span>{{ $t('settings.sidebarTextTheme') }}</span>
-        <el-switch
-          v-model="sidebarTextTheme"
-          class="drawer-switch"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { SettingsModule } from '@/store/modules/settings'
-import ThemePicker from '@/components/ThemePicker/index.vue'
-
-@Component({
-  name: 'Settings',
-  components: {
-    ThemePicker
-  }
-})
-export default class extends Vue {
-  get fixedHeader() {
-    return SettingsModule.fixedHeader
-  }
-
-  set fixedHeader(value) {
-    SettingsModule.ChangeSetting({ key: 'fixedHeader', value })
-  }
-
-  get showTagsView() {
-    return SettingsModule.showTagsView
-  }
-
-  set showTagsView(value) {
-    SettingsModule.ChangeSetting({ key: 'showTagsView', value })
-  }
-
-  get showSidebarLogo() {
-    return SettingsModule.showSidebarLogo
-  }
-
-  set showSidebarLogo(value) {
-    SettingsModule.ChangeSetting({ key: 'showSidebarLogo', value })
-  }
-
-  get sidebarTextTheme() {
-    return SettingsModule.sidebarTextTheme
-  }
-
-  set sidebarTextTheme(value) {
-    SettingsModule.ChangeSetting({ key: 'sidebarTextTheme', value })
-  }
-
-  private themeChange(value: string) {
-    SettingsModule.ChangeSetting({ key: 'theme', value })
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.drawer-container {
-  padding: 24px;
-  font-size: 14px;
-  line-height: 1.5;
-  word-wrap: break-word;
-
-  .drawer-title {
-    margin-bottom: 12px;
-    color: rgba(0, 0, 0, .85);
-    font-size: 14px;
-    line-height: 22px;
-  }
-
-  .drawer-item {
-    color: rgba(0, 0, 0, .65);
-    font-size: 14px;
-    padding: 12px 0;
-  }
-
-  .drawer-switch {
-    float: right
-  }
-}
-</style>
diff --git a/src/layout/components/index.ts b/src/layout/components/index.ts
index d854d30..65262d9 100644
--- a/src/layout/components/index.ts
+++ b/src/layout/components/index.ts
@@ -17,6 +17,5 @@
 
 export { default as AppMain } from './AppMain.vue'
 export { default as Navbar } from './Navbar/index.vue'
-export { default as Settings } from './Settings/index.vue'
 export { default as Sidebar } from './Sidebar/index.vue'
 export { default as TagsView } from './TagsView/index.vue'
diff --git a/src/layout/index.vue b/src/layout/index.vue
index a4f52ab..39db68e 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -46,7 +46,7 @@ import { Component } from 'vue-property-decorator'
 import { mixins } from 'vue-class-component'
 import { DeviceType, AppModule } from '@/store/modules/app'
 import { SettingsModule } from '@/store/modules/settings'
-import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
+import { AppMain, Navbar, Sidebar, TagsView } from './components'
 import ResizeMixin from './mixin/resize'
 
 @Component({
@@ -54,7 +54,6 @@ import ResizeMixin from './mixin/resize'
   components: {
     AppMain,
     Navbar,
-    Settings,
     Sidebar,
     TagsView
   }
diff --git a/src/main.ts b/src/main.ts
index 424a393..b3faa38 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import Vue, { DirectiveOptions } from 'vue'
+import Vue from 'vue'
 
 import 'normalize.css'
 import ElementUI from 'element-ui'
@@ -30,10 +30,6 @@ import router from '@/router'
 import i18n from '@/lang'
 import '@/icons/components'
 import '@/permission'
-import '@/utils/error-log'
-import '@/pwa/register-service-worker'
-import * as directives from '@/directives'
-import * as filters from '@/filters'
 
 Vue.use(ElementUI, {
   size: AppModule.size, // Set element-ui default size
@@ -46,16 +42,6 @@ Vue.use(SvgIcon, {
   defaultHeight: '1em'
 })
 
-// Register global directives
-Object.keys(directives).forEach(key => {
-  Vue.directive(key, (directives as { [key: string ]: DirectiveOptions })[key])
-})
-
-// Register global filter functions
-Object.keys(filters).forEach(key => {
-  Vue.filter(key, (filters as { [key: string ]: Function })[key])
-})
-
 Vue.config.productionTip = false
 
 Component.registerHooks([
diff --git a/src/pwa/components/ServiceWorkerUpdatePopup.vue b/src/pwa/components/ServiceWorkerUpdatePopup.vue
deleted file mode 100644
index ffe4a2c..0000000
--- a/src/pwa/components/ServiceWorkerUpdatePopup.vue
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'ServiceWorkerUpdatePopup'
-})
-export default class extends Vue {
-  private refreshing = false
-  private notificationText = 'New content is available!'
-  private refreshButtonText = 'Refresh'
-  private registration: ServiceWorkerRegistration | null = null
-
-  created() {
-    // Listen for swUpdated event and display refresh notification as required.
-    document.addEventListener('swUpdated', this.showRefreshUI, { once: true })
-    // Refresh all open app tabs when a new service worker is installed.
-    navigator.serviceWorker.addEventListener('controllerchange', () => {
-      if (this.refreshing) return
-      this.refreshing = true
-      window.location.reload()
-    })
-  }
-
-  render() {
-    // Avoid warning for missing template
-  }
-
-  private showRefreshUI(e: Event) {
-    // Display a notification inviting the user to refresh/reload the app due
-    // to an app update being available.
-    // The new service worker is installed, but not yet active.
-    // Store the ServiceWorkerRegistration instance for later use.
-    const h = this.$createElement
-    this.registration = (e as CustomEvent).detail
-    this.$notify.info({
-      title: 'Update available',
-      message: h('div', { class: 'sw-update-popup' }, [
-        this.notificationText,
-        h('br'),
-        h('button', {
-          on: {
-            click: (e: Event) => {
-              e.preventDefault()
-              this.refreshApp()
-            }
-          }
-        }, this.refreshButtonText)
-      ]),
-      position: 'bottom-right',
-      duration: 0
-    })
-  }
-
-  private refreshApp() {
-    // Protect against missing registration.waiting.
-    if (!this.registration || !this.registration.waiting) return
-    this.registration.waiting.postMessage('skipWaiting')
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.sw-update-popup > button {
-  margin-top: 0.5em;
-  padding: 0.25em 1.5em;
-}
-</style>
diff --git a/src/pwa/register-service-worker.ts b/src/pwa/register-service-worker.ts
deleted file mode 100644
index c7294a3..0000000
--- a/src/pwa/register-service-worker.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* eslint-disable no-console */
-
-import { register } from 'register-service-worker'
-
-if (process.env.NODE_ENV === 'production') {
-  register(`${process.env.BASE_URL}service-worker.js`, {
-    ready() {
-      console.log(
-        'App is being served from cache by a service worker.\n' +
-        'For more details, visit https://goo.gl/AFskqB'
-      )
-    },
-    registered(registration) {
-      console.log('Service worker has been registered.')
-      // Routinely check for app updates by testing for a new service worker.
-      setInterval(() => {
-        registration.update()
-      }, 1000 * 60 * 60) // hourly checks
-    },
-    cached() {
-      console.log('Content has been cached for offline use.')
-    },
-    updatefound() {
-      console.log('New content is downloading.')
-    },
-    updated(registration) {
-      console.log('New content is available; please refresh.')
-      // Add a custom event and dispatch it.
-      // Used to display of a 'refresh' banner following a service worker update.
-      // Set the event payload to the service worker registration object.
-      document.dispatchEvent(
-        new CustomEvent('swUpdated', { detail: registration })
-      )
-    },
-    offline() {
-      console.log('No internet connection found. App is running in offline mode.')
-    },
-    error(error) {
-      console.error('Error during service worker registration:', error)
-    }
-  })
-}
diff --git a/src/pwa/service-worker.js b/src/pwa/service-worker.js
deleted file mode 100644
index 71920b6..0000000
--- a/src/pwa/service-worker.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// This is the code piece that GenerateSW mode can't provide for us.
-// This code listens for the user's confirmation to update the app.
-self.addEventListener('message', (e) => {
-  if (e.data) {
-    if (e.data === 'skipWaiting') {
-      self.skipWaiting()
-    }
-  }
-})
-
-workbox.clientsClaim()
-
-// The precaching code provided by Workbox. You don't need to change this part.
-self.__precacheManifest = [].concat(self.__precacheManifest || [])
-workbox.precaching.suppressWarnings()
-workbox.precaching.precacheAndRoute(self.__precacheManifest, {})
diff --git a/src/router/index.ts b/src/router/index.ts
index 6b2decf..2ab4a5d 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -32,58 +32,14 @@ Vue.use(Router)
 
 export const constantRoutes: RouteConfig[] = [
   {
-    path: '/redirect',
-    component: Layout,
-    meta: { hidden: true },
-    children: [
-      {
-        path: '/redirect/:path*',
-        component: () => import(/* webpackChunkName: "redirect" */ '@/views/redirect/index.vue')
-      }
-    ]
-  },
-  {
     path: '/login',
-    component: () => import(/* webpackChunkName: "login" */ '@/views/login/index.vue'),
-    meta: { hidden: true }
-  },
-  {
-    path: '/auth-redirect',
-    component: () => import(/* webpackChunkName: "auth-redirect" */ '@/views/login/auth-redirect.vue'),
-    meta: { hidden: true }
-  },
-  {
-    path: '/404',
-    component: () => import(/* webpackChunkName: "404" */ '@/views/error-page/404.vue'),
-    meta: { hidden: true }
-  },
-  {
-    path: '/401',
-    component: () => import(/* webpackChunkName: "401" */ '@/views/error-page/401.vue'),
+    component: () => import('@/views/login/index.vue'),
     meta: { hidden: true }
   },
   {
     path: '/',
     component: Layout,
     redirect: '/schema/routes/list'
-  },
-  {
-    path: '/profile',
-    component: Layout,
-    redirect: '/profile/index',
-    meta: { hidden: true },
-    children: [
-      {
-        path: 'index',
-        component: () => import(/* webpackChunkName: "profile" */ '@/views/profile/index.vue'),
-        name: 'Profile',
-        meta: {
-          title: 'profile',
-          icon: 'user',
-          noCache: true
-        }
-      }
-    ]
   }
 ]
 
diff --git a/src/store/index.ts b/src/store/index.ts
index 51b079e..aa389a9 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -20,7 +20,6 @@ import Vuex from 'vuex'
 import { IAppState } from './modules/app'
 import { IUserState } from './modules/user'
 import { ITagsViewState } from './modules/tags-view'
-import { IErrorLogState } from './modules/error-log'
 import { IPermissionState } from './modules/permission'
 import { ISettingsState } from './modules/settings'
 
@@ -30,7 +29,6 @@ export interface IRootState {
   app: IAppState
   user: IUserState
   tagsView: ITagsViewState
-  errorLog: IErrorLogState
   permission: IPermissionState
   settings: ISettingsState
 }
diff --git a/src/store/modules/error-log.ts b/src/store/modules/error-log.ts
deleted file mode 100644
index dd0b058..0000000
--- a/src/store/modules/error-log.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { VuexModule, Module, Mutation, Action, getModule } from 'vuex-module-decorators'
-import store from '@/store'
-
-interface IErrorLog {
-  err: Error
-  vm: any
-  info: string
-  url: string
-}
-
-export interface IErrorLogState {
-  logs: IErrorLog[]
-}
-
-@Module({ dynamic: true, store, name: 'errorLog' })
-class ErrorLog extends VuexModule implements IErrorLogState {
-  public logs: IErrorLog[] = []
-
-  @Mutation
-  private ADD_ERROR_LOG(log: IErrorLog) {
-    this.logs.push(log)
-  }
-
-  @Mutation
-  private CLEAR_ERROR_LOG() {
-    this.logs.splice(0)
-  }
-
-  @Action
-  public AddErrorLog(log: IErrorLog) {
-    this.ADD_ERROR_LOG(log)
-  }
-
-  @Action
-  public ClearErrorLog() {
-    this.CLEAR_ERROR_LOG()
-  }
-}
-
-export const ErrorLogModule = getModule(ErrorLog)
diff --git a/src/utils/error-log.ts b/src/utils/error-log.ts
deleted file mode 100644
index d2d61c9..0000000
--- a/src/utils/error-log.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import Vue from 'vue'
-import { ErrorLogModule } from '@/store/modules/error-log'
-import { isArray } from '@/utils/validate'
-import settings from '@/settings'
-
-const { errorLog: needErrorLog } = settings
-
-const checkNeed = () => {
-  const env = process.env.NODE_ENV
-  if (isArray(needErrorLog) && env) {
-    return needErrorLog.includes(env)
-  }
-  return false
-}
-
-if (checkNeed()) {
-  Vue.config.errorHandler = function(err, vm, info) {
-    ErrorLogModule.AddErrorLog({
-      err,
-      vm,
-      info,
-      url: window.location.href
-    })
-  }
-}
diff --git a/src/views/dashboard/admin/components/BarChart.vue b/src/views/dashboard/admin/components/BarChart.vue
deleted file mode 100644
index b4ee42a..0000000
--- a/src/views/dashboard/admin/components/BarChart.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-<template>
-  <div
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from '@/components/Charts/mixins/resize'
-
-const animationDuration = 6000
-
-@Component({
-  name: 'BarChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: '100%' }) private width!: string
-  @Prop({ default: '300px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(this.$el as HTMLDivElement, 'macarons')
-    this.chart.setOption({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          type: 'shadow'
-        }
-      },
-      grid: {
-        top: 10,
-        left: '2%',
-        right: '2%',
-        bottom: '3%',
-        containLabel: true
-      },
-      xAxis: [{
-        type: 'category',
-        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-        axisTick: {
-          alignWithLabel: true
-        }
-      }],
-      yAxis: [{
-        type: 'value',
-        axisTick: {
-          show: false
-        }
-      }],
-      series: [{
-        name: 'pageA',
-        type: 'bar',
-        stack: 'vistors',
-        // barWidth: '60%',
-        data: [79, 52, 200, 334, 390, 330, 220],
-        animationDuration
-      }, {
-        name: 'pageB',
-        type: 'bar',
-        stack: 'vistors',
-        // barWidth: '60%',
-        data: [80, 52, 200, 334, 390, 330, 220],
-        animationDuration
-      }, {
-        name: 'pageC',
-        type: 'bar',
-        stack: 'vistors',
-        // barWidth: '60%',
-        data: [30, 52, 200, 334, 390, 330, 220],
-        animationDuration
-      }]
-    } as EChartOption<EChartOption.SeriesBar>)
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/components/BoxCard.vue b/src/views/dashboard/admin/components/BoxCard.vue
deleted file mode 100644
index fff9ecc..0000000
--- a/src/views/dashboard/admin/components/BoxCard.vue
+++ /dev/null
@@ -1,137 +0,0 @@
-<template>
-  <el-card
-    class="box-card-component"
-    style="margin-left:8px;"
-  >
-    <div
-      slot="header"
-      class="box-card-header"
-    >
-      <img src="https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png">
-    </div>
-    <div style="position:relative;">
-      <pan-thumb
-        :image="avatar"
-        class="panThumb"
-      />
-      <mallki
-        class="mallki-text"
-        text="vue-typescript-admin"
-      />
-      <div
-        style="padding-top:35px;"
-        class="progress-item"
-      >
-        <span>Vue</span>
-        <el-progress :percentage="51" />
-      </div>
-      <div class="progress-item">
-        <span>Typescript</span>
-        <el-progress :percentage="45" />
-      </div>
-      <div class="progress-item">
-        <span>Css</span>
-        <el-progress :percentage="4" />
-      </div>
-      <div class="progress-item">
-        <span>ESLint</span>
-        <el-progress
-          :percentage="100"
-          status="success"
-        />
-      </div>
-    </div>
-  </el-card>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-import { UserModule } from '@/store/modules/user'
-import PanThumb from '@/components/PanThumb/index.vue'
-import Mallki from '@/components/TextHoverEffect/Mallki.vue'
-
-@Component({
-  name: 'BoxCard',
-  components: {
-    PanThumb,
-    Mallki
-  }
-})
-export default class extends Vue {
-  get name() {
-    return UserModule.name
-  }
-
-  get avatar() {
-    return UserModule.avatar
-  }
-
-  get roles() {
-    return UserModule.roles
-  }
-}
-</script>
-
-<style lang="scss">
-.box-card-component {
-  .el-card__header {
-    padding: 0px!important;
-  }
-}
-
-.panThumb {
-  z-index: 100;
-  height: 70px!important;
-  width: 70px!important;
-  position: absolute!important;
-  top: -45px;
-  left: 0px;
-  border: 5px solid #ffffff;
-  background-color: #fff;
-  margin: auto;
-  box-shadow: none!important;
-
-  .pan-info {
-    box-shadow: none!important;
-  }
-}
-</style>
-
-<style lang="scss" scoped>
-.box-card-component {
-  .box-card-header {
-    position: relative;
-    height: 220px;
-
-    img {
-      width: 100%;
-      height: 100%;
-      transition: all 0.2s linear;
-
-      &:hover {
-        transform: scale(1.1, 1.1);
-        filter: contrast(130%);
-      }
-    }
-  }
-
-  .mallki-text {
-    position: absolute;
-    top: 0px;
-    right: 0px;
-    font-size: 20px;
-    font-weight: bold;
-  }
-
-  .progress-item {
-    margin-bottom: 10px;
-    font-size: 14px;
-  }
-
-  @media only screen and (max-width: 1510px){
-    .mallki-text{
-      display: none;
-    }
-  }
-}
-</style>
diff --git a/src/views/dashboard/admin/components/LineChart.vue b/src/views/dashboard/admin/components/LineChart.vue
deleted file mode 100644
index aba0dc9..0000000
--- a/src/views/dashboard/admin/components/LineChart.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-<template>
-  <div
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop, Watch } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from '@/components/Charts/mixins/resize'
-
-export interface ILineChartData {
-  expectedData: number[]
-  actualData: number[]
-}
-
-@Component({
-  name: 'LineChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: '100%' }) private width!: string
-  @Prop({ default: '350px' }) private height!: string
-  @Prop({ required: true }) private chartData!: ILineChartData
-
-  @Watch('chartData', { deep: true })
-  private onChartDataChange(value: ILineChartData) {
-    this.setOptions(value)
-  }
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(this.$el as HTMLDivElement, 'macarons')
-    this.setOptions(this.chartData)
-  }
-
-  private setOptions(chartData: ILineChartData) {
-    if (this.chart) {
-      this.chart.setOption({
-        xAxis: {
-          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-          boundaryGap: false,
-          axisTick: {
-            show: false
-          }
-        },
-        grid: {
-          left: 10,
-          right: 10,
-          bottom: 20,
-          top: 30,
-          containLabel: true
-        },
-        tooltip: {
-          trigger: 'axis',
-          axisPointer: {
-            type: 'cross'
-          },
-          padding: 8
-        },
-        yAxis: {
-          axisTick: {
-            show: false
-          }
-        },
-        legend: {
-          data: ['expected', 'actual']
-        },
-        series: [{
-          name: 'expected',
-          itemStyle: {
-            color: '#FF005A',
-            lineStyle: {
-              color: '#FF005A',
-              width: 2
-            }
-          },
-          smooth: true,
-          type: 'line',
-          data: chartData.expectedData,
-          animationDuration: 2800,
-          animationEasing: 'cubicInOut'
-        },
-        {
-          name: 'actual',
-          smooth: true,
-          type: 'line',
-          itemStyle: {
-            color: '#3888fa',
-            lineStyle: {
-              color: '#3888fa',
-              width: 2
-            },
-            areaStyle: {
-              color: '#f3f8ff'
-            }
-          },
-          data: chartData.actualData,
-          animationDuration: 2800,
-          animationEasing: 'quadraticOut'
-        }]
-      } as EChartOption<EChartOption.SeriesLine>)
-    }
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/components/PanelGroup.vue b/src/views/dashboard/admin/components/PanelGroup.vue
deleted file mode 100644
index 7e4329d..0000000
--- a/src/views/dashboard/admin/components/PanelGroup.vue
+++ /dev/null
@@ -1,250 +0,0 @@
-<template>
-  <el-row
-    :gutter="40"
-    class="panel-group"
-  >
-    <el-col
-      :xs="12"
-      :sm="12"
-      :lg="6"
-      class="card-panel-col"
-    >
-      <div
-        class="card-panel"
-        @click="handleSetLineChartData('newVisitis')"
-      >
-        <div class="card-panel-icon-wrapper icon-people">
-          <svg-icon
-            name="peoples"
-            class="card-panel-icon"
-          />
-        </div>
-        <div class="card-panel-description">
-          <div class="card-panel-text">
-            New Visits
-          </div>
-          <count-to
-            :start-val="0"
-            :end-val="102400"
-            :duration="2600"
-            class="card-panel-num"
-          />
-        </div>
-      </div>
-    </el-col>
-    <el-col
-      :xs="12"
-      :sm="12"
-      :lg="6"
-      class="card-panel-col"
-    >
-      <div
-        class="card-panel"
-        @click="handleSetLineChartData('messages')"
-      >
-        <div class="card-panel-icon-wrapper icon-message">
-          <svg-icon
-            name="message"
-            class="card-panel-icon"
-          />
-        </div>
-        <div class="card-panel-description">
-          <div class="card-panel-text">
-            Messages
-          </div>
-          <count-to
-            :start-val="0"
-            :end-val="81212"
-            :duration="3000"
-            class="card-panel-num"
-          />
-        </div>
-      </div>
-    </el-col>
-    <el-col
-      :xs="12"
-      :sm="12"
-      :lg="6"
-      class="card-panel-col"
-    >
-      <div
-        class="card-panel"
-        @click="handleSetLineChartData('purchases')"
-      >
-        <div class="card-panel-icon-wrapper icon-money">
-          <svg-icon
-            name="money"
-            class="card-panel-icon"
-          />
-        </div>
-        <div class="card-panel-description">
-          <div class="card-panel-text">
-            Purchases
-          </div>
-          <count-to
-            :start-val="0"
-            :end-val="9280"
-            :duration="3200"
-            class="card-panel-num"
-          />
-        </div>
-      </div>
-    </el-col>
-    <el-col
-      :xs="12"
-      :sm="12"
-      :lg="6"
-      class="card-panel-col"
-    >
-      <div
-        class="card-panel"
-        @click="handleSetLineChartData('shoppings')"
-      >
-        <div class="card-panel-icon-wrapper icon-shopping">
-          <svg-icon
-            name="shopping"
-            class="card-panel-icon"
-          />
-        </div>
-        <div class="card-panel-description">
-          <div class="card-panel-text">
-            Shoppings
-          </div>
-          <count-to
-            :start-val="0"
-            :end-val="13600"
-            :duration="3600"
-            class="card-panel-num"
-          />
-        </div>
-      </div>
-    </el-col>
-  </el-row>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-import CountTo from 'vue-count-to'
-
-@Component({
-  name: 'PanelGroup',
-  components: {
-    CountTo
-  }
-})
-export default class extends Vue {
-  private handleSetLineChartData(type: string) {
-    this.$emit('handleSetLineChartData', type)
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.panel-group {
-  margin-top: 18px;
-
-  .card-panel-col {
-    margin-bottom: 32px;
-  }
-
-  .card-panel {
-    height: 108px;
-    cursor: pointer;
-    font-size: 12px;
-    position: relative;
-    overflow: hidden;
-    color: #666;
-    background: #fff;
-    box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);
-    border-color: rgba(0, 0, 0, .05);
-
-    &:hover {
-      .card-panel-icon-wrapper {
-        color: #fff;
-      }
-
-      .icon-people {
-         background: #40c9c6;
-      }
-
-      .icon-message {
-        background: #36a3f7;
-      }
-
-      .icon-money {
-        background: #f4516c;
-      }
-
-      .icon-shopping {
-        background: #34bfa3
-      }
-    }
-
-    .icon-people {
-      color: #40c9c6;
-    }
-
-    .icon-message {
-      color: #36a3f7;
-    }
-
-    .icon-money {
-      color: #f4516c;
-    }
-
-    .icon-shopping {
-      color: #34bfa3
-    }
-
-    .card-panel-icon-wrapper {
-      float: left;
-      margin: 14px 0 0 14px;
-      padding: 16px;
-      transition: all 0.38s ease-out;
-      border-radius: 6px;
-    }
-
-    .card-panel-icon {
-      float: left;
-      font-size: 48px;
-    }
-
-    .card-panel-description {
-      float: right;
-      font-weight: bold;
-      margin: 26px;
-      margin-left: 0px;
-
-      .card-panel-text {
-        line-height: 18px;
-        color: rgba(0, 0, 0, 0.45);
-        font-size: 16px;
-        margin-bottom: 12px;
-      }
-
-      .card-panel-num {
-        font-size: 20px;
-      }
-    }
-  }
-}
-
-@media (max-width:550px) {
-  .card-panel-description {
-    display: none;
-  }
-
-  .card-panel-icon-wrapper {
-    float: none !important;
-    width: 100%;
-    height: 100%;
-    margin: 0 !important;
-
-    .svg-icon {
-      display: block;
-      margin: 14px auto !important;
-      float: none !important;
-    }
-  }
-}
-</style>
diff --git a/src/views/dashboard/admin/components/PieChart.vue b/src/views/dashboard/admin/components/PieChart.vue
deleted file mode 100644
index 67eb364..0000000
--- a/src/views/dashboard/admin/components/PieChart.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
-  <div
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from '@/components/Charts/mixins/resize'
-
-@Component({
-  name: 'PieChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: '100%' }) private width!: string
-  @Prop({ default: '300px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(this.$el as HTMLDivElement, 'macarons')
-    this.chart.setOption({
-      tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b} : {c} ({d}%)'
-      },
-      legend: {
-        left: 'center',
-        bottom: '10',
-        data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts']
-      },
-      series: [
-        {
-          name: 'WEEKLY WRITE ARTICLES',
-          type: 'pie',
-          roseType: 'radius',
-          radius: [15, 95],
-          center: ['50%', '38%'],
-          data: [
-            { value: 320, name: 'Industries' },
-            { value: 240, name: 'Technology' },
-            { value: 149, name: 'Forex' },
-            { value: 100, name: 'Gold' },
-            { value: 59, name: 'Forecasts' }
-          ],
-          animationEasing: 'cubicInOut',
-          animationDuration: 2600
-        }
-      ]
-    } as EChartOption<EChartOption.SeriesPie>)
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/components/RadarChart.vue b/src/views/dashboard/admin/components/RadarChart.vue
deleted file mode 100644
index 15ff0ec..0000000
--- a/src/views/dashboard/admin/components/RadarChart.vue
+++ /dev/null
@@ -1,104 +0,0 @@
-<template>
-  <div
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from '@/components/Charts/mixins/resize'
-
-const animationDuration = 3000
-
-@Component({
-  name: 'RadarChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: '100%' }) private width!: string
-  @Prop({ default: '300px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(this.$el as HTMLDivElement, 'macarons')
-    this.chart.setOption({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          type: 'shadow'
-        }
-      },
-      radar: {
-        radius: '66%',
-        center: ['50%', '42%'],
-        splitNumber: 8,
-        splitArea: {
-          areaStyle: {
-            color: 'rgba(127,95,132,.3)',
-            opacity: 1,
-            shadowBlur: 45,
-            shadowColor: 'rgba(0,0,0,.5)',
-            shadowOffsetX: 0,
-            shadowOffsetY: 15
-          }
-        },
-        indicator: [
-          { name: 'Sales', max: 10000 },
-          { name: 'Administration', max: 20000 },
-          { name: 'Information Techology', max: 20000 },
-          { name: 'Customer Support', max: 20000 },
-          { name: 'Development', max: 20000 },
-          { name: 'Marketing', max: 20000 }
-        ]
-      },
-      legend: {
-        left: 'center',
-        bottom: '10',
-        data: ['Allocated Budget', 'Expected Spending', 'Actual Spending']
-      },
-      series: [{
-        type: 'radar',
-        symbolSize: 0,
-        areaStyle: {
-          shadowBlur: 13,
-          shadowColor: 'rgba(0,0,0,.2)',
-          shadowOffsetX: 0,
-          shadowOffsetY: 10,
-          opacity: 1
-        },
-        data: [
-          {
-            value: [5000, 7000, 12000, 11000, 15000, 14000],
-            name: 'Allocated Budget'
-          },
-          {
-            value: [4000, 9000, 15000, 15000, 13000, 11000],
-            name: 'Expected Spending'
-          },
-          {
-            value: [5500, 11000, 12000, 15000, 12000, 12000],
-            name: 'Actual Spending'
-          }
-        ],
-        animationDuration: animationDuration
-      }]
-    } as EChartOption<EChartOption.SeriesRadar>)
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/components/TodoList/Todo.vue b/src/views/dashboard/admin/components/TodoList/Todo.vue
deleted file mode 100644
index f7c4f32..0000000
--- a/src/views/dashboard/admin/components/TodoList/Todo.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-<template>
-  <li
-    :class="{completed: todo.done, editing: editing}"
-    class="todo"
-  >
-    <div class="view">
-      <input
-        :checked="todo.done"
-        class="toggle"
-        type="checkbox"
-        @change="toggleTodo( todo)"
-      >
-      <label
-        @dblclick="editing = true"
-        v-text="todo.text"
-      />
-      <button
-        class="destroy"
-        @click="deleteTodo( todo )"
-      />
-    </div>
-    <input
-      v-show="editing"
-      v-focus="editing"
-      :value="todo.text"
-      class="edit"
-      @keyup.enter="doneEdit"
-      @keyup.esc="cancelEdit"
-      @blur="doneEdit"
-    >
-  </li>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-
-export interface ITodo {
-  text: string
-  done: boolean
-}
-
-@Component({
-  name: 'TodoDemo',
-  directives: {
-    focus: (el, { value }, { context }) => {
-      if (value) {
-        if (context) {
-          context.$nextTick(() => {
-            el.focus()
-          })
-        }
-      }
-    }
-  }
-})
-export default class extends Vue {
-  @Prop({ default: { text: '', done: false } }) private todo!: ITodo
-
-  private editing = false
-
-  private deleteTodo(todo: ITodo) {
-    this.$emit('deleteTodo', todo)
-  }
-
-  private editTodo({ todo, value }: { todo: ITodo, value: string }) {
-    this.$emit('editTodo', { todo, value })
-  }
-
-  private toggleTodo(todo: ITodo) {
-    this.$emit('toggleTodo', todo)
-  }
-
-  private doneEdit(e: KeyboardEvent) {
-    const value = (e.target as HTMLInputElement).value.trim()
-    const { todo } = this
-    if (!value) {
-      this.deleteTodo(todo)
-    } else if (this.editing) {
-      this.editTodo({
-        todo,
-        value
-      })
-      this.editing = false
-    }
-  }
-
-  private cancelEdit(e: KeyboardEvent) {
-    (e.target as HTMLInputElement).value = this.todo.text
-    this.editing = false
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/components/TodoList/index.vue b/src/views/dashboard/admin/components/TodoList/index.vue
deleted file mode 100644
index 1e05cc8..0000000
--- a/src/views/dashboard/admin/components/TodoList/index.vue
+++ /dev/null
@@ -1,528 +0,0 @@
-<template>
-  <section class="todoapp">
-    <!-- header -->
-    <header class="header">
-      <input
-        class="new-todo"
-        autocomplete="off"
-        placeholder="Todo List"
-        @keyup.enter="addTodo"
-      >
-    </header>
-    <!-- main section -->
-    <section
-      v-show="todos.length"
-      class="main"
-    >
-      <input
-        id="toggle-all"
-        :checked="allChecked"
-        class="toggle-all"
-        type="checkbox"
-        @change="toggleAll({done: !allChecked})"
-      >
-      <label for="toggle-all" />
-      <ul class="todo-list">
-        <todo
-          v-for="(todo, index) in filteredTodos"
-          :key="index"
-          :todo="todo"
-          @toggleTodo="toggleTodo"
-          @editTodo="editTodo"
-          @deleteTodo="deleteTodo"
-        />
-      </ul>
-    </section>
-    <!-- footer -->
-    <footer
-      v-show="todos.length"
-      class="footer"
-    >
-      <span class="todo-count">
-        <strong>{{ remaining }}</strong>
-        {{ remaining | pluralize('item') }} left
-      </span>
-      <ul class="filters">
-        <li
-          v-for="(val, key) in filters"
-          :key="key"
-        >
-          <a
-            :class="{selected: visibility === key}"
-            @click.prevent="visibility = key"
-          >{{ key | capitalize }}</a>
-        </li>
-      </ul>
-      <!-- <button class="clear-completed" v-show="todos.length > remaining" @click="clearCompleted">
-        Clear completed
-      </button> -->
-    </footer>
-  </section>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import Todo, { ITodo } from './Todo.vue'
-
-const STORAGE_KEY = 'todos'
-const filters: { [ key: string ]: Function } = {
-  all: (todos: ITodo[]) => todos,
-  active: (todos: ITodo[]) => todos.filter(todo => !todo.done),
-  completed: (todos: ITodo[]) => todos.filter(todo => todo.done)
-}
-const defalutList = [
-  { text: 'star this repository', done: false },
-  { text: 'fork this repository', done: false },
-  { text: 'follow author', done: false },
-  { text: 'vue-element-admin', done: true },
-  { text: 'vue', done: true },
-  { text: 'element-ui', done: true },
-  { text: 'axios', done: true },
-  { text: 'webpack', done: true }
-]
-
-@Component({
-  name: 'TodoList',
-  components: {
-    Todo
-  },
-  filters: {
-    pluralize: (n: number, s: string) => n === 1 ? s : s + 's',
-    capitalize: (s: string) => s.charAt(0).toUpperCase() + s.slice(1)
-  }
-})
-export default class extends Vue {
-  private visibility = 'all'
-  private todos = defalutList
-
-  get allChecked() {
-    return this.todos.every(todo => todo.done)
-  }
-
-  get filters() {
-    return filters
-  }
-
-  get filteredTodos() {
-    return filters[this.visibility](this.todos)
-  }
-
-  get remaining() {
-    return this.todos.filter(todo => !todo.done).length
-  }
-
-  private setLocalStorage() {
-    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(this.todos))
-  }
-
-  private addTodo(e: KeyboardEvent) {
-    const text = (e.target as HTMLInputElement).value
-    if (text.trim()) {
-      this.todos.push({
-        text,
-        done: false
-      })
-      this.setLocalStorage()
-    }
-    (e as any).target.value = ''
-  }
-
-  private toggleTodo(todo: ITodo) {
-    todo.done = !todo.done
-    this.setLocalStorage()
-  }
-
-  private deleteTodo(todo: ITodo) {
-    this.todos.splice(this.todos.indexOf(todo), 1)
-    this.setLocalStorage()
-  }
-
-  private editTodo({ todo, value }: { todo: ITodo, value: string }) {
-    todo.text = value
-    this.setLocalStorage()
-  }
-
-  private clearCompleted() {
-    this.todos = this.todos.filter(todo => !todo.done)
-    this.setLocalStorage()
-  }
-
-  private toggleAll({ done }: { done: boolean }) {
-    this.todos.forEach(todo => {
-      todo.done = done
-      this.setLocalStorage()
-    })
-  }
-}
-</script>
-
-<style lang="scss" scope>
-.todoapp {
-  font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  line-height: 1.4em;
-  color: #4d4d4d;
-  min-width: 230px;
-  max-width: 550px;
-  margin: 0 auto ;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  font-weight: 300;
-  background: #fff;
-  z-index: 1;
-  position: relative;
-
-  button {
-    margin: 0;
-    padding: 0;
-    border: 0;
-    background: none;
-    font-size: 100%;
-    vertical-align: baseline;
-    font-family: inherit;
-    font-weight: inherit;
-    color: inherit;
-    -webkit-appearance: none;
-    appearance: none;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-  }
-
-  :focus {
-    outline: 0;
-  }
-
-  .hidden {
-    display: none;
-  }
-
-  .todoapp {
-    background: #fff;
-    margin: 130px 0 40px 0;
-    position: relative;
-    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
-  }
-
-  .todoapp input::-webkit-input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-  }
-
-  .todoapp input::-moz-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-  }
-
-  .todoapp input::input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-  }
-
-  .todoapp h1 {
-    position: absolute;
-    top: -155px;
-    width: 100%;
-    font-size: 100px;
-    font-weight: 100;
-    text-align: center;
-    color: rgba(175, 47, 47, 0.15);
-    -webkit-text-rendering: optimizeLegibility;
-    -moz-text-rendering: optimizeLegibility;
-    text-rendering: optimizeLegibility;
-  }
-
-  .new-todo,
-  .edit {
-    position: relative;
-    margin: 0;
-    width: 100%;
-    font-size: 18px;
-    font-family: inherit;
-    font-weight: inherit;
-    line-height: 1.4em;
-    border: 0;
-    color: inherit;
-    padding: 6px;
-    border: 1px solid #999;
-    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
-    box-sizing: border-box;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-  }
-
-  .new-todo {
-    padding: 10px 16px 16px 60px;
-    border: none;
-    background: rgba(0, 0, 0, 0.003);
-    box-shadow: inset 0 -2px 1px rgba(0, 0, 0, 0.03);
-  }
-
-  .main {
-    position: relative;
-    z-index: 2;
-    border-top: 1px solid #e6e6e6;
-  }
-
-  .toggle-all {
-    text-align: center;
-    border: none;
-    /* Mobile Safari */
-    opacity: 0;
-    position: absolute;
-  }
-
-  .toggle-all+label {
-    width: 60px;
-    height: 34px;
-    font-size: 0;
-    position: absolute;
-    top: -52px;
-    left: -13px;
-    -webkit-transform: rotate(90deg);
-    transform: rotate(90deg);
-  }
-
-  .toggle-all+label:before {
-    content: '❯';
-    font-size: 22px;
-    color: #e6e6e6;
-    padding: 10px 27px 10px 27px;
-  }
-
-  .toggle-all:checked+label:before {
-    color: #737373;
-  }
-
-  .todo-list {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-  }
-
-  .todo-list li {
-    position: relative;
-    font-size: 24px;
-    border-bottom: 1px solid #ededed;
-  }
-
-  .todo-list li:last-child {
-    border-bottom: none;
-  }
-
-  .todo-list li.editing {
-    border-bottom: none;
-    padding: 0;
-  }
-
-  .todo-list li.editing .edit {
-    display: block;
-    width: 506px;
-    padding: 12px 16px;
-    margin: 0 0 0 43px;
-  }
-
-  .todo-list li.editing .view {
-    display: none;
-  }
-
-  .todo-list li .toggle {
-    text-align: center;
-    width: 40px;
-    /* auto, since non-WebKit browsers doesn't support input styling */
-    height: auto;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto 0;
-    border: none;
-    /* Mobile Safari */
-    -webkit-appearance: none;
-    appearance: none;
-  }
-
-  .todo-list li .toggle {
-    opacity: 0;
-  }
-
-  .todo-list li .toggle+label {
-    /*
-    Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
-    IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
-  */
-    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
-    background-repeat: no-repeat;
-    background-position: center left;
-    background-size: 36px;
-  }
-
-  .todo-list li .toggle:checked+label {
-    background-size: 36px;
-    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
-  }
-
-  .todo-list li label {
-    word-break: break-all;
-    padding: 15px 15px 15px 50px;
-    display: block;
-    line-height: 1.0;
-        font-size: 14px;
-    transition: color 0.4s;
-  }
-
-  .todo-list li.completed label {
-    color: #d9d9d9;
-    text-decoration: line-through;
-  }
-
-  .todo-list li .destroy {
-    display: none;
-    position: absolute;
-    top: 0;
-    right: 10px;
-    bottom: 0;
-    width: 40px;
-    height: 40px;
-    margin: auto 0;
-    font-size: 30px;
-    color: #cc9a9a;
-    transition: color 0.2s ease-out;
-    cursor: pointer;
-  }
-
-  .todo-list li .destroy:hover {
-    color: #af5b5e;
-  }
-
-  .todo-list li .destroy:after {
-    content: '×';
-  }
-
-  .todo-list li:hover .destroy {
-    display: block;
-  }
-
-  .todo-list li .edit {
-    display: none;
-  }
-
-  .todo-list li.editing:last-child {
-    margin-bottom: -1px;
-  }
-
-  .footer {
-    color: #777;
-    position: relative;
-    padding: 10px 15px;
-    height: 40px;
-    text-align: center;
-    border-top: 1px solid #e6e6e6;
-  }
-
-  .footer:before {
-    content: '';
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    height: 40px;
-    overflow: hidden;
-    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 8px 0 -3px #f6f6f6, 0 9px 1px -3px rgba(0, 0, 0, 0.2), 0 16px 0 -6px #f6f6f6, 0 17px 2px -6px rgba(0, 0, 0, 0.2);
-  }
-
-  .todo-count {
-    float: left;
-    text-align: left;
-  }
-
-  .todo-count strong {
-    font-weight: 300;
-  }
-
-  .filters {
-    margin: 0;
-    padding: 0;
-    position: relative;
-    z-index: 1;
-    list-style: none;
-  }
-
-  .filters li {
-    display: inline;
-  }
-
-  .filters li a {
-    color: inherit;
-    font-size: 12px;
-    padding: 3px 7px;
-    text-decoration: none;
-    border: 1px solid transparent;
-    border-radius: 3px;
-  }
-
-  .filters li a:hover {
-    border-color: rgba(175, 47, 47, 0.1);
-  }
-
-  .filters li a.selected {
-    border-color: rgba(175, 47, 47, 0.2);
-  }
-
-  .clear-completed,
-  html .clear-completed:active {
-    float: right;
-    position: relative;
-    line-height: 20px;
-    text-decoration: none;
-    cursor: pointer;
-  }
-
-  .clear-completed:hover {
-    text-decoration: underline;
-  }
-
-  .info {
-    margin: 65px auto 0;
-    color: #bfbfbf;
-    font-size: 10px;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-    text-align: center;
-  }
-
-  .info p {
-    line-height: 1;
-  }
-
-  .info a {
-    color: inherit;
-    text-decoration: none;
-    font-weight: 400;
-  }
-
-  .info a:hover {
-    text-decoration: underline;
-  }
-
-  /*
-  Hack to remove background from Mobile Safari.
-  Can't use it globally since it destroys checkboxes in Firefox
-*/
-  @media screen and (-webkit-min-device-pixel-ratio:0) {
-    .toggle-all,
-    .todo-list li .toggle {
-      background: none;
-    }
-
-    .todo-list li .toggle {
-      height: 40px;
-    }
-  }
-
-  @media (max-width: 430px) {
-    .footer {
-      height: 50px;
-    }
-  }
-}
-</style>
diff --git a/src/views/dashboard/admin/components/TransactionTable.vue b/src/views/dashboard/admin/components/TransactionTable.vue
deleted file mode 100644
index c004128..0000000
--- a/src/views/dashboard/admin/components/TransactionTable.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<template>
-  <el-table
-    :data="list"
-    style="width: 100%;padding-top: 15px;"
-  >
-    <el-table-column
-      label="OrderID"
-      min-width="200"
-    >
-      <template slot-scope="scope">
-        {{ scope.row.orderId | orderNoFilter }}
-      </template>
-    </el-table-column>
-    <el-table-column
-      label="Price"
-      width="195"
-      align="center"
-    >
-      <template slot-scope="scope">
-        ¥{{ scope.row.price | toThousandFilter }}
-      </template>
-    </el-table-column>
-    <el-table-column
-      label="Status"
-      width="100"
-      align="center"
-    >
-      <template slot-scope="{row}">
-        <el-tag :type="row.status | transactionStatusFilter">
-          {{ row.status }}
-        </el-tag>
-      </template>
-    </el-table-column>
-  </el-table>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { getTransactions } from '@/api/transactions'
-import { ITransactionData } from '@/api/types'
-
-@Component({
-  name: 'TransactionTable',
-  filters: {
-    transactionStatusFilter: (status: string) => {
-      const statusMap: { [key: string]: string } = {
-        success: 'success',
-        pending: 'danger'
-      }
-      return statusMap[status]
-    },
-    orderNoFilter: (str: string) => str.substring(0, 30),
-    // Input 10000 => Output "10,000"
-    toThousandFilter: (num: number) => {
-      return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
-    }
-  }
-})
-export default class extends Vue {
-  private list: ITransactionData[] = []
-
-  created() {
-    this.fetchData()
-  }
-
-  private async fetchData() {
-    const { data } = await getTransactions({ /* Your params here */ })
-    this.list = data.items.slice(0, 8)
-  }
-}
-</script>
diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue
deleted file mode 100644
index 28b5f41..0000000
--- a/src/views/dashboard/admin/index.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-<template>
-  <div class="dashboard-editor-container">
-    <github-corner class="github-corner" />
-
-    <panel-group @handleSetLineChartData="handleSetLineChartData" />
-
-    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
-      <line-chart :chart-data="lineChartData" />
-    </el-row>
-
-    <el-row :gutter="32">
-      <el-col
-        :xs="24"
-        :sm="24"
-        :lg="8"
-      >
-        <div class="chart-wrapper">
-          <radar-chart />
-        </div>
-      </el-col>
-      <el-col
-        :xs="24"
-        :sm="24"
-        :lg="8"
-      >
-        <div class="chart-wrapper">
-          <pie-chart />
-        </div>
-      </el-col>
-      <el-col
-        :xs="24"
-        :sm="24"
-        :lg="8"
-      >
-        <div class="chart-wrapper">
-          <bar-chart />
-        </div>
-      </el-col>
-    </el-row>
-
-    <el-row :gutter="8">
-      <el-col
-        :xs="{span: 24}"
-        :sm="{span: 24}"
-        :md="{span: 24}"
-        :lg="{span: 12}"
-        :xl="{span: 12}"
-        style="padding-right:8px;margin-bottom:30px;"
-      >
-        <transaction-table />
-      </el-col>
-      <el-col
-        :xs="{span: 24}"
-        :sm="{span: 12}"
-        :md="{span: 12}"
-        :lg="{span: 6}"
-        :xl="{span: 6}"
-        style="margin-bottom:30px;"
-      >
-        <todo-list />
-      </el-col>
-      <el-col
-        :xs="{span: 24}"
-        :sm="{span: 12}"
-        :md="{span: 12}"
-        :lg="{span: 6}"
-        :xl="{span: 6}"
-        style="margin-bottom:30px;"
-      >
-        <box-card />
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script lang="ts">
-import 'echarts/theme/macarons.js' // Theme used in BarChart, LineChart, PieChart and RadarChart
-import { Component, Vue } from 'vue-property-decorator'
-import { UserModule } from '@/store/modules/user'
-import GithubCorner from '@/components/GithubCorner/index.vue'
-import BarChart from './components/BarChart.vue'
-import BoxCard from './components/BoxCard.vue'
-import LineChart, { ILineChartData } from './components/LineChart.vue'
-import PanelGroup from './components/PanelGroup.vue'
-import PieChart from './components/PieChart.vue'
-import RadarChart from './components/RadarChart.vue'
-import TodoList from './components/TodoList/index.vue'
-import TransactionTable from './components/TransactionTable.vue'
-
-const lineChartData: { [type: string]: ILineChartData } = {
-  newVisitis: {
-    expectedData: [100, 120, 161, 134, 105, 160, 165],
-    actualData: [120, 82, 91, 154, 162, 140, 145]
-  },
-  messages: {
-    expectedData: [200, 192, 120, 144, 160, 130, 140],
-    actualData: [180, 160, 151, 106, 145, 150, 130]
-  },
-  purchases: {
-    expectedData: [80, 100, 121, 104, 105, 90, 100],
-    actualData: [120, 90, 100, 138, 142, 130, 130]
-  },
-  shoppings: {
-    expectedData: [130, 140, 141, 142, 145, 150, 160],
-    actualData: [120, 82, 91, 154, 162, 140, 130]
-  }
-}
-
-@Component({
-  name: 'DashboardAdmin',
-  components: {
-    GithubCorner,
-    BarChart,
-    BoxCard,
-    LineChart,
-    PanelGroup,
-    PieChart,
-    RadarChart,
-    TodoList,
-    TransactionTable
-  }
-})
-export default class extends Vue {
-  private lineChartData = lineChartData.newVisitis
-
-  private handleSetLineChartData(type: string) {
-    this.lineChartData = lineChartData[type]
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.dashboard-editor-container {
-  padding: 32px;
-  background-color: rgb(240, 242, 245);
-  position: relative;
-
-  .github-corner {
-    position: absolute;
-    top: 0px;
-    border: 0;
-    right: 0;
-  }
-
-  .chart-wrapper {
-    background: #fff;
-    padding: 16px 16px 0;
-    margin-bottom: 32px;
-  }
-}
-
-@media (max-width:1024px) {
-  .chart-wrapper {
-    padding: 8px;
-  }
-}
-</style>
diff --git a/src/views/dashboard/editor/index.vue b/src/views/dashboard/editor/index.vue
deleted file mode 100644
index 79bdb79..0000000
--- a/src/views/dashboard/editor/index.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-<template>
-  <div class="dashboard-editor-container">
-    <div class="clearfix">
-      <pan-thumb
-        :image="avatar"
-        style="float: left"
-      >
-        Your roles:
-        <span
-          v-for="item in roles"
-          :key="item"
-          class="info-roles"
-        >{{ item }}</span>
-      </pan-thumb>
-      <github-corner style="position: absolute; top: 0px; border: 0; right: 0;" />
-      <div class="info-container">
-        <span class="display_name">{{ name }}</span>
-        <span style="font-size:20px;padding-top:20px;display:inline-block;">Editor's Dashboard</span>
-      </div>
-    </div>
-    <div>
-      <img
-        :src="emptyGif"
-        class="emptyGif"
-      >
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { UserModule } from '@/store/modules/user'
-import PanThumb from '@/components/PanThumb/index.vue'
-import GithubCorner from '@/components/GithubCorner/index.vue'
-
-@Component({
-  name: 'DashboardEditor',
-  components: {
-    PanThumb,
-    GithubCorner
-  }
-})
-export default class extends Vue {
-  private emptyGif = 'https://wpimg.wallstcn.com/0e03b7da-db9e-4819-ba10-9016ddfdaed3'
-
-  get name() {
-    return UserModule.name
-  }
-
-  get avatar() {
-    return UserModule.avatar
-  }
-
-  get roles() {
-    return UserModule.roles
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.emptyGif {
-  display: block;
-  width: 45%;
-  margin: 0 auto;
-}
-
-.dashboard-editor-container {
-  background-color: #e3e3e3;
-  min-height: 100vh;
-  padding: 50px 60px 0px;
-
-  .info-roles {
-    font-size: 12px;
-    font-weight: 700;
-    color: #333;
-    display: block;
-  }
-
-  .info-container {
-    position: relative;
-    margin-left: 190px;
-    height: 150px;
-    line-height: 200px;
-
-    .display_name {
-      font-size: 48px;
-      line-height: 48px;
-      color: #212121;
-      position: absolute;
-      top: 25px;
-    }
-  }
-}
-</style>
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
deleted file mode 100644
index 3208b3c..0000000
--- a/src/views/dashboard/index.vue
+++ /dev/null
@@ -1,33 +0,0 @@
-<template>
-  <div class="dashboard-container">
-    <component :is="currentRole" />
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { UserModule } from '@/store/modules/user'
-import AdminDashboard from './admin/index.vue'
-import EditorDashboard from './editor/index.vue'
-
-@Component({
-  name: 'Dashboard',
-  components: {
-    AdminDashboard,
-    EditorDashboard
-  }
-})
-export default class extends Vue {
-  private currentRole = 'admin-dashboard'
-
-  get roles() {
-    return UserModule.roles
-  }
-
-  created() {
-    if (!this.roles.includes('admin')) {
-      this.currentRole = 'editor-dashboard'
-    }
-  }
-}
-</script>
diff --git a/src/views/error-page/401.vue b/src/views/error-page/401.vue
deleted file mode 100644
index 69868d7..0000000
--- a/src/views/error-page/401.vue
+++ /dev/null
@@ -1,148 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="errPage-container">
-    <el-button
-      icon="arrow-left"
-      class="back-btn"
-      @click="back"
-    >
-      返回
-    </el-button>
-    <el-row>
-      <el-col :span="12">
-        <h1 class="text-jumbo text-ginormous">
-          Oops!
-        </h1>
-        gif来源<a
-          href="https://zh.airbnb.com/"
-          target="_blank"
-        >airbnb</a> 页面
-        <h2>你没有权限去该页面</h2>
-        <h6>如有不满请联系你领导</h6>
-        <ul class="list-unstyled">
-          <li>或者你可以去:</li>
-          <li class="link-type">
-            <router-link to="/dashboard">
-              回首页
-            </router-link>
-          </li>
-          <li class="link-type">
-            <a href="https://github.com/armour">随便看看</a>
-          </li>
-          <li>
-            <a
-              href="#"
-              @click.prevent="dialogVisible=true"
-            >点我看图</a>
-          </li>
-        </ul>
-      </el-col>
-      <el-col :span="12">
-        <img
-          :src="errGif"
-          class="some-gif"
-          width="313"
-          height="428"
-          alt="Girl has dropped her ice cream."
-        >
-      </el-col>
-    </el-row>
-    <el-dialog
-      :visible.sync="dialogVisible"
-      title="随便看"
-    >
-      <img
-        :src="ewizardClap"
-        class="some-img"
-      >
-    </el-dialog>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import errGif from '@/assets/401-images/401.gif'
-
-@Component({
-  name: 'Page401'
-})
-export default class extends Vue {
-  private errGif = errGif + '?' + +new Date()
-  private ewizardClap = 'https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646'
-  private dialogVisible = false
-
-  private back() {
-    if (this.$route.query.noGoBack) {
-      this.$router.push({ path: '/dashboard' })
-    } else {
-      this.$router.go(-1)
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.errPage-container {
-  width: 800px;
-  max-width: 100%;
-  margin: 100px auto;
-
-  .back-btn {
-    background: #008489;
-    color: #fff;
-    border: none!important;
-  }
-
-  .some-gif {
-    margin: 0 auto;
-    display: block;
-  }
-
-  .some-img {
-    display: block;
-    margin: 0 auto;
-    width: 100%;
-  }
-
-  .text-jumbo {
-    font-size: 60px;
-    font-weight: 700;
-    color: #484848;
-  }
-
-  .list-unstyled {
-    font-size: 14px;
-
-    li {
-      padding-bottom: 5px;
-    }
-
-    a {
-      color: #008489;
-      text-decoration: none;
-
-      &:hover {
-        text-decoration: underline;
-      }
-    }
-  }
-}
-</style>
diff --git a/src/views/error-page/404.vue b/src/views/error-page/404.vue
deleted file mode 100644
index 5cac495..0000000
--- a/src/views/error-page/404.vue
+++ /dev/null
@@ -1,302 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="wscn-http404-container">
-    <div class="wscn-http404">
-      <div class="pic-404">
-        <img
-          class="pic-404__parent"
-          src="@/assets/404-images/404.png"
-          alt="404"
-        >
-        <img
-          class="pic-404__child left"
-          src="@/assets/404-images/404-cloud.png"
-          alt="404"
-        >
-        <img
-          class="pic-404__child mid"
-          src="@/assets/404-images/404-cloud.png"
-          alt="404"
-        >
-        <img
-          class="pic-404__child right"
-          src="@/assets/404-images/404-cloud.png"
-          alt="404"
-        >
-      </div>
-      <div class="text-404">
-        <div class="text-404__oops">
-          OOPS!
-        </div>
-        <div class="text-404__info">
-          All rights reserved
-          <a
-            style="color:#20a0ff"
-            href="https://wallstreetcn.com"
-            target="_blank"
-          >wallstreetcn</a>
-        </div>
-        <div class="text-404__headline">
-          {{ message }}
-        </div>
-        <div class="text-404__info">
-          Please check that the URL you entered is correct, or click the button below to return to the homepage.
-        </div>
-        <a
-          href=""
-          class="text-404__return-home"
-        >Back to home</a>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'Page404'
-})
-export default class extends Vue {
-  private message = '404 Page Not Found'
-}
-</script>
-
-<style lang="scss" scoped>
-.wscn-http404-container {
-  transform: translate(-50%,-50%);
-  position: absolute;
-  top: 40%;
-  left: 50%;
-}
-
-.wscn-http404 {
-  position: relative;
-  width: 1200px;
-  padding: 0 50px;
-  overflow: hidden;
-
-  .pic-404 {
-    position: relative;
-    float: left;
-    width: 600px;
-    overflow: hidden;
-
-    &__parent {
-      width: 100%;
-    }
-
-    &__child {
-      position: absolute;
-
-      &.left {
-        width: 80px;
-        top: 17px;
-        left: 220px;
-        opacity: 0;
-        animation-name: cloudLeft;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1s;
-      }
-
-      &.mid {
-        width: 46px;
-        top: 10px;
-        left: 420px;
-        opacity: 0;
-        animation-name: cloudMid;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1.2s;
-      }
-
-      &.right {
-        width: 62px;
-        top: 100px;
-        left: 500px;
-        opacity: 0;
-        animation-name: cloudRight;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1s;
-      }
-
-      @keyframes cloudLeft {
-        0% {
-          top: 17px;
-          left: 220px;
-          opacity: 0;
-        }
-
-        20% {
-          top: 33px;
-          left: 188px;
-          opacity: 1;
-        }
-
-        80% {
-          top: 81px;
-          left: 92px;
-          opacity: 1;
-        }
-
-        100% {
-          top: 97px;
-          left: 60px;
-          opacity: 0;
-        }
-      }
-
-      @keyframes cloudMid {
-        0% {
-          top: 10px;
-          left: 420px;
-          opacity: 0;
-        }
-
-        20% {
-          top: 40px;
-          left: 360px;
-          opacity: 1;
-        }
-
-        70% {
-          top: 130px;
-          left: 180px;
-          opacity: 1;
-        }
-
-        100% {
-          top: 160px;
-          left: 120px;
-          opacity: 0;
-        }
-      }
-
-      @keyframes cloudRight {
-        0% {
-          top: 100px;
-          left: 500px;
-          opacity: 0;
-        }
-
-        20% {
-          top: 120px;
-          left: 460px;
-          opacity: 1;
-        }
-
-        80% {
-          top: 180px;
-          left: 340px;
-          opacity: 1;
-        }
-
-        100% {
-          top: 200px;
-          left: 300px;
-          opacity: 0;
-        }
-      }
-    }
-  }
-
-  .text-404 {
-    position: relative;
-    float: left;
-    width: 300px;
-    padding: 30px 0;
-    overflow: hidden;
-
-    &__oops {
-      font-size: 32px;
-      font-weight: bold;
-      line-height: 40px;
-      color: #1482f0;
-      opacity: 0;
-      margin-bottom: 20px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-fill-mode: forwards;
-    }
-
-    &__headline {
-      font-size: 20px;
-      line-height: 24px;
-      color: #222;
-      font-weight: bold;
-      opacity: 0;
-      margin-bottom: 10px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.1s;
-      animation-fill-mode: forwards;
-    }
-
-    &__info {
-      font-size: 13px;
-      line-height: 21px;
-      color: grey;
-      opacity: 0;
-      margin-bottom: 30px;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.2s;
-      animation-fill-mode: forwards;
-    }
-
-    &__return-home {
-      display: block;
-      float: left;
-      width: 110px;
-      height: 36px;
-      background: #1482f0;
-      border-radius: 100px;
-      text-align: center;
-      color: #ffffff;
-      opacity: 0;
-      font-size: 14px;
-      line-height: 36px;
-      cursor: pointer;
-      animation-name: slideUp;
-      animation-duration: 0.5s;
-      animation-delay: 0.3s;
-      animation-fill-mode: forwards;
-    }
-
-    @keyframes slideUp {
-      0% {
-        transform: translateY(60px);
-        opacity: 0;
-      }
-
-      100% {
-        transform: translateY(0);
-        opacity: 1;
-      }
-    }
-  }
-}
-</style>
diff --git a/src/views/login/auth-redirect.vue b/src/views/login/auth-redirect.vue
deleted file mode 100644
index aeecf00..0000000
--- a/src/views/login/auth-redirect.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'AuthRedirect'
-})
-export default class extends Vue {
-  created() {
-    const hash = window.location.search.slice(1)
-    if (window.localStorage) {
-      window.localStorage.setItem('x-admin-oauth-code', hash)
-      window.close()
-    }
-  }
-
-  render() {
-    // Avoid warning for missing template
-  }
-}
-</script>
diff --git a/src/views/login/components/SocialSignin.vue b/src/views/login/components/SocialSignin.vue
deleted file mode 100644
index 93be3f9..0000000
--- a/src/views/login/components/SocialSignin.vue
+++ /dev/null
@@ -1,108 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="social-signup-container">
-    <div
-      class="sign-btn"
-      @click="wechatHandleClick('wechat')"
-    >
-      <span class="wx-svg-container"><svg-icon
-        name="wechat"
-        class="icon"
-      /></span> 微信
-    </div>
-    <div
-      class="sign-btn"
-      @click="tencentHandleClick('tencent')"
-    >
-      <span class="qq-svg-container"><svg-icon
-        name="qq"
-        class="icon"
-      /></span> QQ
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-// import openWindow from '@/utils/openWindow'
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'SocialSignin'
-})
-export default class extends Vue {
-  private wechatHandleClick(thirdpart: any) {
-    alert('ok')
-    // this.$store.commit('SET_AUTH_TYPE', thirdpart)
-    // const appid = 'xxxxx'
-    // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')
-    // const url = 'https://open.weixin.qq.com/connect/qrconnect?appid=' + appid + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_login#wechat_redirect'
-    // openWindow(url, thirdpart, 540, 540)
-  }
-
-  private tencentHandleClick(thirdpart: any) {
-    alert('ok')
-    // this.$store.commit('SET_AUTH_TYPE', thirdpart)
-    // const client_id = 'xxxxx'
-    // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')
-    // const url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + client_id + '&redirect_uri=' + redirect_uri
-    // openWindow(url, thirdpart, 540, 540)
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.social-signup-container {
-  margin: 20px 0;
-
-  .sign-btn {
-    display: inline-block;
-    cursor: pointer;
-  }
-
-  .icon {
-    color: #fff;
-    font-size: 24px;
-    margin-top: 8px;
-  }
-
-  .wx-svg-container,
-  .qq-svg-container {
-    display: inline-block;
-    width: 40px;
-    height: 40px;
-    line-height: 40px;
-    text-align: center;
-    padding-top: 1px;
-    border-radius: 4px;
-    margin-bottom: 20px;
-    margin-right: 5px;
-  }
-
-  .wx-svg-container {
-    background-color: #24da70;
-  }
-
-  .qq-svg-container {
-    background-color: #6BA2D6;
-    margin-left: 50px;
-  }
-}
-</style>
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 07ccaec..23c3063 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -100,13 +100,11 @@ import { Form as ElForm, Input } from 'element-ui'
 import { UserModule } from '@/store/modules/user'
 import { isValidUsername } from '@/utils/validate'
 import LangSelect from '@/components/LangSelect/index.vue'
-import SocialSign from './components/SocialSignin.vue'
 
 @Component({
   name: 'Login',
   components: {
-    LangSelect,
-    SocialSign
+    LangSelect
   }
 })
 export default class extends Vue {
diff --git a/src/views/profile/components/Account.vue b/src/views/profile/components/Account.vue
deleted file mode 100644
index 790e150..0000000
--- a/src/views/profile/components/Account.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <el-form>
-    <el-form-item label="Name">
-      <el-input v-model.trim="user.name" />
-    </el-form-item>
-    <el-form-item label="Email">
-      <el-input v-model.trim="user.email" />
-    </el-form-item>
-    <el-form-item>
-      <el-button
-        type="primary"
-        @click="submit"
-      >
-        Update
-      </el-button>
-    </el-form-item>
-  </el-form>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-import { IProfile } from '../index.vue'
-
-@Component({
-  name: 'Account'
-})
-export default class extends Vue {
-  @Prop({ required: true }) private user!: IProfile
-
-  private submit() {
-    this.$message({
-      message: 'User information has been updated successfully',
-      type: 'success',
-      duration: 5 * 1000
-    })
-  }
-}
-</script>
diff --git a/src/views/profile/components/Activity.vue b/src/views/profile/components/Activity.vue
deleted file mode 100644
index 143b0b7..0000000
--- a/src/views/profile/components/Activity.vue
+++ /dev/null
@@ -1,217 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="user-activity">
-    <div class="post">
-      <div class="user-block">
-        <img
-          class="img-circle"
-          :src="'https://wpimg.wallstcn.com/57ed425a-c71e-4201-9428-68760c0537c4.jpg'+avatarPrefix"
-        >
-        <span class="username text-muted">Iron Man</span>
-        <span class="description">Shared publicly - 7:30 PM today</span>
-      </div>
-      <p>
-        Lorem ipsum represents a long-held tradition for designers,
-        typographers and the like. Some people hate it and argue for
-        its demise, but others ignore the hate as they create awesome
-        tools to help create filler text for everyone from bacon lovers
-        to Charlie Sheen fans.
-      </p>
-      <ul class="list-inline">
-        <li>
-          <span class="link-black text-sm">
-            <i class="el-icon-share" />
-            Share
-          </span>
-        </li>
-        <li>
-          <span class="link-black text-sm">
-            <svg-icon name="like" />
-            Like
-          </span>
-        </li>
-      </ul>
-    </div>
-    <div class="post">
-      <div class="user-block">
-        <img
-          class="img-circle"
-          :src="'https://wpimg.wallstcn.com/9e2a5d0a-bd5b-457f-ac8e-86554616c87b.jpg'+avatarPrefix"
-        >
-        <span class="username text-muted">Captain American</span>
-        <span class="description">Sent you a message - yesterday</span>
-      </div>
-      <p>
-        Lorem ipsum represents a long-held tradition for designers,
-        typographers and the like. Some people hate it and argue for
-        its demise, but others ignore the hate as they create awesome
-        tools to help create filler text for everyone from bacon lovers
-        to Charlie Sheen fans.
-      </p>
-      <ul class="list-inline">
-        <li>
-          <span class="link-black text-sm">
-            <i class="el-icon-share" />
-            Share
-          </span>
-        </li>
-        <li>
-          <span class="link-black text-sm">
-            <svg-icon name="like" />
-            Like
-          </span>
-        </li>
-      </ul>
-    </div>
-    <div class="post">
-      <div class="user-block">
-        <img
-          class="img-circle"
-          :src="'https://wpimg.wallstcn.com/fb57f689-e1ab-443c-af12-8d4066e202e2.jpg'+avatarPrefix"
-        >
-        <span class="username">Spider Man</span>
-        <span class="description">Posted 4 photos - 2 days ago</span>
-      </div>
-      <div class="user-images">
-        <el-carousel
-          :interval="6000"
-          type="card"
-          height="220px"
-        >
-          <el-carousel-item
-            v-for="item in carouselImages"
-            :key="item"
-          >
-            <img
-              :src="item + carouselPrefix"
-              class="image"
-            >
-          </el-carousel-item>
-        </el-carousel>
-      </div>
-      <ul class="list-inline">
-        <li><span class="link-black text-sm"><i class="el-icon-share" /> Share</span></li>
-        <li>
-          <span class="link-black text-sm">
-            <svg-icon name="like" /> Like</span>
-        </li>
-      </ul>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'Activity'
-})
-export default class extends Vue {
-  private carouselImages = [
-    'https://wpimg.wallstcn.com/9679ffb0-9e0b-4451-9916-e21992218054.jpg',
-    'https://wpimg.wallstcn.com/bcce3734-0837-4b9f-9261-351ef384f75a.jpg',
-    'https://wpimg.wallstcn.com/d1d7b033-d75e-4cd6-ae39-fcd5f1c0a7c5.jpg',
-    'https://wpimg.wallstcn.com/50530061-851b-4ca5-9dc5-2fead928a939.jpg'
-  ]
-  private avatarPrefix = '?imageView2/1/w/80/h/80'
-  private carouselPrefix = '?imageView2/2/h/440'
-}
-</script>
-
-<style lang="scss" scoped>
-.user-activity {
-  .user-block {
-    .username,
-    .description {
-      display: block;
-      margin-left: 50px;
-      padding: 2px 0;
-    }
-
-    .username {
-      font-size: 16px;
-      color: #000;
-    }
-
-    :after {
-      clear: both;
-    }
-
-    .img-circle {
-      border-radius: 50%;
-      width: 40px;
-      height: 40px;
-      float: left;
-    }
-
-    span {
-      font-weight: 500;
-      font-size: 12px;
-    }
-  }
-
-  .post {
-    font-size: 14px;
-    border-bottom: 1px solid #d2d6de;
-    margin-bottom: 15px;
-    padding-bottom: 15px;
-    color: #666;
-
-    .image {
-      width: 100%;
-      height: 100%;
-    }
-
-    .user-images {
-      padding-top: 20px;
-    }
-  }
-
-  .list-inline {
-    padding-left: 0;
-    margin-left: -5px;
-    list-style: none;
-
-    li {
-      display: inline-block;
-      padding-right: 5px;
-      padding-left: 5px;
-      font-size: 13px;
-    }
-
-    .link-black {
-      &:hover,
-      &:focus {
-        color: #999;
-      }
-    }
-  }
-}
-
-.box-center {
-  margin: 0 auto;
-  display: table;
-}
-
-.text-muted {
-  color: #777;
-}
-</style>
diff --git a/src/views/profile/components/Timeline.vue b/src/views/profile/components/Timeline.vue
deleted file mode 100644
index 3711106..0000000
--- a/src/views/profile/components/Timeline.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="block">
-    <el-timeline>
-      <el-timeline-item
-        v-for="(item, index) of timeline"
-        :key="index"
-        :timestamp="item.timestamp"
-        placement="top"
-      >
-        <el-card>
-          <h4>{{ item.title }}</h4>
-          <p>{{ item.content }}</p>
-        </el-card>
-      </el-timeline-item>
-    </el-timeline>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'Timeline'
-})
-export default class extends Vue {
-  private timeline = [
-    {
-      timestamp: '2019/4/20',
-      title: 'Update Github template',
-      content: 'Armour committed 2019/4/20 20:46'
-    },
-    {
-      timestamp: '2019/4/21',
-      title: 'Update Github template',
-      content: 'Armour committed 2019/4/21 20:46'
-    },
-    {
-      timestamp: '2019/4/22',
-      title: 'Build Template',
-      content: 'Armour committed 2019/4/22 20:46'
-    },
-    {
-      timestamp: '2019/4/23',
-      title: 'Release New Version',
-      content: 'Armour committed 2019/4/23 20:46'
-    }
-  ]
-}
-</script>
diff --git a/src/views/profile/components/UserCard.vue b/src/views/profile/components/UserCard.vue
deleted file mode 100644
index 958fd3e..0000000
--- a/src/views/profile/components/UserCard.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <el-card style="margin-bottom:20px;">
-    <div
-      slot="header"
-      class="clearfix"
-    >
-      <span>About me</span>
-    </div>
-
-    <div class="user-profile">
-      <div class="box-center">
-        <pan-thumb
-          :image="user.avatar"
-          :height="'100px'"
-          :width="'100px'"
-          :hoverable="false"
-        >
-          <div>Hello</div>
-          {{ user.roles }}
-        </pan-thumb>
-      </div>
-      <div class="box-center">
-        <div class="user-name text-center">
-          {{ user.name }}
-        </div>
-        <div class="user-role text-center text-muted">
-          {{ user.roles | uppercaseFirstChar }}
-        </div>
-      </div>
-    </div>
-
-    <div class="user-bio">
-      <div class="user-education user-bio-section">
-        <div class="user-bio-section-header">
-          <svg-icon name="education" /><span>Education</span>
-        </div>
-        <div class="user-bio-section-body">
-          <div class="text-muted">
-            JS in Computer Science from the University of Technology
-          </div>
-        </div>
-      </div>
-
-      <div class="user-skills user-bio-section">
-        <div class="user-bio-section-header">
-          <svg-icon name="skill" /><span>Skills</span>
-        </div>
-        <div class="user-bio-section-body">
-          <div class="progress-item">
-            <span>Vue</span>
-            <el-progress :percentage="51" />
-          </div>
-          <div class="progress-item">
-            <span>Typescript</span>
-            <el-progress :percentage="45" />
-          </div>
-          <div class="progress-item">
-            <span>Css</span>
-            <el-progress :percentage="4" />
-          </div>
-          <div class="progress-item">
-            <span>ESLint</span>
-            <el-progress
-              :percentage="100"
-              status="success"
-            />
-          </div>
-        </div>
-      </div>
-    </div>
-  </el-card>
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue } from 'vue-property-decorator'
-import { IProfile } from '../index.vue'
-import PanThumb from '@/components/PanThumb/index.vue'
-
-@Component({
-  name: 'UserCard',
-  components: {
-    PanThumb
-  }
-})
-export default class extends Vue {
-  @Prop({ required: true }) private user!: IProfile
-}
-</script>
-
-<style lang="scss" scoped>
-.box-center {
-  margin: 0 auto;
-  display: table;
-}
-
-.text-muted {
-  color: #777;
-}
-
-.user-profile {
-  .user-name {
-    font-weight: bold;
-  }
-
-  .box-center {
-    padding-top: 10px;
-  }
-
-  .user-role {
-    padding-top: 10px;
-    font-weight: 400;
-    font-size: 14px;
-  }
-
-  .box-social {
-    padding-top: 30px;
-
-    .el-table {
-      border-top: 1px solid #dfe6ec;
-    }
-  }
-
-  .user-follow {
-    padding-top: 20px;
-  }
-}
-
-.user-bio {
-  margin-top: 20px;
-  color: #606266;
-
-  span {
-    padding-left: 4px;
-  }
-
-  .user-bio-section {
-    font-size: 14px;
-    padding: 15px 0;
-
-    .user-bio-section-header {
-      border-bottom: 1px solid #dfe6ec;
-      padding-bottom: 10px;
-      margin-bottom: 10px;
-      font-weight: bold;
-    }
-  }
-}
-</style>
diff --git a/src/views/profile/index.vue b/src/views/profile/index.vue
deleted file mode 100644
index fa0093b..0000000
--- a/src/views/profile/index.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div class="app-container">
-    <div v-if="user">
-      <el-row :gutter="20">
-        <el-col
-          :span="6"
-          :xs="24"
-        >
-          <user-card :user="user" />
-        </el-col>
-        <el-col
-          :span="18"
-          :xs="24"
-        >
-          <el-card>
-            <el-tabs v-model="activeTab">
-              <el-tab-pane
-                label="Activity"
-                name="activity"
-              >
-                <activity />
-              </el-tab-pane>
-              <el-tab-pane
-                label="Timeline"
-                name="timeline"
-              >
-                <timeline />
-              </el-tab-pane>
-              <el-tab-pane
-                label="Account"
-                name="account"
-              >
-                <account :user="user" />
-              </el-tab-pane>
-            </el-tabs>
-          </el-card>
-        </el-col>
-      </el-row>
-    </div>
-  </div>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { UserModule } from '@/store/modules/user'
-import Account from './components/Account.vue'
-import Activity from './components/Activity.vue'
-import Timeline from './components/Timeline.vue'
-import UserCard from './components/UserCard.vue'
-
-export interface IProfile {
-  name: string
-  email: string
-  avatar: string
-  roles: string
-}
-
-const defaultProfile: IProfile = {
-  name: 'Loading...',
-  email: 'Loading...',
-  avatar: 'Loading...',
-  roles: 'Loading...'
-}
-
-@Component({
-  name: 'Profile',
-  components: {
-    Account,
-    Activity,
-    Timeline,
-    UserCard
-  }
-})
-export default class extends Vue {
-  private user = defaultProfile
-  private activeTab = 'activity'
-
-  get name() {
-    return UserModule.name
-  }
-
-  get email() {
-    return UserModule.email
-  }
-
-  get avatar() {
-    return UserModule.avatar
-  }
-
-  get roles() {
-    return UserModule.roles
-  }
-
-  created() {
-    this.getUser()
-  }
-
-  private getUser() {
-    this.user = {
-      name: this.name,
-      email: this.email,
-      avatar: this.avatar,
-      roles: this.roles.join(' | ')
-    }
-  }
-}
-</script>
diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue
deleted file mode 100644
index 6182748..0000000
--- a/src/views/redirect/index.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'Redirect'
-})
-export default class extends Vue {
-  created() {
-    const { params, query } = this.$route
-    const { path } = params
-    this.$router.replace({ path: '/' + path, query })
-  }
-
-  render() {
-    // Avoid warning for missing template
-  }
-}
-</script>
diff --git a/vue.config.js b/vue.config.js
index 693cfa9..0b26844 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -30,13 +30,6 @@ module.exports = {
     // https://cli.vuejs.org/zh/config/#devserver-proxy
     proxy: 'http://127.0.0.1/apisix/admin/'
   },
-  pwa: {
-    name: name,
-    workboxPluginMode: 'InjectManifest',
-    workboxOptions: {
-      swSrc: path.resolve(__dirname, 'src/pwa/service-worker.js')
-    }
-  },
   pluginOptions: {
     'style-resources-loader': {
       preProcessor: 'scss',
diff --git a/yarn.lock b/yarn.lock
index 9ce0fda..c193364 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1304,15 +1304,6 @@
     eslint "^4.19.1"
     eslint-plugin-vue "^4.7.1"
 
-"@vue/cli-plugin-pwa@^3.8.0":
-  version "3.11.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-3.11.0.tgz#f7d26b598c00755491326ecebe68af6417ad6b46"
-  integrity sha512-Ua215xZRSM4LeSa2BOiHGRxcYxCcX+J0RoiflTsUhMEICJj0kwGvcjHcq8MsrmydXqHSdAKtVVJpe2CUZix2XQ==
-  dependencies:
-    "@vue/cli-shared-utils" "^3.11.0"
-    webpack "^4.0.0"
-    workbox-webpack-plugin "^3.6.3"
-
 "@vue/cli-plugin-typescript@^3.8.1":
   version "3.11.0"
   resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.11.0.tgz#5396905af9df574935e47a0507450f76fae6b196"


[incubator-apisix-dashboard] 02/02: remove i18n

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch feature-remove-useless-files
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git

commit 0bda9b3fbe547ba38390eb4871bade553a48bc74
Author: juzhiyuan <jj...@gmail.com>
AuthorDate: Mon Nov 4 00:09:52 2019 +0800

    remove i18n
---
 src/components/Charts/BarChart.vue     | 155 -------------------
 src/components/Charts/LineChart.vue    | 211 --------------------------
 src/components/Charts/MixedChart.vue   | 267 ---------------------------------
 src/components/Charts/mixins/resize.ts |  84 -----------
 src/components/SizeSelect/index.vue    |  87 -----------
 src/components/ThemePicker/index.vue   | 176 ----------------------
 src/lang/en.ts                         | 105 +------------
 src/lang/zh.ts                         |  97 +-----------
 src/layout/components/Navbar/index.vue |   6 +-
 src/store/modules/user.ts              |   4 +-
 vue.config.js                          |   2 +-
 11 files changed, 21 insertions(+), 1173 deletions(-)

diff --git a/src/components/Charts/BarChart.vue b/src/components/Charts/BarChart.vue
deleted file mode 100644
index a671452..0000000
--- a/src/components/Charts/BarChart.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :id="id"
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from './mixins/resize'
-
-@Component({
-  name: 'BarChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: 'chart' }) private id!: string
-  @Prop({ default: '200px' }) private width!: string
-  @Prop({ default: '200px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement)
-    const xAxisData: string[] = []
-    const data: number[] = []
-    const data2: number[] = []
-    for (let i = 0; i < 50; i++) {
-      xAxisData.push(i.toString())
-      data.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5)
-      data2.push((Math.sin(i / 5) * (i / 5 + 10) + i / 6) * 3)
-    }
-    this.chart.setOption({
-      backgroundColor: '#08263a',
-      grid: {
-        left: '5%',
-        right: '5%'
-      },
-      xAxis: [{
-        show: false,
-        data: xAxisData
-      }, {
-        show: false,
-        data: xAxisData
-      }],
-      visualMap: [{
-        show: false,
-        min: 0,
-        max: 50,
-        dimension: 0,
-        inRange: {
-          color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055']
-        }
-      }],
-      yAxis: [{
-        axisLine: {
-          show: false
-        },
-        axisLabel: {
-          color: '#43657a'
-        },
-        splitLine: {
-          show: true,
-          lineStyle: {
-            color: '#08263f'
-          }
-        },
-        axisTick: {
-          show: false
-        }
-      }],
-      series: [{
-        name: 'back',
-        type: 'bar',
-        data: data2,
-        z: 1,
-        itemStyle: {
-          opacity: 0.4,
-          barBorderRadius: 5,
-          shadowBlur: 3,
-          shadowColor: '#111'
-        }
-      }, {
-        name: 'Simulate Shadow',
-        type: 'line',
-        data,
-        z: 2,
-        showSymbol: false,
-        animationDelay: 0,
-        animationEasing: 'linear',
-        animationDuration: 1200,
-        lineStyle: {
-          color: 'transparent'
-        },
-        areaStyle: {
-          color: '#08263a',
-          shadowBlur: 50,
-          shadowColor: '#000'
-        }
-      }, {
-        name: 'front',
-        type: 'bar',
-        data,
-        xAxisIndex: 1,
-        z: 3,
-        itemStyle: {
-          barBorderRadius: 5
-        }
-      }],
-      animationEasing: 'elasticOut',
-      animationEasingUpdate: 'elasticOut',
-      animationDelay(idx: number) {
-        return idx * 20
-      },
-      animationDelayUpdate(idx: number) {
-        return idx * 20
-      }
-    } as EChartOption<EChartOption.SeriesBar>)
-  }
-}
-</script>
diff --git a/src/components/Charts/LineChart.vue b/src/components/Charts/LineChart.vue
deleted file mode 100644
index e3ece60..0000000
--- a/src/components/Charts/LineChart.vue
+++ /dev/null
@@ -1,211 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :id="id"
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from './mixins/resize'
-
-@Component({
-  name: 'LineChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: 'chart' }) private id!: string
-  @Prop({ default: '200px' }) private width!: string
-  @Prop({ default: '200px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement)
-    this.chart.setOption({
-      backgroundColor: '#394056',
-      title: {
-        top: 20,
-        text: 'Requests',
-        textStyle: {
-          fontWeight: 'normal',
-          fontSize: 16,
-          color: '#F1F1F3'
-        },
-        left: '1%'
-      },
-      tooltip: {
-        trigger: 'axis'
-      },
-      legend: {
-        top: 20,
-        icon: 'rect',
-        itemWidth: 14,
-        itemHeight: 5,
-        itemGap: 13,
-        data: ['CMCC', 'CTCC', 'CUCC'],
-        right: '4%',
-        textStyle: {
-          fontSize: 12,
-          color: '#F1F1F3'
-        }
-      },
-      grid: {
-        top: 100,
-        left: '2%',
-        right: '2%',
-        bottom: '2%',
-        containLabel: true
-      },
-      xAxis: [{
-        type: 'category',
-        boundaryGap: false,
-        axisLine: {
-          lineStyle: {
-            color: '#57617B'
-          }
-        },
-        data: ['13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55']
-      }],
-      yAxis: [{
-        type: 'value',
-        name: '(%)',
-        axisTick: {
-          show: false
-        },
-        axisLine: {
-          lineStyle: {
-            color: '#57617B'
-          }
-        },
-        axisLabel: {
-          margin: 10,
-          fontSize: 14
-        },
-        splitLine: {
-          lineStyle: {
-            color: '#57617B'
-          }
-        }
-      }],
-      series: [{
-        name: 'CMCC',
-        type: 'line',
-        smooth: true,
-        symbol: 'circle',
-        symbolSize: 5,
-        showSymbol: false,
-        lineStyle: {
-          width: 1
-        },
-        areaStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-            offset: 0,
-            color: 'rgba(137, 189, 27, 0.3)'
-          }, {
-            offset: 0.8,
-            color: 'rgba(137, 189, 27, 0)'
-          }], false) as any,
-          shadowColor: 'rgba(0, 0, 0, 0.1)',
-          shadowBlur: 10
-        },
-        itemStyle: {
-          color: 'rgb(137,189,27)',
-          borderColor: 'rgba(137,189,2,0.27)',
-          borderWidth: 12
-        },
-        data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]
-      }, {
-        name: 'CTCC',
-        type: 'line',
-        smooth: true,
-        symbol: 'circle',
-        symbolSize: 5,
-        showSymbol: false,
-        lineStyle: {
-          width: 1
-        },
-        areaStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-            offset: 0,
-            color: 'rgba(0, 136, 212, 0.3)'
-          }, {
-            offset: 0.8,
-            color: 'rgba(0, 136, 212, 0)'
-          }], false) as any,
-          shadowColor: 'rgba(0, 0, 0, 0.1)',
-          shadowBlur: 10
-        },
-        itemStyle: {
-          color: 'rgb(0,136,212)',
-          borderColor: 'rgba(0,136,212,0.2)',
-          borderWidth: 12
-        },
-        data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150]
-      }, {
-        name: 'CUCC',
-        type: 'line',
-        smooth: true,
-        symbol: 'circle',
-        symbolSize: 5,
-        showSymbol: false,
-        lineStyle: {
-          width: 1
-        },
-        areaStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-            offset: 0,
-            color: 'rgba(219, 50, 51, 0.3)'
-          }, {
-            offset: 0.8,
-            color: 'rgba(219, 50, 51, 0)'
-          }], false) as any,
-          shadowColor: 'rgba(0, 0, 0, 0.1)',
-          shadowBlur: 10
-        },
-        itemStyle: {
-          color: 'rgb(219,50,51)',
-          borderColor: 'rgba(219,50,51,0.2)',
-          borderWidth: 12
-        },
-        data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122]
-      }]
-    } as EChartOption<EChartOption.SeriesLine>)
-  }
-}
-
-</script>
diff --git a/src/components/Charts/MixedChart.vue b/src/components/Charts/MixedChart.vue
deleted file mode 100644
index 7ddfc3c..0000000
--- a/src/components/Charts/MixedChart.vue
+++ /dev/null
@@ -1,267 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <div
-    :id="id"
-    :class="className"
-    :style="{height: height, width: width}"
-  />
-</template>
-
-<script lang="ts">
-import echarts, { EChartOption } from 'echarts'
-import { Component, Prop } from 'vue-property-decorator'
-import { mixins } from 'vue-class-component'
-import ResizeMixin from './mixins/resize'
-
-@Component({
-  name: 'MixedChart'
-})
-export default class extends mixins(ResizeMixin) {
-  @Prop({ default: 'chart' }) private className!: string
-  @Prop({ default: 'chart' }) private id!: string
-  @Prop({ default: '200px' }) private width!: string
-  @Prop({ default: '200px' }) private height!: string
-
-  mounted() {
-    this.$nextTick(() => {
-      this.initChart()
-    })
-  }
-
-  beforeDestroy() {
-    if (!this.chart) {
-      return
-    }
-    this.chart.dispose()
-    this.chart = null
-  }
-
-  private initChart() {
-    this.chart = echarts.init(document.getElementById(this.id) as HTMLDivElement)
-    const xData = (function() {
-      const data = []
-      for (let i = 1; i < 13; i++) {
-        data.push(i + 'month')
-      }
-      return data
-    }())
-    this.chart.setOption({
-      backgroundColor: '#344b58',
-      title: {
-        text: 'statistics',
-        top: '20',
-        textStyle: {
-          color: '#fff',
-          fontSize: '22'
-        },
-        subtextStyle: {
-          color: '#90979c',
-          fontSize: '16'
-        }
-      },
-      tooltip: {
-        trigger: 'axis'
-      },
-      grid: {
-        left: '5%',
-        right: '5%',
-        borderWidth: 0,
-        top: 150,
-        bottom: 95,
-        textStyle: {
-          color: '#fff'
-        }
-      },
-      legend: {
-        x: '5%',
-        top: '10%',
-        textStyle: {
-          color: '#90979c'
-        },
-        data: ['female', 'male', 'average']
-      },
-      xAxis: [{
-        type: 'category',
-        axisLine: {
-          lineStyle: {
-            color: '#90979c'
-          }
-        },
-        splitLine: {
-          show: false
-        },
-        axisTick: {
-          show: false
-        },
-        splitArea: {
-          show: false
-        },
-        axisLabel: {
-          interval: 0
-
-        },
-        data: xData
-      }],
-      yAxis: [{
-        type: 'value',
-        splitLine: {
-          show: false
-        },
-        axisLine: {
-          lineStyle: {
-            color: '#90979c'
-          }
-        },
-        axisTick: {
-          show: false
-        },
-        axisLabel: {
-          interval: 0
-        },
-        splitArea: {
-          show: false
-        }
-      }],
-      dataZoom: [{
-        show: true,
-        xAxisIndex: [
-          0
-        ],
-        bottom: 30,
-        start: 10,
-        end: 80,
-        handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
-        handleSize: '110%',
-        handleStyle: {
-          color: '#d3dee5'
-
-        },
-        textStyle: {
-          color: '#fff'
-        },
-        borderColor: '#90979c'
-      }, {
-        type: 'inside',
-        show: true,
-        start: 1,
-        end: 35
-      }],
-      series: [{
-        name: 'female',
-        type: 'bar',
-        stack: 'total',
-        barMaxWidth: 35,
-        barGap: '10%',
-        itemStyle: {
-          color: 'rgba(255,144,128,1)',
-          label: {
-            show: true,
-            textStyle: {
-              color: '#fff'
-            },
-            position: 'insideTop',
-            formatter(p: any) {
-              return p.value > 0 ? p.value : ''
-            }
-          }
-        },
-        data: [
-          709,
-          1917,
-          2455,
-          2610,
-          1719,
-          1433,
-          1544,
-          3285,
-          5208,
-          3372,
-          2484,
-          4078
-        ]
-      },
-
-      {
-        name: 'male',
-        type: 'bar',
-        stack: 'total',
-        itemStyle: {
-          color: 'rgba(0,191,183,1)',
-          barBorderRadius: 0,
-          label: {
-            show: true,
-            position: 'top',
-            formatter(p: any) {
-              return p.value > 0 ? p.value : ''
-            }
-          }
-        },
-        data: [
-          327,
-          1776,
-          507,
-          1200,
-          800,
-          482,
-          204,
-          1390,
-          1001,
-          951,
-          381,
-          220
-        ]
-      }, {
-        name: 'average',
-        type: 'line',
-        stack: 'total',
-        symbolSize: 10,
-        symbol: 'circle',
-        itemStyle: {
-          color: 'rgba(252,230,48,1)',
-          barBorderRadius: 0,
-          label: {
-            show: true,
-            position: 'top',
-            formatter(p: any) {
-              return p.value > 0 ? p.value : ''
-            }
-          }
-        },
-        data: [
-          1036,
-          3693,
-          2962,
-          3810,
-          2519,
-          1915,
-          1748,
-          4675,
-          6209,
-          4323,
-          2865,
-          4298
-        ]
-      }
-      ]
-    } as EChartOption<EChartOption.SeriesLine | EChartOption.SeriesBar>)
-  }
-}
-</script>
diff --git a/src/components/Charts/mixins/resize.ts b/src/components/Charts/mixins/resize.ts
deleted file mode 100644
index 009f0e4..0000000
--- a/src/components/Charts/mixins/resize.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { ECharts } from 'echarts'
-import { Component, Vue } from 'vue-property-decorator'
-
-@Component({
-  name: 'ResizeMixin'
-})
-export default class extends Vue {
-  protected chart!: ECharts | null
-  private sidebarElm?: Element
-
-  mounted() {
-    this.initResizeEvent()
-    this.initSidebarResizeEvent()
-  }
-
-  beforeDestroy() {
-    this.destroyResizeEvent()
-    this.destroySidebarResizeEvent()
-  }
-
-  activated() {
-    this.initResizeEvent()
-    this.initSidebarResizeEvent()
-  }
-
-  deactivated() {
-    this.destroyResizeEvent()
-    this.destroySidebarResizeEvent()
-  }
-
-  private chartResizeHandler() {
-    if (this.chart) {
-      this.chart.resize()
-    }
-  }
-
-  private sidebarResizeHandler(e: TransitionEvent) {
-    if (e.propertyName === 'width') {
-      this.chartResizeHandler()
-    }
-  }
-
-  private initResizeEvent() {
-    if (this.chartResizeHandler) {
-      window.addEventListener('resize', this.chartResizeHandler)
-    }
-  }
-
-  private destroyResizeEvent() {
-    if (this.chartResizeHandler) {
-      window.removeEventListener('resize', this.chartResizeHandler)
-    }
-  }
-
-  private initSidebarResizeEvent() {
-    this.sidebarElm = document.getElementsByClassName('sidebar-container')[0]
-    if (this.sidebarElm) {
-      this.sidebarElm.addEventListener('transitionend', this.sidebarResizeHandler as EventListener)
-    }
-  }
-
-  private destroySidebarResizeEvent() {
-    if (this.sidebarElm) {
-      this.sidebarElm.removeEventListener('transitionend', this.sidebarResizeHandler as EventListener)
-    }
-  }
-}
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
deleted file mode 100644
index ef7a665..0000000
--- a/src/components/SizeSelect/index.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <el-dropdown
-    id="size-select"
-    trigger="click"
-    @command="handleSetSize"
-  >
-    <div>
-      <svg-icon
-        class="size-icon"
-        name="size"
-      />
-    </div>
-    <el-dropdown-menu slot="dropdown">
-      <el-dropdown-item
-        v-for="item of sizeOptions"
-        :key="item.value"
-        :disabled="size===item.value"
-        :command="item.value"
-      >
-        {{
-          item.label }}
-      </el-dropdown-item>
-    </el-dropdown-menu>
-  </el-dropdown>
-</template>
-
-<script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
-import { AppModule } from '@/store/modules/app'
-import { TagsViewModule } from '@/store/modules/tags-view'
-
-@Component({
-  name: 'SizeSelect'
-})
-export default class extends Vue {
-  private sizeOptions = [
-    { label: 'Default', value: 'default' },
-    { label: 'Medium', value: 'medium' },
-    { label: 'Small', value: 'small' },
-    { label: 'Mini', value: 'mini' }
-  ]
-
-  get size() {
-    return AppModule.size
-  }
-
-  private handleSetSize(size: string) {
-    (this as any).$ELEMENT.size = size
-    AppModule.SetSize(size)
-    this.refreshView()
-    this.$message({
-      message: 'Switch Size Success',
-      type: 'success'
-    })
-  }
-
-  private refreshView() {
-    // In order to make the cached page re-rendered
-    TagsViewModule.delAllCachedViews()
-    const { fullPath } = this.$route
-    this.$nextTick(() => {
-      this.$router.replace({
-        path: '/redirect' + fullPath
-      })
-    })
-  }
-}
-</script>
diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue
deleted file mode 100644
index 94ec3d9..0000000
--- a/src/components/ThemePicker/index.vue
+++ /dev/null
@@ -1,176 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-
-<template>
-  <el-color-picker
-    v-model="theme"
-    :predefine="['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d']"
-    class="theme-picker"
-    popper-class="theme-picker-dropdown"
-  />
-</template>
-
-<script lang="ts">
-import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
-import { SettingsModule } from '@/store/modules/settings'
-
-const version = require('element-ui/package.json').version // element-ui version from node_modules
-const ORIGINAL_THEME = '#409EFF' // default color
-
-@Component({
-  name: 'ThemePicker'
-})
-export default class extends Vue {
-  private chalk = '' // The content of theme-chalk css
-  private theme = ''
-
-  get defaultTheme() {
-    return SettingsModule.theme
-  }
-
-  @Watch('defaultTheme', { immediate: true })
-  private onDefaultThemeChange(value: string) {
-    this.theme = value
-  }
-
-  @Watch('theme')
-  private async onThemeChange(value: string) {
-    if (!value) return
-    const oldValue = this.chalk ? this.theme : ORIGINAL_THEME
-    const themeCluster = this.getThemeCluster(value.replace('#', ''))
-    const originalCluster = this.getThemeCluster(oldValue.replace('#', ''))
-    const message = this.$message({
-      message: '  Compiling the theme',
-      customClass: 'theme-message',
-      type: 'success',
-      duration: 0,
-      iconClass: 'el-icon-loading'
-    })
-
-    if (!this.chalk) {
-      const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
-      await this.getCSSString(url, 'chalk')
-    }
-
-    const getHandler = (variable: string, id: string) => {
-      return () => {
-        const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))
-        const newStyle = this.updateStyle((this as any)[variable], originalCluster, themeCluster)
-
-        let styleTag = document.getElementById(id)
-        if (!styleTag) {
-          styleTag = document.createElement('style')
-          styleTag.setAttribute('id', id)
-          document.head.appendChild(styleTag)
-        }
-        styleTag.innerText = newStyle
-      }
-    }
-    const chalkHandler = getHandler('chalk', 'chalk-style')
-    chalkHandler()
-
-    let styles: HTMLElement[] = [].slice.call(document.querySelectorAll('style'))
-    styles = styles
-      .filter(style => {
-        const text = style.innerText
-        return new RegExp(oldValue, 'i').test(text) && !/Chalk Variables/.test(text)
-      })
-    styles.forEach(style => {
-      const { innerText } = style
-      if (typeof innerText !== 'string') return
-      style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)
-    })
-
-    this.$emit('change', value)
-    message.close()
-  }
-
-  private updateStyle(style: string, oldCluster: string[], newCluster: string[]) {
-    let newStyle = style
-    oldCluster.forEach((color, index) => {
-      newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])
-    })
-    return newStyle
-  }
-
-  private getCSSString(url: string, variable: string) {
-    return new Promise(resolve => {
-      const xhr = new XMLHttpRequest()
-      xhr.onreadystatechange = () => {
-        if (xhr.readyState === 4 && xhr.status === 200) {
-          (this as any)[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
-          resolve()
-        }
-      }
-      xhr.open('GET', url)
-      xhr.send()
-    })
-  }
-
-  private getThemeCluster(theme: string) {
-    const tintColor = (color: string, tint: number) => {
-      let red = parseInt(color.slice(0, 2), 16)
-      let green = parseInt(color.slice(2, 4), 16)
-      let blue = parseInt(color.slice(4, 6), 16)
-      if (tint === 0) { // when primary color is in its rgb space
-        return [red, green, blue].join(',')
-      } else {
-        red += Math.round(tint * (255 - red))
-        green += Math.round(tint * (255 - green))
-        blue += Math.round(tint * (255 - blue))
-        return `#${red.toString(16)}${green.toString(16)}${blue.toString(16)}`
-      }
-    }
-
-    const shadeColor = (color: string, shade: number) => {
-      let red = parseInt(color.slice(0, 2), 16)
-      let green = parseInt(color.slice(2, 4), 16)
-      let blue = parseInt(color.slice(4, 6), 16)
-      red = Math.round((1 - shade) * red)
-      green = Math.round((1 - shade) * green)
-      blue = Math.round((1 - shade) * blue)
-      return `#${red.toString(16)}${green.toString(16)}${blue.toString(16)}`
-    }
-
-    const clusters = [theme]
-    for (let i = 0; i <= 9; i++) {
-      clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))
-    }
-    clusters.push(shadeColor(theme, 0.1))
-    return clusters
-  }
-}
-</script>
-
-<style lang="scss">
-.theme-message,
-.theme-picker-dropdown {
-  z-index: 99999 !important;
-}
-
-.theme-picker .el-color-picker__trigger {
-  height: 26px !important;
-  width: 26px !important;
-  padding: 2px;
-}
-
-.theme-picker-dropdown .el-color-dropdown__link-btn {
-  display: none;
-}
-</style>
diff --git a/src/lang/en.ts b/src/lang/en.ts
index a0b68f4..4b81e90 100644
--- a/src/lang/en.ts
+++ b/src/lang/en.ts
@@ -18,23 +18,6 @@
 export default {
   route: {
     dashboard: 'Dashboard',
-    documentation: 'Documentation',
-    guide: 'Guide',
-    permission: 'Permission',
-    icons: 'Icons',
-    components: 'Components',
-    charts: 'Charts',
-    barChart: 'Bar Chart',
-    lineChart: 'Line Chart',
-    mixedChart: 'Mixed Chart',
-    table: 'Table',
-    tab: 'Tab',
-    form: 'Form',
-    page404: '404',
-    errorLog: 'Error Log',
-    mergeHeader: 'Merge Header',
-    pdf: 'PDF',
-    theme: 'Theme',
     i18n: 'I18n',
     profile: 'Profile',
     SchemaRoutes: 'Routes',
@@ -58,84 +41,20 @@ export default {
     SchemaUpstreamCreate: 'Upstream Create',
     SchemaUpstreamEdit: 'Upstream Edit'
   },
-  navbar: {
-    logOut: 'Log Out',
-    dashboard: 'Dashboard',
-    github: 'Github',
-    theme: 'Theme',
-    size: 'Global Size',
-    profile: 'Profile'
-  },
-  login: {
-    title: 'APISIX Login',
-    logIn: 'Login',
-    username: 'Username',
-    password: 'Password',
-    any: 'any',
-    thirdparty: 'Or connect with',
-    thirdpartyTips: 'Can not be simulated on local, so please combine you own business simulation! ! !'
-  },
-  documentation: {
-    documentation: 'Documentation',
-    github: 'Github Repository'
-  },
-  permission: {
-    createRole: 'New Role',
-    editPermission: 'Edit',
-    roles: 'Your roles',
-    switchRoles: 'Switch roles',
-    tips: 'In some cases, using v-permission will have no effect. For example: Element-UI  el-tab or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.',
-    delete: 'Delete',
-    confirm: 'Confirm',
-    cancel: 'Cancel'
-  },
-  guide: {
-    description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',
-    button: 'Show Guide'
-  },
-  components: {
-    documentation: 'Documentation',
-    stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',
-    imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'
-  },
   table: {
-    dynamicTips1: 'Fixed header, sorted by header order',
-    dynamicTips2: 'Not fixed header, sorted by click order',
-    dragTips1: 'The default order',
-    dragTips2: 'The after dragging order',
-    title: 'Title',
-    importance: 'Importance',
-    type: 'Type',
-    remark: 'Remark',
-    search: 'Search',
     add: 'Add',
-    export: 'Export',
-    reviewer: 'Reviewer',
-    id: 'ID',
-    date: 'Date',
-    author: 'Author',
-    readings: 'Readings',
-    status: 'Status',
-    actions: 'Actions',
     edit: 'Edit',
-    publish: 'Publish',
-    draft: 'Draft',
     delete: 'Delete',
-    cancel: 'Cancel',
-    confirm: 'Confirm'
+    actions: 'Action'
   },
-  errorLog: {
-    tips: 'Please click the bug icon in the upper right corner',
-    description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
-    documentation: 'Document introduction'
-  },
-  pdf: {
-    tips: 'Here we use window.print() to implement the feature of downloading PDF.'
+  navbar: {
+    logOut: 'Log Out'
   },
-  theme: {
-    change: 'Change Theme',
-    documentation: 'Theme documentation',
-    tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'
+  login: {
+    title: 'APISIX Login',
+    logIn: 'Login',
+    username: 'Username',
+    password: 'Password'
   },
   tagsView: {
     refresh: 'Refresh',
@@ -143,14 +62,6 @@ export default {
     closeOthers: 'Close Others',
     closeAll: 'Close All'
   },
-  settings: {
-    title: 'Page style setting',
-    theme: 'Theme Color',
-    showTagsView: 'Open Tags-View',
-    showSidebarLogo: 'Sidebar Logo',
-    fixedHeader: 'Fixed Header',
-    sidebarTextTheme: 'Sidebar Text Theme'
-  },
   button: {
     save: 'Save',
     cancel: 'Cancel',
diff --git a/src/lang/zh.ts b/src/lang/zh.ts
index 35d347b..5d6d9b9 100644
--- a/src/lang/zh.ts
+++ b/src/lang/zh.ts
@@ -18,23 +18,6 @@
 export default {
   route: {
     dashboard: '首页',
-    documentation: '文档',
-    guide: '引导页',
-    permission: '权限测试页',
-    icons: '图标',
-    components: '组件',
-    charts: '图表',
-    barChart: '柱状图表',
-    lineChart: '折线图',
-    mixedChart: '混合图表',
-    table: '表格',
-    tab: '分栏',
-    form: '表单',
-    page404: '404',
-    errorLog: '错误日志',
-    mergeHeader: '导出 多级表头',
-    pdf: 'PDF',
-    theme: '换肤',
     i18n: '国际化',
     profile: '个人中心',
     SchemaRoutes: 'Routes',
@@ -58,84 +41,20 @@ export default {
     SchemaUpstreamCreate: '创建 Upstream',
     SchemaUpstreamEdit: '编辑 Upstream'
   },
-  navbar: {
-    logOut: '退出登录',
-    dashboard: '首页',
-    github: '项目地址',
-    theme: '换肤',
-    size: '布局大小',
-    profile: '个人中心'
-  },
-  login: {
-    title: '系统登录',
-    logIn: '登录',
-    username: '账号',
-    password: '密码',
-    any: '随便填',
-    thirdparty: '第三方登录',
-    thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'
-  },
-  documentation: {
-    documentation: '文档',
-    github: 'Github 地址'
-  },
-  permission: {
-    createRole: '新增角色',
-    editPermission: '编辑权限',
-    roles: '你的权限',
-    switchRoles: '切换权限',
-    tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。',
-    delete: '删除',
-    confirm: '确定',
-    cancel: '取消'
-  },
-  guide: {
-    description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于',
-    button: '打开引导'
-  },
-  components: {
-    documentation: '文档',
-    stickyTips: '当页面滚动到预设的位置会吸附在顶部',
-    imageUploadTips: '由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。'
-  },
   table: {
-    dynamicTips1: '固定表头, 按照表头顺序排序',
-    dynamicTips2: '不固定表头, 按照点击顺序排序',
-    dragTips1: '默认顺序',
-    dragTips2: '拖拽后顺序',
-    title: '标题',
-    importance: '重要性',
-    type: '类型',
-    remark: '点评',
-    search: '搜索',
     add: '添加',
-    export: '导出',
-    reviewer: '审核人',
-    id: '序号',
-    date: '时间',
-    author: '作者',
-    readings: '阅读数',
-    status: '状态',
-    actions: '操作',
     edit: '编辑',
-    publish: '发布',
-    draft: '草稿',
     delete: '删除',
-    cancel: '取 消',
-    confirm: '确 定'
+    actions: '操作'
   },
-  errorLog: {
-    tips: '请点击右上角bug小图标',
-    description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',
-    documentation: '文档介绍'
-  },
-  pdf: {
-    tips: '这里使用 window.print() 来实现下载pdf的功能'
+  navbar: {
+    logOut: '退出登录'
   },
-  theme: {
-    change: '换肤',
-    documentation: '换肤文档',
-    tips: 'Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。'
+  login: {
+    title: '系统登录',
+    logIn: '登录',
+    username: '账号',
+    password: '密码'
   },
   tagsView: {
     refresh: '刷新',
diff --git a/src/layout/components/Navbar/index.vue b/src/layout/components/Navbar/index.vue
index f9221fe..f74f6ad 100644
--- a/src/layout/components/Navbar/index.vue
+++ b/src/layout/components/Navbar/index.vue
@@ -40,7 +40,7 @@
       >
         <div class="avatar-wrapper">
           <img
-            :src="avatar+'?imageView2/1/w/80/h/80'"
+            :src="avatar"
             class="user-avatar"
           >
           <i class="el-icon-caret-bottom" />
@@ -67,7 +67,6 @@ import Hamburger from '@/components/Hamburger/index.vue'
 import HeaderSearch from '@/components/HeaderSearch/index.vue'
 import LangSelect from '@/components/LangSelect/index.vue'
 import Screenfull from '@/components/Screenfull/index.vue'
-import SizeSelect from '@/components/SizeSelect/index.vue'
 
 @Component({
   name: 'Navbar',
@@ -76,8 +75,7 @@ import SizeSelect from '@/components/SizeSelect/index.vue'
     Hamburger,
     HeaderSearch,
     LangSelect,
-    Screenfull,
-    SizeSelect
+    Screenfull
   }
 })
 export default class extends Vue {
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
index e47989c..1a92276 100644
--- a/src/store/modules/user.ts
+++ b/src/store/modules/user.ts
@@ -106,9 +106,9 @@ class User extends VuexModule implements IUserState {
         username: 'admin',
         password: 'any',
         name: 'Super Admin',
-        avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+        avatar: 'https://user-images.githubusercontent.com/2106987/68087873-a0543980-fe94-11e9-8203-62958ce69ed6.png',
         introduction: 'I am a super administrator',
-        email: 'admin@test.com',
+        email: 'dev@apache.org',
         phone: '1234567890',
         roles: ['admin']
       }
diff --git a/vue.config.js b/vue.config.js
index 0b26844..e9b6057 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -28,7 +28,7 @@ module.exports = {
   productionSourceMap: false,
   devServer: {
     // https://cli.vuejs.org/zh/config/#devserver-proxy
-    proxy: 'http://127.0.0.1/apisix/admin/'
+    proxy: 'http://apisix.iresty.com/apisix/admin/'
   },
   pluginOptions: {
     'style-resources-loader': {