Commit 2c0f807f authored by suntao's avatar suntao

ka 管理 ui系统

parents
Pipeline #627 canceled with stages
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
### VS Code ###
.vscode/
node_modules/
.node_modules/
![](https://github.com/rootsli/vue2admin/blob/master/doc/img/logo.png)
vue2-admin - A scaffolding base Vue2.js
========================================================
[![Vuejs](https://img.shields.io/badge/%20Powered%20by-Vuejs%202.1.x%20-brightgreen.svg)](https://github.com/vuejs/vue) [![Build Status](https://travis-ci.org/rootsli/vue2admin.svg?branch=master)](https://travis-ci.org/rootsli/vue2admin) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://opensource.org/licenses/mit-license.php) [![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)
> 基于vue2 + vue-router + vuex + fetch + PostCSS + [element-ui](http://element.eleme.io/)(也可以使用其他UI,例如[iView](https://www.iviewui.com/)) + webpack2 实现的一个后台管理系统基础框架。
#### 框架能力:
- 完全的基于组件化的架构
- 基于组件的CSS命名空间独立,不相互污染
- 登录功能(利用vuex与cookie的持久化方案进行登录认证缓存)
- 多级路由支持
- 基于vuex2的状态管理(开发时建议安装chrome插件vue.js devtools跟踪状态)
- vuex2与cookie的持久化支持(支持对指定vuex状态进行持久化,并能指定cookie的过期时间)。具体示例请见项目源码:src\store\index.js
- PostCSS支持:支持自动拼装前缀(autoprefixer插件),支持最新css语法(postcss-cssnext插件),支持@import方式引入css。具体示例请见项目源码:src\modules\page1\index.vue
- 基于fetch的网络服务(源码路径:src\utils\request.js)
- 支持mock数据服务(mock示例路径:src\apis\mock)
- 基于webpack2的开发构建编译:支持开发阶段的HRM,支持模块依赖,静态资源优化,模块打包和Hash指纹等编译功能,一个命令,即可完成整个项目的构建编译
- 提供了一个webpack大项目打包方案(On demand code-splitting)的示例,请见目录:src\modules\code-splitting-demo
[点此查看运行效果](http://vue2admin.duapp.com)(用户名密码不限)
```
说明:项目框架已经集成了大部分前端项目必须的插件服务和项目逻辑架构,可以拿来即用。让框架尽量简单,逻辑尽量清晰,编译构建过程完全可定制,也是本框架追求的目标之一。
```
## Build Setup
```
依赖环境:运行项目前请确认本地已安装nodejs和npm。依赖的版本如下:
- "node": ">= 4.0.0"
- "npm": ">= 3.0.0"
※ 开发和运行时阶段依赖的其他包请到package.json中查看
```
``` bash
# 安装依赖-国内用户推荐使用npm淘宝镜像,设置方法:
# step1.npm config set registry https://registry.npm.taobao.org
# step2.npm info underscore
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
# run unit tests
npm run unit
# run e2e tests
npm run e2e
# run all tests
npm test
```
## 工程目录结构
```
src:项目源码。开发的时候代码写在这里。
|--assets # 项目静态资源,编译时不进行处理的资源都放这里
|--components # 项目公共组件库
|--config # 公共配置文件,例如路由配置等
|--css # 项目公共样式库
|--modules # 项目应用模块,根据应用需要,还可以有子模块,各子模块目录结构和顶级子模块类似
| |--components # 模块级公共组件
| |--views # 模块视图
| |--css # 模块样式
| |--js # 模块脚本
|--App.vue # 项目根视图
|--main.js # 项目入口文件
|--store # 基于vuex的状态管理模块
| |--index.js # 入口及store初始化
| |--mutation-types.js # mutation名称定义
| |--state.js # 根state
| |--mutations.js # 根mutation
| |--getters.js # 根getter
| |--actions.js # 根action
| |--modules # 子模块的store对象
| | |--menu.js # menu模块
|--apis # 服务层ajax请求服务
| |--mock # api数据mock服务
|--utils # 公共库函数
| |--request.js # 网络请求服务,实现了对fetch的二次封装(目前只封装了get,post;实际项目中可按着示例封装其他请求)
```
## 页面结构
![页面结构](https://github.com/rootsli/vue2admin/blob/master/doc/img/vue2admin.png)
## todo
- fetch与Service Workers的本地缓存方案
- 国际化
- 图表插件
// https://github.com/shelljs/shelljs
require('./check-versions')()
process.env.NODE_ENV = 'production'
var ora = require('ora')
var path = require('path')
var chalk = require('chalk')
var shell = require('shelljs')
var webpack = require('webpack')
var config = require('../config')
var webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...')
spinner.start()
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory)
shell.rm('-rf', assetsPath)
shell.mkdir('-p', assetsPath)
shell.config.silent = true
shell.cp('-R', 'static/*', assetsPath)
shell.config.silent = false
webpack(webpackConfig, function (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')
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'
))
})
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
{
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
}
]
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var 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:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
require('./check-versions')()
var config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf')
: require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port
devMiddleware.waitUntilValid(function () {
console.log('> Listening at ' + uri + '\n')
})
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
})
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
// generate loader string to be used with extract text plugin
function generateLoaders (loaders) {
var sourceLoader = loaders.map(function (loader) {
var extraParamChar
if (/\?/.test(loader)) {
loader = loader.replace(/\?/, '-loader?')
extraParamChar = '&'
} else {
loader = loader + '-loader'
extraParamChar = '?'
}
return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '')
}).join('!')
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: sourceLoader,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader', sourceLoader].join('!')
}
}
// http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
return {
css: generateLoaders(['css']),
postcss: generateLoaders(['css']),
less: generateLoaders(['css', 'less']),
sass: generateLoaders(['css', 'sass?indentedSyntax']),
scss: generateLoaders(['css', 'sass']),
stylus: generateLoaders(['css', 'stylus']),
styl: generateLoaders(['css', 'stylus'])
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
loader: loader
})
}
return output
}
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
}),
postcss: [
require('postcss-import')(),
require('postcss-cssnext')()//,
// require('autoprefixer')({browsers: ['last 2 versions']})
]
}
var path = require('path')
var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
modules: [
resolve('src'),
resolve('node_modules')
],
alias: {
'vue$': 'vue/dist/vue.common.js',
'src': resolve('src'),
'@': resolve('src'),
'assets': resolve('src/assets'),
'components': resolve('src/components')
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
}
}
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: config.build.env
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash:7].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash:7].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash:7].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: process.env.NODE_ENV === 'testing'
? 'index.html'
: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
})
]
})
if (config.build.productionGzip) {
var 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.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
// This is the webpack config used for unit tests.
var utils = require('./utils')
var webpack = require('webpack')
var merge = require('webpack-merge')
var baseConfig = require('./webpack.base.conf')
var webpackConfig = merge(baseConfig, {
// use inline sourcemap for karma-sourcemap-loader
module: {
rules: utils.styleLoaders()
},
devtool: '#inline-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/test.env')
})
]
})
// no need for app entry during tests
delete webpackConfig.entry
module.exports = webpackConfig
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
BASE_API: '"http://localhost:9037"',
})
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
productionSourceMap: true,
// 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
},
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: false,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// '/ka-manager': { //使用"/api"来代替"http://f.apiplus.c"
// target: 'http://localhost:9037', //源地址
// changeOrigin: true, //改变源
// pathRewrite: {
// '^/ka-manager': 'http://localhost:9037' //路径重写
// }
// }
// },
// 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
}
}
module.exports = {
NODE_ENV: '"production"'
}
var merge = require('webpack-merge')
var devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
<head><link href=/static/css/app.a1b4677.css rel=stylesheet></head>Html Webpack Plugin:<pre>
Error: Child compilation failed:
Entry module not found: Error: Can't resolve '/Users/simon/Documents/workspace/wp_202002/ka-manager-ui/index.vue.html' in '/Users/simon/Documents/workspace/wp_202002/ka-manager-ui':
Error: Can't resolve '/Users/simon/Documents/workspace/wp_202002/ka-manager-ui/index.vue.html' in '/Users/simon/Documents/workspace/wp_202002/ka-manager-ui'
- compiler.js:76
[ka-manager-ui]/[html-webpack-plugin]/lib/compiler.js:76:16
- Compiler.js:296 Compiler.<anonymous>
[ka-manager-ui]/[webpack]/lib/Compiler.js:296:10
- Compiler.js:499
[ka-manager-ui]/[webpack]/lib/Compiler.js:499:13
- Tapable.js:202 next
[ka-manager-ui]/[tapable]/lib/Tapable.js:202:11
- CachePlugin.js:62 Compiler.<anonymous>
[ka-manager-ui]/[webpack]/lib/CachePlugin.js:62:5
- Tapable.js:206 Compiler.applyPluginsAsyncSeries
[ka-manager-ui]/[tapable]/lib/Tapable.js:206:13
- Compiler.js:496
[ka-manager-ui]/[webpack]/lib/Compiler.js:496:10
- Tapable.js:195 Compilation.applyPluginsAsyncSeries
[ka-manager-ui]/[tapable]/lib/Tapable.js:195:46
- Compilation.js:649 self.applyPluginsAsync.err
[ka-manager-ui]/[webpack]/lib/Compilation.js:649:19
- Tapable.js:195 Compilation.applyPluginsAsyncSeries
[ka-manager-ui]/[tapable]/lib/Tapable.js:195:46
- Compilation.js:640 self.applyPluginsAsync.err
[ka-manager-ui]/[webpack]/lib/Compilation.js:640:11
- Tapable.js:202 next
[ka-manager-ui]/[tapable]/lib/Tapable.js:202:11
- UglifyJsPlugin.js:230 Compilation.compilation.plugin
[ka-manager-ui]/[webpack]/lib/optimize/UglifyJsPlugin.js:230:5
- Tapable.js:206 Compilation.applyPluginsAsyncSeries
[ka-manager-ui]/[tapable]/lib/Tapable.js:206:13
- Compilation.js:635 self.applyPluginsAsync.err
[ka-manager-ui]/[webpack]/lib/Compilation.js:635:10
- Tapable.js:195 Compilation.applyPluginsAsyncSeries
[ka-manager-ui]/[tapable]/lib/Tapable.js:195:46
</anonymous></anonymous></pre><script type=text/javascript src=/static/js/manifest.9cb6469.js></script><script type=text/javascript src=/static/js/vendor.7189c8c.js></script><script type=text/javascript src=/static/js/app.965b06e.js></script>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
webpackJsonp([3],{
/***/ 201:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/**
* Created by lichb on 2017/3/20.
*/
/* harmony default export */ __webpack_exports__["default"] = ({
start() {
console.log('*********** I AM module-a ***********');
}
});
/***/ }),
/***/ 202:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/**
* Created by lichb on 2017/3/20.
*/
/* harmony default export */ __webpack_exports__["default"] = ({
start() {
console.log('*********** I AM module-b ***********');
}
});
/***/ }),
/***/ 203:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/**
* Created by lichb on 2017/3/20.
*/
/* harmony default export */ __webpack_exports__["default"] = ({
start() {
console.log('*********** I AM module-c ***********');
}
});
/***/ })
});
//# sourceMappingURL=3.d9f90dd.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///./src/modules/code-splitting-demo/module-a.js","webpack:///./src/modules/code-splitting-demo/module-b.js","webpack:///./src/modules/code-splitting-demo/module-c.js"],"names":["start","console","log"],"mappings":";;;;;;AAAA;AAAA;;;AAGe;AACbA,UAAO;AACLC,YAAQC,GAAR,CAAY,uCAAZ;AACD;AAHY,CAAf,E;;;;;;;;ACHA;AAAA;;;AAGe;AACbF,UAAO;AACLC,YAAQC,GAAR,CAAY,uCAAZ;AACD;AAHY,CAAf,E;;;;;;;;ACHA;AAAA;;;AAGe;AACbF,UAAO;AACLC,YAAQC,GAAR,CAAY,uCAAZ;AACD;AAHY,CAAf,E","file":"static/js/3.d9f90dd.js","sourcesContent":["/**\n * Created by lichb on 2017/3/20.\n */\nexport default {\n start(){\n console.log('*********** I AM module-a ***********');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/code-splitting-demo/module-a.js","/**\n * Created by lichb on 2017/3/20.\n */\nexport default {\n start(){\n console.log('*********** I AM module-b ***********');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/code-splitting-demo/module-b.js","/**\n * Created by lichb on 2017/3/20.\n */\nexport default {\n start(){\n console.log('*********** I AM module-c ***********');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/modules/code-splitting-demo/module-c.js"],"sourceRoot":""}
\ No newline at end of file
webpackJsonp([4],{207:function(t,e,s){var n=s(86)(null,s(252),null,null);t.exports=n.exports},252:function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)},staticRenderFns:[function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"height100"},[s("div",{staticClass:"home-section-wrap"},[s("div",{staticClass:"home-section-env"},[s("p",[t._v("内容段1")])])]),t._v(" "),s("div",{staticClass:"home-section-wrap home-section-wrap-bottom"},[s("div",{staticClass:"home-section-env"},[s("p",[t._v("内容段2")])])])])}]}}});
//# sourceMappingURL=4.9c82080.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///static/js/4.9c82080.js","webpack:///./src/modules/report/index.vue","webpack:///./src/modules/report/index.vue?ad50"],"names":["webpackJsonp","207","module","exports","__webpack_require__","Component","252","render","_vm","this","_h","$createElement","_self","_c","_m","staticRenderFns","staticClass","_v"],"mappings":"AAAAA,cAAc,IAERC,IACA,SAAUC,EAAQC,EAASC,GCHjC,GAAIC,GAAY,EAAQ,IAEtB,KAEA,EAAQ,KAER,KAEA,KAGFH,GAAOC,QAAUE,EAAUF,SDUrBG,IACA,SAAUJ,EAAQC,GEtBxBD,EAAOC,SAASI,OAAO,WAAY,GAAIC,GAAIC,KAASC,EAAGF,EAAIG,cAAsBH,GAAII,MAAMC,EACzF,OAAOL,GAAIM,GAAG,IACdC,iBAAkB,WAAY,GAAIP,GAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,CAC1F,OAAOG,GAAG,OACRG,YAAa,cACXH,EAAG,OACLG,YAAa,sBACXH,EAAG,OACLG,YAAa,qBACXH,EAAG,KAAML,EAAIS,GAAG,cAAeT,EAAIS,GAAG,KAAMJ,EAAG,OACjDG,YAAa,+CACXH,EAAG,OACLG,YAAa,qBACXH,EAAG,KAAML,EAAIS,GAAG","file":"static/js/4.9c82080.js","sourcesContent":["webpackJsonp([4],{\n\n/***/ 207:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Component = __webpack_require__(86)(\n /* script */\n null,\n /* template */\n __webpack_require__(252),\n /* scopeId */\n null,\n /* cssModules */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n\n/***/ 252:\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"height100\"\n }, [_c('div', {\n staticClass: \"home-section-wrap\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段1\")])])]), _vm._v(\" \"), _c('div', {\n staticClass: \"home-section-wrap home-section-wrap-bottom\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段2\")])])])])\n}]}\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// static/js/4.9c82080.js","var Component = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n null,\n /* template */\n require(\"!!../../../node_modules/vue-loader/lib/template-compiler?id=data-v-4831551c!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./index.vue\"),\n /* scopeId */\n null,\n /* cssModules */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/modules/report/index.vue\n// module id = 207\n// module chunks = 4","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"height100\"\n }, [_c('div', {\n staticClass: \"home-section-wrap\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段1\")])])]), _vm._v(\" \"), _c('div', {\n staticClass: \"home-section-wrap home-section-wrap-bottom\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段2\")])])])])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler.js?id=data-v-4831551c!./~/vue-loader/lib/selector.js?type=template&index=0!./src/modules/report/index.vue\n// module id = 252\n// module chunks = 4"],"sourceRoot":""}
\ No newline at end of file
webpackJsonp([5],{206:function(t,e,s){var n=s(86)(null,s(254),null,null);t.exports=n.exports},254:function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)},staticRenderFns:[function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"height100"},[s("div",{staticClass:"home-section-wrap"},[s("div",{staticClass:"home-section-env"},[s("p",[t._v("内容段1")])])]),t._v(" "),s("div",{staticClass:"home-section-wrap home-section-wrap-bottom"},[s("div",{staticClass:"home-section-env"},[s("p",[t._v("内容段2")])])])])}]}}});
//# sourceMappingURL=5.cc09188.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///static/js/5.cc09188.js","webpack:///./src/modules/matebase/index.vue","webpack:///./src/modules/matebase/index.vue?28ec"],"names":["webpackJsonp","206","module","exports","__webpack_require__","Component","254","render","_vm","this","_h","$createElement","_self","_c","_m","staticRenderFns","staticClass","_v"],"mappings":"AAAAA,cAAc,IAERC,IACA,SAAUC,EAAQC,EAASC,GCHjC,GAAIC,GAAY,EAAQ,IAEtB,KAEA,EAAQ,KAER,KAEA,KAGFH,GAAOC,QAAUE,EAAUF,SDUrBG,IACA,SAAUJ,EAAQC,GEtBxBD,EAAOC,SAASI,OAAO,WAAY,GAAIC,GAAIC,KAASC,EAAGF,EAAIG,cAAsBH,GAAII,MAAMC,EACzF,OAAOL,GAAIM,GAAG,IACdC,iBAAkB,WAAY,GAAIP,GAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,CAC1F,OAAOG,GAAG,OACRG,YAAa,cACXH,EAAG,OACLG,YAAa,sBACXH,EAAG,OACLG,YAAa,qBACXH,EAAG,KAAML,EAAIS,GAAG,cAAeT,EAAIS,GAAG,KAAMJ,EAAG,OACjDG,YAAa,+CACXH,EAAG,OACLG,YAAa,qBACXH,EAAG,KAAML,EAAIS,GAAG","file":"static/js/5.cc09188.js","sourcesContent":["webpackJsonp([5],{\n\n/***/ 206:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Component = __webpack_require__(86)(\n /* script */\n null,\n /* template */\n __webpack_require__(254),\n /* scopeId */\n null,\n /* cssModules */\n null\n)\n\nmodule.exports = Component.exports\n\n\n/***/ }),\n\n/***/ 254:\n/***/ (function(module, exports) {\n\nmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"height100\"\n }, [_c('div', {\n staticClass: \"home-section-wrap\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段1\")])])]), _vm._v(\" \"), _c('div', {\n staticClass: \"home-section-wrap home-section-wrap-bottom\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段2\")])])])])\n}]}\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// static/js/5.cc09188.js","var Component = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")(\n /* script */\n null,\n /* template */\n require(\"!!../../../node_modules/vue-loader/lib/template-compiler?id=data-v-7b74017e!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./index.vue\"),\n /* scopeId */\n null,\n /* cssModules */\n null\n)\n\nmodule.exports = Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/modules/matebase/index.vue\n// module id = 206\n// module chunks = 5","module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _vm._m(0)\n},staticRenderFns: [function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;\n return _c('div', {\n staticClass: \"height100\"\n }, [_c('div', {\n staticClass: \"home-section-wrap\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段1\")])])]), _vm._v(\" \"), _c('div', {\n staticClass: \"home-section-wrap home-section-wrap-bottom\"\n }, [_c('div', {\n staticClass: \"home-section-env\"\n }, [_c('p', [_vm._v(\"内容段2\")])])])])\n}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/vue-loader/lib/template-compiler.js?id=data-v-7b74017e!./~/vue-loader/lib/selector.js?type=template&index=0!./src/modules/matebase/index.vue\n// module id = 254\n// module chunks = 5"],"sourceRoot":""}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var i,u,f,s=0,l=[];s<t.length;s++)u=t[s],o[u]&&l.push(o[u][0]),o[u]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,a);l.length;)l.shift()();if(a)for(s=0;s<a.length;s++)f=n(n.s=a[s]);return f};var t={},o={8:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(u);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var a=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+"static/js/"+e+"."+{0:"4573400",1:"9acfa46",2:"1af9f2f",3:"d9f90dd",4:"9c82080",5:"cc09188",6:"7189c8c",7:"965b06e"}[e]+".js";var u=setTimeout(r,12e4);return i.onerror=i.onload=r,a.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="/",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.9cb6469.js.map
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ka-ma</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
This diff is collapsed.
{
"name": "vue2admin-v2",
"version": "1.0.0",
"description": "基于vue2 + vue-router + vuex + fetch + PostCSS + element-ui + webpack2 实现的一个后台管理系统基础框架。",
"author": "lichbin@hotmail.com",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"build": "node build/build.js",
"unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e"
},
"dependencies": {
"axios": "^0.19.2",
"element-ui": "^1.4.13",
"js-cookie": "^2.1.3",
"three": "^0.84.0",
"vue": "^2.2.1",
"vue-element-loading": "^1.1.5",
"vue-resource": "^1.5.1",
"vue-router": "^2.3.0",
"vuex": "^2.2.1",
"vuex-persistedstate": "^1.2.0",
"whatwg-fetch": "^2.0.2"
},
"devDependencies": {
"autoprefixer": "^6.7.2",
"babel-core": "^6.22.1",
"babel-loader": "^6.2.10",
"babel-plugin-istanbul": "^3.1.2",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-es2015": "^6.22.0",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chai": "^3.5.0",
"chalk": "^1.1.3",
"chromedriver": "^2.27.2",
"connect-history-api-fallback": "^1.3.0",
"cross-env": "^3.1.4",
"cross-spawn": "^5.0.1",
"css-loader": "^0.26.1",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^2.0.0-rc.2",
"file-loader": "^0.10.0",
"friendly-errors-webpack-plugin": "^1.1.3",
"function-bind": "^1.1.0",
"html-webpack-plugin": "^2.28.0",
"http-proxy-middleware": "^0.17.3",
"inject-loader": "^2.0.1",
"karma": "^1.4.1",
"karma-coverage": "^1.1.1",
"karma-mocha": "^1.3.0",
"karma-phantomjs-launcher": "^1.0.2",
"karma-sinon-chai": "^1.2.4",
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "0.0.26",
"karma-webpack": "^2.0.2",
"lolex": "^1.5.2",
"mocha": "^3.2.0",
"mock-fetch-api": "^1.0.7",
"nightwatch": "^0.9.12",
"node-sass": "^4.14.1",
"opn": "^4.0.2",
"ora": "^1.1.0",
"phantomjs-prebuilt": "^2.1.14",
"postcss-cssnext": "^2.9.0",
"postcss-import": "^9.1.0",
"sass-loader": "^9.0.2",
"selenium-server": "^3.0.1",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"sinon": "^1.17.7",
"sinon-chai": "^2.8.0",
"svg-sprite-loader": "^5.0.0",
"url-loader": "^0.5.7",
"vue-loader": "^10.3.0",
"vue-style-loader": "^2.0.0",
"vue-template-compiler": "^2.1.10",
"webpack": "^2.2.1",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.16.1",
"webpack-merge": "^2.6.1",
"less": "^3.9",
"less-loader": "^5.0.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
}
}
<template>
<transition name="app">
<router-view></router-view>
</transition>
</template>
import request from '../utils/request'
export function getChannels(data) {
return request({
url: '/channel/page',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
params: data
})
}
export function getStaticElement() {
return request({
url: '/channel/static/element',
method: 'get'
})
}
export function saveChannelBaseConf(data) {
return request({
url: '/channel/update/baseConf',
method: 'post',
data
})
}
export function getChannelDetail(query) {
return request({
url: '/channel/get/info',
method: 'get',
params: query
})
}
/**
* Created by lichb on 2017/2/10.
*/
import MockFetch from 'mock-fetch-api'
export default {
start(){
// if (process.env.NODE_ENV !== 'production') {
MockFetch.when('GET', '/login').respondWith(200, '{"tokens":"6C15B16A70AE9FEDC6546343E79103532AB88DCE1B91B0DF77BE49AE9F493D04"}');
// }
}
}
/**
* Created by lichb on 2017/2/9.
*/
import request from '../utils/request'
export default {
getTokens(name, pass){
return request({
url:'login',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
params: {
username: name,
password: pass
}
})
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* css预定义变量 */
:root {
--color-main: #ff0000;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment