umbrella22

删除无用组件,更新依赖,当前未修正css-loader造成css丢失问题,请勿使用

...@@ -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 &nbsp; 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 - <section class="app-main">
3 - <transition name="fade" mode="out-in">
4 - <router-view />
5 - </transition>
6 - </section>
7 -</template>
8 -
9 -<script>
10 -export default {
11 - name: "AppMain"
12 -};
13 -</script>
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
1 -export { default as Navbar } from './Navbar'
2 -export { default as Sidebar } from './Sidebar'
3 -export { default as AppMain } from './AppMain'
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 -
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 -
1 -@import './variables.scss';
2 -@import './mixin.scss';
3 @import './transition.scss'; 1 @import './transition.scss';
4 -@import './element-ui.scss';
5 -@import './sidebar.scss';
6 2
7 body { 3 body {
8 -moz-osx-font-smoothing: grayscale; 4 -moz-osx-font-smoothing: grayscale;
......
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 -
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
1 -//sidebar
2 -$menuBg:#ffffff;
3 -$subMenuBg:#1f2d3d;
4 -$menuHover:#001528;
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 -
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>
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:
......