├── .browserslistrc ├── .circleci └── config.yml ├── .editorconfig ├── .env.development ├── .env.production ├── .env.pserve ├── .env.staging ├── .eslintignore ├── .eslintrc.js ├── .github ├── CODE_OF_CONDUCT.md ├── COMMIT_CONVENTION.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── deploy.yml ├── .gitignore ├── LICENSE ├── README-zh.md ├── README.md ├── babel.config.js ├── cypress.json ├── demo └── dashboard.png ├── dos ├── koa开发遇到问题与解决.doc ├── ttf字蛛 │ ├── README.md │ ├── cmd执行.txt │ └── index.html ├── 前端开发遇到的问题.doc ├── 前端遇到问题及解决.doc └── 本系统技术点.doc ├── jest.config.js ├── mock ├── api.ts ├── articles.ts ├── mock-server.ts ├── role │ ├── index.ts │ └── routes.ts ├── security.ts ├── swagger.yml ├── transactions.ts ├── tsconfig.json └── users.ts ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── img │ └── icons │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── android-chrome-maskable-192x192.png │ │ ├── android-chrome-maskable-512x512.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-180x180.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── apple-touch-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── msapplication-icon-144x144.png │ │ ├── mstile-150x150.png │ │ └── safari-pinned-tab.svg ├── index.html ├── manifest.json ├── robots.txt └── tinymce │ ├── emojis.min.js │ ├── langs │ ├── es.js │ ├── ja.js │ ├── ko_KR.js │ └── zh_CN.js │ └── skins │ ├── content.inline.min.css │ ├── content.min.css │ ├── content.mobile.min.css │ ├── fonts │ └── tinymce-mobile.woff │ ├── skin.min.css │ └── skin.mobile.min.css ├── src ├── App.vue ├── api │ ├── apiInterface │ │ └── phone-attribution.ts │ ├── articles.ts │ ├── common.ts │ ├── common │ │ └── sendMsg.ts │ ├── eat │ │ ├── index.ts │ │ └── types.ts │ ├── itKnowledge │ │ ├── frontEnd.ts │ │ └── types.ts │ ├── me │ │ ├── agentEvent.ts │ │ ├── featuresDev.ts │ │ ├── featuresDevType.ts │ │ └── types.ts │ ├── music │ │ ├── index.ts │ │ └── singer │ │ │ ├── index.ts │ │ │ └── lyric.ts │ ├── pTypes.ts │ ├── personal │ │ └── personal-view │ │ │ ├── certificateAuthentication.d.ts │ │ │ └── certificateAuthentication.ts │ ├── roles.ts │ ├── sys │ │ ├── sysMenu.ts │ │ ├── sysRole.ts │ │ ├── sysUser.ts │ │ └── types │ │ │ └── index.ts │ ├── transactions.ts │ ├── types.d.ts │ ├── users.ts │ └── usualWebsite │ │ ├── index.ts │ │ └── types.ts ├── assets │ ├── 401-images │ │ └── 401.gif │ ├── 404-images │ │ ├── 404-cloud.png │ │ └── 404.png │ ├── custom-theme │ │ ├── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ │ └── index.css │ ├── fzzj-hfxcjw.rar │ └── fzzj-hfxcjw │ │ ├── .font-spider │ │ └── FZZJ-HFXCJW.TTF │ │ ├── FZZJ-HFXCJW.TTF │ │ └── font.css ├── cache │ ├── local │ │ └── index.ts │ └── session │ │ ├── index.ts │ │ └── modules │ │ └── user.ts ├── components │ ├── AvatarUpload │ │ └── index.vue │ ├── BackToTop │ │ └── index.vue │ ├── Breadcrumb │ │ └── index.vue │ ├── Button │ │ ├── LoadingBtn.vue │ │ ├── README.md │ │ └── index.ts │ ├── Charts │ │ ├── BarChart.vue │ │ ├── LineChart.vue │ │ ├── MixedChart.vue │ │ └── mixins │ │ │ └── resize.ts │ ├── Dialog │ │ ├── index.vue │ │ └── types │ │ │ └── index.ts │ ├── DraggableKanban │ │ └── index.vue │ ├── DraggableList │ │ └── index.vue │ ├── DraggableSelect │ │ └── index.vue │ ├── DropdownMenu │ │ └── index.vue │ ├── Dropzone │ │ └── index.vue │ ├── ElForm │ │ └── index.vue │ ├── ElTable │ │ └── index.vue │ ├── ErrorLog │ │ └── index.vue │ ├── GithubCorner │ │ └── index.vue │ ├── Global │ │ ├── README.md │ │ └── index.vue │ ├── Hamburger │ │ └── index.vue │ ├── HeadRadio │ │ └── index.vue │ ├── HeaderSearch │ │ └── index.vue │ ├── JsonEditor │ │ └── index.vue │ ├── LangSelect │ │ └── index.vue │ ├── MarkdownEditor │ │ ├── default-options.ts │ │ └── index.vue │ ├── MaterialInput │ │ └── index.vue │ ├── Music │ │ ├── VueAudio.vue │ │ └── VueAudio1111.vue │ ├── Pagination │ │ └── index.vue │ ├── PanThumb │ │ └── index.vue │ ├── RightPanel │ │ └── index.vue │ ├── Screenfull │ │ └── index.vue │ ├── SearchAndFeatures │ │ ├── README.md │ │ ├── SearchFeatures.vue │ │ ├── index.ts │ │ └── modules │ │ │ └── SearchAndFetures.ts │ ├── SizeSelect │ │ └── index.vue │ ├── Sticky │ │ └── index.vue │ ├── Table │ │ ├── README.md │ │ ├── SingleLine.vue │ │ └── index.ts │ ├── TextHoverEffect │ │ └── Mallki.vue │ ├── ThemePicker │ │ └── index.vue │ ├── Tinymce │ │ ├── components │ │ │ └── EditorImage.vue │ │ ├── config.ts │ │ └── index.vue │ ├── UploadExcel │ │ └── index.vue │ ├── UploadFile │ │ └── index.vue │ └── UploadImage │ │ └── index.vue ├── const │ ├── index.ts │ ├── juhe.ts │ └── urls.ts ├── directives │ ├── clipboard │ │ └── index.ts │ ├── el-draggable-dialog │ │ └── index.ts │ ├── index.ts │ ├── permission │ │ └── index.ts │ └── waves │ │ ├── index.ts │ │ └── waves.css ├── eventBus │ ├── index.ts │ └── modules │ │ └── clearEventBus.ts ├── filters │ └── index.ts ├── globals.d.ts ├── icons │ ├── README.md │ ├── components │ │ ├── 404.ts │ │ ├── back-top.ts │ │ ├── bug.ts │ │ ├── chart.ts │ │ ├── clipboard.ts │ │ ├── component.ts │ │ ├── dashboard.ts │ │ ├── documentation.ts │ │ ├── drag.ts │ │ ├── edit.ts │ │ ├── education.ts │ │ ├── email.ts │ │ ├── example.ts │ │ ├── excel.ts │ │ ├── exit-fullscreen.ts │ │ ├── eye-off.ts │ │ ├── eye-on.ts │ │ ├── form.ts │ │ ├── fullscreen.ts │ │ ├── guide-2.ts │ │ ├── guide.ts │ │ ├── hamburger.ts │ │ ├── icon.ts │ │ ├── index.ts │ │ ├── international.ts │ │ ├── language.ts │ │ ├── like.ts │ │ ├── link.ts │ │ ├── list.ts │ │ ├── lock.ts │ │ ├── message.ts │ │ ├── money.ts │ │ ├── music.ts │ │ ├── nested.ts │ │ ├── password.ts │ │ ├── pdf.ts │ │ ├── people.ts │ │ ├── peoples.ts │ │ ├── qq.ts │ │ ├── search.ts │ │ ├── shopping.ts │ │ ├── singer-song-list.ts │ │ ├── singer-song-lyric.ts │ │ ├── singer.ts │ │ ├── size.ts │ │ ├── skill.ts │ │ ├── star.ts │ │ ├── tab.ts │ │ ├── table.ts │ │ ├── theme.ts │ │ ├── tree-table.ts │ │ ├── tree.ts │ │ ├── user.ts │ │ ├── wechat.ts │ │ └── zip.ts │ └── svg │ │ ├── 404.svg │ │ ├── back-top.svg │ │ ├── bug.svg │ │ ├── chart.svg │ │ ├── clipboard.svg │ │ ├── component.svg │ │ ├── dashboard.svg │ │ ├── documentation.svg │ │ ├── drag.svg │ │ ├── edit.svg │ │ ├── education.svg │ │ ├── email.svg │ │ ├── example.svg │ │ ├── excel.svg │ │ ├── exit-fullscreen.svg │ │ ├── eye-off.svg │ │ ├── eye-on.svg │ │ ├── form.svg │ │ ├── fullscreen.svg │ │ ├── guide-2.svg │ │ ├── guide.svg │ │ ├── hamburger.svg │ │ ├── icon.svg │ │ ├── international.svg │ │ ├── language.svg │ │ ├── like.svg │ │ ├── link.svg │ │ ├── list.svg │ │ ├── lock.svg │ │ ├── message.svg │ │ ├── money.svg │ │ ├── music.svg │ │ ├── nested.svg │ │ ├── password.svg │ │ ├── pdf.svg │ │ ├── people.svg │ │ ├── peoples.svg │ │ ├── qq.svg │ │ ├── search.svg │ │ ├── shopping.svg │ │ ├── singer-song-list.svg │ │ ├── singer-song-lyric.svg │ │ ├── singer.svg │ │ ├── size.svg │ │ ├── skill.svg │ │ ├── star.svg │ │ ├── tab.svg │ │ ├── table.svg │ │ ├── theme.svg │ │ ├── tree-table.svg │ │ ├── tree.svg │ │ ├── user.svg │ │ ├── wechat.svg │ │ └── zip.svg ├── lang │ ├── en.ts │ ├── es.ts │ ├── index.ts │ ├── ja.ts │ ├── ko.ts │ └── zh.ts ├── layout │ ├── components │ │ ├── AppMain.vue │ │ ├── Navbar │ │ │ └── index.vue │ │ ├── Settings │ │ │ └── index.vue │ │ ├── Sidebar │ │ │ ├── SidebarItem.vue │ │ │ ├── SidebarItemLink.vue │ │ │ ├── SidebarLogo.vue │ │ │ └── index.vue │ │ ├── TagsView │ │ │ ├── ScrollPane.vue │ │ │ └── index.vue │ │ └── index.ts │ ├── index.vue │ └── mixin │ │ └── resize.ts ├── main.ts ├── permission.ts ├── pwa │ ├── components │ │ └── ServiceWorkerUpdatePopup.vue │ ├── register-service-worker.ts │ └── service-worker.js ├── router │ ├── asyncRoutes.ts │ ├── asyncRoutes │ │ ├── charts.ts │ │ ├── components.ts │ │ ├── nested.ts │ │ └── table.ts │ ├── index.ts │ └── modules │ │ ├── charts.ts │ │ ├── components.ts │ │ ├── nested.ts │ │ └── table.ts ├── settings.ts ├── shims-vue.d.ts ├── shims.d.ts ├── store │ ├── index.ts │ └── modules │ │ ├── app.ts │ │ ├── error-log.ts │ │ ├── music.ts │ │ ├── permission.ts │ │ ├── permissionOld.ts │ │ ├── settings.ts │ │ ├── tags-view.ts │ │ └── user.ts ├── styles │ ├── _mixins.scss │ ├── _svgicon.scss │ ├── _transition.scss │ ├── _variables.scss │ ├── _variables.scss.d.ts │ ├── element-variables.scss │ ├── element-variables.scss.d.ts │ ├── index.scss │ └── utils.scss ├── utils │ ├── clipboard.ts │ ├── cookies.ts │ ├── dataVal.ts │ ├── error-log.ts │ ├── excel.ts │ ├── index.ts │ ├── permission.ts │ ├── request.ts │ ├── requestJava.ts │ ├── scroll-to.ts │ ├── symBol.ts │ ├── tool │ │ ├── arr.ts │ │ ├── date.ts │ │ ├── form.ts │ │ ├── index.ts │ │ ├── message.ts │ │ └── notification.ts │ ├── validate.ts │ └── zip.ts └── views │ ├── apiInterface │ ├── README.md │ ├── phone-attribution.vue │ └── phone-attribution │ │ └── index.ts │ ├── charts │ ├── bar-chart.vue │ ├── line-chart.vue │ └── mixed-chart.vue │ ├── clipboard │ └── index.vue │ ├── components-demo │ ├── avatar-upload.vue │ ├── back-to-top.vue │ ├── count-to.vue │ ├── draggable-dialog.vue │ ├── draggable-kanban.vue │ ├── draggable-list.vue │ ├── draggable-select.vue │ ├── dropzone.vue │ ├── json-editor.vue │ ├── markdown.vue │ ├── mixin.vue │ ├── split-pane.vue │ ├── sticky.vue │ └── tinymce.vue │ ├── dashboard │ ├── admin │ │ ├── components │ │ │ ├── BarChart.vue │ │ │ ├── BoxCard.vue │ │ │ ├── LineChart.vue │ │ │ ├── PanelGroup.vue │ │ │ ├── PieChart.vue │ │ │ ├── RadarChart.vue │ │ │ ├── TodoList │ │ │ │ ├── Todo.vue │ │ │ │ └── index.vue │ │ │ ├── TransactionTable.vue │ │ │ └── tool.ts │ │ └── index.vue │ ├── editor │ │ └── index.vue │ └── index.vue │ ├── eat │ ├── breakfast.vue │ ├── dinner.vue │ ├── index.vue │ ├── lunch.vue │ ├── modules │ │ ├── formData.ts │ │ ├── formUtils.ts │ │ ├── index.ts │ │ ├── options.ts │ │ ├── searchFormData.ts │ │ └── tableData.ts │ ├── nightingale.vue │ ├── other.vue │ ├── src │ │ ├── assets │ │ │ ├── img │ │ │ │ ├── bean_500.png │ │ │ │ ├── bean_five.png │ │ │ │ ├── bean_one.png │ │ │ │ ├── bean_ten.png │ │ │ │ ├── bean_two.png │ │ │ │ ├── close_store.png │ │ │ │ ├── color_pillar.png │ │ │ │ ├── congratulation.png │ │ │ │ ├── draw_btn.png │ │ │ │ ├── draw_wheel.png │ │ │ │ ├── give_up.png │ │ │ │ ├── luck_bg.png │ │ │ │ ├── lucky_title.png │ │ │ │ ├── point_five.png │ │ │ │ ├── point_ten.png │ │ │ │ ├── sorry.png │ │ │ │ └── wheel_toast_1.png │ │ │ └── logo.png │ │ └── index │ │ │ └── config.ts │ └── todayEat.vue │ ├── error-log │ ├── components │ │ ├── ErrorTestA.vue │ │ └── ErrorTestB.vue │ └── index.vue │ ├── error-page │ ├── 401.vue │ └── 404.vue │ ├── example │ ├── components │ │ ├── ArticleDetail.vue │ │ ├── Dropdown │ │ │ ├── Comment.vue │ │ │ ├── Platform.vue │ │ │ ├── SourceUrl.vue │ │ │ └── index.ts │ │ └── Warning.vue │ ├── create.vue │ ├── edit.vue │ └── list.vue │ ├── excel │ ├── components │ │ ├── AutoWidthOption.vue │ │ ├── BookTypeOption.vue │ │ └── FilenameOption.vue │ ├── export-excel.vue │ ├── merge-header.vue │ ├── select-excel.vue │ └── upload-excel.vue │ ├── guide │ ├── index.vue │ └── steps.ts │ ├── i18n-demo │ ├── index.vue │ └── local.ts │ ├── icons │ ├── element-icons.ts │ ├── index.vue │ └── svg-icons.ts │ ├── itKnowledge │ ├── Index.vue │ ├── algorithm.vue │ ├── components │ │ └── Search.vue │ ├── front-end.vue │ ├── front-rear-end.vue │ ├── modules │ │ ├── formData.ts │ │ ├── formUtils.ts │ │ ├── index.ts │ │ ├── options.ts │ │ ├── searchFormData.ts │ │ └── tableData.ts │ ├── rear-end.vue │ └── tool.vue │ ├── login │ ├── auth-redirect.vue │ ├── components │ │ └── SocialSignin.vue │ └── index.vue │ ├── me │ ├── agent-event.vue │ ├── component │ │ ├── agent-event │ │ │ └── table.vue │ │ └── table.vue │ ├── diary.vue │ ├── features-dev - 副本.vue │ ├── features-dev.vue │ └── modules │ │ ├── agent-event │ │ ├── formData.ts │ │ ├── index.ts │ │ ├── options.ts │ │ └── tableData.ts │ │ └── features-dev │ │ ├── formData.ts │ │ ├── formUtils.ts │ │ ├── index.ts │ │ ├── options.ts │ │ ├── searchFormData.ts │ │ └── tableData.ts │ ├── music │ ├── components │ │ ├── EditSingerDialog.vue │ │ ├── EditSingerSongDialog.vue │ │ └── Header.vue │ ├── index.vue │ ├── modules │ │ ├── music-singer │ │ │ └── formData.ts │ │ ├── singer-song-list │ │ │ └── index.ts │ │ └── songeList.ts │ ├── music-singer.vue │ ├── musicPlayer.vue │ ├── singer-song-list.vue │ ├── singer-song-lyric.vue │ └── test.ts │ ├── nested │ ├── menu1 │ │ ├── index.vue │ │ ├── menu1-1 │ │ │ └── index.vue │ │ ├── menu1-2 │ │ │ ├── index.vue │ │ │ ├── menu1-2-1 │ │ │ │ └── index.vue │ │ │ └── menu1-2-2 │ │ │ │ └── index.vue │ │ └── menu1-3 │ │ │ └── index.vue │ └── menu2 │ │ └── index.vue │ ├── pdf │ ├── content.ts │ ├── download.vue │ └── index.vue │ ├── permission │ ├── components │ │ └── SwitchRoles.vue │ ├── directive.vue │ ├── page.vue │ └── role.vue │ ├── personal │ └── personal-view │ │ ├── certificate-authentication.vue │ │ ├── certificate-authentication自己写的input上传.vue │ │ ├── certificate.vue │ │ └── index.vue │ ├── profile │ ├── components │ │ ├── Account.vue │ │ ├── Activity.vue │ │ ├── Timeline.vue │ │ └── UserCard.vue │ └── index.vue │ ├── redirect │ └── index.vue │ ├── registe │ └── index.vue │ ├── sys │ ├── modules │ │ ├── options.ts │ │ ├── role │ │ │ ├── formData.ts │ │ │ ├── sysRole.ts │ │ │ └── tableData.ts │ │ └── user │ │ │ ├── tableData.ts │ │ │ └── userFormData.ts │ ├── sys-menu.vue │ ├── sys-role.vue │ └── sys-user.vue │ ├── tab │ ├── components │ │ └── TabPane.vue │ └── index.vue │ ├── table │ ├── complex-table.vue │ ├── draggable-table.vue │ ├── dynamic-table │ │ ├── components │ │ │ ├── FixedHeaderTable.vue │ │ │ └── UnfixedHeaderTable.vue │ │ └── index.vue │ └── inline-edit-table.vue │ ├── theme │ └── index.vue │ ├── usualWebsite │ ├── Index.vue │ ├── design.vue │ ├── modules │ │ ├── formData.ts │ │ ├── formUtils.ts │ │ ├── index.ts │ │ ├── options.ts │ │ ├── searchFormData.ts │ │ └── tableData.ts │ ├── movie.vue │ ├── other.vue │ ├── program.vue │ └── tool.vue │ └── zip │ └── index.vue ├── tests └── unit │ ├── components │ └── Breadcrumb.spec.ts │ └── utils │ ├── parseTime.spec.ts │ └── validate.spec.ts ├── tsconfig.json ├── typings-custom ├── javascript-tool-class.d.ts ├── lrc-file-parser.d.ts └── zzmcomponentlib.d.ts ├── vue.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details 4 | # 5 | version: 2 6 | 7 | jobs: 8 | build: 9 | docker: 10 | - image: circleci/node:12 11 | 12 | working_directory: ~/vue-typescript-admin-template 13 | 14 | steps: 15 | - checkout 16 | 17 | # Download and cache dependencies 18 | - restore_cache: 19 | keys: 20 | - v1-dependencies-{{ checksum "package.json" }} 21 | # fallback to using the latest cache if no exact match is found 22 | - v1-dependencies- 23 | 24 | - run: yarn install 25 | 26 | - save_cache: 27 | paths: 28 | - node_modules 29 | key: v1-dependencies-{{ checksum "package.json" }} 30 | 31 | - run: yarn lint && yarn build:prod 32 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | # Indentation override for js(x), ts(x) and vue files 14 | [*.{js,jsx,ts,tsx,vue}] 15 | indent_size = 2 16 | indent_style = space 17 | 18 | # Indentation override for css related files 19 | [*.{css,styl,scss,less,sass}] 20 | indent_size = 2 21 | indent_style = space 22 | 23 | # Indentation override for html files 24 | [*.html] 25 | indent_size = 2 26 | indent_style = space 27 | 28 | # Trailing space override for markdown file 29 | [*.md] 30 | trim_trailing_whitespace = false 31 | 32 | # Indentation override for config files 33 | [*.{json,yml}] 34 | indent_size = 2 35 | indent_style = space 36 | -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | # Base api 2 | # node 接口 3 | VUE_APP_BASE_API = http://localhost:3333 4 | # 本地java - 文件服务器 5 | VUE_APP_BLOG_API = http://localhost:8527 6 | # VUE_APP_BASE_API = '/dev-api' 7 | 8 | # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, 9 | # to control whether the babel-plugin-dynamic-import-node plugin is enabled. 10 | # It only does one thing by converting all import() to require(). 11 | # This configuration can significantly increase the speed of hot updates, 12 | # when you have a large number of pages. 13 | # Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js 14 | 15 | VUE_CLI_BABEL_TRANSPILE_MODULES = true 16 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # Base api 2 | # Remeber to change this to your production server address 3 | # Here I used my mock server for this project 4 | VUE_APP_BASE_API = http://zhengzemin.cn:3333 5 | 6 | # 远程java - 文件服务器 7 | # VUE_APP_BLOG_API = 'http://file.dev.zhengzemin.cn:81' 8 | VUE_APP_BLOG_API = http://zhengzemin.cn:8527 9 | -------------------------------------------------------------------------------- /.env.pserve: -------------------------------------------------------------------------------- 1 | # koa后台服务 2 | VUE_APP_BASE_API = http://zhengzemin.cn:3334 3 | 4 | # 远程java - 文件服务器 5 | VUE_APP_BLOG_API = http://zhengzemin.cn:8528 6 | -------------------------------------------------------------------------------- /.env.staging: -------------------------------------------------------------------------------- 1 | # Set to production for building optimization 2 | NODE_ENV = production 3 | 4 | # Base api 5 | VUE_APP_BASE_API = '/stage-api' 6 | 7 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist/*.js 2 | src/assets 3 | tests/unit/coverage 4 | public/**/*.js 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | # I'm submitting a 10 | 11 | 20 | 21 | ## Current behavior 22 | 23 | 24 | 25 | ## Expected behavior 26 | 27 | 28 | 29 | ## Minimal reproduction of the problem with instructions 30 | 31 | 34 | 35 | ## What is the motivation / use case for changing the behavior 36 | 37 | 38 | 39 | ## Environment 40 | 41 | 42 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | **Make sure the PR fulfills these requirements:** 9 | 10 | - When resolving a specific issue, make sure it's referenced in the PR's title (e.g. `Closes #xxx[,#xxx]`, where "xxx" is the issue number) 11 | 12 | - If adding a **new feature**, the PR's description includes: A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it) 13 | 14 | - If this PR introduce a **breaking change**, please describe the impact and migration path for existing applications 15 | 16 | **What kind of change does this PR introduce?** 17 | 18 | 27 | 28 | **More information:** 29 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy on GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build-deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v1 14 | - name: Install and Build 15 | run: | 16 | npm install 17 | npm run build:prod 18 | - name: Deploy 19 | uses: maxheld83/ghpages@v0.2.1 20 | env: 21 | BUILD_DIR: dist/ 22 | GH_PAT: ${{ secrets.GH_PAT }} 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | /tests/e2e/videos/ 6 | /tests/e2e/screenshots/ 7 | /tests/**/coverage/ 8 | 9 | # local env files 10 | .env.local 11 | .env.*.local 12 | 13 | # Log files 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | 18 | # Editor directories and files 19 | .idea 20 | .vscode 21 | .history 22 | .ionide 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw* 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Chong Guo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "pluginsFile": "tests/e2e/plugins/index.js" 3 | } 4 | -------------------------------------------------------------------------------- /demo/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/demo/dashboard.png -------------------------------------------------------------------------------- /dos/koa开发遇到问题与解决.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/dos/koa开发遇到问题与解决.doc -------------------------------------------------------------------------------- /dos/ttf字蛛/README.md: -------------------------------------------------------------------------------- 1 | 可以将字体ttf文件压缩:现在使用什么文件就拿出来,其他字体不用到的,全部删掉 2 | 3 | 【ttf压缩】网页开发中引入字体文件过大,加载缓慢的解决办法【字蛛】【web Font】:https://blog.csdn.net/weixin_36336604/article/details/77191144 -------------------------------------------------------------------------------- /dos/ttf字蛛/cmd执行.txt: -------------------------------------------------------------------------------- 1 | font-spider D:\rj\dev\github\code\vueAndTsAndKoa2\相关文档\ttf字蛛\index.html -------------------------------------------------------------------------------- /dos/ttf字蛛/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 17 | 18 | 19 | 20 | 歌手榜轻音乐05月31日更新,轻音乐榜馆67 21 | 22 | -------------------------------------------------------------------------------- /dos/前端开发遇到的问题.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/dos/前端开发遇到的问题.doc -------------------------------------------------------------------------------- /dos/前端遇到问题及解决.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/dos/前端遇到问题及解决.doc -------------------------------------------------------------------------------- /dos/本系统技术点.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/dos/本系统技术点.doc -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel' 3 | } 4 | module.exports = { 5 | preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel' 6 | } 7 | -------------------------------------------------------------------------------- /mock/api.ts: -------------------------------------------------------------------------------- 1 | export * from './articles' 2 | export * from './role' 3 | export * from './transactions' 4 | export * from './users' 5 | -------------------------------------------------------------------------------- /mock/security.ts: -------------------------------------------------------------------------------- 1 | import { Response, Request, NextFunction } from 'express' 2 | 3 | export const accessTokenAuth = (req: Request, res: Response, next: NextFunction) => { 4 | const accessToken = req.header('X-Access-Token') 5 | if (!accessToken) { 6 | return res.status(401).json({ 7 | code: 50001, 8 | messaege: 'Invalid Access Token' 9 | }) 10 | } 11 | next() 12 | } 13 | -------------------------------------------------------------------------------- /mock/transactions.ts: -------------------------------------------------------------------------------- 1 | import faker from 'faker' 2 | import { Response, Request } from 'express' 3 | import { ITransactionData } from '../src/api/types' 4 | 5 | const transactionList: ITransactionData[] = [] 6 | const transactionCount = 20 7 | 8 | for (let i = 0; i < transactionCount; i++) { 9 | transactionList.push({ 10 | orderId: faker.random.uuid(), 11 | status: faker.random.arrayElement(['success', 'pending']), 12 | timestamp: faker.date.past().getTime(), 13 | username: faker.name.findName(), 14 | price: parseFloat(faker.finance.amount(1000, 15000, 2)) 15 | }) 16 | } 17 | 18 | export const getTransactions = (req: Request, res: Response) => { 19 | return res.json({ 20 | code: 20000, 21 | data: { 22 | total: transactionList.length, 23 | items: transactionList 24 | } 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /mock/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "commonjs", 5 | "strict": true, 6 | "jsx": "preserve", 7 | "importHelpers": true, 8 | "moduleResolution": "node", 9 | "experimentalDecorators": true, 10 | "esModuleInterop": true, 11 | "allowSyntheticDefaultImports": true, 12 | "sourceMap": true, 13 | "baseUrl": ".", 14 | "types": [ 15 | "node", 16 | "webpack-env" 17 | ] 18 | }, 19 | "include": [ 20 | "**/*.ts", 21 | "**/*.tsx" 22 | ], 23 | "exclude": [ 24 | "node_modules" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/favicon.ico -------------------------------------------------------------------------------- /public/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/android-chrome-maskable-192x192.png -------------------------------------------------------------------------------- /public/img/icons/android-chrome-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/android-chrome-maskable-512x512.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /public/img/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /public/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /public/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /public/img/icons/msapplication-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/msapplication-icon-144x144.png -------------------------------------------------------------------------------- /public/img/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/img/icons/mstile-150x150.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <%= webpackConfig.name %> 14 | 15 | 16 | 19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Vue Typescript Admin", 3 | "short_name": "Vue Ts Admin", 4 | "icons": [ 5 | { 6 | "src": "./img/icons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "./img/icons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "start_url": "./index.html", 17 | "display": "standalone", 18 | "background_color": "#fff", 19 | "theme_color": "#4DBA87" 20 | } 21 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/tinymce/skins/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position:absolute;display:inline-block;background-color:green;opacity:.5}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%} -------------------------------------------------------------------------------- /public/tinymce/skins/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/public/tinymce/skins/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /src/api/apiInterface/phone-attribution.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | /** 4 | * 手机号码归属地 5 | * @param params 6 | * { 7 | key, 8 | phone 9 | } 10 | */ 11 | export const mobile = (params: any) => 12 | request({ 13 | url: '/apiInterface/mobile', 14 | method: 'get', 15 | params 16 | }) 17 | 18 | -------------------------------------------------------------------------------- /src/api/common.ts: -------------------------------------------------------------------------------- 1 | export const qiniuUrl = "http://dignity.zhengzemin.cn/" -------------------------------------------------------------------------------- /src/api/common/sendMsg.ts: -------------------------------------------------------------------------------- 1 | 2 | import request from '@/utils/request' 3 | 4 | 5 | /** 6 | * 发送消息(微信方糖) 7 | * @param params 数据 8 | */ 9 | export const sendServerJiangMsg = (params: any) => 10 | request({ 11 | url: '/common/serverJiang/send', 12 | method: 'get', 13 | params 14 | }) 15 | 16 | 17 | /** 18 | * 发送消息(Bark) 19 | * @param params 数据 20 | */ 21 | export const sendBarkMsg = (params: any) => 22 | request({ 23 | url: '/common/bark/send', 24 | method: 'get', 25 | params 26 | }) 27 | 28 | 29 | /** 30 | * 发送消息(QQ邮箱) 31 | * @param params 数据 32 | */ 33 | export const senQQMailMsg = (params: any) =>{ 34 | request({ 35 | url: '/common/qqMail/send', 36 | method: 'get', 37 | params 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /src/api/eat/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: your name 3 | * @Date: 2021-10-06 16:13:28 4 | * @LastEditTime: 2021-10-07 11:37:09 5 | * @LastEditors: Please set LastEditors 6 | * @Description: In User Settings Edit 7 | * @FilePath: \vueAndTsAndKoa2\src\api\eat\index.ts 8 | */ 9 | import request from '@/utils/request' 10 | 11 | 12 | /** 13 | * 查询 14 | * @param params 数据 15 | */ 16 | export const get = (params: any) => 17 | request({ 18 | url: '/eat/', 19 | method: 'get', 20 | params 21 | }) 22 | 23 | 24 | 25 | /** 26 | * 添加 27 | * @param data 数据 28 | */ 29 | export const create = (data: any) => 30 | request({ 31 | url: '/eat/', 32 | method: 'post', 33 | data 34 | }) 35 | 36 | 37 | /** 38 | * 更新 39 | * @param data 数据 40 | */ 41 | export const update = (data: any) => 42 | request({ 43 | url: `/eat/`, 44 | method: 'put', 45 | data 46 | }) 47 | 48 | /** 49 | * 删除 50 | * @param params 数据 51 | */ 52 | export const del = (params: any) => 53 | request({ 54 | url: `/eat/`, 55 | method: 'delete', 56 | params 57 | }) 58 | -------------------------------------------------------------------------------- /src/api/eat/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 代办事项接口 3 | */ 4 | export interface IAgentEvent { 5 | id: string 6 | serialNum: number 7 | title: string 8 | content: string 9 | type: number 10 | agent: string 11 | schedule: string 12 | noticeWay:number 13 | contact: string 14 | startTime: string 15 | endTime: string 16 | remarks: string 17 | } 18 | 19 | 20 | 21 | export interface IRoutesTreeData { 22 | children: IRoutesTreeData[] 23 | title: string 24 | path: string 25 | } 26 | 27 | 28 | export interface ISysUserData { 29 | id: string 30 | userName: string 31 | photo: string 32 | phone: string 33 | roles: string 34 | token: string 35 | } 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/api/itKnowledge/types.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: your name 3 | * @Date: 2021-02-21 22:24:50 4 | * @LastEditTime: 2021-08-31 15:41:22 5 | * @LastEditors: your name 6 | * @Description: In User Settings Edit 7 | * @FilePath: \vue-typescript-admin-template-master\src\api\itKnowledge\types.ts 8 | */ 9 | /** 10 | * 代办事项接口 11 | */ 12 | export interface IItKnowledge { 13 | id: string 14 | serialNum: number 15 | title: string 16 | content: string 17 | type: number 18 | agent: string 19 | schedule: string 20 | noticeWay:number 21 | contact: string 22 | startTime: string 23 | endTime: string 24 | remarks: string 25 | } 26 | 27 | 28 | 29 | 30 | export interface IRoutesTreeData { 31 | children: IRoutesTreeData[] 32 | title: string 33 | path: string 34 | } 35 | 36 | 37 | export interface ISysUserData { 38 | id: string 39 | userName: string 40 | photo: string 41 | phone: string 42 | roles: string 43 | token: string 44 | } 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/api/me/featuresDev.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | 4 | /** 5 | * 查询 6 | * @param params 数据 7 | */ 8 | export const get = (params: any) => 9 | request({ 10 | url: '/featuresDev/', 11 | method: 'get', 12 | params 13 | }) 14 | 15 | 16 | 17 | /** 18 | * 添加 19 | * @param data 数据 20 | */ 21 | export const create = (data: any) => 22 | request({ 23 | url: '/featuresDev/', 24 | method: 'post', 25 | data 26 | }) 27 | 28 | 29 | /** 30 | * 更新 31 | * @param data 数据 32 | */ 33 | export const update = (data: any) => 34 | request({ 35 | url: `/featuresDev/`, 36 | method: 'put', 37 | data 38 | }) 39 | 40 | /** 41 | * 删除 42 | * @param params 数据 43 | */ 44 | export const del = (params: any) => 45 | request({ 46 | url: `/featuresDev/`, 47 | method: 'delete', 48 | params 49 | }) 50 | -------------------------------------------------------------------------------- /src/api/me/featuresDevType.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 功能开发接口 3 | */ 4 | export interface IFeaturesDevType { 5 | id: string 6 | serialNum: number 7 | title: string 8 | front_end: string 9 | node: string 10 | java: string 11 | database_sql: string 12 | remarks:number 13 | } 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/api/me/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 代办事项接口 3 | */ 4 | export interface IAgentEvent { 5 | id: string 6 | serialNum: number 7 | title: string 8 | content: string 9 | type: number 10 | agent: string 11 | schedule: string 12 | noticeWay:number 13 | contact: string 14 | startTime: string 15 | endTime: string 16 | remarks: string 17 | } 18 | 19 | 20 | 21 | export interface IRoutesTreeData { 22 | children: IRoutesTreeData[] 23 | title: string 24 | path: string 25 | } 26 | 27 | 28 | export interface ISysUserData { 29 | id: string 30 | userName: string 31 | photo: string 32 | phone: string 33 | roles: string 34 | token: string 35 | } 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/api/pTypes.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: zemin zheng 3 | * @Date: 2021-08-31 15:41:50 4 | * @LastEditTime: 2021-08-31 16:41:24 5 | * @LastEditors: Please set LastEditors 6 | * @Description: 定义公用的interface 7 | * @FilePath: \vue-typescript-admin-template-master\src\api\pTypes.ts 8 | */ 9 | 10 | 11 | /** 12 | * @description P:公用 13 | * @description: object类型的公用接口定义 14 | * @param {*} 15 | * @return {*} 16 | */ 17 | export interface IPObject { 18 | num: number 19 | data: any 20 | } 21 | -------------------------------------------------------------------------------- /src/api/personal/personal-view/certificateAuthentication.d.ts: -------------------------------------------------------------------------------- 1 | declare function getCertificate(data: string) 2 | 3 | declare function uploadFile(param: any) -------------------------------------------------------------------------------- /src/api/personal/personal-view/certificateAuthentication.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | import axios from 'axios' 3 | 4 | 5 | //获取证件 6 | export const getCertificate = (data: any) => 7 | request({ 8 | url: '/certificateAuthentication/getCertificate', 9 | method: 'post', 10 | data 11 | }) 12 | 13 | export const uploadFile = (data: any) => 14 | request({ 15 | url: '/certificateAuthentication/upload', 16 | method: 'post', 17 | data 18 | }) 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/api/roles.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export const getRoles = (params: any) => 4 | request({ 5 | url: '/roles', 6 | method: 'get', 7 | params 8 | }) 9 | 10 | export const createRole = (data: any) => 11 | request({ 12 | url: '/roles', 13 | method: 'post', 14 | data 15 | }) 16 | 17 | export const updateRole = (id: number, data: any) => 18 | request({ 19 | url: `/roles/${id}`, 20 | method: 'put', 21 | data 22 | }) 23 | 24 | export const deleteRole = (id: number) => 25 | request({ 26 | url: `/roles/${id}`, 27 | method: 'delete' 28 | }) 29 | 30 | export const getRoutes = (params: any) => 31 | request({ 32 | url: '/routes', 33 | method: 'get', 34 | params 35 | }) 36 | -------------------------------------------------------------------------------- /src/api/sys/sysMenu.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export const createSysMenu = (data: any) => 4 | request({ 5 | url: '/menu/save', 6 | method: 'post', 7 | data 8 | }) -------------------------------------------------------------------------------- /src/api/sys/sysUser.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | import { ISysUserData } from '@/api/sys/types' 3 | 4 | export const defaultSysUserData: ISysUserData = { 5 | id: '', 6 | userName: '', 7 | photo: '', 8 | phone: '', 9 | roles: '', 10 | token: '' 11 | } 12 | 13 | export const getSysUser = (params: any) => 14 | request({ 15 | url: '/user', 16 | method: 'get', 17 | params 18 | }) 19 | 20 | 21 | export const createSysUser = (data: any) => 22 | request({ 23 | url: '/user/', 24 | method: 'post', 25 | data 26 | }) 27 | 28 | export const delSysRole = (data: any) => 29 | request({ 30 | url: '/role/del', 31 | method: 'post', 32 | data 33 | }) 34 | 35 | export const updateSysUser = (data: any) => 36 | request({ 37 | url: `/user/ID`, 38 | method: 'put', 39 | data 40 | }) 41 | 42 | -------------------------------------------------------------------------------- /src/api/sys/types/index.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface ISysRoleData { 3 | id: string 4 | roleName: string 5 | roleKey: string 6 | roleType: string 7 | isSys: number 8 | remarks: string 9 | routes: Array 10 | } 11 | 12 | 13 | 14 | export interface IRoutesTreeData { 15 | children: IRoutesTreeData[] 16 | title: string 17 | path: string 18 | } 19 | 20 | 21 | export interface ISysUserData { 22 | id: string 23 | userName: string 24 | photo: string 25 | phone: string 26 | roles: string 27 | token: string 28 | } 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/api/transactions.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export const getTransactions = (params: any) => 4 | request({ 5 | url: '/transactions', 6 | method: 'get', 7 | params 8 | }) 9 | -------------------------------------------------------------------------------- /src/api/types.d.ts: -------------------------------------------------------------------------------- 1 | export interface IArticleData { 2 | id: number 3 | status: string 4 | title: string 5 | abstractContent: string 6 | fullContent: string 7 | sourceURL: string 8 | imageURL: string 9 | timestamp: string | number 10 | platforms: string[] 11 | disableComment: boolean 12 | importance: number 13 | author: string 14 | reviewer: string 15 | type: string 16 | pageviews: number 17 | } 18 | 19 | export interface IRoleData { 20 | key: string 21 | name: string 22 | description: string 23 | routes: any 24 | } 25 | 26 | export interface ITransactionData { 27 | orderId: string 28 | timestamp: string | number 29 | username: string 30 | price: number 31 | status: string 32 | } 33 | 34 | export interface IUserData { 35 | id: number 36 | username: string 37 | password: string 38 | name: string 39 | email: string 40 | phone: string 41 | avatar: string 42 | introduction: string 43 | roles: string[] 44 | } 45 | 46 | export interface ISysRoleData { 47 | id: string 48 | roleName: string 49 | roleKey: string 50 | roleType: string 51 | isSys: number 52 | remarks: string 53 | routes: Array 54 | } -------------------------------------------------------------------------------- /src/api/users.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export const getUsers = (params: any) => 4 | request({ 5 | url: '/users', 6 | method: 'get', 7 | params 8 | }) 9 | 10 | export const getUserInfo = (data: any) => 11 | request({ 12 | url: '/users/info', 13 | method: 'post', 14 | data 15 | }) 16 | 17 | export const getUserByName = (username: string) => 18 | request({ 19 | url: `/users/${username}`, 20 | method: 'get' 21 | }) 22 | 23 | export const updateUser = (username: string, data: any) => 24 | request({ 25 | url: `/users/${username}`, 26 | method: 'put', 27 | data 28 | }) 29 | 30 | export const deleteUser = (username: string) => 31 | request({ 32 | url: `/users/${username}`, 33 | method: 'delete' 34 | }) 35 | 36 | export const login = (data: any) => 37 | request({ 38 | url: '/users/login', 39 | method: 'post', 40 | data 41 | }) 42 | 43 | export const logout = () => 44 | request({ 45 | url: '/users/logout', 46 | method: 'post' 47 | }) 48 | 49 | export const register = (data: any) => 50 | request({ 51 | url: '/users/register', 52 | method: 'post', 53 | data 54 | }) 55 | -------------------------------------------------------------------------------- /src/api/usualWebsite/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: your name 3 | * @Date: 2021-10-06 16:13:28 4 | * @LastEditTime: 2021-10-06 16:14:55 5 | * @LastEditors: your name 6 | * @Description: In User Settings Edit 7 | * @FilePath: \vueAndTsAndKoa2\src\api\usualWebsite\index.ts 8 | */ 9 | import request from '@/utils/request' 10 | 11 | 12 | /** 13 | * 查询 14 | * @param params 数据 15 | */ 16 | export const get = (params: any) => 17 | request({ 18 | url: '/usualWebsite/', 19 | method: 'get', 20 | params 21 | }) 22 | 23 | 24 | 25 | /** 26 | * 添加 27 | * @param data 数据 28 | */ 29 | export const create = (data: any) => 30 | request({ 31 | url: '/usualWebsite/', 32 | method: 'post', 33 | data 34 | }) 35 | 36 | 37 | /** 38 | * 更新 39 | * @param data 数据 40 | */ 41 | export const update = (data: any) => 42 | request({ 43 | url: `/usualWebsite/`, 44 | method: 'put', 45 | data 46 | }) 47 | 48 | /** 49 | * 删除 50 | * @param params 数据 51 | */ 52 | export const del = (params: any) => 53 | request({ 54 | url: `/usualWebsite/`, 55 | method: 'delete', 56 | params 57 | }) 58 | -------------------------------------------------------------------------------- /src/api/usualWebsite/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 代办事项接口 3 | */ 4 | export interface IAgentEvent { 5 | id: string 6 | serialNum: number 7 | title: string 8 | content: string 9 | type: number 10 | agent: string 11 | schedule: string 12 | noticeWay:number 13 | contact: string 14 | startTime: string 15 | endTime: string 16 | remarks: string 17 | } 18 | 19 | 20 | 21 | export interface IRoutesTreeData { 22 | children: IRoutesTreeData[] 23 | title: string 24 | path: string 25 | } 26 | 27 | 28 | export interface ISysUserData { 29 | id: string 30 | userName: string 31 | photo: string 32 | phone: string 33 | roles: string 34 | token: string 35 | } 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/assets/401-images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/401-images/401.gif -------------------------------------------------------------------------------- /src/assets/404-images/404-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/404-images/404-cloud.png -------------------------------------------------------------------------------- /src/assets/404-images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/404-images/404.png -------------------------------------------------------------------------------- /src/assets/custom-theme/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/custom-theme/fonts/element-icons.ttf -------------------------------------------------------------------------------- /src/assets/custom-theme/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/custom-theme/fonts/element-icons.woff -------------------------------------------------------------------------------- /src/assets/fzzj-hfxcjw.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/fzzj-hfxcjw.rar -------------------------------------------------------------------------------- /src/assets/fzzj-hfxcjw/.font-spider/FZZJ-HFXCJW.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/fzzj-hfxcjw/.font-spider/FZZJ-HFXCJW.TTF -------------------------------------------------------------------------------- /src/assets/fzzj-hfxcjw/FZZJ-HFXCJW.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/assets/fzzj-hfxcjw/FZZJ-HFXCJW.TTF -------------------------------------------------------------------------------- /src/assets/fzzj-hfxcjw/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'HFXCJW'; /* 重命名字体名 */ 3 | src: url('FZZJ-HFXCJW.TTF'); 4 | font-weight: normal; 5 | font-style: normal; 6 | } -------------------------------------------------------------------------------- /src/cache/local/index.ts: -------------------------------------------------------------------------------- 1 | export const removeLocal = () =>{ 2 | localStorage.clear(); 3 | } -------------------------------------------------------------------------------- /src/cache/session/index.ts: -------------------------------------------------------------------------------- 1 | export const removeSession = () =>{ 2 | sessionStorage.clear(); 3 | } -------------------------------------------------------------------------------- /src/components/Button/README.md: -------------------------------------------------------------------------------- 1 | # 按钮组件 2 | 3 | * 加载按钮: @\components\Button\LoadingBtn.vue -------------------------------------------------------------------------------- /src/components/Button/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/components/Button/index.ts -------------------------------------------------------------------------------- /src/components/Dialog/types/index.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface IDialogData { 3 | title: string, 4 | show: boolean, 5 | width: string, 6 | center: boolean, 7 | isCloseModal: boolean, 8 | isShowSubmit: boolean, 9 | info: Array 10 | } -------------------------------------------------------------------------------- /src/components/Global/README.md: -------------------------------------------------------------------------------- 1 | * 虽然说components文件下的都是全局组件 2 | * 而Global是全局引用,基础组件许多页面都会用到,将其设置成全局组件,其他地方就不必再引用了哦。 3 | 4 | * 新建一个文件 global 存放全局组件注册,在 main.js 引入 5 | * import appButton from '@/components/Global/index.vue' 6 | * Vue.component("app-button", appButton); 7 | 8 | 9 | * 在组件中就可以 10 | 11 | -------------------------------------------------------------------------------- /src/components/Hamburger/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 28 | 29 | 38 | -------------------------------------------------------------------------------- /src/components/HeadRadio/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 41 | 57 | -------------------------------------------------------------------------------- /src/components/MarkdownEditor/default-options.ts: -------------------------------------------------------------------------------- 1 | // Doc: https://nhn.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor 2 | export default { 3 | previewStyle: 'vertical', 4 | usageStatistics: false, 5 | toolbarItems: [ 6 | 'heading', 7 | 'bold', 8 | 'italic', 9 | 'strike', 10 | 'divider', 11 | 'hr', 12 | 'quote', 13 | 'divider', 14 | 'ul', 15 | 'ol', 16 | 'task', 17 | 'indent', 18 | 'outdent', 19 | 'divider', 20 | 'table', 21 | 'image', 22 | 'link', 23 | 'divider', 24 | 'code', 25 | 'codeblock' 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /src/components/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 52 | -------------------------------------------------------------------------------- /src/components/SearchAndFeatures/README.md: -------------------------------------------------------------------------------- 1 | 组件场景:主要放置页面的头部,进行搜索、功能按钮 -------------------------------------------------------------------------------- /src/components/SearchAndFeatures/index.ts: -------------------------------------------------------------------------------- 1 | import SearchFeatures from './SearchFeatures.vue' 2 | 3 | export default SearchFeatures -------------------------------------------------------------------------------- /src/components/SearchAndFeatures/modules/SearchAndFetures.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class SearchAndFetures { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | SearchAndFetures 35 | } -------------------------------------------------------------------------------- /src/components/Table/README.md: -------------------------------------------------------------------------------- 1 | # 表格组件 2 | 3 | * 单行组件:src\components\Table\SingleLine.vue 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/Table/SingleLine.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /src/components/Table/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/components/Table/index.ts -------------------------------------------------------------------------------- /src/components/Tinymce/config.ts: -------------------------------------------------------------------------------- 1 | // Import plugins that you want to use 2 | // Detail plugins list see: https://www.tinymce.com/docs/plugins/ 3 | // Custom builds see: https://www.tinymce.com/download/custom-builds/ 4 | export const plugins = ['advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount'] 5 | 6 | // Here is the list of toolbar control components 7 | // Details see: https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols 8 | export const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'] 9 | -------------------------------------------------------------------------------- /src/const/index.ts: -------------------------------------------------------------------------------- 1 | const sys_name = '博客音乐'; 2 | 3 | 4 | 5 | 6 | export { 7 | sys_name 8 | } -------------------------------------------------------------------------------- /src/const/juhe.ts: -------------------------------------------------------------------------------- 1 | const key = "069589f49277521d8332b74d715e533a" 2 | 3 | 4 | export { key } -------------------------------------------------------------------------------- /src/const/urls.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: zemin zheng 3 | * @Date: 2021-09-01 00:22:47 4 | * @LastEditTime: 2021-09-02 22:10:05 5 | * @LastEditors: your name 6 | * @Description: 后台服务请求的头部信息的工具对象,方便后面要写死ip 或服务路径加前缀等事情,地址后都要加 '/' 7 | * @FilePath: \vue-typescript-admin-template-master\src\const\urls.js 8 | */ 9 | export const appSvc = "/appsvc/"; // 音乐博客后台服务koa2 10 | export const javaSvc = "/javaSvc"; // Java后台服务 11 | -------------------------------------------------------------------------------- /src/directives/index.ts: -------------------------------------------------------------------------------- 1 | export * from './clipboard' 2 | export * from './el-draggable-dialog' 3 | export * from './permission' 4 | export * from './waves' 5 | -------------------------------------------------------------------------------- /src/directives/permission/index.ts: -------------------------------------------------------------------------------- 1 | import { DirectiveOptions } from 'vue' 2 | import { UserModule } from '@/store/modules/user' 3 | 4 | export const permission: DirectiveOptions = { 5 | inserted(el, binding) { 6 | const { value } = binding 7 | const roles = UserModule.roles 8 | if (value && value instanceof Array && value.length > 0) { 9 | const permissionRoles = value 10 | const hasPermission = roles.some(role => { 11 | return permissionRoles.includes(role) 12 | }) 13 | if (!hasPermission) { 14 | el.parentNode && el.parentNode.removeChild(el) 15 | } 16 | } else { 17 | throw new Error('need roles! Like v-permission="[\'admin\',\'editor\']"') 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/directives/waves/waves.css: -------------------------------------------------------------------------------- 1 | .waves-ripple { 2 | position: absolute; 3 | border-radius: 100%; 4 | background-color: rgba(0, 0, 0, 0.15); 5 | background-clip: padding-box; 6 | pointer-events: none; 7 | -webkit-user-select: none; 8 | -moz-user-select: none; 9 | -ms-user-select: none; 10 | user-select: none; 11 | -webkit-transform: scale(0); 12 | -ms-transform: scale(0); 13 | transform: scale(0); 14 | opacity: 1; 15 | } 16 | 17 | .waves-ripple.z-active { 18 | opacity: 0; 19 | -webkit-transform: scale(2); 20 | -ms-transform: scale(2); 21 | transform: scale(2); 22 | -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 23 | transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 24 | transition: opacity 1.2s ease-out, transform 0.6s ease-out; 25 | transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; 26 | } -------------------------------------------------------------------------------- /src/eventBus/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | export const EventBus = new Vue() 3 | 4 | 5 | 6 | // 父组件清除子组件数据 7 | // import {EventBus} from "@/eventBus/index"; 8 | // EventBus.$emit("clear", true); 9 | 10 | //子组件拿到clear执行清除数据 11 | // EventBus.$on("clear", msg => { 12 | // console.log(msg); 13 | // if (msg) { 14 | // this.parentFileData = []; 15 | // this.fileList = []; 16 | // // 用完之后便销毁 17 | // EventBus.$off('clear', {}) 18 | // } 19 | // }); -------------------------------------------------------------------------------- /src/eventBus/modules/clearEventBus.ts: -------------------------------------------------------------------------------- 1 | import { EventBus } from "@/eventBus/index"; 2 | const objectTmp: any = {}; 3 | 4 | 5 | 6 | 7 | 8 | export const clearEventBus = (data: string) => { 9 | EventBus.$off(data, objectTmp); // 用完之后便销毁 10 | } -------------------------------------------------------------------------------- /src/filters/index.ts: -------------------------------------------------------------------------------- 1 | // Set utils function parseTime to filter 2 | export { parseTime } from '@/utils' 3 | 4 | // Filter for article status 5 | export const articleStatusFilter = (status: string) => { 6 | const statusMap: { [key: string]: string } = { 7 | published: 'success', 8 | draft: 'info', 9 | deleted: 'danger' 10 | } 11 | return statusMap[status] 12 | } 13 | 14 | // Filter to uppercase the first character 15 | export const uppercaseFirstChar = (str: string) => { 16 | return str.charAt(0).toUpperCase() + str.slice(1) 17 | } 18 | 19 | // 千分位过滤器 20 | // 使用:
{{ ssss | thousandBitSeparator }}
21 | export const thousandBitSeparator = (value: string) => { 22 | return value && (value.toString().indexOf('.') !== -1 ? 23 | value.toString().replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) { 24 | return $1 + ','; 25 | }) : 26 | value.toString().replace(/(\d)(?=(\d{3})+$)/g, function ($0, $1) { 27 | return $1 + ','; 28 | })); 29 | } 30 | -------------------------------------------------------------------------------- /src/globals.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'globals' -------------------------------------------------------------------------------- /src/icons/components/404.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | '404': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/back-top.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'back-top': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/bug.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'bug': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/chart.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'chart': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/clipboard.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'clipboard': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/component.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'component': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/documentation.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'documentation': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/drag.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'drag': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/edit.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'edit': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/education.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'education': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/email.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'email': { 7 | width: 128, 8 | height: 96, 9 | viewBox: '0 0 128 96', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/example.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'example': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/excel.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'excel': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/exit-fullscreen.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'exit-fullscreen': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/eye-off.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'eye-off': { 7 | width: 128, 8 | height: 64, 9 | viewBox: '0 0 128 64', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/eye-on.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'eye-on': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 1024 1024', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/fullscreen.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'fullscreen': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/guide-2.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'guide-2': { 7 | width: 1000, 8 | height: 1000, 9 | viewBox: '0 0 1000 1000', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/guide.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'guide': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/hamburger.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'hamburger': { 7 | width: 64, 8 | height: 64, 9 | viewBox: '0 0 1024 1024', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/icon.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'icon': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/index.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | import './404' 3 | import './back-top' 4 | import './bug' 5 | import './chart' 6 | import './clipboard' 7 | import './component' 8 | import './dashboard' 9 | import './documentation' 10 | import './drag' 11 | import './edit' 12 | import './education' 13 | import './email' 14 | import './example' 15 | import './excel' 16 | import './exit-fullscreen' 17 | import './eye-off' 18 | import './eye-on' 19 | import './form' 20 | import './fullscreen' 21 | import './guide-2' 22 | import './guide' 23 | import './hamburger' 24 | import './icon' 25 | import './international' 26 | import './language' 27 | import './like' 28 | import './link' 29 | import './list' 30 | import './lock' 31 | import './message' 32 | import './money' 33 | import './music' 34 | import './nested' 35 | import './password' 36 | import './pdf' 37 | import './people' 38 | import './peoples' 39 | import './qq' 40 | import './search' 41 | import './shopping' 42 | import './singer-song-list' 43 | import './singer-song-lyric' 44 | import './singer' 45 | import './size' 46 | import './skill' 47 | import './star' 48 | import './tab' 49 | import './table' 50 | import './theme' 51 | import './tree-table' 52 | import './tree' 53 | import './user' 54 | import './wechat' 55 | import './zip' -------------------------------------------------------------------------------- /src/icons/components/international.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'international': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/language.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'language': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/like.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'like': { 7 | width: 24, 8 | height: 24, 9 | viewBox: '0 0 24 24', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/link.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'link': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/list.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'list': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/lock.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'lock': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/message.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'message': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/money.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'money': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/music.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'music': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 1024 1024', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/nested.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'nested': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/password.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'password': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/pdf.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'pdf': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 1024 1024', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/people.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'people': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/peoples.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'peoples': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/search.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'search': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/size.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'size': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/skill.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'skill': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/star.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'star': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/tab.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'tab': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/table.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'table': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/theme.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'theme': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/tree-table.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'tree-table': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'user': { 7 | width: 130, 8 | height: 130, 9 | viewBox: '0 0 130 130', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/wechat.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'wechat': { 7 | width: 128, 8 | height: 110, 9 | viewBox: '0 0 128 110', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/components/zip.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* tslint:disable */ 3 | // @ts-ignore 4 | import icon from 'vue-svgicon' 5 | icon.register({ 6 | 'zip': { 7 | width: 128, 8 | height: 128, 9 | viewBox: '0 0 128 128', 10 | data: '' 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /src/icons/svg/404.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/icons/svg/back-top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/bug.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/dashboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/education.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/exit-fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/eye-off.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/eye-on.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/guide-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/hamburger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/language.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/like.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/music.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/pdf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/people.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/skill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/tree-table.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/tree.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/icons/svg/wechat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/icons/svg/zip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 31 | 32 | 58 | -------------------------------------------------------------------------------- /src/layout/components/Sidebar/SidebarItemLink.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 31 | -------------------------------------------------------------------------------- /src/layout/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain.vue' 2 | export { default as Navbar } from './Navbar/index.vue' 3 | export { default as Settings } from './Settings/index.vue' 4 | export { default as Sidebar } from './Sidebar/index.vue' 5 | export { default as TagsView } from './TagsView/index.vue' 6 | -------------------------------------------------------------------------------- /src/pwa/service-worker.js: -------------------------------------------------------------------------------- 1 | // This is the code piece that GenerateSW mode can't provide for us. 2 | // This code listens for the user's confirmation to update the app. 3 | self.addEventListener('message', (e) => { 4 | if (e.data) { 5 | if (e.data === 'skipWaiting') { 6 | self.skipWaiting() 7 | } 8 | } 9 | }) 10 | 11 | /* eslint-disable no-undef */ 12 | workbox.core.clientsClaim() 13 | workbox.precaching.precacheAndRoute(self.__precacheManifest || []) 14 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | interface ISettings { 2 | title: string // Overrides the default title 3 | showSettings: boolean // Controls settings panel display 4 | showTagsView: boolean // Controls tagsview display 5 | showSidebarLogo: boolean // Controls siderbar logo display 6 | fixedHeader: boolean // If true, will fix the header component 7 | errorLog: string[] // The env to enable the errorlog component, default 'production' only 8 | sidebarTextTheme: boolean // If true, will change active text color for sidebar based on theme 9 | devServerPort: number // Port number for webpack-dev-server 10 | mockServerPort: number // Port number for mock server 11 | } 12 | 13 | // You can customize below settings :) 14 | const settings: ISettings = { 15 | title: '音乐博客', 16 | showSettings: true, 17 | showTagsView: true, 18 | fixedHeader: false, 19 | showSidebarLogo: false, 20 | errorLog: ['production'], 21 | sidebarTextTheme: true, 22 | devServerPort: 9527, 23 | mockServerPort: 9548 24 | } 25 | 26 | export default settings 27 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | 2 | declare module '*.scss' { 3 | const str: string; 4 | export default str; 5 | } 6 | 7 | declare module '*.css' { 8 | const str: string; 9 | export default str; 10 | } 11 | 12 | declare module '*.html' { 13 | const str: string; 14 | export default str; 15 | } 16 | declare module '*.json' { 17 | const value: any; 18 | export default value; 19 | } 20 | 21 | 22 | 23 | import Vue from 'vue'; 24 | import VueRouter from 'vue-router'; 25 | import { Route } from 'vue-router'; 26 | import { Store } from 'vuex'; 27 | 28 | 29 | // 扩充 30 | declare module 'vue/types/vue' { 31 | interface Vue { 32 | $router: VueRouter; 33 | $route: Route; 34 | $store: Store; 35 | $api: any; 36 | getVal: any; 37 | toVal: any; 38 | } 39 | } -------------------------------------------------------------------------------- /src/shims.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue' 3 | export default Vue 4 | } 5 | 6 | declare module 'element-ui/lib/locale/lang/*' { 7 | export const elementLocale: any 8 | } 9 | 10 | declare module '*.gif' { 11 | export const gif: any 12 | } 13 | 14 | declare module '*.ts' { 15 | export const ts: any 16 | } 17 | 18 | // TODO: remove this part after vue-count-to has its typescript file 19 | declare module 'vue-count-to' 20 | 21 | // TODO: remove this part after vuedraggable has its typescript file 22 | declare module 'vuedraggable' 23 | 24 | // TODO: remove this part after vue2-dropzone has its typescript file 25 | declare module 'vue2-dropzone' 26 | 27 | // TODO: remove this part after vue-image-crop-upload has its typescript file 28 | declare module 'vue-image-crop-upload' 29 | 30 | // TODO: remove this part after vue-splitpane has its typescript file 31 | declare module 'vue-splitpane' 32 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import { IAppState } from './modules/app' 4 | import { IUserState } from './modules/user' 5 | import { ITagsViewState } from './modules/tags-view' 6 | import { IErrorLogState } from './modules/error-log' 7 | import { IPermissionState } from './modules/permission' 8 | import { ISettingsState } from './modules/settings' 9 | import { IMusicState } from './modules/music' 10 | 11 | Vue.use(Vuex) 12 | 13 | export interface IRootState { 14 | app: IAppState 15 | user: IUserState 16 | tagsView: ITagsViewState 17 | errorLog: IErrorLogState 18 | permission: IPermissionState 19 | settings: ISettingsState 20 | music: IMusicState 21 | } 22 | 23 | // Declare empty store first, dynamically register all modules later. 24 | export default new Vuex.Store({}) 25 | -------------------------------------------------------------------------------- /src/store/modules/error-log.ts: -------------------------------------------------------------------------------- 1 | import { VuexModule, Module, Mutation, Action, getModule } from 'vuex-module-decorators' 2 | import store from '@/store' 3 | 4 | interface IErrorLog { 5 | err: Error 6 | vm: any 7 | info: string 8 | url: string 9 | } 10 | 11 | export interface IErrorLogState { 12 | logs: IErrorLog[] 13 | } 14 | 15 | @Module({ dynamic: true, store, name: 'errorLog' }) 16 | class ErrorLog extends VuexModule implements IErrorLogState { 17 | public logs: IErrorLog[] = [] 18 | 19 | @Mutation 20 | private ADD_ERROR_LOG(log: IErrorLog) { 21 | this.logs.push(log) 22 | } 23 | 24 | @Mutation 25 | private CLEAR_ERROR_LOG() { 26 | this.logs.splice(0) 27 | } 28 | 29 | @Action 30 | public AddErrorLog(log: IErrorLog) { 31 | this.ADD_ERROR_LOG(log) 32 | } 33 | 34 | @Action 35 | public ClearErrorLog() { 36 | this.CLEAR_ERROR_LOG() 37 | } 38 | } 39 | 40 | export const ErrorLogModule = getModule(ErrorLog) 41 | -------------------------------------------------------------------------------- /src/styles/_mixins.scss: -------------------------------------------------------------------------------- 1 | /* Mixins */ 2 | @mixin clearfix { 3 | &:after { 4 | content: ""; 5 | display: table; 6 | clear: both; 7 | } 8 | } 9 | 10 | @mixin rounded-corners($radius) { 11 | -moz-border-radius: $radius; 12 | -webkit-border-radius: $radius; 13 | border-radius: $radius; 14 | 15 | } 16 | @mixin transition{ 17 | transition: height 0.2s; 18 | -o-transition: height 0.2s; 19 | -moz-transition: height 0.2s; 20 | -webkit-transition: height 0.2s; 21 | 22 | } 23 | @mixin fontFamily($fontfamily){ 24 | font-family:$fontfamily; 25 | font-weight: bold; 26 | } 27 | -------------------------------------------------------------------------------- /src/styles/_svgicon.scss: -------------------------------------------------------------------------------- 1 | /* Recommended css code for vue-svgicon */ 2 | .svg-icon { 3 | display: inline-block; 4 | width: 16px; 5 | height: 16px; 6 | color: inherit; 7 | fill: none; 8 | stroke: currentColor; 9 | vertical-align: -0.15em; 10 | } 11 | 12 | .svg-fill { 13 | fill: currentColor; 14 | stroke: none; 15 | } 16 | 17 | .svg-up { 18 | transform: rotate(0deg); 19 | } 20 | 21 | .svg-right { 22 | transform: rotate(90deg); 23 | } 24 | 25 | .svg-down { 26 | transform: rotate(180deg); 27 | } 28 | 29 | .svg-left { 30 | transform: rotate(-90deg); 31 | } 32 | -------------------------------------------------------------------------------- /src/styles/_transition.scss: -------------------------------------------------------------------------------- 1 | /* Global transition */ 2 | // See https://vuejs.org/v2/guide/transitions.html for detail 3 | 4 | // fade 5 | .fade-enter-active, 6 | .fade-leave-active { 7 | transition: opacity 0.28s; 8 | } 9 | 10 | .fade-enter, 11 | .fade-leave-active { 12 | opacity: 0; 13 | } 14 | 15 | // fade-transform 16 | .fade-transform-leave-active, 17 | .fade-transform-enter-active { 18 | transition: all .5s; 19 | } 20 | 21 | .fade-transform-enter { 22 | opacity: 0; 23 | transform: translateX(-30px); 24 | } 25 | 26 | .fade-transform-leave-to { 27 | opacity: 0; 28 | transform: translateX(30px); 29 | } 30 | 31 | // breadcrumb 32 | .breadcrumb-enter-active, 33 | .breadcrumb-leave-active { 34 | transition: all .5s; 35 | } 36 | 37 | .breadcrumb-enter, 38 | .breadcrumb-leave-active { 39 | opacity: 0; 40 | transform: translateX(20px); 41 | } 42 | 43 | .breadcrumb-move { 44 | transition: all .5s; 45 | } 46 | 47 | .breadcrumb-leave-active { 48 | position: absolute; 49 | } 50 | -------------------------------------------------------------------------------- /src/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | /* Variables */ 2 | 3 | // Base color 4 | $blue:#324157; 5 | $light-blue:#3A71A8; 6 | $red:#C03639; 7 | $pink: #E65D6E; 8 | $green: #30B08F; 9 | $tiffany: #4AB7BD; 10 | $yellow:#FEC171; 11 | $panGreen: #30B08F; 12 | 13 | // Sidebar 14 | $sideBarWidth: 210px; 15 | $subMenuBg:#1f2d3d; 16 | $subMenuHover:#001528; 17 | $subMenuActiveText:#f4f4f5; 18 | $menuBg:#304156; 19 | $menuText:#bfcbd9; 20 | $menuActiveText:#409EFF; // Also see settings.sidebarTextTheme 21 | 22 | // Login page 23 | $lightGray: #eee; 24 | $darkGray:#889aa4; 25 | $loginBg: #2d3a4b; 26 | $loginCursorColor: #fff; 27 | 28 | $textTitle: #00ad35; // 文字标题颜色 29 | $textIllustrate: #a2a8a2; // 标题下面字颜色(说明字体) 30 | 31 | // The :export directive is the magic sauce for webpack 32 | // https://mattferderer.com/use-sass-variables-in-typescript-and-javascript 33 | :export { 34 | menuBg: $menuBg; 35 | menuText: $menuText; 36 | menuActiveText: $menuActiveText; 37 | } 38 | 39 | 40 | // font-size 41 | $btnFontSize: 16px; 42 | $bodyFontSize: 16px; 43 | -------------------------------------------------------------------------------- /src/styles/_variables.scss.d.ts: -------------------------------------------------------------------------------- 1 | export interface IScssVariables { 2 | menuBg: string 3 | menuText: string 4 | menuActiveText: string 5 | } 6 | 7 | export const variables: IScssVariables 8 | 9 | export default variables 10 | -------------------------------------------------------------------------------- /src/styles/element-variables.scss: -------------------------------------------------------------------------------- 1 | /* Element Variables */ 2 | 3 | // Override Element UI variables 4 | $--color-primary: #1890ff; 5 | $--color-success: #13ce66; 6 | $--color-warning: #FFBA00; 7 | $--color-danger: #ff4949; 8 | $--color-info: #5d5d5d; 9 | $--button-font-weight: 400; 10 | $--color-text-regular: #1f2d3d; 11 | $--border-color-light: #dfe4ed; 12 | $--border-color-lighter: #e6ebf5; 13 | $--table-border:1px solid#dfe6ec; 14 | 15 | // Icon font path, required 16 | $--font-path: '~element-ui/lib/theme-chalk/fonts'; 17 | 18 | // Apply overrided variables in Element UI 19 | @import '~element-ui/packages/theme-chalk/src/index'; 20 | 21 | // The :export directive is the magic sauce for webpack 22 | // https://mattferderer.com/use-sass-variables-in-typescript-and-javascript 23 | :export { 24 | theme: $--color-primary; 25 | } 26 | -------------------------------------------------------------------------------- /src/styles/element-variables.scss.d.ts: -------------------------------------------------------------------------------- 1 | export interface IScssVariables { 2 | theme: string 3 | } 4 | 5 | export const variables: IScssVariables 6 | 7 | export default variables 8 | -------------------------------------------------------------------------------- /src/utils/clipboard.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Clipboard from 'clipboard' 3 | 4 | export const clipboardSuccess = () => 5 | Vue.prototype.$message({ 6 | message: 'Copy successfully', 7 | type: 'success', 8 | duration: 1500 9 | }) 10 | 11 | export const clipboardError = () => 12 | Vue.prototype.$message({ 13 | message: 'Copy failed', 14 | type: 'error' 15 | }) 16 | 17 | export const handleClipboard = (text: string, event: MouseEvent) => { 18 | const clipboard = new Clipboard(event.target as Element, { 19 | text: () => text 20 | }) 21 | clipboard.on('success', () => { 22 | clipboardSuccess() 23 | clipboard.destroy() 24 | }) 25 | clipboard.on('error', () => { 26 | clipboardError() 27 | clipboard.destroy() 28 | }); 29 | (clipboard as any).onClick(event) 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/cookies.ts: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | // App 4 | const sidebarStatusKey = 'sidebar_status' 5 | export const getSidebarStatus = () => Cookies.get(sidebarStatusKey) 6 | export const setSidebarStatus = (sidebarStatus: string) => Cookies.set(sidebarStatusKey, sidebarStatus) 7 | 8 | const languageKey = 'language' 9 | export const getLanguage = () => Cookies.get(languageKey) 10 | export const setLanguage = (language: string) => Cookies.set(languageKey, language) 11 | 12 | const sizeKey = 'size' 13 | export const getSize = () => Cookies.get(sizeKey) 14 | export const setSize = (size: string) => Cookies.set(sizeKey, size) 15 | 16 | // User 17 | const tokenKey = 'vue_typescript_admin_access_token' 18 | export const getToken = () => Cookies.get(tokenKey) 19 | export const setToken = (token: string) => Cookies.set(tokenKey, token) 20 | export const removeToken = () => Cookies.remove(tokenKey) 21 | -------------------------------------------------------------------------------- /src/utils/error-log.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { ErrorLogModule } from '@/store/modules/error-log' 3 | import { isArray } from '@/utils/validate' 4 | import settings from '@/settings' 5 | 6 | const { errorLog: needErrorLog } = settings 7 | 8 | const checkNeed = () => { 9 | const env = process.env.NODE_ENV 10 | if (isArray(needErrorLog) && env) { 11 | return needErrorLog.includes(env) 12 | } 13 | return false 14 | } 15 | 16 | if (checkNeed()) { 17 | Vue.config.errorHandler = function(err, vm, info) { 18 | ErrorLogModule.AddErrorLog({ 19 | err, 20 | vm, 21 | info, 22 | url: window.location.href 23 | }) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/utils/permission.ts: -------------------------------------------------------------------------------- 1 | import { UserModule } from '@/store/modules/user' 2 | 3 | export const checkPermission = (value: string[]): boolean => { 4 | if (value && value instanceof Array && value.length > 0) { 5 | const roles = UserModule.roles 6 | const permissionRoles = value 7 | const hasPermission = roles.some(role => { 8 | return permissionRoles.includes(role) 9 | }) 10 | return hasPermission 11 | } else { 12 | console.error('need roles! Like v-permission="[\'admin\',\'editor\']"') 13 | return false 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/symBol.ts: -------------------------------------------------------------------------------- 1 | // Provide/Inject 为了避免命名冲突, 可以使用 ES6 的 Symbol 特性作为 key 2 | export const symbol:any = Symbol(); -------------------------------------------------------------------------------- /src/utils/tool/arr.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: zemin zheng 3 | * @Date: 2021-08-29 20:10:44 4 | * @LastEditTime: 2021-08-29 20:41:02 5 | * @LastEditors: Please set LastEditors 6 | * @Description: 数组工具类 7 | * @FilePath: \vue-typescript-admin-template-master\src\utils\tool\arr.ts 8 | */ 9 | 10 | 11 | /** 12 | * @description 计算特定字符在数组中的出现数量 13 | * 14 | * @param {Array} arr 15 | * @param {string} char 16 | * @return {Array} 17 | * @example 18 | * let arr = [{category: 1, id: 5}, {category: 2, id: 2}, {category: 1, id: 3}, {category: 3, id: 4}, ] 19 | * arrCalculateStr(arr, 'category') // [ category1: 2, category2: 1, category3: 1 ] 20 | */ 21 | const arrCalculateStr = (arr: Array, char: string) =>{ 22 | return arr.reduce((total, currentValue, currentIndex) =>{ 23 | let totalVar = total[char + currentValue.category] 24 | total[char + currentValue.category] = totalVar ? totalVar + 1 : 1 25 | 26 | return total 27 | }, []) 28 | } 29 | 30 | 31 | export { 32 | arrCalculateStr 33 | } -------------------------------------------------------------------------------- /src/utils/tool/date.ts: -------------------------------------------------------------------------------- 1 | import moment from 'moment' 2 | 3 | 4 | /** 5 | * YYYYMMDDHHmmss转为 YYYY-MM-DD HH:mm ss 6 | * @param dateStr YYYYMMDDHHmmss 7 | */ 8 | const dateFormat = (dateStr: string) =>{ 9 | return dateStr.substring(0,4) + '-' + dateStr.substring(4,6) + '-' + dateStr.substring(6,8) + ' ' + 10 | dateStr.substring(8,10) + ' : ' + dateStr.substring(10,12) + ' ' + dateStr.substring(10,12) 11 | } 12 | 13 | /** 14 | * 系统时间(2021-02-23T14:38:24.000Z)转YYYY-MM-DD HH:mm ss 15 | * @param time 数据库时间格式字符串 16 | */ 17 | const sysDateFormat = (time: string) =>{ 18 | if(!time) return null; 19 | 20 | return moment(time).format("YYYY-MM-DD HH:mm:ss"); 21 | } 22 | 23 | 24 | export { 25 | dateFormat, 26 | sysDateFormat 27 | } -------------------------------------------------------------------------------- /src/utils/tool/index.ts: -------------------------------------------------------------------------------- 1 | function randomSort(a:any,b:any) { 2 | return .5 - Math.random(); 3 | } 4 | 5 | 6 | /** 7 | * 这是该系统的状态颜色 8 | * 根据status获取对应的颜色 9 | * @param status 状态 10 | * @param colorShowMethods 1:代表256颜色值,2:代表某些插件使用的颜色状态(例如elementui) 11 | */ 12 | const colorStatus = (status:number, colorShowMethods = 1) =>{ 13 | switch(status) { 14 | case 1: 15 | return colorShowMethods === 1 ? 'red' : 'danger' 16 | break; 17 | case 2: 18 | return colorShowMethods === 1 ? 'blue' : 'primary' 19 | break; 20 | case 3: 21 | return colorShowMethods === 1 ? '#F4F4F5' : 'info' 22 | break; 23 | case 4: 24 | return colorShowMethods === 1 ? '#FDF6EC' : 'warning' 25 | break; 26 | case 5: 27 | return colorShowMethods === 1 ? 'green' : 'success' 28 | break; 29 | default: 30 | return colorShowMethods === 1 ? 'red' : 'danger' 31 | } 32 | } 33 | 34 | 35 | export { 36 | randomSort, 37 | colorStatus 38 | } -------------------------------------------------------------------------------- /src/utils/validate.ts: -------------------------------------------------------------------------------- 1 | export const isValidUsername = (str: string) => ['admin', 'editor','zheng'].indexOf(str.trim()) >= 0 2 | 3 | export const isExternal = (path: string) => /^(https?:|mailto:|tel:)/.test(path) 4 | 5 | export const isArray = (arg: any) => { 6 | if (typeof Array.isArray === 'undefined') { 7 | return Object.prototype.toString.call(arg) === '[object Array]' 8 | } 9 | return Array.isArray(arg) 10 | } 11 | 12 | export const isValidURL = (url: string) => { 13 | 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.,?'\\+&%$#=~_-]+))*$/ 14 | return reg.test(url) 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/zip.ts: -------------------------------------------------------------------------------- 1 | import { saveAs } from 'file-saver' 2 | import JSZip from 'jszip' 3 | 4 | export const exportTxt2Zip = (th: string[], jsonData: any, txtName = 'file', zipName = 'file') => { 5 | const zip = new JSZip() 6 | const data = jsonData 7 | let txtData = `${th}\r\n` 8 | data.forEach((row: any) => { 9 | let tempStr = '' 10 | tempStr = row.toString() 11 | txtData += `${tempStr}\r\n` 12 | }) 13 | zip.file(`${txtName}.txt`, txtData) 14 | zip.generateAsync({ 15 | type: 'blob' 16 | }).then((blob: Blob) => { 17 | saveAs(blob, `${zipName}.zip`) 18 | }, (err: Error) => { 19 | alert('Zip export failed: ' + err.message) 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /src/views/apiInterface/README.md: -------------------------------------------------------------------------------- 1 | 百个免费API接口分享,调用完全不限次数... 2 | https://mp.weixin.qq.com/s/PEQw14G2nAZLYYeKma-VKw -------------------------------------------------------------------------------- /src/views/apiInterface/phone-attribution/index.ts: -------------------------------------------------------------------------------- 1 | import { Check } from "javascript-tool-class/src/App"; 2 | 3 | const itemList = [ 4 | { 5 | name: "手机号码段", 6 | value: "" 7 | }, 8 | { 9 | name: "卡号归属地", 10 | value: 0 11 | }, 12 | { 13 | name: "运营商", 14 | value: 0 15 | }, 16 | { 17 | name: "区号", 18 | value: 0 19 | }, 20 | { 21 | name: "邮编", 22 | value: 0 23 | } 24 | ] 25 | 26 | 27 | const myCheck = new Check(); 28 | 29 | 30 | 31 | export { 32 | itemList, 33 | myCheck 34 | } -------------------------------------------------------------------------------- /src/views/charts/bar-chart.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /src/views/charts/line-chart.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /src/views/charts/mixed-chart.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /src/views/components-demo/draggable-list.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 47 | -------------------------------------------------------------------------------- /src/views/components-demo/dropzone.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 43 | -------------------------------------------------------------------------------- /src/views/dashboard/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | -------------------------------------------------------------------------------- /src/views/eat/breakfast.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/eat/dinner.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/eat/lunch.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | 25 | -------------------------------------------------------------------------------- /src/views/eat/modules/formUtils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: your name 3 | * @Date: 2021-10-06 14:50:44 4 | * @LastEditTime: 2021-10-06 18:38:40 5 | * @LastEditors: Please set LastEditors 6 | * @Description: In User Settings Edit 7 | * @FilePath: \vueAndTsAndKoa2\src\views\usualWebsite\modules\formUtils.ts 8 | */ 9 | // Form工具方法 10 | 11 | import { programTypeOptions, designTypeOptions, toolTypeOptions, movieTypeOptions,otherTypeOptions } from './options'; 12 | 13 | /** 14 | * 设置表单的type类型的option 15 | * @param type 类别(前端:1;后端:2) 16 | */ 17 | const setType = (type:number, Form:any) =>{ 18 | switch(type){ 19 | case 1: 20 | Form.info.type.options = programTypeOptions 21 | break 22 | case 2: 23 | Form.info.type.options = designTypeOptions 24 | break 25 | case 3: 26 | Form.info.type.options = toolTypeOptions 27 | break 28 | case 4: 29 | Form.info.type.options = movieTypeOptions 30 | break 31 | case 5: 32 | Form.info.type.options = otherTypeOptions 33 | break 34 | default: 35 | Form.info.type.options = programTypeOptions 36 | } 37 | } 38 | 39 | 40 | 41 | export { 42 | setType 43 | } -------------------------------------------------------------------------------- /src/views/eat/modules/index.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class AgentEvent { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | AgentEvent 35 | } -------------------------------------------------------------------------------- /src/views/eat/modules/options.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | // 编程program的option 4 | const programTypeOptions = [ 5 | { value: '前端', label: '前端' }, 6 | { value: '后端', label: '后端' }, 7 | { value: '前后端', label: '前后端' }, 8 | { value: '其他', label: '其他' } 9 | ] 10 | 11 | // 设计design的option 12 | const designTypeOptions = [ 13 | { value: '设计', label: '设计' } 14 | ] 15 | 16 | 17 | // 工具tool的option 18 | const toolTypeOptions = [ 19 | { value: '算法', label: '算法' } 20 | ] 21 | 22 | 23 | // 电影movie的option 24 | const movieTypeOptions = [ 25 | { value: '电影Vip观看', label: '电影Vip观看' }, 26 | { value: '视频格式转换', label: '视频格式转换' }, 27 | ] 28 | 29 | // 电影movie的option 30 | const otherTypeOptions = [ 31 | { value: '其他', label: '其他' }, 32 | ] 33 | 34 | 35 | 36 | export { 37 | programTypeOptions, 38 | designTypeOptions, 39 | toolTypeOptions, 40 | movieTypeOptions, 41 | otherTypeOptions 42 | } -------------------------------------------------------------------------------- /src/views/eat/nightingale.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | 25 | -------------------------------------------------------------------------------- /src/views/eat/other.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | 25 | -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/bean_500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/bean_500.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/bean_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/bean_five.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/bean_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/bean_one.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/bean_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/bean_ten.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/bean_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/bean_two.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/close_store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/close_store.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/color_pillar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/color_pillar.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/congratulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/congratulation.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/draw_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/draw_btn.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/draw_wheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/draw_wheel.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/give_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/give_up.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/luck_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/luck_bg.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/lucky_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/lucky_title.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/point_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/point_five.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/point_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/point_ten.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/sorry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/sorry.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/img/wheel_toast_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/img/wheel_toast_1.png -------------------------------------------------------------------------------- /src/views/eat/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/git-Dignity/vueAndTsAndKoa2/6eedd79d745ec72167505e8dc1d4917c2d4d888e/src/views/eat/src/assets/logo.png -------------------------------------------------------------------------------- /src/views/eat/src/index/config.ts: -------------------------------------------------------------------------------- 1 | export const prizeList = [ 2 | { 3 | icon: require("../assets/img/bean_500.png"), // 奖品图片 4 | name: "鱼香茄子", // 奖品名称 5 | color:'#000', 6 | isPrize: 1 // 该奖项是否为奖品 7 | }, 8 | { 9 | icon: require("../assets/img/bean_five.png"), 10 | name: "手撕鸡", 11 | color:'red', 12 | isPrize: 1 13 | }, 14 | { 15 | icon: require("../assets/img/bean_one.png"), 16 | name: "可乐鸡翅", 17 | color:'green', 18 | isPrize: 1 19 | }, 20 | { 21 | icon: require("../assets/img/point_five.png"), 22 | name: "奖品4", 23 | color:'red', 24 | isPrize: 1 25 | }, 26 | { 27 | icon: require("../assets/img/point_ten.png"), 28 | name: "奖品5", 29 | color:'#FF4E3A', 30 | isPrize: 1 31 | }, 32 | { 33 | icon: require("../assets/img/bean_500.png"), 34 | name: "奖品6", 35 | color:'#FF925D', 36 | isPrize: 1 37 | }, 38 | { 39 | icon: require("../assets/img/give_up.png"), 40 | name: "奖品7", 41 | color:'#FFCC72', 42 | isPrize: 0 43 | }, 44 | { 45 | icon: require("../assets/img/bean_500.png"), 46 | name: "奖品8", 47 | color:'#FE315D', 48 | isPrize: 1 49 | } 50 | ] -------------------------------------------------------------------------------- /src/views/eat/todayEat.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 36 | 37 | 40 | -------------------------------------------------------------------------------- /src/views/error-log/components/ErrorTestA.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/views/error-log/components/ErrorTestB.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/views/error-log/index.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /src/views/example/components/Dropdown/Comment.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 49 | -------------------------------------------------------------------------------- /src/views/example/components/Dropdown/SourceUrl.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 51 | -------------------------------------------------------------------------------- /src/views/example/components/Dropdown/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CommentDropdown } from './Comment.vue' 2 | export { default as PlatformDropdown } from './Platform.vue' 3 | export { default as SourceUrlDropdown } from './SourceUrl.vue' 4 | -------------------------------------------------------------------------------- /src/views/example/components/Warning.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/views/example/create.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /src/views/example/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /src/views/excel/components/AutoWidthOption.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 39 | -------------------------------------------------------------------------------- /src/views/excel/components/BookTypeOption.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 38 | -------------------------------------------------------------------------------- /src/views/excel/components/FilenameOption.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 34 | -------------------------------------------------------------------------------- /src/views/guide/index.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 44 | -------------------------------------------------------------------------------- /src/views/guide/steps.ts: -------------------------------------------------------------------------------- 1 | const steps = [ 2 | { 3 | element: '#hamburger-container', 4 | popover: { 5 | title: 'Hamburger', 6 | description: 'Open && Close sidebar', 7 | position: 'bottom' 8 | } 9 | }, 10 | { 11 | element: '#breadcrumb-container', 12 | popover: { 13 | title: 'Breadcrumb', 14 | description: 'Indicate the current page location', 15 | position: 'bottom' 16 | } 17 | }, 18 | { 19 | element: '#header-search', 20 | popover: { 21 | title: 'Page Search', 22 | description: 'Page search, quick navigation', 23 | position: 'left' 24 | } 25 | }, 26 | { 27 | element: '#screenfull', 28 | popover: { 29 | title: 'Screenfull', 30 | description: 'Set the page into fullscreen', 31 | position: 'left' 32 | } 33 | }, 34 | { 35 | element: '#size-select', 36 | popover: { 37 | title: 'Switch Size', 38 | description: 'Switch the system size', 39 | position: 'left' 40 | } 41 | }, 42 | { 43 | element: '#tags-view-container', 44 | popover: { 45 | title: 'Tags view', 46 | description: 'The history of the page you visited', 47 | position: 'bottom' 48 | }, 49 | padding: 0 50 | } 51 | ] 52 | 53 | export default steps 54 | -------------------------------------------------------------------------------- /src/views/icons/svg-icons.ts: -------------------------------------------------------------------------------- 1 | const req = require.context('../../icons/svg', false, /\.svg$/) 2 | const re = /\.\/(.*)\.svg/ 3 | const requireAll = (requireContext: any) => requireContext.keys() 4 | 5 | const icons = requireAll(req).map((str: string) => { 6 | const match = str.match(re) 7 | if (match !== null) return match[1] 8 | return null 9 | }) 10 | 11 | export default icons 12 | -------------------------------------------------------------------------------- /src/views/itKnowledge/algorithm.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | 23 | 25 | -------------------------------------------------------------------------------- /src/views/itKnowledge/front-end.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | 24 | -------------------------------------------------------------------------------- /src/views/itKnowledge/front-rear-end.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | 24 | -------------------------------------------------------------------------------- /src/views/itKnowledge/modules/formUtils.ts: -------------------------------------------------------------------------------- 1 | // Form工具方法 2 | 3 | import { frontEndTypeOptions, rearEndTypeOptions, algorithmTypeOptions, frontRearEndTypeOptions, toolTypeOptions } from './options'; 4 | 5 | /** 6 | * 设置表单的type类型的option 7 | * @param type 类别(前端:1;后端:2;算法:3;前后端:4;工具:5) 8 | */ 9 | const setType = (type:number, Form:any) =>{ 10 | switch(type){ 11 | case 1: 12 | Form.info.type.options = frontEndTypeOptions 13 | break 14 | case 2: 15 | Form.info.type.options = rearEndTypeOptions 16 | break 17 | case 3: 18 | Form.info.type.options = algorithmTypeOptions 19 | break 20 | case 4: 21 | Form.info.type.options = frontRearEndTypeOptions 22 | break 23 | case 5: 24 | Form.info.type.options = toolTypeOptions 25 | break 26 | default: 27 | Form.info.type.options = frontEndTypeOptions 28 | } 29 | } 30 | 31 | 32 | 33 | export { 34 | setType 35 | } -------------------------------------------------------------------------------- /src/views/itKnowledge/modules/index.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class AgentEvent { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | AgentEvent 35 | } -------------------------------------------------------------------------------- /src/views/itKnowledge/rear-end.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | 24 | -------------------------------------------------------------------------------- /src/views/itKnowledge/tool.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | 24 | -------------------------------------------------------------------------------- /src/views/login/auth-redirect.vue: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /src/views/me/diary.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 30 | 31 | 34 | -------------------------------------------------------------------------------- /src/views/me/modules/agent-event/index.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class AgentEvent { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | AgentEvent 35 | } -------------------------------------------------------------------------------- /src/views/me/modules/agent-event/options.ts: -------------------------------------------------------------------------------- 1 | const agentTypeOptions = [ 2 | { value: 'two-days', label: '这两天' }, 3 | { value: 'recent', label: '近期' }, 4 | { value: 'postpone', label: '延后' } 5 | ] 6 | 7 | const noticeWayOptions = [ 8 | { value: 1, label: 'Bark' }, 9 | { value: 2, label: '微信方糖' }, 10 | { value: 3, label: 'QQ邮箱' } 11 | ] 12 | 13 | 14 | export { 15 | agentTypeOptions, 16 | noticeWayOptions 17 | } -------------------------------------------------------------------------------- /src/views/me/modules/features-dev/formUtils.ts: -------------------------------------------------------------------------------- 1 | // Form工具方法 2 | 3 | import { frontEndTypeOptions, rearEndTypeOptions, algorithmTypeOptions } from './options'; 4 | 5 | /** 6 | * 设置表单的type类型的option 7 | * @param type 类别(前端:1;后端:2) 8 | */ 9 | const setType = (type:number, Form:any) =>{ 10 | switch(type){ 11 | case 1: 12 | Form.info.type.options = frontEndTypeOptions 13 | break 14 | case 2: 15 | Form.info.type.options = rearEndTypeOptions 16 | break 17 | case 3: 18 | Form.info.type.options = algorithmTypeOptions 19 | break 20 | default: 21 | Form.info.type.options = frontEndTypeOptions 22 | } 23 | } 24 | 25 | 26 | 27 | export { 28 | setType 29 | } -------------------------------------------------------------------------------- /src/views/me/modules/features-dev/index.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class AgentEvent { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | AgentEvent 35 | } -------------------------------------------------------------------------------- /src/views/me/modules/features-dev/options.ts: -------------------------------------------------------------------------------- 1 | // 前端front-end的option 2 | const frontEndTypeOptions = [ 3 | { value: 'html', label: 'HTML' }, 4 | { value: 'css', label: 'CSS' }, 5 | { value: 'javascript', label: 'Javascript' }, 6 | { value: 'vue', label: 'Vue' }, 7 | { value: 'ui', label: 'Ui' }, 8 | { value: '面试', label: '面试' } 9 | ] 10 | 11 | // 后端rear-end的option 12 | const rearEndTypeOptions = [ 13 | { value: 'java', label: 'Java' }, 14 | { value: 'node', label: 'Node' }, 15 | { value: 'mysql', label: 'Mysql' }, 16 | { value: 'oracle', label: 'Oracle' }, 17 | { value: '面试', label: '面试' } 18 | ] 19 | 20 | 21 | // 算法algorithm的option 22 | const algorithmTypeOptions = [ 23 | { value: '算法', label: '算法' } 24 | ] 25 | 26 | 27 | 28 | 29 | export { 30 | frontEndTypeOptions, 31 | rearEndTypeOptions, 32 | algorithmTypeOptions 33 | } -------------------------------------------------------------------------------- /src/views/music/components/Header.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | 30 | 40 | 41 | -------------------------------------------------------------------------------- /src/views/music/modules/music-singer/formData.ts: -------------------------------------------------------------------------------- 1 | // 歌手表单信息 2 | const singerInfo = { 3 | name: "singerInfo", 4 | position: "left", 5 | labelWidth: 100, 6 | size: "medium", 7 | info: { 8 | "singerName": { 9 | label: 'music.singerName', 10 | name: "singerName", 11 | value: "", 12 | disabled: false, 13 | hidden: false, 14 | // 规则必须也得定义在form绑定的model中 15 | rule: { 16 | required: true, message: "歌手名不能为空" 17 | } 18 | } 19 | } 20 | } 21 | 22 | 23 | 24 | export { 25 | singerInfo 26 | } -------------------------------------------------------------------------------- /src/views/music/modules/singer-song-list/index.ts: -------------------------------------------------------------------------------- 1 | class SingerSongList { 2 | musicInfo:Object; 3 | y:string; 4 | constructor(musicInfo:Object, y:string) { 5 | this.musicInfo = musicInfo; 6 | this.y = y; 7 | } 8 | toString() { 9 | // return '输入项:(' + this.x + ', ' + this.y + ')'; 10 | } 11 | doStuff() { 12 | console.log('stuff'); 13 | } 14 | } 15 | 16 | export default SingerSongList -------------------------------------------------------------------------------- /src/views/music/test.ts: -------------------------------------------------------------------------------- 1 | class Point { 2 | x:string; 3 | y:string; 4 | constructor(x:string, y:string) { 5 | this.x = x; 6 | this.y = y; 7 | } 8 | toString() { 9 | return '输入项:(' + this.x + ', ' + this.y + ')'; 10 | } 11 | doStuff() { 12 | console.log('stuff'); 13 | } 14 | } 15 | 16 | export default Point -------------------------------------------------------------------------------- /src/views/nested/menu1/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-1/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 26 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/menu1-2-1/index.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-2/menu1-2-2/index.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/views/nested/menu1/menu1-3/index.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/views/nested/menu2/index.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /src/views/pdf/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 25 | -------------------------------------------------------------------------------- /src/views/permission/components/SwitchRoles.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 37 | -------------------------------------------------------------------------------- /src/views/permission/page.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 23 | -------------------------------------------------------------------------------- /src/views/personal/personal-view/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/views/profile/components/Account.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 39 | -------------------------------------------------------------------------------- /src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 19 | -------------------------------------------------------------------------------- /src/views/sys/modules/options.ts: -------------------------------------------------------------------------------- 1 | const calendarTypeOptions = [ 2 | { value: 'assignment', label: '任务分配' }, 3 | { value: 'security-role', label: '管理角色' }, 4 | { value: 'user', label: '普通角色' } 5 | ] 6 | 7 | const statusOptions = [ 8 | { value: 0, label: '否' }, 9 | { value: 1, label: '是' } 10 | ] 11 | 12 | 13 | export { 14 | calendarTypeOptions, 15 | statusOptions 16 | } -------------------------------------------------------------------------------- /src/views/sys/modules/user/tableData.ts: -------------------------------------------------------------------------------- 1 | 2 | const userTableColumns = { 3 | "username": { 4 | prop: "username", 5 | label: "用户名", 6 | width: "10%" 7 | }, 8 | "photo": { 9 | prop: "photo", 10 | label: "头像", 11 | isPhoto:true, 12 | width: "10%" 13 | }, 14 | "phone": { 15 | prop: "phone", 16 | label: "手机号码", 17 | width: "15%" 18 | }, 19 | "roles": { 20 | prop: "roles", 21 | label: "角色", 22 | width: "15%", 23 | sortable: "true" 24 | }, 25 | "handSolt": { 26 | prop: "handSolt", 27 | width: "50%", 28 | label: "操作" 29 | } 30 | } 31 | 32 | 33 | 34 | export { 35 | userTableColumns 36 | } -------------------------------------------------------------------------------- /src/views/sys/sys-menu.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 31 | -------------------------------------------------------------------------------- /src/views/table/dynamic-table/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | -------------------------------------------------------------------------------- /src/views/usualWebsite/design.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/usualWebsite/modules/formUtils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: your name 3 | * @Date: 2021-10-06 14:50:44 4 | * @LastEditTime: 2021-10-06 18:38:40 5 | * @LastEditors: Please set LastEditors 6 | * @Description: In User Settings Edit 7 | * @FilePath: \vueAndTsAndKoa2\src\views\usualWebsite\modules\formUtils.ts 8 | */ 9 | // Form工具方法 10 | 11 | import { programTypeOptions, designTypeOptions, toolTypeOptions, movieTypeOptions,otherTypeOptions } from './options'; 12 | 13 | /** 14 | * 设置表单的type类型的option 15 | * @param type 类别(前端:1;后端:2) 16 | */ 17 | const setType = (type:number, Form:any) =>{ 18 | switch(type){ 19 | case 1: 20 | Form.info.type.options = programTypeOptions 21 | break 22 | case 2: 23 | Form.info.type.options = designTypeOptions 24 | break 25 | case 3: 26 | Form.info.type.options = toolTypeOptions 27 | break 28 | case 4: 29 | Form.info.type.options = movieTypeOptions 30 | break 31 | case 5: 32 | Form.info.type.options = otherTypeOptions 33 | break 34 | default: 35 | Form.info.type.options = programTypeOptions 36 | } 37 | } 38 | 39 | 40 | 41 | export { 42 | setType 43 | } -------------------------------------------------------------------------------- /src/views/usualWebsite/modules/index.ts: -------------------------------------------------------------------------------- 1 | import { IDialogData } from '@/components/Dialog/types/index' 2 | 3 | 4 | 5 | 6 | class AgentEvent { 7 | childrenDialogData: IDialogData; 8 | tHeader: Array; 9 | constructor(childrenDialogData: IDialogData) { 10 | this.childrenDialogData = childrenDialogData; 11 | this.tHeader = ['开始时间','id', '通知方式', '结束时间', '标题', '类型;postpone:延后)', '内容', '备注']; 12 | } 13 | /** 14 | * 15 | * @param title 对话框标题 16 | * @param isShowSubmit 是否显示提交取消按钮 17 | * @param isCloseModal 是否可点击对话框之外的空间,关闭对话框 18 | * @param show 是否显示对话框(默认是打开) 19 | */ 20 | showDialog(title: string,isShowSubmit: boolean, isCloseModal: boolean, show: boolean = true ) { 21 | this.childrenDialogData.title = title; 22 | this.childrenDialogData.isShowSubmit = isShowSubmit; 23 | this.childrenDialogData.isCloseModal = isCloseModal; 24 | 25 | this.childrenDialogData.show = show; 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | export { 34 | AgentEvent 35 | } -------------------------------------------------------------------------------- /src/views/usualWebsite/modules/options.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: zemin zheng 3 | * @Date: 2021-10-06 14:50:44 4 | * @LastEditTime: 2021-11-06 14:56:04 5 | * @LastEditors: Please set LastEditors 6 | * @Description: 常用网站 -- option类型下拉框选项 7 | * @FilePath: \vueAndTsAndKoa2\src\views\usualWebsite\modules\options.ts 8 | */ 9 | 10 | 11 | // 编程program的option 12 | const programTypeOptions = [ 13 | { value: '前端', label: '前端' }, 14 | { value: '后端', label: '后端' }, 15 | { value: '前后端', label: '前后端' }, 16 | { value: '其他', label: '其他' } 17 | ] 18 | 19 | // 设计design的option 20 | const designTypeOptions = [ 21 | { value: '设计', label: '设计' } 22 | ] 23 | 24 | 25 | // 工具tool的option 26 | const toolTypeOptions = [ 27 | { value: '算法', label: '算法' }, 28 | { value: '工具', label: '工具' }, 29 | { value: '颜色', label: '颜色' }, 30 | ] 31 | 32 | 33 | // 电影movie的option 34 | const movieTypeOptions = [ 35 | { value: '电影Vip观看', label: '电影Vip观看' }, 36 | { value: '视频格式转换', label: '视频格式转换' }, 37 | ] 38 | 39 | // 电影movie的option 40 | const otherTypeOptions = [ 41 | { value: '其他', label: '其他' }, 42 | ] 43 | 44 | 45 | 46 | export { 47 | programTypeOptions, 48 | designTypeOptions, 49 | toolTypeOptions, 50 | movieTypeOptions, 51 | otherTypeOptions 52 | } -------------------------------------------------------------------------------- /src/views/usualWebsite/movie.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/usualWebsite/other.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/usualWebsite/program.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /src/views/usualWebsite/tool.vue: -------------------------------------------------------------------------------- 1 | 9 | 14 | 15 | 29 | 30 | 32 | -------------------------------------------------------------------------------- /tests/unit/utils/parseTime.spec.ts: -------------------------------------------------------------------------------- 1 | import { parseTime } from '@/utils/index.ts' 2 | 3 | describe('Utils:parseTime', () => { 4 | const d = +new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" 5 | 6 | it('timestamp', () => { 7 | expect(parseTime(d)).toBe('2018-07-13 17:54:01') 8 | }) 9 | 10 | it('timestamp string', () => { 11 | expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01') 12 | }) 13 | 14 | it('ten digits timestamp', () => { 15 | expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') 16 | }) 17 | 18 | it('new Date', () => { 19 | expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') 20 | }) 21 | 22 | it('format', () => { 23 | expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') 24 | expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') 25 | expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') 26 | }) 27 | 28 | it('get the day of the week', () => { 29 | expect(parseTime(d, '{a}')).toBe('五') // 星期五 30 | }) 31 | 32 | it('get the day of the week', () => { 33 | expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 34 | }) 35 | 36 | it('empty argument', () => { 37 | expect(parseTime()).toBeNull() 38 | }) 39 | }) 40 | -------------------------------------------------------------------------------- /tests/unit/utils/validate.spec.ts: -------------------------------------------------------------------------------- 1 | import { isValidUsername, isExternal } from '@/utils/validate' 2 | 3 | describe('Utils:validate', () => { 4 | it('isValidUsername', () => { 5 | expect(isValidUsername('admin')).toBe(true) 6 | expect(isValidUsername('editor')).toBe(true) 7 | expect(isValidUsername('xxxx')).toBe(false) 8 | }) 9 | 10 | it('isExternal', () => { 11 | expect(isExternal('https://www.armour.com/')).toBe(true) 12 | expect(isExternal('mailto:someone@test.com')).toBe(true) 13 | expect(isExternal('123aBC')).toBe(false) 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /typings-custom/javascript-tool-class.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'javascript-tool-class/src/App' -------------------------------------------------------------------------------- /typings-custom/lrc-file-parser.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'lrc-file-parser' -------------------------------------------------------------------------------- /typings-custom/zzmcomponentlib.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'zzmcomponentlib' --------------------------------------------------------------------------------