├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .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 └── webpack.test.conf.js ├── config ├── dev.env.js ├── index.js ├── prod.env.js └── test.env.js ├── index.html ├── package.json ├── server ├── api.js ├── db.js └── index.js ├── src ├── App.vue ├── assets │ ├── images │ │ ├── Act-adress.png │ │ ├── Act-dollarIcoin.png │ │ ├── Act-listbg.jpg │ │ ├── Act-peoIcoin.png │ │ ├── Act-photo.jpg │ │ ├── Act-time.png │ │ ├── Act-usicon.jpg │ │ ├── Recharge-bg-cur.png │ │ ├── Recharge-bg.png │ │ ├── WechatIMG2.png │ │ ├── activity-icon.png │ │ ├── adv-img.jpg │ │ ├── author.jpg │ │ ├── baby.jpg │ │ ├── banner-reg.jpg │ │ ├── bg-bemember.jpg │ │ ├── bg-card.jpg │ │ ├── bg-member.jpg │ │ ├── bg-register.jpg │ │ ├── bg-scene.jpg │ │ ├── bottom-bg.png │ │ ├── bottom-community.png │ │ ├── bottom-course.png │ │ ├── bottom-index.png │ │ ├── bottom-msg.png │ │ ├── bottom-my.png │ │ ├── btn-back.png │ │ ├── btn-close.png │ │ ├── building.png │ │ ├── buyer-icon.png │ │ ├── clock.png │ │ ├── code-icon.png │ │ ├── coupon-code.jpg │ │ ├── coupon.jpg │ │ ├── coupon.png │ │ ├── coupon2.png │ │ ├── coupon3.png │ │ ├── coupon4.png │ │ ├── coupon5.png │ │ ├── course-details.jpg │ │ ├── course-img.jpg │ │ ├── course-jt.png │ │ ├── course-search-coin.png │ │ ├── default-head.png │ │ ├── deposit-coin.png │ │ ├── detail-pay-finish.jpg │ │ ├── detail-pay-nopay.jpg │ │ ├── erWeiCode-img.jpg │ │ ├── ewm.png │ │ ├── friend-icon.png │ │ ├── head-portrait.png │ │ ├── head.jpg │ │ ├── ico-card.png │ │ ├── ico-cardpay.png │ │ ├── ico-circle.png │ │ ├── ico-config.png │ │ ├── ico-coupon.png │ │ ├── ico-course.png │ │ ├── ico-nomalmem.png │ │ ├── ico-open.png │ │ ├── ico-order.png │ │ ├── ico-share.png │ │ ├── ico-sign.png │ │ ├── ico-store.png │ │ ├── ico-wallet.png │ │ ├── indexbanner.jpg │ │ ├── indexbanner1.jpg │ │ ├── indexbanner2.jpg │ │ ├── indexbanner3.jpg │ │ ├── indexbanner4.jpg │ │ ├── indexbanner5.jpg │ │ ├── indexlist1.jpg │ │ ├── indexlist2.jpg │ │ ├── jt-bottom.png │ │ ├── jt-left.png │ │ ├── jt-right.png │ │ ├── line.png │ │ ├── mucourse-img.jpg │ │ ├── mycourseDetail.jpg │ │ ├── newsicon.png │ │ ├── newstip.png │ │ ├── next.png │ │ ├── notice-banner.jpg │ │ ├── online-bg.jpg │ │ ├── open-detail.jpg │ │ ├── pay-success.png │ │ ├── prev.png │ │ ├── qrcode.jpg │ │ ├── shadow-code.png │ │ ├── shadow-share.png │ │ ├── shops-icon.png │ │ ├── square.jpg │ │ ├── st-titleicon.png │ │ ├── success-icon.png │ │ ├── teacher-bg-on.png │ │ ├── teacher-bg.png │ │ └── tip-light.png │ ├── js │ │ ├── TouchSlide.js │ │ ├── jquery.qrcode.min.js │ │ ├── layer │ │ │ ├── layer.js │ │ │ └── need │ │ │ │ └── layer.css │ │ └── rem.js │ └── style │ │ ├── public.css │ │ └── style.css ├── components │ └── foot.vue ├── fetch │ └── api.js ├── main.js ├── pages │ ├── admin │ │ ├── index │ │ │ └── index.vue │ │ └── login │ │ │ └── index.vue │ └── home │ │ └── index │ │ └── index.vue └── router │ └── index.js ├── static └── .gitkeep ├── test ├── e2e │ ├── custom-assertions │ │ └── elementCount.js │ ├── nightwatch.conf.js │ ├── runner.js │ └── specs │ │ └── test.js └── unit │ ├── .eslintrc │ ├── index.js │ ├── karma.conf.js │ └── specs │ └── Hello.spec.js └── testDb ├── users.bson └── users.metadata.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["istanbul"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | test/unit/coverage 8 | test/e2e/reports 9 | selenium-debug.log 10 | 11 | # Editor directories and files 12 | .idea 13 | .vscode 14 | *.suo 15 | *.ntvs* 16 | *.njsproj 17 | *.sln 18 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 全栈微信商城项目 2 | 所用技术栈:Express+Mongoose(MongoDB)+Vue2。 3 | 4 | 运行环境:node.js 5 | 6 | 后台框架:express.js 7 | 8 | 数据库:Mongoose.js (MongoDB) 9 | 10 | 前端脚手架:vue-cli 11 | 12 | 用户认证:JSON WEB TOKEN 13 | 14 | 所用插件:vue-scroller/touchslider/layer。 15 | 16 | 关于前后端分离:restful接口。 17 | 18 | 关于跨域:proxyTable,代理模式。 19 | 20 | 关于请求:axios+promise。 21 | 22 | 关于页面状态:vuex+sessionstorge。 23 | 24 | 运行项目开发环境: 25 | 26 | 1.安装数据库:从mongodb官网下载mongodb并安装。 27 | 28 | 2.启动数据库服务:在mongodb安装目录下找到bin/mongod.exe,双击。 29 | 30 | 3.进入本项目目录安装依赖包:cnpm install 31 | 32 | 4.运行开发环境:npm run dev 33 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, function (err, stats) { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | function exec (cmd) { 7 | return require('child_process').execSync(cmd).toString().trim() 8 | } 9 | 10 | const versionRequirements = [ 11 | { 12 | name: 'node', 13 | currentVersion: semver.clean(process.version), 14 | versionRequirement: packageConfig.engines.node 15 | } 16 | ] 17 | 18 | if (shell.which('npm')) { 19 | versionRequirements.push({ 20 | name: 'npm', 21 | currentVersion: exec('npm --version'), 22 | versionRequirement: packageConfig.engines.npm 23 | }) 24 | } 25 | 26 | module.exports = function () { 27 | const warnings = [] 28 | for (let i = 0; i < versionRequirements.length; i++) { 29 | const mod = versionRequirements[i] 30 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 31 | warnings.push(mod.name + ': ' + 32 | chalk.red(mod.currentVersion) + ' should be ' + 33 | chalk.green(mod.versionRequirement) 34 | ) 35 | } 36 | } 37 | 38 | if (warnings.length) { 39 | console.log('') 40 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 41 | console.log() 42 | for (let i = 0; i < warnings.length; i++) { 43 | const warning = warnings[i] 44 | console.log(' ' + warning) 45 | } 46 | console.log() 47 | process.exit(1) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 'use strict' 3 | require('eventsource-polyfill') 4 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 5 | 6 | hotClient.subscribe(function (event) { 7 | if (event.action === 'reload') { 8 | window.location.reload() 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /build/dev-server.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | const config = require('../config') 4 | if (!process.env.NODE_ENV) { 5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 6 | } 7 | const opn = require('opn') 8 | const path = require('path') 9 | const express = require('express') 10 | const webpack = require('webpack') 11 | const proxyMiddleware = require('http-proxy-middleware') 12 | const webpackConfig = (process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'production') 13 | ? require('./webpack.prod.conf') 14 | : require('./webpack.dev.conf') 15 | 16 | // default port where dev server listens for incoming traffic 17 | const port = process.env.PORT || config.dev.port 18 | // automatically open browser, if not set will be false 19 | const autoOpenBrowser = !!config.dev.autoOpenBrowser 20 | // Define HTTP proxies to your custom API backend 21 | // https://github.com/chimurai/http-proxy-middleware 22 | const proxyTable = config.dev.proxyTable 23 | 24 | const app = express() 25 | const compiler = webpack(webpackConfig) 26 | 27 | const devMiddleware = require('webpack-dev-middleware')(compiler, { 28 | publicPath: webpackConfig.output.publicPath, 29 | quiet: true 30 | }) 31 | 32 | const hotMiddleware = require('webpack-hot-middleware')(compiler, { 33 | log: false, 34 | heartbeat: 2000 35 | }) 36 | // force page reload when html-webpack-plugin template changes 37 | // currently disabled until this is resolved: 38 | // https://github.com/jantimon/html-webpack-plugin/issues/680 39 | // compiler.plugin('compilation', function (compilation) { 40 | // compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 41 | // hotMiddleware.publish({ action: 'reload' }) 42 | // cb() 43 | // }) 44 | // }) 45 | 46 | // enable hot-reload and state-preserving 47 | // compilation error display 48 | app.use(hotMiddleware) 49 | 50 | // proxy api requests 51 | Object.keys(proxyTable).forEach(function (context) { 52 | let options = proxyTable[context] 53 | if (typeof options === 'string') { 54 | options = { target: options } 55 | } 56 | app.use(proxyMiddleware(options.filter || context, options)) 57 | }) 58 | 59 | // handle fallback for HTML5 history API 60 | app.use(require('connect-history-api-fallback')()) 61 | 62 | // serve webpack bundle output 63 | app.use(devMiddleware) 64 | 65 | // serve pure static assets 66 | const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 67 | app.use(staticPath, express.static('./static')) 68 | 69 | const uri = 'http://localhost:' + port 70 | 71 | var _resolve 72 | var _reject 73 | var readyPromise = new Promise((resolve, reject) => { 74 | _resolve = resolve 75 | _reject = reject 76 | }) 77 | 78 | var server 79 | var portfinder = require('portfinder') 80 | portfinder.basePort = port 81 | 82 | console.log('> Starting dev server...') 83 | devMiddleware.waitUntilValid(() => { 84 | portfinder.getPort((err, port) => { 85 | if (err) { 86 | _reject(err) 87 | } 88 | process.env.PORT = port 89 | var uri = 'http://localhost:' + port 90 | console.log('> Listening at ' + uri + '\n') 91 | // when env is testing, don't need open it 92 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { 93 | opn(uri) 94 | } 95 | server = app.listen(port) 96 | _resolve() 97 | }) 98 | }) 99 | //启动API服务 100 | const apiServer = require('../server/index.js') 101 | apiServer.start() 102 | 103 | module.exports = { 104 | ready: readyPromise, 105 | close: () => { 106 | server.close() 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | 6 | exports.assetsPath = function (_path) { 7 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 8 | ? config.build.assetsSubDirectory 9 | : config.dev.assetsSubDirectory 10 | return path.posix.join(assetsSubDirectory, _path) 11 | } 12 | 13 | exports.cssLoaders = function (options) { 14 | options = options || {} 15 | 16 | const cssLoader = { 17 | loader: 'css-loader', 18 | options: { 19 | minimize: process.env.NODE_ENV === 'production', 20 | sourceMap: options.sourceMap 21 | } 22 | } 23 | 24 | // generate loader string to be used with extract text plugin 25 | function generateLoaders (loader, loaderOptions) { 26 | const loaders = [cssLoader] 27 | if (loader) { 28 | loaders.push({ 29 | loader: loader + '-loader', 30 | options: Object.assign({}, loaderOptions, { 31 | sourceMap: options.sourceMap 32 | }) 33 | }) 34 | } 35 | 36 | // Extract CSS when that option is specified 37 | // (which is the case during production build) 38 | if (options.extract) { 39 | return ExtractTextPlugin.extract({ 40 | use: loaders, 41 | fallback: 'vue-style-loader' 42 | }) 43 | } else { 44 | return ['vue-style-loader'].concat(loaders) 45 | } 46 | } 47 | 48 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 49 | return { 50 | css: generateLoaders(), 51 | postcss: generateLoaders(), 52 | less: generateLoaders('less'), 53 | sass: generateLoaders('sass', { indentedSyntax: true }), 54 | scss: generateLoaders('sass'), 55 | stylus: generateLoaders('stylus'), 56 | styl: generateLoaders('stylus') 57 | } 58 | } 59 | 60 | // Generate loaders for standalone style files (outside of .vue) 61 | exports.styleLoaders = function (options) { 62 | const output = [] 63 | const loaders = exports.cssLoaders(options) 64 | for (const extension in loaders) { 65 | const loader = loaders[extension] 66 | output.push({ 67 | test: new RegExp('\\.' + extension + '$'), 68 | use: loader 69 | }) 70 | } 71 | return output 72 | } 73 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | 6 | module.exports = { 7 | loaders: utils.cssLoaders({ 8 | sourceMap: isProduction 9 | ? config.build.productionSourceMap 10 | : config.dev.cssSourceMap, 11 | extract: isProduction 12 | }), 13 | transformToRequire: { 14 | video: 'src', 15 | source: 'src', 16 | img: 'src', 17 | image: 'xlink:href' 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | module.exports = { 12 | entry: { 13 | app: './src/main.js' 14 | }, 15 | output: { 16 | path: config.build.assetsRoot, 17 | filename: '[name].js', 18 | publicPath: process.env.NODE_ENV === 'production' 19 | ? config.build.assetsPublicPath 20 | : config.dev.assetsPublicPath 21 | }, 22 | resolve: { 23 | extensions: ['.js', '.vue', '.json'], 24 | alias: { 25 | 'vue$': 'vue/dist/vue.esm.js', 26 | '@': resolve('src'), 27 | } 28 | }, 29 | module: { 30 | rules: [ 31 | /*{ 32 | test: /\.(js|vue)$/, 33 | loader: 'eslint-loader', 34 | enforce: 'pre', 35 | include: [resolve('src'), resolve('test')], 36 | options: { 37 | formatter: require('eslint-friendly-formatter') 38 | } 39 | },*/ 40 | { 41 | test: /\.vue$/, 42 | loader: 'vue-loader', 43 | options: vueLoaderConfig 44 | }, 45 | { 46 | test: /\.js$/, 47 | loader: 'babel-loader', 48 | include: [resolve('src'), resolve('test')] 49 | }, 50 | { 51 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 52 | loader: 'url-loader', 53 | options: { 54 | limit: 10000, 55 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 56 | } 57 | }, 58 | { 59 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 60 | loader: 'url-loader', 61 | options: { 62 | limit: 10000, 63 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 64 | } 65 | }, 66 | { 67 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 68 | loader: 'url-loader', 69 | options: { 70 | limit: 10000, 71 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 72 | } 73 | } 74 | ] 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const baseWebpackConfig = require('./webpack.base.conf') 7 | const HtmlWebpackPlugin = require('html-webpack-plugin') 8 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 9 | 10 | // add hot-reload related code to entry chunks 11 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 12 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 13 | }) 14 | 15 | module.exports = merge(baseWebpackConfig, { 16 | module: { 17 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 18 | }, 19 | // cheap-module-eval-source-map is faster for development 20 | devtool: '#cheap-module-eval-source-map', 21 | plugins: [ 22 | new webpack.DefinePlugin({ 23 | 'process.env': config.dev.env 24 | }), 25 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 26 | new webpack.HotModuleReplacementPlugin(), 27 | new webpack.NoEmitOnErrorsPlugin(), 28 | // https://github.com/ampedandwired/html-webpack-plugin 29 | new HtmlWebpackPlugin({ 30 | filename: 'index.html', 31 | template: 'index.html', 32 | inject: true 33 | }), 34 | new FriendlyErrorsPlugin() 35 | ] 36 | }) 37 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | 13 | const env = process.env.NODE_ENV === 'testing' 14 | ? require('../config/test.env') 15 | : config.build.env 16 | 17 | const webpackConfig = merge(baseWebpackConfig, { 18 | module: { 19 | rules: utils.styleLoaders({ 20 | sourceMap: config.build.productionSourceMap, 21 | extract: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? '#source-map' : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | // UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify 36 | new webpack.optimize.UglifyJsPlugin({ 37 | compress: { 38 | warnings: false 39 | }, 40 | sourceMap: true 41 | }), 42 | // extract css into its own file 43 | new ExtractTextPlugin({ 44 | filename: utils.assetsPath('css/[name].[contenthash].css') 45 | }), 46 | // Compress extracted CSS. We are using this plugin so that possible 47 | // duplicated CSS from different components can be deduped. 48 | new OptimizeCSSPlugin({ 49 | cssProcessorOptions: { 50 | safe: true 51 | } 52 | }), 53 | // generate dist index.html with correct asset hash for caching. 54 | // you can customize output by editing /index.html 55 | // see https://github.com/ampedandwired/html-webpack-plugin 56 | new HtmlWebpackPlugin({ 57 | filename: process.env.NODE_ENV === 'testing' 58 | ? 'index.html' 59 | : config.build.index, 60 | template: 'index.html', 61 | inject: true, 62 | minify: { 63 | removeComments: true, 64 | collapseWhitespace: true, 65 | removeAttributeQuotes: true 66 | // more options: 67 | // https://github.com/kangax/html-minifier#options-quick-reference 68 | }, 69 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 70 | chunksSortMode: 'dependency' 71 | }), 72 | // keep module.id stable when vender modules does not change 73 | new webpack.HashedModuleIdsPlugin(), 74 | // split vendor js into its own file 75 | new webpack.optimize.CommonsChunkPlugin({ 76 | name: 'vendor', 77 | minChunks: function (module) { 78 | // any required modules inside node_modules are extracted to vendor 79 | return ( 80 | module.resource && 81 | /\.js$/.test(module.resource) && 82 | module.resource.indexOf( 83 | path.join(__dirname, '../node_modules') 84 | ) === 0 85 | ) 86 | } 87 | }), 88 | // extract webpack runtime and module manifest to its own file in order to 89 | // prevent vendor hash from being updated whenever app bundle is updated 90 | new webpack.optimize.CommonsChunkPlugin({ 91 | name: 'manifest', 92 | chunks: ['vendor'] 93 | }), 94 | // copy custom static assets 95 | new CopyWebpackPlugin([ 96 | { 97 | from: path.resolve(__dirname, '../static'), 98 | to: config.build.assetsSubDirectory, 99 | ignore: ['.*'] 100 | } 101 | ]) 102 | ] 103 | }) 104 | 105 | if (config.build.productionGzip) { 106 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 107 | 108 | webpackConfig.plugins.push( 109 | new CompressionWebpackPlugin({ 110 | asset: '[path].gz[query]', 111 | algorithm: 'gzip', 112 | test: new RegExp( 113 | '\\.(' + 114 | config.build.productionGzipExtensions.join('|') + 115 | ')$' 116 | ), 117 | threshold: 10240, 118 | minRatio: 0.8 119 | }) 120 | ) 121 | } 122 | 123 | if (config.build.bundleAnalyzerReport) { 124 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 125 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 126 | } 127 | 128 | module.exports = webpackConfig 129 | -------------------------------------------------------------------------------- /build/webpack.test.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // This is the webpack config used for unit tests. 3 | 4 | const utils = require('./utils') 5 | const webpack = require('webpack') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | 9 | const webpackConfig = merge(baseWebpackConfig, { 10 | // use inline sourcemap for karma-sourcemap-loader 11 | module: { 12 | rules: utils.styleLoaders() 13 | }, 14 | devtool: '#inline-source-map', 15 | resolveLoader: { 16 | alias: { 17 | // necessary to to make lang="scss" work in test when using vue-loader's ?inject option 18 | // see discussion at https://github.com/vuejs/vue-loader/issues/724 19 | 'scss-loader': 'sass-loader' 20 | } 21 | }, 22 | plugins: [ 23 | new webpack.DefinePlugin({ 24 | 'process.env': require('../config/test.env') 25 | }) 26 | ] 27 | }) 28 | 29 | // no need for app entry during tests 30 | delete webpackConfig.entry 31 | 32 | module.exports = webpackConfig 33 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict' 3 | // Template version: 1.1.3 4 | // see http://vuejs-templates.github.io/webpack for documentation. 5 | 6 | const path = require('path') 7 | 8 | module.exports = { 9 | build: { 10 | env: require('./prod.env'), 11 | index: path.resolve(__dirname, '../dist/index.html'), 12 | assetsRoot: path.resolve(__dirname, '../dist'), 13 | assetsSubDirectory: 'static', 14 | assetsPublicPath: '/', 15 | productionSourceMap: true, 16 | // Gzip off by default as many popular static hosts such as 17 | // Surge or Netlify already gzip all static assets for you. 18 | // Before setting to `true`, make sure to: 19 | // npm install --save-dev compression-webpack-plugin 20 | productionGzip: false, 21 | productionGzipExtensions: ['js', 'css'], 22 | // Run the build command with an extra argument to 23 | // View the bundle analyzer report after build finishes: 24 | // `npm run build --report` 25 | // Set to `true` or `false` to always turn it on or off 26 | bundleAnalyzerReport: process.env.npm_config_report 27 | }, 28 | dev: { 29 | env: require('./dev.env'), 30 | port: process.env.PORT || 8080, 31 | autoOpenBrowser: true, 32 | assetsSubDirectory: 'static', 33 | assetsPublicPath: '/', 34 | proxyTable:{ 35 | '/api': { 36 | // 测试环境 37 | target: 'http://localhost:8088/api', // 接口域名 38 | changeOrigin: true, //是否跨域 39 | pathRewrite: { 40 | '^/api': '' //需要rewrite重写的, 41 | } 42 | } 43 | }, 44 | // CSS Sourcemaps off by default because relative paths are "buggy" 45 | // with this option, according to the CSS-Loader README 46 | // (https://github.com/webpack/css-loader#sourcemaps) 47 | // In our experience, they generally work as expected, 48 | // just be aware of this issue when enabling this option. 49 | cssSourceMap: false 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"testing"' 7 | }) 8 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | wechat 6 | 7 | 8 | 9 |
10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wechat", 3 | "version": "1.0.0", 4 | "description": "全栈微信商城项目", 5 | "author": "seven9115 <394742175@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "api": "node server/index.js", 10 | "start": "npm run dev", 11 | "build": "node build/build.js", 12 | "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", 13 | "e2e": "node test/e2e/runner.js", 14 | "test": "npm run unit && npm run e2e", 15 | "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" 16 | }, 17 | "dependencies": { 18 | "vue": "^2.5.2", 19 | "vue-router": "^3.0.1", 20 | "vue-scroller": "^2.2.2", 21 | "vuex": "^2.0.0", 22 | "axios": "^0.16.2", 23 | "mongoose": "^4.12.3", 24 | "express": "^4.16.2", 25 | "express-jwt": "^5.3.0", 26 | "jsonwebtoken": "^8.1.0", 27 | "js-md5": "^0.7.2", 28 | "multer": "1.3.0" 29 | }, 30 | "devDependencies": { 31 | "autoprefixer": "^7.1.2", 32 | "babel-core": "^6.22.1", 33 | "babel-eslint": "^7.1.1", 34 | "babel-loader": "^7.1.1", 35 | "babel-plugin-transform-runtime": "^6.22.0", 36 | "babel-preset-env": "^1.3.2", 37 | "babel-preset-stage-2": "^6.22.0", 38 | "babel-register": "^6.22.0", 39 | "chalk": "^2.0.1", 40 | "connect-history-api-fallback": "^1.3.0", 41 | "copy-webpack-plugin": "^4.0.1", 42 | "css-loader": "^0.28.0", 43 | "eslint": "^3.19.0", 44 | "eslint-friendly-formatter": "^3.0.0", 45 | "eslint-loader": "^1.7.1", 46 | "eslint-plugin-html": "^3.0.0", 47 | "eslint-config-standard": "^10.2.1", 48 | "eslint-plugin-promise": "^3.4.0", 49 | "eslint-plugin-standard": "^3.0.1", 50 | "eslint-plugin-import": "^2.7.0", 51 | "eslint-plugin-node": "^5.2.0", 52 | "eventsource-polyfill": "^0.9.6", 53 | "express": "^4.14.1", 54 | "extract-text-webpack-plugin": "^3.0.0", 55 | "file-loader": "^1.1.4", 56 | "friendly-errors-webpack-plugin": "^1.6.1", 57 | "html-webpack-plugin": "^2.30.1", 58 | "http-proxy-middleware": "^0.17.3", 59 | "webpack-bundle-analyzer": "^2.9.0", 60 | "cross-env": "^5.0.1", 61 | "karma": "^1.4.1", 62 | "karma-coverage": "^1.1.1", 63 | "karma-mocha": "^1.3.0", 64 | "karma-phantomjs-launcher": "^1.0.2", 65 | "karma-phantomjs-shim": "^1.4.0", 66 | "karma-sinon-chai": "^1.3.1", 67 | "karma-sourcemap-loader": "^0.3.7", 68 | "karma-spec-reporter": "0.0.31", 69 | "karma-webpack": "^2.0.2", 70 | "mocha": "^3.2.0", 71 | "chai": "^4.1.2", 72 | "sinon": "^4.0.0", 73 | "sinon-chai": "^2.8.0", 74 | "inject-loader": "^3.0.0", 75 | "babel-plugin-istanbul": "^4.1.1", 76 | "phantomjs-prebuilt": "^2.1.14", 77 | "chromedriver": "^2.27.2", 78 | "cross-spawn": "^5.0.1", 79 | "nightwatch": "^0.9.12", 80 | "selenium-server": "^3.0.1", 81 | "semver": "^5.3.0", 82 | "shelljs": "^0.7.6", 83 | "opn": "^5.1.0", 84 | "optimize-css-assets-webpack-plugin": "^3.2.0", 85 | "ora": "^1.2.0", 86 | "rimraf": "^2.6.0", 87 | "url-loader": "^0.5.8", 88 | "vue-loader": "^13.3.0", 89 | "vue-style-loader": "^3.0.1", 90 | "vue-template-compiler": "^2.5.2", 91 | "portfinder": "^1.0.13", 92 | "webpack": "^3.6.0", 93 | "webpack-dev-middleware": "^1.12.0", 94 | "webpack-hot-middleware": "^2.18.2", 95 | "webpack-merge": "^4.1.0" 96 | }, 97 | "engines": { 98 | "node": ">= 4.0.0", 99 | "npm": ">= 3.0.0" 100 | }, 101 | "browserslist": [ 102 | "> 1%", 103 | "last 2 versions", 104 | "not ie <= 8" 105 | ] 106 | } 107 | -------------------------------------------------------------------------------- /server/api.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const models = require('./db'); 3 | const express = require('express'); 4 | const router = express.Router(); 5 | const expressJwt = require("express-jwt"); 6 | const jwt = require("jsonwebtoken"); 7 | const multer = require('multer'); 8 | const path = require('path'); 9 | 10 | router.use(expressJwt({secret: "secret"}).unless({path: ["/api/login"]})); 11 | router.use(function (err, req, res, next) { 12 | if (err.name === "UnauthorizedError") { 13 | res.status(200).send({errorCode:6,restbody:"token过期"}); 14 | } 15 | }); 16 | /************** 创建(create) 读取(get) 更新(update) 删除(delete) **************/ 17 | router.post("/api/authToken", function(req, res) { 18 | res.send({errorCode:0,restbody:"登录成功"}) 19 | }) 20 | router.post("/api/login", function(req, res) { 21 | const user = req.body.user; 22 | const password = req.body.password; 23 | 24 | if (!user) { 25 | return res.status(400).send("user require"); 26 | } 27 | if (!password) { 28 | return res.status(400).send("password require"); 29 | } 30 | 31 | if (user != "admin" && password != "password") { 32 | return res.status(401).send("invaild password"); 33 | } 34 | // 通过模型去查找数据库 35 | const userModel = { 36 | 'user': req.body.user, 37 | 'password': req.body.password 38 | } 39 | models.User.findOne(userModel, (err,data) => { 40 | if (err) { 41 | res.send(err) 42 | } else { 43 | if(data){ 44 | const authToken = jwt.sign({user: user}, "secret") 45 | res.status(200).json({errorCode:0,restbody:{token: authToken}}) 46 | } 47 | else{ 48 | res.send({errCode:1,restbody:"用户名或密码错误"}) 49 | } 50 | } 51 | }); 52 | 53 | }); 54 | 55 | // 获取已有博客账号接口 56 | router.get('/api/users',(req,res) => { 57 | // 通过模型去查找数据库 58 | models.User.find((err,data) => { 59 | if (err) { 60 | res.send(err); 61 | } else { 62 | res.send(data); 63 | } 64 | }); 65 | }); 66 | 67 | router.post('/api/users',(req,res) => { 68 | // 通过模型去查找数据库 69 | var user = new models.User({ 70 | title:req.body.title, 71 | website:req.body.website 72 | }); 73 | user.save((err,data) => { 74 | if (err) { 75 | res.send(err); 76 | } else { 77 | res.send(data); 78 | } 79 | }); 80 | }); 81 | 82 | router.put('/api/users/:id',(req,res) => { 83 | return models.User.findById(req.params.id,(err,user) => { 84 | if(!user){ 85 | res.statusCode = 404; 86 | return res.send({ error: "未找到该博客"}); 87 | } 88 | user.title = req.body.title; 89 | user.website = req.body.website; 90 | return user.save((err,data) => { 91 | if (!err) { 92 | return res.send({ status: 'OK', user:user }); 93 | } else { 94 | if(err.name == 'ValidationError') { 95 | res.statusCode = 400; 96 | res.send({ error: 'Validation error' }); 97 | } else { 98 | res.statusCode = 500; 99 | res.send({ error: '服务器异常' }); 100 | } 101 | } 102 | }) 103 | }) 104 | }) 105 | 106 | router.delete('/api/users/:id',(req,res) => { 107 | return models.User.findById(req.params.id,(err,user) => { 108 | if(!user){ 109 | res.statusCode = 404; 110 | return res.send({error: "未找到该博客"}); 111 | } 112 | return user.remove((err) => { 113 | if(!err){ 114 | return res.send({ status: "删除成功"}) 115 | } else { 116 | res.statusCode = 500; 117 | return res.send({ error: "服务器异常"}) 118 | } 119 | }) 120 | }) 121 | }) 122 | 123 | /* 图片上传路由 */ 124 | const storage = multer.diskStorage({ 125 | destination: function (req, file, cb) { 126 | cb(null, path.resolve('uploads')); 127 | }, 128 | filename: function (req, file, cb) { 129 | cb(null, Date.now() + path.extname(file.originalname)); 130 | } 131 | }); 132 | const upload = multer({storage: storage}).single('file'); 133 | router.post('/api/uploader', function(req, res) { 134 | upload(req, res, function (err) { 135 | if (err) { 136 | return res.send({ 137 | errorCode: 12, 138 | restbody: err 139 | }) 140 | } 141 | return res.send({ 142 | errorCode: 0, 143 | restbody:{"path": "uploads/" + path.basename(req.file.path)} 144 | }); 145 | }) 146 | }); 147 | module.exports = router; -------------------------------------------------------------------------------- /server/db.js: -------------------------------------------------------------------------------- 1 | // Schema、Model、Entity或者Documents的关系请牢记,Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。 2 | const mongoose = require('mongoose'); 3 | // 连接数据库 如果不自己创建 默认test数据库会自动生成 4 | mongoose.connect('mongodb://localhost:27017/testDb'); 5 | 6 | // 为这次连接绑定事件 7 | const db = mongoose.connection; 8 | db.once('error',() => console.log('Mongo connection error')); 9 | db.once('open',() => console.log('Mongo connection successed')); 10 | /************** 定义模式loginSchema **************/ 11 | const userSchema = mongoose.Schema({ 12 | user : String, 13 | password : String 14 | },{collection:"users"}); 15 | 16 | /************** 定义模型Model **************/ 17 | const Models = { 18 | User : mongoose.model('User',userSchema) 19 | } 20 | 21 | module.exports = Models; -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | // 引入编写好的api 2 | const api = require('./api'); 3 | // 引入文件模块 4 | const fs = require('fs'); 5 | // 引入处理路径的模块 6 | const path = require('path'); 7 | // 引入处理post数据的模块 8 | const bodyParser = require('body-parser') 9 | // 引入Express 10 | const express = require('express'); 11 | const expressJwt = require('express-jwt'); 12 | const app = express(); 13 | 14 | app.use(bodyParser.json()); 15 | app.use(bodyParser.urlencoded({extended: false})); 16 | app.use(api); 17 | 18 | 19 | // 访问静态资源文件 这里是访问所有dist目录下的静态资源文件 20 | app.use(express.static(path.resolve(__dirname, '../dist'))) 21 | module.exports = { 22 | start: () => { 23 | // 因为是单页应用 所有请求都走/dist/index.html 24 | app.get('*', function(req, res) { 25 | const html = fs.readFileSync(path.resolve(__dirname, '../dist/index.html'), 'utf-8') 26 | res.send(html) 27 | }) 28 | // 监听8088端口 29 | app.listen(8088); 30 | } 31 | }; -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/images/Act-adress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-adress.png -------------------------------------------------------------------------------- /src/assets/images/Act-dollarIcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-dollarIcoin.png -------------------------------------------------------------------------------- /src/assets/images/Act-listbg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-listbg.jpg -------------------------------------------------------------------------------- /src/assets/images/Act-peoIcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-peoIcoin.png -------------------------------------------------------------------------------- /src/assets/images/Act-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-photo.jpg -------------------------------------------------------------------------------- /src/assets/images/Act-time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-time.png -------------------------------------------------------------------------------- /src/assets/images/Act-usicon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Act-usicon.jpg -------------------------------------------------------------------------------- /src/assets/images/Recharge-bg-cur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Recharge-bg-cur.png -------------------------------------------------------------------------------- /src/assets/images/Recharge-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/Recharge-bg.png -------------------------------------------------------------------------------- /src/assets/images/WechatIMG2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/WechatIMG2.png -------------------------------------------------------------------------------- /src/assets/images/activity-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/activity-icon.png -------------------------------------------------------------------------------- /src/assets/images/adv-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/adv-img.jpg -------------------------------------------------------------------------------- /src/assets/images/author.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/author.jpg -------------------------------------------------------------------------------- /src/assets/images/baby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/baby.jpg -------------------------------------------------------------------------------- /src/assets/images/banner-reg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/banner-reg.jpg -------------------------------------------------------------------------------- /src/assets/images/bg-bemember.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bg-bemember.jpg -------------------------------------------------------------------------------- /src/assets/images/bg-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bg-card.jpg -------------------------------------------------------------------------------- /src/assets/images/bg-member.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bg-member.jpg -------------------------------------------------------------------------------- /src/assets/images/bg-register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bg-register.jpg -------------------------------------------------------------------------------- /src/assets/images/bg-scene.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bg-scene.jpg -------------------------------------------------------------------------------- /src/assets/images/bottom-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-bg.png -------------------------------------------------------------------------------- /src/assets/images/bottom-community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-community.png -------------------------------------------------------------------------------- /src/assets/images/bottom-course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-course.png -------------------------------------------------------------------------------- /src/assets/images/bottom-index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-index.png -------------------------------------------------------------------------------- /src/assets/images/bottom-msg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-msg.png -------------------------------------------------------------------------------- /src/assets/images/bottom-my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/bottom-my.png -------------------------------------------------------------------------------- /src/assets/images/btn-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/btn-back.png -------------------------------------------------------------------------------- /src/assets/images/btn-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/btn-close.png -------------------------------------------------------------------------------- /src/assets/images/building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/building.png -------------------------------------------------------------------------------- /src/assets/images/buyer-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/buyer-icon.png -------------------------------------------------------------------------------- /src/assets/images/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/clock.png -------------------------------------------------------------------------------- /src/assets/images/code-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/code-icon.png -------------------------------------------------------------------------------- /src/assets/images/coupon-code.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon-code.jpg -------------------------------------------------------------------------------- /src/assets/images/coupon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon.jpg -------------------------------------------------------------------------------- /src/assets/images/coupon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon.png -------------------------------------------------------------------------------- /src/assets/images/coupon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon2.png -------------------------------------------------------------------------------- /src/assets/images/coupon3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon3.png -------------------------------------------------------------------------------- /src/assets/images/coupon4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon4.png -------------------------------------------------------------------------------- /src/assets/images/coupon5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/coupon5.png -------------------------------------------------------------------------------- /src/assets/images/course-details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/course-details.jpg -------------------------------------------------------------------------------- /src/assets/images/course-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/course-img.jpg -------------------------------------------------------------------------------- /src/assets/images/course-jt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/course-jt.png -------------------------------------------------------------------------------- /src/assets/images/course-search-coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/course-search-coin.png -------------------------------------------------------------------------------- /src/assets/images/default-head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/default-head.png -------------------------------------------------------------------------------- /src/assets/images/deposit-coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/deposit-coin.png -------------------------------------------------------------------------------- /src/assets/images/detail-pay-finish.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/detail-pay-finish.jpg -------------------------------------------------------------------------------- /src/assets/images/detail-pay-nopay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/detail-pay-nopay.jpg -------------------------------------------------------------------------------- /src/assets/images/erWeiCode-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/erWeiCode-img.jpg -------------------------------------------------------------------------------- /src/assets/images/ewm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ewm.png -------------------------------------------------------------------------------- /src/assets/images/friend-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/friend-icon.png -------------------------------------------------------------------------------- /src/assets/images/head-portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/head-portrait.png -------------------------------------------------------------------------------- /src/assets/images/head.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/head.jpg -------------------------------------------------------------------------------- /src/assets/images/ico-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-card.png -------------------------------------------------------------------------------- /src/assets/images/ico-cardpay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-cardpay.png -------------------------------------------------------------------------------- /src/assets/images/ico-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-circle.png -------------------------------------------------------------------------------- /src/assets/images/ico-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-config.png -------------------------------------------------------------------------------- /src/assets/images/ico-coupon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-coupon.png -------------------------------------------------------------------------------- /src/assets/images/ico-course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-course.png -------------------------------------------------------------------------------- /src/assets/images/ico-nomalmem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-nomalmem.png -------------------------------------------------------------------------------- /src/assets/images/ico-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-open.png -------------------------------------------------------------------------------- /src/assets/images/ico-order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-order.png -------------------------------------------------------------------------------- /src/assets/images/ico-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-share.png -------------------------------------------------------------------------------- /src/assets/images/ico-sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-sign.png -------------------------------------------------------------------------------- /src/assets/images/ico-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-store.png -------------------------------------------------------------------------------- /src/assets/images/ico-wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/ico-wallet.png -------------------------------------------------------------------------------- /src/assets/images/indexbanner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner.jpg -------------------------------------------------------------------------------- /src/assets/images/indexbanner1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner1.jpg -------------------------------------------------------------------------------- /src/assets/images/indexbanner2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner2.jpg -------------------------------------------------------------------------------- /src/assets/images/indexbanner3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner3.jpg -------------------------------------------------------------------------------- /src/assets/images/indexbanner4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner4.jpg -------------------------------------------------------------------------------- /src/assets/images/indexbanner5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexbanner5.jpg -------------------------------------------------------------------------------- /src/assets/images/indexlist1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexlist1.jpg -------------------------------------------------------------------------------- /src/assets/images/indexlist2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/indexlist2.jpg -------------------------------------------------------------------------------- /src/assets/images/jt-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/jt-bottom.png -------------------------------------------------------------------------------- /src/assets/images/jt-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/jt-left.png -------------------------------------------------------------------------------- /src/assets/images/jt-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/jt-right.png -------------------------------------------------------------------------------- /src/assets/images/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/line.png -------------------------------------------------------------------------------- /src/assets/images/mucourse-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/mucourse-img.jpg -------------------------------------------------------------------------------- /src/assets/images/mycourseDetail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/mycourseDetail.jpg -------------------------------------------------------------------------------- /src/assets/images/newsicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/newsicon.png -------------------------------------------------------------------------------- /src/assets/images/newstip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/newstip.png -------------------------------------------------------------------------------- /src/assets/images/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/next.png -------------------------------------------------------------------------------- /src/assets/images/notice-banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/notice-banner.jpg -------------------------------------------------------------------------------- /src/assets/images/online-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/online-bg.jpg -------------------------------------------------------------------------------- /src/assets/images/open-detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/open-detail.jpg -------------------------------------------------------------------------------- /src/assets/images/pay-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/pay-success.png -------------------------------------------------------------------------------- /src/assets/images/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/prev.png -------------------------------------------------------------------------------- /src/assets/images/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/qrcode.jpg -------------------------------------------------------------------------------- /src/assets/images/shadow-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/shadow-code.png -------------------------------------------------------------------------------- /src/assets/images/shadow-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/shadow-share.png -------------------------------------------------------------------------------- /src/assets/images/shops-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/shops-icon.png -------------------------------------------------------------------------------- /src/assets/images/square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/square.jpg -------------------------------------------------------------------------------- /src/assets/images/st-titleicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/st-titleicon.png -------------------------------------------------------------------------------- /src/assets/images/success-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/success-icon.png -------------------------------------------------------------------------------- /src/assets/images/teacher-bg-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/teacher-bg-on.png -------------------------------------------------------------------------------- /src/assets/images/teacher-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/teacher-bg.png -------------------------------------------------------------------------------- /src/assets/images/tip-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/src/assets/images/tip-light.png -------------------------------------------------------------------------------- /src/assets/js/TouchSlide.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * TouchSlide v1.1 3 | * javascript触屏滑动特效插件,移动端滑动特效,触屏焦点图,触屏Tab切换,触屏多图切换等 4 | * 详尽信息请看官网:http://www.SuperSlide2.com/TouchSlide/ 5 | * 6 | * Copyright 2013 大话主席 7 | * 8 | * 请尊重原创,保留头部版权 9 | * 在保留版权的前提下可应用于个人或商业用途 10 | 11 | * 1.1 宽度自适应(修复安卓横屏时滑动范围不变的bug) 12 | */ 13 | 14 | var TouchSlide = function(a) { 15 | a = a || {}; 16 | var b = { 17 | slideCell: a.slideCell || "#touchSlide", 18 | titCell: a.titCell || ".hd li", 19 | mainCell: a.mainCell || ".bd", 20 | effect: a.effect || "left", 21 | autoPlay: a.autoPlay || !1, 22 | delayTime: a.delayTime || 200, 23 | interTime: a.interTime || 2500, 24 | defaultIndex: a.defaultIndex || 0, 25 | titOnClassName: a.titOnClassName || "on", 26 | autoPage: a.autoPage || !1, 27 | prevCell: a.prevCell || ".prev", 28 | nextCell: a.nextCell || ".next", 29 | pageStateCell: a.pageStateCell || ".pageState", 30 | pnLoop: "undefined " == a.pnLoop ? !0 : a.pnLoop, 31 | startFun: a.startFun || null, 32 | endFun: a.endFun || null, 33 | switchLoad: a.switchLoad || null 34 | }, 35 | c = document.getElementById(b.slideCell.replace("#", "")); 36 | if (!c) 37 | return !1; 38 | var d = function(a, b) { 39 | a = a.split(" "); 40 | var c = []; 41 | b = b || document; 42 | var d = [b]; 43 | for (var e in a) 44 | 0 != a[e].length && c.push(a[e]); 45 | for (var e in c) { 46 | if (0 == d.length) 47 | return !1; 48 | var f = []; 49 | for (var g in d) 50 | if ("#" == c[e][0]) 51 | f.push(document.getElementById(c[e].replace("#", ""))); 52 | else if ("." == c[e][0]) 53 | for (var h = d[g].getElementsByTagName("*"), i = 0; i < h.length; i++) { 54 | var j = h[i].className; 55 | j && -1 != j.search(new RegExp("\\b" + c[e].replace(".", "") + "\\b")) && f.push(h[i]) 56 | } 57 | else 58 | for (var h = d[g].getElementsByTagName(c[e]), i = 0; i < h.length; i++) 59 | f.push(h[i]); 60 | d = f 61 | } 62 | return 0 == d.length || d[0] == b ? !1 : d 63 | }, 64 | e = function(a, b) { 65 | var c = document.createElement("div"); 66 | c.innerHTML = b, 67 | c = c.children[0]; 68 | var d = a.cloneNode(!0); 69 | return c.appendChild(d), 70 | a.parentNode.replaceChild(c, a), 71 | m = d, 72 | c 73 | }, 74 | g = function(a, b) { 75 | !a || !b || a.className && -1 != a.className.search(new RegExp("\\b" + b + "\\b")) || (a.className += (a.className ? " " : "") + b) 76 | }, 77 | h = function(a, b) { 78 | !a || !b || a.className && -1 == a.className.search(new RegExp("\\b" + b + "\\b")) || (a.className = a.className.replace(new RegExp("\\s*\\b" + b + "\\b","g"), "")) 79 | }, 80 | i = b.effect, 81 | j = d(b.prevCell, c)[0], 82 | k = d(b.nextCell, c)[0], 83 | l = d(b.pageStateCell)[0], 84 | m = d(b.mainCell, c)[0]; 85 | if (!m) 86 | return !1; 87 | var N, O, n = m.children.length, o = d(b.titCell, c), p = o ? o.length : n, q = b.switchLoad, r = parseInt(b.defaultIndex), s = parseInt(b.delayTime), t = parseInt(b.interTime), u = "false" == b.autoPlay || 0 == b.autoPlay ? !1 : !0, v = "false" == b.autoPage || 0 == b.autoPage ? !1 : !0, w = "false" == b.pnLoop || 0 == b.pnLoop ? !1 : !0, x = r, y = null, z = null, A = null, B = 0, C = 0, D = 0, E = 0, G = /hp-tablet/gi.test(navigator.appVersion), H = "ontouchstart"in window && !G, I = H ? "touchstart" : "mousedown", J = H ? "touchmove" : "", K = H ? "touchend" : "mouseup", M = m.parentNode.clientWidth, P = n; 88 | if (0 == p && (p = n), 89 | v) { 90 | p = n, 91 | o = o[0], 92 | o.innerHTML = ""; 93 | var Q = ""; 94 | if (1 == b.autoPage || "true" == b.autoPage) 95 | for (var R = 0; p > R; R++) 96 | Q += "
  • " + (R + 1) + "
  • "; 97 | else 98 | for (var R = 0; p > R; R++) 99 | Q += b.autoPage.replace("$", R + 1); 100 | o.innerHTML = Q, 101 | o = o.children 102 | } 103 | "leftLoop" == i && (P += 2, 104 | m.appendChild(m.children[0].cloneNode(!0)), 105 | m.insertBefore(m.children[n - 1].cloneNode(!0), m.children[0])), 106 | N = e(m, '
    '), 107 | m.style.cssText = "width:" + P * M + "px;" + "position:relative;overflow:hidden;padding:0;margin:0;"; 108 | for (var R = 0; P > R; R++) 109 | m.children[R].style.cssText = "display:table-cell;vertical-align:top;width:" + M + "px"; 110 | var S = function() { 111 | "function" == typeof b.startFun && b.startFun(r, p) 112 | } 113 | , T = function() { 114 | "function" == typeof b.endFun && b.endFun(r, p) 115 | } 116 | , U = function(a) { 117 | var b = ("leftLoop" == i ? r + 1 : r) + a 118 | , c = function(a) { 119 | for (var b = m.children[a].getElementsByTagName("img"), c = 0; c < b.length; c++) 120 | b[c].getAttribute(q) && (b[c].setAttribute("src", b[c].getAttribute(q)), 121 | b[c].removeAttribute(q)) 122 | }; 123 | if (c(b), 124 | "leftLoop" == i) 125 | switch (b) { 126 | case 0: 127 | c(n); 128 | break; 129 | case 1: 130 | c(n + 1); 131 | break; 132 | case n: 133 | c(0); 134 | break; 135 | case n + 1: 136 | c(1) 137 | } 138 | } 139 | , V = function() { 140 | M = N.clientWidth, 141 | m.style.width = P * M + "px"; 142 | for (var a = 0; P > a; a++) 143 | m.children[a].style.width = M + "px"; 144 | var b = "leftLoop" == i ? r + 1 : r; 145 | W(-b * M, 0) 146 | }; 147 | window.addEventListener("resize", V, !1); 148 | var W = function(a, b, c) { 149 | c = c ? c.style : m.style, 150 | c.webkitTransitionDuration = c.MozTransitionDuration = c.msTransitionDuration = c.OTransitionDuration = c.transitionDuration = b + "ms", 151 | c.webkitTransform = "translate(" + a + "px,0)" + "translateZ(0)", 152 | c.msTransform = c.MozTransform = c.OTransform = "translateX(" + a + "px)" 153 | } 154 | , X = function(a) { 155 | switch (i) { 156 | case "left": 157 | r >= p ? r = a ? r - 1 : 0 : 0 > r && (r = a ? 0 : p - 1), 158 | null != q && U(0), 159 | W(-r * M, s), 160 | x = r; 161 | break; 162 | case "leftLoop": 163 | null != q && U(0), 164 | W(-(r + 1) * M, s), 165 | -1 == r ? (z = setTimeout(function() { 166 | W(-p * M, 0) 167 | }, s), 168 | r = p - 1) : r == p && (z = setTimeout(function() { 169 | W(-M, 0) 170 | }, s), 171 | r = 0), 172 | x = r 173 | } 174 | S(), 175 | A = setTimeout(function() { 176 | T() 177 | }, s); 178 | for (var c = 0; p > c; c++) 179 | h(o[c], b.titOnClassName), 180 | c == r && g(o[c], b.titOnClassName); 181 | 0 == w && (h(k, "nextStop"), 182 | h(j, "prevStop"), 183 | 0 == r ? g(j, "prevStop") : r == p - 1 && g(k, "nextStop")), 184 | l && (l.innerHTML = "" + (r + 1) + "/" + p) 185 | }; 186 | if (X(), 187 | u && (y = setInterval(function() { 188 | r++, 189 | X() 190 | }, t)), 191 | o) 192 | for (var R = 0; p > R; R++) 193 | !function() { 194 | var a = R; 195 | o[a].addEventListener("click", function() { 196 | clearTimeout(z), 197 | clearTimeout(A), 198 | r = a, 199 | X() 200 | }) 201 | }(); 202 | k && k.addEventListener("click", function() { 203 | (1 == w || r != p - 1) && (clearTimeout(z), 204 | clearTimeout(A), 205 | r++, 206 | X()) 207 | }), 208 | j && j.addEventListener("click", function() { 209 | (1 == w || 0 != r) && (clearTimeout(z), 210 | clearTimeout(A), 211 | r--, 212 | X()) 213 | }); 214 | var Y = function(a) { 215 | clearTimeout(z), 216 | clearTimeout(A), 217 | O = void 0, 218 | D = 0; 219 | var b = H ? a.touches[0] : a; 220 | B = b.pageX, 221 | C = b.pageY, 222 | m.addEventListener(J, Z, !1), 223 | m.addEventListener(K, $, !1) 224 | } 225 | , Z = function(a) { 226 | if (!H || !(a.touches.length > 1 || a.scale && 1 !== a.scale)) { 227 | var b = H ? a.touches[0] : a; 228 | if (D = b.pageX - B, 229 | E = b.pageY - C, 230 | "undefined" == typeof O && (O = !!(O || Math.abs(D) < Math.abs(E))), 231 | !O) { 232 | switch (a.preventDefault(), 233 | u && clearInterval(y), 234 | i) { 235 | case "left": 236 | (0 == r && D > 0 || r >= p - 1 && 0 > D) && (D = .4 * D), 237 | W(-r * M + D, 0); 238 | break; 239 | case "leftLoop": 240 | W(-(r + 1) * M + D, 0) 241 | } 242 | null != q && Math.abs(D) > M / 3 && U(D > -0 ? -1 : 1) 243 | } 244 | } 245 | } 246 | , $ = function(a) { 247 | 0 != D && (a.preventDefault(), 248 | O || (Math.abs(D) > M / 10 && (D > 0 ? r-- : r++), 249 | X(!0), 250 | u && (y = setInterval(function() { 251 | r++, 252 | X() 253 | }, t))), 254 | m.removeEventListener(J, Z, !1), 255 | m.removeEventListener(K, $, !1)) 256 | }; 257 | m.addEventListener(I, Y, !1) 258 | }; 259 | 260 | export default TouchSlide; 261 | -------------------------------------------------------------------------------- /src/assets/js/jquery.qrcode.min.js: -------------------------------------------------------------------------------- 1 | (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= 5 | 0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= 7 | j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- 8 | b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, 9 | c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= 10 | 0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ 14 | a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ 15 | a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), 17 | LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d 18 | this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, 26 | correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", 28 | d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); 29 | -------------------------------------------------------------------------------- /src/assets/js/layer/layer.js: -------------------------------------------------------------------------------- 1 | /*! layer mobile-v2.0 弹层组件移动版 License LGPL http://layer.layui.com/mobile By 贤心 */ 2 | ;!function(a){"use strict";var b=document,c="querySelectorAll",d="getElementsByClassName",e=function(a){return b[c](a)},f={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},g={extend:function(a){var b=JSON.parse(JSON.stringify(f));for(var c in a)b[c]=a[c];return b},timer:{},end:{}};g.touch=function(a,b){a.addEventListener("click",function(a){b.call(this,a)},!1)};var h=0,i=["layui-m-layer"],j=function(a){var b=this;b.config=g.extend(a),b.view()};j.prototype.view=function(){var a=this,c=a.config,f=b.createElement("div");a.id=f.id=i[0]+h,f.setAttribute("class",i[0]+" "+i[0]+(c.type||0)),f.setAttribute("index",h);var g=function(){var a="object"==typeof c.title;return c.title?'

    '+(a?c.title[0]:c.title)+"

    ":""}(),j=function(){"string"==typeof c.btn&&(c.btn=[c.btn]);var a,b=(c.btn||[]).length;return 0!==b&&c.btn?(a=''+c.btn[0]+"",2===b&&(a=''+c.btn[1]+""+a),'
    '+a+"
    "):""}();if(c.fixed||(c.top=c.hasOwnProperty("top")?c.top:100,c.style=c.style||"",c.style+=" top:"+(b.body.scrollTop+c.top)+"px"),2===c.type&&(c.content='

    '+(c.content||"")+"

    "),c.skin&&(c.anim="up"),"msg"===c.skin&&(c.shade=!1),f.innerHTML=(c.shade?"
    ':"")+'
    "+g+'
    '+c.content+"
    "+j+"
    ",!c.type||2===c.type){var k=b[d](i[0]+c.type),l=k.length;l>=1&&layer.close(k[0].getAttribute("index"))}document.body.appendChild(f);var m=a.elem=e("#"+a.id)[0];c.success&&c.success(m),a.index=h++,a.action(c,m)},j.prototype.action=function(a,b){var c=this;a.time&&(g.timer[c.index]=setTimeout(function(){layer.close(c.index)},1e3*a.time));var e=function(){var b=this.getAttribute("type");0==b?(a.no&&a.no(),layer.close(c.index)):a.yes?a.yes(c.index):layer.close(c.index)};if(a.btn)for(var f=b[d]("layui-m-layerbtn")[0].children,h=f.length,i=0;h>i;i++)g.touch(f[i],e);if(a.shade&&a.shadeClose){var j=b[d]("layui-m-layershade")[0];g.touch(j,function(){layer.close(c.index,a.end)})}a.end&&(g.end[c.index]=a.end)},a.layer={v:"2.0",index:h,open:function(a){var b=new j(a||{});return b.index},close:function(a){var c=e("#"+i[0]+a)[0];c&&(c.innerHTML="",b.body.removeChild(c),clearTimeout(g.timer[a]),delete g.timer[a],"function"==typeof g.end[a]&&g.end[a](),delete g.end[a])},closeAll:function(){for(var a=b[d](i[0]),c=0,e=a.length;e>c;c++)layer.close(0|a[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var a=document.scripts,c=a[a.length-1],d=c.src,e=d.substring(0,d.lastIndexOf("/")+1);c.getAttribute("merge")||document.head.appendChild(function(){var a=b.createElement("link");return a.href=e+"need/layer.css?2.0",a.type="text/css",a.rel="styleSheet",a.id="layermcss",a}())}()}(window); -------------------------------------------------------------------------------- /src/assets/js/layer/need/layer.css: -------------------------------------------------------------------------------- 1 | .layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} -------------------------------------------------------------------------------- /src/assets/js/rem.js: -------------------------------------------------------------------------------- 1 | (function(doc, win) { 2 | var docEl = doc.documentElement, 3 | resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', 4 | clientWidth = docEl.clientWidth; 5 | if(clientWidth>=1200) return; 6 | recalc = function() { 7 | if (!clientWidth) return; 8 | docEl.style.fontSize = 100 * (clientWidth / 640) + 'px'; 9 | }; 10 | if (!doc.addEventListener) return; 11 | win.addEventListener(resizeEvt, recalc, false); 12 | doc.addEventListener('DOMContentLoaded', recalc, false); 13 | })(document, window); -------------------------------------------------------------------------------- /src/assets/style/public.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | /* CSS Document */ 3 | body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0; list-style:none} 4 | a{color:#2b2b2b; text-decoration:none} 5 | body{ font-size:0.24rem;font-family:Helvetica; background-color:#f0f0f0;} 6 | img { border:0px;} 7 | button{ border:0; } 8 | *{-webkit-tap-highlight-color: rgba(0, 0, 0, 0)} 9 | 10 | select{ 11 | appearance:none; 12 | -webkit-appearance:none; 13 | outline: none; 14 | } 15 | 16 | 17 | /*底部*/ 18 | .foot{ 19 | position: fixed; 20 | bottom:0; 21 | left:0; 22 | width: 100%; 23 | height: 1.18rem; 24 | overflow: hidden; 25 | background: url(../images/bottom-bg.png) no-repeat; 26 | background-size:100% auto ; 27 | text-align: center; 28 | } 29 | .foot ul li{ 30 | display: inline-block; 31 | margin:0.12rem 0.3rem 0 0.3rem; 32 | width: 0.56rem; 33 | height: 0.96rem; 34 | overflow: hidden; 35 | } 36 | .foot ul li a{ 37 | display: block; 38 | height: 0.96rem; 39 | } 40 | .foot ul li.bottom-index{ 41 | background: url(../images/bottom-index.png) no-repeat; 42 | background-size: 100% auto; 43 | } 44 | .foot ul li.bottom-course{ 45 | background: url(../images/bottom-course.png) no-repeat; 46 | background-size: 100% auto; 47 | } 48 | .foot ul li.bottom-my{ 49 | background: url(../images/bottom-my.png) no-repeat; 50 | background-size: 100% auto; 51 | } 52 | .foot ul li.bottom-msg{ 53 | background: url(../images/bottom-msg.png) no-repeat; 54 | background-size: 100% auto; 55 | } 56 | .foot ul li.bottom-community{ 57 | background: url(../images/bottom-community.png) no-repeat; 58 | background-size: 100% auto; 59 | } 60 | .foot ul li.bottom-cur{ 61 | background-position: 0 -0.96rem; 62 | } 63 | -------------------------------------------------------------------------------- /src/assets/style/style.css: -------------------------------------------------------------------------------- 1 | /*zh*/ 2 | /*课程列表*/ 3 | .course-top{ 4 | position: fixed; 5 | left: 0; 6 | top: 0; 7 | width: 100%; 8 | height: auto; 9 | overflow: hidden; 10 | background-color: #f0f0f0 11 | } 12 | .select-box{ 13 | width: 100%; 14 | height: 0.8rem; 15 | overflow: hidden; 16 | text-align: center; 17 | background: #fff; 18 | 19 | } 20 | .select-box li{ 21 | width: 33.33%; 22 | height: 0.8rem; 23 | overflow: hidden; 24 | float: left; 25 | } 26 | .select-box li select{ 27 | width: 1.7rem; 28 | height: 0.8rem; 29 | display: block; 30 | margin-left: 0.2rem; 31 | text-align: center; 32 | border: none; 33 | background: none; 34 | background: url(../images/course-jt.png) no-repeat right center; 35 | background-size: 0.27rem 0.15rem; 36 | color: #646464; 37 | font-size: 0.24rem; 38 | } 39 | .course-search{ 40 | width: 6rem; 41 | height: 0.6rem; 42 | overflow: hidden; 43 | margin: 0.11rem auto; 44 | background: #fff; 45 | border-radius: 0.3rem ; 46 | } 47 | .course-search .search-coin{ 48 | float: left; 49 | width: 2.98rem; 50 | height: 0.6rem; 51 | background: url(../images/course-search-coin.png) no-repeat right center; 52 | background-size: 0.26rem 0.26rem; 53 | transition:all linear 0.1s; 54 | } 55 | .course-search .course-inp{ 56 | float: right; 57 | margin-top: 0.1rem; 58 | display: block; 59 | width: 2.98rem; 60 | height: 0.4rem; 61 | line-height: 0.4rem; 62 | border:none; 63 | color: #999999; 64 | font-size: 0.25rem; 65 | transition:all linear 0.1s; 66 | } 67 | ul.course-list{ 68 | width: 100%; 69 | height: auto; 70 | overflow: hidden; 71 | /* 72 | margin-bottom: 1.4rem; 73 | margin-top: 0.85rem;*/ 74 | background: #fff; 75 | } 76 | ul.course-list li{ 77 | width: 6rem; 78 | height: 1.6rem; 79 | overflow: hidden; 80 | border-bottom: 1px solid #e0e0e0; 81 | padding: 0.3rem 0.2rem; 82 | } 83 | .course-img{ 84 | float: left; 85 | width: 2.6rem; 86 | height: 1.6rem; 87 | overflow: hidden; 88 | } 89 | .course-img img{width: 100%} 90 | .course-txt{ 91 | float: right; 92 | width: 3.1rem; 93 | height: 1.6rem; 94 | overflow: hidden; 95 | } 96 | .course-txt h1{ 97 | color: #1e1e1e; 98 | font-size: 0.3rem; 99 | font-weight: normal; 100 | text-overflow: -o-ellipsis-lastline; 101 | overflow: hidden; 102 | text-overflow: ellipsis; 103 | display: -webkit-box; 104 | -webkit-line-clamp: 1; 105 | -webkit-box-orient: vertical; 106 | } 107 | .course-txt div{ 108 | margin: 0.1rem 0 0.1rem 0; 109 | min-height:0.53rem; 110 | color: #666; 111 | text-overflow: -o-ellipsis-lastline; 112 | overflow: hidden; 113 | text-overflow: ellipsis; 114 | display: -webkit-box; 115 | -webkit-line-clamp: 2; 116 | -webkit-box-orient: vertical; 117 | } 118 | .course-txt span{ 119 | color: #f18900; 120 | } 121 | /*课程详情*/ 122 | .course-detail-top{ 123 | position: relative; 124 | background: #fff; 125 | width: 100%; 126 | height: 0.8rem; 127 | overflow: hidden; 128 | color: #646464; 129 | font-size: 0.28rem; 130 | text-align: center; 131 | line-height: 0.8rem; 132 | } 133 | .course-detail-top a{ 134 | position: absolute; 135 | left: 0; 136 | top: 0; 137 | width: 0.6rem; 138 | height: 0.8rem; 139 | overflow: hidden; 140 | display: block; 141 | background: url(../images/jt-left.png) no-repeat; 142 | background-size: 100%; 143 | } 144 | .course-banner{ 145 | width: 6.4rem; 146 | height: 3.6rem; 147 | overflow: hidden; 148 | } 149 | .course-banner img{width: 100%} 150 | .details-title{ 151 | color: #ff9900; 152 | height: 0.8rem; 153 | overflow: hidden; 154 | background:#fff; 155 | border-bottom: 1px solid #e0e0e0; 156 | text-align: center; 157 | } 158 | .details-title div{ 159 | display: inline-block; 160 | line-height: 0.8rem; 161 | border-bottom: 0.03rem solid #ff9900; 162 | box-sizing: border-box; 163 | padding: 0 0.1rem; 164 | height: 0.8rem; 165 | } 166 | .course-info-box{ 167 | width: 6rem; 168 | height: auto; 169 | overflow: hidden; 170 | padding: 0.3rem 0.2rem; 171 | background: #fff; 172 | } 173 | .course-info-box h5{ 174 | color: #333333; 175 | font-size: 0.3rem; 176 | font-weight: normal; 177 | } 178 | .course-info-box div{ 179 | font-size: 0.22rem; 180 | color:#969696; 181 | margin: 0.1rem 0 0.1rem 2px; 182 | } 183 | .course-info-box h2{ 184 | font-size: 0.34rem; 185 | color: #ff7700; 186 | font-weight: normal; 187 | } 188 | .help-teach{ 189 | width: 6rem; 190 | height: 0.8rem; 191 | line-height: 0.8rem; 192 | overflow: hidden; 193 | border-bottom: 1px solid #e0e0e0; 194 | padding: 0 0.2rem; 195 | margin-top: 0.2rem; 196 | background: #fff; 197 | color: #646464; 198 | } 199 | .help-teach span{ 200 | float: right; 201 | font-size: 0.2rem; 202 | color: #969696; 203 | } 204 | .get-volume{ 205 | width: 6rem; 206 | height: 0.8rem; 207 | overflow: hidden; 208 | padding: 0 0.2rem; 209 | margin: 0.2rem auto; 210 | background: #fff; 211 | line-height: 0.8rem; 212 | display: none; 213 | } 214 | .get-volume a span:first-of-type{ 215 | float: left; 216 | color: #ff7700; 217 | font-size: 0.18rem; 218 | border: 1px solid #ff7700; 219 | border-radius:0.05rem ; 220 | height: 0.26rem; 221 | line-height: 0.26rem; 222 | width: 0.7rem; 223 | text-align: center; 224 | margin: 0.27rem 0.12rem 0 0 ; 225 | } 226 | .get-volume a span:last-of-type{ 227 | float: right; 228 | width: 0.2rem; 229 | height: 0.6rem; 230 | overflow: hidden; 231 | margin-top: 0.1rem; 232 | background: url(../images/jt-right.png) no-repeat; 233 | background-size: 100% auto; 234 | } 235 | .Student-choose{ 236 | width: 6rem; 237 | height: 1rem; 238 | overflow: hidden; 239 | background: #fff; 240 | line-height: 1rem; 241 | padding: 0 0.2rem; 242 | color: #646464; 243 | } 244 | .choose-num-box{ 245 | float: right; 246 | width: 1.9rem; 247 | height: 0.5rem; 248 | overflow: hidden; 249 | margin-top: 0.25rem; 250 | border-bottom: 1px solid #e0e0e0; 251 | } 252 | .choose-num-box span{ 253 | float: left; 254 | width: 0.5rem; 255 | height: 0.5rem; 256 | background: #ff9900; 257 | text-align: center; 258 | line-height: 0.5rem; 259 | color: #fff; 260 | font-size: 0.3rem; 261 | } 262 | .choose-num-box input{ 263 | float: left; 264 | width: 0.9rem; 265 | height: 0.5rem; 266 | border:none; 267 | border-radius: 0; 268 | border: 1px solid #ff9900; 269 | border-left:none; 270 | border-right:none; 271 | box-sizing: border-box; 272 | text-align: center; 273 | line-height: 0.5rem; 274 | } 275 | .adv-box{ 276 | width: 6rem; 277 | height: 1rem; 278 | overflow: hidden; 279 | padding: 0.3rem 0.2rem; 280 | background: #fff; 281 | margin: 0.2rem auto; 282 | } 283 | .adv-img{ 284 | float: left; 285 | width: 1rem; 286 | height: 1rem; 287 | overflow: hidden; 288 | } 289 | .adv-img img{width: 100%} 290 | .adv-text{ 291 | float: right; 292 | width: 4.8rem; 293 | height: 1rem; 294 | overflow: hidden; 295 | } 296 | .adv-text p{ 297 | color:#969696; 298 | font-size: 0.22rem; 299 | text-overflow: -o-ellipsis-lastline; 300 | overflow: hidden; 301 | text-overflow: ellipsis; 302 | display: -webkit-box; 303 | -webkit-line-clamp: 1; 304 | -webkit-box-orient: vertical; 305 | } 306 | .adv-text h2{ 307 | color:#323232; 308 | font-weight: normal; 309 | text-overflow: -o-ellipsis-lastline; 310 | overflow: hidden; 311 | text-overflow: ellipsis; 312 | display: -webkit-box; 313 | -webkit-line-clamp: 1; 314 | -webkit-box-orient: vertical; 315 | margin: 0.05rem 0 0.1rem 0; 316 | } 317 | .see-detail{ 318 | text-align: center; 319 | line-height: 0.8rem; 320 | background: #fff; 321 | color:#969696 322 | } 323 | .see-detail img{ 324 | width: 0.18rem; 325 | height: 0.1rem; 326 | } 327 | .detail-box{ 328 | width: 100%; 329 | height: auto; 330 | overflow: hidden; 331 | } 332 | .detail-box .detail-top{ 333 | width: 100%; 334 | line-height: 0.5rem; 335 | text-align: center; 336 | color: #646464; 337 | font-size: 0.2rem; 338 | } 339 | .detail-img-text{ 340 | width: 100%; 341 | height: auto; 342 | overflow: hidden; 343 | } 344 | .detail-img-text img{ 345 | width: 100%; 346 | } 347 | .course-recommend{ 348 | width: 100%; 349 | height: 0.8rem; 350 | overflow:hidden; 351 | text-indent: 0.2rem; 352 | border-bottom: 1px solid #e0e0e0; 353 | line-height: 0.8rem; 354 | color: #999999; 355 | background: #fff; 356 | } 357 | ul.recommend-list{ 358 | margin: 0 auto 0.3rem auto; 359 | } 360 | .shop-now{ 361 | width: 100%; 362 | height: 0.88rem; 363 | overflow: hidden; 364 | text-align: center; 365 | line-height: 0.88rem; 366 | color: #fff; 367 | background: #ff9900; 368 | font-size: 0.28rem; 369 | display: block; 370 | } 371 | .teacher-name{ 372 | width:6rem; 373 | height:auto; 374 | overflow-x:scroll; 375 | padding:0.2rem; 376 | background:#fff 377 | } 378 | .teacher-name ul{ 379 | width:auto; 380 | height:auto; 381 | white-space:nowrap; 382 | } 383 | .teacher-name ul li{ 384 | width:1.4rem; 385 | display: inline-block; 386 | font-size:0.22rem; 387 | color: #646464; 388 | text-align:center; 389 | height: 0.5rem; 390 | overflow: hidden; 391 | line-height: 0.5rem; 392 | margin: 0.4rem 0.3rem 0.4rem 0; 393 | background: url(../images/teacher-bg.png) no-repeat; 394 | background-size: 100% auto 395 | } 396 | .teacher-name ul li.teacher-cur{ 397 | background: url(../images/teacher-bg-on.png) no-repeat; 398 | background-size: 100% auto 399 | } 400 | /*支付页面*/ 401 | .buyers-info{ 402 | width: 100%; 403 | height: 0.8rem; 404 | overflow: hidden; 405 | line-height: 0.8rem; 406 | color: #323232; 407 | background: #fff url(../images/buyer-icon.png) no-repeat 0.2rem; 408 | background-size: 0.32rem 0.36rem; 409 | margin: 0.2rem auto; 410 | } 411 | .buyers-info>span{ 412 | margin-left: 0.75rem; 413 | } 414 | .buyer-name{margin-right: 0.23rem} 415 | .buyer-shop{ 416 | background: #fff url(../images/shops-icon.png) no-repeat 0.2rem; 417 | background-size: 0.4rem 0.36rem; 418 | margin: 0 auto; 419 | } 420 | .buy-info-box{ 421 | width: 100%; 422 | height: 1.6rem; 423 | overflow: hidden; 424 | padding: 0.3rem 0; 425 | border-top: 1px solid #e0e0e0; 426 | background: #fff; 427 | } 428 | .buy-info-img{ 429 | float: left; 430 | width: 1.6rem; 431 | height: 1.6rem; 432 | overflow: hidden; 433 | margin-left: 0.2rem; 434 | } 435 | .buy-info-img img{ 436 | width: 100%; 437 | } 438 | .buy-info-text{ 439 | float: right; 440 | width: 4.2rem; 441 | height: 1.6rem; 442 | overflow: hidden; 443 | margin-right: 0.2rem; 444 | } 445 | .buy-info-text>h2{ 446 | text-overflow: -o-ellipsis-lastline; 447 | overflow: hidden; 448 | text-overflow: ellipsis; 449 | display: -webkit-box; 450 | -webkit-line-clamp: 1; 451 | -webkit-box-orient: vertical; 452 | color: #333333; 453 | font-size: 0.3rem; 454 | font-weight: normal; 455 | margin: 0.15rem 0 0.55rem 0; 456 | } 457 | .buy-info-text>div{ 458 | width: 100%; 459 | height: auto; 460 | overflow: hidden; 461 | } 462 | .buy-info-text>div>span:first-of-type{ 463 | float: left; 464 | color: #ff7700; 465 | font-size: 0.35rem; 466 | } 467 | .buy-info-text>div>span:last-of-type{ 468 | float: right; 469 | font-size: 0.26rem; 470 | line-height: 0.60rem; 471 | } 472 | .info-price{ 473 | font-size: 0.45rem; 474 | line-height: 0.45rem; 475 | } 476 | .pass-teacher{ 477 | width: 100%; 478 | height: 0.8rem; 479 | overflow: hidden; 480 | background: #fff; 481 | margin: 0.2rem auto; 482 | line-height: 0.8rem; 483 | color: #646464; 484 | text-indent: 0.2rem; 485 | } 486 | .pass-teacher span{ 487 | float: right; 488 | margin-right: 0.2rem; 489 | } 490 | .discount{ 491 | width: 100%; 492 | height: 0.8rem; 493 | overflow: hidden; 494 | background: #fff; 495 | line-height: 0.8rem; 496 | color: #646464; 497 | text-indent: 0.2rem; 498 | border-top: 1px solid #e0e0e0; 499 | border-bottom: 1px solid #e0e0e0; 500 | } 501 | .discount span{ 502 | float: right; 503 | margin-right: 0.2rem; 504 | } 505 | .pay-info{ 506 | width: 6.2rem; 507 | height: 0.8rem; 508 | overflow: hidden; 509 | text-align: right; 510 | background: #fff; 511 | line-height: 0.8rem; 512 | padding-right: 0.2rem; 513 | } 514 | .pay-info>span:last-of-type{ 515 | color: #ff7700; 516 | } 517 | .pay-tips{ 518 | color: #999999; 519 | font-size: .22rem; 520 | line-height: 0.8rem; 521 | text-align: center; 522 | } 523 | .pay-key{ 524 | position: fixed; 525 | left: 0; 526 | bottom: 0; 527 | width: 100%; 528 | height: 0.88rem; 529 | line-height: 0.88rem; 530 | background: #fff; 531 | overflow: hidden; 532 | font-size: 0.28rem; 533 | } 534 | .pay-key>div:first-of-type{ 535 | float: left; 536 | margin-left: 0.2rem; 537 | color: #323232; 538 | } 539 | .pay-key>div:first-of-type>span{ 540 | color: #ff7700; 541 | font-size: 0.36rem; 542 | } 543 | .pay-key>div:last-of-type{ 544 | float: right; 545 | width: 2.4rem; 546 | height: 0.88rem; 547 | background: #ff9900; 548 | text-align: center; 549 | color:#ffffff; 550 | 551 | } 552 | input.thacherName{display: none} 553 | /*我的门禁二维码*/ 554 | .erWeiCode-box{ 555 | position: fixed; 556 | left: 50%; 557 | top: 50%; 558 | margin-left: -2.6rem; 559 | margin-top:-3.3rem; 560 | width: 4.8rem; 561 | height: 6.6rem; 562 | overflow: hidden; 563 | background: #fff; 564 | padding: 0 0.2rem; 565 | border-radius: 0.1rem; 566 | } 567 | .erWeiCode-box-top{ 568 | width: 100%; 569 | height: 1.5rem; 570 | overflow: hidden; 571 | border-bottom: 1px solid #e0e0e0; 572 | text-align: center; 573 | } 574 | .user-img{ 575 | width: 0.9rem; 576 | height: 0.9rem; 577 | overflow: hidden; 578 | border-radius: 100%; 579 | float: left; 580 | margin: 0.3rem 0.2rem 0 1.38rem; 581 | } 582 | .user-img img{ 583 | width: 100%; 584 | } 585 | .user-name{ 586 | float: left; 587 | width: auto; 588 | height: 1.5rem; 589 | overflow: hidden; 590 | line-height: 1.5rem; 591 | } 592 | .erWeiCode-img{ 593 | width: 3.6rem; 594 | height: 3.6rem; 595 | overflow: hidden; 596 | margin: 0.5rem auto 0 auto; 597 | } 598 | .erWeiCode-img img{ 599 | width: 100%; 600 | } 601 | .erWeiTip{ 602 | width: 100%; 603 | color: #646464; 604 | font-size: 0.26rem; 605 | text-align: center; 606 | line-height: 0.96rem; 607 | } 608 | /*会员中心添加门店卡*/ 609 | .shop-inp{ 610 | width: 6rem; 611 | height: 0.88rem; 612 | display: block; 613 | margin: 0 auto; 614 | border-radius: 0.1rem; 615 | border: 1px solid #e0e0e0; 616 | text-indent: 0.2rem; 617 | font-size: 0.26rem; 618 | color: #c8c8c8; 619 | box-sizing: border-box; 620 | } 621 | .shop-card{ 622 | margin-top: 0.4rem; 623 | } 624 | .shop-tel{ 625 | margin: 0.2rem auto; 626 | } 627 | .tell-code{ 628 | width: 6rem; 629 | height: 0.88rem; 630 | overflow: hidden; 631 | margin: 0 auto; 632 | } 633 | .tell-inp{ 634 | float: left; 635 | width: 3.8rem; 636 | height: 0.88rem; 637 | border-radius: 0.1rem; 638 | border: 1px solid #e0e0e0; 639 | text-indent: 0.2rem; 640 | font-size: 0.26rem; 641 | color: #c8c8c8; 642 | box-sizing: border-box; 643 | } 644 | .get-tell{ 645 | width: 100%; 646 | line-height: 0.88rem; 647 | border-radius: 0.1rem; 648 | font-size: 0.26rem; 649 | color: #ff6600; 650 | text-align: center; 651 | } 652 | .code-btn{ 653 | float: right; 654 | width: 2rem; 655 | height: 0.88rem; 656 | border-radius: 0.1rem; 657 | border: 1px solid #ff9900; 658 | font-size: 0.26rem; 659 | color: #ff6600; 660 | box-sizing: border-box; 661 | text-align: center; 662 | overflow: hidden; 663 | } 664 | .bind-btn{ 665 | width: 6rem; 666 | height: 0.88rem; 667 | text-align: center; 668 | line-height: 0.88rem; 669 | margin: 0.4rem auto; 670 | border-radius: 0.1rem; 671 | color: #fff; 672 | background: #ff9900; 673 | font-size: 0.3rem; 674 | } 675 | .bind-tip{ 676 | width: 5.8rem; 677 | height: auto; 678 | overflow: hidden; 679 | margin: 0 0 0 0.4rem; 680 | } 681 | .bind-tip li{ 682 | width: 100%; 683 | height: auto; 684 | overflow: hidden; 685 | color: #646464; 686 | margin-bottom: 0.1rem; 687 | } 688 | .bind-tip li span{ 689 | color: #ff9900; 690 | } 691 | /*我的课程表*/ 692 | .my-course{ 693 | width: 100%; 694 | height: auto; 695 | overflow: hidden; 696 | } 697 | .my-course li{ 698 | width: 100%; 699 | height: 1.4rem; 700 | overflow: hidden; 701 | margin-top: 0.2rem; 702 | background: #fff; 703 | } 704 | .MyCourse-img{ 705 | float: left; 706 | width: 2.6rem; 707 | height: 1.4rem; 708 | overflow: hidden; 709 | } 710 | .MyCourse-img img{ 711 | width: 100%; 712 | } 713 | .MyCourse-text{ 714 | float: right; 715 | margin-right: 0.2rem; 716 | width: 3.35rem; 717 | height: 1.4rem; 718 | overflow: hidden; 719 | } 720 | .MyCourse-text h2{ 721 | text-overflow: -o-ellipsis-lastline; 722 | overflow: hidden; 723 | text-overflow: ellipsis; 724 | display: -webkit-box; 725 | -webkit-line-clamp: 1; 726 | -webkit-box-orient: vertical; 727 | font-size: 0.3rem; 728 | color: #1e1e1e; 729 | font-weight: 500; 730 | margin: 0.2rem 0 0.25rem 0; 731 | } 732 | .courseTime{ 733 | color: #969696; 734 | font-size: 0.22rem; 735 | width: 100%; 736 | height: 0.26rem; 737 | line-height: 0.26rem; 738 | overflow: hidden; 739 | background: url(../images/Act-time.png) no-repeat left center; 740 | background-size: 0.26rem 0.26rem; 741 | text-indent: 0.3rem; 742 | } 743 | /*我的课程表详情*/ 744 | .myCourse-list{ 745 | width: 6rem; 746 | height: auto; 747 | overflow: hidden; 748 | margin: 0.2rem auto; 749 | } 750 | .myCourse-list img{ 751 | width: 100%; 752 | display: block; 753 | } 754 | /*我-押金-支付*/ 755 | .deposit-coin{ 756 | width: 1.6rem; 757 | height: 1.6rem; 758 | overflow: hidden; 759 | margin: 0.6rem auto 0.8rem auto; 760 | } 761 | .deposit-coin img{width: 100%} 762 | .deposit-box{ 763 | width: 5.6rem; 764 | height: 0.88rem; 765 | border: 1px solid #e0e0e0; 766 | border-radius: 0.1rem; 767 | background: #fff; 768 | padding: 0 0.2rem; 769 | margin: 0 auto; 770 | line-height: 0.88rem; 771 | font-size: 0.3rem; 772 | color: #646464; 773 | } 774 | .deposit-box input{ 775 | width: 1.25rem; 776 | line-height: 0.88rem; 777 | float: right; 778 | font-size: 0.5rem; 779 | color: #323232; 780 | } 781 | .goPayDeposit{ 782 | width: 6rem; 783 | height: 0.88rem; 784 | line-height: 0.88rem; 785 | border-radius: 0.1rem; 786 | text-align: center; 787 | color: #fff; 788 | background: #ff9900; 789 | font-size: 0.3rem; 790 | margin: 1rem auto 0.25rem auto; 791 | } 792 | /*我-押金-已支付*/ 793 | .deposited-coin{ 794 | margin-top: 1rem; 795 | margin-bottom: 0.25rem; 796 | } 797 | .deposited-box{ 798 | text-align: center; 799 | color: #969696; 800 | font-size: 0.26rem; 801 | line-height: 0.5rem; 802 | } 803 | .deposited-box span{ 804 | font-size:0.6rem; 805 | color:#1e1e1e 806 | } 807 | .return-deposit{ 808 | left: 0; 809 | bottom: 1rem; 810 | position: fixed; 811 | width: 100%; 812 | height: auto; 813 | overflow: hidden; 814 | color: #ff9900; 815 | text-align: center; 816 | } 817 | /*我的余额*/ 818 | .return-deposit a{ 819 | color: #646464; 820 | } 821 | .credit{ 822 | position: fixed; 823 | left: 0.2rem; 824 | bottom: 1.8rem; 825 | width: 6rem; 826 | height: 0.88rem; 827 | line-height: 0.88rem; 828 | border-radius: 0.1rem; 829 | text-align: center; 830 | color: #fff; 831 | background: #ff9900; 832 | font-size: 0.3rem; 833 | } 834 | /*我的余额-充值余额*/ 835 | .Recharge-box{ 836 | width: 100%; 837 | height: 4.25rem; 838 | overflow: hidden; 839 | background: #fff; 840 | margin-top: 0.2rem; 841 | } 842 | .Recharge-title{ 843 | width: 6rem; 844 | height: auto; 845 | overflow: hidden; 846 | color: #969696; 847 | line-height: 0.85rem; 848 | text-indent: 0.2rem; 849 | } 850 | ul.Recharge-num{ 851 | width: 6rem; 852 | height: auto; 853 | overflow: hidden; 854 | margin:0 auto; 855 | } 856 | ul.Recharge-num li{ 857 | width: 2.8rem; 858 | height: 0.8rem; 859 | float: left; 860 | overflow: hidden; 861 | margin: 0 0.1rem 0.3rem 0.1rem; 862 | text-align: center; 863 | line-height: 0.8rem; 864 | background: url(../images/Recharge-bg.png) no-repeat; 865 | background-size: 100% auto; 866 | color: #323232; 867 | } 868 | ul.Recharge-num li span{ 869 | color: #ff9900; 870 | } 871 | ul.Recharge-num li.chooseRechargeNum{ 872 | background: url(../images/Recharge-bg-cur.png) no-repeat; 873 | background-size: 100% auto; 874 | } 875 | .goPayBalance{ 876 | width: 6rem; 877 | height: 0.88rem; 878 | line-height: 0.88rem; 879 | border-radius: 0.1rem; 880 | text-align: center; 881 | color: #fff; 882 | background: #ff9900; 883 | font-size: 0.3rem; 884 | margin: 0.75rem auto 0 auto; 885 | } 886 | /*我的订单-已完成*/ 887 | .Order-go{ 888 | width: 100%; 889 | height: 0.8rem; 890 | overflow: hidden; 891 | border-bottom: 1px solid #e0e0e0; 892 | border-top: 1px solid #e0e0e0; 893 | background: #fff; 894 | text-align: center; 895 | line-height: 0.8rem; 896 | } 897 | .Order-go li{ 898 | display: inline-block; 899 | padding: 0 0.2rem; 900 | margin: 0 0.5rem; 901 | } 902 | .Order-go li a{color: #969696;} 903 | .Order-go-cur{ 904 | border-bottom: 3px solid #ff9900; 905 | box-sizing: border-box; 906 | } 907 | .Order-go li.Order-go-cur a{ 908 | color: #ff9900; 909 | } 910 | 911 | .Order-list li{ 912 | margin-top: 0.2rem; 913 | } 914 | .order-info>a>h2{ 915 | text-overflow: -o-ellipsis-lastline; 916 | overflow: hidden; 917 | text-overflow: ellipsis; 918 | display: -webkit-box; 919 | -webkit-line-clamp: 1; 920 | -webkit-box-orient: vertical; 921 | color: #333333; 922 | font-size: 0.3rem; 923 | font-weight: normal; 924 | margin: 0.15rem 0 0.55rem 0; 925 | } 926 | .order-info>a>div{ 927 | width: 100%; 928 | height: auto; 929 | overflow: hidden; 930 | } 931 | .order-info>a>div>span:first-of-type{ 932 | float: left; 933 | color: #ff7700; 934 | font-size: 0.35rem; 935 | } 936 | .order-info>a>div>span:last-of-type{ 937 | float: right; 938 | font-size: 0.26rem; 939 | line-height: 0.60rem; 940 | } 941 | .Order-top{ 942 | width: 100%; 943 | height: 0.8rem; 944 | line-height: 0.8rem; 945 | overflow: hidden; 946 | background: #fff url(../images/shops-icon.png) no-repeat 0.2rem 0.2rem; 947 | background-size: 0.4rem 0.36rem; 948 | text-indent: 0.75rem; 949 | color: #323232; 950 | } 951 | .Order-top span{ 952 | float: right; 953 | margin-right: 0.2rem; 954 | } 955 | .Order-top span.state-finish{ 956 | color: #00903d; 957 | } 958 | .Order-top span.state-NoPay{ 959 | color: #ff0033; 960 | } 961 | /*我的订单-未支付*/ 962 | .cancel-order-box{ 963 | width: 100%; 964 | height: 0.8rem; 965 | overflow: hidden; 966 | background: #fff; 967 | border-top: 1px solid #e0e0e0; 968 | line-height: 0.8rem; 969 | text-align: right; 970 | } 971 | .cancel-order-btn{ 972 | border: 1px solid #ff9900; 973 | padding: 0.12rem 0.2rem; 974 | border-radius: 0.3rem; 975 | margin-right: 0.2rem; 976 | color: #ff9900; 977 | font-size: 0.2rem; 978 | } 979 | /*订单详情-已完成*/ 980 | .payTime-finish{ 981 | width: 100%; 982 | height: 1rem; 983 | overflow: hidden; 984 | background: url(../images/detail-pay-finish.jpg) no-repeat; 985 | background-size: 100% auto; 986 | line-height: 1rem; 987 | color: #fff; 988 | text-indent: 0.75rem; 989 | } 990 | .tip-box{ 991 | width: 100%; 992 | height: 0.6rem; 993 | overflow: hidden; 994 | line-height: 0.6rem; 995 | color: #ff6600; 996 | background: #ffe2b9 url(../images/tip-light.png) no-repeat 0.2rem 0.12rem; 997 | background-size: 0.36rem 0.36rem; 998 | text-indent: 0.75rem; 999 | } 1000 | .order-text{ 1001 | width: 100%; 1002 | height: 0.88rem; 1003 | overflow: hidden; 1004 | text-indent: 0.75rem; 1005 | line-height: 0.88rem; 1006 | color: #323232; 1007 | } 1008 | .order-code{ 1009 | background: #fff url(../images/ico-order.png) no-repeat 0.17rem 0.19rem; 1010 | background-size: 0.4rem 0.5rem; 1011 | border-bottom: 1px solid #e0e0e0; 1012 | margin-top: 0.2rem; 1013 | } 1014 | .order-man{ 1015 | background: #fff url(../images/buyer-icon.png) no-repeat 0.2rem 0.26rem; 1016 | background-size: 0.32rem 0.36rem; 1017 | margin-bottom: 0.2rem; 1018 | display: none; 1019 | } 1020 | .order-price{ 1021 | width: 100%; 1022 | height: 0.88rem; 1023 | line-height: 0.88rem; 1024 | overflow: hidden; 1025 | color: #323232; 1026 | text-indent: 0.2rem; 1027 | background: #fff; 1028 | } 1029 | .order-price>span{ 1030 | float: right; 1031 | font-size: 0.28rem; 1032 | margin-right: 0.2rem; 1033 | } 1034 | .order-dif{ 1035 | margin-top: 0.2rem; 1036 | border-bottom: 1px solid #e0e0e0; 1037 | } 1038 | .payTime-noPay{ 1039 | background: url(../images/detail-pay-nopay.jpg) no-repeat; 1040 | background-size: 100% auto; 1041 | } 1042 | /*支付成功*/ 1043 | .success-icon{ 1044 | width: 1.2rem; 1045 | height: 1.2rem; 1046 | overflow: hidden; 1047 | margin: 1rem auto 0 auto; 1048 | } 1049 | .success-icon img{ 1050 | width: 100%; 1051 | } 1052 | .success-tip{ 1053 | width: 100%; 1054 | height: auto; 1055 | overflow: hidden; 1056 | text-align: center; 1057 | color: #323232; 1058 | font-size: 0.28rem; 1059 | line-height: 1.1rem; 1060 | } 1061 | .suc-info-box{ 1062 | width: 100%; 1063 | height: auto; 1064 | overflow: hidden; 1065 | background: #fff; 1066 | padding: 0.2rem 0; 1067 | margin: 0 auto; 1068 | } 1069 | .suc-info{ 1070 | width: 100%; 1071 | height: 0.64rem; 1072 | line-height: 0.64rem; 1073 | overflow: hidden; 1074 | text-indent: 0.2rem; 1075 | color: #969696; 1076 | font-size: 0.26rem; 1077 | } 1078 | .suc-info span{ 1079 | float: right; 1080 | margin-right: 0.2rem; 1081 | color: #323232; 1082 | } 1083 | .pay-suc{ 1084 | width: 6rem; 1085 | height: 0.8rem; 1086 | text-align: center; 1087 | line-height: 0.8rem; 1088 | color: #fff; 1089 | font-size: 0.3rem; 1090 | background: #ff9900; 1091 | border-radius: 0.8rem; 1092 | margin: 0.4rem auto 0 auto; 1093 | } 1094 | .course-search .search-coinoff{width:0.5rem} 1095 | .course-search .search-ipt-off{width:5.46rem} 1096 | 1097 | 1098 | 1099 | /*zhq*/ 1100 | /*登录*/ 1101 | .box-reg{ position: absolute; width: 100%; height:100%; overflow: hidden;} 1102 | .banner-reg{ width: 100%; height: auto; } 1103 | .banner-reg img{ width: 100%; height: auto;} 1104 | .box-reg .form{ width: 100%; height: auto; margin-top: 0rem; font-size: 0.26rem;} 1105 | .ipt-tel{ width: 6rem; height: 0.8rem; margin: 0 auto; overflow: hidden;} 1106 | .ipt-tel input{ width: 6rem; height: 0.8rem; border-radius: 0.12rem; line-height: 0.8rem;text-indent: 0.2rem;font-size: 0.26rem} 1107 | .ipt-code{ width: 6rem; height: 0.8rem; overflow: hidden; margin: 0.2rem auto; } 1108 | .ipt-code>input{ width: 4rem; height: 0.8rem; border-radius: 0.12rem; line-height: 0.8rem; display: inline-block;text-indent: 0.2rem;font-size: 0.26rem} 1109 | .code-btn-bind{float: right;width: 1.8rem; height: 0.8rem;border-radius: 0.1rem;border: 1px solid #ff9900;font-size: 0.26rem;color: #ff6600;box-sizing: border-box;text-align: center;overflow: hidden;} 1110 | .code-btn-bind>input{line-height: 0.8rem} 1111 | .ipt-code a{ width: 1.65rem; height: 0.8rem; margin-left: 0.06rem; border:1px solid #ff9900; box-sizing: border-box; border-radius: 0.12rem; line-height: 0.8rem; color: #ff9900; text-align: center; display: inline-block;} 1112 | .member-bind{width: 6rem; height: 0.8rem; margin:0.4rem auto 0 auto; display: block; border-radius: 0.12rem; background-color: #ff9900; color: #fff; font-size: 0.3rem;} 1113 | .bind-show{width: 100%;height: 100%;overflow: hidden;background: rgba(0,0,0,0.7);position: absolute;left: 0;top: 0} 1114 | .box-author{ width: 5.2rem; height: 6.8rem; overflow: hidden; background: none;position: fixed;left: 50%;top: 50%;margin-top: -3.4rem;margin-left: -2.6rem} 1115 | .author{ position: relative; width: 5.2rem; height: 5.8rem; overflow: hidden;} 1116 | .author img{ width: 100%; height: auto; border-radius: 0.2rem;} 1117 | .btn-author{ position: absolute; top: 4.4rem; left: 1.4rem; width: 2.4rem; height: 0.7rem; overflow: hidden; display: block; background-color: #e64c00; border-radius: 0.2rem; color: #fff; font-size: 0.28rem; line-height: 0.7rem; z-index: 50} 1118 | .btn-close{ width: 0.5rem; height: 0.5rem; overflow: hidden; margin: 0.3rem auto 0; display: block; } 1119 | .btn-close img{ width: 100%; height: auto; } 1120 | .box-coupon{ position: absolute; width: 100%; height:100%; overflow: hidden; background-color: #ca3136;} 1121 | .coupon{ width: 100%; height: 7.7rem; overflow: hidden; } 1122 | .coupon img{ width: 100%; height: auto; } 1123 | .btn-view{ position: absolute; top: 8.2rem; left: 1rem; width: 4.4rem; height: 0.8rem; border-radius: 0.2rem; background-color: #e68600; color: #fff; font-size: 0.28rem; line-height: 0.8rem; text-align: center; z-index: 20} 1124 | .btn-back{ position: absolute; left: 0.2rem; top: 0.3rem; width: 0.35rem; height: 0.35rem; overflow: hidden; background: url(../images/btn-back.png) no-repeat; background-size: auto 100%; z-index: 20} 1125 | .box-scene{ position: absolute; width: 100%; height: 100%; overflow: hidden; background: url(../images/bg-scene.jpg) no-repeat; background-size: 100% 100%; } 1126 | .box-scene .head{ position: absolute; bottom:5.8rem; left: 50%; margin-left: -0.7rem; width: 1.4rem; height: 1.4rem; overflow: hidden; border-radius: 100%; border:2px solid #fff; z-index: 40; } 1127 | .box-scene .head img{ width: 100%; height: auto; } 1128 | .name{ position: absolute; bottom:5.2rem; width: 100%; height: 0.6rem; overflow: hidden; font-size: 0.32rem; line-height: 0.6rem; text-align: center; color: #fff; z-index: 40; } 1129 | .box-baby{ position: absolute; bottom: 0.7rem; width: 5.6rem; height: 5.8rem; left: 50%; margin-left: -2.8rem; overflow: hidden; background: rgba(0,0,0,0.7); border-radius: 0.3rem;} 1130 | .count{ width: 4.9rem; height: 0.5rem; margin: 1.9rem auto 0; color: #fff; line-height: 0.5rem;} 1131 | .number{ float: right; } 1132 | .babies{ width: 4.8rem; height: 1.2rem; overflow: hidden; background-color: #fff; padding: 0.12rem; margin: 0 auto;} 1133 | .babies li{ float: left; width: 1rem; height: 1.2rem; overflow: hidden; border: 1px solid #b4b4b4; box-sizing: border-box; border-radius: 0.1rem; margin: 0 0.1rem;} 1134 | .babies li.on{ border:2px solid #ff9900; } 1135 | .babies li img{ width: 100%; height: auto; } 1136 | .btn-admission{ width: 3.6rem; height: 0.8rem; border-radius: 0.4rem; background-color: #ff9900; display: block; margin: 0.5rem auto 0; color: #fff; text-align: center; line-height: 0.8rem; font-size: 0.3rem; } 1137 | 1138 | .box-user{ width: 100%; height: 5.5rem; overflow: hidden; background: url(../images/bg-member.jpg) #f0f0f0 no-repeat; background-size: 100% auto; color: #fff;} 1139 | .user{ width: 5.8rem; height: 1.3rem; margin: 0.4rem 0 0 0.3rem; font-size: 0.3rem; line-height: 1.3rem;} 1140 | .user .head{ overflow:hidden;float: left; width: 1.3rem; height: 1.3rem; border:2px solid #fff; box-sizing:border-box; border-radius: 100%;} 1141 | .user .head img{ width: 100%; height: auto;} 1142 | .user .user-btn{ float: left; width: auto; height: 1.3rem; margin-left: 0.3rem; line-height: 1.3rem;} 1143 | .user .user-btn a{ color: #fff;} 1144 | .box-card{ position: absolute; top: 2.1rem; left: 0.3rem; width: 5.8rem; height: 3rem; overflow: hidden; background-color: #fff; border-radius: 0.2rem;} 1145 | .getcard{ position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: rgba(0,0,0,0.5); z-index:20;} 1146 | .getcard a{ position: absolute; left: 50%; top: 50%; margin:-0.3rem 0 0 -1.2rem; width: 2.4rem; height: 0.6rem; background-color: #ff9900; border-radius: 0.3rem; line-height: 0.6rem; text-align: center; color: #fff; font-size: 0.26rem;} 1147 | .card-h{ width: 5.5rem; height: 0.4rem; overflow: hidden; margin:0.2rem auto; line-height: 0.4rem;} 1148 | .card-name{ float: left; background: url(../images/ico-card.png) no-repeat 0 0.04rem; background-size: 0.38rem auto; text-indent: 0.4rem; font-size: 0.26rem; color: #323232;} 1149 | .card-add{ float: right; color: #ff9900;} 1150 | .box-wallet{ width: 100%; height: 1rem; overflow: hidden; background: url(../images/bg-card.jpg) no-repeat;} 1151 | .wallet{ float: left; width: auto; height: 0.32rem; margin: 0.35rem 0 0 0.15rem; background: url(../images/ico-wallet.png) no-repeat 0 0.04rem; background-size: 0.3rem auto; text-indent: 0.4rem; font-size: 0.26rem; color: #fff; line-height: 0.42rem;} 1152 | .wallet-detial{ width: 100%; height: 1.25rem;} 1153 | .wallet-detial li{ float: left; width: 33.3%; text-align: center; color: #646464; line-height: 0.4rem;} 1154 | .wallet-detial li p{ width: 100%; height: 0.4rem;} 1155 | .wallet-name{ margin-top: 0.2rem;} 1156 | .green{ color: #00ac49;} 1157 | .orange{ color: #ff8e00;} 1158 | .red{ color: #f33151;} 1159 | .go-author{ float: right; width: 1.2rem; height: 0.4rem; overflow: hidden; margin:0.35rem 0.1rem 0; background-color: #ff9900; color: #fff; font-size: 0.24rem; line-height: 0.4rem; text-align: center; border-radius: 0.2rem;} 1160 | .user-menu{ width: 100%; height: auto; background-color: #fff; margin-bottom: 1.4rem;} 1161 | .user-menu li{ width: 100%; height: 0.9rem; overflow: hidden; border-bottom: #e0e0e0 solid 1px; color: #333; line-height: 0.9rem; font-size: 0.26rem; background: url(../images/ico-open.png) 6rem 0.35rem no-repeat; background-size: 0.12rem auto;} 1162 | .user-menu li img{ float: left; margin: 0.2rem 0.2rem 0 0.25rem; width: 0.4rem; height: 0.5rem;} 1163 | .box-name-z{ float: left; width: 2.6rem; height: 1.3rem; overflow: hidden; margin: 0.1rem 0 0 0.3rem} 1164 | .user-name-z{ color: #fff; line-height: 0.6rem; font-size: 0.3rem; } 1165 | .level-z{ width: 1.7rem; height: 0.4rem; overflow: hidden; background:url(../images/ico-nomalmem.png) no-repeat 0.1rem 0.06rem #f8e71c; background-size: 0.27rem auto; color: #0099ff; font-size: 0.24rem;line-height: 0.4rem; text-indent: 0.4rem; border-radius: 0.2rem; } 1166 | .cardpay-z{ position: absolute; left: 4.7rem; top: 0.5rem; width: 1.4rem; height: 0.4rem; overflow: hidden; background: url(../images/ico-cardpay.png) no-repeat 0.25rem 0.05rem; background-size: 0.3rem auto; border:2px solid #fff; border-radius: 0.08rem; color: #fff; text-indent: 0.65rem; font-size: 0.26rem; line-height: 0.4rem} 1167 | .sign-z{ position: absolute; left: 4.7rem; top: 1.2rem; width: 1.4rem; height: 0.4rem; overflow: hidden; background: url(../images/ico-sign.png) no-repeat 0.25rem 0.05rem; background-size: 0.3rem auto; border:2px solid #ffff00; border-radius: 0.4rem; color: #ffff00; text-indent: 0.65rem; font-size: 0.26rem; line-height: 0.4rem} 1168 | .shop-list-z{ width: 100%; height: auto; overflow: hidden; margin-bottom: 0.4rem; background-color: #fff;} 1169 | .shop-list-z li{ width: 100%; height: 1.4rem; overflow: hidden; } 1170 | .shop-img-z{ float: left; width: 1rem; height: 1rem; overflow: hidden; margin:0.2rem;} 1171 | .shop-img-z img{ width: 100%; height: auto; } 1172 | .shop-des-z{ float: left; width: 4.3rem; height: 1rem; overflow: hidden; margin-top: 0.3rem;} 1173 | .shop-des-z h5{ font-weight: normal; font-size: 0.28rem; line-height: 0.4rem; } 1174 | .shop-des-z p{ font-size: 0.2rem; line-height: 0.4rem; color: #969696; } 1175 | .status-z{ float: right; width: auto; margin: 0.3rem 0.2rem 0 0; height: 0.4rem; line-height: 0.4rem; color: #969696;} 1176 | .orange-font{ color: #ff9900} 1177 | .box-register-z{ position: absolute; width: 100%; height: 100%; overflow: hidden; background:url(../images/bg-register.jpg) no-repeat; background-size: 100% 100%;} 1178 | .box-fmreg-z{ position: absolute; bottom: 1.1rem; left: 50%; margin-left: -2.4rem; width: 4.8rem; height: 2.8rem; overflow: hidden;} 1179 | .tel-z,.code-z{ width: 100%; height: 0.7rem; overflow: hidden; margin-bottom: 0.2rem;} 1180 | .tel-z input{ width: 100%; height: 0.7rem; line-height: 0.7rem; font-size: 0.26rem; color: #b4b4b4; text-indent: 0.2rem; border-radius: 0.1rem;} 1181 | .code-z>input{ width: 2.9rem; height: 0.7rem; line-height: 0.7rem; font-size: 0.26rem; color: #b4b4b4; text-indent: 0.2rem; border-radius: 0.1rem;} 1182 | .code-z a{ float: right; width: 1.8rem; height: 0.7rem; border-radius: 0.1rem; line-height: 0.7rem; color: #ba1530; font-size: 0.24rem; text-align: center; background-color: #fff;} 1183 | .reg-bind{height: 0.7rem} 1184 | .reg-bind span{height: 0.7rem;line-height: 0.7rem} 1185 | .reg-bind input{height: 0.7rem;line-height: 0.7rem;color: #ba1530} 1186 | .getgift{ width: 100%; height: 0.7rem; overflow: hidden; clear: left; margin-top: 0.4rem; background: #ffde00; border-radius: 0.1rem; box-shadow: 0 5px 5px #ab152d; text-align: center; line-height: 0.7rem; color: #9f0a22; display: block;} 1187 | .box-bemember-z{ position: absolute; width: 100%; height: 100%; overflow: hidden; background: url(../images/bg-bemember.jpg) no-repeat; background-size: 100% 100%;} 1188 | .btn-gomember-z{ position: absolute; bottom: 2.2rem; left: 50%; margin-left: -2.4rem; width: 4.8rem; height: 0.7rem; overflow: hidden; border-radius: 0.1rem; background: #ffde00; box-shadow: 0 5px 5px #123559; color: #9f0a22; text-align: center; line-height: 0.7rem; font-size: 0.3rem;} 1189 | .btn-share-z{ position: absolute; bottom: 1.1rem; left: 50%; margin-left: -2.4rem; width: 4.8rem; height: 0.7rem; overflow: hidden; border-radius: 0.1rem; background: #44f58f; box-shadow: 0 5px 5px #123559; color: #114108; text-align: center; line-height: 0.7rem; font-size: 0.3rem;} 1190 | .shadow-share{ position: absolute; width: 100%; height: 100%; overflow: hidden; background: url(../images/shadow-share.png); background-size: 100% 100%; z-index: 20;} 1191 | .shadow-code{ position: absolute; width: 100%; height: 100%; overflow: hidden; background: rgba(0,0,0,.7);z-index: 20; } 1192 | .shadow-code>div{position: absolute;width: 3.4rem;height: 3.4rem;overflow: hidden;top: 2.3rem;left: 50%;margin-left: -1.7rem} 1193 | .shadow-code>div img{width: 100%} 1194 | .shadow-code>p{position: absolute;top:6.3rem;left: 0;width: 100%;text-align: center;font-size: 0.24rem;color: #fff} 1195 | 1196 | 1197 | 1198 | 1199 | /* 1200 | 首页 sjt 1201 | */ 1202 | .bannerbox {width: 100%; height: 3rem; overflow: hidden; position: relative; background: #f0f0f0} 1203 | .banner{position:absolute; width: 100%; height: auto; overflow: hidden; } 1204 | .banner ul {position: absolute; left: 0; width: 100%; height: 3rem; overflow:hidden;} 1205 | .banner ul li {float: left;width: 100%; height: 3rem; overflow: hidden} 1206 | .banner ul li img { width: 100%; height: auto} 1207 | .bannerbox .st-num {position: absolute; bottom: 0.14rem; width: 100%; overflow: hidden; text-align: center;} 1208 | .st-num li{ width: 0.1rem; height: 0.1rem; border-radius: 100%; background:#fff ; margin:0 0.08rem ; font-size: 0; display: inline-block; } 1209 | .st-num li.on{background: #ff9900} 1210 | .st-nav { width: 100%; background: #fff; height: 1.68rem; } 1211 | .st-navList { width: 6rem; margin:0 auto; overflow: hidden; height: 1.68rem ;background: url(../images/line.png) 50% 50% no-repeat; background-size: 1px 1rem} 1212 | .st-navList li {float: left; width: 3rem; height: 100%; overflow: hidden; background-size: 0.6rem 0.6rem} 1213 | .st-navList li h1 { width: 100%; text-align: center; font-size: 0.32rem; margin-top: 0.4rem; color:#333333; font-weight: 500; margin-left: 0.28rem} 1214 | .st-navList li p { color:#b4b4b4; margin:.3rem 0 0 .34rem;} 1215 | .activity {background: url(../images/activity-icon.png) 0.32rem 0.34rem no-repeat ; border:} 1216 | .st-navList .activity h1 {margin-left: .22rem} 1217 | .st-navList .st-code p{ margin-left: .54rem} 1218 | .st-code {background: url(../images/code-icon.png) 0.55rem 0.34rem no-repeat;} 1219 | .st-mainbox {width:100%; height: auto; overflow: hidden; margin:.2rem 0 1.4rem 0; background: #fff } 1220 | .st-main {width: 6rem; margin: 0 auto ; height: auto; overflow: hidden} 1221 | .st-maintltle {margin-top: 0.4rem; margin-bottom: 0.3rem; width: 100%; height: .3rem ; background: url(../images/st-titleicon.png) 0 no-repeat;} 1222 | .st-maintltle h3{ float: left; text-indent: .2rem; line-height: .3rem; font-size: .28rem ; color:#333333; font-weight: 500} 1223 | .st-maintltle a {float: right; color:#969696;} 1224 | .st-mainlist {width:100%; height: auto; overflow: hidden; display: flex; display: -webkit-flex; flex-wrap:wrap; align-items: flex-start; 1225 | align-content: flex-start; 1226 | justify-content: space-between;} 1227 | .st-mainlist li { width:2.95rem; height: 3.285rem} 1228 | .st-mainlist li div {width: 100%; height: 2rem; overflow: hidden} 1229 | .st-mainlist li div img {width: 100%; height: auto} 1230 | .st-mainlist li h3 { font-size: .28rem; color: #333333; white-space: nowrap; text-overflow:ellipsis; overflow:hidden; margin: .2rem 0 .1rem 0;} 1231 | .st-mainlist li span { color:#ff9900;} 1232 | .st-mainlist .Nprice { color:#0099ff;} 1233 | /* 1234 | 首页-活动 sjt 1235 | */ 1236 | .Act-title {width: 100%; height: .8rem; overflow: hidden; background: #fff; margin-bottom: .2rem} 1237 | .st-Actitle {width: 6rem; height: .8rem ; margin:0 auto; overflow: hidden; text-align: center; line-height: .85rem; color:#646464; font-size: .28rem; position: relative;} 1238 | .st-prev {background: url(../images/prev.png) center no-repeat; width: .18rem ; height: .31rem; position: absolute; left: 0; top: 50%; margin-top: -0.15rem; background-size: .18rem .31rem} 1239 | .Act-listbox {width: 100%; height: auto; overflow: hidden; background: #fff} 1240 | .Act-list{width: 6rem; height: auto; margin:0 auto; overflow: hidden} 1241 | .Act-list li {position: relative; width: 100%; height: 2.2rem; border-bottom: 1px solid #e0e0e0; box-sizing:border-box; padding: .3rem 0} 1242 | .Act-list li .Act-bg {float:left; width:2.6rem ; height:100%; overflow: hidden} 1243 | .Act-list li .Act-bg img {width: 100%; height: auto} 1244 | .Act-list li .Act-detail { float: right; margin-left: .2rem; width: 3.2rem} 1245 | .Act-list li .Act-detail h5{overflow:hidden; text-overflow:ellipsis;display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; font-size: .3rem; color:#1e1e1e; font-weight: 500; height:.7rem; line-height: .36rem} 1246 | .Act-list li .Act-detail p {text-indent: .35rem; color:#969696; font-size: .2rem; line-height: .32rem} 1247 | .Act-time {background: url(../images/Act-time.png) 0 center no-repeat ; height: .26rem; background-size: .26rem .26rem; margin-top: .2rem} 1248 | .Act-adress {background: url(../images/Act-adress.png) 0 center no-repeat; height: .29rem ; background-size: .24rem .29rem ; margin-top: .14rem} 1249 | .Act-list li .Act-num {position: absolute; bottom: 0.26rem; right: 0 ; font-size: .2rem; color:#969696;} 1250 | .Act-num span {color:#ff9c00; font-size: .26rem} 1251 | 1252 | /* 1253 | 活动详情 sjt 1254 | */ 1255 | .Actitem-bg {width: 100%; height: 3.6rem; overflow: hidden} 1256 | .Actitem-bg img {width: 100%; height: auto} 1257 | .Actitem-main {width: 100%; height: auto; overflow: hidden; background: #fff; margin-bottom: .2rem} 1258 | .Actitem-title {width: 100%; height: auto; border-bottom: 1px solid #e0e0e0; box-sizing: border-box; overflow: hidden; padding: .25rem 0} 1259 | .Actitem-title h3 {width: 6rem; height: auto; overflow: hidden; margin:0 auto; font-size: .3rem; color:#1e1e1e; } 1260 | .Actitem-present {width: 5.4rem; height: auto; overflow: hidden; margin: 0 auto;} 1261 | .Actitem-present li {position: relative; width: 100%; height: auto; overflow: hidden; border-bottom: 1px solid #e0e0e0; min-height: .7rem} 1262 | .Actitem-present li i {position: absolute; width: .27rem; height: .29rem; top: .22rem; left: 0; } 1263 | .Actitem-present li:nth-of-type(1) i{ background:url(../images/Act-time.png) center no-repeat; background-size: .27rem .29rem} 1264 | .Actitem-present li:nth-of-type(2) i{ background:url(../images/Act-adress.png) center no-repeat; background-size: .26rem .29rem} 1265 | .Actitem-present li:nth-of-type(3) i{ background:url(../images/Act-peoIcoin.png) center no-repeat; background-size: .26rem .29rem} 1266 | .Actitem-present li:nth-of-type(4) i {background:url(../images/Act-dollarIcoin.png) center no-repeat; background-size: .26rem .29rem} 1267 | .Actitem-present li p {margin-left: .44rem; margin-top: .2rem; color:#0099ff; line-height: .36rem} 1268 | .Actitem-present .Actitem-price { color:#ff9900;} 1269 | .Act-aboutus {width: 5.6rem;height: .88rem; margin:.3rem auto; overflow: hidden; } 1270 | .Act-aboutus .Act-usicon { width: .88rem; height: .88rem; float: left; border-radius: 50% ; border:1px solid #e0e0e0; box-sizing:border-box;} 1271 | .Act-usicon img {width: 100%; height: auto} 1272 | .Act-Introduction {margin-left: .2rem; float: left; width: 4.5rem} 1273 | .Act-Introtitle {width: 100%; height: auto; overflow: hidden} 1274 | .Act-Introduction h5 {float: left; color:#323232; font-size: .26rem; margin-right: .1rem; max-width: 3.8rem; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;} 1275 | .Act-Introduction .IntIcon {width: .6rem ; height: .26rem ; float: left; background: #ff9900; color:#fff; font-size: .18rem; text-align: center; margin-top: .05rem;} 1276 | .us-detail {font-size: .2rem; color:#1e1e1e; text-overflow:ellipsis;display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; line-height:.26rem;} 1277 | .Act-artclebox {width: 100%; height: auto; overflow: hidden; background: #fff; margin-bottom: .2rem} 1278 | .Act-artcle { width: 6rem; height: auto; margin:0 auto; overflow: hidden} 1279 | .Act-artcle li {width:6rem; height:auto; overflow:hidden; border:none} 1280 | .Act-artcle li img { width:100%; height:auto} 1281 | .Actartcle-title {width: 100%; height: .9rem ; line-height: .9rem ; color:#0099ff; font-size: .3rem; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;} 1282 | .Actartcle-main {width: 100%; height: auto; overflow: hidden; font-size: .26rem; color:#1e1e1e; line-height: .38rem} 1283 | .Act-phptoWall {width: 100%; height: auto; overflow: hidden; } 1284 | .Act-phptoWall li {float: left; width: 3rem; height: 4.2rem; margin-bottom: .2rem} 1285 | .Act-phptoWall li img {width: 100%; height: auto} 1286 | .Act-user {width: 100%; height: auto; margin-bottom: .2rem; overflow: hidden ; background: #fff } 1287 | .Actuser-num {width: 6rem; height: .8rem; border-bottom: 1px solid #e0e0e0; box-sizing:border-box; margin:0 auto; color:#1e1e1e; line-height: .8rem} 1288 | .Actuser-box { width: 6rem; overflow-x:scroll; margin:0 auto;} 1289 | .Actuser-list {height: auto; padding: .28rem 0rem .5rem 0; width:auto; white-space: nowrap} 1290 | .Actuser-list li {display:inline-block; height: .97rem; width: .64rem; margin-right: .25rem; margin-bottom: 0.08rem; } 1291 | .Actuser-listimg { width: .64rem; height: .64rem; border-radius: 50% ; overflow: hidden} 1292 | .Actuser-list .Actuser-listimg img {width: 100%; height: auto} 1293 | .Actuser-name {margin-top: 0.06rem; font-size: .18rem ; color:#084974; text-align: center; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;} 1294 | .Act-more {width: 100%; height: auto; overflow: hidden; background: #fff; margin-bottom: 1.3rem} 1295 | .Act-list li>p{position: absolute; bottom: 0.26rem; right: 0 ; font-size: .2rem; color:#ff9900;} 1296 | .Actitems-footer {width: 100%; height: .9rem ; background: #ff9900 ; position: fixed; bottom: 0; text-align: center; line-height: .9rem;color:#fff; font-size: .3rem} 1297 | .layer-cur {z-index:99; width:100%; height:100%; background:rgba(51,51,51,0.3 ); position:fixed; left:0; top:0} 1298 | .actitems-layer {z-index:100; position:fixed; bottom:-3.9rem; left:0; width: 6rem; height: 3.9rem; border:none; padding:0 0.2rem; transition:bottom linear .3s; background:#fff} 1299 | .actitems-cur{ bottom:0;} 1300 | .Actitems-layerName, .Actitems-layerNum {width:6rem;color:#646464; font-size:.28rem; height:1rem; border-bottom:1px solid #e0e0e0; line-height:1.3rem} 1301 | .Actitems-layerName input , .Actitems-layerNum input { font-size:.26rem} 1302 | .Actitems-layerName span {color:#ff0000} 1303 | .Actitems-layerNum span {color:#ff0000} 1304 | .Actitems-layerBtn { display:block; margin-top:.4rem; width: 100%; height: .9rem ; background: #ff9900 ; text-align: center; line-height: .9rem;color:#fff; font-size: .3rem; border-radius:.9rem} 1305 | .Act-list li .Nprice { color:#0099ff;} 1306 | 1307 | /** 1308 | * 充值成功 1309 | */ 1310 | .st-paytips {height: 4rem; width: 100%; background: #fff; overflow: hidden; margin-bottom: .78rem} 1311 | .st-sucicon { width: 1.2rem; height: 1.2rem; margin: .4rem auto 0 auto; background: url(../images/success-icon.png) no-repeat; background-size: 1.2rem 1.2rem} 1312 | .st-suctip { font-size: .36rem; color:#009933; text-align: center; line-height: 1.18rem} 1313 | .st-suctext {color:#969696; text-align: center;} 1314 | .st-suctext a {color:#969696;} 1315 | .st-paydown { width: 100%; height: .8rem; text-align: center; line-height: .8rem; background: #ff9900; color:#fff; border-radius: 5px; font-size: .3rem} 1316 | /** 1317 | * 我的余额-消费明细 1318 | */ 1319 | .st-paylist { width: 100%; height: auto; overflow: hidden} 1320 | .st-paylist li{ border-bottom: 1px solid #e0e0e0; background: #fff; height: 1.25rem; width: 100%; overflow: hidden} 1321 | .st-paycontent { width: 6rem; margin:0 auto; overflow: hidden} 1322 | .st-paygoods {float: left; width: 3.8rem; height: 1.25rem; } 1323 | .st-payNum { float: right; width: auto; height: 1.25rem; text-align: right; line-height: 1.25rem; font-size: .4rem; color:#646464; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;} 1324 | .st-paysometing {margin:.25rem 0 .16rem 0; font-size: .28rem; color:#646464; white-space: nowrap; text-overflow:ellipsis; overflow:hidden;} 1325 | .st-paytime { font-size: .22rem; color:#b4b4b4; } 1326 | .st-paystatus{width: auto;float: right;line-height: 1.25rem;font-size: 0.4rem} 1327 | /** 1328 | * 消费明细-消费详情 1329 | */ 1330 | .st-billtipsbox { height: 3.3rem; width: 100%; overflow: hidden; border-bottom: 1px solid #e0e0e0; background: #fff; margin-bottom: .2rem} 1331 | .st-billtipbox { height: 1.76rem; border-top: 1px solid #e0e0e0; background: #fff} 1332 | .st-billtips { width: 6rem; margin:0 auto; height: auto; overflow: hidden} 1333 | .st-billNum { height: 2.4rem; border-bottom: 1px solid #e0e0e0} 1334 | .st-billlabel {color:#969696; line-height: 1.04rem} 1335 | .st-billnumber {font-size: .8rem; color:#3c3c3c; margin-top: .35rem} 1336 | .st-billtitle {font-size: .28rem; color:#323232; line-height: .9rem} 1337 | .st-billtp { height: .88rem; border-bottom: 1px solid #e0e0e0; box-sizing:border-box ; } 1338 | .st-billtp span { line-height: .88rem; float: left;} 1339 | .st-billkey { font-size: .28rem ; color:#646464; width: .8rem; margin-left: .2rem} 1340 | .st-billval { font-size: .28rem ; color:#969696;} 1341 | /** 1342 | *会员中心-会员权益 1343 | */ 1344 | .st-memberBuild { width: 2.1rem; height: 2.7rem; margin:0 auto; overflow: hidden; margin-top: 1.2rem} 1345 | .st-memberBuild img {width: 100%; height: auto} 1346 | /** 1347 | * 消息 1348 | */ 1349 | .news-navbox {width: 100%; height: .8rem; background: #fff; overflow: hidden; border-bottom: 1px solid #e0e0e0; margin-bottom: .2rem} 1350 | .news-nav {width: 6rem; height: .8rem; margin:0 auto; overflow: hidden; text-align: center;} 1351 | .news-nav li {position: relative; display: inline-block; padding: 0 .22rem; height: .8rem;margin: 0 .25rem; text-align: center; line-height: .8rem;} 1352 | .news-nav .on { border-bottom: 3px solid #ff9900; box-sizing: border-box; } 1353 | .news-nav .on a {color:#ff9900;} 1354 | .news-nav li .news-tip { background: url(../images/newstip.png) center no-repeat; width: .12rem; height: .12rem; position: absolute; top: .2rem; right: .2rem; border-radius: 50% } 1355 | .news-nav li a {font-size: .28rem; color:#969696} 1356 | .news-list {width: 100%; height: auto; overflow: hidden; background: #fff;margin-bottom: 1.4rem} 1357 | .news-list li { height: 1.2rem; width: 100%; border-bottom: 1px solid #e0e0e0; } 1358 | .news-listmain { width: 6rem; height: 1.2rem; margin: 0 auto; overflow: hidden} 1359 | .news-title {position: relative; float: left; width: 1.1rem; height: 1.2rem; } 1360 | .news-icon { width: .8rem; height: .8rem; margin-top:.2rem; overflow: hidden; border-radius: 50%} 1361 | .news-icon img {width: 100%; height: auto} 1362 | .news-titletip {position: absolute; background: url(../images/newsicon.png) center no-repeat; width: .3rem; height: .3rem; top: .1rem; right: .2rem;border-radius: 50%; background-size: .3rem .3rem; 1363 | font-size: .22rem; color:#fff; text-align: center; line-height: .3rem 1364 | } 1365 | .news-main { float: left; width: 4.9rem; height: 1.2rem;} 1366 | .news-maintext1 {margin-top: .08rem; height: .58rem; line-height: .68rem; } 1367 | .news-name {float: left; font-size: .28rem; color:#1e1e1e;} 1368 | .news-time {float: right; font-size: .2rem; color:#b4b4b4;} 1369 | .news-maintext2 {white-space: nowrap; text-overflow:ellipsis; overflow:hidden; width: 4.9rem; line-height: .22rem} 1370 | .news-content {font-size: .22rem; color:#969696; } 1371 | /** 1372 | * 消息详情 1373 | */ 1374 | .friend-icon {position: absolute; right: .1rem; top: .22rem; width: .32rem; height: .36rem; background: url(../images/friend-icon.png) no-repeat; background-size: .32rem .36rem} 1375 | .talk-list { width: 6rem; height: auto; overflow: hidden; margin:0 auto;} 1376 | .talk-list li { width: 6rem; height: auto; overflow: hidden; text-align: center;} 1377 | .talk-time { margin: .2rem auto; width: auto; height: .36rem; background: #d2d2d2; color:#fff; display: inline-block; padding: 0 .15rem; line-height: .36rem; border-radius: 2px } 1378 | .talk-content {height: auto; border-radius:2px ; border: 1px solid #e0e0e0; padding: .2rem; background: #fff; text-align: left; color:#323232; font-size: .26rem; line-height: .4rem} 1379 | /** 1380 | * 消息-通知 1381 | */ 1382 | .notice-list {margin-bottom: 1.4rem} 1383 | .notice-list li {margin-bottom: .2rem} 1384 | .notice-content {width: 6rem; height: auto; overflow: hidden; background: #fff; border-radius: 2px; text-align: left;} 1385 | .notice-tips { height: auto; overflow: hidden; padding: 0 .2rem} 1386 | .notice-title {font-size: .26rem; color:#1e1e1e; line-height: .8rem} 1387 | .notice-text {font-size: .22rem; color:#969696; margin-bottom: .2rem } 1388 | .see-Details { height: .8rem; border-top: 1px solid #e0e0e0; position: relative; padding:0 .2rem;} 1389 | .see-Details span { font-size: .26rem; color:#1e1e1e; line-height: .8rem; } 1390 | .st-next {position: absolute; background: url(../images/next.png) 0 no-repeat; height: .25rem; width: .14rem; right: .2rem; top: .28rem; background-size: .14rem .25rem} 1391 | .notice-img {height: 3rem; width: 6rem; overflow: hidden} 1392 | .notice-img img {width: 100%; height: auto} 1393 | /** 1394 | * 会员中心-在线 1395 | */ 1396 | .online-bg {background:url(../images/online-bg.jpg) no-repeat; background-size:100% 100%; width: 100%; height: 100% ; overflow: hidden; position: absolute;} 1397 | .online-clock {position: relative; height: 4.9rem; width: 4rem; margin:1rem auto 0 auto;} 1398 | .online-time {position: relative; height: 3.4rem; width: 4rem; background: url(../images/clock.png) center 0 no-repeat; background-size: 3.7rem 3.3rem ; overflow: hidden} 1399 | .online-title {margin-top: 1.1rem; font-size: .28rem; line-height: .28rem; color:#fefc47; text-align: center; margin-bottom: .3rem} 1400 | .online-timeNum {font-size: .6rem; color:#fffffe; text-align: center;} 1401 | .clock-start { position: absolute; bottom:0 ; width: 100%} 1402 | .clock-start p { text-align: center;font-size: .26rem; color:#fff; line-height: .3rem; } 1403 | .online-clock a {position: absolute; bottom: 0; width: 4rem; height: .8rem; border-radius: .4rem; background: #ff9900; color:#fff; text-align: center; line-height: .8rem; font-size: .3rem} 1404 | .online-clock .onmove { background: #2f2e2e} 1405 | /** 1406 | * 我的-优惠卷 1407 | */ 1408 | .coupon-list {width: 6rem; height: auto; overflow: hidden; margin:0 auto;} 1409 | .coupon-list li {margin-top: .2rem; width: 100%; height: 1.8rem; position: relative;} 1410 | .coupon-list .cardType1 { background: url(../images/coupon.png) no-repeat; background-size: 6rem 1.8rem} 1411 | .coupon-list .cardType2 { background: url(../images/coupon2.png) no-repeat; background-size: 6rem 1.8rem} 1412 | .coupon-list .cardType3 { background: url(../images/coupon3.png) 0 0 no-repeat; background-size: 6rem 1.8rem} 1413 | .coupon-list .cardType4 { background: url(../images/coupon5.png) 0 0 no-repeat; background-size: 6rem 1.8rem} 1414 | .coupon-list li div {position: absolute; width: 1.2rem; height: 1.2rem ; right: .4rem; top: .3rem} 1415 | .coupon-list li div img { width: 100%; height: auto} 1416 | .coupon-list li p {position: absolute; font-size: .22rem; color:#969696; text-indent: .5rem; bottom: .4rem} 1417 | .coupon-list li i {position: absolute;right: .02rem; bottom: 0; width: 1.14rem; height: .78rem; background: url(../images/coupon4.png) 0 0 no-repeat; background-size: 1.14rem .78rem} 1418 | .loading-layer{ padding-bottom:1rem;} 1419 | 1420 | 1421 | .box{ position:absolute; top:0; left:0; width:100%; height:100%; overflow:hidden;} 1422 | header{ position:relative; top:0; left:0; width:100%; height:100px; line-height:100px; border-bottom:1px solid #d0d0d0} 1423 | .main{ position:relative; height:-webkit-calc(100% - 100px);} 1424 | .left{ postition:relative; height:100%; background-color:#3c3b3c;} 1425 | .menu{ width:100%; height:auto;} 1426 | .menu li{ width:100%; height:45px; color:#fff; font-size:16px; line-height:45px; text-indent:30px;} 1427 | .menu li.on{ background-color:#337ab7} 1428 | .border-l{ border-left:1px solid #d0d0d0;} 1429 | .ipt-txt{ width:400px} 1430 | .ipt-num{ width:150px;} 1431 | .pd-t30{ padding-top:30px;} -------------------------------------------------------------------------------- /src/components/foot.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 32 | -------------------------------------------------------------------------------- /src/fetch/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | export function fetch (url, params) { 3 | return new Promise((resolve, reject) => { 4 | axios.defaults.headers.common['Authorization'] = 'Bearer ' + localStorage.token 5 | axios.defaults.headers.common['Content-Type'] = 'multipart/form-data' 6 | axios.post(url, params) 7 | .then(response => { 8 | resolve(response.data) 9 | }) 10 | .catch((error) => { 11 | console.log(error) 12 | reject(error) 13 | }) 14 | }) 15 | } 16 | 17 | export default { 18 | loginApi (user, password) { 19 | return fetch('/api/login', 'user=' + user + '&password=' + password) 20 | }, 21 | authTokenApi () { 22 | return fetch('/api/authToken') 23 | }, 24 | uploadApi (param, config) { 25 | return fetch('/api/uploader', param, config) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import './assets/style/public.css' 2 | import './assets/style/style.css' 3 | import './assets/js/rem' 4 | import Vue from 'vue' 5 | import VueRouter from 'vue-router' 6 | import routes from './router' 7 | import api from './fetch/api' 8 | 9 | Vue.use(VueRouter) 10 | const router = new VueRouter({ 11 | routes 12 | }) 13 | 14 | router.beforeEach((to, from, next) => { 15 | const reg = /^\/admin/ 16 | if (reg.test(to.path)) { 17 | if (localStorage.token) { 18 | api.authTokenApi().then(res => { 19 | if (res.errorCode === 0) { 20 | next() 21 | } else { 22 | next('/login') 23 | return false 24 | } 25 | }) 26 | } else { 27 | next('/login') 28 | return false 29 | } 30 | } else { 31 | next() 32 | } 33 | }) 34 | 35 | new Vue({ 36 | router 37 | }).$mount('#app') 38 | -------------------------------------------------------------------------------- /src/pages/admin/index/index.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/pages/admin/login/index.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/pages/home/index/index.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 133 | 134 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import App from '../App' 2 | 3 | export default [{ 4 | path: '/', 5 | component: App, 6 | children: [{ 7 | path: '', 8 | component: r => require.ensure([], () => r(require('../pages/home/index')), 'index') 9 | }, { 10 | path: '/login', 11 | component: r => require.ensure([], () => r(require('../pages/admin/login')), 'login') 12 | }, { 13 | path: '/admin', 14 | component: r => require.ensure([], () => r(require('../pages/admin/index')), 'admin') 15 | }] 16 | },{ 17 | path: "*", 18 | redirect: "/" 19 | }] 20 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/static/.gitkeep -------------------------------------------------------------------------------- /test/e2e/custom-assertions/elementCount.js: -------------------------------------------------------------------------------- 1 | // A custom Nightwatch assertion. 2 | // the name of the method is the filename. 3 | // can be used in tests like this: 4 | // 5 | // browser.assert.elementCount(selector, count) 6 | // 7 | // for how to write custom assertions see 8 | // http://nightwatchjs.org/guide#writing-custom-assertions 9 | exports.assertion = function (selector, count) { 10 | this.message = 'Testing if element <' + selector + '> has count: ' + count 11 | this.expected = count 12 | this.pass = function (val) { 13 | return val === this.expected 14 | } 15 | this.value = function (res) { 16 | return res.value 17 | } 18 | this.command = function (cb) { 19 | var self = this 20 | return this.api.execute(function (selector) { 21 | return document.querySelectorAll(selector).length 22 | }, [selector], function (res) { 23 | cb.call(self, res) 24 | }) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/e2e/nightwatch.conf.js: -------------------------------------------------------------------------------- 1 | require('babel-register') 2 | var config = require('../../config') 3 | 4 | // http://nightwatchjs.org/gettingstarted#settings-file 5 | module.exports = { 6 | src_folders: ['test/e2e/specs'], 7 | output_folder: 'test/e2e/reports', 8 | custom_assertions_path: ['test/e2e/custom-assertions'], 9 | 10 | selenium: { 11 | start_process: true, 12 | server_path: require('selenium-server').path, 13 | host: '127.0.0.1', 14 | port: 4444, 15 | cli_args: { 16 | 'webdriver.chrome.driver': require('chromedriver').path 17 | } 18 | }, 19 | 20 | test_settings: { 21 | default: { 22 | selenium_port: 4444, 23 | selenium_host: 'localhost', 24 | silent: true, 25 | globals: { 26 | devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) 27 | } 28 | }, 29 | 30 | chrome: { 31 | desiredCapabilities: { 32 | browserName: 'chrome', 33 | javascriptEnabled: true, 34 | acceptSslCerts: true 35 | } 36 | }, 37 | 38 | firefox: { 39 | desiredCapabilities: { 40 | browserName: 'firefox', 41 | javascriptEnabled: true, 42 | acceptSslCerts: true 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /test/e2e/runner.js: -------------------------------------------------------------------------------- 1 | // 1. start the dev server using production config 2 | process.env.NODE_ENV = 'testing' 3 | var server = require('../../build/dev-server.js') 4 | 5 | server.ready.then(() => { 6 | // 2. run the nightwatch test suite against it 7 | // to run in additional browsers: 8 | // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" 9 | // 2. add it to the --env flag below 10 | // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` 11 | // For more information on Nightwatch's config file, see 12 | // http://nightwatchjs.org/guide#settings-file 13 | var opts = process.argv.slice(2) 14 | if (opts.indexOf('--config') === -1) { 15 | opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) 16 | } 17 | if (opts.indexOf('--env') === -1) { 18 | opts = opts.concat(['--env', 'chrome']) 19 | } 20 | 21 | var spawn = require('cross-spawn') 22 | var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) 23 | 24 | runner.on('exit', function (code) { 25 | server.close() 26 | process.exit(code) 27 | }) 28 | 29 | runner.on('error', function (err) { 30 | server.close() 31 | throw err 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /test/e2e/specs/test.js: -------------------------------------------------------------------------------- 1 | // For authoring Nightwatch tests, see 2 | // http://nightwatchjs.org/guide#usage 3 | 4 | module.exports = { 5 | 'default e2e tests': function (browser) { 6 | // automatically uses dev Server port from /config.index.js 7 | // default: http://localhost:8080 8 | // see nightwatch.conf.js 9 | const devServer = browser.globals.devServerURL 10 | 11 | browser 12 | .url(devServer) 13 | .waitForElementVisible('#app', 5000) 14 | .assert.elementPresent('.hello') 15 | .assert.containsText('h1', 'Welcome to Your Vue.js App') 16 | .assert.elementCount('img', 1) 17 | .end() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "globals": { 6 | "expect": true, 7 | "sinon": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /test/unit/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | Vue.config.productionTip = false 4 | 5 | // require all test files (files that ends with .spec.js) 6 | const testsContext = require.context('./specs', true, /\.spec$/) 7 | testsContext.keys().forEach(testsContext) 8 | 9 | // require all src files except main.js for coverage. 10 | // you can also change this to match only the subset of files that 11 | // you want coverage for. 12 | const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) 13 | srcContext.keys().forEach(srcContext) 14 | -------------------------------------------------------------------------------- /test/unit/karma.conf.js: -------------------------------------------------------------------------------- 1 | // This is a karma config file. For more details see 2 | // http://karma-runner.github.io/0.13/config/configuration-file.html 3 | // we are also using it with karma-webpack 4 | // https://github.com/webpack/karma-webpack 5 | 6 | var webpackConfig = require('../../build/webpack.test.conf') 7 | 8 | module.exports = function (config) { 9 | config.set({ 10 | // to run in additional browsers: 11 | // 1. install corresponding karma launcher 12 | // http://karma-runner.github.io/0.13/config/browsers.html 13 | // 2. add it to the `browsers` array below. 14 | browsers: ['PhantomJS'], 15 | frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'], 16 | reporters: ['spec', 'coverage'], 17 | files: ['./index.js'], 18 | preprocessors: { 19 | './index.js': ['webpack', 'sourcemap'] 20 | }, 21 | webpack: webpackConfig, 22 | webpackMiddleware: { 23 | noInfo: true 24 | }, 25 | coverageReporter: { 26 | dir: './coverage', 27 | reporters: [ 28 | { type: 'lcov', subdir: '.' }, 29 | { type: 'text-summary' } 30 | ] 31 | } 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /test/unit/specs/Hello.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import HelloWorld from '@/components/HelloWorld' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(HelloWorld) 7 | const vm = new Constructor().$mount() 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .to.equal('Welcome to Your Vue.js App') 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /testDb/users.bson: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seven9115/vue-fullstack/1abc01ff510d37721e87c6da617941bcbfaa9cd2/testDb/users.bson -------------------------------------------------------------------------------- /testDb/users.metadata.json: -------------------------------------------------------------------------------- 1 | {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"testDb.users"}]} --------------------------------------------------------------------------------