├── 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 |
2 |
3 |
13 |
14 |
36 |
37 |
38 |
49 |
84 |
--------------------------------------------------------------------------------
/item-cms/src/components/childConponent/CarouselImage.vue:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
25 |
--------------------------------------------------------------------------------
/item-cms/src/components/childConponent/comment.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
19 |
44 |
45 |
46 |
47 |
94 |
95 |
--------------------------------------------------------------------------------
/item-cms/src/components/childConponent/subAdd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
-
5 |
{{count}}
6 |
+
8 |
9 |
10 |
29 |
49 |
--------------------------------------------------------------------------------
/item-cms/src/components/goods/goodscomment.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
14 |
--------------------------------------------------------------------------------
/item-cms/src/components/goods/goodsdocs.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
27 |
47 |
--------------------------------------------------------------------------------
/item-cms/src/components/goods/goodsinfo.vue:
--------------------------------------------------------------------------------
1 |
2 |
45 |
46 |
93 |
149 |
--------------------------------------------------------------------------------
/item-cms/src/components/goods/goodslist.vue:
--------------------------------------------------------------------------------
1 |
2 |
28 |
29 |
104 |
123 |
--------------------------------------------------------------------------------
/item-cms/src/components/home/home.vue:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
43 |
--------------------------------------------------------------------------------
/item-cms/src/components/news/newsInfo.vue:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
15 |
31 |
32 |
--------------------------------------------------------------------------------
/item-cms/src/components/news/newsList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
23 |
24 |
25 |
47 |
--------------------------------------------------------------------------------
/item-cms/src/components/photo/photoinfo.vue:
--------------------------------------------------------------------------------
1 |
2 |
23 |
24 |
52 |
88 |
--------------------------------------------------------------------------------
/item-cms/src/components/photo/photolist.vue:
--------------------------------------------------------------------------------
1 |
2 |
28 |
29 |
30 |
81 |
--------------------------------------------------------------------------------
/item-cms/src/components/shopcart/shopcartlist.vue:
--------------------------------------------------------------------------------
1 |
2 |
34 |
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 | 
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 | {{ item.name }} |
58 | {{ item.age }} |
59 | {{ item.address }} |
60 |
61 |
62 |
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 |
92 | - {{ item.msg }}
93 |
94 |
95 |
96 | ```
97 |
98 |
99 |
100 | > 一般作为列表渲染 注意:key是保证数据的唯一性 不写不会报错但是会出现警告
101 |
102 | **v-on**
103 |
104 | 内联的方式绑定的事件,只能处理简单的事件的处理逻辑。复杂的情况还是封装到js中最方便,也不容易出错。
105 | Vue对象中可以添加methods属性,开发者可以把事件处理函数的逻辑放到methods中。
106 |
107 | ```
108 |
109 |
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 | 
175 |
176 | **v-model**
177 |
178 | **限制:**
179 |
180 | - input
181 |
182 | - select
183 |
184 | - textarea
185 |
186 | > 作用于表单标签 在表单控件或者组件上创建双向绑定
187 |
188 | 
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 | 
9 |
10 |
11 | >父组件
12 | ```html
13 |
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 | 
--------------------------------------------------------------------------------
/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 |
180 |
183 |
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 |
135 |
136 |
{{ msg }}
137 |
138 |
139 |
140 |
150 |
151 |
156 | ```
157 |
158 | - 用户首页组件
159 |
160 | ```html
161 |
162 |
163 |
{{ msg }}
164 |
165 |
166 |
167 |
177 |
178 |
183 | ```
184 |
185 | - 产品组件
186 |
187 | ```html
188 |
189 |
190 |
{{ msg }}
191 |
192 |
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 |
273 |
274 |
281 |
282 |
283 |
284 |
285 |
286 |
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 | 
--------------------------------------------------------------------------------
/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 | ```
--------------------------------------------------------------------------------
评论列表
24 |{{item.content}}
27 |28 | {{item.user_name}} 29 | {{item.add_time | timeFilter('YYYY-MM-DD')}} 30 |
31 |