正在显示
33 个修改的文件
包含
71 行增加
和
1862 行删除
| ... | @@ -8,7 +8,7 @@ const { dependencies } = require('../package.json') | ... | @@ -8,7 +8,7 @@ const { dependencies } = require('../package.json') |
| 8 | const webpack = require('webpack') | 8 | const webpack = require('webpack') |
| 9 | const MinifyPlugin = require("babel-minify-webpack-plugin"); | 9 | const MinifyPlugin = require("babel-minify-webpack-plugin"); |
| 10 | const HappyPack = require('happypack') | 10 | const HappyPack = require('happypack') |
| 11 | -const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }) | 11 | +const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length > 4 ? 4 : os.cpus().length }) |
| 12 | 12 | ||
| 13 | function resolve(dir) { | 13 | function resolve(dir) { |
| 14 | return path.join(__dirname, '..', dir) | 14 | return path.join(__dirname, '..', dir) | ... | ... |
| ... | @@ -15,7 +15,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin') | ... | @@ -15,7 +15,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin') |
| 15 | const TerserPlugin = require('terser-webpack-plugin'); | 15 | const TerserPlugin = require('terser-webpack-plugin'); |
| 16 | const { VueLoaderPlugin } = require('vue-loader') | 16 | const { VueLoaderPlugin } = require('vue-loader') |
| 17 | const HappyPack = require('happypack') | 17 | const HappyPack = require('happypack') |
| 18 | -const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }) | 18 | +const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length > 4 ? 4 : os.cpus().length }) |
| 19 | 19 | ||
| 20 | function resolve(dir) { | 20 | function resolve(dir) { |
| 21 | return path.join(__dirname, '..', dir) | 21 | return path.join(__dirname, '..', dir) | ... | ... |
| ... | @@ -13,7 +13,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin') | ... | @@ -13,7 +13,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin') |
| 13 | const TerserPlugin = require('terser-webpack-plugin'); | 13 | const TerserPlugin = require('terser-webpack-plugin'); |
| 14 | const { VueLoaderPlugin } = require('vue-loader') | 14 | const { VueLoaderPlugin } = require('vue-loader') |
| 15 | const HappyPack = require('happypack') | 15 | const HappyPack = require('happypack') |
| 16 | -const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }) | 16 | +const HappyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length > 4 ? 4 : os.cpus().length }) |
| 17 | 17 | ||
| 18 | function resolve(dir) { | 18 | function resolve(dir) { |
| 19 | return path.join(__dirname, '..', dir) | 19 | return path.join(__dirname, '..', dir) | ... | ... |
| ... | @@ -18,7 +18,7 @@ | ... | @@ -18,7 +18,7 @@ |
| 18 | "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js", | 18 | "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js", |
| 19 | "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js", | 19 | "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js", |
| 20 | "update:serve": "node server/index.js", | 20 | "update:serve": "node server/index.js", |
| 21 | - "dep:upgrade":"yarn upgrade-interactive --latest" | 21 | + "dep:upgrade": "yarn upgrade-interactive --latest" |
| 22 | }, | 22 | }, |
| 23 | "build": { | 23 | "build": { |
| 24 | "extraFiles": [], | 24 | "extraFiles": [], |
| ... | @@ -116,7 +116,7 @@ | ... | @@ -116,7 +116,7 @@ |
| 116 | "chalk": "^4.0.0", | 116 | "chalk": "^4.0.0", |
| 117 | "copy-webpack-plugin": "^6.0.3", | 117 | "copy-webpack-plugin": "^6.0.3", |
| 118 | "cross-env": "^7.0.2", | 118 | "cross-env": "^7.0.2", |
| 119 | - "css-loader": "^3.5.3", | 119 | + "css-loader": "^4.0.0", |
| 120 | "del": "^5.1.0", | 120 | "del": "^5.1.0", |
| 121 | "electron": "^9.1.1", | 121 | "electron": "^9.1.1", |
| 122 | "electron-builder": "^22.6.1", | 122 | "electron-builder": "^22.6.1", |
| ... | @@ -142,14 +142,14 @@ | ... | @@ -142,14 +142,14 @@ |
| 142 | "split2": "^3.1.1", | 142 | "split2": "^3.1.1", |
| 143 | "style-loader": "^1.2.1", | 143 | "style-loader": "^1.2.1", |
| 144 | "svg-sprite-loader": "^5.0.0", | 144 | "svg-sprite-loader": "^5.0.0", |
| 145 | - "terser-webpack-plugin": "^3.0.7", | 145 | + "terser-webpack-plugin": "^3.0.8", |
| 146 | "through2-filter": "^3.0.0", | 146 | "through2-filter": "^3.0.0", |
| 147 | "url-loader": "^4.1.0", | 147 | "url-loader": "^4.1.0", |
| 148 | "vue-html-loader": "^1.2.4", | 148 | "vue-html-loader": "^1.2.4", |
| 149 | "vue-loader": "^15.9.3", | 149 | "vue-loader": "^15.9.3", |
| 150 | "vue-style-loader": "^4.1.2", | 150 | "vue-style-loader": "^4.1.2", |
| 151 | "vue-template-compiler": "^2.6.11", | 151 | "vue-template-compiler": "^2.6.11", |
| 152 | - "webpack": "^4.43.0", | 152 | + "webpack": "^4.44.0", |
| 153 | "webpack-cli": "^3.3.12", | 153 | "webpack-cli": "^3.3.12", |
| 154 | "webpack-dev-server": "^3.11.0", | 154 | "webpack-dev-server": "^3.11.0", |
| 155 | "webpack-hot-middleware": "^2.25.0", | 155 | "webpack-hot-middleware": "^2.25.0", | ... | ... |
| 1 | -<template> | ||
| 2 | - <el-breadcrumb class="app-breadcrumb" separator="/"> | ||
| 3 | - <transition-group name="breadcrumb"> | ||
| 4 | - <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path" v-if="item.meta.title"> | ||
| 5 | - <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{item.meta.title}}</span> | ||
| 6 | - <router-link v-else :to="item.redirect||item.path">{{item.meta.title}}</router-link> | ||
| 7 | - </el-breadcrumb-item> | ||
| 8 | - </transition-group> | ||
| 9 | - </el-breadcrumb> | ||
| 10 | -</template> | ||
| 11 | - | ||
| 12 | -<script> | ||
| 13 | -export default { | ||
| 14 | - created() { | ||
| 15 | - this.getBreadcrumb() | ||
| 16 | - }, | ||
| 17 | - data() { | ||
| 18 | - return { | ||
| 19 | - levelList: null | ||
| 20 | - } | ||
| 21 | - }, | ||
| 22 | - watch: { | ||
| 23 | - $route() { | ||
| 24 | - this.getBreadcrumb() | ||
| 25 | - } | ||
| 26 | - }, | ||
| 27 | - methods: { | ||
| 28 | - getBreadcrumb() { | ||
| 29 | - let matched = this.$route.matched.filter(item => item.name) | ||
| 30 | - const first = matched[0] | ||
| 31 | - if (first && first.name !== 'dashboard') { | ||
| 32 | - matched = [{ path: '/dashboard', meta: { title: '总览' }}].concat(matched) | ||
| 33 | - } | ||
| 34 | - this.levelList = matched | ||
| 35 | - } | ||
| 36 | - } | ||
| 37 | -} | ||
| 38 | -</script> | ||
| 39 | - | ||
| 40 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 41 | - .app-breadcrumb.el-breadcrumb { | ||
| 42 | - display: inline-block; | ||
| 43 | - font-size: 14px; | ||
| 44 | - line-height: 50px; | ||
| 45 | - margin-left: 10px; | ||
| 46 | - .no-redirect { | ||
| 47 | - color: #97a8be; | ||
| 48 | - cursor: text; | ||
| 49 | - } | ||
| 50 | - } | ||
| 51 | -</style> |
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <svg t="1492500959545" @click="toggleClick" class="hamburger" :class="{'is-active':isActive}" style="" viewBox="0 0 1024 1024" | ||
| 4 | - version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"> | ||
| 5 | - <path d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z" | ||
| 6 | - p-id="1692"></path> | ||
| 7 | - <path d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z" | ||
| 8 | - p-id="1693"></path> | ||
| 9 | - <path d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z" | ||
| 10 | - p-id="1694"></path> | ||
| 11 | - </svg> | ||
| 12 | - </div> | ||
| 13 | -</template> | ||
| 14 | - | ||
| 15 | -<script> | ||
| 16 | -export default { | ||
| 17 | - name: 'hamburger', | ||
| 18 | - props: { | ||
| 19 | - isActive: { | ||
| 20 | - type: Boolean, | ||
| 21 | - default: false | ||
| 22 | - }, | ||
| 23 | - toggleClick: { | ||
| 24 | - type: Function, | ||
| 25 | - default: null | ||
| 26 | - } | ||
| 27 | - } | ||
| 28 | -} | ||
| 29 | -</script> | ||
| 30 | - | ||
| 31 | -<style scoped> | ||
| 32 | -.hamburger { | ||
| 33 | - display: inline-block; | ||
| 34 | - cursor: pointer; | ||
| 35 | - width: 20px; | ||
| 36 | - height: 20px; | ||
| 37 | - transform: rotate(90deg); | ||
| 38 | - transition: .38s; | ||
| 39 | - transform-origin: 50% 50%; | ||
| 40 | -} | ||
| 41 | -.hamburger.is-active { | ||
| 42 | - transform: rotate(0deg); | ||
| 43 | -} | ||
| 44 | -</style> |
| 1 | -<template> | ||
| 2 | - <div class="scroll-container" ref="scrollContainer" @wheel.prevent="handleScroll" > | ||
| 3 | - <div class="scroll-wrapper" ref="scrollWrapper" :style="{top: top + 'px'}"> | ||
| 4 | - <slot></slot> | ||
| 5 | - </div> | ||
| 6 | - </div> | ||
| 7 | -</template> | ||
| 8 | - | ||
| 9 | -<script> | ||
| 10 | -const delta = 15 | ||
| 11 | - | ||
| 12 | -export default { | ||
| 13 | - name: 'scrollBar', | ||
| 14 | - data() { | ||
| 15 | - return { | ||
| 16 | - top: 0 | ||
| 17 | - } | ||
| 18 | - }, | ||
| 19 | - methods: { | ||
| 20 | - handleScroll(e) { | ||
| 21 | - const eventDelta = e.wheelDelta || -e.deltaY * 3 | ||
| 22 | - const $container = this.$refs.scrollContainer | ||
| 23 | - const $containerHeight = $container.offsetHeight | ||
| 24 | - const $wrapper = this.$refs.scrollWrapper | ||
| 25 | - const $wrapperHeight = $wrapper.offsetHeight | ||
| 26 | - if (eventDelta > 0) { | ||
| 27 | - this.top = Math.min(0, this.top + eventDelta) | ||
| 28 | - } else { | ||
| 29 | - if ($containerHeight - delta < $wrapperHeight) { | ||
| 30 | - if (this.top < -($wrapperHeight - $containerHeight + delta)) { | ||
| 31 | - this.top = this.top | ||
| 32 | - } else { | ||
| 33 | - this.top = Math.max(this.top + eventDelta, $containerHeight - $wrapperHeight - delta) | ||
| 34 | - } | ||
| 35 | - } else { | ||
| 36 | - this.top = 0 | ||
| 37 | - } | ||
| 38 | - } | ||
| 39 | - } | ||
| 40 | - } | ||
| 41 | -} | ||
| 42 | -</script> | ||
| 43 | - | ||
| 44 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 45 | -@import '../../styles/variables.scss'; | ||
| 46 | - | ||
| 47 | -.scroll-container { | ||
| 48 | - position: relative; | ||
| 49 | - width: 100%; | ||
| 50 | - height: 100%; | ||
| 51 | - background-color: $menuBg; | ||
| 52 | - .scroll-wrapper { | ||
| 53 | - position: absolute; | ||
| 54 | - width: 100%!important; | ||
| 55 | - } | ||
| 56 | -} | ||
| 57 | -</style> |
| 1 | -<template> | ||
| 2 | - <div class="upload-container"> | ||
| 3 | - <el-button | ||
| 4 | - :style="{background:color,borderColor:color}" | ||
| 5 | - icon="el-icon-upload" | ||
| 6 | - size="mini" | ||
| 7 | - type="primary" | ||
| 8 | - @click=" dialogVisible=true" | ||
| 9 | - >上传图片</el-button> | ||
| 10 | - <el-dialog :visible.sync="dialogVisible"> | ||
| 11 | - <el-upload | ||
| 12 | - ref="upload" | ||
| 13 | - :multiple="true" | ||
| 14 | - :file-list="fileList" | ||
| 15 | - :show-file-list="true" | ||
| 16 | - :on-remove="handleRemove" | ||
| 17 | - :on-success="handleSuccess" | ||
| 18 | - :on-error="handleError" | ||
| 19 | - :data="picPostData" | ||
| 20 | - class="editor-slide-upload" | ||
| 21 | - action="https://jsonplaceholder.typicode.com/post/" | ||
| 22 | - list-type="picture-card" | ||
| 23 | - :limit="5" | ||
| 24 | - > | ||
| 25 | - <el-button size="small" type="primary">点击上传</el-button> | ||
| 26 | - </el-upload> | ||
| 27 | - <el-button @click="dialogVisible = false">取消</el-button> | ||
| 28 | - <el-button type="primary" @click="handleSubmit">确定</el-button> | ||
| 29 | - </el-dialog> | ||
| 30 | - </div> | ||
| 31 | -</template> | ||
| 32 | - | ||
| 33 | -<script> | ||
| 34 | - | ||
| 35 | - | ||
| 36 | -export default { | ||
| 37 | - name: "EditorSlideUpload", | ||
| 38 | - props: { | ||
| 39 | - color: { | ||
| 40 | - type: String, | ||
| 41 | - default: "#1890ff" | ||
| 42 | - } | ||
| 43 | - }, | ||
| 44 | - data() { | ||
| 45 | - return { | ||
| 46 | - dialogVisible: false, | ||
| 47 | - listObj: {}, | ||
| 48 | - fileList: [], | ||
| 49 | - picPostData: {} | ||
| 50 | - }; | ||
| 51 | - }, | ||
| 52 | - methods: { | ||
| 53 | - checkAllSuccess() { | ||
| 54 | - return Object.keys(this.listObj).every( | ||
| 55 | - item => this.listObj[item].hasSuccess | ||
| 56 | - ); | ||
| 57 | - }, | ||
| 58 | - handleSubmit() { | ||
| 59 | - const arr = Object.keys(this.listObj).map(v => this.listObj[v]); | ||
| 60 | - console.log(arr); | ||
| 61 | - if (!this.checkAllSuccess()) { | ||
| 62 | - this.$message( | ||
| 63 | - "请等待所有图片上传完成,如果存在网络问题请刷新当前页重新上传" | ||
| 64 | - ); | ||
| 65 | - return; | ||
| 66 | - } | ||
| 67 | - this.$emit("successCBK", arr); | ||
| 68 | - this.listObj = {}; | ||
| 69 | - this.fileList = []; | ||
| 70 | - this.dialogVisible = false; | ||
| 71 | - }, | ||
| 72 | - handleSuccess(response, file) { | ||
| 73 | - console.log("file", file); | ||
| 74 | - console.log("handleSuccess", response); | ||
| 75 | - const uid = file.uid; | ||
| 76 | - const objKeyArr = Object.keys(this.listObj); | ||
| 77 | - for (let i = 0, len = objKeyArr.length; i < len; i++) { | ||
| 78 | - if (this.listObj[objKeyArr[i]].uid === uid) { | ||
| 79 | - this.listObj[objKeyArr[i]].url = this.config.qiniuHost + response.key; | ||
| 80 | - this.listObj[objKeyArr[i]].hasSuccess = true; | ||
| 81 | - return; | ||
| 82 | - } | ||
| 83 | - } | ||
| 84 | - }, | ||
| 85 | - handleRemove(file) { | ||
| 86 | - const uid = file.uid; | ||
| 87 | - const objKeyArr = Object.keys(this.listObj); | ||
| 88 | - for (let i = 0, len = objKeyArr.length; i < len; i++) { | ||
| 89 | - if (this.listObj[objKeyArr[i]].uid === uid) { | ||
| 90 | - delete this.listObj[objKeyArr[i]]; | ||
| 91 | - return; | ||
| 92 | - } | ||
| 93 | - } | ||
| 94 | - }, | ||
| 95 | - handleError(err){ | ||
| 96 | - this.alert(err) | ||
| 97 | - } | ||
| 98 | - } | ||
| 99 | -}; | ||
| 100 | -</script> | ||
| 101 | - | ||
| 102 | -<style lang="scss" scoped> | ||
| 103 | -.editor-slide-upload { | ||
| 104 | - margin-bottom: 20px; | ||
| 105 | - ::v-deep .el-upload--picture-card { | ||
| 106 | - width: 100%; | ||
| 107 | - } | ||
| 108 | -} | ||
| 109 | -</style> |
| 1 | -let callbacks = [] | ||
| 2 | - | ||
| 3 | -function loadedTinymce () { | ||
| 4 | - // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144 | ||
| 5 | - // check is successfully downloaded script | ||
| 6 | - return window.tinymce | ||
| 7 | -} | ||
| 8 | - | ||
| 9 | -const dynamicLoadScript = (src, callback) => { | ||
| 10 | - const existingScript = document.getElementById(src) | ||
| 11 | - const cb = callback || function () {} | ||
| 12 | - | ||
| 13 | - if (!existingScript) { | ||
| 14 | - const script = document.createElement('script') | ||
| 15 | - script.src = src // src url for the third-party library being loaded. | ||
| 16 | - script.id = src | ||
| 17 | - document.body.appendChild(script) | ||
| 18 | - callbacks.push(cb) | ||
| 19 | - const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd | ||
| 20 | - onEnd(script) | ||
| 21 | - } | ||
| 22 | - | ||
| 23 | - if (existingScript && cb) { | ||
| 24 | - if (loadedTinymce()) { | ||
| 25 | - cb(null, existingScript) | ||
| 26 | - } else { | ||
| 27 | - callbacks.push(cb) | ||
| 28 | - } | ||
| 29 | - } | ||
| 30 | - | ||
| 31 | - function stdOnEnd (script) { | ||
| 32 | - script.onload = function () { | ||
| 33 | - // this.onload = null here is necessary | ||
| 34 | - // because even IE9 works not like others | ||
| 35 | - this.onerror = this.onload = null | ||
| 36 | - for (const cb of callbacks) { | ||
| 37 | - cb(null, script) | ||
| 38 | - } | ||
| 39 | - callbacks = null | ||
| 40 | - } | ||
| 41 | - script.onerror = function () { | ||
| 42 | - this.onerror = this.onload = null | ||
| 43 | - cb(new Error('无法加载 ' + src), script) | ||
| 44 | - } | ||
| 45 | - } | ||
| 46 | - | ||
| 47 | - function ieOnEnd (script) { | ||
| 48 | - script.onreadystatechange = function () { | ||
| 49 | - if (this.readyState !== 'complete' && this.readyState !== 'loaded') return | ||
| 50 | - this.onreadystatechange = null | ||
| 51 | - for (const cb of callbacks) { | ||
| 52 | - cb(null, script) // there is no way to catch loading errors in IE8 | ||
| 53 | - } | ||
| 54 | - callbacks = null | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | -} | ||
| 58 | - | ||
| 59 | -export default dynamicLoadScript |
| 1 | -<template> | ||
| 2 | - <div :class="{fullscreen:fullscreen}" class="tinymce-container" :style="{width:containerWidth}"> | ||
| 3 | - <textarea :id="tinymceId" class="tinymce-textarea" /> | ||
| 4 | - <div class="editor-custom-btn-container"> | ||
| 5 | - <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" /> | ||
| 6 | - </div> | ||
| 7 | - </div> | ||
| 8 | -</template> | ||
| 9 | - | ||
| 10 | -<script> | ||
| 11 | -/** | ||
| 12 | - * docs: | ||
| 13 | - * https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce | ||
| 14 | - */ | ||
| 15 | -import editorImage from './components/EditorImage' | ||
| 16 | -import plugins from './plugins' | ||
| 17 | -import toolbar from './toolbar' | ||
| 18 | -import load from './dynamicLoadScript' | ||
| 19 | - | ||
| 20 | -// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one | ||
| 21 | -const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js' | ||
| 22 | - | ||
| 23 | -export default { | ||
| 24 | - name: 'Tinymce', | ||
| 25 | - components: { editorImage }, | ||
| 26 | - props: { | ||
| 27 | - id: { | ||
| 28 | - type: String, | ||
| 29 | - default: function() { | ||
| 30 | - return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '') | ||
| 31 | - } | ||
| 32 | - }, | ||
| 33 | - value: { | ||
| 34 | - type: String, | ||
| 35 | - default: '' | ||
| 36 | - }, | ||
| 37 | - toolbar: { | ||
| 38 | - type: Array, | ||
| 39 | - required: false, | ||
| 40 | - default() { | ||
| 41 | - return [] | ||
| 42 | - } | ||
| 43 | - }, | ||
| 44 | - menubar: { | ||
| 45 | - type: String, | ||
| 46 | - default: '' | ||
| 47 | - }, | ||
| 48 | - height: { | ||
| 49 | - type: [Number, String], | ||
| 50 | - required: false, | ||
| 51 | - default: 360 | ||
| 52 | - }, | ||
| 53 | - width: { | ||
| 54 | - type: [Number, String], | ||
| 55 | - required: false, | ||
| 56 | - default: 'auto' | ||
| 57 | - } | ||
| 58 | - }, | ||
| 59 | - data() { | ||
| 60 | - return { | ||
| 61 | - hasChange: false, | ||
| 62 | - hasInit: false, | ||
| 63 | - tinymceId: this.id, | ||
| 64 | - fullscreen: false, | ||
| 65 | - languageTypeList: { | ||
| 66 | - 'zh': 'zh_CN', | ||
| 67 | - } | ||
| 68 | - } | ||
| 69 | - }, | ||
| 70 | - computed: { | ||
| 71 | - containerWidth() { | ||
| 72 | - const width = this.width | ||
| 73 | - if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'` | ||
| 74 | - return `${width}px` | ||
| 75 | - } | ||
| 76 | - return width | ||
| 77 | - } | ||
| 78 | - }, | ||
| 79 | - watch: { | ||
| 80 | - value(val) { | ||
| 81 | - if (!this.hasChange && this.hasInit) { | ||
| 82 | - this.$nextTick(() => | ||
| 83 | - window.tinymce.get(this.tinymceId).setContent(val || '')) | ||
| 84 | - } | ||
| 85 | - } | ||
| 86 | - }, | ||
| 87 | - mounted() { | ||
| 88 | - this.init() | ||
| 89 | - }, | ||
| 90 | - activated() { | ||
| 91 | - if (window.tinymce) { | ||
| 92 | - this.initTinymce() | ||
| 93 | - } | ||
| 94 | - }, | ||
| 95 | - deactivated() { | ||
| 96 | - this.destroyTinymce() | ||
| 97 | - }, | ||
| 98 | - destroyed() { | ||
| 99 | - this.destroyTinymce() | ||
| 100 | - }, | ||
| 101 | - methods: { | ||
| 102 | - init() { | ||
| 103 | - // dynamic load tinymce from cdn | ||
| 104 | - load(tinymceCDN, (err) => { | ||
| 105 | - if (err) { | ||
| 106 | - this.$message.error(err.message) | ||
| 107 | - return | ||
| 108 | - } | ||
| 109 | - this.initTinymce() | ||
| 110 | - }) | ||
| 111 | - }, | ||
| 112 | - initTinymce() { | ||
| 113 | - const _this = this | ||
| 114 | - window.tinymce.init({ | ||
| 115 | - selector: `#${this.tinymceId}`, | ||
| 116 | - language: this.languageTypeList['zh'], | ||
| 117 | - height: this.height, | ||
| 118 | - body_class: 'panel-body ', | ||
| 119 | - object_resizing: false, | ||
| 120 | - toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar, | ||
| 121 | - menubar: this.menubar, | ||
| 122 | - plugins: plugins, | ||
| 123 | - end_container_on_empty_block: true, | ||
| 124 | - powerpaste_word_import: 'clean', | ||
| 125 | - code_dialog_height: 450, | ||
| 126 | - code_dialog_width: 1000, | ||
| 127 | - advlist_bullet_styles: 'square', | ||
| 128 | - advlist_number_styles: 'default', | ||
| 129 | - imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'], | ||
| 130 | - default_link_target: '_blank', | ||
| 131 | - link_title: false, | ||
| 132 | - branding:false, | ||
| 133 | - nonbreaking_force_tab: true, // inserting nonbreaking space need Nonbreaking Space Plugin | ||
| 134 | - init_instance_callback: editor => { | ||
| 135 | - if (_this.value) { | ||
| 136 | - editor.setContent(_this.value) | ||
| 137 | - } | ||
| 138 | - _this.hasInit = true | ||
| 139 | - editor.on('NodeChange Change KeyUp SetContent', () => { | ||
| 140 | - this.hasChange = true | ||
| 141 | - this.$emit('input', editor.getContent()) | ||
| 142 | - }) | ||
| 143 | - }, | ||
| 144 | - setup(editor) { | ||
| 145 | - editor.on('FullscreenStateChanged', (e) => { | ||
| 146 | - _this.fullscreen = e.state | ||
| 147 | - }) | ||
| 148 | - } | ||
| 149 | - // 整合七牛上传 | ||
| 150 | - // images_dataimg_filter(img) { | ||
| 151 | - // setTimeout(() => { | ||
| 152 | - // const $image = $(img); | ||
| 153 | - // $image.removeAttr('width'); | ||
| 154 | - // $image.removeAttr('height'); | ||
| 155 | - // if ($image[0].height && $image[0].width) { | ||
| 156 | - // $image.attr('data-wscntype', 'image'); | ||
| 157 | - // $image.attr('data-wscnh', $image[0].height); | ||
| 158 | - // $image.attr('data-wscnw', $image[0].width); | ||
| 159 | - // $image.addClass('wscnph'); | ||
| 160 | - // } | ||
| 161 | - // }, 0); | ||
| 162 | - // return img | ||
| 163 | - // }, | ||
| 164 | - // images_upload_handler(blobInfo, success, failure, progress) { | ||
| 165 | - // progress(0); | ||
| 166 | - // const token = _this.$store.getters.token; | ||
| 167 | - // getToken(token).then(response => { | ||
| 168 | - // const url = response.data.qiniu_url; | ||
| 169 | - // const formData = new FormData(); | ||
| 170 | - // formData.append('token', response.data.qiniu_token); | ||
| 171 | - // formData.append('key', response.data.qiniu_key); | ||
| 172 | - // formData.append('file', blobInfo.blob(), url); | ||
| 173 | - // upload(formData).then(() => { | ||
| 174 | - // success(url); | ||
| 175 | - // progress(100); | ||
| 176 | - // }) | ||
| 177 | - // }).catch(err => { | ||
| 178 | - // failure('出现未知问题,刷新页面,或者联系程序员') | ||
| 179 | - // console.log(err); | ||
| 180 | - // }); | ||
| 181 | - // }, | ||
| 182 | - }) | ||
| 183 | - }, | ||
| 184 | - destroyTinymce() { | ||
| 185 | - const tinymce = window.tinymce.get(this.tinymceId) | ||
| 186 | - if (this.fullscreen) { | ||
| 187 | - tinymce.execCommand('mceFullScreen') | ||
| 188 | - } | ||
| 189 | - | ||
| 190 | - if (tinymce) { | ||
| 191 | - tinymce.destroy() | ||
| 192 | - } | ||
| 193 | - }, | ||
| 194 | - setContent(value) { | ||
| 195 | - window.tinymce.get(this.tinymceId).setContent(value) | ||
| 196 | - }, | ||
| 197 | - getContent() { | ||
| 198 | - window.tinymce.get(this.tinymceId).getContent() | ||
| 199 | - }, | ||
| 200 | - imageSuccessCBK(arr) { | ||
| 201 | - const _this = this | ||
| 202 | - arr.forEach(v => { | ||
| 203 | - window.tinymce.get(_this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`) | ||
| 204 | - }) | ||
| 205 | - } | ||
| 206 | - } | ||
| 207 | -} | ||
| 208 | -</script> | ||
| 209 | - | ||
| 210 | -<style scoped> | ||
| 211 | -.tinymce-container { | ||
| 212 | - position: relative; | ||
| 213 | - line-height: normal; | ||
| 214 | -} | ||
| 215 | -.tinymce-container>>>.mce-fullscreen { | ||
| 216 | - z-index: 10000; | ||
| 217 | -} | ||
| 218 | -.tinymce-textarea { | ||
| 219 | - visibility: hidden; | ||
| 220 | - z-index: -1; | ||
| 221 | -} | ||
| 222 | -.editor-custom-btn-container { | ||
| 223 | - position: absolute; | ||
| 224 | - right: 4px; | ||
| 225 | - top: 4px; | ||
| 226 | -} | ||
| 227 | -.fullscreen .editor-custom-btn-container { | ||
| 228 | - z-index: 10000; | ||
| 229 | - position: fixed; | ||
| 230 | -} | ||
| 231 | -.editor-upload-btn { | ||
| 232 | - display: inline-block; | ||
| 233 | -} | ||
| 234 | -</style> |
| 1 | -// Any plugins you want to use has to be imported | ||
| 2 | -// Detail plugins list see https://www.tinymce.com/docs/plugins/ | ||
| 3 | -// Custom builds see https://www.tinymce.com/download/custom-builds/ | ||
| 4 | - | ||
| 5 | -const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'] | ||
| 6 | - | ||
| 7 | -export default plugins |
| 1 | -// Here is a list of the toolbar | ||
| 2 | -// Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols | ||
| 3 | - | ||
| 4 | -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'] | ||
| 5 | - | ||
| 6 | -export default toolbar |
| 1 | -<template> | ||
| 2 | - <el-menu class="navbar-header-fixed" mode="horizontal"> | ||
| 3 | - <div class="top-right"> | ||
| 4 | - <div class="hb-bd"> | ||
| 5 | - <hamburger | ||
| 6 | - class="hamburger-container" | ||
| 7 | - :toggleClick="toggleSideBar" | ||
| 8 | - :isActive="sidebar.opened" | ||
| 9 | - ></hamburger> | ||
| 10 | - <breadcrumb></breadcrumb> | ||
| 11 | - </div> | ||
| 12 | - | ||
| 13 | - <div class="top-select"> | ||
| 14 | - <div class="go-index">{{time}}</div> | ||
| 15 | - <div class="select-right"> | ||
| 16 | - <el-dropdown trigger="click"> | ||
| 17 | - <div> | ||
| 18 | - <el-image :src="userImage" class="avatar"> | ||
| 19 | - <div slot="error" class="image-slot"> | ||
| 20 | - <i class="el-icon-picture-outline"></i> | ||
| 21 | - </div> | ||
| 22 | - </el-image> | ||
| 23 | - <div class="el-dropdown-link"> | ||
| 24 | - 尊敬的: {{name}} | ||
| 25 | - <i class="el-icon-arrow-down el-icon--right"></i> | ||
| 26 | - </div> | ||
| 27 | - </div> | ||
| 28 | - <el-dropdown-menu slot="dropdown"> | ||
| 29 | - <router-link to="/"> | ||
| 30 | - <el-dropdown-item>返回首页</el-dropdown-item> | ||
| 31 | - </router-link> | ||
| 32 | - <el-dropdown-item @click.native="logout"> | ||
| 33 | - <span>切换账号</span> | ||
| 34 | - </el-dropdown-item> | ||
| 35 | - <el-dropdown-item @click.native="logout"> | ||
| 36 | - <span>退出登录</span> | ||
| 37 | - </el-dropdown-item> | ||
| 38 | - </el-dropdown-menu> | ||
| 39 | - </el-dropdown> | ||
| 40 | - </div> | ||
| 41 | - </div> | ||
| 42 | - </div> | ||
| 43 | - </el-menu> | ||
| 44 | -</template> | ||
| 45 | - | ||
| 46 | -<script> | ||
| 47 | -import { format } from "date-fns"; | ||
| 48 | -import { mapGetters } from "vuex"; | ||
| 49 | -import Breadcrumb from "@/components/Breadcrumb"; | ||
| 50 | -import Hamburger from "@/components/Hamburger"; | ||
| 51 | -export default { | ||
| 52 | - components: { | ||
| 53 | - Breadcrumb, | ||
| 54 | - Hamburger | ||
| 55 | - }, | ||
| 56 | - data: () => ({ | ||
| 57 | - time: "", | ||
| 58 | - userImage: require("@/assets/user.png") | ||
| 59 | - }), | ||
| 60 | - mounted() { | ||
| 61 | - this.set_time(); | ||
| 62 | - this.timer = setInterval(() => { | ||
| 63 | - this.set_time(); | ||
| 64 | - }, 60000); | ||
| 65 | - console.log(this.userImage) | ||
| 66 | - }, | ||
| 67 | - methods: { | ||
| 68 | - toggleSideBar() { | ||
| 69 | - this.$store.dispatch("ToggleSideBar"); | ||
| 70 | - }, | ||
| 71 | - logout() { | ||
| 72 | - this.$store.dispatch("LogOut").then(() => { | ||
| 73 | - this.$message({ | ||
| 74 | - message: "退出成功", | ||
| 75 | - type: "success" | ||
| 76 | - }); | ||
| 77 | - this.$router.push('/login') | ||
| 78 | - }); | ||
| 79 | - }, | ||
| 80 | - set_time() { | ||
| 81 | - this.time = format(new Date(), "yyyy/MM/dd HH:mm"); | ||
| 82 | - } | ||
| 83 | - }, | ||
| 84 | - computed: { | ||
| 85 | - ...mapGetters(["name", "role", "sidebar"]) | ||
| 86 | - }, | ||
| 87 | - beforeDestroy() { | ||
| 88 | - console.log("销毁计时器------------"); | ||
| 89 | - clearInterval(this.timer); | ||
| 90 | - this.timer = null; | ||
| 91 | - } | ||
| 92 | -}; | ||
| 93 | -</script> | ||
| 94 | - | ||
| 95 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 96 | -.navbar-header-fixed { | ||
| 97 | - transition: width 0.28s; | ||
| 98 | - width: calc(100% - 256px); | ||
| 99 | - display: flex; | ||
| 100 | - align-items: center; | ||
| 101 | - position: fixed; | ||
| 102 | - right: 0; | ||
| 103 | - z-index: 1002; | ||
| 104 | - height: 62px; | ||
| 105 | - .hamburger-container { | ||
| 106 | - line-height: 58px; | ||
| 107 | - height: 50px; | ||
| 108 | - float: left; | ||
| 109 | - padding: 0 10px; | ||
| 110 | - } | ||
| 111 | - .logo { | ||
| 112 | - width: 199px; | ||
| 113 | - height: 62px; | ||
| 114 | - } | ||
| 115 | - .top-right { | ||
| 116 | - display: flex; | ||
| 117 | - width: 100%; | ||
| 118 | - height: 100%; | ||
| 119 | - background-color: #ffffff; | ||
| 120 | - justify-content: space-between; | ||
| 121 | - padding: 0 19px; | ||
| 122 | - .hb-bd { | ||
| 123 | - display: flex; | ||
| 124 | - justify-content: center; | ||
| 125 | - align-items: center; | ||
| 126 | - } | ||
| 127 | - .avatar { | ||
| 128 | - width: 30px; | ||
| 129 | - height: 30px; | ||
| 130 | - margin-right: 10px; | ||
| 131 | - ::v-deep img { | ||
| 132 | - width: 100%; | ||
| 133 | - height: 100%; | ||
| 134 | - border-radius: 50%; | ||
| 135 | - } | ||
| 136 | - } | ||
| 137 | - .top-select { | ||
| 138 | - display: flex; | ||
| 139 | - align-items: center; | ||
| 140 | - .go-index { | ||
| 141 | - color: #333333; | ||
| 142 | - font-weight: 400; | ||
| 143 | - margin-right: 20px; | ||
| 144 | - padding-right: 20px; | ||
| 145 | - border-right: 1px solid #cccccc; | ||
| 146 | - } | ||
| 147 | - .select-right ::v-deep .el-dropdown > span { | ||
| 148 | - font-size: 6px; | ||
| 149 | - } | ||
| 150 | - .select-right { | ||
| 151 | - .el-dropdown-link { | ||
| 152 | - color: #333333; | ||
| 153 | - font-weight: 400; | ||
| 154 | - } | ||
| 155 | - ::v-deep .el-dropdown-selfdefine { | ||
| 156 | - display: flex; | ||
| 157 | - align-items: center; | ||
| 158 | - } | ||
| 159 | - } | ||
| 160 | - } | ||
| 161 | - } | ||
| 162 | -} | ||
| 163 | -</style> | ||
| 164 | - |
| 1 | -<template> | ||
| 2 | - <div | ||
| 3 | - v-if="!item.hidden&&item.children" | ||
| 4 | - class="menu-wrapper" | ||
| 5 | - :class="collapse?``:`active-menu-wrapper`" | ||
| 6 | - > | ||
| 7 | - <div v-if="item.onlyShowfirst"> | ||
| 8 | - <router-link | ||
| 9 | - v-if="OneShowingChild(item.children[0]) && !onlyOneChild.children&&!item.alwaysShow" | ||
| 10 | - :to="resolvePath(onlyOneChild.path)" | ||
| 11 | - > | ||
| 12 | - <el-menu-item | ||
| 13 | - :index="resolvePath(onlyOneChild.path)" | ||
| 14 | - :class="{'submenu-title-noDropdown':!isNest}" | ||
| 15 | - > | ||
| 16 | - <svg-icon | ||
| 17 | - v-if="onlyOneChild.meta&&onlyOneChild.meta.icon" | ||
| 18 | - :icon-class="onlyOneChild.meta.icon" | ||
| 19 | - ></svg-icon> | ||
| 20 | - <span | ||
| 21 | - v-if="onlyOneChild.meta&&onlyOneChild.meta.title" | ||
| 22 | - slot="title" | ||
| 23 | - >{{onlyOneChild.meta.title}}</span> | ||
| 24 | - </el-menu-item> | ||
| 25 | - </router-link> | ||
| 26 | - </div> | ||
| 27 | - | ||
| 28 | - <div v-else> | ||
| 29 | - <router-link | ||
| 30 | - v-if="hasOneShowingChild(item.children) && !onlyOneChild.children&&!item.alwaysShow" | ||
| 31 | - :to="resolvePath(onlyOneChild.path)" | ||
| 32 | - > | ||
| 33 | - <el-menu-item | ||
| 34 | - :index="resolvePath(onlyOneChild.path)" | ||
| 35 | - :class="{'submenu-title-noDropdown':!isNest}" | ||
| 36 | - > | ||
| 37 | - <svg-icon | ||
| 38 | - v-if="onlyOneChild.meta&&onlyOneChild.meta.icon" | ||
| 39 | - :icon-class="onlyOneChild.meta.icon" | ||
| 40 | - ></svg-icon> | ||
| 41 | - <span | ||
| 42 | - v-if="onlyOneChild.meta&&onlyOneChild.meta.title" | ||
| 43 | - slot="title" | ||
| 44 | - >{{onlyOneChild.meta.title}}</span> | ||
| 45 | - </el-menu-item> | ||
| 46 | - </router-link> | ||
| 47 | - | ||
| 48 | - <el-submenu v-else :index="item.name||item.path"> | ||
| 49 | - <template slot="title"> | ||
| 50 | - <svg-icon v-if="item.meta&&item.meta.icon" :icon-class="item.meta.icon"></svg-icon> | ||
| 51 | - <span v-if="item.meta&&item.meta.title" slot="title">{{item.meta.title}}</span> | ||
| 52 | - </template> | ||
| 53 | - | ||
| 54 | - <template v-for="child in item.children" v-if="!child.hidden"> | ||
| 55 | - <sidebar-item | ||
| 56 | - :is-nest="true" | ||
| 57 | - class="nest-menu" | ||
| 58 | - v-if="child.children&&child.children.length>0" | ||
| 59 | - :item="child" | ||
| 60 | - :key="child.path" | ||
| 61 | - :base-path="resolvePath(child.path)" | ||
| 62 | - ></sidebar-item> | ||
| 63 | - | ||
| 64 | - <router-link v-else :to="resolvePath(child.path)" :key="child.name"> | ||
| 65 | - <el-menu-item :index="resolvePath(child.path)"> | ||
| 66 | - <svg-icon v-if="child.meta&&child.meta.icon" :icon-class="child.meta.icon"></svg-icon> | ||
| 67 | - <span v-if="child.meta&&child.meta.title" slot="title">{{child.meta.title}}</span> | ||
| 68 | - </el-menu-item> | ||
| 69 | - </router-link> | ||
| 70 | - </template> | ||
| 71 | - </el-submenu> | ||
| 72 | - </div> | ||
| 73 | - </div> | ||
| 74 | -</template> | ||
| 75 | - | ||
| 76 | -<script> | ||
| 77 | -// import path from "path"; | ||
| 78 | - | ||
| 79 | -export default { | ||
| 80 | - name: "SidebarItem", | ||
| 81 | - props: { | ||
| 82 | - // route配置json | ||
| 83 | - item: { | ||
| 84 | - type: Object, | ||
| 85 | - required: true | ||
| 86 | - }, | ||
| 87 | - isNest: { | ||
| 88 | - type: Boolean, | ||
| 89 | - default: false | ||
| 90 | - }, | ||
| 91 | - basePath: { | ||
| 92 | - type: String, | ||
| 93 | - default: "" | ||
| 94 | - }, | ||
| 95 | - collapse: { | ||
| 96 | - type: Boolean, | ||
| 97 | - required: true | ||
| 98 | - } | ||
| 99 | - }, | ||
| 100 | - data() { | ||
| 101 | - return { | ||
| 102 | - onlyOneChild: null | ||
| 103 | - }; | ||
| 104 | - }, | ||
| 105 | - methods: { | ||
| 106 | - hasOneShowingChild(children) { | ||
| 107 | - const showingChildren = children.filter(item => { | ||
| 108 | - if (item.hidden) { | ||
| 109 | - return false; | ||
| 110 | - } else { | ||
| 111 | - this.onlyOneChild = item; | ||
| 112 | - return true; | ||
| 113 | - } | ||
| 114 | - }); | ||
| 115 | - if (showingChildren.length === 1) { | ||
| 116 | - return true; | ||
| 117 | - } | ||
| 118 | - return false; | ||
| 119 | - }, | ||
| 120 | - resolvePath(...paths) { | ||
| 121 | - return this.basePath + "/" + paths[0]; | ||
| 122 | - }, | ||
| 123 | - OneShowingChild(children) { | ||
| 124 | - this.onlyOneChild = children; | ||
| 125 | - return true; | ||
| 126 | - } | ||
| 127 | - } | ||
| 128 | -}; | ||
| 129 | -</script> | ||
| 130 | -<style lang="scss" scoped> | ||
| 131 | -.menu-wrapper { | ||
| 132 | - ::v-deep .el-menu-item, | ||
| 133 | - .el-submenu__title { | ||
| 134 | - height: 46px; | ||
| 135 | - line-height: 46px; | ||
| 136 | - } | ||
| 137 | - ::v-deep .el-menu-item { | ||
| 138 | - padding: 0 20px 0 12px; | ||
| 139 | - } | ||
| 140 | -} | ||
| 141 | -</style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | -<template> | ||
| 2 | - <scroll-bar> | ||
| 3 | - <el-menu | ||
| 4 | - mode="vertical" | ||
| 5 | - :show-timeout="200" | ||
| 6 | - :default-active="$route.path" | ||
| 7 | - :collapse="isCollapse" | ||
| 8 | - > | ||
| 9 | - <Logo :collapse="isCollapse" /> | ||
| 10 | - <sidebar-item v-for="route in routes" :key="route.name" :item="route" :base-path="route.path" :collapse="isCollapse"></sidebar-item> | ||
| 11 | - </el-menu> | ||
| 12 | - </scroll-bar> | ||
| 13 | -</template> | ||
| 14 | - | ||
| 15 | -<script> | ||
| 16 | -import { mapGetters } from "vuex"; | ||
| 17 | -import SidebarItem from "./SidebarItem"; | ||
| 18 | -import ScrollBar from "@/components/ScrollBar"; | ||
| 19 | -import Logo from "./logo"; | ||
| 20 | - | ||
| 21 | -export default { | ||
| 22 | - components: { SidebarItem, ScrollBar, Logo }, | ||
| 23 | - computed: { | ||
| 24 | - ...mapGetters(["sidebar"]), | ||
| 25 | - routes() { | ||
| 26 | - return this.$router.options.routes; | ||
| 27 | - }, | ||
| 28 | - isCollapse() { | ||
| 29 | - return !this.sidebar.opened; | ||
| 30 | - } | ||
| 31 | - } | ||
| 32 | -}; | ||
| 33 | -</script> | ||
| 34 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 35 | -.title { | ||
| 36 | - text-align: center; | ||
| 37 | - line-height: 64px; | ||
| 38 | - height: 64px; | ||
| 39 | - font-size: 14px; | ||
| 40 | - font-weight: bold; | ||
| 41 | - color: #333333; | ||
| 42 | - background-color: #ffffff; | ||
| 43 | - padding: 0 20px; | ||
| 44 | - .logo-set { | ||
| 45 | - width: 21px; | ||
| 46 | - height: 21px; | ||
| 47 | - } | ||
| 48 | -} | ||
| 49 | -.minititle { | ||
| 50 | - padding: 0 10px; | ||
| 51 | - transition: padding 0.28s; | ||
| 52 | - overflow: hidden; | ||
| 53 | - width: 180px; | ||
| 54 | -} | ||
| 55 | -</style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | -<template> | ||
| 2 | - <div class="sidebar-logo-container" :class="{'collapse':collapse}"> | ||
| 3 | - <transition name="sidebarLogoFade"> | ||
| 4 | - <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> | ||
| 5 | - <svg-icon icon-class="logo" class-name="sidebar-logo"></svg-icon> | ||
| 6 | - <div class="sidebar-title">{{ title }}</div> | ||
| 7 | - </router-link> | ||
| 8 | - <router-link v-else key="expand" class="sidebar-logo-link" to="/"> | ||
| 9 | - <svg-icon icon-class="logo" class-name="sidebar-logo"></svg-icon> | ||
| 10 | - <div class="sidebar-title">{{ title }}</div> | ||
| 11 | - </router-link> | ||
| 12 | - </transition> | ||
| 13 | - </div> | ||
| 14 | -</template> | ||
| 15 | - | ||
| 16 | -<script> | ||
| 17 | -export default { | ||
| 18 | - name: "SidebarLogo", | ||
| 19 | - props: { | ||
| 20 | - collapse: { | ||
| 21 | - type: Boolean, | ||
| 22 | - required: true | ||
| 23 | - } | ||
| 24 | - }, | ||
| 25 | - data() { | ||
| 26 | - return { | ||
| 27 | - title: "logo名称", | ||
| 28 | - }; | ||
| 29 | - } | ||
| 30 | -}; | ||
| 31 | -</script> | ||
| 32 | - | ||
| 33 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 34 | -.sidebarLogoFade-enter-active { | ||
| 35 | - transition: opacity .28s; | ||
| 36 | -} | ||
| 37 | - | ||
| 38 | -.sidebarLogoFade-enter, | ||
| 39 | -.sidebarLogoFade-leave-to { | ||
| 40 | - opacity: 0; | ||
| 41 | -} | ||
| 42 | - | ||
| 43 | -.sidebar-logo-container { | ||
| 44 | - box-shadow: 2px 0 6px rgba(0,21,41,.15); | ||
| 45 | - position: relative; | ||
| 46 | - width: 100%; | ||
| 47 | - height: 61px; | ||
| 48 | - line-height: 61px; | ||
| 49 | - text-align: center; | ||
| 50 | - overflow: hidden; | ||
| 51 | - background-color: #ffffff; | ||
| 52 | - | ||
| 53 | - & > .sidebar-logo-link { | ||
| 54 | - height: 100%; | ||
| 55 | - width: 100%; | ||
| 56 | - | ||
| 57 | - & > .sidebar-logo { | ||
| 58 | - width: 32px; | ||
| 59 | - height: 32px; | ||
| 60 | - vertical-align: middle; | ||
| 61 | - margin-right: 12px; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - & > .sidebar-title { | ||
| 65 | - display: inline-block; | ||
| 66 | - margin: 0; | ||
| 67 | - color: #333; | ||
| 68 | - font-weight: 600; | ||
| 69 | - line-height: 50px; | ||
| 70 | - font-size: 14px; | ||
| 71 | - font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; | ||
| 72 | - vertical-align: middle; | ||
| 73 | - } | ||
| 74 | - } | ||
| 75 | -} | ||
| 76 | -.collapse { | ||
| 77 | - .sidebar-logo { | ||
| 78 | - margin-right: 0px !important; | ||
| 79 | - margin-left: 0px !important; | ||
| 80 | - } | ||
| 81 | -} | ||
| 82 | -</style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
src/renderer/layout/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="app-wrapper" :class="IsUseSysTitle?'UseSysTitle':'NoUseSysTitle'"> | ||
| 3 | - <div :class="classObj"> | ||
| 4 | - <navbar></navbar> | ||
| 5 | - <div class="container-set"> | ||
| 6 | - <sidebar class="sidebar-container" :class="IsUseSysTitle?'UseSysTitle':'NoUseSysTitle'"></sidebar> | ||
| 7 | - <div class="main-container"> | ||
| 8 | - <app-main></app-main> | ||
| 9 | - </div> | ||
| 10 | - </div> | ||
| 11 | - </div> | ||
| 12 | - </div> | ||
| 13 | -</template> | ||
| 14 | - | ||
| 15 | -<script> | ||
| 16 | -import { Sidebar, AppMain, Navbar } from "./components"; | ||
| 17 | -import ResizeMixin from "./mixin/ResizeHandler"; | ||
| 18 | - | ||
| 19 | -export default { | ||
| 20 | - name: "layout", | ||
| 21 | - components: { | ||
| 22 | - Sidebar, | ||
| 23 | - AppMain, | ||
| 24 | - Navbar | ||
| 25 | - }, | ||
| 26 | - mixins: [ResizeMixin], | ||
| 27 | - data: () => ({ | ||
| 28 | - IsUseSysTitle: require("./../../../config").IsUseSysTitle | ||
| 29 | - }), | ||
| 30 | - computed: { | ||
| 31 | - sidebar() { | ||
| 32 | - return this.$store.state.app.sidebar; | ||
| 33 | - }, | ||
| 34 | - device() { | ||
| 35 | - return this.$store.state.app.device; | ||
| 36 | - }, | ||
| 37 | - classObj() { | ||
| 38 | - return { | ||
| 39 | - hideSidebar: !this.sidebar.opened, | ||
| 40 | - openSidebar: this.sidebar.opened | ||
| 41 | - }; | ||
| 42 | - } | ||
| 43 | - } | ||
| 44 | -}; | ||
| 45 | -</script> | ||
| 46 | - | ||
| 47 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 48 | -@import "@/styles/mixin.scss"; | ||
| 49 | -.app-wrapper { | ||
| 50 | - @include clearfix; | ||
| 51 | - position: relative; | ||
| 52 | - height: 100%; | ||
| 53 | - width: 100%; | ||
| 54 | - .container-set { | ||
| 55 | - position: relative; | ||
| 56 | - padding-top: 62px; | ||
| 57 | - } | ||
| 58 | -} | ||
| 59 | -.UseSysTitle{ | ||
| 60 | - top:0px; | ||
| 61 | -} | ||
| 62 | -.NoUseSysTitle{ | ||
| 63 | - top:38px | ||
| 64 | -} | ||
| 65 | -</style> |
| 1 | -import store from '@/store' | ||
| 2 | - | ||
| 3 | -const { body } = document | ||
| 4 | -const WIDTH = 1024 | ||
| 5 | -const RATIO = 3 | ||
| 6 | - | ||
| 7 | -export default { | ||
| 8 | - watch: { | ||
| 9 | - $route(route) { | ||
| 10 | - if (this.device === 'mobile' && this.sidebar.opened) { | ||
| 11 | - store.dispatch('CloseSideBar', { withoutAnimation: false }) | ||
| 12 | - } | ||
| 13 | - } | ||
| 14 | - }, | ||
| 15 | - beforeMount() { | ||
| 16 | - window.addEventListener('resize', this.resizeHandler) | ||
| 17 | - }, | ||
| 18 | - mounted() { | ||
| 19 | - const isMobile = this.isMobile() | ||
| 20 | - if (isMobile) { | ||
| 21 | - store.dispatch('ToggleDevice', 'mobile') | ||
| 22 | - store.dispatch('CloseSideBar', { withoutAnimation: true }) | ||
| 23 | - } | ||
| 24 | - }, | ||
| 25 | - methods: { | ||
| 26 | - isMobile() { | ||
| 27 | - const rect = body.getBoundingClientRect() | ||
| 28 | - return rect.width - RATIO < WIDTH | ||
| 29 | - }, | ||
| 30 | - resizeHandler() { | ||
| 31 | - if (!document.hidden) { | ||
| 32 | - const isMobile = this.isMobile() | ||
| 33 | - store.dispatch('ToggleDevice', isMobile ? 'mobile' : 'desktop') | ||
| 34 | - | ||
| 35 | - if (isMobile) { | ||
| 36 | - store.dispatch('CloseSideBar', { withoutAnimation: true }) | ||
| 37 | - } | ||
| 38 | - } | ||
| 39 | - } | ||
| 40 | - } | ||
| 41 | -} |
| 1 | import router from './router' | 1 | import router from './router' |
| 2 | -import store from './store' | ||
| 3 | import Performance from '@/tools/performance' | 2 | import Performance from '@/tools/performance' |
| 4 | 3 | ||
| 5 | var end = null | 4 | var end = null |
| 6 | -const whiteList = ['/login'] // 不重定向白名单 | ||
| 7 | router.beforeEach((to, from, next) => { | 5 | router.beforeEach((to, from, next) => { |
| 8 | end = Performance.startExecute(`${from.path} => ${to.path} 路由耗时`) /// 路由性能监控 | 6 | end = Performance.startExecute(`${from.path} => ${to.path} 路由耗时`) /// 路由性能监控 |
| 9 | - | ||
| 10 | - if (store.getters.token) { | ||
| 11 | - if (to.path === '/login') { | ||
| 12 | - next({ path: '/' }) | ||
| 13 | - } else { | ||
| 14 | - next() | ||
| 15 | - } | ||
| 16 | - } else { | ||
| 17 | - if (whiteList.indexOf(to.path) !== -1) { | ||
| 18 | next() | 7 | next() |
| 19 | - } else { | ||
| 20 | - next('/login') | ||
| 21 | - } | ||
| 22 | - } | ||
| 23 | setTimeout(() => { | 8 | setTimeout(() => { |
| 24 | end() | 9 | end() |
| 25 | }, 0) | 10 | }, 0) | ... | ... |
| 1 | -import Layout from '@/layout' | ||
| 2 | -const Login = () => import('@/views/login') | ||
| 3 | const Notfound = () => import('@/views/404') | 1 | const Notfound = () => import('@/views/404') |
| 4 | -/** | ||
| 5 | -* hidden: true if `hidden:true` will not show in the sidebar(default is false) | ||
| 6 | -* alwaysShow: true if set true, will always show the root menu, whatever its child routes length | ||
| 7 | -* if not set alwaysShow, only more than one route under the children | ||
| 8 | -* it will becomes nested mode, otherwise not show the root menu | ||
| 9 | -* redirect: noredirect if `redirect:noredirect` will no redirct in the breadcrumb | ||
| 10 | -* name:'router-name' the name is used by <keep-alive> (must set!!!) | ||
| 11 | -* meta : { | ||
| 12 | - title: 'title' the name show in submenu and breadcrumb (recommend set) | ||
| 13 | - icon: 'svg-name' the icon show in the sidebar, | ||
| 14 | - } | ||
| 15 | -**/ | ||
| 16 | - | ||
| 17 | -/** | ||
| 18 | - * hidden: true 如果在模板中使用该选项,则不会在侧栏显示该路由(例如:Dashboard),如果是在第一个子路由中使用,侧栏则只显示第一个子路由的名字和图标(例如: Form) | ||
| 19 | - * alwaysShow: true 如果设置为true它则会始终显示根菜单,无视自路由长度,没有设置的话,就会折叠起来(不清楚为什么没有作用,可能是我写错位置了?) | ||
| 20 | - * redirect: noredirect 若设置为noredirect则顶部面包屑不能够为其重定向. | ||
| 21 | - * onlyShowfirst: false 若该设置为true时,将会无视其有多少个孩子路由,只会显示第一个子路由并将其设置为根菜单 | ||
| 22 | - * name:'router-name' 路由名称,此项为必须填写项 | ||
| 23 | - * meta : { | ||
| 24 | - title: 'title' 这里的名字决定了面包屑和侧栏的名字 | ||
| 25 | - icon: 'svg-name' 当你在svg文件夹内加入了你的图标,那么在这里填写图标名他就会显示在侧栏 | ||
| 26 | - } | ||
| 27 | - **/ | ||
| 28 | export default [ | 2 | export default [ |
| 29 | - { path: '/login', component: Login, hidden: true }, | 3 | + { path: '*', component: Notfound }, |
| 30 | - { path: '*', component: Notfound, hidden: true }, | 4 | + { path: '/', name: '总览', component: () => import('@/components/LandingPage') } |
| 31 | - { | ||
| 32 | - path: '/', | ||
| 33 | - component: Layout, | ||
| 34 | - redirect: '/dashboard', | ||
| 35 | - name: '主页', | ||
| 36 | - hidden: true, | ||
| 37 | - children: [{ | ||
| 38 | - path: 'dashboard', | ||
| 39 | - name: '总览', | ||
| 40 | - component: () => import('@/components/LandingPage') | ||
| 41 | - }] | ||
| 42 | - }, | ||
| 43 | - | ||
| 44 | - { | ||
| 45 | - path: '/form', | ||
| 46 | - component: Layout, | ||
| 47 | - meta: { title: '表单', icon: 'form' }, | ||
| 48 | - children: [ | ||
| 49 | - { | ||
| 50 | - path: 'index', | ||
| 51 | - name: 'Form', | ||
| 52 | - component: () => import('@/views/form/index'), | ||
| 53 | - meta: { title: '表单', icon: 'form' } | ||
| 54 | - }, | ||
| 55 | - { | ||
| 56 | - path: 'index2', | ||
| 57 | - name: 'Form2', | ||
| 58 | - component: () => import('@/views/form/index'), | ||
| 59 | - meta: { title: '表单2', icon: 'form' } | ||
| 60 | - } | ||
| 61 | - ] | ||
| 62 | - }, | ||
| 63 | - { | ||
| 64 | - path: '/table', | ||
| 65 | - component: Layout, | ||
| 66 | - children: [ | ||
| 67 | - { | ||
| 68 | - path: 'index', | ||
| 69 | - name: '表格', | ||
| 70 | - component: () => import('@/views/table/index'), | ||
| 71 | - meta: { title: '表格', icon: 'table' } | ||
| 72 | - } | ||
| 73 | - ] | ||
| 74 | - } | ||
| 75 | ] | 5 | ] | ... | ... |
| 1 | const user = { | 1 | const user = { |
| 2 | state: { | 2 | state: { |
| 3 | - // token: JSON.parse(localStorage.getItem('token')), | ||
| 4 | - // name: JSON.parse(localStorage.getItem('name')), | ||
| 5 | - // roles: JSON.parse(localStorage.getItem('roles')) | ||
| 6 | token: 'admin', | 3 | token: 'admin', |
| 7 | name: 'Super Admin', | 4 | name: 'Super Admin', |
| 8 | roles: ['admin'] | 5 | roles: ['admin'] | ... | ... |
| 1 | -// 订单内容页 | ||
| 2 | -.order-container { | ||
| 3 | - padding: 0 212px 20px 50px; | ||
| 4 | -} | ||
| 5 | - | ||
| 6 | -// 正文顶部的分割线及分割线上面的内容 | ||
| 7 | -.top-nav { | ||
| 8 | - display: flex; | ||
| 9 | - height: 80px; | ||
| 10 | - align-items: center; | ||
| 11 | -} | ||
| 12 | - | ||
| 13 | -.line { | ||
| 14 | - background-color: #eeeeee; | ||
| 15 | - width: 100%; | ||
| 16 | - height: 1px; | ||
| 17 | - margin-bottom: 30px; | ||
| 18 | - margin-top: 10px; | ||
| 19 | -} | ||
| 20 | - | ||
| 21 | - | ||
| 22 | -.line-pop { | ||
| 23 | - background-color: #eeeeee; | ||
| 24 | - width: 100%; | ||
| 25 | - height: 1px; | ||
| 26 | -} | ||
| 27 | -.popo-order{ | ||
| 28 | - padding-bottom: 8px; | ||
| 29 | - cursor: pointer; | ||
| 30 | -} | ||
| 31 | -.popo-work{ | ||
| 32 | - padding-top: 8px; | ||
| 33 | - cursor: pointer; | ||
| 34 | -} | ||
| 35 | - | ||
| 36 | - | ||
| 37 | - | ||
| 38 | -.tip-line { | ||
| 39 | - background-color: #eeeeee; | ||
| 40 | - width: 100%; | ||
| 41 | - height: 1px; | ||
| 42 | - margin-bottom: 10px; | ||
| 43 | - margin-top: 10px; | ||
| 44 | -} | ||
| 45 | - |
src/renderer/styles/element-ui.scss
deleted
100644 → 0
| 1 | -//to reset element-ui default css | ||
| 2 | - .el-upload { | ||
| 3 | - input[type="file"] { | ||
| 4 | - display: none !important; | ||
| 5 | - } | ||
| 6 | - } | ||
| 7 | - | ||
| 8 | - .el-upload__input { | ||
| 9 | - display: none; | ||
| 10 | - } | ||
| 11 | - | ||
| 12 | - //暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461 | ||
| 13 | - .el-dialog { | ||
| 14 | - transform: none; | ||
| 15 | - left: 0; | ||
| 16 | - position: relative; | ||
| 17 | - margin: 0 auto; | ||
| 18 | - } | ||
| 19 | - | ||
| 20 | - //element ui upload | ||
| 21 | - .upload-container { | ||
| 22 | - .el-upload { | ||
| 23 | - width: 100%; | ||
| 24 | - | ||
| 25 | - .el-upload-dragger { | ||
| 26 | - width: 100%; | ||
| 27 | - height: 200px; | ||
| 28 | - } | ||
| 29 | - } | ||
| 30 | - } | ||
| 31 | - |
src/renderer/styles/mixin.scss
deleted
100644 → 0
| 1 | -@mixin clearfix { | ||
| 2 | - &:after { | ||
| 3 | - content: ""; | ||
| 4 | - display: table; | ||
| 5 | - clear: both; | ||
| 6 | - } | ||
| 7 | -} | ||
| 8 | - | ||
| 9 | -@mixin scrollBar { | ||
| 10 | - &::-webkit-scrollbar-track-piece { | ||
| 11 | - background: #d3dce6; | ||
| 12 | - } | ||
| 13 | - &::-webkit-scrollbar { | ||
| 14 | - width: 6px; | ||
| 15 | - } | ||
| 16 | - &::-webkit-scrollbar-thumb { | ||
| 17 | - background: #99a9bf; | ||
| 18 | - border-radius: 20px; | ||
| 19 | - } | ||
| 20 | -} | ||
| 21 | - | ||
| 22 | -@mixin relative { | ||
| 23 | - position: relative; | ||
| 24 | - width: 100%; | ||
| 25 | - height: 100%; | ||
| 26 | -} | ||
| 27 | - |
src/renderer/styles/sidebar.scss
deleted
100644 → 0
| 1 | -#app { | ||
| 2 | - | ||
| 3 | - // 主体区域 | ||
| 4 | - .main-container { | ||
| 5 | - min-height: 100%; | ||
| 6 | - transition: margin-left .28s; | ||
| 7 | - margin-left: 256px; | ||
| 8 | - } | ||
| 9 | - | ||
| 10 | - // 侧边栏 | ||
| 11 | - .sidebar-container { | ||
| 12 | - .horizontal-collapse-transition { | ||
| 13 | - transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; | ||
| 14 | - } | ||
| 15 | - | ||
| 16 | - transition: width .28s; | ||
| 17 | - width: 256px !important; | ||
| 18 | - height: 100%; | ||
| 19 | - position: fixed; | ||
| 20 | - font-size: 0px; | ||
| 21 | - bottom: 0; | ||
| 22 | - left: 0; | ||
| 23 | - z-index: 1001; | ||
| 24 | - overflow: hidden; | ||
| 25 | - | ||
| 26 | - a { | ||
| 27 | - display: inline-block; | ||
| 28 | - width: 100%; | ||
| 29 | - } | ||
| 30 | - | ||
| 31 | - .svg-icon { | ||
| 32 | - margin-left: 14px; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - .el-menu { | ||
| 36 | - border: none; | ||
| 37 | - width: 100% !important; | ||
| 38 | - } | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - .hideSidebar { | ||
| 42 | - .sidebar-container { | ||
| 43 | - width: 60px !important; | ||
| 44 | - } | ||
| 45 | - | ||
| 46 | - .navbar-header-fixed { | ||
| 47 | - width: calc(100% - 60px); | ||
| 48 | - ; | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - .main-container { | ||
| 52 | - margin-left: 60px; | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - .submenu-title-noDropdown { | ||
| 56 | - padding-left: 10px !important; | ||
| 57 | - position: relative; | ||
| 58 | - | ||
| 59 | - .el-tooltip { | ||
| 60 | - padding: 0 10px !important; | ||
| 61 | - } | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - .el-submenu { | ||
| 65 | - &>.el-submenu__title { | ||
| 66 | - padding-left: 10px !important; | ||
| 67 | - | ||
| 68 | - &>span { | ||
| 69 | - height: 0; | ||
| 70 | - width: 0; | ||
| 71 | - overflow: hidden; | ||
| 72 | - visibility: hidden; | ||
| 73 | - display: inline-block; | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - .el-submenu__icon-arrow { | ||
| 77 | - display: none; | ||
| 78 | - } | ||
| 79 | - } | ||
| 80 | - } | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | - .sidebar-container .nest-menu .el-submenu>.el-submenu__title, | ||
| 84 | - .sidebar-container .el-submenu .el-menu-item { | ||
| 85 | - min-width: 180px !important; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - .el-menu--collapse .el-menu .el-submenu { | ||
| 89 | - min-width: 180px !important; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - //适配移动端 | ||
| 93 | - .mobile { | ||
| 94 | - .main-container { | ||
| 95 | - margin-left: 0px; | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - .sidebar-container { | ||
| 99 | - top: 50px; | ||
| 100 | - transition: transform .28s; | ||
| 101 | - width: 180px !important; | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - &.hideSidebar { | ||
| 105 | - .sidebar-container { | ||
| 106 | - transition-duration: 0.3s; | ||
| 107 | - transform: translate3d(-180px, 0, 0); | ||
| 108 | - } | ||
| 109 | - } | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | - .withoutAnimation { | ||
| 113 | - | ||
| 114 | - .main-container, | ||
| 115 | - .sidebar-container { | ||
| 116 | - transition: none; | ||
| 117 | - } | ||
| 118 | - } | ||
| 119 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
src/renderer/styles/variables.scss
deleted
100644 → 0
src/renderer/views/form/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="app-container"> | ||
| 3 | - <el-form ref="form" :model="form" label-width="120px"> | ||
| 4 | - <el-form-item label="活动名称"> | ||
| 5 | - <el-input v-model="form.name"></el-input> | ||
| 6 | - </el-form-item> | ||
| 7 | - <el-form-item label="活动地点"> | ||
| 8 | - <el-select v-model="form.region" placeholder="请选择活动地点"> | ||
| 9 | - <el-option label="上海" value="上海"></el-option> | ||
| 10 | - <el-option label="北京" value="北京"></el-option> | ||
| 11 | - </el-select> | ||
| 12 | - </el-form-item> | ||
| 13 | - <el-form-item label="活动时间"> | ||
| 14 | - <el-col :span="11"> | ||
| 15 | - <el-date-picker type="date" placeholder="选择时间" v-model="form.date1" style="width: 100%;"></el-date-picker> | ||
| 16 | - </el-col> | ||
| 17 | - <el-col class="line" :span="2">-</el-col> | ||
| 18 | - <el-col :span="11"> | ||
| 19 | - <el-time-picker | ||
| 20 | - type="fixed-time" | ||
| 21 | - placeholder="选择时间" | ||
| 22 | - v-model="form.date2" | ||
| 23 | - style="width: 100%;" | ||
| 24 | - ></el-time-picker> | ||
| 25 | - </el-col> | ||
| 26 | - </el-form-item> | ||
| 27 | - <el-form-item label="即时交付"> | ||
| 28 | - <el-switch v-model="form.delivery"></el-switch> | ||
| 29 | - </el-form-item> | ||
| 30 | - <el-form-item label="额外选项"> | ||
| 31 | - <el-checkbox-group v-model="form.type"> | ||
| 32 | - <el-checkbox label="在线活动" name="type"></el-checkbox> | ||
| 33 | - <el-checkbox label="促销活动" name="type"></el-checkbox> | ||
| 34 | - <el-checkbox label="线下活动" name="type"></el-checkbox> | ||
| 35 | - <el-checkbox label="发布会活动" name="type"></el-checkbox> | ||
| 36 | - </el-checkbox-group> | ||
| 37 | - </el-form-item> | ||
| 38 | - <el-form-item label="资源选项"> | ||
| 39 | - <el-radio-group v-model="form.resource"> | ||
| 40 | - <el-radio label="需要赞助商"></el-radio> | ||
| 41 | - <el-radio label="不需要赞助商"></el-radio> | ||
| 42 | - </el-radio-group> | ||
| 43 | - </el-form-item> | ||
| 44 | - <el-form-item label="活动详情"> | ||
| 45 | - <tinymce v-model="form.desc" :height="300" /> | ||
| 46 | - </el-form-item> | ||
| 47 | - <el-form-item> | ||
| 48 | - <el-button type="primary" @click="onSubmit">Create</el-button> | ||
| 49 | - <el-button @click="onCancel">Cancel</el-button> | ||
| 50 | - </el-form-item> | ||
| 51 | - </el-form> | ||
| 52 | - </div> | ||
| 53 | -</template> | ||
| 54 | - | ||
| 55 | -<script> | ||
| 56 | -import Tinymce from "@/components/Tinymce"; | ||
| 57 | -export default { | ||
| 58 | - components: { Tinymce }, | ||
| 59 | - data() { | ||
| 60 | - return { | ||
| 61 | - form: { | ||
| 62 | - name: "", | ||
| 63 | - region: "", | ||
| 64 | - date1: "", | ||
| 65 | - date2: "", | ||
| 66 | - delivery: false, | ||
| 67 | - type: [], | ||
| 68 | - resource: "", | ||
| 69 | - desc: "" | ||
| 70 | - } | ||
| 71 | - }; | ||
| 72 | - }, | ||
| 73 | - methods: { | ||
| 74 | - onSubmit() { | ||
| 75 | - this.$message("submit!"); | ||
| 76 | - }, | ||
| 77 | - onCancel() { | ||
| 78 | - this.$message({ | ||
| 79 | - message: "cancel!", | ||
| 80 | - type: "warning" | ||
| 81 | - }); | ||
| 82 | - } | ||
| 83 | - } | ||
| 84 | -}; | ||
| 85 | -</script> | ||
| 86 | - | ||
| 87 | -<style scoped> | ||
| 88 | -.line { | ||
| 89 | - text-align: center; | ||
| 90 | -} | ||
| 91 | -</style> | ||
| 92 | - |
src/renderer/views/login/index.vue
deleted
100644 → 0
| 1 | -<template> | ||
| 2 | - <div class="login-container"> | ||
| 3 | - <div class="login-from-box"> | ||
| 4 | - <el-form | ||
| 5 | - class="login-form" | ||
| 6 | - autocomplete="on" | ||
| 7 | - :model="loginForm" | ||
| 8 | - :rules="loginRules" | ||
| 9 | - ref="loginForm" | ||
| 10 | - label-position="left" | ||
| 11 | - > | ||
| 12 | - <h3 class="title">后台管理框架</h3> | ||
| 13 | - <el-form-item prop="username"> | ||
| 14 | - <span class="svg-container svg-container_login"> | ||
| 15 | - <svg-icon icon-class="user" /> | ||
| 16 | - </span> | ||
| 17 | - <el-input | ||
| 18 | - name="username" | ||
| 19 | - type="text" | ||
| 20 | - v-model="loginForm.username" | ||
| 21 | - autocomplete="on" | ||
| 22 | - placeholder="用户名" | ||
| 23 | - /> | ||
| 24 | - </el-form-item> | ||
| 25 | - <el-form-item prop="password"> | ||
| 26 | - <span class="svg-container"> | ||
| 27 | - <svg-icon icon-class="password"></svg-icon> | ||
| 28 | - </span> | ||
| 29 | - <el-input | ||
| 30 | - name="password" | ||
| 31 | - :type="pwdType" | ||
| 32 | - @keyup.enter.native="handleLogin" | ||
| 33 | - v-model="loginForm.password" | ||
| 34 | - autocomplete="on" | ||
| 35 | - placeholder="密码" | ||
| 36 | - ></el-input> | ||
| 37 | - <span class="show-pwd" @click="showPwd"> | ||
| 38 | - <svg-icon :icon-class="pwdType ==='password'?'eye':'eye-open'" /> | ||
| 39 | - </span> | ||
| 40 | - </el-form-item> | ||
| 41 | - <div class="login-btn"> | ||
| 42 | - <button class="btn" @click="handleLogin">登录</button> | ||
| 43 | - </div> | ||
| 44 | - <div class="tips"> | ||
| 45 | - <span style="margin-right:20px;">用户名: admin</span> | ||
| 46 | - <span>密码:随便什么都行</span> | ||
| 47 | - </div> | ||
| 48 | - </el-form> | ||
| 49 | - </div> | ||
| 50 | - </div> | ||
| 51 | -</template> | ||
| 52 | - | ||
| 53 | -<script> | ||
| 54 | -import { isvalidUsername } from "@/utils/validate"; | ||
| 55 | - | ||
| 56 | -export default { | ||
| 57 | - name: "login", | ||
| 58 | - data() { | ||
| 59 | - const validateUsername = (rule, value, callback) => { | ||
| 60 | - if (!isvalidUsername(value)) { | ||
| 61 | - callback(new Error("请输入正确的用户名")); | ||
| 62 | - } else { | ||
| 63 | - callback(); | ||
| 64 | - } | ||
| 65 | - }; | ||
| 66 | - const validatePass = (rule, value, callback) => { | ||
| 67 | - if (value.length < 5) { | ||
| 68 | - callback(new Error("密码不能小于5位")); | ||
| 69 | - } else { | ||
| 70 | - callback(); | ||
| 71 | - } | ||
| 72 | - }; | ||
| 73 | - return { | ||
| 74 | - loginForm: { | ||
| 75 | - username: "admin", | ||
| 76 | - password: "admin" | ||
| 77 | - }, | ||
| 78 | - loginRules: { | ||
| 79 | - username: [ | ||
| 80 | - { required: true, trigger: "blur", validator: validateUsername } | ||
| 81 | - ], | ||
| 82 | - password: [{ required: true, trigger: "blur", validator: validatePass }] | ||
| 83 | - }, | ||
| 84 | - loading: false, | ||
| 85 | - pwdType: "password" | ||
| 86 | - }; | ||
| 87 | - }, | ||
| 88 | - methods: { | ||
| 89 | - showPwd() { | ||
| 90 | - if (this.pwdType === "password") { | ||
| 91 | - this.pwdType = ""; | ||
| 92 | - } else { | ||
| 93 | - this.pwdType = "password"; | ||
| 94 | - } | ||
| 95 | - }, | ||
| 96 | - handleLogin() { | ||
| 97 | - console.log(11111); | ||
| 98 | - this.$refs.loginForm.validate(valid => { | ||
| 99 | - console.log(valid); | ||
| 100 | - if (valid) { | ||
| 101 | - this.loading = true; | ||
| 102 | - this.$store | ||
| 103 | - .dispatch("Login", this.loginForm) | ||
| 104 | - .then(() => { | ||
| 105 | - this.loading = false; | ||
| 106 | - this.$router.push({ path: "/" }); | ||
| 107 | - }) | ||
| 108 | - .catch(() => { | ||
| 109 | - this.loading = false; | ||
| 110 | - }); | ||
| 111 | - } else { | ||
| 112 | - console.log("error submit!!"); | ||
| 113 | - return false; | ||
| 114 | - } | ||
| 115 | - }); | ||
| 116 | - } | ||
| 117 | - } | ||
| 118 | -}; | ||
| 119 | -</script> | ||
| 120 | - | ||
| 121 | -<style rel="stylesheet/scss" lang="scss" scoped> | ||
| 122 | -$bg: #2d3a4b; | ||
| 123 | -$light_gray: #eee; | ||
| 124 | -$dark_gray: #889aa4; | ||
| 125 | -$light_gray: #eee; | ||
| 126 | - | ||
| 127 | -/* reset element-ui css */ | ||
| 128 | -.login-container { | ||
| 129 | - position: fixed; | ||
| 130 | - height: 100%; | ||
| 131 | - width: 100%; | ||
| 132 | - top: 0; | ||
| 133 | - left: 0; | ||
| 134 | - background-image: url("https://i.loli.net/2019/10/18/buDT4YS6zUMfHst.jpg"); | ||
| 135 | - background-position: center; | ||
| 136 | - ::v-deep .el-input { | ||
| 137 | - display: inline-block; | ||
| 138 | - height: 47px; | ||
| 139 | - width: 85%; | ||
| 140 | - input { | ||
| 141 | - background: transparent; | ||
| 142 | - border: 0px; | ||
| 143 | - -webkit-appearance: none; | ||
| 144 | - border-radius: 0px; | ||
| 145 | - padding: 12px 5px 12px 15px; | ||
| 146 | - color: $light_gray; | ||
| 147 | - height: 47px; | ||
| 148 | - &:-webkit-autofill { | ||
| 149 | - -webkit-box-shadow: 0 0 0px 1000px $bg inset !important; | ||
| 150 | - -webkit-text-fill-color: #fff !important; | ||
| 151 | - } | ||
| 152 | - } | ||
| 153 | - } | ||
| 154 | - ::v-deep .el-form-item { | ||
| 155 | - border: 1px solid rgba(255, 255, 255, 0.1); | ||
| 156 | - background: rgba(0, 0, 0, 0.1); | ||
| 157 | - border-radius: 5px; | ||
| 158 | - color: #454545; | ||
| 159 | - } | ||
| 160 | - .login-from-box { | ||
| 161 | - position: relative; | ||
| 162 | - backdrop-filter: saturate(180%) blur(20px); | ||
| 163 | - | ||
| 164 | - .login-form { | ||
| 165 | - position: absolute; | ||
| 166 | - left: 0; | ||
| 167 | - right: 0; | ||
| 168 | - width: 520px; | ||
| 169 | - padding: 35px 35px 15px 35px; | ||
| 170 | - margin: 120px auto; | ||
| 171 | - align-items: center; | ||
| 172 | - color: white; | ||
| 173 | - background: rgba(0, 0, 0, 0.8); | ||
| 174 | - border-radius: 10px; | ||
| 175 | - box-shadow: 0 0.4px 0.6px rgba(0, 0, 0, 0.141), | ||
| 176 | - 0 1px 1.3px rgba(0, 0, 0, 0.202), 0 1.9px 2.5px rgba(0, 0, 0, 0.25), | ||
| 177 | - 0 3.4px 4.5px rgba(0, 0, 0, 0.298), 0 6.3px 8.4px rgba(0, 0, 0, 0.359), | ||
| 178 | - 0 15px 20px rgba(0, 0, 0, 0.5); | ||
| 179 | - .login-btn { | ||
| 180 | - .btn { | ||
| 181 | - position: relative; | ||
| 182 | - width: 100%; | ||
| 183 | - padding: 6px 0; | ||
| 184 | - margin: 10px 0 36px 0; | ||
| 185 | - font-size: 1.2em; | ||
| 186 | - color: white; | ||
| 187 | - background: transparent; | ||
| 188 | - border: 2px solid hsla(204, 70%, 53%, 1); | ||
| 189 | - outline: none; | ||
| 190 | - cursor: pointer; | ||
| 191 | - overflow: hidden; | ||
| 192 | - transition: 0.5s; | ||
| 193 | - | ||
| 194 | - &::before { | ||
| 195 | - position: absolute; | ||
| 196 | - content: ""; | ||
| 197 | - top: 0; | ||
| 198 | - left: 0; | ||
| 199 | - width: 100%; | ||
| 200 | - height: 100%; | ||
| 201 | - background: linear-gradient( | ||
| 202 | - 120deg, | ||
| 203 | - transparent, | ||
| 204 | - hsla(204, 70%, 53%, 0.5), | ||
| 205 | - transparent | ||
| 206 | - ); | ||
| 207 | - transform: translateX(-100%); | ||
| 208 | - transition: 0.5s; | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - &:hover { | ||
| 212 | - box-shadow: 0 0 20px 10px hsla(204, 70%, 53%, 0.5); | ||
| 213 | - } | ||
| 214 | - | ||
| 215 | - &:hover::before { | ||
| 216 | - transform: translateX(100%); | ||
| 217 | - } | ||
| 218 | - } | ||
| 219 | - } | ||
| 220 | - } | ||
| 221 | - .tips { | ||
| 222 | - font-size: 14px; | ||
| 223 | - color: #fff; | ||
| 224 | - margin-bottom: 10px; | ||
| 225 | - span { | ||
| 226 | - &:first-of-type { | ||
| 227 | - margin-right: 16px; | ||
| 228 | - } | ||
| 229 | - } | ||
| 230 | - } | ||
| 231 | - .svg-container { | ||
| 232 | - padding: 6px 5px 6px 15px; | ||
| 233 | - color: $dark_gray; | ||
| 234 | - vertical-align: middle; | ||
| 235 | - width: 30px; | ||
| 236 | - display: inline-block; | ||
| 237 | - &_login { | ||
| 238 | - font-size: 20px; | ||
| 239 | - } | ||
| 240 | - } | ||
| 241 | - .title { | ||
| 242 | - font-size: 26px; | ||
| 243 | - font-weight: 400; | ||
| 244 | - color: $light_gray; | ||
| 245 | - margin: 0px auto 40px auto; | ||
| 246 | - text-align: center; | ||
| 247 | - font-weight: bold; | ||
| 248 | - } | ||
| 249 | - .show-pwd { | ||
| 250 | - position: absolute; | ||
| 251 | - right: 10px; | ||
| 252 | - top: 7px; | ||
| 253 | - font-size: 16px; | ||
| 254 | - color: $dark_gray; | ||
| 255 | - cursor: pointer; | ||
| 256 | - user-select: none; | ||
| 257 | - } | ||
| 258 | - } | ||
| 259 | -} | ||
| 260 | -</style> |
src/renderer/views/table/index.vue
deleted
100644 → 0
| 1 | -<!-- --> | ||
| 2 | -<template> | ||
| 3 | - <div></div> | ||
| 4 | -</template> | ||
| 5 | - | ||
| 6 | -<script> | ||
| 7 | -export default { | ||
| 8 | - data:()=> ({}), | ||
| 9 | - | ||
| 10 | - components: {}, | ||
| 11 | - | ||
| 12 | - mounted() {}, | ||
| 13 | - | ||
| 14 | - methods: {} | ||
| 15 | -} | ||
| 16 | - | ||
| 17 | -</script> | ||
| 18 | -<style rel='stylesheet/scss' lang='scss' scoped> | ||
| 19 | -</style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -2527,6 +2527,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: | ... | @@ -2527,6 +2527,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: |
| 2527 | resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" | 2527 | resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" |
| 2528 | integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= | 2528 | integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= |
| 2529 | 2529 | ||
| 2530 | +camelcase@^6.0.0: | ||
| 2531 | + version "6.0.0" | ||
| 2532 | + resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-6.0.0.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" | ||
| 2533 | + integrity sha1-Uln3ww414njxvcKk2RIws3ytmB4= | ||
| 2534 | + | ||
| 2530 | caniuse-lite@^1.0.30001093: | 2535 | caniuse-lite@^1.0.30001093: |
| 2531 | version "1.0.30001094" | 2536 | version "1.0.30001094" |
| 2532 | resolved "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001094.tgz?cache=0&sync_timestamp=1593925649372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175" | 2537 | resolved "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001094.tgz?cache=0&sync_timestamp=1593925649372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175" |
| ... | @@ -2613,7 +2618,7 @@ chardet@^0.7.0: | ... | @@ -2613,7 +2618,7 @@ chardet@^0.7.0: |
| 2613 | resolved "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1594010664806&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" | 2618 | resolved "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1594010664806&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" |
| 2614 | integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= | 2619 | integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= |
| 2615 | 2620 | ||
| 2616 | -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.0: | 2621 | +"chokidar@>=2.0.0 <4.0.0": |
| 2617 | version "3.4.0" | 2622 | version "3.4.0" |
| 2618 | resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" | 2623 | resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" |
| 2619 | integrity sha1-swYRQjzjdjV8dlubj5BLn7o8C+g= | 2624 | integrity sha1-swYRQjzjdjV8dlubj5BLn7o8C+g= |
| ... | @@ -2647,6 +2652,21 @@ chokidar@^2.1.8: | ... | @@ -2647,6 +2652,21 @@ chokidar@^2.1.8: |
| 2647 | optionalDependencies: | 2652 | optionalDependencies: |
| 2648 | fsevents "^1.2.7" | 2653 | fsevents "^1.2.7" |
| 2649 | 2654 | ||
| 2655 | +chokidar@^3.4.1: | ||
| 2656 | + version "3.4.1" | ||
| 2657 | + resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.1.tgz?cache=0&sync_timestamp=1594864807174&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" | ||
| 2658 | + integrity sha1-6QW97PEOqgoLHbDGZEgcxMvCK6E= | ||
| 2659 | + dependencies: | ||
| 2660 | + anymatch "~3.1.1" | ||
| 2661 | + braces "~3.0.2" | ||
| 2662 | + glob-parent "~5.1.0" | ||
| 2663 | + is-binary-path "~2.1.0" | ||
| 2664 | + is-glob "~4.0.1" | ||
| 2665 | + normalize-path "~3.0.0" | ||
| 2666 | + readdirp "~3.4.0" | ||
| 2667 | + optionalDependencies: | ||
| 2668 | + fsevents "~2.1.2" | ||
| 2669 | + | ||
| 2650 | chownr@^1.1.1: | 2670 | chownr@^1.1.1: |
| 2651 | version "1.1.4" | 2671 | version "1.1.4" |
| 2652 | resolved "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" | 2672 | resolved "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" |
| ... | @@ -3121,24 +3141,24 @@ crypto-random-string@^2.0.0: | ... | @@ -3121,24 +3141,24 @@ crypto-random-string@^2.0.0: |
| 3121 | resolved "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz?cache=0&sync_timestamp=1583560482221&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcrypto-random-string%2Fdownload%2Fcrypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" | 3141 | resolved "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz?cache=0&sync_timestamp=1583560482221&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcrypto-random-string%2Fdownload%2Fcrypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" |
| 3122 | integrity sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU= | 3142 | integrity sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU= |
| 3123 | 3143 | ||
| 3124 | -css-loader@^3.5.3: | 3144 | +css-loader@^4.0.0: |
| 3125 | - version "3.6.0" | 3145 | + version "4.0.0" |
| 3126 | - resolved "https://registry.npm.taobao.org/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1592056847239&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" | 3146 | + resolved "https://registry.npm.taobao.org/css-loader/download/css-loader-4.0.0.tgz#814434d4e1e2d5f430c70e85e78268db7f3cced1" |
| 3127 | - integrity sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU= | 3147 | + integrity sha1-gUQ01OHi1fQwxw6F54Jo2388ztE= |
| 3128 | dependencies: | 3148 | dependencies: |
| 3129 | - camelcase "^5.3.1" | 3149 | + camelcase "^6.0.0" |
| 3130 | cssesc "^3.0.0" | 3150 | cssesc "^3.0.0" |
| 3131 | icss-utils "^4.1.1" | 3151 | icss-utils "^4.1.1" |
| 3132 | - loader-utils "^1.2.3" | 3152 | + loader-utils "^2.0.0" |
| 3133 | normalize-path "^3.0.0" | 3153 | normalize-path "^3.0.0" |
| 3134 | postcss "^7.0.32" | 3154 | postcss "^7.0.32" |
| 3135 | postcss-modules-extract-imports "^2.0.0" | 3155 | postcss-modules-extract-imports "^2.0.0" |
| 3136 | - postcss-modules-local-by-default "^3.0.2" | 3156 | + postcss-modules-local-by-default "^3.0.3" |
| 3137 | postcss-modules-scope "^2.2.0" | 3157 | postcss-modules-scope "^2.2.0" |
| 3138 | postcss-modules-values "^3.0.0" | 3158 | postcss-modules-values "^3.0.0" |
| 3139 | postcss-value-parser "^4.1.0" | 3159 | postcss-value-parser "^4.1.0" |
| 3140 | schema-utils "^2.7.0" | 3160 | schema-utils "^2.7.0" |
| 3141 | - semver "^6.3.0" | 3161 | + semver "^7.3.2" |
| 3142 | 3162 | ||
| 3143 | css-select@^1.1.0: | 3163 | css-select@^1.1.0: |
| 3144 | version "1.2.0" | 3164 | version "1.2.0" |
| ... | @@ -3685,7 +3705,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: | ... | @@ -3685,7 +3705,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: |
| 3685 | dependencies: | 3705 | dependencies: |
| 3686 | once "^1.4.0" | 3706 | once "^1.4.0" |
| 3687 | 3707 | ||
| 3688 | -enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: | 3708 | +enhanced-resolve@^4.1.1: |
| 3689 | version "4.2.0" | 3709 | version "4.2.0" |
| 3690 | resolved "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.2.0.tgz?cache=0&sync_timestamp=1594067886559&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" | 3710 | resolved "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.2.0.tgz?cache=0&sync_timestamp=1594067886559&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" |
| 3691 | integrity sha1-XUO9pKD9RHyw675xvvje/4gFrQ0= | 3711 | integrity sha1-XUO9pKD9RHyw675xvvje/4gFrQ0= |
| ... | @@ -3694,6 +3714,15 @@ enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: | ... | @@ -3694,6 +3714,15 @@ enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: |
| 3694 | memory-fs "^0.5.0" | 3714 | memory-fs "^0.5.0" |
| 3695 | tapable "^1.0.0" | 3715 | tapable "^1.0.0" |
| 3696 | 3716 | ||
| 3717 | +enhanced-resolve@^4.3.0: | ||
| 3718 | + version "4.3.0" | ||
| 3719 | + resolved "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.3.0.tgz?cache=0&sync_timestamp=1594972208431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" | ||
| 3720 | + integrity sha1-O4BvO/r8HsfeaVUe+TzKRsFwQSY= | ||
| 3721 | + dependencies: | ||
| 3722 | + graceful-fs "^4.1.2" | ||
| 3723 | + memory-fs "^0.5.0" | ||
| 3724 | + tapable "^1.0.0" | ||
| 3725 | + | ||
| 3697 | entities@^1.1.1: | 3726 | entities@^1.1.1: |
| 3698 | version "1.1.2" | 3727 | version "1.1.2" |
| 3699 | resolved "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" | 3728 | resolved "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" |
| ... | @@ -7084,15 +7113,15 @@ postcss-modules-extract-imports@^2.0.0: | ... | @@ -7084,15 +7113,15 @@ postcss-modules-extract-imports@^2.0.0: |
| 7084 | dependencies: | 7113 | dependencies: |
| 7085 | postcss "^7.0.5" | 7114 | postcss "^7.0.5" |
| 7086 | 7115 | ||
| 7087 | -postcss-modules-local-by-default@^3.0.2: | 7116 | +postcss-modules-local-by-default@^3.0.3: |
| 7088 | - version "3.0.2" | 7117 | + version "3.0.3" |
| 7089 | - resolved "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" | 7118 | + resolved "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz?cache=0&sync_timestamp=1595733620602&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" |
| 7090 | - integrity sha1-6KZWG+kUqvPAUodjd1JMqQ27eRU= | 7119 | + integrity sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A= |
| 7091 | dependencies: | 7120 | dependencies: |
| 7092 | icss-utils "^4.1.1" | 7121 | icss-utils "^4.1.1" |
| 7093 | - postcss "^7.0.16" | 7122 | + postcss "^7.0.32" |
| 7094 | postcss-selector-parser "^6.0.2" | 7123 | postcss-selector-parser "^6.0.2" |
| 7095 | - postcss-value-parser "^4.0.0" | 7124 | + postcss-value-parser "^4.1.0" |
| 7096 | 7125 | ||
| 7097 | postcss-modules-scope@^2.2.0: | 7126 | postcss-modules-scope@^2.2.0: |
| 7098 | version "2.2.0" | 7127 | version "2.2.0" |
| ... | @@ -7126,7 +7155,7 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: | ... | @@ -7126,7 +7155,7 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: |
| 7126 | indexes-of "^1.0.1" | 7155 | indexes-of "^1.0.1" |
| 7127 | uniq "^1.0.1" | 7156 | uniq "^1.0.1" |
| 7128 | 7157 | ||
| 7129 | -postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0: | 7158 | +postcss-value-parser@^4.1.0: |
| 7130 | version "4.1.0" | 7159 | version "4.1.0" |
| 7131 | resolved "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" | 7160 | resolved "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" |
| 7132 | integrity sha1-RD9qIM7WSBor2k+oUypuVdeJoss= | 7161 | integrity sha1-RD9qIM7WSBor2k+oUypuVdeJoss= |
| ... | @@ -7141,7 +7170,7 @@ postcss@^5.2.17: | ... | @@ -7141,7 +7170,7 @@ postcss@^5.2.17: |
| 7141 | source-map "^0.5.6" | 7170 | source-map "^0.5.6" |
| 7142 | supports-color "^3.2.3" | 7171 | supports-color "^3.2.3" |
| 7143 | 7172 | ||
| 7144 | -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: | 7173 | +postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: |
| 7145 | version "7.0.32" | 7174 | version "7.0.32" |
| 7146 | resolved "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" | 7175 | resolved "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" |
| 7147 | integrity sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0= | 7176 | integrity sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0= |
| ... | @@ -8558,10 +8587,10 @@ terser-webpack-plugin@^1.4.3: | ... | @@ -8558,10 +8587,10 @@ terser-webpack-plugin@^1.4.3: |
| 8558 | webpack-sources "^1.4.0" | 8587 | webpack-sources "^1.4.0" |
| 8559 | worker-farm "^1.7.0" | 8588 | worker-farm "^1.7.0" |
| 8560 | 8589 | ||
| 8561 | -terser-webpack-plugin@^3.0.7: | 8590 | +terser-webpack-plugin@^3.0.8: |
| 8562 | - version "3.0.7" | 8591 | + version "3.0.8" |
| 8563 | - resolved "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-3.0.7.tgz#db23b946dcca8954da3ebda3675360bceebdc78e" | 8592 | + resolved "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-3.0.8.tgz#d1a53442a143e09e00c880e8d77c1e79cb05318b" |
| 8564 | - integrity sha1-2yO5RtzKiVTaPr2jZ1NgvO69x44= | 8593 | + integrity sha1-0aU0QqFD4J4AyIDo13weecsFMYs= |
| 8565 | dependencies: | 8594 | dependencies: |
| 8566 | cacache "^15.0.5" | 8595 | cacache "^15.0.5" |
| 8567 | find-cache-dir "^3.3.1" | 8596 | find-cache-dir "^3.3.1" |
| ... | @@ -9137,15 +9166,15 @@ watchpack-chokidar2@^2.0.0: | ... | @@ -9137,15 +9166,15 @@ watchpack-chokidar2@^2.0.0: |
| 9137 | dependencies: | 9166 | dependencies: |
| 9138 | chokidar "^2.1.8" | 9167 | chokidar "^2.1.8" |
| 9139 | 9168 | ||
| 9140 | -watchpack@^1.6.1: | 9169 | +watchpack@^1.7.4: |
| 9141 | - version "1.7.2" | 9170 | + version "1.7.4" |
| 9142 | - resolved "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" | 9171 | + resolved "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.4.tgz?cache=0&sync_timestamp=1595633550112&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" |
| 9143 | - integrity sha1-wC5NTUmRPD5+EiwzJTZa+dMx6ao= | 9172 | + integrity sha1-bp2lOzyAuy1lCBiPWyAEEIZs0ws= |
| 9144 | dependencies: | 9173 | dependencies: |
| 9145 | graceful-fs "^4.1.2" | 9174 | graceful-fs "^4.1.2" |
| 9146 | neo-async "^2.5.0" | 9175 | neo-async "^2.5.0" |
| 9147 | optionalDependencies: | 9176 | optionalDependencies: |
| 9148 | - chokidar "^3.4.0" | 9177 | + chokidar "^3.4.1" |
| 9149 | watchpack-chokidar2 "^2.0.0" | 9178 | watchpack-chokidar2 "^2.0.0" |
| 9150 | 9179 | ||
| 9151 | wbuf@^1.1.0, wbuf@^1.7.3: | 9180 | wbuf@^1.1.0, wbuf@^1.7.3: |
| ... | @@ -9256,10 +9285,10 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack- | ... | @@ -9256,10 +9285,10 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack- |
| 9256 | source-list-map "^2.0.0" | 9285 | source-list-map "^2.0.0" |
| 9257 | source-map "~0.6.1" | 9286 | source-map "~0.6.1" |
| 9258 | 9287 | ||
| 9259 | -webpack@^4.43.0: | 9288 | +webpack@^4.44.0: |
| 9260 | - version "4.43.0" | 9289 | + version "4.44.0" |
| 9261 | - resolved "https://registry.npm.taobao.org/webpack/download/webpack-4.43.0.tgz?cache=0&sync_timestamp=1594068677838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" | 9290 | + resolved "https://registry.npm.taobao.org/webpack/download/webpack-4.44.0.tgz#3b08f88a89470175f036f4a9496b8a0428668802" |
| 9262 | - integrity sha1-xIVHsR1WMiTFYdrRFyyKoLimeOY= | 9291 | + integrity sha1-Owj4iolHAXXwNvSpSWuKBChmiAI= |
| 9263 | dependencies: | 9292 | dependencies: |
| 9264 | "@webassemblyjs/ast" "1.9.0" | 9293 | "@webassemblyjs/ast" "1.9.0" |
| 9265 | "@webassemblyjs/helper-module-context" "1.9.0" | 9294 | "@webassemblyjs/helper-module-context" "1.9.0" |
| ... | @@ -9269,7 +9298,7 @@ webpack@^4.43.0: | ... | @@ -9269,7 +9298,7 @@ webpack@^4.43.0: |
| 9269 | ajv "^6.10.2" | 9298 | ajv "^6.10.2" |
| 9270 | ajv-keywords "^3.4.1" | 9299 | ajv-keywords "^3.4.1" |
| 9271 | chrome-trace-event "^1.0.2" | 9300 | chrome-trace-event "^1.0.2" |
| 9272 | - enhanced-resolve "^4.1.0" | 9301 | + enhanced-resolve "^4.3.0" |
| 9273 | eslint-scope "^4.0.3" | 9302 | eslint-scope "^4.0.3" |
| 9274 | json-parse-better-errors "^1.0.2" | 9303 | json-parse-better-errors "^1.0.2" |
| 9275 | loader-runner "^2.4.0" | 9304 | loader-runner "^2.4.0" |
| ... | @@ -9282,7 +9311,7 @@ webpack@^4.43.0: | ... | @@ -9282,7 +9311,7 @@ webpack@^4.43.0: |
| 9282 | schema-utils "^1.0.0" | 9311 | schema-utils "^1.0.0" |
| 9283 | tapable "^1.1.3" | 9312 | tapable "^1.1.3" |
| 9284 | terser-webpack-plugin "^1.4.3" | 9313 | terser-webpack-plugin "^1.4.3" |
| 9285 | - watchpack "^1.6.1" | 9314 | + watchpack "^1.7.4" |
| 9286 | webpack-sources "^1.4.1" | 9315 | webpack-sources "^1.4.1" |
| 9287 | 9316 | ||
| 9288 | websocket-driver@0.6.5: | 9317 | websocket-driver@0.6.5: | ... | ... |
-
请 注册 或 登录 后发表评论