├── README.md ├── item-cms ├── .babelrc ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── index.html ├── package.json ├── src │ ├── App.vue │ ├── components │ │ ├── childConponent │ │ │ ├── CarouselImage.vue │ │ │ ├── comment.vue │ │ │ └── subAdd.vue │ │ ├── goods │ │ │ ├── goodscomment.vue │ │ │ ├── goodsdocs.vue │ │ │ ├── goodsinfo.vue │ │ │ └── goodslist.vue │ │ ├── home │ │ │ └── home.vue │ │ ├── news │ │ │ ├── newsInfo.vue │ │ │ └── newsList.vue │ │ ├── photo │ │ │ ├── photoinfo.vue │ │ │ └── photolist.vue │ │ └── shopcart │ │ │ └── shopcartlist.vue │ ├── main.js │ ├── resource │ │ └── Http.js │ ├── router.js │ └── tools │ │ ├── bus.js │ │ ├── data.js │ │ └── shopModel.js └── static │ ├── .gitkeep │ ├── css │ └── public.css │ ├── images │ ├── menu10.png │ ├── menu3.png │ ├── menu4.png │ ├── menu5.png │ ├── menu6.png │ └── menu9.png │ ├── mui │ ├── css │ │ ├── icons-extra.css │ │ └── mui.min.css │ ├── fonts │ │ ├── mui-icons-extra.ttf │ │ └── mui.ttf │ └── js │ │ └── mui.min.js │ └── tools │ ├── bus.js │ ├── data.js │ ├── http.js │ └── shopModel.js ├── node-cms ├── LICENSE ├── README.md ├── README.md.dump ├── dtcmsdb4.sql ├── mysqlconfig.bmp ├── npm-debug.log ├── package.json ├── src │ ├── app.js │ ├── controllers │ │ └── apiController.js │ ├── routes │ │ └── apiRoute.js │ ├── start.bat │ ├── test.js │ └── upload │ │ └── 201504 │ │ └── 20 │ │ └── thumb_201504200059017695.jpg └── 相关api业务sql脚本.sql └── vue总结 ├── 01.MVVM思想图.png ├── 02.Vue中体现MVVM思想的代码写法.png ├── 04vuex模型.png ├── 05vue.png ├── 06.img中有关v-bind的说明.png ├── 06vue.png ├── 07.v-model实现数据的双向绑定.png ├── 07eventbus.png ├── 09.路由的跳转.png ├── Vue实例的全局配置.md ├── Vue实例详解与生命周期.md ├── Vue指令介绍.md ├── Vue模块通讯.md ├── Vue简介.md ├── Vue组件化开发.md ├── Vue脚手架工具.md ├── Vue路由详解.md ├── lifecycle-标注版本.png ├── vue-resource.md └── 过滤器.md /README.md: -------------------------------------------------------------------------------- 1 | # vue_cms 2 | dtcmsdb4.sql :是 mysql数据库的脚本 数据库设置图片在后台文件夹的图片中 3 | 4 | # 步骤 5 | ## 服务器端配置 6 | ``` 7 | npm install 8 | node app.js 启动express服务器 ,启动之前请先安装mysql数据服务和利用dtcmsdb4.sql 建立一个dtcmsdb4的数据库 9 | 在MYSQL运行dtcmsdb4.sql 10 | 双击src目录下的 start.bat 开启项目后台服务 11 | 该项目后台基于node开发 运行项目需node环境 12 | ``` 13 | ## 前端项目配置 14 | 15 | ``` 16 | npm install 17 | cd 客户端根目录 18 | npm run dev 19 | 开启项目 20 | ``` 21 | 22 | 该项目客户端为运用Vue组件化开发 应页面不多采用Bus通讯 未采用Vuex 适合入门参考 23 | 24 | -------------------------------------------------------------------------------- /item-cms/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-2" 5 | ], 6 | "plugins": ["transform-runtime"], 7 | "comments": false, 8 | "env": { 9 | "test": { 10 | "presets": ["env", "stage-2"], 11 | "plugins": [ "istanbul" ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /item-cms/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /item-cms/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | -------------------------------------------------------------------------------- /item-cms/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserlist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /item-cms/README.md: -------------------------------------------------------------------------------- 1 | # vue-cms 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /item-cms/build/build.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | process.env.NODE_ENV = 'production' 4 | 5 | var ora = require('ora') 6 | var rm = require('rimraf') 7 | var path = require('path') 8 | var chalk = require('chalk') 9 | var webpack = require('webpack') 10 | var config = require('../config') 11 | var webpackConfig = require('./webpack.prod.conf') 12 | 13 | var spinner = ora('building for production...') 14 | spinner.start() 15 | 16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 17 | if (err) throw err 18 | webpack(webpackConfig, function (err, stats) { 19 | spinner.stop() 20 | if (err) throw err 21 | process.stdout.write(stats.toString({ 22 | colors: true, 23 | modules: false, 24 | children: false, 25 | chunks: false, 26 | chunkModules: false 27 | }) + '\n\n') 28 | 29 | console.log(chalk.cyan(' Build complete.\n')) 30 | console.log(chalk.yellow( 31 | ' Tip: built files are meant to be served over an HTTP server.\n' + 32 | ' Opening index.html over file:// won\'t work.\n' 33 | )) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /item-cms/build/check-versions.js: -------------------------------------------------------------------------------- 1 | var chalk = require('chalk') 2 | var semver = require('semver') 3 | var packageConfig = require('../package.json') 4 | 5 | function exec (cmd) { 6 | return require('child_process').execSync(cmd).toString().trim() 7 | } 8 | 9 | var versionRequirements = [ 10 | { 11 | name: 'node', 12 | currentVersion: semver.clean(process.version), 13 | versionRequirement: packageConfig.engines.node 14 | }, 15 | { 16 | name: 'npm', 17 | currentVersion: exec('npm --version'), 18 | versionRequirement: packageConfig.engines.npm 19 | } 20 | ] 21 | 22 | module.exports = function () { 23 | var warnings = [] 24 | for (var i = 0; i < versionRequirements.length; i++) { 25 | var mod = versionRequirements[i] 26 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 27 | warnings.push(mod.name + ': ' + 28 | chalk.red(mod.currentVersion) + ' should be ' + 29 | chalk.green(mod.versionRequirement) 30 | ) 31 | } 32 | } 33 | 34 | if (warnings.length) { 35 | console.log('') 36 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 37 | console.log() 38 | for (var i = 0; i < warnings.length; i++) { 39 | var warning = warnings[i] 40 | console.log(' ' + warning) 41 | } 42 | console.log() 43 | process.exit(1) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /item-cms/build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /item-cms/build/dev-server.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | var config = require('../config') 4 | if (!process.env.NODE_ENV) { 5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 6 | } 7 | 8 | var opn = require('opn') 9 | var path = require('path') 10 | var express = require('express') 11 | var webpack = require('webpack') 12 | var proxyMiddleware = require('http-proxy-middleware') 13 | var webpackConfig = require('./webpack.dev.conf') 14 | 15 | // default port where dev server listens for incoming traffic 16 | var port = process.env.PORT || config.dev.port 17 | // automatically open browser, if not set will be false 18 | var autoOpenBrowser = !!config.dev.autoOpenBrowser 19 | // Define HTTP proxies to your custom API backend 20 | // https://github.com/chimurai/http-proxy-middleware 21 | var proxyTable = config.dev.proxyTable 22 | 23 | var app = express() 24 | var compiler = webpack(webpackConfig) 25 | 26 | var devMiddleware = require('webpack-dev-middleware')(compiler, { 27 | publicPath: webpackConfig.output.publicPath, 28 | quiet: true 29 | }) 30 | 31 | var hotMiddleware = require('webpack-hot-middleware')(compiler, { 32 | log: () => {} 33 | }) 34 | // force page reload when html-webpack-plugin template changes 35 | compiler.plugin('compilation', function (compilation) { 36 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 37 | hotMiddleware.publish({ action: 'reload' }) 38 | cb() 39 | }) 40 | }) 41 | 42 | // proxy api requests 43 | Object.keys(proxyTable).forEach(function (context) { 44 | var options = proxyTable[context] 45 | if (typeof options === 'string') { 46 | options = { target: options } 47 | } 48 | app.use(proxyMiddleware(options.filter || context, options)) 49 | }) 50 | 51 | // handle fallback for HTML5 history API 52 | app.use(require('connect-history-api-fallback')()) 53 | 54 | // serve webpack bundle output 55 | app.use(devMiddleware) 56 | 57 | // enable hot-reload and state-preserving 58 | // compilation error display 59 | app.use(hotMiddleware) 60 | 61 | // serve pure static assets 62 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 63 | app.use(staticPath, express.static('./static')) 64 | 65 | var uri = 'http://localhost:' + port 66 | 67 | var _resolve 68 | var readyPromise = new Promise(resolve => { 69 | _resolve = resolve 70 | }) 71 | 72 | console.log('> Starting dev server...') 73 | devMiddleware.waitUntilValid(() => { 74 | console.log('> Listening at ' + uri + '\n') 75 | // when env is testing, don't need open it 76 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { 77 | opn(uri) 78 | } 79 | _resolve() 80 | }) 81 | 82 | var server = app.listen(port) 83 | 84 | module.exports = { 85 | ready: readyPromise, 86 | close: () => { 87 | server.close() 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /item-cms/build/utils.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | exports.assetsPath = function (_path) { 6 | var assetsSubDirectory = process.env.NODE_ENV === 'production' 7 | ? config.build.assetsSubDirectory 8 | : config.dev.assetsSubDirectory 9 | return path.posix.join(assetsSubDirectory, _path) 10 | } 11 | 12 | exports.cssLoaders = function (options) { 13 | options = options || {} 14 | 15 | var cssLoader = { 16 | loader: 'css-loader', 17 | options: { 18 | minimize: process.env.NODE_ENV === 'production', 19 | sourceMap: options.sourceMap 20 | } 21 | } 22 | 23 | // generate loader string to be used with extract text plugin 24 | function generateLoaders (loader, loaderOptions) { 25 | var loaders = [cssLoader] 26 | if (loader) { 27 | loaders.push({ 28 | loader: loader + '-loader', 29 | options: Object.assign({}, loaderOptions, { 30 | sourceMap: options.sourceMap 31 | }) 32 | }) 33 | } 34 | 35 | // Extract CSS when that option is specified 36 | // (which is the case during production build) 37 | if (options.extract) { 38 | return ExtractTextPlugin.extract({ 39 | use: loaders, 40 | fallback: 'vue-style-loader' 41 | }) 42 | } else { 43 | return ['vue-style-loader'].concat(loaders) 44 | } 45 | } 46 | 47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 48 | return { 49 | css: generateLoaders(), 50 | postcss: generateLoaders(), 51 | less: generateLoaders('less'), 52 | sass: generateLoaders('sass', { indentedSyntax: true }), 53 | scss: generateLoaders('sass'), 54 | stylus: generateLoaders('stylus'), 55 | styl: generateLoaders('stylus') 56 | } 57 | } 58 | 59 | // Generate loaders for standalone style files (outside of .vue) 60 | exports.styleLoaders = function (options) { 61 | var output = [] 62 | var loaders = exports.cssLoaders(options) 63 | for (var extension in loaders) { 64 | var loader = loaders[extension] 65 | output.push({ 66 | test: new RegExp('\\.' + extension + '$'), 67 | use: loader 68 | }) 69 | } 70 | return output 71 | } 72 | -------------------------------------------------------------------------------- /item-cms/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var config = require('../config') 3 | var isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction 8 | ? config.build.productionSourceMap 9 | : config.dev.cssSourceMap, 10 | extract: isProduction 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /item-cms/build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var config = require('../config') 4 | var vueLoaderConfig = require('./vue-loader.conf') 5 | 6 | function resolve (dir) { 7 | return path.join(__dirname, '..', dir) 8 | } 9 | 10 | module.exports = { 11 | entry: { 12 | app: './src/main.js' 13 | }, 14 | output: { 15 | path: config.build.assetsRoot, 16 | filename: '[name].js', 17 | publicPath: process.env.NODE_ENV === 'production' 18 | ? config.build.assetsPublicPath 19 | : config.dev.assetsPublicPath 20 | }, 21 | resolve: { 22 | extensions: ['.js', '.vue', '.json'], 23 | alias: { 24 | 'vue$': 'vue/dist/vue.esm.js', 25 | '@': resolve('src') 26 | } 27 | }, 28 | module: { 29 | rules: [ 30 | { 31 | test: /\.vue$/, 32 | loader: 'vue-loader', 33 | options: vueLoaderConfig 34 | }, 35 | { 36 | test: /\.js$/, 37 | loader: 'babel-loader', 38 | include: [resolve('src'), resolve('test')] 39 | }, 40 | { 41 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 42 | loader: 'url-loader', 43 | options: { 44 | limit: 10000, 45 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 46 | } 47 | }, 48 | { 49 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 50 | loader: 'url-loader', 51 | options: { 52 | limit: 10000, 53 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 54 | } 55 | } 56 | ] 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /item-cms/build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var webpack = require('webpack') 3 | var config = require('../config') 4 | var merge = require('webpack-merge') 5 | var baseWebpackConfig = require('./webpack.base.conf') 6 | var HtmlWebpackPlugin = require('html-webpack-plugin') 7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 8 | 9 | // add hot-reload related code to entry chunks 10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 12 | }) 13 | 14 | module.exports = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 17 | }, 18 | // cheap-module-eval-source-map is faster for development 19 | devtool: '#cheap-module-eval-source-map', 20 | plugins: [ 21 | new webpack.DefinePlugin({ 22 | 'process.env': config.dev.env 23 | }), 24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 25 | new webpack.HotModuleReplacementPlugin(), 26 | new webpack.NoEmitOnErrorsPlugin(), 27 | // https://github.com/ampedandwired/html-webpack-plugin 28 | new HtmlWebpackPlugin({ 29 | filename: 'index.html', 30 | template: 'index.html', 31 | inject: true 32 | }), 33 | new FriendlyErrorsPlugin() 34 | ] 35 | }) 36 | -------------------------------------------------------------------------------- /item-cms/build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var webpack = require('webpack') 4 | var config = require('../config') 5 | var merge = require('webpack-merge') 6 | var baseWebpackConfig = require('./webpack.base.conf') 7 | var CopyWebpackPlugin = require('copy-webpack-plugin') 8 | var HtmlWebpackPlugin = require('html-webpack-plugin') 9 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 11 | 12 | var env = config.build.env 13 | 14 | var webpackConfig = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ 17 | sourceMap: config.build.productionSourceMap, 18 | extract: true 19 | }) 20 | }, 21 | devtool: config.build.productionSourceMap ? '#source-map' : false, 22 | output: { 23 | path: config.build.assetsRoot, 24 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 25 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 26 | }, 27 | plugins: [ 28 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 29 | new webpack.DefinePlugin({ 30 | 'process.env': env 31 | }), 32 | new webpack.optimize.UglifyJsPlugin({ 33 | compress: { 34 | warnings: false 35 | }, 36 | sourceMap: true 37 | }), 38 | // extract css into its own file 39 | new ExtractTextPlugin({ 40 | filename: utils.assetsPath('css/[name].[contenthash].css') 41 | }), 42 | // Compress extracted CSS. We are using this plugin so that possible 43 | // duplicated CSS from different components can be deduped. 44 | new OptimizeCSSPlugin({ 45 | cssProcessorOptions: { 46 | safe: true 47 | } 48 | }), 49 | // generate dist index.html with correct asset hash for caching. 50 | // you can customize output by editing /index.html 51 | // see https://github.com/ampedandwired/html-webpack-plugin 52 | new HtmlWebpackPlugin({ 53 | filename: config.build.index, 54 | template: 'index.html', 55 | inject: true, 56 | minify: { 57 | removeComments: true, 58 | collapseWhitespace: true, 59 | removeAttributeQuotes: true 60 | // more options: 61 | // https://github.com/kangax/html-minifier#options-quick-reference 62 | }, 63 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 64 | chunksSortMode: 'dependency' 65 | }), 66 | // split vendor js into its own file 67 | new webpack.optimize.CommonsChunkPlugin({ 68 | name: 'vendor', 69 | minChunks: function (module, count) { 70 | // any required modules inside node_modules are extracted to vendor 71 | return ( 72 | module.resource && 73 | /\.js$/.test(module.resource) && 74 | module.resource.indexOf( 75 | path.join(__dirname, '../node_modules') 76 | ) === 0 77 | ) 78 | } 79 | }), 80 | // extract webpack runtime and module manifest to its own file in order to 81 | // prevent vendor hash from being updated whenever app bundle is updated 82 | new webpack.optimize.CommonsChunkPlugin({ 83 | name: 'manifest', 84 | chunks: ['vendor'] 85 | }), 86 | // copy custom static assets 87 | new CopyWebpackPlugin([ 88 | { 89 | from: path.resolve(__dirname, '../static'), 90 | to: config.build.assetsSubDirectory, 91 | ignore: ['.*'] 92 | } 93 | ]) 94 | ] 95 | }) 96 | 97 | if (config.build.productionGzip) { 98 | var CompressionWebpackPlugin = require('compression-webpack-plugin') 99 | 100 | webpackConfig.plugins.push( 101 | new CompressionWebpackPlugin({ 102 | asset: '[path].gz[query]', 103 | algorithm: 'gzip', 104 | test: new RegExp( 105 | '\\.(' + 106 | config.build.productionGzipExtensions.join('|') + 107 | ')$' 108 | ), 109 | threshold: 10240, 110 | minRatio: 0.8 111 | }) 112 | ) 113 | } 114 | 115 | if (config.build.bundleAnalyzerReport) { 116 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 117 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 118 | } 119 | 120 | module.exports = webpackConfig 121 | -------------------------------------------------------------------------------- /item-cms/config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /item-cms/config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../dist/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../dist'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '/', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'], 18 | // Run the build command with an extra argument to 19 | // View the bundle analyzer report after build finishes: 20 | // `npm run build --report` 21 | // Set to `true` or `false` to always turn it on or off 22 | bundleAnalyzerReport: process.env.npm_config_report 23 | }, 24 | dev: { 25 | env: require('./dev.env'), 26 | port: 8080, 27 | autoOpenBrowser: true, 28 | assetsSubDirectory: 'static', 29 | assetsPublicPath: '/', 30 | proxyTable: {}, 31 | // CSS Sourcemaps off by default because relative paths are "buggy" 32 | // with this option, according to the CSS-Loader README 33 | // (https://github.com/webpack/css-loader#sourcemaps) 34 | // In our experience, they generally work as expected, 35 | // just be aware of this issue when enabling this option. 36 | cssSourceMap: false 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /item-cms/config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /item-cms/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | item-cms 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /item-cms/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-cms", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "WYF <122083657@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "build": "node build/build.js" 10 | }, 11 | "dependencies": { 12 | "mint-ui": "^2.2.1", 13 | "moment": "^2.18.1", 14 | "vue": "^2.2.2", 15 | "vue-preview": "^1.0.5", 16 | "vue-resource": "^1.2.1", 17 | "vue-router": "^2.2.0" 18 | }, 19 | "devDependencies": { 20 | "autoprefixer": "^6.7.2", 21 | "babel-core": "^6.22.1", 22 | "babel-loader": "^6.2.10", 23 | "babel-plugin-transform-runtime": "^6.22.0", 24 | "babel-preset-env": "^1.2.1", 25 | "babel-preset-stage-2": "^6.22.0", 26 | "babel-register": "^6.22.0", 27 | "chalk": "^1.1.3", 28 | "connect-history-api-fallback": "^1.3.0", 29 | "copy-webpack-plugin": "^4.0.1", 30 | "css-loader": "^0.26.1", 31 | "eventsource-polyfill": "^0.9.6", 32 | "express": "^4.14.1", 33 | "extract-text-webpack-plugin": "^2.0.0", 34 | "file-loader": "^0.10.0", 35 | "friendly-errors-webpack-plugin": "^1.1.3", 36 | "function-bind": "^1.1.0", 37 | "html-webpack-plugin": "^2.28.0", 38 | "http-proxy-middleware": "^0.17.3", 39 | "webpack-bundle-analyzer": "^2.2.1", 40 | "semver": "^5.3.0", 41 | "opn": "^4.0.2", 42 | "optimize-css-assets-webpack-plugin": "^1.3.0", 43 | "ora": "^1.1.0", 44 | "rimraf": "^2.6.0", 45 | "url-loader": "^0.5.7", 46 | "vue-loader": "^11.1.4", 47 | "vue-style-loader": "^2.0.0", 48 | "vue-template-compiler": "^2.2.4", 49 | "webpack": "^2.2.1", 50 | "webpack-dev-middleware": "^1.10.0", 51 | "webpack-hot-middleware": "^2.16.1", 52 | "webpack-merge": "^2.6.1" 53 | }, 54 | "engines": { 55 | "node": ">= 4.0.0", 56 | "npm": ">= 3.0.0" 57 | }, 58 | "browserslist": [ 59 | "> 1%", 60 | "last 2 versions", 61 | "not ie <= 8" 62 | ] 63 | } 64 | -------------------------------------------------------------------------------- /item-cms/src/App.vue: -------------------------------------------------------------------------------- 1 | 38 | 49 | 84 | -------------------------------------------------------------------------------- /item-cms/src/components/childConponent/CarouselImage.vue: -------------------------------------------------------------------------------- 1 | 14 | 25 | -------------------------------------------------------------------------------- /item-cms/src/components/childConponent/comment.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 94 | 95 | -------------------------------------------------------------------------------- /item-cms/src/components/childConponent/subAdd.vue: -------------------------------------------------------------------------------- 1 | 10 | 29 | 49 | -------------------------------------------------------------------------------- /item-cms/src/components/goods/goodscomment.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | -------------------------------------------------------------------------------- /item-cms/src/components/goods/goodsdocs.vue: -------------------------------------------------------------------------------- 1 | 11 | 27 | 47 | -------------------------------------------------------------------------------- /item-cms/src/components/goods/goodsinfo.vue: -------------------------------------------------------------------------------- 1 | 46 | 93 | 149 | -------------------------------------------------------------------------------- /item-cms/src/components/goods/goodslist.vue: -------------------------------------------------------------------------------- 1 | 29 | 104 | 123 | -------------------------------------------------------------------------------- /item-cms/src/components/home/home.vue: -------------------------------------------------------------------------------- 1 | 17 | 43 | -------------------------------------------------------------------------------- /item-cms/src/components/news/newsInfo.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 31 | 32 | -------------------------------------------------------------------------------- /item-cms/src/components/news/newsList.vue: -------------------------------------------------------------------------------- 1 | 2 | 24 | 25 | 47 | -------------------------------------------------------------------------------- /item-cms/src/components/photo/photoinfo.vue: -------------------------------------------------------------------------------- 1 | 24 | 52 | 88 | -------------------------------------------------------------------------------- /item-cms/src/components/photo/photolist.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 81 | -------------------------------------------------------------------------------- /item-cms/src/components/shopcart/shopcartlist.vue: -------------------------------------------------------------------------------- 1 | 35 | 81 | 153 | -------------------------------------------------------------------------------- /item-cms/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import router from './router' 3 | import App from './App' 4 | //通讯模块 5 | import Http from './resource/Http.js' 6 | //mint ui 7 | import mintUi from 'mint-ui' 8 | import "../node_modules/mint-ui/lib/style.min.css" 9 | Vue.use(mintUi) 10 | //略缩图 11 | import VuePreview from 'vue-preview' 12 | Vue.use(VuePreview) 13 | //日历框架 14 | import moment from 'moment' 15 | //mui 16 | import "../static/mui/css/mui.min.css" 17 | import "../static/mui/css/icons-extra.css" 18 | //自定义css 19 | import "../static/css/public.css" 20 | //时间格式过滤器 21 | Vue.filter("timeFilter", (input, str = "YYYY-MM-DD") => { 22 | return moment(input).format(str); 23 | }) 24 | Vue.config.productionTip = false 25 | new Vue({ 26 | el: '#app', 27 | router, 28 | render: c => c(App) 29 | }) -------------------------------------------------------------------------------- /item-cms/src/resource/Http.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import resource from 'vue-resource' 3 | Vue.use(resource) 4 | const host = "http://webhm.top:8899/" 5 | Vue.prototype.getDataGet = function(url, callback) { 6 | this.$http.get(host + url).then(res => { 7 | callback(res.body) 8 | }, err => { 9 | console.log(err) 10 | }) 11 | } 12 | Vue.prototype.getDataPsst = function(url, data, callback) { 13 | this.$http.post(host + url, data, { emulateJSON: true }).then(res => { 14 | callback(res.body) 15 | }, err => { 16 | console.log(err) 17 | }) 18 | } -------------------------------------------------------------------------------- /item-cms/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | //roter 4 | import home from './components/home/home.vue' 5 | import newslist from './components/news/newsList.vue' 6 | import newslnfo from './components/news/newsInfo.vue' 7 | import photolist from './components/photo/photolist.vue' 8 | import photoinfo from './components/photo/photoinfo.vue' 9 | import goodslist from './components/goods/goodslist.vue' 10 | import goodsinfo from './components/goods/goodsinfo.vue' 11 | import goodscomment from './components/goods/goodscomment.vue' 12 | import goodsdocs from './components/goods/goodsdocs.vue' 13 | import shopCartlist from './components/shopcart/shopcartlist.vue' 14 | 15 | Vue.use(Router) 16 | 17 | export default new Router({ 18 | mode: 'history', 19 | routes: [ 20 | { path: "/", redirect: "home" }, 21 | { name: "home", path: "/home", component: home }, 22 | { name: "newslist", path: "/news/list", component: newslist }, 23 | { name: "newslnfo", path: "/news/info/:infoid", component: newslnfo }, 24 | { name: "photolist", path: "/photo/list", component: photolist }, 25 | { name: "photoinfo", path: "/photo/info/:infoid", component: photoinfo }, 26 | { name: "goodslist", path: "/goods/list", component: goodslist }, 27 | { name: "goodsinfo", path: "/goods/info/:infoid", component: goodsinfo }, 28 | { name: "goodscomment", path: "/goods/comment", component: goodscomment }, 29 | { name: "goodsdocs", path: "/goods/desc", component: goodsdocs }, 30 | { name: "shopCartlist", path: "/shopCart", component: shopCartlist }, 31 | ], 32 | scrollBehavior: (to, from, savedPosition) => { 33 | if (savedPosition) { 34 | console.log(savedPosition) 35 | return savedPosition 36 | } else { 37 | return { x: 0, y: 0 } 38 | } 39 | } 40 | }) -------------------------------------------------------------------------------- /item-cms/src/tools/bus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | export const bus = new Vue(); -------------------------------------------------------------------------------- /item-cms/src/tools/data.js: -------------------------------------------------------------------------------- 1 | export default { 2 | homeIcon: [{ 3 | name: "新闻资讯", 4 | router: "/news/list", 5 | class: "news" 6 | }, { 7 | name: "图片分享", 8 | router: "/photo/list", 9 | class: "mpan" 10 | }, { 11 | name: "购物商城", 12 | router: "/goods/list", 13 | class: "news" 14 | }, { 15 | name: "新闻资讯", 16 | router: "/newsList", 17 | class: "news" 18 | }, { 19 | name: "新闻资讯", 20 | router: "/newsList", 21 | class: "news" 22 | }, { 23 | name: "新闻资讯", 24 | router: "/newsList", 25 | class: "news" 26 | }] 27 | } -------------------------------------------------------------------------------- /item-cms/src/tools/shopModel.js: -------------------------------------------------------------------------------- 1 | const key = "goods"; 2 | export const saveShopData = (ShopObj) => { 3 | var savedata = JSON.parse(localStorage.getItem(key) || "[]") 4 | var tmp = true 5 | for (let i = 0; i < savedata.length; i++) { 6 | if (savedata[i].goodsId == ShopObj.goodsId) { 7 | savedata[i].count += ShopObj.count 8 | tmp = false 9 | break 10 | } 11 | } 12 | tmp && savedata.push(ShopObj) 13 | localStorage.setItem(key, JSON.stringify(savedata)) 14 | } 15 | export const getShopNumber = () => { 16 | var sum = 0 17 | var savedata = JSON.parse(localStorage.getItem(key) || "[]") 18 | for (let i = 0; i < savedata.length; i++) { 19 | sum += savedata[i].count 20 | } 21 | return sum 22 | } 23 | export const tmpData = function() { 24 | var item = arguments[0] 25 | if (typeof item == "string") { 26 | return sessionStorage.getItem(item) 27 | } else if (typeof item == "object") { 28 | sessionStorage.setItem(item.key, item.data) 29 | } 30 | } 31 | 32 | export const getShop = (key) => { 33 | return JSON.parse(localStorage.getItem(key)) 34 | } 35 | export const setShop = (data) => { 36 | localStorage.setItem(key, JSON.stringify(data)) 37 | } -------------------------------------------------------------------------------- /item-cms/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/.gitkeep -------------------------------------------------------------------------------- /item-cms/static/css/public.css: -------------------------------------------------------------------------------- 1 | .publicHeader { 2 | margin-top: 40px; 3 | margin-bottom: 50px; 4 | } 5 | 6 | body { 7 | background-color: #fff; 8 | } -------------------------------------------------------------------------------- /item-cms/static/images/menu10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu10.png -------------------------------------------------------------------------------- /item-cms/static/images/menu3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu3.png -------------------------------------------------------------------------------- /item-cms/static/images/menu4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu4.png -------------------------------------------------------------------------------- /item-cms/static/images/menu5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu5.png -------------------------------------------------------------------------------- /item-cms/static/images/menu6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu6.png -------------------------------------------------------------------------------- /item-cms/static/images/menu9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/images/menu9.png -------------------------------------------------------------------------------- /item-cms/static/mui/css/icons-extra.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: MuiiconSpread; 3 | font-weight: normal; 4 | font-style: normal; 5 | src: url('../fonts/mui-icons-extra.ttf') format('truetype'); /* iOS 4.1- */ 6 | } 7 | .mui-icon-extra 8 | { 9 | font-family: MuiiconSpread; 10 | font-size: 24px; 11 | font-weight: normal; 12 | font-style: normal; 13 | line-height: 1; 14 | display: inline-block; 15 | text-decoration: none; 16 | -webkit-font-smoothing: antialiased; 17 | } 18 | .mui-icon-extra-cold:before { content: "\e500"; } 19 | .mui-icon-extra-share:before { content: "\e200"; } 20 | .mui-icon-extra-class:before { content: "\e118"; } 21 | .mui-icon-extra-custom:before { content: "\e117"; } 22 | .mui-icon-extra-new:before { content: "\e103"; } 23 | .mui-icon-extra-card:before { content: "\e104"; } 24 | .mui-icon-extra-grech:before { content: "\e105"; } 25 | .mui-icon-extra-trend:before { content: "\e106"; } 26 | .mui-icon-extra-filter:before { content: "\e207"; } 27 | .mui-icon-extra-holiday:before { content: "\e300"; } 28 | .mui-icon-extra-cart:before { content: "\e107"; } 29 | .mui-icon-extra-heart:before { content: "\e180"; } 30 | .mui-icon-extra-computer:before { content: "\e600"; } 31 | .mui-icon-extra-express:before { content: "\e108"; } 32 | .mui-icon-extra-gift:before { content: "\e109"; } 33 | .mui-icon-extra-gold:before { content: "\e102"; } 34 | .mui-icon-extra-lamp:before { content: "\e601"; } 35 | .mui-icon-extra-rank:before { content: "\e110"; } 36 | .mui-icon-extra-notice:before { content: "\e111"; } 37 | .mui-icon-extra-sweep:before { content: "\e202"; } 38 | .mui-icon-extra-arrowleftcricle:before { content: "\e401"; } 39 | .mui-icon-extra-dictionary:before { content: "\e602"; } 40 | .mui-icon-extra-heart-filled:before { content: "\e119"; } 41 | .mui-icon-extra-xiaoshuo:before { content: "\e607"; } 42 | .mui-icon-extra-top:before { content: "\e403"; } 43 | .mui-icon-extra-people:before { content: "\e203"; } 44 | .mui-icon-extra-topic:before { content: "\e603"; } 45 | .mui-icon-extra-hotel:before { content: "\e301"; } 46 | .mui-icon-extra-like:before { content: "\e206"; } 47 | .mui-icon-extra-regist:before { content: "\e201"; } 48 | .mui-icon-extra-order:before { content: "\e113"; } 49 | .mui-icon-extra-alipay:before { content: "\e114"; } 50 | .mui-icon-extra-find:before { content: "\e400"; } 51 | .mui-icon-extra-arrowrightcricle:before { content: "\e402"; } 52 | .mui-icon-extra-calendar:before { content: "\e115"; } 53 | .mui-icon-extra-prech:before { content: "\e116"; } 54 | .mui-icon-extra-cate:before { content: "\e501"; } 55 | .mui-icon-extra-comment:before { content: "\e209"; } 56 | .mui-icon-extra-at:before { content: "\e208"; } 57 | .mui-icon-extra-addpeople:before { content: "\e204"; } 58 | .mui-icon-extra-peoples:before { content: "\e205"; } 59 | .mui-icon-extra-calc:before { content: "\e101"; } 60 | .mui-icon-extra-classroom:before { content: "\e604"; } 61 | .mui-icon-extra-phone:before { content: "\e404"; } 62 | .mui-icon-extra-university:before { content: "\e605"; } 63 | .mui-icon-extra-outline:before { content: "\e606"; } 64 | -------------------------------------------------------------------------------- /item-cms/static/mui/css/mui.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Mui v3.5.0 (http://dev.dcloud.net.cn/mui) 4 | * ===================================================== 5 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{font:inherit;margin:0;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}*{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;outline:0;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}body{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;line-height:21px;color:#000;background-color:#efeff4;-webkit-overflow-scrolling:touch}a{text-decoration:none;color:#007aff}a:active{color:#0062cc}.mui-content{background-color:#efeff4;-webkit-overflow-scrolling:touch}.mui-bar-nav~.mui-content{padding-top:44px}.mui-bar-nav~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:44px}.mui-bar-header-secondary~.mui-content{padding-top:88px}.mui-bar-header-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:88px}.mui-bar-footer~.mui-content{padding-bottom:44px}.mui-bar-footer~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:44px}.mui-bar-footer-secondary~.mui-content{padding-bottom:88px}.mui-bar-footer-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:88px}.mui-bar-tab~.mui-content{padding-bottom:50px}.mui-bar-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:50px}.mui-bar-footer-secondary-tab~.mui-content{padding-bottom:94px}.mui-bar-footer-secondary-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:94px}.mui-content-padded{margin:10px}.mui-inline{display:inline-block;vertical-align:top}.mui-block{display:block!important}.mui-visibility{visibility:visible!important}.mui-hidden{display:none!important}.mui-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mui-ellipsis-2{display:-webkit-box;overflow:hidden;white-space:normal!important;text-overflow:ellipsis;word-wrap:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.mui-table{display:table;width:100%;table-layout:fixed}.mui-table-cell{position:relative;display:table-cell}.mui-text-left{text-align:left!important}.mui-text-center{text-align:center!important}.mui-text-justify{text-align:justify!important}.mui-text-right{text-align:right!important}.mui-pull-left{float:left}.mui-pull-right{float:right}.mui-list-unstyled{padding-left:0;list-style:none}.mui-list-inline{margin-left:-5px;padding-left:0;list-style:none}.mui-list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.mui-clearfix:after,.mui-clearfix:before{display:table;content:' '}.mui-clearfix:after{clear:both}.mui-bg-primary{background-color:#007aff}.mui-bg-positive{background-color:#4cd964}.mui-bg-negative{background-color:#dd524d}.mui-error{margin:88px 35px;padding:10px;border-radius:6px;background-color:#bbb}.mui-subtitle{font-size:15px}h1,h2,h3,h4,h5,h6{line-height:1;margin-top:5px;margin-bottom:5px}.mui-h1,h1{font-size:36px}.mui-h2,h2{font-size:30px}.mui-h3,h3{font-size:24px}.mui-h4,h4{font-size:18px}.mui-h5,h5{font-size:14px;font-weight:400;color:#8f8f94}.mui-h6,h6{font-size:12px;font-weight:400;color:#8f8f94}p{font-size:14px;margin-top:0;margin-bottom:10px;color:#8f8f94}.mui-row:after,.mui-row:before{display:table;content:' '}.mui-row:after{clear:both}.mui-col-sm-1,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9,.mui-col-xs-1,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9{position:relative;min-height:1px}.mui-row>[class*=mui-col-]{float:left}.mui-col-xs-12{width:100%}.mui-col-xs-11{width:91.66666667%}.mui-col-xs-10{width:83.33333333%}.mui-col-xs-9{width:75%}.mui-col-xs-8{width:66.66666667%}.mui-col-xs-7{width:58.33333333%}.mui-col-xs-6{width:50%}.mui-col-xs-5{width:41.66666667%}.mui-col-xs-4{width:33.33333333%}.mui-col-xs-3{width:25%}.mui-col-xs-2{width:16.66666667%}.mui-col-xs-1{width:8.33333333%}@media (min-width:400px){.mui-col-sm-12{width:100%}.mui-col-sm-11{width:91.66666667%}.mui-col-sm-10{width:83.33333333%}.mui-col-sm-9{width:75%}.mui-col-sm-8{width:66.66666667%}.mui-col-sm-7{width:58.33333333%}.mui-col-sm-6{width:50%}.mui-col-sm-5{width:41.66666667%}.mui-col-sm-4{width:33.33333333%}.mui-col-sm-3{width:25%}.mui-col-sm-2{width:16.66666667%}.mui-col-sm-1{width:8.33333333%}}.mui-scroll-wrapper{position:absolute;z-index:2;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-scroll{position:absolute;z-index:1;width:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}.mui-scrollbar{position:absolute;z-index:9998;overflow:hidden;-webkit-transition:500ms;transition:500ms;transform:translateZ(0px);pointer-events:none;opacity:0}.mui-scrollbar-vertical{top:0;right:1px;bottom:2px;width:4px}.mui-scrollbar-vertical .mui-scrollbar-indicator{width:100%}.mui-scrollbar-horizontal{right:2px;bottom:0;left:2px;height:4px}.mui-scrollbar-horizontal .mui-scrollbar-indicator{height:100%}.mui-scrollbar-indicator{position:absolute;display:block;box-sizing:border-box;-webkit-transition:.01s cubic-bezier(.1,.57,.1,1);transition:.01s cubic-bezier(.1,.57,.1,1);transform:translate(0px,0) translateZ(0px);border:1px solid rgba(255,255,255,.80196);border-radius:2px;background:rgba(0,0,0,.39804)}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll-wrapper{position:absolute;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll{position:absolute;width:100%}.mui-plus-pullrefresh .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-slider-group{position:static;top:auto;bottom:auto;left:auto;overflow:auto;width:auto}.mui-plus-pullrefresh .mui-slider-group{overflow:visible}.mui-plus-pullrefresh .mui-scroll{position:static;width:auto}.mui-off-canvas-wrap .mui-bar{position:absolute!important;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-box-shadow:none;box-shadow:none}.mui-off-canvas-wrap{position:relative;z-index:1;overflow:hidden;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap{position:relative;z-index:1;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap.mui-transitioning{-webkit-transition:-webkit-transform 350ms;transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-active{overflow:hidden;height:100%}.mui-off-canvas-wrap.mui-active .mui-off-canvas-backdrop{position:absolute;z-index:998;top:0;right:0;bottom:0;left:0;display:block;transition:background 350ms cubic-bezier(.165,.84,.44,1);background:rgba(0,0,0,.4);box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);-webkit-tap-highlight-color:transparent}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-right{z-index:10000!important;-webkit-transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-left{z-index:10000!important;-webkit-transform:translate3d(-100%,0,0)}.mui-off-canvas-left,.mui-off-canvas-right{position:absolute;z-index:-1;top:0;bottom:0;visibility:hidden;box-sizing:content-box;width:70%;min-height:100%;background:#333;-webkit-overflow-scrolling:touch}.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-left{left:0}.mui-off-canvas-right{right:0}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable{background-color:#333}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{width:80%;-webkit-transform:scale(.8);transform:scale(.8);opacity:.1}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left{-webkit-transform-origin:-100%;transform-origin:-100%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{-webkit-transform-origin:200%;transform-origin:200%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-inner-wrap{-webkit-transform:scale(.8);transform:scale(.8)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-right{-webkit-transform:scale(1);transform:scale(1);opacity:1}.mui-loading .mui-spinner{display:block;margin:0 auto}.mui-spinner{display:inline-block;width:24px;height:24px;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:spinner-spin 1s step-end infinite;animation:spinner-spin 1s step-end infinite}.mui-spinner:after{display:block;width:100%;height:100%;content:'';background-image:url('data:image/svg+xml;charset=utf-8,');background-repeat:no-repeat;background-position:50%;background-size:100%}.mui-spinner-white:after{background-image:url('data:image/svg+xml;charset=utf-8,')}@-webkit-keyframes spinner-spin{0%{-webkit-transform:rotate(0deg)}8.33333333%{-webkit-transform:rotate(30deg)}16.66666667%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.33333333%{-webkit-transform:rotate(120deg)}41.66666667%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.33333333%{-webkit-transform:rotate(210deg)}66.66666667%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.33333333%{-webkit-transform:rotate(300deg)}91.66666667%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes spinner-spin{0%{transform:rotate(0deg)}8.33333333%{transform:rotate(30deg)}16.66666667%{transform:rotate(60deg)}25%{transform:rotate(90deg)}33.33333333%{transform:rotate(120deg)}41.66666667%{transform:rotate(150deg)}50%{transform:rotate(180deg)}58.33333333%{transform:rotate(210deg)}66.66666667%{transform:rotate(240deg)}75%{transform:rotate(270deg)}83.33333333%{transform:rotate(300deg)}91.66666667%{transform:rotate(330deg)}100%{transform:rotate(360deg)}}.mui-btn,button,input[type=button],input[type=reset],input[type=submit]{font-size:14px;font-weight:400;line-height:1.42;position:relative;display:inline-block;margin-bottom:0;padding:6px 12px;cursor:pointer;-webkit-transition:all;transition:all;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:.2s;transition-duration:.2s;text-align:center;vertical-align:top;white-space:nowrap;color:#333;border:1px solid #ccc;border-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;background-color:#fff;background-clip:padding-box}.mui-btn.mui-active:enabled,.mui-btn:enabled:active,button.mui-active:enabled,button:enabled:active,input[type=button].mui-active:enabled,input[type=button]:enabled:active,input[type=reset].mui-active:enabled,input[type=reset]:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;background-color:#929292}.mui-btn.mui-disabled,.mui-btn:disabled,button.mui-disabled,button:disabled,input[type=button].mui-disabled,input[type=button]:disabled,input[type=reset].mui-disabled,input[type=reset]:disabled,input[type=submit].mui-disabled,input[type=submit]:disabled{opacity:.6}.mui-btn-blue,.mui-btn-primary,input[type=submit]{color:#fff;border:1px solid #007aff;background-color:#007aff}.mui-btn-blue.mui-active:enabled,.mui-btn-blue:enabled:active,.mui-btn-primary.mui-active:enabled,.mui-btn-primary:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;border:1px solid #0062cc;background-color:#0062cc}.mui-btn-green,.mui-btn-positive,.mui-btn-success{color:#fff;border:1px solid #4cd964;background-color:#4cd964}.mui-btn-green.mui-active:enabled,.mui-btn-green:enabled:active,.mui-btn-positive.mui-active:enabled,.mui-btn-positive:enabled:active,.mui-btn-success.mui-active:enabled,.mui-btn-success:enabled:active{color:#fff;border:1px solid #2ac845;background-color:#2ac845}.mui-btn-warning,.mui-btn-yellow{color:#fff;border:1px solid #f0ad4e;background-color:#f0ad4e}.mui-btn-warning.mui-active:enabled,.mui-btn-warning:enabled:active,.mui-btn-yellow.mui-active:enabled,.mui-btn-yellow:enabled:active{color:#fff;border:1px solid #ec971f;background-color:#ec971f}.mui-btn-danger,.mui-btn-negative,.mui-btn-red{color:#fff;border:1px solid #dd524d;background-color:#dd524d}.mui-btn-danger.mui-active:enabled,.mui-btn-danger:enabled:active,.mui-btn-negative.mui-active:enabled,.mui-btn-negative:enabled:active,.mui-btn-red.mui-active:enabled,.mui-btn-red:enabled:active{color:#fff;border:1px solid #cf2d28;background-color:#cf2d28}.mui-btn-purple,.mui-btn-royal{color:#fff;border:1px solid #8a6de9;background-color:#8a6de9}.mui-btn-purple.mui-active:enabled,.mui-btn-purple:enabled:active,.mui-btn-royal.mui-active:enabled,.mui-btn-royal:enabled:active{color:#fff;border:1px solid #6641e2;background-color:#6641e2}.mui-btn-grey{color:#fff;border:1px solid #c7c7cc;background-color:#c7c7cc}.mui-btn-grey.mui-active:enabled,.mui-btn-grey:enabled:active{color:#fff;border:1px solid #acacb4;background-color:#acacb4}.mui-btn-outlined{background-color:transparent}.mui-btn-outlined.mui-btn-blue,.mui-btn-outlined.mui-btn-primary{color:#007aff}.mui-btn-outlined.mui-btn-green,.mui-btn-outlined.mui-btn-positive,.mui-btn-outlined.mui-btn-success{color:#4cd964}.mui-btn-outlined.mui-btn-warning,.mui-btn-outlined.mui-btn-yellow{color:#f0ad4e}.mui-btn-outlined.mui-btn-danger,.mui-btn-outlined.mui-btn-negative,.mui-btn-outlined.mui-btn-red{color:#dd524d}.mui-btn-outlined.mui-btn-purple,.mui-btn-outlined.mui-btn-royal{color:#8a6de9}.mui-btn-outlined.mui-btn-blue:enabled:active,.mui-btn-outlined.mui-btn-danger:enabled:active,.mui-btn-outlined.mui-btn-green:enabled:active,.mui-btn-outlined.mui-btn-negative:enabled:active,.mui-btn-outlined.mui-btn-positive:enabled:active,.mui-btn-outlined.mui-btn-primary:enabled:active,.mui-btn-outlined.mui-btn-purple:enabled:active,.mui-btn-outlined.mui-btn-red:enabled:active,.mui-btn-outlined.mui-btn-royal:enabled:active,.mui-btn-outlined.mui-btn-success:enabled:active,.mui-btn-outlined.mui-btn-warning:enabled:active,.mui-btn-outlined.mui-btn-yellow:enabled:active{color:#fff}.mui-btn-link{padding-top:6px;padding-bottom:6px;color:#007aff;border:0;background-color:transparent}.mui-btn-link.mui-active:enabled,.mui-btn-link:enabled:active{color:#0062cc;background-color:transparent}.mui-btn-block{font-size:18px;display:block;width:100%;margin-bottom:10px;padding:15px 0}.mui-btn .mui-badge{font-size:14px;margin:-2px -4px -2px 4px;background-color:rgba(0,0,0,.15)}.mui-btn .mui-badge-inverted,.mui-btn:enabled:active .mui-badge-inverted{background-color:transparent}.mui-btn-negative:enabled:active .mui-badge-inverted,.mui-btn-positive:enabled:active .mui-badge-inverted,.mui-btn-primary:enabled:active .mui-badge-inverted{color:#fff}.mui-btn-block .mui-badge{position:absolute;right:0;margin-right:10px}.mui-btn .mui-icon{font-size:inherit}.mui-btn.mui-icon{font-size:14px;line-height:1.42}.mui-btn.mui-fab{width:56px;height:56px;padding:16px;border-radius:50%;outline:0}.mui-btn.mui-fab.mui-btn-mini{width:40px;height:40px;padding:8px}.mui-btn.mui-fab .mui-icon{font-size:24px;line-height:24px;width:24px;height:24px}.mui-btn .mui-spinner{width:14px;height:14px;vertical-align:text-bottom}.mui-btn-block .mui-spinner{width:22px;height:22px}.mui-bar{position:fixed;z-index:10;right:0;left:0;height:44px;padding-right:10px;padding-left:10px;border-bottom:0;background-color:#f7f7f7;-webkit-box-shadow:0 0 1px rgba(0,0,0,.85);box-shadow:0 0 1px rgba(0,0,0,.85);-webkit-backface-visibility:hidden;backface-visibility:hidden}.mui-bar .mui-title{right:40px;left:40px;display:inline-block;overflow:hidden;width:auto;margin:0;text-overflow:ellipsis}.mui-bar .mui-backdrop{background:0 0}.mui-bar-header-secondary{top:44px}.mui-bar-footer{bottom:0}.mui-bar-footer-secondary{bottom:44px}.mui-bar-footer-secondary-tab{bottom:50px}.mui-bar-footer,.mui-bar-footer-secondary,.mui-bar-footer-secondary-tab{border-top:0}.mui-bar-transparent{top:0;background-color:rgba(247,247,247,0);-webkit-box-shadow:none;box-shadow:none}.mui-bar-nav{top:0;-webkit-box-shadow:0 1px 6px #ccc;box-shadow:0 1px 6px #ccc}.mui-bar-nav~.mui-content .mui-anchor{display:block;visibility:hidden;height:45px;margin-top:-45px}.mui-bar-nav.mui-bar .mui-icon{margin-right:-10px;margin-left:-10px;padding-right:10px;padding-left:10px}.mui-title{font-size:17px;font-weight:500;line-height:44px;position:absolute;display:block;width:100%;margin:0 -10px;padding:0;text-align:center;white-space:nowrap;color:#000}.mui-title a{color:inherit}.mui-bar-tab{bottom:0;display:table;width:100%;height:50px;padding:0;table-layout:fixed;border-top:0;border-bottom:0;-webkit-touch-callout:none}.mui-bar-tab .mui-tab-item{display:table-cell;overflow:hidden;width:1%;height:50px;text-align:center;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis;color:#929292}.mui-bar-tab .mui-tab-item.mui-active{color:#007aff}.mui-bar-tab .mui-tab-item .mui-icon{top:3px;width:24px;height:24px;padding-top:0;padding-bottom:0}.mui-bar-tab .mui-tab-item .mui-icon~.mui-tab-label{font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis}.mui-bar-tab .mui-tab-item .mui-icon:active{background:0 0}.mui-focusin>.mui-bar-header-secondary,.mui-focusin>.mui-bar-nav{position:absolute}.mui-focusin>.mui-bar~.mui-content{padding-bottom:0}.mui-bar .mui-btn{font-weight:400;position:relative;z-index:20;top:7px;margin-top:0;padding:6px 12px 7px}.mui-bar .mui-btn.mui-pull-right{margin-left:10px}.mui-bar .mui-btn.mui-pull-left{margin-right:10px}.mui-bar .mui-btn-link{font-size:16px;line-height:44px;top:0;padding:0;color:#007aff;border:0}.mui-bar .mui-btn-link.mui-active,.mui-bar .mui-btn-link:active{color:#0062cc}.mui-bar .mui-btn-block{font-size:16px;top:6px;margin-bottom:0;padding:5px 0}.mui-bar .mui-btn-nav.mui-pull-left{margin-left:-5px}.mui-bar .mui-btn-nav.mui-pull-left .mui-icon-left-nav{margin-right:-3px}.mui-bar .mui-btn-nav.mui-pull-right{margin-right:-5px}.mui-bar .mui-btn-nav.mui-pull-right .mui-icon-right-nav{margin-left:-3px}.mui-bar .mui-btn-nav:active{opacity:.3}.mui-bar .mui-icon{font-size:24px;position:relative;z-index:20;padding-top:10px;padding-bottom:10px}.mui-bar .mui-icon:active{opacity:.3}.mui-bar .mui-btn .mui-icon{top:1px;margin:0;padding:0}.mui-bar .mui-title .mui-icon{margin:0;padding:0}.mui-bar .mui-title .mui-icon.mui-icon-caret{top:4px;margin-left:-5px}.mui-bar input[type=search]{height:29px;margin:6px 0}.mui-bar .mui-input-row .mui-btn{padding:12px 10px}.mui-bar .mui-search:before{margin-top:-10px}.mui-bar .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:12px}.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:0}.mui-bar .mui-segmented-control{top:7px;width:auto;margin:0 auto}.mui-bar.mui-bar-header-secondary .mui-segmented-control{top:0}.mui-badge{font-size:12px;line-height:1;display:inline-block;padding:3px 6px;color:#333;border-radius:100px;background-color:rgba(0,0,0,.15)}.mui-badge.mui-badge-inverted{padding:0 5px 0 0;color:#929292;background-color:transparent}.mui-badge-blue,.mui-badge-primary{color:#fff;background-color:#007aff}.mui-badge-blue.mui-badge-inverted,.mui-badge-primary.mui-badge-inverted{color:#007aff;background-color:transparent}.mui-badge-green,.mui-badge-success{color:#fff;background-color:#4cd964}.mui-badge-green.mui-badge-inverted,.mui-badge-success.mui-badge-inverted{color:#4cd964;background-color:transparent}.mui-badge-warning,.mui-badge-yellow{color:#fff;background-color:#f0ad4e}.mui-badge-warning.mui-badge-inverted,.mui-badge-yellow.mui-badge-inverted{color:#f0ad4e;background-color:transparent}.mui-badge-danger,.mui-badge-red{color:#fff;background-color:#dd524d}.mui-badge-danger.mui-badge-inverted,.mui-badge-red.mui-badge-inverted{color:#dd524d;background-color:transparent}.mui-badge-purple,.mui-badge-royal{color:#fff;background-color:#8a6de9}.mui-badge-purple.mui-badge-inverted,.mui-badge-royal.mui-badge-inverted{color:#8a6de9;background-color:transparent}.mui-icon .mui-badge{font-size:10px;line-height:1.4;position:absolute;top:-2px;left:100%;margin-left:-10px;padding:1px 5px;color:#fff;background:red}.mui-card{font-size:14px;position:relative;overflow:hidden;margin:10px;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 1px 2px rgba(0,0,0,.3)}.mui-content>.mui-card:first-child{margin-top:15px}.mui-card .mui-input-group .mui-input-row:last-child:after,.mui-card .mui-input-group .mui-input-row:last-child:before,.mui-card .mui-input-group:after,.mui-card .mui-input-group:before{height:0}.mui-card .mui-table-view{margin-bottom:0;border-top:0;border-bottom:0;border-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:first-child,.mui-card .mui-table-view .mui-table-view-divider:first-child{top:0;border-top-left-radius:6px;border-top-right-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:last-child,.mui-card .mui-table-view .mui-table-view-divider:last-child{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.mui-card .mui-table-view:after,.mui-card .mui-table-view:before,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:after,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:before{height:0}.mui-card-footer,.mui-card-header{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;min-height:44px;padding:10px 15px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer .mui-card-link,.mui-card-header .mui-card-link{line-height:44px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;margin-top:-10px;margin-bottom:-10px;-webkit-transition-duration:.3s;transition-duration:.3s;text-decoration:none;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer:before,.mui-card-header:after{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-card-header{font-size:17px;border-radius:2px 2px 0 0}.mui-card-header:after{top:auto;bottom:0}.mui-card-header>img:first-child{font-size:0;line-height:0;float:left;width:34px;height:34px}.mui-card-footer{color:#6d6d72;border-radius:0 0 2px 2px}.mui-card-content{font-size:14px;position:relative}.mui-card-content-inner{position:relative;padding:15px}.mui-card-media{vertical-align:bottom;color:#fff;background-position:center;background-size:cover}.mui-card-header.mui-card-media{display:block;padding:10px}.mui-card-header.mui-card-media .mui-media-body{font-size:14px;font-weight:500;line-height:17px;margin-bottom:0;margin-left:44px;color:#333}.mui-card-header.mui-card-media .mui-media-body p{font-size:13px;margin-bottom:0}.mui-table-view{position:relative;margin-top:0;margin-bottom:0;padding-left:0;list-style:none;background-color:#fff}.mui-table-view:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view:before{position:absolute;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc;top:-1px}.mui-table-view-icon .mui-table-view-cell .mui-navigate-right .mui-icon{font-size:20px;margin-top:-1px;margin-right:5px;margin-left:-5px}.mui-table-view-icon .mui-table-view-cell:after{left:40px}.mui-table-view-chevron .mui-table-view-cell{padding-right:65px}.mui-table-view-chevron .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell{padding-right:65px}.mui-table-view-radio .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell .mui-navigate-right:after{font-size:30px;font-weight:600;right:9px;content:'';color:#007aff}.mui-table-view-radio .mui-table-view-cell.mui-selected .mui-navigate-right:after{content:'\e472'}.mui-table-view-inverted{color:#fff;background:#333}.mui-table-view-inverted:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell.mui-active,.mui-table-view-inverted .mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#242424}.mui-table-view-cell{position:relative;overflow:hidden;padding:11px 15px;-webkit-touch-callout:none}.mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell.mui-checkbox input[type=checkbox],.mui-table-view-cell.mui-radio input[type=radio]{top:8px}.mui-table-view-cell.mui-checkbox.mui-left,.mui-table-view-cell.mui-radio.mui-left{padding-left:58px}.mui-table-view-cell.mui-active{background-color:#eee}.mui-table-view-cell:last-child:after,.mui-table-view-cell:last-child:before{height:0}.mui-table-view-cell>a:not(.mui-btn){position:relative;display:block;overflow:hidden;margin:-11px -15px;padding:inherit;white-space:nowrap;text-overflow:ellipsis;color:inherit}.mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#eee}.mui-table-view-cell p{margin-bottom:0}.mui-table-view-cell.mui-transitioning>.mui-slider-handle,.mui-table-view-cell.mui-transitioning>.mui-slider-left .mui-btn,.mui-table-view-cell.mui-transitioning>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 300ms ease;transition:transform 300ms ease}.mui-table-view-cell.mui-active>.mui-slider-handle{background-color:#eee}.mui-table-view-cell>.mui-slider-handle{position:relative;background-color:#fff}.mui-table-view-cell>.mui-slider-handle .mui-navigate-right:after,.mui-table-view-cell>.mui-slider-handle.mui-navigate-right:after{right:0}.mui-table-view-cell>.mui-slider-handle,.mui-table-view-cell>.mui-slider-left .mui-btn,.mui-table-view-cell>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease}.mui-table-view-cell>.mui-slider-left,.mui-table-view-cell>.mui-slider-right{position:absolute;top:0;display:-webkit-box;display:-webkit-flex;display:flex;height:100%}.mui-table-view-cell>.mui-slider-left>.mui-btn,.mui-table-view-cell>.mui-slider-right>.mui-btn{position:relative;left:0;display:-webkit-box;display:-webkit-flex;display:flex;padding:0 30px;color:#fff;border:0;border-radius:0;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-table-view-cell>.mui-slider-left>.mui-btn:after,.mui-table-view-cell>.mui-slider-right>.mui-btn:after{position:absolute;z-index:-1;top:0;width:600%;height:100%;content:'';background:inherit}.mui-table-view-cell>.mui-slider-left>.mui-btn.mui-icon,.mui-table-view-cell>.mui-slider-right>.mui-btn.mui-icon{font-size:30px}.mui-table-view-cell>.mui-slider-right{right:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(100%);transform:translateX(100%)}.mui-table-view-cell>.mui-slider-left{left:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.mui-table-view-cell>.mui-slider-left>.mui-btn:after{right:100%;margin-right:-1px}.mui-table-view-divider{font-weight:500;position:relative;margin-top:-1px;margin-left:0;padding-top:6px;padding-bottom:6px;padding-left:15px;color:#999;background-color:#fafafa}.mui-table-view-divider:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-divider:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-media,.mui-table-view .mui-media-body{overflow:hidden}.mui-table-view .mui-media-large .mui-media-object{line-height:80px;max-width:80px;height:80px}.mui-table-view .mui-media .mui-subtitle{color:#000}.mui-table-view .mui-media-object{line-height:42px;max-width:42px;height:42px}.mui-table-view .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-media-object.mui-pull-right{margin-left:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object{line-height:29px;max-width:29px;height:29px;margin:-4px 0}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object img{line-height:29px;max-width:29px;height:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object .mui-icon{font-size:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-body:after{position:absolute;right:0;bottom:0;left:55px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-table-view-cell.mui-media-icon:after{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view{display:block}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:before{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-media-icon.mui-collapse .mui-media-body:after{position:absolute;right:0;bottom:0;left:70px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell>.mui-badge,.mui-table-view-cell>.mui-btn,.mui-table-view-cell>.mui-switch,.mui-table-view-cell>a>.mui-badge,.mui-table-view-cell>a>.mui-btn,.mui-table-view-cell>a>.mui-switch{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-table-view-cell .mui-navigate-right>.mui-badge,.mui-table-view-cell .mui-navigate-right>.mui-btn,.mui-table-view-cell .mui-navigate-right>.mui-switch,.mui-table-view-cell .mui-push-left>.mui-badge,.mui-table-view-cell .mui-push-left>.mui-btn,.mui-table-view-cell .mui-push-left>.mui-switch,.mui-table-view-cell .mui-push-right>.mui-badge,.mui-table-view-cell .mui-push-right>.mui-btn,.mui-table-view-cell .mui-push-right>.mui-switch,.mui-table-view-cell>a .mui-navigate-right>.mui-badge,.mui-table-view-cell>a .mui-navigate-right>.mui-btn,.mui-table-view-cell>a .mui-navigate-right>.mui-switch,.mui-table-view-cell>a .mui-push-left>.mui-badge,.mui-table-view-cell>a .mui-push-left>.mui-btn,.mui-table-view-cell>a .mui-push-left>.mui-switch,.mui-table-view-cell>a .mui-push-right>.mui-badge,.mui-table-view-cell>a .mui-push-right>.mui-btn,.mui-table-view-cell>a .mui-push-right>.mui-switch{right:35px}.mui-content>.mui-table-view:first-child{margin-top:15px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:last-child:after,.mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view-cell.mui-collapse .mui-table-view:before{height:0}.mui-table-view-cell.mui-collapse>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse>.mui-push-right:after{content:'\e581'}.mui-table-view-cell.mui-collapse.mui-active{margin-top:-1px}.mui-table-view-cell.mui-collapse.mui-active .mui-collapse-content,.mui-table-view-cell.mui-collapse.mui-active .mui-table-view{display:block}.mui-table-view-cell.mui-collapse.mui-active>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse.mui-active>.mui-push-right:after{content:'\e580'}.mui-table-view-cell.mui-collapse.mui-active .mui-table-view-cell>a:not(.mui-btn).mui-active{margin-left:-31px;padding-left:47px}.mui-table-view-cell.mui-collapse .mui-collapse-content{position:relative;display:none;overflow:hidden;margin:11px -15px -11px;padding:8px 15px;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease;background:#fff}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-input-group,.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{width:auto;height:auto;margin:-8px -15px}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{margin:-8px -16px}.mui-table-view-cell.mui-collapse .mui-table-view{display:none;margin-top:11px;margin-right:-15px;margin-bottom:-11px;margin-left:-15px;border:0}.mui-table-view-cell.mui-collapse .mui-table-view.mui-table-view-chevron{margin-right:-65px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell{padding-left:31px;background-position:31px 100%}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:30px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view.mui-grid-view{font-size:0;display:block;width:100%;padding:0 10px 10px 0;white-space:normal}.mui-table-view.mui-grid-view .mui-table-view-cell{font-size:17px;display:inline-block;margin-right:-4px;padding:10px 0 0 14px;text-align:center;vertical-align:middle;background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-object{width:100%;max-width:100%;height:auto}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn){margin:-10px 0 0 -14px}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn).mui-active,.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn):active{background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-body{font-size:15px;line-height:15px;display:block;width:100%;height:15px;margin-top:8px;text-overflow:ellipsis;color:#333}.mui-table-view.mui-grid-view .mui-table-view-cell:after,.mui-table-view.mui-grid-view .mui-table-view-cell:before{height:0}.mui-grid-view.mui-grid-9{margin:0;padding:0;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f2f2f2}.mui-grid-view.mui-grid-9:after,.mui-grid-view.mui-grid-9:before{display:table;content:' '}.mui-grid-view.mui-grid-9:after{clear:both;position:static}.mui-grid-view.mui-grid-9 .mui-table-view-cell{margin:0;padding:11px 15px;vertical-align:top;border-right:1px solid #eee;border-bottom:1px solid #eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell.mui-active{background-color:#eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell>a:not(.mui-btn){margin:0;padding:10px 0}.mui-grid-view.mui-grid-9:before{height:0}.mui-grid-view.mui-grid-9 .mui-media{color:#797979}.mui-grid-view.mui-grid-9 .mui-media .mui-icon{font-size:2.4em;position:relative}.mui-slider-cell{position:relative}.mui-slider-cell>.mui-slider-handle{z-index:1}.mui-slider-cell>.mui-slider-left,.mui-slider-cell>.mui-slider-right{position:absolute;z-index:0;top:0;bottom:0}.mui-slider-cell>.mui-slider-left{left:0}.mui-slider-cell>.mui-slider-right{right:0}input,select,textarea{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}input:focus,select:focus,textarea:focus{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-modify:read-write-plaintext-only}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{line-height:21px;width:100%;height:40px;margin-bottom:15px;padding:10px 15px;-webkit-user-select:text;border:1px solid rgba(0,0,0,.2);border-radius:3px;outline:0;background-color:#fff;-webkit-appearance:none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}input[type=search]{font-size:16px;-webkit-box-sizing:border-box;box-sizing:border-box;height:34px;text-align:center;border:0;border-radius:6px;background-color:rgba(0,0,0,.1)}input[type=search]:focus{text-align:left}textarea{height:auto;resize:none}select{font-size:14px;height:auto;margin-top:1px;border:0!important;background-color:#fff}select:focus{-webkit-user-modify:read-only}.mui-input-group{position:relative;padding:0;border:0;background-color:#fff}.mui-input-group:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group input,.mui-input-group textarea{margin-bottom:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.mui-input-group input[type=search]{background:0 0}.mui-input-group input:last-child{background-image:none}.mui-input-row{clear:left;overflow:hidden}.mui-input-row select{font-size:17px;height:37px;padding:0}.mui-input-row .mui-btn+input,.mui-input-row label+input,.mui-input-row:last-child{background:0 0}.mui-input-group .mui-input-row{height:40px}.mui-input-group .mui-input-row:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-row label{font-family:'Helvetica Neue',Helvetica,sans-serif;line-height:1.1;float:left;width:35%;padding:11px 15px}.mui-input-row label~input,.mui-input-row label~select,.mui-input-row label~textarea{float:right;width:65%;margin-bottom:0;padding-left:0;border:0}.mui-input-row .mui-btn{line-height:1.1;float:right;width:15%;padding:10px 15px}.mui-input-row .mui-btn~input,.mui-input-row .mui-btn~select,.mui-input-row .mui-btn~textarea{float:left;width:85%;margin-bottom:0;padding-left:0;border:0}.mui-button-row{position:relative;padding-top:5px;text-align:center}.mui-input-group .mui-button-row{height:45px}.mui-input-row{position:relative}.mui-input-row.mui-input-range{overflow:visible;padding-right:20px}.mui-input-row .mui-inline{padding:8px 0}.mui-input-row .mui-input-clear~.mui-icon-clear,.mui-input-row .mui-input-password~.mui-icon-eye,.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:20px;position:absolute;z-index:1;top:10px;right:0;width:38px;height:38px;text-align:center;color:#999}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-active,.mui-input-row .mui-input-password~.mui-icon-eye.mui-active,.mui-input-row .mui-input-speech~.mui-icon-speech.mui-active{color:#007aff}.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:24px;top:8px}.mui-input-row .mui-input-clear~.mui-icon-clear~.mui-icon-speech{display:none}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-hidden~.mui-icon-speech{display:inline-block}.mui-input-row .mui-icon-speech~.mui-placeholder{right:38px}.mui-input-row.mui-search .mui-icon-clear{top:7px}.mui-input-row.mui-search .mui-icon-speech{top:5px}.mui-checkbox,.mui-radio{position:relative}.mui-checkbox label,.mui-radio label{display:inline-block;float:none;width:100%;padding-right:58px}.mui-checkbox.mui-left input[type=checkbox],.mui-radio.mui-left input[type=radio]{left:20px}.mui-checkbox.mui-left label,.mui-radio.mui-left label{padding-right:15px;padding-left:58px}.mui-checkbox input[type=checkbox],.mui-radio input[type=radio]{position:absolute;top:4px;right:20px;display:inline-block;width:28px;height:26px;border:0;outline:0!important;background-color:transparent;-webkit-appearance:none}.mui-checkbox input[type=checkbox][disabled]:before,.mui-radio input[type=radio][disabled]:before{opacity:.3}.mui-checkbox input[type=checkbox]:before,.mui-radio input[type=radio]:before{font-family:Muiicons;font-size:28px;font-weight:400;line-height:1;text-decoration:none;color:#aaa;border-radius:0;background:0 0;-webkit-font-smoothing:antialiased}.mui-checkbox input[type=checkbox]:checked:before,.mui-radio input[type=radio]:checked:before{color:#007aff}.mui-checkbox label.mui-disabled,.mui-checkbox.mui-disabled label,.mui-radio label.mui-disabled,.mui-radio.mui-disabled label{opacity:.4}.mui-radio input[type=radio]:before{content:'\e411'}.mui-radio input[type=radio]:checked:before{content:'\e441'}.mui-checkbox input[type=checkbox]:before{content:'\e411'}.mui-checkbox input[type=checkbox]:checked:before{content:'\e442'}.mui-select{position:relative}.mui-select:before{font-family:Muiicons;position:absolute;top:8px;right:21px;content:'\e581';color:rgba(170,170,170,.6)}.mui-input-row .mui-switch{float:right;margin-top:5px;margin-right:20px}.mui-input-range input[type=range]{position:relative;width:100%;height:2px;margin:17px 0;padding:0;cursor:pointer;border:0;border-radius:3px;outline:0;background-color:#999;-webkit-appearance:none!important}.mui-input-range input[type=range]::-webkit-slider-thumb{width:28px;height:28px;border-color:#0062cc;border-radius:50%;background-color:#007aff;background-clip:padding-box;-webkit-appearance:none!important}.mui-input-range label~input[type=range]{width:65%}.mui-input-range .mui-tooltip{font-size:36px;line-height:64px;position:absolute;z-index:1;top:-70px;width:64px;height:64px;text-align:center;opacity:.8;color:#333;border:1px solid #ddd;border-radius:6px;background-color:#fff;text-shadow:0 1px 0 #f3f3f3}.mui-search{position:relative}.mui-search input[type=search]{padding-left:30px}.mui-search .mui-placeholder{font-size:16px;line-height:34px;position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;display:inline-block;height:34px;text-align:center;color:#999;border:0;border-radius:6px;background:0 0}.mui-search .mui-placeholder .mui-icon{font-size:20px;color:#333}.mui-search:before{font-family:Muiicons;font-size:20px;font-weight:400;position:absolute;top:50%;right:50%;display:none;margin-top:-18px;margin-right:31px;content:'\e466'}.mui-search.mui-active:before{font-size:20px;right:auto;left:5px;display:block;margin-right:0}.mui-search.mui-active input[type=search]{text-align:left}.mui-search.mui-active .mui-placeholder{display:none}.mui-segmented-control{font-size:15px;font-weight:400;position:relative;display:table;overflow:hidden;width:100%;table-layout:fixed;border:1px solid #007aff;border-radius:3px;background-color:transparent;-webkit-touch-callout:none}.mui-segmented-control.mui-segmented-control-vertical{border-collapse:collapse;border-width:0;border-radius:0}.mui-segmented-control.mui-segmented-control-vertical .mui-control-item{display:block;border-bottom:1px solid #c8c7cc;border-left-width:0}.mui-segmented-control.mui-scroll-wrapper{height:38px}.mui-segmented-control.mui-scroll-wrapper .mui-scroll{width:auto;height:40px;white-space:nowrap}.mui-segmented-control.mui-scroll-wrapper .mui-control-item{display:inline-block;width:auto;padding:0 20px;border:0}.mui-segmented-control .mui-control-item{line-height:38px;display:table-cell;overflow:hidden;width:1%;-webkit-transition:background-color .1s linear;transition:background-color .1s linear;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;border-color:#007aff;border-left:1px solid #007aff}.mui-segmented-control .mui-control-item:first-child{border-left-width:0}.mui-segmented-control .mui-control-item.mui-active{color:#fff;background-color:#007aff}.mui-segmented-control.mui-segmented-control-inverted{width:100%;border:0;border-radius:0}.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item,.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item.mui-active{border-bottom:1px solid #c8c7cc}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item{color:inherit;border:0}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{color:#007aff;border-bottom:2px solid #007aff;background:0 0}.mui-segmented-control.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#007aff}.mui-segmented-control-positive{border:1px solid #4cd964}.mui-segmented-control-positive .mui-control-item{color:#4cd964;border-color:inherit}.mui-segmented-control-positive .mui-control-item.mui-active{color:#fff;background-color:#4cd964}.mui-segmented-control-positive.mui-segmented-control-inverted .mui-control-item.mui-active{color:#4cd964;border-bottom:2px solid #4cd964;background:0 0}.mui-segmented-control-positive.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#4cd964}.mui-segmented-control-negative{border:1px solid #dd524d}.mui-segmented-control-negative .mui-control-item{color:#dd524d;border-color:inherit}.mui-segmented-control-negative .mui-control-item.mui-active{color:#fff;background-color:#dd524d}.mui-segmented-control-negative.mui-segmented-control-inverted .mui-control-item.mui-active{color:#dd524d;border-bottom:2px solid #dd524d;background:0 0}.mui-segmented-control-negative.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#dd524d}.mui-control-content{position:relative;display:none}.mui-control-content.mui-active{display:block}.mui-popover{position:absolute;z-index:999;display:none;width:280px;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none;opacity:0;border-radius:7px;background-color:#f7f7f7;-webkit-box-shadow:0 0 15px rgba(0,0,0,.1);box-shadow:0 0 15px rgba(0,0,0,.1)}.mui-popover .mui-popover-arrow{position:absolute;z-index:1000;top:-25px;left:0;overflow:hidden;width:26px;height:26px}.mui-popover .mui-popover-arrow:after{position:absolute;top:19px;left:0;width:26px;height:26px;content:' ';-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:3px;background:#f7f7f7}.mui-popover .mui-popover-arrow.mui-bottom{top:100%;left:-26px;margin-top:-1px}.mui-popover .mui-popover-arrow.mui-bottom:after{top:-19px;left:0}.mui-popover.mui-popover-action{bottom:0;width:100%;-webkit-transition:-webkit-transform .3s,opacity .3s;transition:transform .3s,opacity .3s;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);border-radius:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.mui-popover.mui-popover-action .mui-popover-arrow{display:none}.mui-popover.mui-popover-action.mui-popover-bottom{position:fixed}.mui-popover.mui-popover-action.mui-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-popover.mui-popover-action .mui-table-view{margin:8px;text-align:center;color:#007aff;border-radius:4px}.mui-popover.mui-popover-action .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-popover.mui-popover-action .mui-table-view small{font-weight:400;line-height:1.3;display:block}.mui-popover.mui-active{display:block;opacity:1}.mui-popover .mui-bar~.mui-table-view{padding-top:44px}.mui-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.3)}.mui-bar-backdrop.mui-backdrop{bottom:50px;background:0 0}.mui-backdrop-action.mui-backdrop{background-color:rgba(0,0,0,.3)}.mui-backdrop-action.mui-backdrop,.mui-bar-backdrop.mui-backdrop{opacity:0}.mui-backdrop-action.mui-backdrop.mui-active,.mui-bar-backdrop.mui-backdrop.mui-active{-webkit-transition:all .4s ease;transition:all .4s ease;opacity:1}.mui-popover .mui-btn-block{margin-bottom:5px}.mui-popover .mui-btn-block:last-child{margin-bottom:0}.mui-popover .mui-bar{-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-bar-nav{border-bottom:1px solid rgba(0,0,0,.15);border-top-left-radius:12px;border-top-right-radius:12px;-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-scroll-wrapper{margin:7px 0;border-radius:7px;background-clip:padding-box}.mui-popover .mui-scroll .mui-table-view{max-height:none}.mui-popover .mui-table-view{overflow:auto;max-height:300px;margin-bottom:0;border-radius:7px;background-color:#f7f7f7;background-image:none;-webkit-overflow-scrolling:touch}.mui-popover .mui-table-view:after,.mui-popover .mui-table-view:before{height:0}.mui-popover .mui-table-view .mui-table-view-cell:first-child,.mui-popover .mui-table-view .mui-table-view-cell:first-child>a:not(.mui-btn){border-top-left-radius:12px;border-top-right-radius:12px}.mui-popover .mui-table-view .mui-table-view-cell:last-child,.mui-popover .mui-table-view .mui-table-view-cell:last-child>a:not(.mui-btn){border-bottom-right-radius:12px;border-bottom-left-radius:12px}.mui-popover.mui-bar-popover .mui-table-view{width:106px}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell{padding:11px 15px;background-position:0 100%}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell>a:not(.mui-btn){margin:-11px -15px -11px -15px}.mui-popup-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;-webkit-transition-duration:400ms;transition-duration:400ms;opacity:0;background:rgba(0,0,0,.4)}.mui-popup-backdrop.mui-active{opacity:1}.mui-popup{position:fixed;z-index:10000;top:50%;left:50%;display:none;overflow:hidden;width:270px;-webkit-transition-property:-webkit-transform,opacity;transition-property:transform,opacity;-webkit-transform:translate3d(-50%,-50%,0) scale(1.185);transform:translate3d(-50%,-50%,0) scale(1.185);text-align:center;opacity:0;color:#000;border-radius:13px}.mui-popup.mui-popup-in{display:block;-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:1}.mui-popup.mui-popup-out{-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:0}.mui-popup-inner{position:relative;padding:15px;border-radius:13px 13px 0 0;background:rgba(255,255,255,.95)}.mui-popup-inner:after{position:absolute;z-index:15;top:auto;right:auto;bottom:0;left:0;display:block;width:100%;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;background-color:rgba(0,0,0,.2)}.mui-popup-title{font-size:18px;font-weight:500;text-align:center}.mui-popup-title+.mui-popup-text{font-family:inherit;font-size:14px;margin:5px 0 0}.mui-popup-buttons{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.mui-popup-button{font-size:17px;line-height:44px;position:relative;display:block;overflow:hidden;box-sizing:border-box;width:100%;height:44px;padding:0 5px;cursor:pointer;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;background:rgba(255,255,255,.95);-webkit-box-flex:1}.mui-popup-button:after{position:absolute;z-index:15;top:0;right:0;bottom:auto;left:auto;display:block;width:1px;height:100%;content:'';-webkit-transform:scaleX(.5);transform:scaleX(.5);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;background-color:rgba(0,0,0,.2)}.mui-popup-button:first-child{border-radius:0 0 0 13px}.mui-popup-button:first-child:last-child{border-radius:0 0 13px 13px}.mui-popup-button:last-child{border-radius:0 0 13px}.mui-popup-button:last-child:after{display:none}.mui-popup-button.mui-popup-button-bold{font-weight:600}.mui-popup-input input{font-size:14px;width:100%;height:26px;margin:15px 0 0;padding:0 5px;border:1px solid rgba(0,0,0,.3);border-radius:0;background:#fff}.mui-plus.mui-android .mui-popup-backdrop{-webkit-transition-duration:1ms;transition-duration:1ms}.mui-plus.mui-android .mui-popup{-webkit-transition-duration:1ms;transition-duration:1ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1)}.mui-progressbar{position:relative;display:block;overflow:hidden;width:100%;height:2px;-webkit-transform-origin:center top;transform-origin:center top;vertical-align:middle;border-radius:2px;background:#b6b6b6;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-progressbar span{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transition:150ms;transition:150ms;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);background:#007aff}.mui-progressbar.mui-progressbar-infinite:before{position:absolute;top:0;left:0;width:100%;height:100%;content:'';-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transform-origin:left center;transform-origin:left center;-webkit-animation:mui-progressbar-infinite 1s linear infinite;animation:mui-progressbar-infinite 1s linear infinite;background:#007aff}body>.mui-progressbar{position:absolute;z-index:10000;top:44px;left:0;border-radius:0}.mui-progressbar-in{-webkit-animation:mui-progressbar-in 300ms forwards;animation:mui-progressbar-in 300ms forwards}.mui-progressbar-out{-webkit-animation:mui-progressbar-out 300ms forwards;animation:mui-progressbar-out 300ms forwards}@-webkit-keyframes mui-progressbar-in{from{-webkit-transform:scaleY(0);opacity:0}to{-webkit-transform:scaleY(1);opacity:1}}@keyframes mui-progressbar-in{from{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}@-webkit-keyframes mui-progressbar-out{from{-webkit-transform:scaleY(1);opacity:1}to{-webkit-transform:scaleY(0);opacity:0}}@keyframes mui-progressbar-out{from{transform:scaleY(1);opacity:1}to{transform:scaleY(0);opacity:0}}@-webkit-keyframes mui-progressbar-infinite{0%{-webkit-transform:translate3d(-50%,0,0) scaleX(.5)}100%{-webkit-transform:translate3d(100%,0,0) scaleX(.5)}}@keyframes mui-progressbar-infinite{0%{transform:translate3d(-50%,0,0) scaleX(.5)}100%{transform:translate3d(100%,0,0) scaleX(.5)}}.mui-pagination{display:inline-block;margin:0 auto;padding-left:0;border-radius:6px}.mui-pagination>li{display:inline}.mui-pagination>li>a,.mui-pagination>li>span{line-height:1.428571429;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;color:#007aff;border:1px solid #ddd;background-color:#fff}.mui-pagination>li:first-child>a,.mui-pagination>li:first-child>span{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px;background-clip:padding-box}.mui-pagination>li:last-child>a,.mui-pagination>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px;background-clip:padding-box}.mui-pagination>li.mui-active>a,.mui-pagination>li.mui-active>a:active,.mui-pagination>li.mui-active>span,.mui-pagination>li.mui-active>span:active,.mui-pagination>li:active>a,.mui-pagination>li:active>a:active,.mui-pagination>li:active>span,.mui-pagination>li:active>span:active{z-index:2;cursor:default;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pagination>li.mui-disabled>a,.mui-pagination>li.mui-disabled>a:active,.mui-pagination>li.mui-disabled>span,.mui-pagination>li.mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-pagination-lg>li>a,.mui-pagination-lg>li>span{font-size:18px;padding:10px 16px}.mui-pagination-sm>li>a,.mui-pagination-sm>li>span{font-size:12px;padding:5px 10px}.mui-pager{padding-left:0;list-style:none;text-align:center}.mui-pager:after,.mui-pager:before{display:table;content:' '}.mui-pager:after{clear:both}.mui-pager li{display:inline}.mui-pager li>a,.mui-pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:6px;background-color:#fff;background-clip:padding-box}.mui-pager li.mui-active>a,.mui-pager li.mui-active>span,.mui-pager li:active>a,.mui-pager li:active>span{cursor:default;text-decoration:none;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pager .mui-next>a,.mui-pager .mui-next>span{float:right}.mui-pager .mui-previous>a,.mui-pager .mui-previous>span{float:left}.mui-pager .mui-disabled>a,.mui-pager .mui-disabled>a:active,.mui-pager .mui-disabled>span,.mui-pager .mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-modal{position:fixed;z-index:999;top:0;overflow:hidden;width:100%;min-height:100%;-webkit-transition:-webkit-transform .25s,opacity 1ms .25s;transition:transform .25s,opacity 1ms .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0;background-color:#fff}.mui-modal.mui-active{height:100%;-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.mui-android .mui-modal .mui-bar{position:static}.mui-android .mui-modal .mui-bar-nav~.mui-content{padding-top:0}.mui-slider{position:relative;z-index:1;overflow:hidden;width:100%}.mui-slider .mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{border-bottom:0}.mui-slider .mui-segmented-control.mui-segmented-control-inverted~.mui-slider-group .mui-slider-item{border-top:1px solid #c8c7cc;border-bottom:1px solid #c8c7cc}.mui-slider .mui-slider-group{font-size:0;position:relative;-webkit-transition:all 0s linear;transition:all 0s linear;white-space:nowrap}.mui-slider .mui-slider-group .mui-slider-item{font-size:14px;position:relative;display:inline-block;width:100%;height:100%;vertical-align:top;white-space:normal}.mui-slider .mui-slider-group .mui-slider-item>a:not(.mui-control-item){line-height:0;position:relative;display:block}.mui-slider .mui-slider-group .mui-slider-item img{width:100%}.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:after,.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:before{height:0}.mui-slider .mui-slider-group.mui-slider-loop{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}.mui-slider-title{line-height:30px;position:absolute;bottom:0;left:0;width:100%;height:30px;margin:0;text-align:left;text-indent:12px;opacity:.8;background-color:#000}.mui-slider-indicator{position:absolute;bottom:8px;width:100%;text-align:center;background:0 0}.mui-slider-indicator.mui-segmented-control{position:relative;bottom:auto}.mui-slider-indicator .mui-indicator{display:inline-block;width:6px;height:6px;margin:1px 6px;cursor:pointer;border-radius:50%;background:#aaa;-webkit-box-shadow:0 0 1px 1px rgba(130,130,130,.7);box-shadow:0 0 1px 1px rgba(130,130,130,.7)}.mui-slider-indicator .mui-active.mui-indicator{background:#fff}.mui-slider-indicator .mui-icon{font-size:20px;line-height:30px;width:40px;height:30px;margin:3px;text-align:center;border:1px solid #ddd}.mui-slider-indicator .mui-number{line-height:32px;display:inline-block;width:58px}.mui-slider-indicator .mui-number span{color:#ff5053}.mui-slider-progress-bar{z-index:1;height:2px;-webkit-transform:translateZ(0);transform:translateZ(0)}.mui-switch{position:relative;display:block;width:74px;height:30px;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;transition-property:background-color,border;border:2px solid #ddd;border-radius:20px;background-color:#fff;background-clip:padding-box}.mui-switch.mui-disabled{opacity:.3}.mui-switch .mui-switch-handle{position:absolute;z-index:1;top:-1px;left:-1px;width:28px;height:28px;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out;-webkit-transition-property:-webkit-transform,width,left;transition-property:transform,width,left;border-radius:16px;background-color:#fff;background-clip:padding-box;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.4);box-shadow:0 2px 5px rgba(0,0,0,.4)}.mui-switch:before{font-size:13px;position:absolute;top:3px;right:11px;content:'Off';text-transform:uppercase;color:#999}.mui-switch.mui-dragging{border-color:#f7f7f7;background-color:#f7f7f7}.mui-switch.mui-dragging .mui-switch-handle{width:38px}.mui-switch.mui-dragging.mui-active .mui-switch-handle{left:-11px;width:38px}.mui-switch.mui-active{border-color:#4cd964;background-color:#4cd964}.mui-switch.mui-active .mui-switch-handle{-webkit-transform:translate(43px,0);transform:translate(43px,0)}.mui-switch.mui-active:before{right:auto;left:15px;content:'On';color:#fff}.mui-switch input[type=checkbox]{display:none}.mui-switch-mini{width:47px}.mui-switch-mini:before{display:none}.mui-switch-mini.mui-active .mui-switch-handle{-webkit-transform:translate(16px,0);transform:translate(16px,0)}.mui-switch-blue.mui-active{border:2px solid #007aff;background-color:#007aff}.mui-content.mui-fade{left:0;opacity:0}.mui-content.mui-fade.mui-in{opacity:1}.mui-content.mui-sliding{z-index:2;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-content.mui-sliding.mui-left{z-index:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-content.mui-sliding.mui-right{z-index:3;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-navigate-right:after,.mui-push-left:after,.mui-push-right:after{font-family:Muiicons;font-size:inherit;line-height:1;position:absolute;top:50%;display:inline-block;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-decoration:none;color:#bbb;-webkit-font-smoothing:antialiased}.mui-push-left:after{left:15px;content:'\e582'}.mui-navigate-right:after,.mui-push-right:after{right:15px;content:'\e583'}.mui-pull-bottom-pocket,.mui-pull-top-pocket{position:absolute;left:0;display:block;visibility:hidden;overflow:hidden;width:100%;height:50px}.mui-plus-pullrefresh .mui-pull-bottom-pocket,.mui-plus-pullrefresh .mui-pull-top-pocket{display:none;visibility:visible}.mui-pull-top-pocket{top:0}.mui-bar-nav~.mui-content .mui-pull-top-pocket{top:44px}.mui-bar-nav~.mui-bar-header-secondary~.mui-content .mui-pull-top-pocket{top:88px}.mui-pull-bottom-pocket{position:relative;bottom:0;height:40px}.mui-pull-bottom-pocket .mui-pull-loading{visibility:hidden}.mui-pull-bottom-pocket .mui-pull-loading.mui-in{display:inline-block}.mui-pull{font-weight:700;position:absolute;right:0;bottom:10px;left:0;text-align:center;color:#777}.mui-pull-loading{margin-right:10px;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transition-duration:400ms;transition-duration:400ms;vertical-align:middle}.mui-pull-loading.mui-reverse{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}.mui-pull-caption{font-size:15px;line-height:24px;position:relative;display:inline-block;overflow:visible;margin-top:0;vertical-align:middle}.mui-pull-caption span{display:none}.mui-pull-caption span.mui-in{display:inline}.mui-toast-container{line-height:17px;position:fixed;z-index:9999;bottom:50px;left:50%;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);opacity:0}.mui-toast-container.mui-active{opacity:.9}.mui-toast-message{font-size:14px;padding:10px 25px;text-align:center;color:#fff;border-radius:6px;background-color:#323232}.mui-numbox{position:relative;display:inline-block;overflow:hidden;width:120px;height:35px;padding:0 40px;vertical-align:top;vertical-align:middle;border:solid 1px #bbb;border-radius:3px;background-color:#efeff4}.mui-numbox [class*=btn-numbox],.mui-numbox [class*=numbox-btn]{font-size:18px;font-weight:400;line-height:100%;position:absolute;top:0;overflow:hidden;width:40px;height:100%;padding:0;color:#555;border:none;border-radius:0;background-color:#f9f9f9}.mui-numbox [class*=btn-numbox]:active,.mui-numbox [class*=numbox-btn]:active{background-color:#ccc}.mui-numbox [class*=btn-numbox][disabled],.mui-numbox [class*=numbox-btn][disabled]{color:silver}.mui-numbox .mui-btn-numbox-plus,.mui-numbox .mui-numbox-btn-plus{right:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.mui-numbox .mui-btn-numbox-minus,.mui-numbox .mui-numbox-btn-minus{left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.mui-numbox .mui-input-numbox,.mui-numbox .mui-numbox-input{display:inline-block;overflow:hidden;width:100%!important;height:100%;margin:0;padding:0 3px!important;text-align:center;text-overflow:ellipsis;word-break:normal;border:none!important;border-right:solid 1px #ccc!important;border-left:solid 1px #ccc!important;border-radius:0!important}.mui-input-row .mui-numbox{float:right;margin:2px 8px}@font-face{font-family:Muiicons;font-weight:400;font-style:normal;src:url(../fonts/mui.ttf) format('truetype')}.mui-icon{font-family:Muiicons;font-size:24px;font-weight:400;font-style:normal;line-height:1;display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased}.mui-icon.mui-active{color:#007aff}.mui-icon.mui-right:before{float:right;padding-left:.2em}.mui-icon-contact:before{content:'\e100'}.mui-icon-person:before{content:'\e101'}.mui-icon-personadd:before{content:'\e102'}.mui-icon-contact-filled:before{content:'\e130'}.mui-icon-person-filled:before{content:'\e131'}.mui-icon-personadd-filled:before{content:'\e132'}.mui-icon-phone:before{content:'\e200'}.mui-icon-email:before{content:'\e201'}.mui-icon-chatbubble:before{content:'\e202'}.mui-icon-chatboxes:before{content:'\e203'}.mui-icon-phone-filled:before{content:'\e230'}.mui-icon-email-filled:before{content:'\e231'}.mui-icon-chatbubble-filled:before{content:'\e232'}.mui-icon-chatboxes-filled:before{content:'\e233'}.mui-icon-weibo:before{content:'\e260'}.mui-icon-weixin:before{content:'\e261'}.mui-icon-pengyouquan:before{content:'\e262'}.mui-icon-chat:before{content:'\e263'}.mui-icon-qq:before{content:'\e264'}.mui-icon-videocam:before{content:'\e300'}.mui-icon-camera:before{content:'\e301'}.mui-icon-mic:before{content:'\e302'}.mui-icon-location:before{content:'\e303'}.mui-icon-mic-filled:before,.mui-icon-speech:before{content:'\e332'}.mui-icon-location-filled:before{content:'\e333'}.mui-icon-micoff:before{content:'\e360'}.mui-icon-image:before{content:'\e363'}.mui-icon-map:before{content:'\e364'}.mui-icon-compose:before{content:'\e400'}.mui-icon-trash:before{content:'\e401'}.mui-icon-upload:before{content:'\e402'}.mui-icon-download:before{content:'\e403'}.mui-icon-close:before{content:'\e404'}.mui-icon-redo:before{content:'\e405'}.mui-icon-undo:before{content:'\e406'}.mui-icon-refresh:before{content:'\e407'}.mui-icon-star:before{content:'\e408'}.mui-icon-plus:before{content:'\e409'}.mui-icon-minus:before{content:'\e410'}.mui-icon-checkbox:before,.mui-icon-circle:before{content:'\e411'}.mui-icon-clear:before,.mui-icon-close-filled:before{content:'\e434'}.mui-icon-refresh-filled:before{content:'\e437'}.mui-icon-star-filled:before{content:'\e438'}.mui-icon-plus-filled:before{content:'\e439'}.mui-icon-minus-filled:before{content:'\e440'}.mui-icon-circle-filled:before{content:'\e441'}.mui-icon-checkbox-filled:before{content:'\e442'}.mui-icon-closeempty:before{content:'\e460'}.mui-icon-refreshempty:before{content:'\e461'}.mui-icon-reload:before{content:'\e462'}.mui-icon-starhalf:before{content:'\e463'}.mui-icon-spinner:before{content:'\e464'}.mui-icon-spinner-cycle:before{content:'\e465'}.mui-icon-search:before{content:'\e466'}.mui-icon-plusempty:before{content:'\e468'}.mui-icon-forward:before{content:'\e470'}.mui-icon-back:before,.mui-icon-left-nav:before{content:'\e471'}.mui-icon-checkmarkempty:before{content:'\e472'}.mui-icon-home:before{content:'\e500'}.mui-icon-navigate:before{content:'\e501'}.mui-icon-gear:before{content:'\e502'}.mui-icon-paperplane:before{content:'\e503'}.mui-icon-info:before{content:'\e504'}.mui-icon-help:before{content:'\e505'}.mui-icon-locked:before{content:'\e506'}.mui-icon-more:before{content:'\e507'}.mui-icon-flag:before{content:'\e508'}.mui-icon-home-filled:before{content:'\e530'}.mui-icon-gear-filled:before{content:'\e532'}.mui-icon-info-filled:before{content:'\e534'}.mui-icon-help-filled:before{content:'\e535'}.mui-icon-more-filled:before{content:'\e537'}.mui-icon-settings:before{content:'\e560'}.mui-icon-list:before{content:'\e562'}.mui-icon-bars:before{content:'\e563'}.mui-icon-loop:before{content:'\e565'}.mui-icon-paperclip:before{content:'\e567'}.mui-icon-eye:before{content:'\e568'}.mui-icon-arrowup:before{content:'\e580'}.mui-icon-arrowdown:before{content:'\e581'}.mui-icon-arrowleft:before{content:'\e582'}.mui-icon-arrowright:before{content:'\e583'}.mui-icon-arrowthinup:before{content:'\e584'}.mui-icon-arrowthindown:before{content:'\e585'}.mui-icon-arrowthinleft:before{content:'\e586'}.mui-icon-arrowthinright:before{content:'\e587'}.mui-icon-pulldown:before{content:'\e588'}.mui-fullscreen{position:absolute;top:0;right:0;bottom:0;left:0}.mui-fullscreen.mui-slider .mui-slider-group{height:100%}.mui-fullscreen .mui-segmented-control~.mui-slider-group{position:absolute;top:40px;bottom:0;width:100%;height:auto}.mui-fullscreen.mui-slider .mui-slider-item>a{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-fullscreen .mui-off-canvas-wrap .mui-slider-item>a{top:auto;-webkit-transform:none;transform:none}.mui-bar-nav~.mui-content .mui-slider.mui-fullscreen{top:44px}.mui-bar-tab~.mui-content .mui-slider.mui-fullscreen .mui-segmented-control~.mui-slider-group{bottom:50px}.mui-android.mui-android-4-0 input:focus,.mui-android.mui-android-4-0 textarea:focus{-webkit-user-modify:inherit}.mui-android.mui-android-4-2 input,.mui-android.mui-android-4-2 textarea,.mui-android.mui-android-4-3 input,.mui-android.mui-android-4-3 textarea{-webkit-user-select:text}.mui-ios .mui-table-view-cell{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-plus-visible,.mui-wechat-visible{display:none!important}.mui-plus-hidden,.mui-wechat-hidden{display:block!important}.mui-tab-item.mui-plus-hidden,.mui-tab-item.mui-wechat-hidden{display:table-cell!important}.mui-plus .mui-plus-visible,.mui-wechat .mui-wechat-visible{display:block!important}.mui-plus .mui-tab-item.mui-plus-visible,.mui-wechat .mui-tab-item.mui-wechat-visible{display:table-cell!important}.mui-plus .mui-plus-hidden,.mui-wechat .mui-wechat-hidden{display:none!important}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav{height:64px;padding-top:20px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content{padding-top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary,.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content .mui-pull-top-pocket{top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary~.mui-content{padding-top:94px}.mui-iframe-wrapper{position:absolute;right:0;left:0;-webkit-overflow-scrolling:touch}.mui-iframe-wrapper iframe{width:100%;height:100%;border:0} -------------------------------------------------------------------------------- /item-cms/static/mui/fonts/mui-icons-extra.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/mui/fonts/mui-icons-extra.ttf -------------------------------------------------------------------------------- /item-cms/static/mui/fonts/mui.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/item-cms/static/mui/fonts/mui.ttf -------------------------------------------------------------------------------- /item-cms/static/tools/bus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | export const bus = new Vue(); -------------------------------------------------------------------------------- /item-cms/static/tools/data.js: -------------------------------------------------------------------------------- 1 | export default { 2 | homeIcon: [{ 3 | name: "新闻资讯", 4 | router: "/newsList", 5 | class: "news" 6 | }, { 7 | name: "图片分享", 8 | router: "/photo/list", 9 | class: "mpan" 10 | }, { 11 | name: "购物商城", 12 | router: "/goods/list", 13 | class: "news" 14 | }, { 15 | name: "新闻资讯", 16 | router: "/newsList", 17 | class: "news" 18 | }, { 19 | name: "新闻资讯", 20 | router: "/newsList", 21 | class: "news" 22 | }, { 23 | name: "新闻资讯", 24 | router: "/newsList", 25 | class: "news" 26 | }] 27 | } -------------------------------------------------------------------------------- /item-cms/static/tools/http.js: -------------------------------------------------------------------------------- 1 | export default { 2 | host: "http://127.0.0.1:8888/", 3 | web: "http://webhm.top:8899/", 4 | getDataGet(url, obj, callback) { 5 | obj.$http.get(this.web + url).then(res => { 6 | callback(res.body) 7 | }, err => { 8 | console.log(err) 9 | }) 10 | } 11 | } -------------------------------------------------------------------------------- /item-cms/static/tools/shopModel.js: -------------------------------------------------------------------------------- 1 | const key = "goods"; 2 | export const saveShopData = (ShopObj) => { 3 | var savedata = JSON.parse(localStorage.getItem(key) || "[]") 4 | var tmp = true 5 | for (let i = 0; i < savedata.length; i++) { 6 | if (savedata[i].goodsId == ShopObj.goodsId) { 7 | savedata[i].count += ShopObj.count 8 | tmp = false 9 | break 10 | } 11 | } 12 | tmp && savedata.push(ShopObj) 13 | localStorage.setItem(key, JSON.stringify(savedata)) 14 | } 15 | export const getShopNumber = () => { 16 | var sum = 0 17 | var savedata = JSON.parse(localStorage.getItem(key) || "[]") 18 | for (let i = 0; i < savedata.length; i++) { 19 | sum += savedata[i].count 20 | } 21 | return sum 22 | } 23 | export const tmpData = function() { 24 | var item = arguments[0] 25 | if (typeof item == "string") { 26 | return sessionStorage.getItem(item) 27 | } else if (typeof item == "object") { 28 | sessionStorage.setItem(item.key, item.data) 29 | } 30 | } -------------------------------------------------------------------------------- /node-cms/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 ivanyb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /node-cms/README.md: -------------------------------------------------------------------------------- 1 | #vue_cms 2 | dtcmsdb4.sql :是 mysql数据库的脚本 3 | 4 | #步骤 5 | ##服务器端配置 6 | ``` 7 | npm install 8 | node app.js 启动express服务器 ,启动之前请先安装mysql数据服务和利用dtcmsdb4.sql 建立一个dtcmsdb4的数据库 9 | 在MYSQL运行dtcmsdb4.sql 10 | 双击src目录下的 start.bat 开启项目后台服务 11 | 该项目后台基于node开发 运行项目需node环境 12 | ``` 13 | ## 前端项目配置 14 | 15 | ``` 16 | npm install 17 | cd 客户端根目录 18 | npm run dev 19 | 开启项目 20 | ``` 21 | 22 | 该项目客户端为运用Vue组件化开发 应页面不多采用Bus通讯 为采用Vuex 适合入门参考 23 | 24 | -------------------------------------------------------------------------------- /node-cms/README.md.dump: -------------------------------------------------------------------------------- 1 | #vuecms3_nodejsapi 2 | dtcmsdb4.sql :是 mysql数据库的脚本 3 | 4 | #步骤 5 | ``` 6 | npm install 7 | 8 | node app.js 启动express服务器 ,启动之前请先安装mysql数据服务和利用dtcmsdb4.sql 建立一个dtcmsdb4的数据库 9 | 10 | 11 | 12 | ``` -------------------------------------------------------------------------------- /node-cms/mysqlconfig.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/node-cms/mysqlconfig.bmp -------------------------------------------------------------------------------- /node-cms/npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe', 3 | 1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', 4 | 1 verbose cli 'run', 5 | 1 verbose cli 'dev' ] 6 | 2 info using npm@3.10.9 7 | 3 info using node@v6.9.2 8 | 4 verbose stack Error: missing script: dev 9 | 4 verbose stack at run (C:\nvm\v6.9.2\node_modules\npm\lib\run-script.js:151:19) 10 | 4 verbose stack at C:\nvm\v6.9.2\node_modules\npm\lib\run-script.js:61:5 11 | 4 verbose stack at C:\nvm\v6.9.2\node_modules\npm\node_modules\read-package-json\read-json.js:356:5 12 | 4 verbose stack at checkBinReferences_ (C:\nvm\v6.9.2\node_modules\npm\node_modules\read-package-json\read-json.js:320:45) 13 | 4 verbose stack at final (C:\nvm\v6.9.2\node_modules\npm\node_modules\read-package-json\read-json.js:354:3) 14 | 4 verbose stack at then (C:\nvm\v6.9.2\node_modules\npm\node_modules\read-package-json\read-json.js:124:5) 15 | 4 verbose stack at C:\nvm\v6.9.2\node_modules\npm\node_modules\read-package-json\read-json.js:243:12 16 | 4 verbose stack at C:\nvm\v6.9.2\node_modules\npm\node_modules\graceful-fs\graceful-fs.js:78:16 17 | 4 verbose stack at tryToString (fs.js:455:3) 18 | 4 verbose stack at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:442:12) 19 | 5 verbose cwd C:\备课参考\vue项目后台源码\vuecms3_nodejsapi 20 | 6 error Windows_NT 10.0.14393 21 | 7 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "dev" 22 | 8 error node v6.9.2 23 | 9 error npm v3.10.9 24 | 10 error missing script: dev 25 | 11 error If you need help, you may report this error at: 26 | 11 error 27 | 12 verbose exit [ 1, true ] 28 | -------------------------------------------------------------------------------- /node-cms/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vueapi", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.14.0", 13 | "mysql": "^2.13.0", 14 | "orm": "^3.2.3" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /node-cms/src/app.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const express = require('express'); 4 | 5 | let app = express(); 6 | 7 | //1.0 初始化orm 8 | const orm = require('orm'); 9 | //dtcmsdb4 10 | app.use(orm.express('mysql://root:ww123456@127.0.0.1:3386/dtcmsdb4',{ 11 | define:function(db,models,next){ 12 | 13 | next(); 14 | } 15 | })); 16 | 17 | //2.0 将所有api的请求响应content-type设置为application/json 18 | app.all('/api/*',(req,res,next)=>{ 19 | //设置允许跨域响应报文头 20 | //设置跨域 21 | res.header("Access-Control-Allow-Origin", "*"); 22 | res.header("Access-Control-Allow-Headers", "X-Requested-With"); 23 | res.header("Access-Control-Allow-Methods","*"); 24 | 25 | res.setHeader('Content-Type','application/json;charset=utf-8'); 26 | next(); 27 | }); 28 | 29 | //2.0 设置路由规则 30 | 31 | const apiRoute = require('./routes/apiRoute.js'); 32 | app.use('/',apiRoute); 33 | /** 34 | app.listen(8899,'127.0.0.1',()=>{ 35 | 36 | console.log('api服务已启动, :8899'); 37 | }); 38 | 39 | **/ 40 | 41 | app.listen(8888,'127.0.0.1',()=>{ 42 | 43 | console.log('api服务已启动, :8888'); 44 | }); 45 | -------------------------------------------------------------------------------- /node-cms/src/controllers/apiController.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | let successState = 0 // 表示成功 4 | let fialState = 1 // 表示失败 5 | // 1.0 7牛云存储域名 6 | let domain = 'http://ofv795nmp.bkt.clouddn.com/' 7 | 8 | exports.getlunbo= (req, res) => { 9 | let resObj = {status: successState, message: [{ 10 | url: 'http://www.itcast.cn/subject/phoneweb/index.html', 11 | img: 'http://img1.imgtn.bdimg.com/it/u=4174868146,2956166581&fm=23&gp=0.jpg' 12 | //img:'http://ofv795nmp.bkt.clouddn.com//upload/201504/20/thumb_201504200046589514.jpg' 13 | }, { 14 | url: 'http://www.itcast.cn/subject/phoneweb/index.html', 15 | img: 'http://pic11.nipic.com/20101214/213291_155243023914_2.jpg' 16 | //img:'http://ofv795nmp.bkt.clouddn.com//upload/201504/20/thumb_201504200046594439.jpg' 17 | }]} 18 | 19 | res.end(JSON.stringify(resObj)) 20 | 21 | 22 | } 23 | 24 | 25 | // 1.0 获取图片新闻资讯列表 26 | exports.getnewslist = (req, res) => { 27 | // 代表返回的数据结构 28 | let resObj = {status: successState, message: ''} 29 | 30 | // 3.0 利用orm发送sql语句查询出来分页数据即可 31 | /* 32 | id : 资讯主键 33 | ,title : 资讯标题 34 | ,add_time :资讯创建的事件 35 | ,zhaiyao:摘要 36 | ,click:点击量 37 | ,img_url:图片地址,前缀是7牛云存储域名 38 | */ 39 | let sql = " SELECT id,title,add_time,left(zhaiyao,25) as zhaiyao,click,concat('" + domain + "',img_url) as img_url FROM dt_article where img_url > '' and channel_id = 6 limit 0,10 " 40 | console.log('获取图文资讯sql语句:============>', sql) 41 | req.db.driver.execQuery(sql, (err, datas) => { 42 | // 4.0 判断是否异常 43 | if (err) { 44 | resObj.status = fialState 45 | resObj.message = err.message 46 | res.end(JSON.stringify(resObj)) 47 | return 48 | } 49 | 50 | // 5.0 获取数据成功 51 | resObj.message = datas 52 | res.end(JSON.stringify(resObj)) 53 | }) 54 | } 55 | 56 | // 2.0 根据资讯id获取资讯详细内容 57 | exports.getnew = (req, res) => { 58 | // 代表返回的数据结构 59 | let resObj = {status: successState, message: ''} 60 | 61 | // 1.0 获取参数值 62 | let newid = req.params.newid 63 | 64 | // 2.0 执行查询操作 65 | let sql = 'select id,title,click,add_time,content from dt_article where id=' + newid 66 | console.log('获取资讯明细sql===>', sql) 67 | req.db.driver.execQuery(sql, (err, data) => { 68 | // 3.0 判断是否异常 69 | if (err) { 70 | resObj.status = fialState 71 | resObj.message = err.message 72 | res.end(JSON.stringify(resObj)) 73 | return 74 | } 75 | 76 | // 4.0 获取数据成功 77 | resObj.message = data 78 | res.end(JSON.stringify(resObj)) 79 | }) 80 | } 81 | 82 | // 3.0 商品 83 | exports.getgoods = (req, res) => { 84 | // 代表返回的数据结构 85 | let resObj = {status: successState, message: ''} 86 | let pageindex = req.query.pageindex 87 | if(!pageindex){ 88 | pageindex =1; 89 | } 90 | let pagesize = 10 91 | let skipcount = (pageindex - 1) * pagesize 92 | 93 | // 3.0 利用orm发送sql语句查询出来分页数据即可 94 | /* 95 | id : 资讯主键 96 | ,title : 资讯标题 97 | ,add_time :资讯创建的事件 98 | ,zhaiyao:摘要 99 | ,click:点击量 100 | ,img_url:图片地址,前缀是7牛云存储域名 101 | */ 102 | let sql = `SELECT a.id,a.title,a.add_time,left(a.zhaiyao,25) as zhaiyao,a.click,concat('${domain}',a.img_url) as img_url,b.sell_price,b.market_price,b.stock_quantity FROM dt_article as a,dt_article_attribute_value b where a.id = b.article_id and a.channel_id = 7 limit ${skipcount},${pagesize} ` 103 | console.log('获取图文资讯sql语句:============>', sql) 104 | req.db.driver.execQuery(sql, (err, datas) => { 105 | // 4.0 判断是否异常 106 | if (err) { 107 | resObj.status = fialState 108 | resObj.message = err.message 109 | res.end(JSON.stringify(resObj)) 110 | return 111 | } 112 | 113 | // 5.0 获取数据成功 114 | resObj.message = datas 115 | res.end(JSON.stringify(resObj)) 116 | }) 117 | } 118 | 119 | /* 120 | 3.0.1 获取商品详情页面数据 121 | -- 获取商品详情页标题,图文介绍信息等 122 | SELECT * FROM dt_article da WHERE da.channel_id = 7 AND da.title LIKE '%新科%'; 123 | -- 获取商品详情页中的滚动图片 124 | select * FROM dt_article_albums daa WHERE daa.article_id = 101; 125 | 126 | -- 获取商品参数区域信息 127 | SELECT daav.goods_no,daav.stock_quantity FROM dt_article_attribute_value daav WHERE daav.article_id =101; 128 | 129 | -- 商品品论 130 | select * from dt_article_comment dac WHERE dac.article_id=101 131 | */ 132 | 133 | // 商品图文描述 134 | exports.getgooddesc = (req, res) => { 135 | // 代表返回的数据结构 136 | let resObj = {status: successState, message: ''} 137 | 138 | let id = req.params.id; 139 | let sql = ` SELECT title,content FROM dt_article da WHERE da.id = ${id} ` 140 | console.log( '获取商品图文描述sql语句:============>', sql) 141 | req.db.driver.execQuery(sql, (err, datas) => { 142 | // 4.0 判断是否异常 143 | if (err) { 144 | resObj.status = fialState 145 | resObj.message = err.message 146 | res.end(JSON.stringify(resObj)) 147 | return 148 | } 149 | 150 | // 5.0 获取数据成功 151 | resObj.message = datas 152 | res.end(JSON.stringify(resObj)) 153 | }) 154 | } 155 | 156 | // 获取商品标题,价格,参数区数据 157 | // getgoodsinfo 158 | exports.getgoodsinfo = (req, res) => { 159 | // 代表返回的数据结构 160 | let resObj = {status: successState, message: ''} 161 | 162 | let id = req.params.id; 163 | let sql = ` SELECT da.id,da.title,da.add_time,daa.goods_no,daa.stock_quantity,daa.market_price,daa.sell_price FROM dt_article da , dt_article_attribute_value daa 164 | WHERE da.id = daa.article_id and da.id = ${id} ` 165 | console.log( '获取商品获取商品标题,价格,参数区数据sql语句:============>', sql) 166 | req.db.driver.execQuery(sql, (err, datas) => { 167 | // 4.0 判断是否异常 168 | if (err) { 169 | resObj.status = fialState 170 | resObj.message = err.message 171 | res.end(JSON.stringify(resObj)) 172 | return 173 | } 174 | 175 | // 5.0 获取数据成功 176 | resObj.message = datas 177 | res.end(JSON.stringify(resObj)) 178 | }) 179 | } 180 | 181 | //获取购物车列表数据 182 | exports.getshopcarlist = (req, res) => { 183 | // 代表返回的数据结构 184 | let resObj = {status: successState, message: ''} 185 | 186 | // 1.0 获取参数值 187 | let ids = req.params.ids 188 | 189 | // 2.0 执行查询操作 190 | let sql = ` 191 | SELECT count(distinct tb1.id) as cou, tb1.* FROM ( 192 | SELECT da.id,da.title,daa.sell_price,alb.thumb_path 193 | FROM dt_article da 194 | LEFT JOIN dt_article_attribute_value daa ON (da.id = daa.article_id) 195 | LEFT JOIN dt_article_albums alb ON (da.id = alb.article_id) 196 | WHERE da.id IN(${ids}) ) AS tb1 GROUP BY tb1.id 197 | ` 198 | 199 | console.log('获取购物车列表sql===>', sql) 200 | req.db.driver.execQuery(sql, (err, data) => { 201 | // 3.0 判断是否异常 202 | if (err) { 203 | resObj.status = fialState 204 | resObj.message = err.message 205 | res.end(JSON.stringify(resObj)) 206 | return 207 | } 208 | 209 | // 4.0 获取数据成功 210 | resObj.message = data 211 | res.end(JSON.stringify(resObj)) 212 | }) 213 | } 214 | 215 | 216 | // 4.0 图片分享 217 | exports.getimages = (req, res) => { 218 | // 代表返回的数据结构 219 | let resObj = {status: successState, message: ''} 220 | 221 | let cateid = req.params.cateid - 0 222 | 223 | let sql = ' select id,title,img_url,zhaiyao from dt_article where channel_id = 9 and category_id=' + cateid 224 | 225 | if (cateid <= 0) { 226 | sql = ' select * from dt_article where channel_id = 9 ' 227 | } 228 | 229 | // 3.0 利用orm发送sql语句查询出来分页数据即可 230 | /* 231 | 232 | */ 233 | 234 | console.log('获取图片分享sql语句:============>', sql) 235 | req.db.driver.execQuery(sql, (err, datas) => { 236 | // 4.0 判断是否异常 237 | if (err) { 238 | resObj.status = fialState 239 | resObj.message = err.message 240 | res.end(JSON.stringify(resObj)) 241 | return 242 | } 243 | 244 | // 5.0 获取数据成功 245 | resObj.message = datas 246 | res.end(JSON.stringify(resObj)) 247 | }) 248 | } 249 | 250 | 251 | // 4.0.1 根据id获取图片详细内容 252 | exports.getimage = (req, res) => { 253 | // 代表返回的数据结构 254 | let resObj = {status: successState, message: ''} 255 | 256 | // 1.0 获取参数值 257 | let newid = req.params.imgid 258 | 259 | // 2.0 执行查询操作 260 | let sql = `select thumb_path as src from dt_article_albums where article_id =${newid}` 261 | 262 | console.log('获取图片分享明细中缩略图sql===>', sql) 263 | req.db.driver.execQuery(sql, (err, data) => { 264 | // 3.0 判断是否异常 265 | if (err) { 266 | resObj.status = fialState 267 | resObj.message = err.message 268 | res.end(JSON.stringify(resObj)) 269 | return 270 | } 271 | 272 | // 4.0 获取数据成功 273 | resObj.message = data 274 | res.end(JSON.stringify(resObj)) 275 | }) 276 | } 277 | 278 | 279 | // 4.0.1 根据id获取图片详细内容 280 | exports.getimageInfo = (req, res) => { 281 | // 代表返回的数据结构 282 | let resObj = {status: successState, message: ''} 283 | 284 | // 1.0 获取参数值 285 | let newid = req.params.imgid 286 | 287 | // 2.0 执行查询操作 288 | let sql = `select id,title,click,add_time,content from dt_article where id=${newid}` 289 | 290 | console.log('获取图片分享明细sql===>', sql) 291 | req.db.driver.execQuery(sql, (err, data) => { 292 | // 3.0 判断是否异常 293 | if (err) { 294 | resObj.status = fialState 295 | resObj.message = err.message 296 | res.end(JSON.stringify(resObj)) 297 | return 298 | } 299 | 300 | // 4.0 获取数据成功 301 | resObj.message = data 302 | res.end(JSON.stringify(resObj)) 303 | }) 304 | } 305 | 306 | // 5.0 获取图片分享分类 307 | exports.getimgcategory = (req, res) => { 308 | // 代表返回的数据结构 309 | let resObj = {status: successState, message: ''} 310 | 311 | // 3.0 利用orm发送sql语句查询出来分页数据即可 312 | /* 313 | 314 | */ 315 | let sql = ' select title,id from dtcmsdb4.dt_article_category where channel_id = 9 ' 316 | console.log('获取图片分享分类sql语句:============>', sql) 317 | req.db.driver.execQuery(sql, (err, datas) => { 318 | // 4.0 判断是否异常 319 | if (err) { 320 | resObj.status = fialState 321 | resObj.message = err.message 322 | res.end(JSON.stringify(resObj)) 323 | return 324 | } 325 | 326 | // 5.0 获取数据成功 327 | resObj.message = datas 328 | res.end(JSON.stringify(resObj)) 329 | }) 330 | } 331 | 332 | //6.0 获取评论信息 333 | exports.getcomments = (req, res) => { 334 | // 代表返回的数据结构 335 | let resObj = {status: successState, message: ''} 336 | 337 | // 1.0 获取参数值 338 | let artid = req.params.artid 339 | let pageindex = req.query.pageindex 340 | let pagesize = 10; 341 | let skipCount = (pageindex - 1) * pagesize 342 | 343 | // 2.0 执行查询操作 344 | let sql = `select user_name,add_time,content from dt_article_comment where article_id = ${artid} order by add_time desc limit ${skipCount},${pagesize}` 345 | 346 | console.log('获取评论sql===>', sql) 347 | req.db.driver.execQuery(sql, (err, data) => { 348 | // 3.0 判断是否异常 349 | if (err) { 350 | resObj.status = fialState 351 | resObj.message = err.message 352 | res.end(JSON.stringify(resObj)) 353 | return 354 | } 355 | 356 | // 4.0 获取数据成功 357 | resObj.message = data 358 | res.end(JSON.stringify(resObj)) 359 | }) 360 | } 361 | 362 | 363 | //7.0 提交评论数据 364 | exports.postcomment = (req, res) => { 365 | // 代表返回的数据结构 366 | let resObj = {status: successState, message: ''} 367 | 368 | // 1.0 获取参数值 369 | let artid = req.params.artid 370 | //获取评论内容 371 | req.on('data',(chunk)=>{ 372 | let commentTxt = chunk.toString(); 373 | const qs= require('querystring'); 374 | let commentObj = qs.parse(commentTxt); 375 | 376 | 377 | // 2.0 执行查询操作 378 | let sql = `insert into dt_article_comment(channel_id,article_id,parent_id,user_id,user_name,user_ip, 379 | content,is_lock,add_time,is_reply,reply_content,reply_time) 380 | values (7,${artid},0,0,'匿名用户','127.0.0.1','${commentObj.content}',0,NOW(),0,'',NOW())` 381 | 382 | console.log('post提交评论sql===>', sql) 383 | req.db.driver.execQuery(sql, (err, data) => { 384 | // 3.0 判断是否异常 385 | if (err) { 386 | resObj.status = fialState 387 | resObj.message = err.message 388 | res.end(JSON.stringify(resObj)) 389 | return 390 | } 391 | 392 | // 4.0 获取数据成功 393 | resObj.message = '评论提交成功' 394 | res.end(JSON.stringify(resObj)) 395 | }) 396 | 397 | 398 | }) 399 | } 400 | 401 | 402 | -------------------------------------------------------------------------------- /node-cms/src/routes/apiRoute.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const express = require('express') 4 | 5 | let route = express.Router() 6 | 7 | const apiCtrl = require('../controllers/apiController.js') 8 | 9 | //0.0请求首页轮播图数据 10 | route.get('/api/getlunbo', apiCtrl.getlunbo) 11 | 12 | // 1.0 请求图文资讯 13 | route.get('/api/getnewslist', apiCtrl.getnewslist) 14 | 15 | // 2.0 根据资讯id获取资讯详细内容 16 | route.get('/api/getnew/:newid', apiCtrl.getnew) 17 | 18 | // 3.0 图片分享 19 | route.get('/api/getimages/:cateid', apiCtrl.getimages) 20 | // 3.0.1 图片分享详情中的缩略图数组 21 | route.get('/api/getthumimages/:imgid', apiCtrl.getimage) 22 | //3.0.2 获取图片分享中的图片详细介绍 23 | route.get('/api/getimageInfo/:imgid', apiCtrl.getimageInfo) 24 | 25 | 26 | // 3.0.2 图片分享分类 27 | route.get('/api/getimgcategory', apiCtrl.getimgcategory) 28 | 29 | //4.0 获取评论内容 30 | route.get('/api/getcomments/:artid', apiCtrl.getcomments) 31 | //4.0.1 提交评论数据 32 | route.post('/api/postcomment/:artid', apiCtrl.postcomment) 33 | 34 | // 5.0 获取商品列表数据 35 | route.get('/api/getgoods', apiCtrl.getgoods) 36 | // 6.0 37 | // 6.0.1 获取详情页轮播图可以直接使用// 3.0.1 图片分享详情中的缩略图数组方法/api/getthumimages/:imgid 38 | // 6.0.2 获取详情页第二区域块(商品购物区 ,商品标题,价格等)和 参数区域块(商品参数) 39 | route.get('/api/goods/getinfo/:id', apiCtrl.getgoodsinfo) 40 | 41 | // 6.0.4 获取图文介绍 42 | route.get('/api/goods/getdesc/:id', apiCtrl.getgooddesc) 43 | // 6.0.5 获取商品评论 可以直接请求://4.0 获取评论内容 --》 /api/getcomments/:artid 44 | // 6.0.6 提交评论,可以直接请求: //4.0.1 提交评论数据 ---》 /api/postcomment/:artid 45 | // 6.0.7 获取购物车页面数据 46 | route.get('/api/goods/getshopcarlist/:ids', apiCtrl.getshopcarlist) 47 | 48 | route.post('/api/post',(req,res)=>{ 49 | 50 | var obj = {message:'post 请求 ok'}; 51 | res.end(JSON.stringify(obj)); 52 | 53 | }); 54 | 55 | route.all('/api/jsonp',(req,res)=>{ 56 | 57 | var callbackFn = req.query.callback; 58 | 59 | var obj = {message:'jsonp 请求 ok'}; 60 | var jsonStr = JSON.stringify(obj); 61 | 62 | 63 | res.end(`${callbackFn}('${jsonStr}')`); 64 | 65 | }); 66 | 67 | module.exports = route 68 | 69 | -------------------------------------------------------------------------------- /node-cms/src/start.bat: -------------------------------------------------------------------------------- 1 | nodemon app.js -------------------------------------------------------------------------------- /node-cms/src/test.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/node-cms/src/test.js -------------------------------------------------------------------------------- /node-cms/src/upload/201504/20/thumb_201504200059017695.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/node-cms/src/upload/201504/20/thumb_201504200059017695.jpg -------------------------------------------------------------------------------- /node-cms/相关api业务sql脚本.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/node-cms/相关api业务sql脚本.sql -------------------------------------------------------------------------------- /vue总结/01.MVVM思想图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/01.MVVM思想图.png -------------------------------------------------------------------------------- /vue总结/02.Vue中体现MVVM思想的代码写法.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/02.Vue中体现MVVM思想的代码写法.png -------------------------------------------------------------------------------- /vue总结/04vuex模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/04vuex模型.png -------------------------------------------------------------------------------- /vue总结/05vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/05vue.png -------------------------------------------------------------------------------- /vue总结/06.img中有关v-bind的说明.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/06.img中有关v-bind的说明.png -------------------------------------------------------------------------------- /vue总结/06vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/06vue.png -------------------------------------------------------------------------------- /vue总结/07.v-model实现数据的双向绑定.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/07.v-model实现数据的双向绑定.png -------------------------------------------------------------------------------- /vue总结/07eventbus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/07eventbus.png -------------------------------------------------------------------------------- /vue总结/09.路由的跳转.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/09.路由的跳转.png -------------------------------------------------------------------------------- /vue总结/Vue实例的全局配置.md: -------------------------------------------------------------------------------- 1 | # Vue实例的全局配置 2 | Vue.config 是一个对象,包含 Vue 的全局配置。可以在启动应用之前修改下列属性: 3 | - silent 4 | 5 | - 类型: boolean 6 | 7 | - 默认值: false 8 | 9 | - 用法: 10 | ```js 11 | Vue.config.silent = true 12 | //取消 Vue 所有的日志与警告。 13 | ``` 14 | - optionMergeStrategies 15 | 16 | - 类型: { [key: string]: Function } 17 | 18 | - 默认值: {} 19 | 20 | - 用法: 21 | ```js 22 | Vue.config.optionMergeStrategies._my_option = function (parent, child, vm) { 23 | return child + 1 24 | } 25 | const Profile = Vue.extend({ 26 | _my_option: 1 27 | }) 28 | // Profile.options._my_option = 2 29 | //自定义合并策略的选项。 30 | //合并策略选项分别接受第一个参数作为父实例,第二个参数为子实例,Vue实例上下文被作为第三个参数传入。 31 | ``` 32 | 33 | - devtools 34 | 35 | - 类型: boolean 36 | 37 | - 默认值: true (生产版为 false) 38 | 39 | - 用法: 40 | ```js 41 | // 务必在加载 Vue 之后,立即同步设置以下内容 42 | Vue.config.devtools = true 43 | //配置是否允许 vue-devtools 检查代码。开发版本默认为 true,生产版本默认为 false。生产版本设为 true 可以启用检查。 44 | ``` 45 | 46 | - errorHandler 47 | 48 | - 类型: Function 49 | 50 | - 默认值: 默认抛出错误 51 | 52 | - 用法: 53 | ```js 54 | Vue.config.errorHandler = function (err, vm) { 55 | // handle error 56 | } 57 | //指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。 58 | //Sentry, an error tracking service, provides official integration using this option. 59 | ``` 60 | ``` 61 | - ignoredElements 62 | 63 | - 类型: Array 64 | 65 | - 默认值: [] 66 | 67 | - 用法: 68 | ```js 69 | Vue.config.ignoredElements = [ 70 | 'my-custom-web-component', 'another-web-component' 71 | ] 72 | 须使 Vue 忽略在 Vue 之外的自定义元素 (e.g., 使用了 Web Components APIs)。否则,它会假设你忘记注册全局组件或者拼错了组件名称,从而抛出一个关于 Unknown custom element 的警告。 73 | ``` 74 | 75 | - keyCodes 76 | 77 | - 类型: { [key: string]: number | Array } 78 | 79 | - 默认值: {} 80 | 81 | - 用法: 82 | ```js 83 | Vue.config.keyCodes = { 84 | v: 86, 85 | f1: 112, 86 | mediaPlayPause: 179, 87 | up: [38, 87] 88 | } 89 | //给 v-on 自定义键位别名。 90 | ``` 91 | 92 | ## Vue的全局API 93 | 94 | Vue的全局API提供大量的功能,我这里就给大家罗列几个常用的结果,其他的还是参考[官网](https://cn.vuejs.org/v2/api/#全局-API). 95 | 96 | ### Vue.nextTick 97 | 98 | `语法: Vue.nextTick( [callback, context] )` 99 | 100 | ``` 101 | 参数: 102 | {Function} [callback] 103 | {Object} [context] 104 | ``` 105 | 106 | 用法: 107 | 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 108 | 109 | ```js 110 | // 修改数据 111 | vm.msg = 'Hello' 112 | // DOM 还没有更新 113 | Vue.nextTick(function () { 114 | // DOM 更新了 115 | }) 116 | ``` 117 | ### Vue.set 118 | 119 | `语法: Vue.set( object, key, value )` 120 | 121 | ``` 122 | 参数: 123 | {Object} object 124 | {string} key 125 | {any} value 126 | 返回值: 设置的值. 127 | ``` 128 | 用法: 129 | 设置对象的属性。如果对象是响应式的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开 Vue 不能检测属性被添加的限制。 130 | 注意对象不能是 Vue 实例,或者 Vue 实例的根数据对象。 131 | 132 | ### Vue.compile 133 | 134 | - 语法: 135 | `Vue.compile( template )` 136 | 137 | - 参数: 138 | 139 | `{string} template` 140 | 141 | - 用法: 142 | ```js 143 | //在render函数中编译模板字符串。只在独立构建时有效 144 | 145 | var res = Vue.compile('
{{ msg }}
') 146 | new Vue({ 147 | data: { 148 | msg: 'hello' 149 | }, 150 | render: res.render, 151 | staticRenderFns: res.staticRenderFns 152 | }) 153 | ``` 154 | 155 | ### 全局API总结 156 | 其实还有几个其他的全局API,比如扩展组件Vue.extend 的用法、Vue.use加载插件、Vue.filter加载过滤器、Vue.directive自定义指令等 -------------------------------------------------------------------------------- /vue总结/Vue实例详解与生命周期.md: -------------------------------------------------------------------------------- 1 | # Vue实例详解与生命周期 2 | 3 | Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理、数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成、编译、挂着、销毁等过程进行js控制。 4 | 5 | ### Vue实例的computed 6 | 7 | - 介绍 8 | 9 | Vue的计算属性(computed)的属性会自动混入Vue的实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。这就很强大了,再计算属性中定义的函数里面可以直接使用指向了vue实例的this,异常方便的啊。 10 | 11 | - 类型 12 | 13 | `{ 键:函数}` 14 | `{ [key: string]: Function | { get: Function, set: Function } }` 15 | 当然,可以省略setter,如果省略了setter,那么值就可以是普通函数,但是必须有返回值。 16 | 17 | - 官方的实例 18 | ```html 19 | var vm = new Vue({ 20 | data: { a: 1 }, 21 | computed: { 22 | // 仅读取,值只须为函数 23 | aDouble: function () { 24 | return this.a * 2 25 | }, 26 | // 读取和设置 27 | aPlus: { 28 | get: function () { 29 | return this.a + 1 30 | }, 31 | set: function (v) { 32 | this.a = v - 1 33 | } 34 | } 35 | } 36 | }) 37 | vm.aPlus // -> 2 38 | vm.aPlus = 3 39 | vm.a // -> 2 40 | vm.aDouble // -> 4 41 | ``` 42 | 43 | ### methods 44 | 45 | - 类型: { [key: string]: Function } 46 | 47 | - 详细: 48 | 49 | methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。 50 | 51 | 注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。 52 | 53 | - 示例: 54 | 55 | ```js 56 | var vm = new Vue({ 57 | data: { a: 1 }, 58 | methods: { 59 | plus: function () { 60 | this.a++ 61 | } 62 | } 63 | }) 64 | vm.plus() 65 | vm.a // 2 66 | ``` 67 | 68 | ### watch 69 | - 类型 70 | 71 | ` { [key: string]: string | Function | Object }` 72 | 73 | - 详细: 74 | 75 | 一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。 76 | 77 | - 示例: 78 | 79 | ```js 80 | var vm = new Vue({ 81 | data: { 82 | a: 1, 83 | b: 2, 84 | c: 3 85 | }, 86 | watch: { 87 | // 监控a变量变化的时候,自动执行此函数 88 | a: function (val, oldVal) { 89 | console.log('new: %s, old: %s', val, oldVal) 90 | }, 91 | // 深度 watcher 92 | c: { 93 | handler: function (val, oldVal) { /* ... */ }, 94 | deep: true 95 | } 96 | } 97 | }) 98 | vm.a = 2 // -> new: 2, old: 1 99 | //注意,不应该使用箭头函数来定义 watcher 函数 (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.updateAutocomplete 将是 undefined。 100 | ``` 101 | ### 设置el的详解 102 | - 类型 103 | 104 | ` string | HTMLElement` 105 | 106 | 限制: 只在由 new 创建的实例中遵守。 107 | 108 | - 详细: 109 | 110 | 提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标,也就是说Vue绑定数据到哪里去找。可以是`CSS 选择器`,也可以是一个 `HTMLElement实例`。 111 | 112 | 在实例挂载之后, 元素可以用 vm.$el 访问。 113 | 114 | 如果这个选项在实例化时有作用,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译。 115 | 116 | ```js 117 | // 几乎所有例子都用到这个 118 | var app = new Vue({ 119 | el: '#app', 120 | ... 121 | }); 122 | ``` 123 | ## Vue实例的生命周期 124 | 125 | Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。 126 | 127 | 在Vue的整个生命周期中,它提供了一系列的事件,可以让我们注册js方法,可以让我们达到控制整个过程的目的地, 128 | 129 | 首先看看下面官网的一张生命周期的图, 130 | 131 | ![lifecycle-标注版本](C:\Users\admin\Desktop\vue总结\lifecycle-标注版本.png) 132 | 133 | 134 | 135 | Vue提供的可以注册的钩子都在上图片的红色框标注。 136 | 他们是: 137 | 138 | - `beforeCreate` 139 | 140 | 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。 141 | 142 | - `created` 143 | 144 | 实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。 145 | 146 | - `beforeMount` 147 | 148 | 在挂载开始之前被调用:相关的 render 函数首次被调用。 149 | 150 | - `mounted` 151 | 152 | el 被新创建的 vm. $el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm. $el 也在文档内。 153 | 154 | - `beforeUpdate` 155 | 156 | 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 157 | 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。 158 | 159 | - `updated` 160 | 161 | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 162 | 163 | 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。 164 | 165 | 该钩子在服务器端渲染期间不被调用。 166 | 167 | - `beforeDestroy` 168 | 169 | 实例销毁之前调用。在这一步,实例仍然完全可用。 170 | 171 | - ` destroyed` 172 | 173 | Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 174 | 该钩子在服务器端渲染期间不被调用。 -------------------------------------------------------------------------------- /vue总结/Vue指令介绍.md: -------------------------------------------------------------------------------- 1 | # Vue指令介绍 2 | 3 | **v-text** 4 | ```html 5 | 6 | 7 | {{msg}} 8 | ``` 9 | **v-html** 10 | ```html 11 |
12 | ``` 13 | >指令的值可以为标签 14 | 15 | **v-show** 16 | ```html 17 |

