@ -1,17 +0,0 @@
|
||||
{ |
||||
"presets": [ |
||||
["env", { |
||||
"modules": false, |
||||
"targets": { |
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"] |
||||
} |
||||
}], |
||||
"stage-2" |
||||
], |
||||
"plugins":["transform-vue-jsx", "transform-runtime"], |
||||
"env": { |
||||
"development":{ |
||||
"plugins": ["dynamic-import-node"] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,8 @@
|
||||
ENV = 'development' |
||||
|
||||
# 接口地址 |
||||
VUE_APP_BASE_API = 'http://localhost:8000' |
||||
VUE_APP_WS_API = 'ws://localhost:8000' |
||||
|
||||
# 是否启用 babel-plugin-dynamic-import-node插件 |
||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true |
@ -0,0 +1,5 @@
|
||||
ENV = 'production' |
||||
|
||||
# 接口地址 |
||||
VUE_APP_BASE_API = 'https://yshopapi.dayouqiantu.cn' |
||||
VUE_APP_WS_API = 'ws://yshopapi.dayouqiantu.cn' |
@ -1,10 +0,0 @@
|
||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = { |
||||
"plugins": { |
||||
"postcss-import": {}, |
||||
"postcss-url": {}, |
||||
// to edit target browsers: use "browserslist" field in package.json
|
||||
"autoprefixer": {} |
||||
} |
||||
} |
@ -1,5 +1,5 @@
|
||||
language: node_js |
||||
node_js: stable |
||||
node_js: 10 |
||||
script: npm run test |
||||
notifications: |
||||
email: false |
||||
|
@ -0,0 +1,11 @@
|
||||
const plugins = ['@vue/babel-plugin-transform-vue-jsx'] |
||||
// 生产环境移除console
|
||||
if (process.env.NODE_ENV === 'production') { |
||||
plugins.push('transform-remove-console') |
||||
} |
||||
module.exports = { |
||||
plugins: plugins, |
||||
presets: [ |
||||
'@vue/app' |
||||
] |
||||
} |
@ -1,67 +0,0 @@
|
||||
'use strict' |
||||
require('./check-versions')() |
||||
|
||||
const ora = require('ora') |
||||
const rm = require('rimraf') |
||||
const path = require('path') |
||||
const chalk = require('chalk') |
||||
const webpack = require('webpack') |
||||
const config = require('../config') |
||||
const webpackConfig = require('./webpack.prod.conf') |
||||
var connect = require('connect') |
||||
var serveStatic = require('serve-static') |
||||
|
||||
const spinner = ora( |
||||
'building for ' + process.env.env_config + ' environment...' |
||||
) |
||||
spinner.start() |
||||
|
||||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { |
||||
if (err) throw err |
||||
webpack(webpackConfig, (err, stats) => { |
||||
spinner.stop() |
||||
if (err) throw err |
||||
process.stdout.write( |
||||
stats.toString({ |
||||
colors: true, |
||||
modules: false, |
||||
children: false, |
||||
chunks: false, |
||||
chunkModules: false |
||||
}) + '\n\n' |
||||
) |
||||
|
||||
if (stats.hasErrors()) { |
||||
console.log(chalk.red(' Build failed with errors.\n')) |
||||
process.exit(1) |
||||
} |
||||
|
||||
console.log(chalk.cyan(' Build complete.\n')) |
||||
console.log( |
||||
chalk.yellow( |
||||
' Tip: built files are meant to be served over an HTTP server.\n' + |
||||
" Opening index.html over file:// won't work.\n" |
||||
) |
||||
) |
||||
|
||||
if (process.env.npm_config_preview) { |
||||
const port = 9526 |
||||
const host = 'http://localhost:' + port |
||||
const basePath = config.build.assetsPublicPath |
||||
const app = connect() |
||||
|
||||
app.use( |
||||
basePath, |
||||
serveStatic('./dist', { |
||||
index: ['index.html', '/'] |
||||
}) |
||||
) |
||||
|
||||
app.listen(port, function() { |
||||
console.log( |
||||
chalk.green(`> Listening at http://localhost:${port}${basePath}`) |
||||
) |
||||
}) |
||||
} |
||||
}) |
||||
}) |
@ -1,62 +0,0 @@
|
||||
'use strict' |
||||
const chalk = require('chalk') |
||||
const semver = require('semver') |
||||
const packageConfig = require('../package.json') |
||||
const shell = require('shelljs') |
||||
|
||||
function exec(cmd) { |
||||
return require('child_process') |
||||
.execSync(cmd) |
||||
.toString() |
||||
.trim() |
||||
} |
||||
|
||||
const versionRequirements = [ |
||||
{ |
||||
name: 'node', |
||||
currentVersion: semver.clean(process.version), |
||||
versionRequirement: packageConfig.engines.node |
||||
} |
||||
] |
||||
|
||||
if (shell.which('npm')) { |
||||
versionRequirements.push({ |
||||
name: 'npm', |
||||
currentVersion: exec('npm --version'), |
||||
versionRequirement: packageConfig.engines.npm |
||||
}) |
||||
} |
||||
|
||||
module.exports = function() { |
||||
const warnings = [] |
||||
|
||||
for (let i = 0; i < versionRequirements.length; i++) { |
||||
const mod = versionRequirements[i] |
||||
|
||||
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { |
||||
warnings.push( |
||||
mod.name + |
||||
': ' + |
||||
chalk.red(mod.currentVersion) + |
||||
' should be ' + |
||||
chalk.green(mod.versionRequirement) |
||||
) |
||||
} |
||||
} |
||||
|
||||
if (warnings.length) { |
||||
console.log('') |
||||
console.log( |
||||
chalk.yellow( |
||||
'To use this template, you must update following to modules:' |
||||
) |
||||
) |
||||
|
||||
for (let i = 0; i < warnings.length; i++) { |
||||
const warning = warnings[i] |
||||
console.log(' ' + warning) |
||||
} |
||||
|
||||
process.exit(1) |
||||
} |
||||
} |
@ -1,108 +0,0 @@
|
||||
'use strict' |
||||
const path = require('path') |
||||
const config = require('../config') |
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin') |
||||
const packageConfig = require('../package.json') |
||||
|
||||
exports.assetsPath = function(_path) { |
||||
const assetsSubDirectory = |
||||
process.env.NODE_ENV === 'production' |
||||
? config.build.assetsSubDirectory |
||||
: config.dev.assetsSubDirectory |
||||
|
||||
return path.posix.join(assetsSubDirectory, _path) |
||||
} |
||||
|
||||
exports.cssLoaders = function(options) { |
||||
options = options || {} |
||||
|
||||
const cssLoader = { |
||||
loader: 'css-loader', |
||||
options: { |
||||
sourceMap: options.sourceMap |
||||
} |
||||
} |
||||
|
||||
const postcssLoader = { |
||||
loader: 'postcss-loader', |
||||
options: { |
||||
sourceMap: options.sourceMap |
||||
} |
||||
} |
||||
|
||||
// generate loader string to be used with extract text plugin
|
||||
function generateLoaders(loader, loaderOptions) { |
||||
const loaders = [] |
||||
|
||||
// Extract CSS when that option is specified
|
||||
// (which is the case during production build)
|
||||
if (options.extract) { |
||||
loaders.push(MiniCssExtractPlugin.loader) |
||||
} else { |
||||
loaders.push('vue-style-loader') |
||||
} |
||||
|
||||
loaders.push(cssLoader) |
||||
|
||||
if (options.usePostCSS) { |
||||
loaders.push(postcssLoader) |
||||
} |
||||
|
||||
if (loader) { |
||||
loaders.push({ |
||||
loader: loader + '-loader', |
||||
options: Object.assign({}, loaderOptions, { |
||||
sourceMap: options.sourceMap |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
return loaders |
||||
} |
||||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
return { |
||||
css: generateLoaders(), |
||||
postcss: generateLoaders(), |
||||
less: generateLoaders('less'), |
||||
sass: generateLoaders('sass', { |
||||
indentedSyntax: true |
||||
}), |
||||
scss: generateLoaders('sass'), |
||||
stylus: generateLoaders('stylus'), |
||||
styl: generateLoaders('stylus') |
||||
} |
||||
} |
||||
|
||||
// Generate loaders for standalone style files (outside of .vue)
|
||||
exports.styleLoaders = function(options) { |
||||
const output = [] |
||||
const loaders = exports.cssLoaders(options) |
||||
|
||||
for (const extension in loaders) { |
||||
const loader = loaders[extension] |
||||
output.push({ |
||||
test: new RegExp('\\.' + extension + '$'), |
||||
use: loader |
||||
}) |
||||
} |
||||
|
||||
return output |
||||
} |
||||
|
||||
exports.createNotifierCallback = () => { |
||||
const notifier = require('node-notifier') |
||||
|
||||
return (severity, errors) => { |
||||
if (severity !== 'error') return |
||||
|
||||
const error = errors[0] |
||||
const filename = error.file && error.file.split('!').pop() |
||||
|
||||
notifier.notify({ |
||||
title: packageConfig.name, |
||||
message: severity + ': ' + error.name, |
||||
subtitle: filename || '', |
||||
icon: path.join(__dirname, 'logo.png') |
||||
}) |
||||
} |
||||
} |
@ -1,5 +0,0 @@
|
||||
'use strict' |
||||
|
||||
module.exports = { |
||||
//You can set the vue-loader configuration by yourself.
|
||||
} |
@ -1,122 +0,0 @@
|
||||
'use strict' |
||||
const path = require('path') |
||||
const utils = require('./utils') |
||||
const config = require('../config') |
||||
const { VueLoaderPlugin } = require('vue-loader') |
||||
|
||||
const os = require('os'); |
||||
const HappyPack = require('happypack'); |
||||
const happThreadPool = HappyPack.ThreadPool({size: os.cpus().length}); |
||||
|
||||
function resolve(dir) { |
||||
return path.join(__dirname, '..', dir) |
||||
} |
||||
|
||||
const createLintingRule = () => ({ |
||||
// test: /\.(js|vue)$/,
|
||||
// loader: 'eslint-loader',
|
||||
// enforce: 'pre',
|
||||
// include: [resolve('src'), resolve('test')],
|
||||
// options: {
|
||||
// formatter: require('eslint-friendly-formatter'),
|
||||
// emitWarning: !config.dev.showEslintErrorsInOverlay
|
||||
// }
|
||||
}) |
||||
|
||||
module.exports = { |
||||
cache: true, |
||||
context: path.resolve(__dirname, '../'), |
||||
entry:["babel-polyfill","./src/main.js"], |
||||
output: { |
||||
path: config.build.assetsRoot, |
||||
filename: '[name].js', |
||||
publicPath: |
||||
process.env.NODE_ENV === 'production' |
||||
? config.build.assetsPublicPath |
||||
: config.dev.assetsPublicPath |
||||
}, |
||||
resolve: { |
||||
modules: [path.resolve(__dirname, '../node_modules')], |
||||
extensions: ['.js', '.vue', '.json'], |
||||
alias: { |
||||
'@': resolve('src'), |
||||
api: path.resolve(__dirname, '../src/api') |
||||
} |
||||
}, |
||||
module: { |
||||
rules: [ |
||||
...(config.dev.useEslint ? [createLintingRule()] : []), |
||||
{ |
||||
test: /\.vue$/, |
||||
loader: 'vue-loader', |
||||
options: { |
||||
loaders: { |
||||
js: 'happypack/loader?id=js' // 将loader换成happypack
|
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.js$/, |
||||
loader: ['happypack/loader?id=js'], // 将loader换成happypack
|
||||
include: [ |
||||
resolve('src') |
||||
], // src是项目开发的目录
|
||||
exclude: [path.resolve('../node_modules')] // 不需要编译node_modules下的js
|
||||
}, |
||||
{ |
||||
test: /\.svg$/, |
||||
loader: 'svg-sprite-loader', |
||||
include: [resolve('src/icons')], |
||||
options: { |
||||
symbolId: 'icon-[name]' |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, |
||||
loader: 'url-loader', |
||||
exclude: [resolve('src/icons')], |
||||
options: { |
||||
limit: 10000, |
||||
name: utils.assetsPath('img/[name].[hash:7].[ext]') |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, |
||||
loader: 'url-loader', |
||||
options: { |
||||
limit: 10000, |
||||
name: utils.assetsPath('media/[name].[hash:7].[ext]') |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, |
||||
loader: 'url-loader', |
||||
options: { |
||||
limit: 10000, |
||||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
plugins: [ |
||||
new VueLoaderPlugin(), |
||||
new HappyPack({ |
||||
id: 'js', |
||||
cache: true, |
||||
loaders: ['babel-loader?cacheDirectory=true'], |
||||
threadPool: happThreadPool |
||||
}) |
||||
], |
||||
node: { |
||||
// prevent webpack from injecting useless setImmediate polyfill because Vue
|
||||
// source contains it (although only uses it if it's native).
|
||||
setImmediate: false, |
||||
// prevent webpack from injecting mocks to Node native modules
|
||||
// that does not make sense for the client
|
||||
dgram: 'empty', |
||||
fs: 'empty', |
||||
net: 'empty', |
||||
tls: 'empty', |
||||
child_process: 'empty' |
||||
} |
||||
} |
@ -1,98 +0,0 @@
|
||||
'use strict' |
||||
const path = require('path') |
||||
const utils = require('./utils') |
||||
const webpack = require('webpack') |
||||
const config = require('../config') |
||||
const merge = require('webpack-merge') |
||||
const baseWebpackConfig = require('./webpack.base.conf') |
||||
const HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') |
||||
const portfinder = require('portfinder') |
||||
|
||||
function resolve(dir) { |
||||
return path.join(__dirname, '..', dir) |
||||
} |
||||
|
||||
const HOST = process.env.HOST |
||||
const PORT = process.env.PORT && Number(process.env.PORT) |
||||
|
||||
const devWebpackConfig = merge(baseWebpackConfig, { |
||||
mode: 'development', |
||||
module: { |
||||
rules: utils.styleLoaders({ |
||||
sourceMap: config.dev.cssSourceMap, |
||||
usePostCSS: true |
||||
}) |
||||
}, |
||||
// cheap-module-eval-source-map is faster for development
|
||||
devtool: config.dev.devtool, |
||||
|
||||
// these devServer options should be customized in /config/index.js
|
||||
devServer: { |
||||
clientLogLevel: 'warning', |
||||
historyApiFallback: true, |
||||
hot: true, |
||||
compress: true, |
||||
host: HOST || config.dev.host, |
||||
port: PORT || config.dev.port, |
||||
open: config.dev.autoOpenBrowser, |
||||
overlay: config.dev.errorOverlay |
||||
? { warnings: false, errors: true } |
||||
: false, |
||||
publicPath: config.dev.assetsPublicPath, |
||||
proxy: config.dev.proxyTable, |
||||
quiet: true, // necessary for FriendlyErrorsPlugin
|
||||
watchOptions: { |
||||
poll: config.dev.poll |
||||
} |
||||
}, |
||||
plugins: [ |
||||
new webpack.DefinePlugin({ |
||||
'process.env': require('../config/dev.env') |
||||
}), |
||||
new webpack.HotModuleReplacementPlugin(), |
||||
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({ |
||||
filename: 'index.html', |
||||
template: 'index.html', |
||||
inject: true, |
||||
favicon: resolve('favicon.ico'), |
||||
title: 'vue-element-admin', |
||||
templateParameters: { |
||||
BASE_URL: config.dev.assetsPublicPath + config.dev.assetsSubDirectory, |
||||
}, |
||||
}), |
||||
] |
||||
}) |
||||
|
||||
module.exports = new Promise((resolve, reject) => { |
||||
portfinder.basePort = process.env.PORT || config.dev.port |
||||
portfinder.getPort((err, port) => { |
||||
if (err) { |
||||
reject(err) |
||||
} else { |
||||
// publish the new Port, necessary for e2e tests
|
||||
process.env.PORT = port |
||||
// add port to devServer config
|
||||
devWebpackConfig.devServer.port = port |
||||
|
||||
// Add FriendlyErrorsPlugin
|
||||
devWebpackConfig.plugins.push( |
||||
new FriendlyErrorsPlugin({ |
||||
compilationSuccessInfo: { |
||||
messages: [ |
||||
`Your application is running here: http://${ |
||||
devWebpackConfig.devServer.host |
||||
}:${port}` |
||||
] |
||||
}, |
||||
onErrors: config.dev.notifyOnErrors |
||||
? utils.createNotifierCallback() |
||||
: undefined |
||||
}) |
||||
) |
||||
|
||||
resolve(devWebpackConfig) |
||||
} |
||||
}) |
||||
}) |
@ -1,188 +0,0 @@
|
||||
'use strict' |
||||
const path = require('path') |
||||
const utils = require('./utils') |
||||
const webpack = require('webpack') |
||||
const config = require('../config') |
||||
const merge = require('webpack-merge') |
||||
const baseWebpackConfig = require('./webpack.base.conf') |
||||
const CopyWebpackPlugin = require('copy-webpack-plugin') |
||||
const HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin') |
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin') |
||||
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin') |
||||
const UglifyJsPlugin = require('uglifyjs-webpack-plugin') |
||||
|
||||
function resolve(dir) { |
||||
return path.join(__dirname, '..', dir) |
||||
} |
||||
|
||||
const env = require('../config/' + process.env.env_config + '.env') |
||||
|
||||
// For NamedChunksPlugin
|
||||
const seen = new Set() |
||||
const nameLength = 4 |
||||
|
||||
const webpackConfig = merge(baseWebpackConfig, { |
||||
mode: 'production', |
||||
module: { |
||||
rules: utils.styleLoaders({ |
||||
sourceMap: config.build.productionSourceMap, |
||||
extract: true, |
||||
usePostCSS: true |
||||
}) |
||||
}, |
||||
devtool: config.build.productionSourceMap ? config.build.devtool : false, |
||||
output: { |
||||
path: config.build.assetsRoot, |
||||
filename: utils.assetsPath('js/[name].[chunkhash:8].js'), |
||||
chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js') |
||||
}, |
||||
plugins: [ |
||||
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
new webpack.DefinePlugin({ |
||||
'process.env': env |
||||
}), |
||||
// extract css into its own file
|
||||
new MiniCssExtractPlugin({ |
||||
filename: utils.assetsPath('css/[name].[contenthash:8].css'), |
||||
chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css') |
||||
}), |
||||
// generate dist index.html with correct asset hash for caching.
|
||||
// you can customize output by editing /index.html
|
||||
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({ |
||||
filename: config.build.index, |
||||
template: 'index.html', |
||||
inject: true, |
||||
favicon: resolve('favicon.ico'), |
||||
title: 'vue-element-admin', |
||||
templateParameters: { |
||||
BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory, |
||||
}, |
||||
minify: { |
||||
removeComments: true, |
||||
collapseWhitespace: true, |
||||
removeAttributeQuotes: true |
||||
// more options:
|
||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
} |
||||
// default sort mode uses toposort which cannot handle cyclic deps
|
||||
// in certain cases, and in webpack 4, chunk order in HTML doesn't
|
||||
// matter anyway
|
||||
}), |
||||
new ScriptExtHtmlWebpackPlugin({ |
||||
//`runtime` must same as runtimeChunk name. default is `runtime`
|
||||
inline: /runtime\..*\.js$/ |
||||
}), |
||||
// keep chunk.id stable when chunk has no name
|
||||
new webpack.NamedChunksPlugin(chunk => { |
||||
if (chunk.name) { |
||||
return chunk.name |
||||
} |
||||
const modules = Array.from(chunk.modulesIterable) |
||||
if (modules.length > 1) { |
||||
const hash = require('hash-sum') |
||||
const joinedHash = hash(modules.map(m => m.id).join('_')) |
||||
let len = nameLength |
||||
while (seen.has(joinedHash.substr(0, len))) len++ |
||||
seen.add(joinedHash.substr(0, len)) |
||||
return `chunk-${joinedHash.substr(0, len)}` |
||||
} else { |
||||
return modules[0].id |
||||
} |
||||
}), |
||||
// keep module.id stable when vender modules does not change
|
||||
new webpack.HashedModuleIdsPlugin(), |
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([ |
||||
{ |
||||
from: path.resolve(__dirname, '../static'), |
||||
to: config.build.assetsSubDirectory, |
||||
ignore: ['.*'] |
||||
} |
||||
]) |
||||
], |
||||
optimization: { |
||||
splitChunks: { |
||||
chunks: 'all', |
||||
cacheGroups: { |
||||
libs: { |
||||
name: 'chunk-libs', |
||||
test: /[\\/]node_modules[\\/]/, |
||||
priority: 10, |
||||
chunks: 'initial' // 只打包初始时依赖的第三方
|
||||
}, |
||||
elementUI: { |
||||
name: 'chunk-elementUI', // 单独将 elementUI 拆包
|
||||
priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
|
||||
test: /[\\/]node_modules[\\/]element-ui[\\/]/ |
||||
}, |
||||
commons: { |
||||
name: 'chunk-commons', |
||||
test: resolve('src/components'), // 可自定义拓展你的规则
|
||||
minChunks: 3, // 最小公用次数
|
||||
priority: 5, |
||||
reuseExistingChunk: true |
||||
} |
||||
} |
||||
}, |
||||
runtimeChunk: 'single', |
||||
minimizer: [ |
||||
new UglifyJsPlugin({ |
||||
uglifyOptions: { |
||||
mangle: { |
||||
safari10: true |
||||
} |
||||
}, |
||||
sourceMap: config.build.productionSourceMap, |
||||
cache: true, |
||||
parallel: true |
||||
}), |
||||
// Compress extracted CSS. We are using this plugin so that possible
|
||||
// duplicated CSS from different components can be deduped.
|
||||
new OptimizeCSSAssetsPlugin() |
||||
] |
||||
} |
||||
}) |
||||
|
||||
if (config.build.productionGzip) { |
||||
const CompressionWebpackPlugin = require('compression-webpack-plugin') |
||||
|
||||
webpackConfig.plugins.push( |
||||
new CompressionWebpackPlugin({ |
||||
asset: '[path].gz[query]', |
||||
algorithm: 'gzip', |
||||
test: new RegExp( |
||||
'\\.(' + config.build.productionGzipExtensions.join('|') + ')$' |
||||
), |
||||
threshold: 10240, |
||||
minRatio: 0.8 |
||||
}) |
||||
) |
||||
} |
||||
|
||||
if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) { |
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') |
||||
.BundleAnalyzerPlugin |
||||
|
||||
if (config.build.bundleAnalyzerReport) { |
||||
webpackConfig.plugins.push( |
||||
new BundleAnalyzerPlugin({ |
||||
analyzerPort: 8080, |
||||
generateStatsFile: false |
||||
}) |
||||
) |
||||
} |
||||
|
||||
if (config.build.generateAnalyzerReport) { |
||||
webpackConfig.plugins.push( |
||||
new BundleAnalyzerPlugin({ |
||||
analyzerMode: 'static', |
||||
reportFilename: 'bundle-report.html', |
||||
openAnalyzer: false |
||||
}) |
||||
) |
||||
} |
||||
} |
||||
|
||||
module.exports = webpackConfig |
@ -1,9 +0,0 @@
|
||||
'use strict' |
||||
const merge = require('webpack-merge') |
||||
const prodEnv = require('./prod.env') |
||||
|
||||
module.exports = merge(prodEnv, { |
||||
NODE_ENV: '"development"', |
||||
BASE_API: '"http://localhost:8000"' |
||||
//BASE_API: '"https://yshopapi.dayouqiantu.cn"'
|
||||
}) |
@ -1,106 +0,0 @@
|
||||
'use strict' |
||||
// Template version: 1.2.6
|
||||
const devEnv = require('./dev.env') |
||||
// 获取接口地址
|
||||
const base_url = devEnv.BASE_API.replace(/"/g,'') |
||||
const path = require('path') |
||||
module.exports = { |
||||
dev: { |
||||
// Paths
|
||||
assetsSubDirectory: 'static', |
||||
assetsPublicPath: '/', |
||||
// 配置代理
|
||||
proxyTable: { |
||||
'/auth': { |
||||
// 测试环境
|
||||
target: base_url, |
||||
secure: true, |
||||
changeOrigin: true, |
||||
pathRewrite: { |
||||
'^/auth': 'auth' |
||||
} |
||||
}, |
||||
'/api': { |
||||
// 测试环境
|
||||
target: base_url, |
||||
secure: true, |
||||
changeOrigin: true, |
||||
pathRewrite: { |
||||
'^/api': 'api' |
||||
} |
||||
} |
||||
}, |
||||
|
||||
// Various Dev Server settings
|
||||
host: 'localhost', // can be overwritten by process.env.HOST
|
||||
port: 8013, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
|
||||
autoOpenBrowser: true, |
||||
errorOverlay: true, |
||||
notifyOnErrors: false, |
||||
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
|
||||
|
||||
// Use Eslint Loader?
|
||||
// If true, your code will be linted during bundling and
|
||||
// linting errors and warnings will be shown in the console.
|
||||
useEslint: true, |
||||
// If true, eslint errors and warnings will also be shown in the error overlay
|
||||
// in the browser.
|
||||
showEslintErrorsInOverlay: false, |
||||
|
||||
/** |
||||
* Source Maps |
||||
*/ |
||||
|
||||
// https://webpack.js.org/configuration/devtool/#development
|
||||
devtool: 'cheap-source-map', |
||||
|
||||
// CSS Sourcemaps off by default because relative paths are "buggy"
|
||||
// with this option, according to the CSS-Loader README
|
||||
// (https://github.com/webpack/css-loader#sourcemaps)
|
||||
// In our experience, they generally work as expected,
|
||||
// just be aware of this issue when enabling this option.
|
||||
cssSourceMap: false |
||||
}, |
||||
|
||||
build: { |
||||
// Template for index.html
|
||||
index: path.resolve(__dirname, '../dist/index.html'), |
||||
|
||||
// Paths
|
||||
assetsRoot: path.resolve(__dirname, '../dist'), |
||||
assetsSubDirectory: 'static', |
||||
|
||||
/** |
||||
* You can set by youself according to actual condition |
||||
* You will need to set this if you plan to deploy your site under a sub path, |
||||
* for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
|
||||
* then assetsPublicPath should be set to "/bar/". |
||||
* In most cases please use '/' !!! |
||||
*/ |
||||
assetsPublicPath: '/', |
||||
|
||||
/** |
||||
* Source Maps |
||||
*/ |
||||
|
||||
productionSourceMap: false, |
||||
// https://webpack.js.org/configuration/devtool/#production
|
||||
devtool: 'source-map', |
||||
|
||||
// Gzip off by default as many popular static hosts such as
|
||||
// Surge or Netlify already gzip all static assets for you.
|
||||
// Before setting to `true`, make sure to:
|
||||
// npm install --save-dev compression-webpack-plugin
|
||||
productionGzip: false, |
||||
productionGzipExtensions: ['js', 'css'], |
||||
|
||||
// Run the build command with an extra argument to
|
||||
// View the bundle analyzer report after build finishes:
|
||||
// `npm run build --report`
|
||||
// Set to `true` or `false` to always turn it on or off
|
||||
bundleAnalyzerReport: process.env.npm_config_report || false, |
||||
|
||||
// `npm run build:prod --generate_report`
|
||||
generateAnalyzerReport: process.env.npm_config_generate_report || false |
||||
} |
||||
} |
@ -1,5 +0,0 @@
|
||||
'use strict' |
||||
module.exports = { |
||||
NODE_ENV: '"production"', |
||||
BASE_API: '"https://yshopapi.dayouqiantu.cn"' |
||||
} |
@ -1 +0,0 @@
|
||||
[1110/193651.524:ERROR:crashpad_client_win.cc(491)] CreateProcess: 页面文件太小,无法完成操作。 (0x5AF) |
@ -1,22 +0,0 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||
<style> |
||||
.sampleContainer{position:fixed;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);width:75px;height:100px}.loader{position:relative;width:44px;height:8px;margin:12px auto}.dot{display:inline-block;width:8px;height:8px;border-radius:4px;background:#ccc;position:absolute}.dot_1{animation:animateDot1 1.5s linear infinite;left:12px;background:#e579b8}.dot_2{animation:animateDot2 1.5s linear infinite;animation-delay:.5s;left:24px}.dot_3{animation:animateDot3 1.5s linear infinite;left:12px}.dot_4{animation:animateDot4 1.5s linear infinite;animation-delay:.5s;left:24px}@keyframes animateDot1{0%{transform:rotate(0) translateX(-12px)}25%{transform:rotate(180deg) translateX(-12px)}75%{transform:rotate(180deg) translateX(-12px)}100%{transform:rotate(360deg) translateX(-12px)}}@keyframes animateDot2{0%{transform:rotate(0) translateX(-12px)}25%{transform:rotate(-180deg) translateX(-12px)}75%{transform:rotate(-180deg) translateX(-12px)}100%{transform:rotate(-360deg) translateX(-12px)}}@keyframes animateDot3{0%{transform:rotate(0) translateX(12px)}25%{transform:rotate(180deg) translateX(12px)}75%{transform:rotate(180deg) translateX(12px)}100%{transform:rotate(360deg) translateX(12px)}}@keyframes animateDot4{0%{transform:rotate(0) translateX(12px)}25%{transform:rotate(-180deg) translateX(12px)}75%{transform:rotate(-180deg) translateX(12px)}100%{transform:rotate(-360deg) translateX(12px)}} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<div id="app"> |
||||
<div class="sampleContainer"> |
||||
<div class="loader"> |
||||
<span class="dot dot_1"></span> |
||||
<span class="dot dot_2"></span> |
||||
<span class="dot dot_3"></span> |
||||
<span class="dot dot_4"></span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</body> |
||||
</html> |
@ -0,0 +1,24 @@
|
||||
module.exports = { |
||||
moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], |
||||
transform: { |
||||
'^.+\\.vue$': 'vue-jest', |
||||
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': |
||||
'jest-transform-stub', |
||||
'^.+\\.jsx?$': 'babel-jest' |
||||
}, |
||||
moduleNameMapper: { |
||||
'^@/(.*)$': '<rootDir>/src/$1' |
||||
}, |
||||
snapshotSerializers: ['jest-serializer-vue'], |
||||
testMatch: [ |
||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' |
||||
], |
||||
collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], |
||||
coverageDirectory: '<rootDir>/tests/unit/coverage', |
||||
// 'collectCoverage': true,
|
||||
'coverageReporters': [ |
||||
'lcov', |
||||
'text-summary' |
||||
], |
||||
testURL: 'http://localhost/' |
||||
} |
@ -0,0 +1,7 @@
|
||||
const viewGenerator = require('./plop-templates/view/prompt') |
||||
const componentGenerator = require('./plop-templates/component/prompt') |
||||
|
||||
module.exports = function(plop) { |
||||
plop.setGenerator('view', viewGenerator) |
||||
plop.setGenerator('component', componentGenerator) |
||||
} |
@ -0,0 +1,5 @@
|
||||
module.exports = { |
||||
plugins: { |
||||
autoprefixer: {} |
||||
} |
||||
} |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
||||
<meta name="renderer" content="webkit"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> |
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
||||
<title><%= webpackConfig.name %></title> |
||||
</head> |
||||
<body> |
||||
<div id="app"></div> |
||||
<!-- built files will be auto injected --> |
||||
</body> |
||||
</html> |
@ -1,9 +1,17 @@
|
||||
import request from '@/utils/request' |
||||
import qs from 'qs' |
||||
|
||||
export function initData(url, params) { |
||||
return request({ |
||||
url: url, |
||||
url: url + '?' + qs.stringify(params, { indices: false }), |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
export function download(url, params) { |
||||
return request({ |
||||
url: url + '?' + qs.stringify(params, { indices: false }), |
||||
method: 'get', |
||||
params |
||||
responseType: 'blob' |
||||
}) |
||||
} |
||||
|
@ -1,9 +0,0 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function generator(data, tableName) { |
||||
return request({ |
||||
url: 'api/generator?tableName=' + tableName, |
||||
data, |
||||
method: 'post' |
||||
}) |
||||
} |
@ -1,8 +1,8 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function get() { |
||||
export function get(tableName) { |
||||
return request({ |
||||
url: 'api/genConfig', |
||||
url: 'api/genConfig/' + tableName, |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,33 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function getAllTable() { |
||||
return request({ |
||||
url: 'api/generator/tables/all', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
export function generator(tableName, type) { |
||||
return request({ |
||||
url: 'api/generator/' + tableName + '/' + type, |
||||
method: 'post', |
||||
responseType: type === 2 ? 'blob' : '' |
||||
}) |
||||
} |
||||
|
||||
export function save(data) { |
||||
return request({ |
||||
url: 'api/generator', |
||||
data, |
||||
method: 'put' |
||||
}) |
||||
} |
||||
|
||||
export function sync(tables) { |
||||
return request({ |
||||
url: 'api/generator/sync', |
||||
method: 'post', |
||||
data: tables |
||||
}) |
||||
} |
||||
|
@ -1,8 +0,0 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function getErrDetail(id) { |
||||
return request({ |
||||
url: 'api/logs/error/' + id, |
||||
method: 'get' |
||||
}) |
||||
} |
@ -0,0 +1,17 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function testDbConnect(data) { |
||||
return request({ |
||||
url: 'api/database/testConnect', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function testServerConnect(data) { |
||||
return request({ |
||||
url: 'api/serverDeploy/testConnect', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
@ -0,0 +1,35 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function add(data) { |
||||
return request({ |
||||
url: 'api/database', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/database', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
export function edit(data) { |
||||
return request({ |
||||
url: 'api/database', |
||||
method: 'put', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function testDbConnection(data) { |
||||
return request({ |
||||
url: 'api/database/testConnect', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export default { add, edit, del, testDbConnection } |
@ -0,0 +1,77 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function add(data) { |
||||
return request({ |
||||
url: 'api/deploy', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/deploy', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
export function edit(data) { |
||||
return request({ |
||||
url: 'api/deploy', |
||||
method: 'put', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function getApps() { |
||||
return request({ |
||||
url: 'api/app', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
export function getServers() { |
||||
return request({ |
||||
url: 'api/serverDeploy', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 启动服务 |
||||
* @param data 选中行 |
||||
*/ |
||||
export function startServer(data) { |
||||
return request({ |
||||
url: 'api/deploy/startServer', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 停止服务 |
||||
* @param data 选中行 |
||||
*/ |
||||
export function stopServer(data) { |
||||
return request({ |
||||
url: 'api/deploy/stopServer', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 停止服务 |
||||
* @param data 选中行 |
||||
*/ |
||||
export function serverStatus(data) { |
||||
return request({ |
||||
url: 'api/deploy/serverStatus', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export default { add, edit, del, stopServer, serverStatus, startServer, getServers, getApps } |
@ -0,0 +1,21 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/deployHistory', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 版本回退 |
||||
* @param data 选中行 |
||||
*/ |
||||
export function reducte(data) { |
||||
return request({ |
||||
url: 'api/deploy/serverReduction', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
@ -0,0 +1,27 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function add(data) { |
||||
return request({ |
||||
url: 'api/serverDeploy', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/serverDeploy', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
export function edit(data) { |
||||
return request({ |
||||
url: 'api/serverDeploy', |
||||
method: 'put', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export default { add, edit, del } |
@ -0,0 +1,22 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function getErrDetail(id) { |
||||
return request({ |
||||
url: 'api/logs/error/' + id, |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
export function delAllError() { |
||||
return request({ |
||||
url: 'api/logs/del/error', |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
export function delAllInfo() { |
||||
return request({ |
||||
url: 'api/logs/del/info', |
||||
method: 'delete' |
||||
}) |
||||
} |
@ -0,0 +1,9 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function del(keys) { |
||||
return request({ |
||||
url: 'auth/online', |
||||
method: 'delete', |
||||
data: keys |
||||
}) |
||||
} |
@ -0,0 +1,27 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function add(data) { |
||||
return request({ |
||||
url: 'api/server', |
||||
method: 'post', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/server', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
export function edit(data) { |
||||
return request({ |
||||
url: 'api/server', |
||||
method: 'put', |
||||
data |
||||
}) |
||||
} |
||||
|
||||
export default { add, edit, del } |
@ -0,0 +1,22 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function count() { |
||||
return request({ |
||||
url: 'api/visits', |
||||
method: 'post' |
||||
}) |
||||
} |
||||
|
||||
export function get() { |
||||
return request({ |
||||
url: 'api/visits', |
||||
method: 'get' |
||||
}) |
||||
} |
||||
|
||||
export function getChartData() { |
||||
return request({ |
||||
url: 'api/visits/chartData', |
||||
method: 'get' |
||||
}) |
||||
} |
@ -1,16 +0,0 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function del(id) { |
||||
return request({ |
||||
url: 'api/pictures/' + id, |
||||
method: 'delete' |
||||
}) |
||||
} |
||||
|
||||
export function delAll(ids) { |
||||
return request({ |
||||
url: 'api/pictures/', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
@ -0,0 +1,18 @@
|
||||
import request from '@/utils/request' |
||||
|
||||
export function del(ids) { |
||||
return request({ |
||||
url: 'api/pictures', |
||||
method: 'delete', |
||||
data: ids |
||||
}) |
||||
} |
||||
|
||||
export function sync() { |
||||
return request({ |
||||
url: 'api/pictures/synchronize', |
||||
method: 'post' |
||||
}) |
||||
} |
||||
|
||||
export default { del, sync } |
Before Width: | Height: | Size: 4.0 KiB |
@ -1,9 +1,9 @@
|
||||
import Vue from 'vue' |
||||
import SvgIcon from '@/components/SvgIcon' // svg组件
|
||||
import SvgIcon from '@/components/SvgIcon'// svg component
|
||||
|
||||
// register globally
|
||||
Vue.component('svg-icon', SvgIcon) |
||||
|
||||
const requireAll = requireContext => requireContext.keys().map(requireContext) |
||||
const req = require.context('./svg', false, /\.svg$/) |
||||
const requireAll = requireContext => requireContext.keys().map(requireContext) |
||||
requireAll(req) |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 757 B After Width: | Height: | Size: 757 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 732 B After Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 699 B After Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |