zetan-cli-dev-template-vue-element-admin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/package.json +8 -0
  2. package/template/.editorconfig +14 -0
  3. package/template/.env.development +5 -0
  4. package/template/.env.production +6 -0
  5. package/template/.env.staging +8 -0
  6. package/template/.eslintignore +4 -0
  7. package/template/.eslintrc.js +198 -0
  8. package/template/.travis.yml +5 -0
  9. package/template/LICENSE +21 -0
  10. package/template/README.es.md +228 -0
  11. package/template/README.ja.md +224 -0
  12. package/template/README.md +250 -0
  13. package/template/README.zh-CN.md +273 -0
  14. package/template/babel.config.js +14 -0
  15. package/template/build/index.js +35 -0
  16. package/template/jest.config.js +24 -0
  17. package/template/jsconfig.json +9 -0
  18. package/template/mock/article.js +116 -0
  19. package/template/mock/index.js +60 -0
  20. package/template/mock/mock-server.js +81 -0
  21. package/template/mock/remote-search.js +51 -0
  22. package/template/mock/role/index.js +98 -0
  23. package/template/mock/role/routes.js +530 -0
  24. package/template/mock/user.js +84 -0
  25. package/template/mock/utils.js +48 -0
  26. package/template/package.json +111 -0
  27. package/template/plop-templates/component/index.hbs +26 -0
  28. package/template/plop-templates/component/prompt.js +55 -0
  29. package/template/plop-templates/store/index.hbs +16 -0
  30. package/template/plop-templates/store/prompt.js +62 -0
  31. package/template/plop-templates/utils.js +2 -0
  32. package/template/plop-templates/view/index.hbs +26 -0
  33. package/template/plop-templates/view/prompt.js +55 -0
  34. package/template/plopfile.js +9 -0
  35. package/template/postcss.config.js +5 -0
  36. package/template/public/favicon.ico +0 -0
  37. package/template/public/index.html +15 -0
  38. package/template/src/App.vue +11 -0
  39. package/template/src/api/article.js +41 -0
  40. package/template/src/api/qiniu.js +8 -0
  41. package/template/src/api/remote-search.js +17 -0
  42. package/template/src/api/role.js +38 -0
  43. package/template/src/api/user.js +24 -0
  44. package/template/src/assets/401_images/401.gif +0 -0
  45. package/template/src/assets/404_images/404.png +0 -0
  46. package/template/src/assets/404_images/404_cloud.png +0 -0
  47. package/template/src/assets/custom-theme/fonts/element-icons.ttf +0 -0
  48. package/template/src/assets/custom-theme/fonts/element-icons.woff +0 -0
  49. package/template/src/assets/custom-theme/index.css +1 -0
  50. package/template/src/components/BackToTop/index.vue +111 -0
  51. package/template/src/components/Breadcrumb/index.vue +82 -0
  52. package/template/src/components/Charts/Keyboard.vue +155 -0
  53. package/template/src/components/Charts/LineMarker.vue +227 -0
  54. package/template/src/components/Charts/MixChart.vue +271 -0
  55. package/template/src/components/Charts/mixins/resize.js +56 -0
  56. package/template/src/components/DndList/index.vue +166 -0
  57. package/template/src/components/DragSelect/index.vue +65 -0
  58. package/template/src/components/Dropzone/index.vue +297 -0
  59. package/template/src/components/ErrorLog/index.vue +78 -0
  60. package/template/src/components/GithubCorner/index.vue +54 -0
  61. package/template/src/components/Hamburger/index.vue +44 -0
  62. package/template/src/components/HeaderSearch/index.vue +180 -0
  63. package/template/src/components/ImageCropper/index.vue +1779 -0
  64. package/template/src/components/ImageCropper/utils/data2blob.js +19 -0
  65. package/template/src/components/ImageCropper/utils/effectRipple.js +39 -0
  66. package/template/src/components/ImageCropper/utils/language.js +232 -0
  67. package/template/src/components/ImageCropper/utils/mimes.js +7 -0
  68. package/template/src/components/JsonEditor/index.vue +77 -0
  69. package/template/src/components/Kanban/index.vue +99 -0
  70. package/template/src/components/MDinput/index.vue +360 -0
  71. package/template/src/components/MarkdownEditor/default-options.js +31 -0
  72. package/template/src/components/MarkdownEditor/index.vue +118 -0
  73. package/template/src/components/Pagination/index.vue +101 -0
  74. package/template/src/components/PanThumb/index.vue +142 -0
  75. package/template/src/components/RightPanel/index.vue +145 -0
  76. package/template/src/components/Screenfull/index.vue +60 -0
  77. package/template/src/components/Share/DropdownMenu.vue +103 -0
  78. package/template/src/components/SizeSelect/index.vue +57 -0
  79. package/template/src/components/Sticky/index.vue +91 -0
  80. package/template/src/components/SvgIcon/index.vue +62 -0
  81. package/template/src/components/TextHoverEffect/Mallki.vue +113 -0
  82. package/template/src/components/ThemePicker/index.vue +175 -0
  83. package/template/src/components/Tinymce/components/EditorImage.vue +111 -0
  84. package/template/src/components/Tinymce/dynamicLoadScript.js +59 -0
  85. package/template/src/components/Tinymce/index.vue +247 -0
  86. package/template/src/components/Tinymce/plugins.js +7 -0
  87. package/template/src/components/Tinymce/toolbar.js +6 -0
  88. package/template/src/components/Upload/SingleImage.vue +134 -0
  89. package/template/src/components/Upload/SingleImage2.vue +130 -0
  90. package/template/src/components/Upload/SingleImage3.vue +157 -0
  91. package/template/src/components/UploadExcel/index.vue +138 -0
  92. package/template/src/directive/clipboard/clipboard.js +49 -0
  93. package/template/src/directive/clipboard/index.js +13 -0
  94. package/template/src/directive/el-drag-dialog/drag.js +77 -0
  95. package/template/src/directive/el-drag-dialog/index.js +13 -0
  96. package/template/src/directive/el-table/adaptive.js +41 -0
  97. package/template/src/directive/el-table/index.js +13 -0
  98. package/template/src/directive/permission/index.js +13 -0
  99. package/template/src/directive/permission/permission.js +31 -0
  100. package/template/src/directive/sticky.js +91 -0
  101. package/template/src/directive/waves/index.js +13 -0
  102. package/template/src/directive/waves/waves.css +26 -0
  103. package/template/src/directive/waves/waves.js +72 -0
  104. package/template/src/filters/index.js +68 -0
  105. package/template/src/icons/index.js +9 -0
  106. package/template/src/icons/svg/404.svg +1 -0
  107. package/template/src/icons/svg/bug.svg +1 -0
  108. package/template/src/icons/svg/chart.svg +1 -0
  109. package/template/src/icons/svg/clipboard.svg +1 -0
  110. package/template/src/icons/svg/component.svg +1 -0
  111. package/template/src/icons/svg/dashboard.svg +1 -0
  112. package/template/src/icons/svg/documentation.svg +1 -0
  113. package/template/src/icons/svg/drag.svg +1 -0
  114. package/template/src/icons/svg/edit.svg +1 -0
  115. package/template/src/icons/svg/education.svg +1 -0
  116. package/template/src/icons/svg/email.svg +1 -0
  117. package/template/src/icons/svg/example.svg +1 -0
  118. package/template/src/icons/svg/excel.svg +1 -0
  119. package/template/src/icons/svg/exit-fullscreen.svg +1 -0
  120. package/template/src/icons/svg/eye-open.svg +1 -0
  121. package/template/src/icons/svg/eye.svg +1 -0
  122. package/template/src/icons/svg/form.svg +1 -0
  123. package/template/src/icons/svg/fullscreen.svg +1 -0
  124. package/template/src/icons/svg/guide.svg +1 -0
  125. package/template/src/icons/svg/icon.svg +1 -0
  126. package/template/src/icons/svg/international.svg +1 -0
  127. package/template/src/icons/svg/language.svg +1 -0
  128. package/template/src/icons/svg/link.svg +1 -0
  129. package/template/src/icons/svg/list.svg +1 -0
  130. package/template/src/icons/svg/lock.svg +1 -0
  131. package/template/src/icons/svg/message.svg +1 -0
  132. package/template/src/icons/svg/money.svg +1 -0
  133. package/template/src/icons/svg/nested.svg +1 -0
  134. package/template/src/icons/svg/password.svg +1 -0
  135. package/template/src/icons/svg/pdf.svg +1 -0
  136. package/template/src/icons/svg/people.svg +1 -0
  137. package/template/src/icons/svg/peoples.svg +1 -0
  138. package/template/src/icons/svg/qq.svg +1 -0
  139. package/template/src/icons/svg/search.svg +1 -0
  140. package/template/src/icons/svg/shopping.svg +1 -0
  141. package/template/src/icons/svg/size.svg +1 -0
  142. package/template/src/icons/svg/skill.svg +1 -0
  143. package/template/src/icons/svg/star.svg +1 -0
  144. package/template/src/icons/svg/tab.svg +1 -0
  145. package/template/src/icons/svg/table.svg +1 -0
  146. package/template/src/icons/svg/theme.svg +1 -0
  147. package/template/src/icons/svg/tree-table.svg +1 -0
  148. package/template/src/icons/svg/tree.svg +1 -0
  149. package/template/src/icons/svg/user.svg +1 -0
  150. package/template/src/icons/svg/wechat.svg +1 -0
  151. package/template/src/icons/svg/zip.svg +1 -0
  152. package/template/src/icons/svgo.yml +22 -0
  153. package/template/src/layout/components/AppMain.vue +57 -0
  154. package/template/src/layout/components/Navbar.vue +167 -0
  155. package/template/src/layout/components/Settings/index.vue +108 -0
  156. package/template/src/layout/components/Sidebar/FixiOSBug.js +26 -0
  157. package/template/src/layout/components/Sidebar/Item.vue +41 -0
  158. package/template/src/layout/components/Sidebar/Link.vue +43 -0
  159. package/template/src/layout/components/Sidebar/Logo.vue +82 -0
  160. package/template/src/layout/components/Sidebar/SidebarItem.vue +95 -0
  161. package/template/src/layout/components/Sidebar/index.vue +54 -0
  162. package/template/src/layout/components/TagsView/ScrollPane.vue +94 -0
  163. package/template/src/layout/components/TagsView/index.vue +292 -0
  164. package/template/src/layout/components/index.js +5 -0
  165. package/template/src/layout/index.vue +102 -0
  166. package/template/src/layout/mixin/ResizeHandler.js +45 -0
  167. package/template/src/main.js +53 -0
  168. package/template/src/permission.js +74 -0
  169. package/template/src/router/index.js +404 -0
  170. package/template/src/router/modules/charts.js +36 -0
  171. package/template/src/router/modules/components.js +102 -0
  172. package/template/src/router/modules/nested.js +66 -0
  173. package/template/src/router/modules/table.js +41 -0
  174. package/template/src/settings.js +35 -0
  175. package/template/src/store/getters.js +15 -0
  176. package/template/src/store/index.js +25 -0
  177. package/template/src/store/modules/app.js +56 -0
  178. package/template/src/store/modules/errorLog.js +28 -0
  179. package/template/src/store/modules/permission.js +69 -0
  180. package/template/src/store/modules/settings.js +35 -0
  181. package/template/src/store/modules/tagsView.js +160 -0
  182. package/template/src/store/modules/user.js +131 -0
  183. package/template/src/styles/btn.scss +99 -0
  184. package/template/src/styles/element-ui.scss +84 -0
  185. package/template/src/styles/element-variables.scss +31 -0
  186. package/template/src/styles/index.scss +191 -0
  187. package/template/src/styles/mixin.scss +66 -0
  188. package/template/src/styles/sidebar.scss +226 -0
  189. package/template/src/styles/transition.scss +48 -0
  190. package/template/src/styles/variables.scss +35 -0
  191. package/template/src/utils/auth.js +15 -0
  192. package/template/src/utils/clipboard.js +32 -0
  193. package/template/src/utils/error-log.js +35 -0
  194. package/template/src/utils/get-page-title.js +10 -0
  195. package/template/src/utils/index.js +357 -0
  196. package/template/src/utils/open-window.js +25 -0
  197. package/template/src/utils/permission.js +21 -0
  198. package/template/src/utils/request.js +85 -0
  199. package/template/src/utils/scroll-to.js +58 -0
  200. package/template/src/utils/validate.js +87 -0
  201. package/template/src/vendor/Export2Excel.js +220 -0
  202. package/template/src/vendor/Export2Zip.js +24 -0
  203. package/template/src/views/charts/keyboard.vue +23 -0
  204. package/template/src/views/charts/line.vue +23 -0
  205. package/template/src/views/charts/mix-chart.vue +23 -0
  206. package/template/src/views/clipboard/index.vue +49 -0
  207. package/template/src/views/components-demo/avatar-upload.vue +61 -0
  208. package/template/src/views/components-demo/back-to-top.vue +154 -0
  209. package/template/src/views/components-demo/count-to.vue +218 -0
  210. package/template/src/views/components-demo/dnd-list.vue +39 -0
  211. package/template/src/views/components-demo/drag-dialog.vue +61 -0
  212. package/template/src/views/components-demo/drag-kanban.vue +66 -0
  213. package/template/src/views/components-demo/drag-select.vue +43 -0
  214. package/template/src/views/components-demo/dropzone.vue +31 -0
  215. package/template/src/views/components-demo/json-editor.vue +36 -0
  216. package/template/src/views/components-demo/markdown.vue +101 -0
  217. package/template/src/views/components-demo/mixin.vue +169 -0
  218. package/template/src/views/components-demo/split-pane.vue +67 -0
  219. package/template/src/views/components-demo/sticky.vue +135 -0
  220. package/template/src/views/components-demo/tinymce.vue +36 -0
  221. package/template/src/views/dashboard/admin/components/BarChart.vue +102 -0
  222. package/template/src/views/dashboard/admin/components/BoxCard.vue +118 -0
  223. package/template/src/views/dashboard/admin/components/LineChart.vue +135 -0
  224. package/template/src/views/dashboard/admin/components/PanelGroup.vue +181 -0
  225. package/template/src/views/dashboard/admin/components/PieChart.vue +79 -0
  226. package/template/src/views/dashboard/admin/components/RaddarChart.vue +116 -0
  227. package/template/src/views/dashboard/admin/components/TodoList/Todo.vue +81 -0
  228. package/template/src/views/dashboard/admin/components/TodoList/index.scss +320 -0
  229. package/template/src/views/dashboard/admin/components/TodoList/index.vue +127 -0
  230. package/template/src/views/dashboard/admin/components/TransactionTable.vue +55 -0
  231. package/template/src/views/dashboard/admin/components/mixins/resize.js +55 -0
  232. package/template/src/views/dashboard/admin/index.vue +124 -0
  233. package/template/src/views/dashboard/editor/index.vue +74 -0
  234. package/template/src/views/dashboard/index.vue +31 -0
  235. package/template/src/views/documentation/index.vue +57 -0
  236. package/template/src/views/error-log/components/ErrorTestA.vue +13 -0
  237. package/template/src/views/error-log/components/ErrorTestB.vue +11 -0
  238. package/template/src/views/error-log/index.vue +32 -0
  239. package/template/src/views/error-page/401.vue +99 -0
  240. package/template/src/views/error-page/404.vue +228 -0
  241. package/template/src/views/example/components/ArticleDetail.vue +289 -0
  242. package/template/src/views/example/components/Dropdown/Comment.vue +41 -0
  243. package/template/src/views/example/components/Dropdown/Platform.vue +46 -0
  244. package/template/src/views/example/components/Dropdown/SourceUrl.vue +38 -0
  245. package/template/src/views/example/components/Dropdown/index.js +3 -0
  246. package/template/src/views/example/components/Warning.vue +13 -0
  247. package/template/src/views/example/create.vue +13 -0
  248. package/template/src/views/example/edit.vue +13 -0
  249. package/template/src/views/example/list.vue +112 -0
  250. package/template/src/views/excel/components/AutoWidthOption.vue +34 -0
  251. package/template/src/views/excel/components/BookTypeOption.vue +39 -0
  252. package/template/src/views/excel/components/FilenameOption.vue +27 -0
  253. package/template/src/views/excel/export-excel.vue +116 -0
  254. package/template/src/views/excel/merge-header.vue +101 -0
  255. package/template/src/views/excel/select-excel.vue +107 -0
  256. package/template/src/views/excel/upload-excel.vue +42 -0
  257. package/template/src/views/guide/index.vue +36 -0
  258. package/template/src/views/guide/steps.js +53 -0
  259. package/template/src/views/icons/element-icons.js +3 -0
  260. package/template/src/views/icons/index.vue +101 -0
  261. package/template/src/views/icons/svg-icons.js +10 -0
  262. package/template/src/views/login/auth-redirect.vue +15 -0
  263. package/template/src/views/login/components/SocialSignin.vue +72 -0
  264. package/template/src/views/login/index.vue +324 -0
  265. package/template/src/views/nested/menu1/index.vue +7 -0
  266. package/template/src/views/nested/menu1/menu1-1/index.vue +7 -0
  267. package/template/src/views/nested/menu1/menu1-2/index.vue +7 -0
  268. package/template/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue +5 -0
  269. package/template/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue +5 -0
  270. package/template/src/views/nested/menu1/menu1-3/index.vue +5 -0
  271. package/template/src/views/nested/menu2/index.vue +5 -0
  272. package/template/src/views/pdf/content.js +58 -0
  273. package/template/src/views/pdf/download.vue +201 -0
  274. package/template/src/views/pdf/index.vue +13 -0
  275. package/template/src/views/permission/components/SwitchRoles.vue +32 -0
  276. package/template/src/views/permission/directive.vue +111 -0
  277. package/template/src/views/permission/page.vue +19 -0
  278. package/template/src/views/permission/role.vue +270 -0
  279. package/template/src/views/profile/components/Account.vue +38 -0
  280. package/template/src/views/profile/components/Activity.vue +185 -0
  281. package/template/src/views/profile/components/Timeline.vue +43 -0
  282. package/template/src/views/profile/components/UserCard.vue +134 -0
  283. package/template/src/views/profile/index.vue +68 -0
  284. package/template/src/views/qiniu/upload.vue +41 -0
  285. package/template/src/views/redirect/index.vue +12 -0
  286. package/template/src/views/tab/components/TabPane.vue +103 -0
  287. package/template/src/views/tab/index.vue +57 -0
  288. package/template/src/views/table/complex-table.vue +379 -0
  289. package/template/src/views/table/drag-table.vue +153 -0
  290. package/template/src/views/table/dynamic-table/components/FixedThead.vue +62 -0
  291. package/template/src/views/table/dynamic-table/components/UnfixedThead.vue +50 -0
  292. package/template/src/views/table/dynamic-table/index.vue +24 -0
  293. package/template/src/views/table/inline-edit-table.vue +149 -0
  294. package/template/src/views/theme/index.vue +120 -0
  295. package/template/src/views/zip/index.vue +77 -0
  296. package/template/tests/unit/.eslintrc.js +5 -0
  297. package/template/tests/unit/components/Hamburger.spec.js +18 -0
  298. package/template/tests/unit/components/SvgIcon.spec.js +22 -0
  299. package/template/tests/unit/utils/formatTime.spec.js +29 -0
  300. package/template/tests/unit/utils/param2Obj.spec.js +14 -0
  301. package/template/tests/unit/utils/parseTime.spec.js +37 -0
  302. package/template/tests/unit/utils/validate.spec.js +28 -0
  303. package/template/vue.config.js +124 -0