Hello!

18 | ``` 19 | >true显示false隐藏 20 | 21 | **v-if && v-else $$ v-else-if** 22 | 23 | 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作。最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据。如果有数据就显示表格数据。 24 | Vue帮我们提供了一个`v-if`的指令,帮助我们完成判断的模板处理。 25 | 26 | ```html 27 |
28 | 1 29 |
30 |
31 | 2 32 |
33 |
34 | 3 35 |
36 | ``` 37 | 38 | > 类似于 `v-else`,,`v-else-if` 必须紧跟在 `v-if` 或者 `v-else-if` 元素之后。 39 | 40 | **v-for** 41 | 42 | 模板引擎都会提供循环的支持。Vue也不例外,Vue是提供了一个`v-for`指令。基本的用法类似于foreach的用法。还是看例子最直接,上代码: 43 | 44 | ```html 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
姓名年龄地址
{{ item.name }}{{ item.age }}{{ item.address }}
63 |
64 | 76 | 77 | 78 |
79 |
80 |
81 | 82 |
83 | {{ item.text }} 84 |
85 | ``` 86 | 如果我们希望每次循环生成两个tr标签呢?如果还有生成其他的标签呢?Vue给我们提供了template标签,供我们用于v-for循环中进行处理。 87 | 88 | ```html 89 |
    90 | 91 | 95 |
