├── .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 |
2 |
3 |
4 |
5 |
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?"':"")+'",!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 |
2 |
21 |
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 |
2 |
46 |
47 |
48 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/src/pages/admin/login/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/src/pages/home/index/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ![]()
7 |
8 |
9 |
12 |
13 |
14 |
15 |
16 | -
17 |
最新活动
18 | 热门活动,及时发现
19 |
20 |
21 |
22 | -
23 |
二维码
24 | 会员身份,快速入口
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
好课推荐
33 |
34 | 更多>
35 |
36 |
37 |
38 | -
39 |
40 |
41 |
![]()
42 |
43 | {{item.name}}
44 | ¥{{item.price}}
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
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"}]}
--------------------------------------------------------------------------------