@@ -0,0 +1,35 @@
1
+ import Vue from 'vue'
2
+ import store from '@/store'
3
+ import { isString, isArray } from '@/utils/validate'
4
+ import settings from '@/settings'
5
+
6
+ // you can set in settings.js
7
+ // errorLog:'production' | ['production', 'development']
8
+ const { errorLog: needErrorLog } = settings
9
+
10
+ function checkNeed() {
11
+ const env = process.env.NODE_ENV
12
+ if (isString(needErrorLog)) {
13
+ return env === needErrorLog
14
+ }
15
+ if (isArray(needErrorLog)) {
16
+ return needErrorLog.includes(env)
17
+ }
18
+ return false
19
+ }
20
+
21
+ if (checkNeed()) {
22
+ Vue.config.errorHandler = function(err, vm, info, a) {
23
+ // Don't ask me why I use Vue.nextTick, it just a hack.
24
+ // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
25
+ Vue.nextTick(() => {
26
+ store.dispatch('errorLog/addErrorLog', {
27
+ err,
28
+ vm,
29
+ info,
30
+ url: window.location.href
31
+ })
32
+ console.error(err, info)
33
+ })
34
+ }
35
+ }
@@ -0,0 +1,10 @@
1
+ import defaultSettings from '@/settings'
2
+
3
+ const title = defaultSettings.title || 'Vue Element Admin'
4
+
5
+ export default function getPageTitle(pageTitle) {
6
+ if (pageTitle) {
7
+ return `${pageTitle} - ${title}`
8
+ }
9
+ return `${title}`
10
+ }
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Created by PanJiaChen on 16/11/18.
3
+ */
4
+
5
+ /**
6
+ * Parse the time to string
7
+ * @param {(Object|string|number)} time
8
+ * @param {string} cFormat
9
+ * @returns {string | null}
10
+ */
11
+ export function parseTime(time, cFormat) {
12
+ if (arguments.length === 0 || !time) {
13
+ return null
14
+ }
15
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
16
+ let date
17
+ if (typeof time === 'object') {
18
+ date = time
19
+ } else {
20
+ if ((typeof time === 'string')) {
21
+ if ((/^[0-9]+$/.test(time))) {
22
+ // support "1548221490638"
23
+ time = parseInt(time)
24
+ } else {
25
+ // support safari
26
+ // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
27
+ time = time.replace(new RegExp(/-/gm), '/')
28
+ }
29
+ }
30
+
31
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
32
+ time = time * 1000
33
+ }
34
+ date = new Date(time)
35
+ }
36
+ const formatObj = {
37
+ y: date.getFullYear(),
38
+ m: date.getMonth() + 1,
39
+ d: date.getDate(),
40
+ h: date.getHours(),
41
+ i: date.getMinutes(),
42
+ s: date.getSeconds(),
43
+ a: date.getDay()
44
+ }
45
+ const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
46
+ const value = formatObj[key]
47
+ // Note: getDay() returns 0 on Sunday
48
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
49
+ return value.toString().padStart(2, '0')
50
+ })
51
+ return time_str
52
+ }
53
+
54
+ /**
55
+ * @param {number} time
56
+ * @param {string} option
57
+ * @returns {string}
58
+ */
59
+ export function formatTime(time, option) {
60
+ if (('' + time).length === 10) {
61
+ time = parseInt(time) * 1000
62
+ } else {
63
+ time = +time
64
+ }
65
+ const d = new Date(time)
66
+ const now = Date.now()
67
+
68
+ const diff = (now - d) / 1000
69
+
70
+ if (diff < 30) {
71
+ return '刚刚'
72
+ } else if (diff < 3600) {
73
+ // less 1 hour
74
+ return Math.ceil(diff / 60) + '分钟前'
75
+ } else if (diff < 3600 * 24) {
76
+ return Math.ceil(diff / 3600) + '小时前'
77
+ } else if (diff < 3600 * 24 * 2) {
78
+ return '1天前'
79
+ }
80
+ if (option) {
81
+ return parseTime(time, option)
82
+ } else {
83
+ return (
84
+ d.getMonth() +
85
+ 1 +
86
+ '月' +
87
+ d.getDate() +
88
+ '日' +
89
+ d.getHours() +
90
+ '时' +
91
+ d.getMinutes() +
92
+ '分'
93
+ )
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @param {string} url
99
+ * @returns {Object}
100
+ */
101
+ export function getQueryObject(url) {
102
+ url = url == null ? window.location.href : url
103
+ const search = url.substring(url.lastIndexOf('?') + 1)
104
+ const obj = {}
105
+ const reg = /([^?&=]+)=([^?&=]*)/g
106
+ search.replace(reg, (rs, $1, $2) => {
107
+ const name = decodeURIComponent($1)
108
+ let val = decodeURIComponent($2)
109
+ val = String(val)
110
+ obj[name] = val
111
+ return rs
112
+ })
113
+ return obj
114
+ }
115
+
116
+ /**
117
+ * @param {string} input value
118
+ * @returns {number} output value
119
+ */
120
+ export function byteLength(str) {
121
+ // returns the byte length of an utf8 string
122
+ let s = str.length
123
+ for (var i = str.length - 1; i >= 0; i--) {
124
+ const code = str.charCodeAt(i)
125
+ if (code > 0x7f && code <= 0x7ff) s++
126
+ else if (code > 0x7ff && code <= 0xffff) s += 2
127
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
128
+ }
129
+ return s
130
+ }
131
+
132
+ /**
133
+ * @param {Array} actual
134
+ * @returns {Array}
135
+ */
136
+ export function cleanArray(actual) {
137
+ const newArray = []
138
+ for (let i = 0; i < actual.length; i++) {
139
+ if (actual[i]) {
140
+ newArray.push(actual[i])
141
+ }
142
+ }
143
+ return newArray
144
+ }
145
+
146
+ /**
147
+ * @param {Object} json
148
+ * @returns {Array}
149
+ */
150
+ export function param(json) {
151
+ if (!json) return ''
152
+ return cleanArray(
153
+ Object.keys(json).map(key => {
154
+ if (json[key] === undefined) return ''
155
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
156
+ })
157
+ ).join('&')
158
+ }
159
+
160
+ /**
161
+ * @param {string} url
162
+ * @returns {Object}
163
+ */
164
+ export function param2Obj(url) {
165
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
166
+ if (!search) {
167
+ return {}
168
+ }
169
+ const obj = {}
170
+ const searchArr = search.split('&')
171
+ searchArr.forEach(v => {
172
+ const index = v.indexOf('=')
173
+ if (index !== -1) {
174
+ const name = v.substring(0, index)
175
+ const val = v.substring(index + 1, v.length)
176
+ obj[name] = val
177
+ }
178
+ })
179
+ return obj
180
+ }
181
+
182
+ /**
183
+ * @param {string} val
184
+ * @returns {string}
185
+ */
186
+ export function html2Text(val) {
187
+ const div = document.createElement('div')
188
+ div.innerHTML = val
189
+ return div.textContent || div.innerText
190
+ }
191
+
192
+ /**
193
+ * Merges two objects, giving the last one precedence
194
+ * @param {Object} target
195
+ * @param {(Object|Array)} source
196
+ * @returns {Object}
197
+ */
198
+ export function objectMerge(target, source) {
199
+ if (typeof target !== 'object') {
200
+ target = {}
201
+ }
202
+ if (Array.isArray(source)) {
203
+ return source.slice()
204
+ }
205
+ Object.keys(source).forEach(property => {
206
+ const sourceProperty = source[property]
207
+ if (typeof sourceProperty === 'object') {
208
+ target[property] = objectMerge(target[property], sourceProperty)
209
+ } else {
210
+ target[property] = sourceProperty
211
+ }
212
+ })
213
+ return target
214
+ }
215
+
216
+ /**
217
+ * @param {HTMLElement} element
218
+ * @param {string} className
219
+ */
220
+ export function toggleClass(element, className) {
221
+ if (!element || !className) {
222
+ return
223
+ }
224
+ let classString = element.className
225
+ const nameIndex = classString.indexOf(className)
226
+ if (nameIndex === -1) {
227
+ classString += '' + className
228
+ } else {
229
+ classString =
230
+ classString.substr(0, nameIndex) +
231
+ classString.substr(nameIndex + className.length)
232
+ }
233
+ element.className = classString
234
+ }
235
+
236
+ /**
237
+ * @param {string} type
238
+ * @returns {Date}
239
+ */
240
+ export function getTime(type) {
241
+ if (type === 'start') {
242
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
243
+ } else {
244
+ return new Date(new Date().toDateString())
245
+ }
246
+ }
247
+
248
+ /**
249
+ * @param {Function} func
250
+ * @param {number} wait
251
+ * @param {boolean} immediate
252
+ * @return {*}
253
+ */
254
+ export function debounce(func, wait, immediate) {
255
+ let timeout, args, context, timestamp, result
256
+
257
+ const later = function() {
258
+ // 据上一次触发时间间隔
259
+ const last = +new Date() - timestamp
260
+
261
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
262
+ if (last < wait && last > 0) {
263
+ timeout = setTimeout(later, wait - last)
264
+ } else {
265
+ timeout = null
266
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
267
+ if (!immediate) {
268
+ result = func.apply(context, args)
269
+ if (!timeout) context = args = null
270
+ }
271
+ }
272
+ }
273
+
274
+ return function(...args) {
275
+ context = this
276
+ timestamp = +new Date()
277
+ const callNow = immediate && !timeout
278
+ // 如果延时不存在,重新设定延时
279
+ if (!timeout) timeout = setTimeout(later, wait)
280
+ if (callNow) {
281
+ result = func.apply(context, args)
282
+ context = args = null
283
+ }
284
+
285
+ return result
286
+ }
287
+ }
288
+
289
+ /**
290
+ * This is just a simple version of deep copy
291
+ * Has a lot of edge cases bug
292
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
293
+ * @param {Object} source
294
+ * @returns {Object}
295
+ */
296
+ export function deepClone(source) {
297
+ if (!source && typeof source !== 'object') {
298
+ throw new Error('error arguments', 'deepClone')
299
+ }
300
+ const targetObj = source.constructor === Array ? [] : {}
301
+ Object.keys(source).forEach(keys => {
302
+ if (source[keys] && typeof source[keys] === 'object') {
303
+ targetObj[keys] = deepClone(source[keys])
304
+ } else {
305
+ targetObj[keys] = source[keys]
306
+ }
307
+ })
308
+ return targetObj
309
+ }
310
+
311
+ /**
312
+ * @param {Array} arr
313
+ * @returns {Array}
314
+ */
315
+ export function uniqueArr(arr) {
316
+ return Array.from(new Set(arr))
317
+ }
318
+
319
+ /**
320
+ * @returns {string}
321
+ */
322
+ export function createUniqueString() {
323
+ const timestamp = +new Date() + ''
324
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
325
+ return (+(randomNum + timestamp)).toString(32)
326
+ }
327
+
328
+ /**
329
+ * Check if an element has a class
330
+ * @param {HTMLElement} elm
331
+ * @param {string} cls
332
+ * @returns {boolean}
333
+ */
334
+ export function hasClass(ele, cls) {
335
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
336
+ }
337
+
338
+ /**
339
+ * Add class to element
340
+ * @param {HTMLElement} elm
341
+ * @param {string} cls
342
+ */
343
+ export function addClass(ele, cls) {
344
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
345
+ }
346
+
347
+ /**
348
+ * Remove class from element
349
+ * @param {HTMLElement} elm
350
+ * @param {string} cls
351
+ */
352
+ export function removeClass(ele, cls) {
353
+ if (hasClass(ele, cls)) {
354
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
355
+ ele.className = ele.className.replace(reg, ' ')
356
+ }
357
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ *Created by PanJiaChen on 16/11/29.
3
+ * @param {Sting} url
4
+ * @param {Sting} title
5
+ * @param {Number} w
6
+ * @param {Number} h
7
+ */
8
+ export default function openWindow(url, title, w, h) {
9
+ // Fixes dual-screen position Most browsers Firefox
10
+ const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
11
+ const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
12
+
13
+ const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
14
+ const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height
15
+
16
+ const left = ((width / 2) - (w / 2)) + dualScreenLeft
17
+ const top = ((height / 2) - (h / 2)) + dualScreenTop
18
+ const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)
19
+
20
+ // Puts focus on the newWindow
21
+ if (window.focus) {
22
+ newWindow.focus()
23
+ }
24
+ }
25
+
@@ -0,0 +1,21 @@
1
+ import store from '@/store'
2
+
3
+ /**
4
+ * @param {Array} value
5
+ * @returns {Boolean}
6
+ * @example see @/views/permission/directive.vue
7
+ */
8
+ export default function checkPermission(value) {
9
+ if (value && value instanceof Array && value.length > 0) {
10
+ const roles = store.getters && store.getters.roles
11
+ const permissionRoles = value
12
+
13
+ const hasPermission = roles.some(role => {
14
+ return permissionRoles.includes(role)
15
+ })
16
+ return hasPermission
17
+ } else {
18
+ console.error(`need roles! Like v-permission="['admin','editor']"`)
19
+ return false
20
+ }
21
+ }
@@ -0,0 +1,85 @@
1
+ import axios from 'axios'
2
+ import { MessageBox, Message } from 'element-ui'
3
+ import store from '@/store'
4
+ import { getToken } from '@/utils/auth'
5
+
6
+ // create an axios instance
7
+ const service = axios.create({
8
+ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
9
+ // withCredentials: true, // send cookies when cross-domain requests
10
+ timeout: 5000 // request timeout
11
+ })
12
+
13
+ // request interceptor
14
+ service.interceptors.request.use(
15
+ config => {
16
+ // do something before request is sent
17
+
18
+ if (store.getters.token) {
19
+ // let each request carry token
20
+ // ['X-Token'] is a custom headers key
21
+ // please modify it according to the actual situation
22
+ config.headers['X-Token'] = getToken()
23
+ }
24
+ return config
25
+ },
26
+ error => {
27
+ // do something with request error
28
+ console.log(error) // for debug
29
+ return Promise.reject(error)
30
+ }
31
+ )
32
+
33
+ // response interceptor
34
+ service.interceptors.response.use(
35
+ /**
36
+ * If you want to get http information such as headers or status
37
+ * Please return response => response
38
+ */
39
+
40
+ /**
41
+ * Determine the request status by custom code
42
+ * Here is just an example
43
+ * You can also judge the status by HTTP Status Code
44
+ */
45
+ response => {
46
+ const res = response.data
47
+
48
+ // if the custom code is not 20000, it is judged as an error.
49
+ if (res.code !== 20000) {
50
+ Message({
51
+ message: res.message || 'Error',
52
+ type: 'error',
53
+ duration: 5 * 1000
54
+ })
55
+
56
+ // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
57
+ if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
58
+ // to re-login
59
+ MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
60
+ confirmButtonText: 'Re-Login',
61
+ cancelButtonText: 'Cancel',
62
+ type: 'warning'
63
+ }).then(() => {
64
+ store.dispatch('user/resetToken').then(() => {
65
+ location.reload()
66
+ })
67
+ })
68
+ }
69
+ return Promise.reject(new Error(res.message || 'Error'))
70
+ } else {
71
+ return res
72
+ }
73
+ },
74
+ error => {
75
+ console.log('err' + error) // for debug
76
+ Message({
77
+ message: error.message,
78
+ type: 'error',
79
+ duration: 5 * 1000
80
+ })
81
+ return Promise.reject(error)
82
+ }
83
+ )
84
+
85
+ export default service
@@ -0,0 +1,58 @@
1
+ Math.easeInOutQuad = function(t, b, c, d) {
2
+ t /= d / 2
3
+ if (t < 1) {
4
+ return c / 2 * t * t + b
5
+ }
6
+ t--
7
+ return -c / 2 * (t * (t - 2) - 1) + b
8
+ }
9
+
10
+ // requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
11
+ var requestAnimFrame = (function() {
12
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
13
+ })()
14
+
15
+ /**
16
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
17
+ * @param {number} amount
18
+ */
19
+ function move(amount) {
20
+ document.documentElement.scrollTop = amount
21
+ document.body.parentNode.scrollTop = amount
22
+ document.body.scrollTop = amount
23
+ }
24
+
25
+ function position() {
26
+ return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
27
+ }
28
+
29
+ /**
30
+ * @param {number} to
31
+ * @param {number} duration
32
+ * @param {Function} callback
33
+ */
34
+ export function scrollTo(to, duration, callback) {
35
+ const start = position()
36
+ const change = to - start
37
+ const increment = 20
38
+ let currentTime = 0
39
+ duration = (typeof (duration) === 'undefined') ? 500 : duration
40
+ var animateScroll = function() {
41
+ // increment the time
42
+ currentTime += increment
43
+ // find the value with the quadratic in-out easing function
44
+ var val = Math.easeInOutQuad(currentTime, start, change, duration)
45
+ // move the document.body
46
+ move(val)
47
+ // do the animation unless its over
48
+ if (currentTime < duration) {
49
+ requestAnimFrame(animateScroll)
50
+ } else {
51
+ if (callback && typeof (callback) === 'function') {
52
+ // the animation is done so lets callback
53
+ callback()
54
+ }
55
+ }
56
+ }
57
+ animateScroll()
58
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Created by PanJiaChen on 16/11/18.
3
+ */
4
+
5
+ /**
6
+ * @param {string} path
7
+ * @returns {Boolean}
8
+ */
9
+ export function isExternal(path) {
10
+ return /^(https?:|mailto:|tel:)/.test(path)
11
+ }
12
+
13
+ /**
14
+ * @param {string} str
15
+ * @returns {Boolean}
16
+ */
17
+ export function validUsername(str) {
18
+ const valid_map = ['admin', 'editor']
19
+ return valid_map.indexOf(str.trim()) >= 0
20
+ }
21
+
22
+ /**
23
+ * @param {string} url
24
+ * @returns {Boolean}
25
+ */
26
+ export function validURL(url) {
27
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
28
+ return reg.test(url)
29
+ }
30
+
31
+ /**
32
+ * @param {string} str
33
+ * @returns {Boolean}
34
+ */
35
+ export function validLowerCase(str) {
36
+ const reg = /^[a-z]+$/
37
+ return reg.test(str)
38
+ }
39
+
40
+ /**
41
+ * @param {string} str
42
+ * @returns {Boolean}
43
+ */
44
+ export function validUpperCase(str) {
45
+ const reg = /^[A-Z]+$/
46
+ return reg.test(str)
47
+ }
48
+
49
+ /**
50
+ * @param {string} str
51
+ * @returns {Boolean}
52
+ */
53
+ export function validAlphabets(str) {
54
+ const reg = /^[A-Za-z]+$/
55
+ return reg.test(str)
56
+ }
57
+
58
+ /**
59
+ * @param {string} email
60
+ * @returns {Boolean}
61
+ */
62
+ export function validEmail(email) {
63
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
64
+ return reg.test(email)
65
+ }
66
+
67
+ /**
68
+ * @param {string} str
69
+ * @returns {Boolean}
70
+ */
71
+ export function isString(str) {
72
+ if (typeof str === 'string' || str instanceof String) {
73
+ return true
74
+ }
75
+ return false
76
+ }
77
+
78
+ /**
79
+ * @param {Array} arg
80
+ * @returns {Boolean}
81
+ */
82
+ export function isArray(arg) {
83
+ if (typeof Array.isArray === 'undefined') {
84
+ return Object.prototype.toString.call(arg) === '[object Array]'
85
+ }
86
+ return Array.isArray(arg)
87
+ }