96 | ``` 97 | 98 | 99 | 100 | > 一般作为列表渲染 注意:key是保证数据的唯一性 不写不会报错但是会出现警告 101 | 102 | **v-on** 103 | 104 | 内联的方式绑定的事件,只能处理简单的事件的处理逻辑。复杂的情况还是封装到js中最方便,也不容易出错。 105 | Vue对象中可以添加methods属性,开发者可以把事件处理函数的逻辑放到methods中。 106 | 107 | ``` 108 | 109 |
110 |

{{ number }}

111 | 112 | 113 |
114 | 128 | ``` 129 | 130 | 在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现这点,但更好的方式是:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。 131 | 为了解决这个问题, Vue.js 为 v-on 提供了 事件修饰符。通过由点(.)表示的指令后缀来调用修饰符。 132 | 133 | ```html 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 |
146 | 147 | 148 | 149 | 150 | 151 | 像ctrl不能直接写键名字 需要keycode 152 | ``` 153 | 154 | - `.stop` - 调用 `event.stopPropagation()`。 155 | - `.prevent` - 调用 `event.preventDefault()`。 156 | - `.capture` - 添加事件侦听器时使用 capture 模式。 157 | - `.self` - 只当事件是从侦听器绑定的元素本身触发时才触发回调。 158 | - `.{keyCode | keyAlias}` - 只当事件是从侦听器绑定的元素本身触发时才触发回调。 159 | - `.native` - 监听组件根元素的原生事件。 160 | 161 | **v-bind** 162 | 163 | ```html 164 | 165 | 166 | 167 | 168 |
<-- color是写死的 isred为变量--> 169 |
170 | ``` 171 | 172 | > 作用绑定数据的 173 | 174 | ![06.img中有关v-bind的说明](C:\Users\admin\Desktop\vue总结\06.img中有关v-bind的说明.png) 175 | 176 | **v-model** 177 | 178 | **限制:** 179 | 180 | - input 181 | 182 | - select 183 | 184 | - textarea 185 | 186 | > 作用于表单标签 在表单控件或者组件上创建双向绑定 187 | 188 | ![07.v-model实现数据的双向绑定](C:\Users\admin\Desktop\vue总结\07.v-model实现数据的双向绑定.png) 189 | 190 | **自定义指令** 191 | 192 | ```javascript 193 | Vue.directive('red',(color = 'red'){ //er6 语法 如果color没值就把"red"赋过去 194 | this.el.style.background = color; 195 | }); 196 | 197 | window.onload=()=>{ 198 | var vm=new Vue({ 199 | el:'#app', 200 | data:{ 201 | msg:'welcome' 202 | } 203 | }); 204 | }; 205 | ``` 206 | 207 | ```html 208 |
209 | 210 | asdfasd 211 | 212 |
213 | ``` 214 | -------------------------------------------------------------------------------- /vue总结/Vue模块通讯.md: -------------------------------------------------------------------------------- 1 | # Vue模块通讯 2 | 3 | ## 父子组件通讯 4 | 5 | 父组件通过子组件的prop进行传递数据,而且数据传递是`单向`的。也就是说:父组件可以把数据传递给子组件,但是 6 | 反之则不同。如下图所示: 7 | 8 | ![05vue](C:\Users\admin\Desktop\vue总结\05vue.png) 9 | 10 | 11 | >父组件 12 | ```html 13 |
14 | 15 |
16 | ``` 17 | >子组件 18 | ``` javascript 19 | props: ["stockcount"] 20 | ``` 21 | -------------------------------------------------------------------------------- /vue总结/Vue简介.md: -------------------------------------------------------------------------------- 1 | ## Vue简介 2 | `Vue`是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view]。新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue的单文件组件开发方式都很有创新,另外Vue自身的一些绑定的语法、用法等都非常精炼,很容易上手,而且第三方的插件都非常丰富,社区非常活跃,最新的文档都有中文版本。而且Vue配合官方的和第三方的库可以实现单文件的组件化开发、SPA等现代化前端开发。 3 | 详情请参考[Vue官网](https://cn.vuejs.org/) 4 | 5 | ## Vue的入门demo 6 | 7 | `Vue` 可以直接把它当做一个js库使用,所以它可以很容易的接入到你的项目或者单个页面中。甚至你可以只使用它的双向绑定功能。所以它很容易上手。 8 | 9 | 比如:我们有一个需求,一个网页上一个Div标签,我们有一个json对象存储数据,把json对象上的数据放到Div上去。 10 | 11 | 接下来是步骤: 12 | ``` 13 | 第一步: 创建一个文件夹并创建一个html文件 比如:index.html. 14 | 当如你可以选择你自己的编辑器,我就用VSCode。 15 | 16 | 第二步:引入Vue库 17 | 18 | 当然了你可以直接下载Vue的js文件,推荐你直接用上面的cdn即可。 19 | 20 | 第三步:创建一个Div,给它一个id,比如:app 21 | 22 | 第四步:创建Vue的对象,并把数据绑定到上面创建好的div上去。 23 | ``` 24 | 最终的代码如下: 25 | ```html 26 | 27 | 28 | 29 | 30 | Vue入门之Helloworld 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | {{ message }} 39 |
40 | 41 | 42 | 50 | 51 | 52 | ``` 53 | 最终的结果就是: 54 | ``` 55 | Hello Vue! 56 | ``` 57 | 58 | ![01.MVVM思想图](C:\Users\admin\Desktop\vue总结\01.MVVM思想图.png) -------------------------------------------------------------------------------- /vue总结/Vue组件化开发.md: -------------------------------------------------------------------------------- 1 | # Vue组件化开发 2 | 3 | 组件其实就是一个拥有样式、动画、js逻辑、HTML结构的综合块。前端组件化确实让大的前端团队更高效的开发前端项目。而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色。尤其是她单文件组件开发的方式更是非常方便,而且第三方工具支持也非常丰富,社区也非常活跃,第三方组件也呈井喷之势 4 | 5 | ## 全局扩展方法`Vue.extend` 6 | Vue提供了一个全局的API,`Vue.extend`可以帮助我们对Vue实例进行扩展,扩展完了之后,就可以用此扩展对象创建新的Vue实例了。 7 | 类似于继承的方式。 8 | 9 | ``` 10 | 语法:Vue.extend( options ) 11 | 12 | 参数:{Object} options 13 | 14 | 用法:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象 15 | ``` 16 | 下面是一个官网demo: 17 | ```html 18 |
19 | 33 | 34 | 35 | // 创建 Profile 实例,并挂载到一个元素上。 36 | new Profile().$mount('#mount-point') 37 | // .$mount() 方法跟设置 el属性效果是一致的。 38 | 39 | 结果如下: 40 | 41 |

Walter White aka Heisenberg

42 | ``` 43 | 44 | 当然除了官方提供的方法外你还可以使用Vue对象的prototype直接实现扩展 45 | 46 | ```javascript 47 | import http from "../public/tools/http.js" 48 | Vue.prototype.getDataGet = function(url, callback) { 49 | this.$http.get(http.host + url).then(res => { 50 | console.log(http.host + url) 51 | callback(res.body) 52 | }, err => { 53 | console.log(err) 54 | }) 55 | } 56 | Vue.prototype.getDataPsst = function(url, data, callback) { 57 | this.$http.post(http.host + url, data, { emulateJSON: true }).then(res => { 58 | callback(res.body) 59 | }, err => { 60 | console.log(err) 61 | }) 62 | } 63 | ``` 64 | 65 | >使用这种方法简单粗暴建议使用官方提供的 Vue.extend() 66 | ## 创建组件和注册组件 67 | 68 | 当然上面的方式只是能让我们继承Vue实例做一些扩展的动作。看Vue中如何创建一个组件并注册使用。 69 | 70 | Vue提供了一个全局注册组件的方法:Vue.component。 71 | 72 | ``` 73 | 语法: Vue.component( id, [definition] ) 74 | 75 | 参数: 76 | {string} id 组件的名字,可以当HTML标签用,注意组件的名字都是小写,而且最好有横线和字母组合。 77 | {Function | Object} [definition] 组件的设置 78 | 79 | 用法: 80 | 注册或获取全局组件。注册还会自动使用给定的id设置组件的名称 81 | 82 | // 注册组件,传入一个扩展过的构造器 83 | Vue.component('my-component', Vue.extend({ /* ... */ })) 84 | // 注册组件,传入一个选项对象(自动调用 Vue.extend) 85 | Vue.component('my-component', { /* ... */ }) 86 | // 获取注册的组件(始终返回构造器) 87 | var MyComponent = Vue.component('my-component') 88 | ``` 89 | 90 | 简单demo: 91 | 92 | ```html 93 |
94 | 95 | 96 |
97 | ``` 98 | ```js 99 | // 注册一个组件 100 | Vue.component('my-component', { 101 | // 模板选项设置当前组件,最终输出的html模板。注意:有且只有一个根元素。 102 | template: '
A custom component!
' 103 | }) 104 | // 创建根实例 105 | new Vue({ 106 | el: '#example' 107 | }) 108 | ``` 109 | 110 | 那么我们注册一个组件自动帮我生成 label和radiobutton组合。 111 | ```html 112 | 113 | 114 | 115 | 116 | Vue入门之extend全局方法 117 | 118 | 119 | 120 |
121 | 122 | 123 | 124 | 125 | 126 |
127 | 150 | 151 | 152 | ``` 153 | 注意点: 154 | 155 | - 组件的名字都必须是小写【[其实是非必须,但是为了不麻烦就强制吧](https://cn.vuejs.org/v2/guide/components.html#组件命名约定)】!!!而且建议是小写字母和横线的组合比如: my-radiobtn 156 | - 注册组件的时候,可以传入一个选项对象进行配置。其中`props`是设置当前组件的属性,属性也都必须小写。属性是连接父容器和子组件的桥梁。 157 | - 注意:属性名和组件的名字都要小写啊,不然vue不会认的。 158 | - 编写组件代码最好配合Vue的chrome插件:[vue-devtool](https://github.com/vuejs/vue-devtools) 159 | - 组件可以返还自己的数据,但是必须是函数。data必须是Function 160 | 161 | ## 局部注册组件 162 | 全局注册组件就是使用全局API `Vue.componet(id, {....})`就行了,当然我们有时候需要注册一个局部模块的自己用的组件。那么就可以用下面的方式了。 163 | 164 | ```js 165 | var Child = { 166 | template: '
A custom component!
' 167 | } 168 | new Vue({ 169 | // ... 170 | components: { 171 | // 将只在父模板可用 172 | 'my-component': Child 173 | } 174 | }) 175 | ``` 176 | ## 父子组件传值 177 | 178 | ```html 179 | 184 | 197 | 198 | ``` 199 | 200 | -------------------------------------------------------------------------------- /vue总结/Vue脚手架工具.md: -------------------------------------------------------------------------------- 1 | ## Vue脚手架工具 2 | 3 | 其实如果编写Vue的前端项目,直接使用vue的官方vue-cli构建工具最好用,一个命令就可以直接生成项目的结构和目录。 4 | 而且官方需要依赖的包也可以自动配置好,只需要npm instal一下,然后就可以开发测试了。 5 | 6 | ### `vue-cli`安装 7 | 8 | ```shell 9 | # 安装vue-cli。 安装之前首先确保你已经安装好了nodejs 而且打开命令行 10 | $ npm install -g vue-cli 11 | 12 | # 校验一下是否安装成功 13 | $ vue -V 14 | 15 | #=> 2.5.1 我当前的版本是这个,你的可能比这个新 16 | ``` 17 | 18 | ### 使用`vue-cli`初始化项目 19 | 20 | 通过以下命令的方式可以创建一个项目文件夹,并初始化对应的文件。 21 | 22 | ```shell 23 | $ vue init 24 | ``` 25 | 其中template-name可以取以下值,每个值对应不同的项目构建的模板。 26 | - [webpack](https://github.com/vuejs-templates/webpack)--全功能的Webpack + vueify,包括热加载,静态检测,单元测试 27 | - [webpack](https://github.com/vuejs-templates/webpack-simple)-simple--一个简易的Webpack + vueify,以便于快速开始。 28 | - [browserify](https://github.com/vuejs-templates/browserify)--全功能的Browserify + vueify,包括热加载,静态检测,单元测试 29 | - [browserify](https://github.com/vuejs-templates/browserify-simple)-simple--一个简易的Browserify + vueify,以便于快速开始。 30 | 31 | 安装和开发控制台的命令: 32 | 33 | ```shell 34 | # 如果已经安装,请省略 35 | $ npm install -g vue-cli 36 | 37 | # 初始化一个webpack全功能包的vue项目,请您把my-project换成你自己的项目名。 38 | $ vue init webpack my-project 39 | 40 | # 用命令行进入当前项目目录 41 | $ cd my-project 42 | 43 | # npm安装所有的依赖的包 44 | $ npm install 45 | 46 | # 运行测试的首页 47 | $ npm run dev 48 | ``` 49 | 50 | ### 综合实例开发记录 51 | 52 | 1. 通过vue-cli构建工具初始化项目目录 53 | 54 | >安装过程,控制台会问你项目名称是什么?项目描述?项目作者,是否使用eslint校验,是否使用单元测试等.... 55 | 56 | 我的安装过程如下请参考: 57 | 58 | ```shell 59 | $ vue init webpack ttl # => 安装webpack模板的项目 ttl(项目名可以随便取) 60 | 61 | A newer version of vue-cli is available. 62 | 63 | latest: 2.6.0 64 | installed: 2.5.1 65 | 66 | This will install Vue 2.x version of template. 67 | 68 | For Vue 1.x use: vue init webpack#1.0 ttl 69 | 70 | ? Project name mydemovue # => 项目名称 71 | ? Project description A Vue.js project # => 项目描述 72 | ? Author malun # => 作者 73 | ? Vue build standalone # => 是否支持单文件组件 74 | ? Use ESLint to lint your code? Yes # => 是否支持ESLint代码校验 75 | ? Pick an ESLint preset Standard # => 校验的标准是什么? 76 | ? Setup unit tests with Karma + Mocha? Yes # => 是否使用单元测试 77 | ? Setup e2e tests with Nightwatch? Yes # => 是否使用e2e测试 78 | 79 | vue-cli · Generated "ttl". 80 | 81 | To get started: 82 | 83 | cd ttl 84 | npm install 85 | npm run dev 86 | 87 | Documentation can be found at https://vuejs-templates.github.io/webpack 88 | ``` 89 | 90 | 通过上面一系列的命令后,我们就会创建一个webpack配置好的项目包。目录结构如下: 91 | 92 | ```shell 93 | ttl 94 | |--.babelrc #=> babel的配置文件,主要用于转换es6等最新的js语法。 95 | |--.editorconfig #=> 编辑器配置 96 | |--.eslintignore #=> eslint的忽略校验的配置文件 97 | |--.eslintrc.js #=> eslint的配置校验js是否规范的配置文件 98 | |--.gitignore #=> 设置git忽略的管理的文件 99 | |--README.md #=> readme说明文件 100 | |--build/ #=> 自动构建存放的文件地方 101 | |--config/ #=> 当前开发、测试等配置的文件,需要懂点nodejs了啊。 102 | |--index.html #=> 项目的主入口的模板 103 | |--package.json #=> npm的配置文件 104 | |--src/ #=> 源码目录 105 | |--static/ #=> 静态资源存放的目录 106 | |--test/ #=> 测试相关目录 107 | ``` 108 | 109 | 2. 初始化依赖包 110 | 111 | ```shell 112 | $ cd ttl #=> 进入上面创建好的项目目录 113 | $ npm install #=> 安装所有的依赖包。 安装过程可能非常长,网络也可能有问题,请耐心等待。 114 | 115 | # 安装完成后,可以直接运行测试,如果自动打开浏览器,并跳转到http://localhost:8080/ 说明一切都ok了。 116 | $ npm run dev 117 | ``` 118 | 119 | > npm 安装的时候经常网会断开,国内的网(哎,说多了都是泪)你懂的。最好能科学上网,或者是用淘宝的npm的镜像 120 | 121 | 3. 安装`vue-router`组件 122 | 123 | ```shell 124 | $ npm i -S vue-router 125 | ``` 126 | 127 | 4. 到项目的 `/src/components/` 目录下创建三个组件文件。 128 | 129 | 分别是: 130 | 131 | - 首页组件 132 | 133 | ```html 134 | 139 | 140 | 150 | 151 | 156 | ``` 157 | 158 | - 用户首页组件 159 | 160 | ```html 161 | 166 | 167 | 177 | 178 | 183 | ``` 184 | 185 | - 产品组件 186 | 187 | ```html 188 | 193 | 194 | 204 | 205 | 210 | ``` 211 | 212 | 项目的目录结构为: 213 | 214 | ``` 215 | ttl 216 | |-- src 217 | |--|-- Hello.vue 218 | |--|-- Home.vue 219 | |--|-- Product.vue 220 | |--|-- User.vue 221 | ``` 222 | 223 | 5. 创建router对象及配置路由 224 | 225 | 在`src`目录下创建`approuter.js`文件。 226 | 然后添加如下代码: 227 | 228 | ```js 229 | import VueRouter from 'vue-router' // 导入路由模块 230 | import Home from './components/Home.vue' // 导入Home组件 231 | import User from './components/User.vue' 232 | import Product from './components/Product.vue' 233 | 234 | export default new VueRouter({ // 定义路由规则对象 235 | routes: [ 236 | {path: '/home', component: Home}, 237 | {path: '/user/:id', component: User}, 238 | {path: '/product/:id', component: Product} 239 | ] 240 | }) 241 | ``` 242 | 6. 修改main.js文件 243 | 找到`src/`目录下的main.js文件, 244 | 共修改4处,添加路由引用、添加路由规则对象导入、启用路由、将路由键入到Vue中。 245 | 修改此文件为: 246 | 247 | ```js 248 | // The Vue build version to load with the `import` command 249 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 250 | import Vue from 'vue' 251 | import App from './App' 252 | import VueRouter from 'vue-router' // +++1、导入路由组件 253 | import router from './approuter' // +++2、导入我们自己写的路由配置文件 254 | 255 | // +++ 3、使用路由组件 256 | Vue.use(VueRouter) 257 | 258 | /* eslint-disable no-new */ 259 | new Vue({ 260 | el: '#app', 261 | template: '', 262 | components: { App }, 263 | router: router // +++4、添加路由对象 264 | }) 265 | ``` 266 | 267 | 7. 在app.vue中添加路由导航 268 | 269 | 最终代码如下: 270 | 271 | ```html 272 | 287 | 288 | 302 | 303 | 318 | ``` 319 | -------------------------------------------------------------------------------- /vue总结/Vue路由详解.md: -------------------------------------------------------------------------------- 1 | # Vue路由详解 2 | 3 | > 单页面应用,浏览器和超连接的跳转方式已经不能适用, 4 | > 所以各大框架纷纷给出了单页面应用的解决路由跳转的方案。 5 | > Vue官方也给出了路由的方案: `vue-router`; 6 | > 建议还是用官方的最好,使用量也是最大 7 | 8 | 9 | vue-router开发的步骤: 10 | 11 | - 第一步: 引入vue和vue-router包。 12 | 13 | > 可以使用cdn的方式或者npm的方式。如果配合npm和webpack的话可以直接作为一个模块导入即可。 14 | 15 | ```javascript 16 | import VueRouter from 'vue-router' 17 | Vue.use(VueRouter) 18 | ``` 19 | 20 | - 第二步: 定义路由跳转的组件 21 | 22 | ```js 23 | // 1. 定义(路由)组件。 24 | import home from "./Components/home/home.vue" 25 | import newsList from "./Components/news/newsList.vue" 26 | ``` 27 | 28 | - 第三步: 定义路由规则对象 29 | 30 | ```js 31 | // 每个路由path应该映射一个组件。 其中"component" 可以是 32 | // 通过 Vue.extend() 创建的组件构造器, 33 | // 或者,只是一个组件配置对象。 34 | const routes = [ 35 | { path: "/", redirect: "home" },//这条为重定向 36 | { name: "home", path: "/home", component: home }, 37 | { name: "newsList", path: "/newsList", component: newsList }, 38 | ] 39 | 40 | // 创建路由对象 41 | const router = new VueRouter({ 42 | routes // (缩写)相当于 routes: routes,es6的新语法 43 | }) 44 | ``` 45 | 46 | - 第四步: 创建Vue对象,并加重上面创建的路由对象 47 | 48 | ```js 49 | // 记得要通过 router 配置参数注入路由, 50 | // 从而让整个应用都有路由功能 51 | const app = new Vue({ 52 | router 53 | }).$mount('#app') 54 | //如果使用webpack render: c => c(App), //使用webpack,渲染App.vue这个根组件 55 | ``` 56 | 57 | 58 | - 第五步: 在模板中编写路由跳转链接 59 | 60 | ```html 61 |
62 |

Hello App!

63 |

64 | 65 | 66 | 67 | Go to Foo 68 | Go to Bar 69 |

70 | 71 | 72 | 73 |
74 | ``` 75 | 76 | 77 | 78 | ## 路由参数获取 79 | 80 | 定义路由路径的时候,可以指定参数。参数需要通过路径进行标识:`/user/:id`就是定义了一个规则,/user开头,然后后面的就是id参数的值。 81 | 比如: 82 | 83 | ``` 84 | 路由规则: /user/:id 85 | /user/9 => id = 9 86 | /user/8 => id = 8 87 | /user/1 => id = 1 88 | 然后在跳转后的vue中可以通过this.$route.params.参数名获取对应的参数。 89 | 路由规则: /register 90 | router.push({ path: 'register', query: { plan: 'private' }}) 91 | 然后在跳转后的vue中可以通过this.$route.query.参数名获取对应的参数。 92 | ``` 93 | 94 | ## js控制路由跳转 95 | 96 | 上面我们演示的都是通过router-link进行跳转。 其实我们还可以通过js编程的方式进行路由的跳转。 97 | 98 | ```js 99 | // 当前路由的view跳转到 /home 100 | router.push('home') 101 | 102 | // 对象, 跳转到/home 103 | router.push({ path: 'home' }) 104 | 105 | // 命名的路由 106 | router.push({ name: 'user', params: { userId: 123 }}) 107 | 108 | // 带查询参数,变成 /register?plan=private 109 | router.push({ path: 'register', query: { plan: 'private' }}) 110 | ``` 111 | 112 | ## 嵌套路由 113 | 114 | 嵌套路由跟普通路由基本没有什么区别。但是可以让vue开发变的非常灵活。 115 | 官网这块写的也非常好,我就直接拷贝了(原谅我吧。) 116 | 实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如: 117 | 118 | ```html 119 |
120 | 121 |
122 | const User = { 123 | template: '
User {{ $route.params.id }}
' 124 | } 125 | 126 | const router = new VueRouter({ 127 | routes: [ 128 | { path: '/user/:id', component: User } 129 | ] 130 | }) 131 | 这里的 是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套 。例如,在 User 组件的模板添加一个 : 132 | 133 | const User = { 134 | template: ` 135 |
136 |

User {{ $route.params.id }}

137 | 138 |
139 | ` 140 | } 141 | 要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置: 142 | 143 | const router = new VueRouter({ 144 | routes: [ 145 | { path: '/user/:id', component: User, 146 | children: [ 147 | { 148 | // 当 /user/:id/profile 匹配成功, 149 | // UserProfile 会被渲染在 User 的 中 150 | path: 'profile', 151 | component: UserProfile 152 | }, 153 | { 154 | // 当 /user/:id/posts 匹配成功 155 | // UserPosts 会被渲染在 User 的 中 156 | path: 'posts', 157 | component: UserPosts 158 | } 159 | ] 160 | } 161 | ] 162 | }) 163 | ``` 164 | 165 | 要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。 166 | 你会发现,children 配置就是像 routes 配置一样的路由配置数组,所以呢,你可以嵌套多层路由。 167 | 168 | 此时,基于上面的配置,当你访问 /user/foo 时,User 的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个 空的 子路由:或者重定向 169 | 170 | ```js 171 | const router = new VueRouter({ 172 | routes: [ 173 | { 174 | path: '/user/:id', component: User, 175 | children: [ 176 | // 当 /user/:id 匹配成功, 177 | // UserHome 会被渲染在 User 的 中 178 | { path: '', component: UserHome }, 179 | ] 180 | } 181 | ] 182 | }) 183 | ``` 184 | **综合代码** 185 | 186 | ``` html 187 | 188 |
189 | 登录 190 | 注册 191 | 192 | 193 | 194 |
195 | 196 | ``` 197 | 198 | ```javascript 199 | 200 | //定义好登录组件 201 | var loginComponent = Vue.extend({ 202 | template : '

登录

' 203 | }) 204 | 205 | //定义好注册组件 注册 206 | var registerComponent = Vue.extend({ 207 | template : '

注册 --- {{username}}

', 208 | data:function(){ 209 | return { 210 | username : '' 211 | } 212 | }, 213 | created(){ 214 | console.log(this.$route.params.username); // 通过 this.$route.params.username 获取参数 215 | this.username = this.$route.params.username; 216 | } 217 | }) 218 | 219 | //创建好路由,并注册相关组件 220 | var vueRouter = new VueRouter({ 221 | routes : [ 222 | {name:'login',path:'/login',component:loginComponent}, 223 | {name:'register',path:'/register/:username',component:registerComponent}//通过路由传递参数 224 | ] 225 | }); 226 | 227 | //创建Vue对象 228 | var vue = new Vue({ 229 | el:'#app', 230 | router:vueRouter 231 | }); 232 | ``` 233 | 234 | ![09.路由的跳转](C:\Users\admin\Desktop\vue总结\09.路由的跳转.jpg) -------------------------------------------------------------------------------- /vue总结/lifecycle-标注版本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WanYiFeng/Vue-cms/d4b07c7b3ee112c75cc9d85e9dd1850f60743bfc/vue总结/lifecycle-标注版本.png -------------------------------------------------------------------------------- /vue总结/vue-resource.md: -------------------------------------------------------------------------------- 1 | # vue-resource 2 | 3 | ## POST请求 4 | 5 | ```javascript 6 | getData(){ 7 | const url = "http://127.0.0.1:3000/postLogin"; 8 | this.$http.post(url,{username: 'lisi',password:'lisi3'},{emulateJSON:true}).then(res=>{ 9 | console.log(res.body); 10 | },err=>{ 11 | console.log('请求失败'); 12 | }) 13 | } 14 | ``` 15 | 16 | ## GET请求 17 | 18 | ```javascript 19 | getData(){ 20 | const url = "http://127.0.0.1:3000/login?username=zhangsan&password=1233"; 21 | this.$http.get(url).then(res=>{ 22 | console.log(res.body); 23 | },err=>{ 24 | console.log('请求失败'); 25 | }) 26 | } 27 | ``` 28 | 29 | ## JSONP请求 30 | 31 | ```javascript 32 | getData(){ 33 | const url = "http://127.0.0.1:3000/jsonpLogin?username=zhangsan&password=123"; 34 | this.$http.jsonp(url).then(res=>{ 35 | console.log(res.body); 36 | },err=>{ 37 | console.log('请求失败'); 38 | }) 39 | } 40 | ``` 41 | 42 | > 注意JSONP请求需要服务端支持 43 | 44 | **NODEJS支持代码设定** 45 | 46 | ```javascript 47 | //2.0 将所有api的请求响应content-type设置为application/json 48 | app.all('/api/*',(req,res,next)=>{ 49 | //设置允许跨域响应报文头 50 | //设置跨域 51 | res.header("Access-Control-Allow-Origin", "*"); 52 | res.header("Access-Control-Allow-Headers", "X-Requested-With"); 53 | res.header("Access-Control-Allow-Methods","*"); 54 | 55 | res.setHeader('Content-Type','application/json;charset=utf-8'); 56 | next(); 57 | }); 58 | 59 | ``` 60 | 61 | ```javascript 62 | route.all('/api/jsonp',(req,res)=>{ 63 | 64 | var callbackFn = req.query.callback; 65 | 66 | var obj = {message:'jsonp 请求 ok'}; 67 | var jsonStr = JSON.stringify(obj); 68 | 69 | 70 | res.end(`${callbackFn}('${jsonStr}')`); 71 | 72 | }); 73 | 74 | module.exports = route 75 | ``` 76 | 77 | > 注意需要 基于 express 在实现 78 | 79 | -------------------------------------------------------------------------------- /vue总结/过滤器.md: -------------------------------------------------------------------------------- 1 | # 过滤器 2 | 3 | Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。过滤器应该被添加在 mustache 插值的尾部,由“管道符”指示: 4 | 5 | ## 全局的过滤器 6 | 7 | ```javascript 8 | Vue.filter('toLowerCase',function(input){ //第一个参数为过滤器的名字 第二个参数为回调函数 在回调函数中返回过滤完成后的数据 9 | return input.toLowerCase(); 10 | }) 11 | 12 | var vue = new Vue({ 13 | el:"#app", 14 | data:{ 15 | message : 'Hello Vue' 16 | } 17 | }); 18 | 19 | var vue2 = new Vue({ 20 | el:"#app2", 21 | data:{ 22 | msg : 'GOOD MORNING' 23 | } 24 | }); 25 | ``` 26 | 27 | ```html 28 |
29 | {{message | toLowerCase}} // "|"管道符 为过滤器的意思 后面跟着过滤器的名字 30 |
31 | 32 |
33 | {{msg | toLowerCase(msg,"vue2")}} // 过滤器可以传递参数一般第一个参数为为本身可以省略不写 其他参数 可以根据定义过滤器的规则进行传参 34 |
35 | ``` 36 | 37 | ##私有的过滤器 38 | 39 | ```javascript 40 | var vue = new Vue({ 41 | el:"#app", 42 | data:{ 43 | message : 'Hello Vue' 44 | }, 45 | filters:{ 46 | toLowerCase:function(input){ 47 | return input.toLowerCase(); 48 | } 49 | } 50 | }); 51 | 52 | var vue2 = new Vue({ 53 | el:"#app2", 54 | data:{ 55 | msg : 'GOOD MORNING' 56 | }, 57 | filters:{ 58 | toLowerCase:function(input){ 59 | return input.toLowerCase(); 60 | } 61 | } 62 | }); 63 | ``` 64 | 65 | ```html 66 |
67 | {{message | toLowerCase}} 68 |
69 | 70 |
71 | {{msg | toLowerCase}} 72 |
73 | ``` 74 | 75 | > 私有过滤器定义在当前的Vue对象里面 76 | 77 | ## 绑定的数据过滤器 78 | 79 | ```javascript 80 | {{ message | capitalize }} 81 | 82 | {{ message | capitalize }} 83 | 84 |
85 | Vue 2.x 中,过滤器只能在 mustache 绑定和 v-bind 表达式(从 2.1.0 开始支持)中使用,因为过滤器设计目的就是用于文本转换。为了在其他指令中实现更复杂的数据变换,你应该使用计算属性。 86 | 87 | 过滤器函数总接受表达式的值作为第一个参数。 88 | new Vue({ 89 | // ... 90 | filters: { 91 | capitalize: function (value) { 92 | if (!value) return '' 93 | value = value.toString() 94 | return value.charAt(0).toUpperCase() + value.slice(1) 95 | } 96 | } 97 | }) 98 | 过滤器可以串联: 99 | {{ message | filterA | filterB }} 100 | 过滤器是 JavaScript 函数,因此可以接受参数: 101 | {{ message | filterA('arg1', arg2) }} 102 | 这里,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。 103 | ``` --------------------------------------------------------------------------------