commit
731e036a9e
52 changed files with 10880 additions and 0 deletions
Unified View
Diff Options
-
BIN.DS_Store
-
64README.md
-
35build/build.js
-
45build/check-versions.js
-
9build/dev-client.js
-
89build/dev-server.js
-
71build/utils.js
-
12build/vue-loader.conf.js
-
58build/webpack.base.conf.js
-
35build/webpack.dev.conf.js
-
120build/webpack.prod.conf.js
-
6config/dev.env.js
-
46config/index.js
-
3config/prod.env.js
-
12index.html
-
9288package-lock.json
-
67package.json
-
28src/App.vue
-
12src/api/coupon.js
-
BINsrc/assets/.DS_Store
-
BINsrc/assets/fonts/iconfont.eot
-
91src/assets/fonts/iconfont.svg
-
BINsrc/assets/fonts/iconfont.ttf
-
BINsrc/assets/fonts/iconfont.woff
-
45src/assets/iconfont.css
-
BINsrc/assets/images/arrow-right_03.png
-
BINsrc/assets/images/book.png
-
BINsrc/assets/images/coupon-bg-red@1x.png
-
BINsrc/assets/images/coupon-bg@1x.png
-
BINsrc/assets/images/cover.jpg
-
BINsrc/assets/images/forest.png
-
BINsrc/assets/images/get.png
-
BINsrc/assets/images/girl.jpg
-
BINsrc/assets/images/hill.png
-
BINsrc/assets/images/qrcode.png
-
BINsrc/assets/images/received.png
-
BINsrc/assets/images/slider-img.png
-
BINsrc/assets/images/sunrise.png
-
BINsrc/assets/images/sunshine.png
-
BINsrc/assets/logo.png
-
BINsrc/assets/logotxt.png
-
0src/assets/styles/main.scss
-
288src/assets/styles/style.css
-
6src/bus.js
-
62src/common/util.js
-
18src/configs.js
-
18src/configs.js.default
-
18src/main.js
-
20src/models/coupon-model.js
-
114src/models/utils-model.js
-
35src/router/index.js
-
165src/view/month-card.vue
@ -0,0 +1,64 @@ |
|||||
|
> 一个基于vue2.x编写的后台管理项目 |
||||
|
|
||||
|
## 介绍 |
||||
|
|
||||
|
### 本项目囊括以下技术和工具: |
||||
|
|
||||
|
- [Vue.js](https://cn.vuejs.org/v2/guide/) |
||||
|
- [Sass](https://www.sass.hk/) |
||||
|
- [Webpack](https://doc.webpack-china.org/) |
||||
|
- [Babel](http://babeljs.io/) |
||||
|
- [Element](http://element.eleme.io/#/zh-CN) |
||||
|
- [Axios](https://www.kancloud.cn/yunye/axios) |
||||
|
- [Vue-router](https://router.vuejs.org/zh-cn/installation.html) |
||||
|
|
||||
|
|
||||
|
### 说明 |
||||
|
|
||||
|
这是一个用vuejs2.0和element-ui 2.x搭建的后台管理界面。 |
||||
|
|
||||
|
### 项目结构 |
||||
|
``` |
||||
|
├── build #webpack编译相关文件目录,一般不用动 |
||||
|
├── config #配置目录 |
||||
|
│ ├────dev.env.js #开发环境变量 |
||||
|
│ ├────index.js #主配置文件 |
||||
|
│ └────prod.env.js #生产环境变量 |
||||
|
├── dist #生产环境下build后的文件存放目录(发布目录) |
||||
|
├── src #前端项目源码目录 |
||||
|
│ ├───—api #接口地址配置文件目录 |
||||
|
│ ├───—assets #资源目录 |
||||
|
│ ├───—common #公用方法文件目录 |
||||
|
│ ├───—components #组件文件目录 |
||||
|
│ ├───—router #路由目录 |
||||
|
│ ├───—view #页面文件目录 |
||||
|
│ ├───—App.vue #项目入口文件 |
||||
|
│ ├───—bus.js #公共通信组件 |
||||
|
│ ├───—configs.js #host地址配置文件 |
||||
|
│ └────main.js #项目的核心文件 |
||||
|
├── index.html #首页入口文件 |
||||
|
├── package.json #项目配置文件 |
||||
|
└── README.md #项目的说明文档,markdown 格式 |
||||
|
``` |
||||
|
|
||||
|
## 项目编译和运行 |
||||
|
|
||||
|
``` bash |
||||
|
(1)新开一个命令行窗口 |
||||
|
(2)定位到项目目录并安装依赖 |
||||
|
> npm install |
||||
|
(3)依赖安装成功后执行启动命令 |
||||
|
> npm run dev |
||||
|
# 显示如下内容说明本地启动成功 |
||||
|
# DONE Compiled successfully in 7515ms |
||||
|
# Listening at http://localhost:8081 |
||||
|
|
||||
|
|
||||
|
#正式环境编译命令 |
||||
|
# build for production with minification |
||||
|
npm run build |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,35 @@ |
|||||
|
require('./check-versions')() |
||||
|
|
||||
|
process.env.NODE_ENV = 'production' |
||||
|
|
||||
|
var ora = require('ora') |
||||
|
var rm = require('rimraf') |
||||
|
var path = require('path') |
||||
|
var chalk = require('chalk') |
||||
|
var webpack = require('webpack') |
||||
|
var config = require('../config') |
||||
|
var webpackConfig = require('./webpack.prod.conf') |
||||
|
|
||||
|
var spinner = ora('building for production...') |
||||
|
spinner.start() |
||||
|
|
||||
|
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { |
||||
|
if (err) throw err |
||||
|
webpack(webpackConfig, function (err, stats) { |
||||
|
spinner.stop() |
||||
|
if (err) throw err |
||||
|
process.stdout.write(stats.toString({ |
||||
|
colors: true, |
||||
|
modules: false, |
||||
|
children: false, |
||||
|
chunks: false, |
||||
|
chunkModules: false |
||||
|
}) + '\n\n') |
||||
|
|
||||
|
console.log(chalk.cyan(' Build complete.\n')) |
||||
|
console.log(chalk.yellow( |
||||
|
' Tip: built files are meant to be served over an HTTP server.\n' + |
||||
|
' Opening index.html over file:// won\'t work.\n' |
||||
|
)) |
||||
|
}) |
||||
|
}) |
||||
@ -0,0 +1,45 @@ |
|||||
|
var chalk = require('chalk') |
||||
|
var semver = require('semver') |
||||
|
var packageConfig = require('../package.json') |
||||
|
|
||||
|
function exec (cmd) { |
||||
|
return require('child_process').execSync(cmd).toString().trim() |
||||
|
} |
||||
|
|
||||
|
var versionRequirements = [ |
||||
|
{ |
||||
|
name: 'node', |
||||
|
currentVersion: semver.clean(process.version), |
||||
|
versionRequirement: packageConfig.engines.node |
||||
|
}, |
||||
|
{ |
||||
|
name: 'npm', |
||||
|
currentVersion: exec('npm --version'), |
||||
|
versionRequirement: packageConfig.engines.npm |
||||
|
} |
||||
|
] |
||||
|
|
||||
|
module.exports = function () { |
||||
|
var warnings = [] |
||||
|
for (let i = 0; i < versionRequirements.length; i++) { |
||||
|
var mod = versionRequirements[i] |
||||
|
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { |
||||
|
warnings.push(mod.name + ': ' + |
||||
|
chalk.red(mod.currentVersion) + ' should be ' + |
||||
|
chalk.green(mod.versionRequirement) |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (warnings.length) { |
||||
|
console.log('') |
||||
|
console.log(chalk.yellow('To use this template, you must update following to modules:')) |
||||
|
console.log() |
||||
|
for (let i = 0; i < warnings.length; i++) { |
||||
|
var warning = warnings[i] |
||||
|
console.log(' ' + warning) |
||||
|
} |
||||
|
console.log() |
||||
|
process.exit(1) |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
/* eslint-disable */ |
||||
|
require('eventsource-polyfill') |
||||
|
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') |
||||
|
|
||||
|
hotClient.subscribe(function (event) { |
||||
|
if (event.action === 'reload') { |
||||
|
window.location.reload() |
||||
|
} |
||||
|
}) |
||||
@ -0,0 +1,89 @@ |
|||||
|
require('./check-versions')() |
||||
|
|
||||
|
var config = require('../config') |
||||
|
if (!process.env.NODE_ENV) { |
||||
|
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) |
||||
|
} |
||||
|
|
||||
|
var opn = require('opn') |
||||
|
var path = require('path') |
||||
|
var express = require('express') |
||||
|
var webpack = require('webpack') |
||||
|
var proxyMiddleware = require('http-proxy-middleware') |
||||
|
var webpackConfig = require('./webpack.dev.conf') |
||||
|
|
||||
|
// default port where dev server listens for incoming traffic
|
||||
|
var port = process.env.PORT || config.dev.port |
||||
|
// automatically open browser, if not set will be false
|
||||
|
var autoOpenBrowser = !!config.dev.autoOpenBrowser |
||||
|
// Define HTTP proxies to your custom API backend
|
||||
|
// https://github.com/chimurai/http-proxy-middleware
|
||||
|
var proxyTable = config.dev.proxyTable |
||||
|
|
||||
|
var app = express() |
||||
|
var compiler = webpack(webpackConfig) |
||||
|
|
||||
|
var devMiddleware = require('webpack-dev-middleware')(compiler, { |
||||
|
publicPath: webpackConfig.output.publicPath, |
||||
|
quiet: true |
||||
|
}) |
||||
|
|
||||
|
var hotMiddleware = require('webpack-hot-middleware')(compiler, { |
||||
|
log: () => {} |
||||
|
}) |
||||
|
// force page reload when html-webpack-plugin template changes
|
||||
|
compiler.plugin('compilation', function (compilation) { |
||||
|
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { |
||||
|
hotMiddleware.publish({ action: 'reload' }) |
||||
|
cb() |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
// proxy api requests
|
||||
|
Object.keys(proxyTable).forEach(function (context) { |
||||
|
var options = proxyTable[context] |
||||
|
if (typeof options === 'string') { |
||||
|
options = { target: options } |
||||
|
} |
||||
|
app.use(proxyMiddleware(options.filter || context, options)) |
||||
|
}) |
||||
|
|
||||
|
// handle fallback for HTML5 history API
|
||||
|
app.use(require('connect-history-api-fallback')()) |
||||
|
|
||||
|
// serve webpack bundle output
|
||||
|
app.use(devMiddleware) |
||||
|
|
||||
|
// enable hot-reload and state-preserving
|
||||
|
// compilation error display
|
||||
|
app.use(hotMiddleware) |
||||
|
|
||||
|
// serve pure static assets
|
||||
|
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) |
||||
|
app.use(staticPath, express.static('./static')) |
||||
|
|
||||
|
var uri = 'http://localhost:' + port |
||||
|
|
||||
|
var _resolve |
||||
|
var readyPromise = new Promise(resolve => { |
||||
|
_resolve = resolve |
||||
|
}) |
||||
|
|
||||
|
console.log('> Starting dev server...') |
||||
|
devMiddleware.waitUntilValid(() => { |
||||
|
console.log('> Listening at ' + uri + '\n') |
||||
|
// when env is testing, don't need open it
|
||||
|
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { |
||||
|
opn(uri) |
||||
|
} |
||||
|
_resolve() |
||||
|
}) |
||||
|
|
||||
|
var server = app.listen(port) |
||||
|
|
||||
|
module.exports = { |
||||
|
ready: readyPromise, |
||||
|
close: () => { |
||||
|
server.close() |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,71 @@ |
|||||
|
var path = require('path') |
||||
|
var config = require('../config') |
||||
|
var ExtractTextPlugin = require('extract-text-webpack-plugin') |
||||
|
|
||||
|
exports.assetsPath = function (_path) { |
||||
|
var assetsSubDirectory = process.env.NODE_ENV === 'production' |
||||
|
? config.build.assetsSubDirectory |
||||
|
: config.dev.assetsSubDirectory |
||||
|
return path.posix.join(assetsSubDirectory, _path) |
||||
|
} |
||||
|
|
||||
|
exports.cssLoaders = function (options) { |
||||
|
options = options || {} |
||||
|
|
||||
|
var cssLoader = { |
||||
|
loader: 'css-loader', |
||||
|
options: { |
||||
|
minimize: process.env.NODE_ENV === 'production', |
||||
|
sourceMap: options.sourceMap |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// generate loader string to be used with extract text plugin
|
||||
|
function generateLoaders (loader, loaderOptions) { |
||||
|
var loaders = [cssLoader] |
||||
|
if (loader) { |
||||
|
loaders.push({ |
||||
|
loader: loader + '-loader', |
||||
|
options: Object.assign({}, loaderOptions, { |
||||
|
sourceMap: options.sourceMap |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// Extract CSS when that option is specified
|
||||
|
// (which is the case during production build)
|
||||
|
if (options.extract) { |
||||
|
return ExtractTextPlugin.extract({ |
||||
|
use: loaders, |
||||
|
fallback: 'vue-style-loader' |
||||
|
}) |
||||
|
} else { |
||||
|
return ['vue-style-loader'].concat(loaders) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
|
return { |
||||
|
css: generateLoaders(), |
||||
|
postcss: generateLoaders(), |
||||
|
less: generateLoaders('less'), |
||||
|
sass: generateLoaders('sass', { indentedSyntax: true }), |
||||
|
scss: generateLoaders('sass'), |
||||
|
stylus: generateLoaders('stylus'), |
||||
|
styl: generateLoaders('stylus') |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Generate loaders for standalone style files (outside of .vue)
|
||||
|
exports.styleLoaders = function (options) { |
||||
|
var output = [] |
||||
|
var loaders = exports.cssLoaders(options) |
||||
|
for (var extension in loaders) { |
||||
|
var loader = loaders[extension] |
||||
|
output.push({ |
||||
|
test: new RegExp('\\.' + extension + '$'), |
||||
|
use: loader |
||||
|
}) |
||||
|
} |
||||
|
return output |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
var utils = require('./utils') |
||||
|
var config = require('../config') |
||||
|
var isProduction = process.env.NODE_ENV === 'production' |
||||
|
|
||||
|
module.exports = { |
||||
|
loaders: utils.cssLoaders({ |
||||
|
sourceMap: isProduction |
||||
|
? config.build.productionSourceMap |
||||
|
: config.dev.cssSourceMap, |
||||
|
extract: isProduction |
||||
|
}) |
||||
|
} |
||||
@ -0,0 +1,58 @@ |
|||||
|
var path = require('path') |
||||
|
var utils = require('./utils') |
||||
|
var config = require('../config') |
||||
|
var vueLoaderConfig = require('./vue-loader.conf') |
||||
|
|
||||
|
function resolve (dir) { |
||||
|
return path.join(__dirname, '..', dir) |
||||
|
} |
||||
|
|
||||
|
module.exports = { |
||||
|
entry: { |
||||
|
app: './src/main.js' |
||||
|
}, |
||||
|
output: { |
||||
|
path: config.build.assetsRoot, |
||||
|
filename: '[name].js', |
||||
|
publicPath: process.env.NODE_ENV === 'production' |
||||
|
? config.build.assetsPublicPath |
||||
|
: config.dev.assetsPublicPath |
||||
|
}, |
||||
|
resolve: { |
||||
|
extensions: ['.js', '.vue', '.json'], |
||||
|
alias: { |
||||
|
'vue$': 'vue/dist/vue.esm.js', |
||||
|
'@': resolve('src') |
||||
|
} |
||||
|
}, |
||||
|
module: { |
||||
|
rules: [ |
||||
|
{ |
||||
|
test: /\.vue$/, |
||||
|
loader: 'vue-loader', |
||||
|
options: vueLoaderConfig |
||||
|
}, |
||||
|
{ |
||||
|
test: /\.js$/, |
||||
|
loader: 'babel-loader', |
||||
|
include: [resolve('src'), resolve('test')] |
||||
|
}, |
||||
|
{ |
||||
|
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, |
||||
|
loader: 'url-loader', |
||||
|
options: { |
||||
|
limit: 10000, |
||||
|
name: utils.assetsPath('img/[name].[hash:7].[ext]') |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, |
||||
|
loader: 'url-loader', |
||||
|
options: { |
||||
|
limit: 10000, |
||||
|
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
var utils = require('./utils') |
||||
|
var webpack = require('webpack') |
||||
|
var config = require('../config') |
||||
|
var merge = require('webpack-merge') |
||||
|
var baseWebpackConfig = require('./webpack.base.conf') |
||||
|
var HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
|
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') |
||||
|
|
||||
|
// add hot-reload related code to entry chunks
|
||||
|
Object.keys(baseWebpackConfig.entry).forEach(function (name) { |
||||
|
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) |
||||
|
}) |
||||
|
|
||||
|
module.exports = merge(baseWebpackConfig, { |
||||
|
module: { |
||||
|
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) |
||||
|
}, |
||||
|
// cheap-module-eval-source-map is faster for development
|
||||
|
devtool: '#cheap-module-eval-source-map', |
||||
|
plugins: [ |
||||
|
new webpack.DefinePlugin({ |
||||
|
'process.env': config.dev.env |
||||
|
}), |
||||
|
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
|
||||
|
new webpack.HotModuleReplacementPlugin(), |
||||
|
new webpack.NoEmitOnErrorsPlugin(), |
||||
|
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
|
new HtmlWebpackPlugin({ |
||||
|
filename: 'index.html', |
||||
|
template: 'index.html', |
||||
|
inject: true |
||||
|
}), |
||||
|
new FriendlyErrorsPlugin() |
||||
|
] |
||||
|
}) |
||||
@ -0,0 +1,120 @@ |
|||||
|
var path = require('path') |
||||
|
var utils = require('./utils') |
||||
|
var webpack = require('webpack') |
||||
|
var config = require('../config') |
||||
|
var merge = require('webpack-merge') |
||||
|
var baseWebpackConfig = require('./webpack.base.conf') |
||||
|
var CopyWebpackPlugin = require('copy-webpack-plugin') |
||||
|
var HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
|
var ExtractTextPlugin = require('extract-text-webpack-plugin') |
||||
|
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') |
||||
|
|
||||
|
var env = config.build.env |
||||
|
|
||||
|
var webpackConfig = merge(baseWebpackConfig, { |
||||
|
module: { |
||||
|
rules: utils.styleLoaders({ |
||||
|
sourceMap: config.build.productionSourceMap, |
||||
|
extract: true |
||||
|
}) |
||||
|
}, |
||||
|
devtool: config.build.productionSourceMap ? '#source-map' : false, |
||||
|
output: { |
||||
|
path: config.build.assetsRoot, |
||||
|
filename: utils.assetsPath('js/[name].[chunkhash].js'), |
||||
|
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') |
||||
|
}, |
||||
|
plugins: [ |
||||
|
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
|
new webpack.DefinePlugin({ |
||||
|
'process.env': env |
||||
|
}), |
||||
|
new webpack.optimize.UglifyJsPlugin({ |
||||
|
compress: { |
||||
|
warnings: false |
||||
|
}, |
||||
|
sourceMap: true |
||||
|
}), |
||||
|
// extract css into its own file
|
||||
|
new ExtractTextPlugin({ |
||||
|
filename: utils.assetsPath('css/[name].[contenthash].css') |
||||
|
}), |
||||
|
// Compress extracted CSS. We are using this plugin so that possible
|
||||
|
// duplicated CSS from different components can be deduped.
|
||||
|
new OptimizeCSSPlugin({ |
||||
|
cssProcessorOptions: { |
||||
|
safe: true |
||||
|
} |
||||
|
}), |
||||
|
// generate dist index.html with correct asset hash for caching.
|
||||
|
// you can customize output by editing /index.html
|
||||
|
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
|
new HtmlWebpackPlugin({ |
||||
|
filename: config.build.index, |
||||
|
template: 'index.html', |
||||
|
inject: true, |
||||
|
minify: { |
||||
|
removeComments: true, |
||||
|
collapseWhitespace: true, |
||||
|
removeAttributeQuotes: true |
||||
|
// more options:
|
||||
|
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
|
}, |
||||
|
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||
|
chunksSortMode: 'dependency' |
||||
|
}), |
||||
|
// split vendor js into its own file
|
||||
|
new webpack.optimize.CommonsChunkPlugin({ |
||||
|
name: 'vendor', |
||||
|
minChunks: function (module, count) { |
||||
|
// any required modules inside node_modules are extracted to vendor
|
||||
|
return ( |
||||
|
module.resource && |
||||
|
/\.js$/.test(module.resource) && |
||||
|
module.resource.indexOf( |
||||
|
path.join(__dirname, '../node_modules') |
||||
|
) === 0 |
||||
|
) |
||||
|
} |
||||
|
}), |
||||
|
// extract webpack runtime and module manifest to its own file in order to
|
||||
|
// prevent vendor hash from being updated whenever app bundle is updated
|
||||
|
new webpack.optimize.CommonsChunkPlugin({ |
||||
|
name: 'manifest', |
||||
|
chunks: ['vendor'] |
||||
|
}), |
||||
|
// copy custom static assets
|
||||
|
new CopyWebpackPlugin([ |
||||
|
{ |
||||
|
from: path.resolve(__dirname, '../static'), |
||||
|
to: config.build.assetsSubDirectory, |
||||
|
ignore: ['.*'] |
||||
|
} |
||||
|
]) |
||||
|
] |
||||
|
}) |
||||
|
|
||||
|
if (config.build.productionGzip) { |
||||
|
var CompressionWebpackPlugin = require('compression-webpack-plugin') |
||||
|
|
||||
|
webpackConfig.plugins.push( |
||||
|
new CompressionWebpackPlugin({ |
||||
|
asset: '[path].gz[query]', |
||||
|
algorithm: 'gzip', |
||||
|
test: new RegExp( |
||||
|
'\\.(' + |
||||
|
config.build.productionGzipExtensions.join('|') + |
||||
|
')$' |
||||
|
), |
||||
|
threshold: 10240, |
||||
|
minRatio: 0.8 |
||||
|
}) |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
if (config.build.bundleAnalyzerReport) { |
||||
|
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin |
||||
|
webpackConfig.plugins.push(new BundleAnalyzerPlugin()) |
||||
|
} |
||||
|
|
||||
|
module.exports = webpackConfig |
||||
@ -0,0 +1,6 @@ |
|||||
|
var merge = require('webpack-merge') |
||||
|
var prodEnv = require('./prod.env') |
||||
|
|
||||
|
module.exports = merge(prodEnv, { |
||||
|
NODE_ENV: '"development"' |
||||
|
}) |
||||
@ -0,0 +1,46 @@ |
|||||
|
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
|
var path = require('path') |
||||
|
|
||||
|
module.exports = { |
||||
|
build: { |
||||
|
env: require('./prod.env'), |
||||
|
index: path.resolve(__dirname, '../dist/index.html'), |
||||
|
assetsRoot: path.resolve(__dirname, '../dist'), |
||||
|
assetsSubDirectory: 'static', |
||||
|
assetsPublicPath: '/', |
||||
|
productionSourceMap: true, |
||||
|
// Gzip off by default as many popular static hosts such as
|
||||
|
// Surge or Netlify already gzip all static assets for you.
|
||||
|
// Before setting to `true`, make sure to:
|
||||
|
// npm install --save-dev compression-webpack-plugin
|
||||
|
productionGzip: false, |
||||
|
productionGzipExtensions: ['js', 'css'], |
||||
|
// Run the build command with an extra argument to
|
||||
|
// View the bundle analyzer report after build finishes:
|
||||
|
// `npm run build --report`
|
||||
|
// Set to `true` or `false` to always turn it on or off
|
||||
|
bundleAnalyzerReport: process.env.npm_config_report |
||||
|
}, |
||||
|
dev: { |
||||
|
env: require('./dev.env'), |
||||
|
port: 8080, |
||||
|
autoOpenBrowser: true, |
||||
|
assetsSubDirectory: 'static', |
||||
|
assetsPublicPath: '/', |
||||
|
proxyTable: { |
||||
|
// '/api': {
|
||||
|
// target: 'http://localhost:3000',
|
||||
|
// changeOrigin: true,
|
||||
|
// pathRewrite: {
|
||||
|
// '^/api': '/api'
|
||||
|
// }
|
||||
|
// }
|
||||
|
}, |
||||
|
// CSS Sourcemaps off by default because relative paths are "buggy"
|
||||
|
// with this option, according to the CSS-Loader README
|
||||
|
// (https://github.com/webpack/css-loader#sourcemaps)
|
||||
|
// In our experience, they generally work as expected,
|
||||
|
// just be aware of this issue when enabling this option.
|
||||
|
cssSourceMap: false |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,3 @@ |
|||||
|
module.exports = { |
||||
|
NODE_ENV: '"production"' |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> |
||||
|
<title>一号家政</title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="app"></div> |
||||
|
<!-- built files will be auto injected --> |
||||
|
</body> |
||||
|
</html> |
||||
9288
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,67 @@ |
|||||
|
{ |
||||
|
"name": "litadmin", |
||||
|
"version": "1.2.0", |
||||
|
"description": "A Vue.js project for admin", |
||||
|
"author": "jerry9022@qq.com", |
||||
|
"private": true, |
||||
|
"scripts": { |
||||
|
"server": "node server/bin/www", |
||||
|
"dev": "node build/dev-server.js", |
||||
|
"build": "node build/build.js" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"axios": "^0.16.2", |
||||
|
"echarts": "^3.7.1", |
||||
|
"element-ui": "^2.0.7", |
||||
|
"lodash": "^4.17.4", |
||||
|
"vue": "^2.5.9", |
||||
|
"vue-router": "^2.8.1", |
||||
|
"vue-template-compiler": "^2.5.9" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"autoprefixer": "^6.7.2", |
||||
|
"babel-core": "^6.26.0", |
||||
|
"babel-loader": "^6.2.10", |
||||
|
"babel-plugin-transform-runtime": "^6.22.0", |
||||
|
"babel-preset-env": "^1.6.0", |
||||
|
"babel-preset-stage-2": "^6.24.1", |
||||
|
"babel-register": "^6.26.0", |
||||
|
"chalk": "^1.1.3", |
||||
|
"connect-history-api-fallback": "^1.3.0", |
||||
|
"copy-webpack-plugin": "^4.0.1", |
||||
|
"css-loader": "^0.26.4", |
||||
|
"eventsource-polyfill": "^0.9.6", |
||||
|
"express": "^4.15.4", |
||||
|
"extract-text-webpack-plugin": "^2.1.2", |
||||
|
"file-loader": "^0.10.0", |
||||
|
"friendly-errors-webpack-plugin": "^1.1.3", |
||||
|
"function-bind": "^1.1.1", |
||||
|
"html-webpack-plugin": "^2.30.1", |
||||
|
"http-proxy-middleware": "^0.17.3", |
||||
|
"node-sass": "^4.9.0", |
||||
|
"opn": "^4.0.2", |
||||
|
"optimize-css-assets-webpack-plugin": "^1.3.2", |
||||
|
"ora": "^1.3.0", |
||||
|
"rimraf": "^2.6.2", |
||||
|
"sass-loader": "^6.0.6", |
||||
|
"semver": "^5.4.1", |
||||
|
"style-loader": "^0.16.1", |
||||
|
"url-loader": "^0.5.9", |
||||
|
"vue-loader": "^11.1.4", |
||||
|
"vue-style-loader": "^2.0.0", |
||||
|
"webpack": "^2.7.0", |
||||
|
"webpack-bundle-analyzer": "^2.9.0", |
||||
|
"webpack-dev-middleware": "^1.12.0", |
||||
|
"webpack-hot-middleware": "^2.19.1", |
||||
|
"webpack-merge": "^2.6.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 4.0.0", |
||||
|
"npm": ">= 3.0.0" |
||||
|
}, |
||||
|
"browserslist": [ |
||||
|
"> 1%", |
||||
|
"last 2 versions", |
||||
|
"not ie <= 8" |
||||
|
] |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<template> |
||||
|
<div id="app"> |
||||
|
<router-view></router-view> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'app' |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
body{ |
||||
|
padding:0px; |
||||
|
margin:0px auto; |
||||
|
} |
||||
|
a{ |
||||
|
text-decoration:none; |
||||
|
} |
||||
|
#app { |
||||
|
font-family: 'Avenir', Helvetica, Arial, sans-serif; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
text-align: left; |
||||
|
color: #2c3e50; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,12 @@ |
|||||
|
export default { |
||||
|
// -- 领取优惠券 --
|
||||
|
giveCoupon: { |
||||
|
method: 'PUT', |
||||
|
url: '/mall/web/coupon/receive', |
||||
|
}, |
||||
|
// -- 获取优惠券信息 --
|
||||
|
getCouponInfo: { |
||||
|
method: 'GET', |
||||
|
url: '/mall/web/coupon/:batchNo', |
||||
|
}, |
||||
|
} |
||||
@ -0,0 +1,91 @@ |
|||||
|
<?xml version="1.0" standalone="no"?> |
||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
||||
|
<svg xmlns="http://www.w3.org/2000/svg"> |
||||
|
<metadata> |
||||
|
Created by FontForge 20120731 at Fri Apr 14 10:37:19 2017 |
||||
|
By admin |
||||
|
</metadata> |
||||
|
<defs> |
||||
|
<font id="iconfont" horiz-adv-x="1024" > |
||||
|
<font-face |
||||
|
font-family="iconfont" |
||||
|
font-weight="500" |
||||
|
font-stretch="normal" |
||||
|
units-per-em="1024" |
||||
|
panose-1="2 0 6 3 0 0 0 0 0 0" |
||||
|
ascent="896" |
||||
|
descent="-128" |
||||
|
x-height="792" |
||||
|
bbox="0 -212 1099.6 896" |
||||
|
underline-thickness="0" |
||||
|
underline-position="0" |
||||
|
unicode-range="U+0078-EACD" |
||||
|
/> |
||||
|
<missing-glyph |
||||
|
/> |
||||
|
<glyph glyph-name=".notdef" |
||||
|
/> |
||||
|
<glyph glyph-name=".notdef" |
||||
|
/> |
||||
|
<glyph glyph-name=".null" horiz-adv-x="0" |
||||
|
/> |
||||
|
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" |
||||
|
/> |
||||
|
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001" |
||||
|
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 |
||||
|
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 |
||||
|
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> |
||||
|
<glyph glyph-name="user" unicode="" |
||||
|
d="M639 256q59 35 94 96t35 133q0 110 -76.5 187.5t-185 77.5t-185 -77.5t-76.5 -187.5q0 -73 36.5 -135t96.5 -96q-120 -40 -199.5 -139t-91.5 -228q-1 -14 8 -25t23.5 -12.5t25.5 7.5t12 24q13 139 115 232t241.5 93t241.5 -93t114 -232q2 -14 12 -23t23 -9h3 |
||||
|
q14 2 23.5 13t7.5 25q-11 132 -93 232t-205 137zM314 485q0 81 56.5 138.5t136 57.5t136 -57.5t56.5 -138.5t-56.5 -138.5t-136 -57.5t-136 57.5t-56.5 138.5z" /> |
||||
|
<glyph glyph-name="home1" unicode="" |
||||
|
d="M950 375l-415 416q-5 4 -12 7q-19 8 -35 -7l-415 -416q-10 -9 -10 -22.5t9.5 -23t23 -9.5t22.5 10l393 393l394 -393q9 -10 22.5 -10t22.5 9.5t9 23t-9 22.5zM770 362q-13 0 -22.5 -9.5t-9.5 -22.5v-266h-453v266q0 13 -9.5 22.5t-23 9.5t-22.5 -9.5t-9 -22.5v-298 |
||||
|
q0 -12 8.5 -21.5t21.5 -9.5q1 -1 2 -1h517q1 0 2 1h4q8 2 14 6q1 2 2 3h1q1 2 2 3h1q2 3 3 7l0.5 0.5l0.5 0.5v1t1 2v2v0q1 3 1 6v298q0 13 -9.5 22.5t-22.5 9.5z" /> |
||||
|
<glyph glyph-name="home" unicode="" |
||||
|
d="M979 345l-435 435v0q-13 13 -32 13t-32 -13v0l-435 -435q-18 -18 -18 -45t18 -45v0q19 -19 46 -19h37v-288q0 -4 0.5 -10.5t6 -23t14.5 -29t28.5 -23t46.5 -10.5h128q18 0 31 6.5t19 16t9.5 19t4.5 16.5v6v256h96h96v-256q0 -2 0.5 -6.5t4 -15.5t9.5 -19.5t19 -15.5 |
||||
|
t31 -7h128q27 0 46.5 10t28.5 24t14.5 28t6.5 24v10v288h37q27 0 46 19v0q18 18 18 45t-18 45z" /> |
||||
|
<glyph glyph-name="setting1" unicode="" |
||||
|
d="M892 402q-14 50 -39 95l74 112l-106 106l-112 -74q-45 25 -95 39l-27 132h-150l-27 -132q-50 -13 -95 -39l-112 74l-106 -106l74 -112q-25 -45 -39 -95l-132 -27v-150l132 -27q14 -50 39 -95l-74 -112l106 -106l112 74q45 -26 95 -39l27 -132h150l27 132q50 13 95 39 |
||||
|
l112 -74l106 106l-74 112q25 45 39 95l132 27v150l-132 27v0zM690 300q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126z" /> |
||||
|
<glyph glyph-name="setting" unicode="" |
||||
|
d="M896 389l-82 16q-6 17 -14 34l46 70q11 16 9 35t-16 32l-51 51q-11 11 -25 14t-24.5 0.5t-17.5 -7.5l-70 -46q-17 8 -34 14l-16 82q-4 18 -19 30.5t-34 12.5h-72q-19 0 -34 -12.5t-19 -30.5l-16 -82q-17 -6 -34 -14l-70 46q-7 5 -17.5 7.5t-24.5 -0.5t-25 -14l-51 -51 |
||||
|
q-14 -13 -16 -32t9 -35l46 -70q-8 -17 -14 -34l-82 -16q-18 -4 -30.5 -19t-12.5 -34v-72q0 -19 12.5 -34t30.5 -19l82 -16q6 -17 14 -34l-46 -70q-11 -16 -9 -35t16 -32l51 -51q16 -16 38 -16q16 0 29 9l70 46q17 -8 34 -14l16 -82q4 -18 19 -30.5t34 -12.5h72q19 0 34 12.5 |
||||
|
t19 30.5l16 82q17 6 34 14l70 -46q7 -5 17.5 -7.5t24.5 0.5t25 14l51 51q14 13 16 32t-9 35l-46 70q8 17 14 34l82 16q18 4 30.5 19t12.5 34v72q0 19 -12.5 34t-30.5 19zM511 99q-84 0 -143.5 59.5t-59.5 143.5t59.5 143.5t143.5 59.5t143.5 -59.5t59.5 -143.5t-59.5 -143.5 |
||||
|
t-143.5 -59.5zM512 300zM405 300q0 44 31.5 75.5t75.5 31.5t75.5 -31.5t31.5 -75.5t-31.5 -75.5t-75.5 -31.5t-75.5 31.5t-31.5 75.5z" /> |
||||
|
<glyph glyph-name="down" unicode="" |
||||
|
d="M240 464l268 -289l268 289h-536z" /> |
||||
|
<glyph glyph-name="books1" unicode="" |
||||
|
d="M979 224l-422 -224q-423 83 -461 96q-18 6 -27 19.5t-8 25t3 19.5q0 11 16 27t29 11q8 -2 122 -28t223 -50l109 -24l442 237l2 2t3.5 5.5t4 9t1 10.5t-4.5 11q-3 12 -11 15t-14 0l-7 -2l-422 -218q-442 96 -467 103q-32 8 -32 57q0 19 22 31.5t42 7.5q25 -7 441 -103v0 |
||||
|
l442 237q1 1 2 2.5t3.5 5.5t4 8.5t1 10.5t-4.5 12q-5 8 -15 9.5t-16 -0.5l-7 -3l-416 -211q-435 96 -461 102q-22 5 -30 23t-2 35t25 28.5t45 3.5q12 -2 120.5 -25t206 -42t102.5 -16q13 6 442 236q2 9 0 16t-6.5 10t-8.5 4.5t-8 1.5h-3q-346 58 -416 71q-31 5 -52 5t-26 -2 |
||||
|
l-5 -3l-384 -199q-2 0 -6 -1t-15.5 -5.5t-21.5 -12t-21.5 -23t-18.5 -34.5q-10 -21 -6 -40t12.5 -31.5t17 -23.5t8.5 -14q0 -2 -8.5 -7.5t-18 -20t-12.5 -36.5q-1 -22 2.5 -39.5t10.5 -28t13.5 -18t10 -11.5t2.5 -6q0 -1 -7 -4t-16.5 -17t-15.5 -43q-11 -71 48 -109l10 -6 |
||||
|
l499 -115l442 250q1 0 2 1.5t3.5 5.5t4 8t1 8.5t-4.5 8.5q-5 8 -13 9.5t-14 -0.5zM518 730l269 -52l-128 -70l-256 58z" /> |
||||
|
<glyph glyph-name="leaf" unicode="" |
||||
|
d="M517 714h7q54 -106 61 -120q7 -12 14 -14t19 3q7 3 19 9.5t16 8.5q10 6 13 4q2 -1 2.5 -3t0.5 -3.5t-1 -4.5t-1 -4q-9 -50 -29 -161q-4 -20 -2 -31q3 -19 17 -8q7 5 18 17q33 38 63 74q11 13 15 -4q0 -1 6 -23q5 -17 11 -20.5t22 -0.5q46 10 77 17q10 2 13 -1t0 -13 |
||||
|
q-5 -21 -22 -84q-7 -27 -4 -33t28 -19q13 -7 13.5 -10.5t-11.5 -13.5q-9 -8 -58 -49.5t-76 -63.5q-4 -4 -11 -10q-24 -20 -26.5 -27t4.5 -32q4 -11 6 -18q3 -13 1 -16t-16 -1q-96 11 -153 18q-19 2 -19 -17v-20q0 -27 3 -167h-33q-1 20 -1 21q1 20 3.5 76t3.5 87 |
||||
|
q0 14 -4 17.5t-19 1.5q-110 -12 -154 -18q-10 -1 -12.5 2.5t0.5 12.5q0 1 3 11t5 15q10 27 -14 46q-49 40 -146 124q-4 3 -10 8t-7.5 5.5t-3 4t-0.5 4t4 3.5t7.5 5t12.5 6q16 8 18.5 13.5t-1.5 22.5q-4 15 -12 45.5t-12 46.5q-3 14 -1 16.5t16 -0.5q3 -1 70 -15 |
||||
|
q20 -4 26 -0.5t12 22.5q4 15 4 16q1 1 1.5 5t2 6.5t4.5 3.5q3 0 4.5 -1.5t4 -5t3.5 -3.5q4 -5 27.5 -32t35.5 -42q1 -1 4 -4.5t4.5 -5.5t5 -4.5t5.5 -1.5t7 2q3 1 5 3.5t2.5 6.5t0 6t-1.5 7t-1 7q-6 32 -16.5 91.5t-14.5 82.5q-2 10 1 12q2 2 10.5 -2t22.5 -11.5t17 -8.5 |
||||
|
q20 -10 29 8q58 113 62 123zM379 605z" /> |
||||
|
<glyph glyph-name="users1" unicode="" |
||||
|
d="M384.5 765q79.5 0 135.5 -56t56 -135.5t-56 -135.5t-135.5 -56t-135.5 56t-56 135.5t56 135.5t135.5 56zM384 829q-105 0 -180 -75t-75 -180.5t75 -180.5t180.5 -75t180.5 75t75 180.5t-75 180.5t-181 75v0zM384.5 318q64.5 0 124.5 -25q57 -24 101 -68t68 -101 |
||||
|
q25 -60 25 -124q0 -27 -18.5 -45.5t-44.5 -18.5h-511q-26 0 -44.5 18.5t-18.5 45.5q0 64 25 124q24 57 68 101t101 68q60 25 124.5 25zM384 382q-104 0 -192 -51t-139 -139t-51 -192q0 -53 37.5 -90.5t89.5 -37.5h511q52 0 89.5 37.5t37.5 90.5q0 104 -51 192t-139.5 139 |
||||
|
t-192.5 51v0zM775 425q55 34 87.5 91.5t32.5 124.5q0 106 -75 180.5t-180 74.5q-87 0 -156 -53q34 -13 64 -34q43 23 92 23q79 0 135 -56t56 -135t-56 -135q-55 -55 -132 -56q-17 -36 -44 -67q20 3 41 3q64 0 124 -25q57 -24 101 -68.5t68 -101.5q25 -59 25 -124 |
||||
|
q0 -26 -18.5 -45t-44.5 -19h-96v-3q0 -32 -12 -61h108q52 0 89.5 37.5t37.5 90.5q0 121 -68.5 218.5t-178.5 139.5z" /> |
||||
|
<glyph glyph-name="menuunfold" unicode="" |
||||
|
d="M991 703h-959q-13 0 -22.5 9.5t-9.5 22.5v0q0 13 9.5 22.5t22.5 9.5h959q13 0 22.5 -9.5t9.5 -22.5v0q0 -13 -9.5 -22.5t-22.5 -9.5zM672 385h-640q-13 0 -22.5 9.5t-9.5 22.5v0q0 14 9.5 23t22.5 9h640q13 0 22.5 -9t9.5 -23v0q0 -13 -9.5 -22.5t-22.5 -9.5zM991 65 |
||||
|
h-959q-13 0 -22.5 9.5t-9.5 22.5v0q0 13 9.5 22.5t22.5 9.5h959q13 0 22.5 -9.5t9.5 -22.5v0q0 -13 -9.5 -22.5t-22.5 -9.5zM832 318v263q0 7 6.5 10t11.5 -1l170 -132q4 -3 4 -8.5t-4 -9.5l-170 -131q-5 -4 -11.5 -1t-6.5 10z" /> |
||||
|
<glyph glyph-name="menufold" unicode="" |
||||
|
d="M1 735v0q0 13 9.5 22.5t22.5 9.5h959q13 0 22.5 -9.5t9.5 -22.5v0q0 -13 -9.5 -22.5t-22.5 -9.5h-959q-13 0 -22.5 9.5t-9.5 22.5zM320 417v0q0 14 9.5 23t22.5 9h640q13 0 22.5 -9t9.5 -23v0q0 -13 -9.5 -22.5t-22.5 -9.5h-640q-13 0 -22.5 9.5t-9.5 22.5zM1 97v0 |
||||
|
q0 13 9.5 22.5t22.5 9.5h959q13 0 22.5 -9.5t9.5 -22.5v0q0 -13 -9.5 -22.5t-22.5 -9.5h-959q-13 0 -22.5 9.5t-9.5 22.5zM174 309l-170 131q-4 4 -4 9.5t4 8.5l170 132q5 4 11.5 1t6.5 -10v-264q0 -6 -6.5 -9t-11.5 1z" /> |
||||
|
<glyph glyph-name="books" unicode="" horiz-adv-x="1152" |
||||
|
d="M224 768h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5zM192 576h-128v64h128v-64zM544 768h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5 |
||||
|
t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5zM512 576h-128v64h128v-64zM765 719l-171 -87q-12 -6 -16 -18.5t1 -24.5l288 -571q6 -12 19 -16.5t24 1.5l172 87q12 6 16 18.5t-2 24.5l-288 571q-6 12 -18.5 16t-24.5 -1zM928 32q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5 |
||||
|
t9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5z" /> |
||||
|
<glyph glyph-name="users" unicode="" horiz-adv-x="1098" |
||||
|
d="M339 384q-93 -3 -152 -73h-76q-47 0 -79 23t-32 68q0 201 71 201q3 0 24.5 -12t56 -24t67.5 -12q39 0 76 13q-2 -21 -2 -38q0 -79 46 -146zM951 20q0 -69 -42 -108.5t-111 -39.5h-499q-69 0 -111 39.5t-42 108.5q0 30 2 59t8 62.5t15.5 62t24.5 55.5t35 46.5t49 30.5 |
||||
|
t64 11q6 0 24.5 -12t41.5 -27t61.5 -27.5t77 -12.5t77 12.5t61.5 27.5t41.5 27t24.5 12q35 0 64 -11t49 -30.5t35.5 -46.5t24.5 -55.5t15 -62t8 -62.5t2 -59zM366 749.5q0 -60.5 -43 -103.5t-103.5 -43t-103.5 43t-43 103.5t43 103.5t103.5 43t103.5 -43t43 -103.5zM768 530 |
||||
|
q0 -91 -64.5 -155t-155 -64t-155 64t-64.5 155t64.5 155.5t155 64.5t155 -64.5t64.5 -155.5zM1097 402q0 -45 -32 -68t-79 -23h-76q-59 70 -152 73q47 67 47 146q0 17 -3 38q37 -13 76 -13q33 0 67.5 12t56 24t24.5 12q71 0 71 -201zM1024 749.5q0 -60.5 -43 -103.5 |
||||
|
t-103.5 -43t-103.5 43t-43 103.5t43 103.5t103.5 43t103.5 -43t43 -103.5z" /> |
||||
|
<glyph glyph-name="books2" unicode="" |
||||
|
d="M454 832l-300 -94q-39 -8 -64 -39t-25 -71v-487q0 -40 25 -71t64 -39l300 -94v895zM233 274v223h55v-223h-55zM680 49v672h109q2 0 2 -2v-669q0 -1 -2 -1h-109zM512 -6v782h110v-1v-781v0h-110zM847 105v558h111q1 0 1 -1v-555q0 -2 -2 -2h-110z" /> |
||||
|
</font> |
||||
|
</defs></svg> |
||||
@ -0,0 +1,45 @@ |
|||||
|
|
||||
|
@font-face {font-family: "iconfont"; |
||||
|
src: url('fonts/iconfont.eot?t=1492137439402'); /* IE9*/ |
||||
|
src: url('fonts/iconfont.eot?t=1492137439402#iefix') format('embedded-opentype'), /* IE6-IE8 */ |
||||
|
url('fonts/iconfont.woff?t=1492137439402') format('woff'), /* chrome, firefox */ |
||||
|
url('fonts/iconfont.ttf?t=1492137439402') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ |
||||
|
url('fonts/iconfont.svg?t=1492137439402#iconfont') format('svg'); /* iOS 4.1- */ |
||||
|
} |
||||
|
|
||||
|
.iconfont { |
||||
|
font-family:"iconfont" !important; |
||||
|
font-size:16px; |
||||
|
font-style:normal; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
} |
||||
|
|
||||
|
.icon-user:before { content: "\e600"; } |
||||
|
|
||||
|
.icon-home1:before { content: "\e635"; } |
||||
|
|
||||
|
.icon-home:before { content: "\e6a1"; } |
||||
|
|
||||
|
.icon-setting1:before { content: "\e601"; } |
||||
|
|
||||
|
.icon-setting:before { content: "\e664"; } |
||||
|
|
||||
|
.icon-down:before { content: "\e623"; } |
||||
|
|
||||
|
.icon-books1:before { content: "\e67f"; } |
||||
|
|
||||
|
.icon-leaf:before { content: "\e645"; } |
||||
|
|
||||
|
.icon-users1:before { content: "\e65a"; } |
||||
|
|
||||
|
.icon-menuunfold:before { content: "\eacc"; } |
||||
|
|
||||
|
.icon-menufold:before { content: "\eacd"; } |
||||
|
|
||||
|
.icon-books:before { content: "\e605"; } |
||||
|
|
||||
|
.icon-users:before { content: "\e883"; } |
||||
|
|
||||
|
.icon-books2:before { content: "\e7b9"; } |
||||
|
|
||||
@ -0,0 +1,288 @@ |
|||||
|
* { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
} |
||||
|
.m-page { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
/*月卡详情*/ |
||||
|
.m-month-card { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
background-color: #FFF3E8; |
||||
|
} |
||||
|
.m-slider { |
||||
|
height: 175px; |
||||
|
} |
||||
|
.m-slider img { |
||||
|
object-fit: cover; |
||||
|
} |
||||
|
.month-card-title { |
||||
|
background-color: #fff; |
||||
|
padding-bottom: 52px; |
||||
|
padding-top: 10px; |
||||
|
} |
||||
|
.month-card-title h4 { |
||||
|
font-size: 19px; |
||||
|
color: #232323 !important; |
||||
|
line-height: 21px; |
||||
|
} |
||||
|
.month-card-title p { |
||||
|
font-size: 14px; |
||||
|
color: #666; |
||||
|
line-height: 16px; |
||||
|
} |
||||
|
.month-card-title .f-price { |
||||
|
font-size: 15px; |
||||
|
line-height: 17px; |
||||
|
color: #333; |
||||
|
} |
||||
|
.month-card-area { |
||||
|
position: relative; |
||||
|
height: 100%; |
||||
|
background-color: #FFF3E8; |
||||
|
padding-left:15px; |
||||
|
} |
||||
|
.month-card { |
||||
|
position: relative; |
||||
|
top: -40px; |
||||
|
padding: 5px 10px 10px 0; |
||||
|
background: url(../images/coupon-bg-red@1x.png) no-repeat 0 0 /100% 100%; |
||||
|
} |
||||
|
.month-card-left { |
||||
|
box-sizing: border-box; |
||||
|
color: #fff; |
||||
|
padding-left: 16px; |
||||
|
} |
||||
|
.month-card-right { |
||||
|
-webkit-box-sizing: border-box; |
||||
|
-moz-box-sizing: border-box; |
||||
|
box-sizing: border-box; |
||||
|
/*margin-right: 5px;*/ |
||||
|
} |
||||
|
|
||||
|
.get-btn { |
||||
|
width: 34px; |
||||
|
height: 38px; |
||||
|
border: none; |
||||
|
background: none; |
||||
|
/*//margin-top: -15px;*/ |
||||
|
font-size: 17px; |
||||
|
line-height: 19px; |
||||
|
color: #fff; |
||||
|
} |
||||
|
.new-man { |
||||
|
font-size: 17px; |
||||
|
line-height: 1; |
||||
|
margin-bottom: 6px; |
||||
|
} |
||||
|
.limit-buy { |
||||
|
font-size: 10px; |
||||
|
line-height: 12px; |
||||
|
color: #FFBAA9; |
||||
|
} |
||||
|
.end-date { |
||||
|
margin-top: 10px; |
||||
|
font-size: 9px; |
||||
|
line-height: 14px; |
||||
|
color: #FFBAA9; |
||||
|
} |
||||
|
|
||||
|
.qrcode-img { |
||||
|
width: 76px; |
||||
|
height: 76px; |
||||
|
margin: 0 auto; |
||||
|
margin-top: 15px; |
||||
|
/*background-color: #909090;*/ |
||||
|
} |
||||
|
.qrcode-img img { |
||||
|
object-fit: cover; |
||||
|
} |
||||
|
|
||||
|
@media (max-width: 350px) { |
||||
|
.month-card-area { |
||||
|
padding-left: 10px; |
||||
|
} |
||||
|
|
||||
|
.month-card .f-font-45 { |
||||
|
font-size: 30px; |
||||
|
} |
||||
|
|
||||
|
.month-card .get-btn { |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.month-card .f-mr15 { |
||||
|
margin-right: 5px; |
||||
|
} |
||||
|
|
||||
|
.month-card .new-man { |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.month-card .end-date { |
||||
|
margin-top: 4px; |
||||
|
} |
||||
|
|
||||
|
.month-card .month-card-left { |
||||
|
padding-left: 13px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*公共样式*/ |
||||
|
|
||||
|
.btn-md { |
||||
|
border: none; |
||||
|
background: none; |
||||
|
width: 250px; |
||||
|
height: 40px; |
||||
|
line-height: 40px; |
||||
|
border-radius: 2px; |
||||
|
} |
||||
|
.btn-primary { |
||||
|
width: 80px; |
||||
|
border: none; |
||||
|
background: none; |
||||
|
} |
||||
|
.btn-orange { |
||||
|
width: 80px; |
||||
|
/*height: 24px;*/ |
||||
|
-webkit-border-radius: 24px; |
||||
|
-moz-border-radius: 24px; |
||||
|
border-radius: 24px; |
||||
|
-webkit-box-sizing: border-box; |
||||
|
-moz-box-sizing: border-box; |
||||
|
box-sizing: border-box; |
||||
|
border: 1px solid #FE9B36; |
||||
|
background: none; |
||||
|
line-height: 23px; |
||||
|
} |
||||
|
.bg-orange { |
||||
|
background-color: #FE9B36; |
||||
|
} |
||||
|
.bg-gray { |
||||
|
background-color: #D4D4D4; |
||||
|
} |
||||
|
.f-mt5 { |
||||
|
margin-top: 5px; |
||||
|
} |
||||
|
.f-mt10 { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
.f-mt20 { |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
.f-mt-10 { |
||||
|
margin-top: -10px; |
||||
|
} |
||||
|
.f-mt-15 { |
||||
|
margin-top: -15px; |
||||
|
} |
||||
|
.f-mt9 { |
||||
|
margin-top: 9px; |
||||
|
} |
||||
|
.f-mt10 { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
.f-mb20 { |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
.f-mb25 { |
||||
|
margin-bottom: 25px; |
||||
|
} |
||||
|
.f-ml20 { |
||||
|
margin-left: 20px; |
||||
|
} |
||||
|
.f-ml27 { |
||||
|
margin-left: 27px; |
||||
|
} |
||||
|
.f-mr10 { |
||||
|
margin-right: 10px; |
||||
|
} |
||||
|
.f-mr15 { |
||||
|
margin-right: 15px; |
||||
|
} |
||||
|
.f-mr20 { |
||||
|
margin-right: 20px; |
||||
|
} |
||||
|
.f-mr27 { |
||||
|
margin-right: 27px; |
||||
|
} |
||||
|
.f-flex { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.justify-between { |
||||
|
justify-content: space-between; |
||||
|
} |
||||
|
.justify-center { |
||||
|
justify-content: center; |
||||
|
} |
||||
|
.f-font-11 { |
||||
|
font-size: 11px; |
||||
|
} |
||||
|
.l-height-15 { |
||||
|
line-height: 15px; |
||||
|
} |
||||
|
.f-font-12 { |
||||
|
font-size: 12px; |
||||
|
line-height: 14px; |
||||
|
} |
||||
|
.f-font-13 { |
||||
|
font-size: 13px; |
||||
|
} |
||||
|
.f-font-15 { |
||||
|
font-size: 15px; |
||||
|
line-height: 17px; |
||||
|
} |
||||
|
.f-font-18 { |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
.f-font-23 { |
||||
|
font-size: 23px; |
||||
|
} |
||||
|
.f-font-45 { |
||||
|
font-size: 45px; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
.f-text-center { |
||||
|
text-align: center; |
||||
|
} |
||||
|
.f-bold { |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
.s-orange { |
||||
|
color: #FE9B36; |
||||
|
} |
||||
|
.s-orange-1 { |
||||
|
color: #E6A96C; |
||||
|
} |
||||
|
.s-orange-2 { |
||||
|
color: #FF9363; |
||||
|
} |
||||
|
.s-white { |
||||
|
color: #fff; |
||||
|
} |
||||
|
.s-gray { |
||||
|
color: #999; |
||||
|
} |
||||
|
.s-gray-1 { |
||||
|
color: #909090; |
||||
|
} |
||||
|
.s-black-1 { |
||||
|
color: #333333; |
||||
|
} |
||||
|
.s-red { |
||||
|
font-weight: bold; |
||||
|
color: #F45252 !important; |
||||
|
} |
||||
|
.line-through { |
||||
|
text-decoration: line-through; |
||||
|
} |
||||
|
.f-hide { |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Created by jerry on 2017/4/14. |
||||
|
*/ |
||||
|
import Vue from 'vue' |
||||
|
|
||||
|
export let bus = new Vue() |
||||
@ -0,0 +1,62 @@ |
|||||
|
/** |
||||
|
* Created by jerry on 2017/4/14. |
||||
|
*/ |
||||
|
var SIGN_REGEXP = /([yMdhsm])(\1*)/g |
||||
|
var DEFAULT_PATTERN = 'yyyy-MM-dd' |
||||
|
function padding (s, len) { |
||||
|
let l = len - (s + '').length |
||||
|
for (var i = 0; i < l; i++) { s = '0' + s } |
||||
|
return s |
||||
|
}; |
||||
|
|
||||
|
export default { |
||||
|
getQueryStringByName: function (name) { |
||||
|
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') |
||||
|
var r = window.location.search.substr(1).match(reg) |
||||
|
var context = '' |
||||
|
if (r != null) { context = r[2] } |
||||
|
reg = null |
||||
|
r = null |
||||
|
return context === null || context === '' || context === 'undefined' ? '' : context |
||||
|
}, |
||||
|
formatDate: { |
||||
|
|
||||
|
format: function (date, pattern) { |
||||
|
pattern = pattern || DEFAULT_PATTERN |
||||
|
return pattern.replace(SIGN_REGEXP, function ($0) { |
||||
|
switch ($0.charAt(0)) { |
||||
|
case 'y': return padding(date.getFullYear(), $0.length) |
||||
|
case 'M': return padding(date.getMonth() + 1, $0.length) |
||||
|
case 'd': return padding(date.getDate(), $0.length) |
||||
|
case 'w': return date.getDay() + 1 |
||||
|
case 'h': return padding(date.getHours(), $0.length) |
||||
|
case 'm': return padding(date.getMinutes(), $0.length) |
||||
|
case 's': return padding(date.getSeconds(), $0.length) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
parse: function (dateString, pattern) { |
||||
|
var matchs1 = pattern.match(SIGN_REGEXP) |
||||
|
var matchs2 = dateString.match(/(\d)+/g) |
||||
|
if (matchs1.length === matchs2.length) { |
||||
|
var _date = new Date(1970, 0, 1) |
||||
|
for (var i = 0; i < matchs1.length; i++) { |
||||
|
var _int = parseInt(matchs2[i]) |
||||
|
var sign = matchs1[i] |
||||
|
switch (sign.charAt(0)) { |
||||
|
case 'y': _date.setFullYear(_int); break |
||||
|
case 'M': _date.setMonth(_int - 1); break |
||||
|
case 'd': _date.setDate(_int); break |
||||
|
case 'h': _date.setHours(_int); break |
||||
|
case 'm': _date.setMinutes(_int); break |
||||
|
case 's': _date.setSeconds(_int); break |
||||
|
} |
||||
|
} |
||||
|
return _date |
||||
|
} |
||||
|
return null |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
/** |
||||
|
* 设置api请求的baseURL |
||||
|
*/ |
||||
|
|
||||
|
let configs = { |
||||
|
// 请求协议
|
||||
|
protocol : 'http', |
||||
|
// 请求域名
|
||||
|
host: 'api.1hjz.3ncto.com.cn', |
||||
|
// 基础路径
|
||||
|
basePath: '' |
||||
|
} |
||||
|
|
||||
|
export default { |
||||
|
baseURL: configs.protocol + '://' + configs.host + configs.basePath, |
||||
|
// baseURL: '',
|
||||
|
isDev: false |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
/** |
||||
|
* 设置api请求的baseURL |
||||
|
*/ |
||||
|
|
||||
|
let configs = { |
||||
|
// 请求协议 |
||||
|
protocol : 'http', |
||||
|
// 请求域名 |
||||
|
host: 'api.lch.3ncto.com.cn', |
||||
|
// 基础路径 |
||||
|
basePath: '/api2.php' |
||||
|
} |
||||
|
|
||||
|
export default { |
||||
|
baseURL: configs.protocol + '://' + configs.host + configs.basePath, |
||||
|
// baseURL: '', |
||||
|
isDev: false |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
// The Vue build version to load with the `import` command
|
||||
|
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
|
||||
|
import Vue from 'vue' |
||||
|
import App from './App' |
||||
|
import router from './router' |
||||
|
import '@/assets/iconfont.css' |
||||
|
import '@/assets/styles/main.scss' |
||||
|
import '@/assets/styles/style.css' |
||||
|
|
||||
|
Vue.config.productionTip = false |
||||
|
|
||||
|
/* eslint-disable no-new */ |
||||
|
new Vue({ |
||||
|
el: '#app', |
||||
|
router, |
||||
|
template: '<App/>', |
||||
|
components: {App} |
||||
|
}) |
||||
@ -0,0 +1,20 @@ |
|||||
|
import utilsModel from './utils-model' |
||||
|
import couponApi from '../api/coupon' |
||||
|
|
||||
|
export default { |
||||
|
|
||||
|
// 获取优惠券信息
|
||||
|
getCouponInfo : (batchNo) => |
||||
|
utilsModel |
||||
|
.config(couponApi.getCouponInfo, {batchNo: batchNo}) |
||||
|
.request(), |
||||
|
|
||||
|
// 领取优惠券
|
||||
|
giveCoupon : (params) => |
||||
|
utilsModel |
||||
|
.config(couponApi.giveCoupon) |
||||
|
.request({ |
||||
|
data : params |
||||
|
}), |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,114 @@ |
|||||
|
import configs from '../configs'; |
||||
|
import axios from 'axios' |
||||
|
import {bus} from '../bus.js' |
||||
|
|
||||
|
// axios.defaults.withCredentials = true;
|
||||
|
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
|
||||
|
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';//配置请求头
|
||||
|
|
||||
|
// 添加一个请求拦截器
|
||||
|
// axios.interceptors.request.use(function (config) {
|
||||
|
// console.dir(config);
|
||||
|
// return config;
|
||||
|
// }, function (error) {
|
||||
|
// // Do something with request error
|
||||
|
// return Promise.reject(error);
|
||||
|
// });
|
||||
|
|
||||
|
// 添加一个响应拦截器
|
||||
|
axios.interceptors.response.use(function (response) { |
||||
|
if (response.data && response.data.errcode) { |
||||
|
if (parseInt(response.data.errcode) === 40001) { |
||||
|
//未登录
|
||||
|
bus.$emit('goto', '/login') |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
}, function (error) { |
||||
|
// Do something with response error
|
||||
|
return Promise.reject(error); |
||||
|
}); |
||||
|
|
||||
|
//基地址
|
||||
|
let basePath = configs.baseURL; |
||||
|
|
||||
|
/** |
||||
|
* @param path {string} path |
||||
|
* @param opts {Object} options |
||||
|
* @return {?Object} |
||||
|
* |
||||
|
* @description |
||||
|
* Normalizes the given path, returning a regular expression |
||||
|
* and the original path. |
||||
|
* |
||||
|
* Inspired by pathRexp in visionmedia/express/lib/utils.js. |
||||
|
*/ |
||||
|
const pathReplace = function(path, opts) { |
||||
|
const ret = { |
||||
|
originalPath: path, |
||||
|
patternPath: path |
||||
|
} |
||||
|
|
||||
|
path = path |
||||
|
.replace(/([().])/g, '\\$1') |
||||
|
.replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) { |
||||
|
const optional = (option === '?' || option === '*?') ? '?' : null; |
||||
|
const star = (option === '*' || option === '*?') ? '*' : null; |
||||
|
slash = slash || ''; |
||||
|
opts[key] = typeof opts[key] === 'number' ? opts[key].toString() : opts[key]; |
||||
|
return '' |
||||
|
+ (optional ? '' : slash) |
||||
|
+ (opts[key] != '' |
||||
|
? opts[key] : '${'+ key +'}') |
||||
|
+ (optional || ''); |
||||
|
}) |
||||
|
|
||||
|
ret.patternPath = path; |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
// 处理http请求
|
||||
|
const config = function(config, params){ |
||||
|
|
||||
|
//提取接口url路径
|
||||
|
const url = basePath + pathReplace(config.url, params || {}).patternPath; |
||||
|
|
||||
|
return { |
||||
|
// 发送请求
|
||||
|
request: function(obj) { |
||||
|
// 全部接口带token
|
||||
|
obj = obj || {} |
||||
|
obj.params = obj.params || {} |
||||
|
obj.params.token = localStorage.getItem('user_key') |
||||
|
|
||||
|
//整合请求配置
|
||||
|
const newConfig = Object.assign({}, obj || {}, config, {url: url}); |
||||
|
|
||||
|
//执行http接口请求
|
||||
|
return axios(newConfig).then(successCallback, errorCallback); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 请求成功回调
|
||||
|
const successCallback = (result) => { |
||||
|
// -402用户认证失败,请重新登录 -101没有操作权限
|
||||
|
if (result.data.error_code === -402) { |
||||
|
sessionStorage.clear() |
||||
|
localStorage.removeItem('user_key') |
||||
|
//未登录
|
||||
|
bus.$emit('goto', '/login') |
||||
|
} |
||||
|
|
||||
|
return result.data |
||||
|
} |
||||
|
|
||||
|
// 请求失败回调
|
||||
|
const errorCallback = (result) => { |
||||
|
return result.data |
||||
|
} |
||||
|
|
||||
|
export default { |
||||
|
config: config |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
import Vue from 'vue' |
||||
|
import Router from 'vue-router' |
||||
|
|
||||
|
// 懒加载方式,当路由被访问的时候才加载对应组件
|
||||
|
const monthCard = resolve => require(['@/view/month-card'], resolve) |
||||
|
|
||||
|
Vue.use(Router) |
||||
|
|
||||
|
let router = new Router({ |
||||
|
// mode: 'history',
|
||||
|
routes: [ |
||||
|
{ |
||||
|
path: '/month-card', |
||||
|
name: '领取优惠券', |
||||
|
component: monthCard |
||||
|
} |
||||
|
] |
||||
|
}) |
||||
|
|
||||
|
// router.beforeEach((to, from, next) => {
|
||||
|
// console.log('to:' + to.path)
|
||||
|
// if (to.path.startsWith('/login')) {
|
||||
|
// window.localStorage.removeItem('user_key')
|
||||
|
// next()
|
||||
|
// } else {
|
||||
|
// let user = window.localStorage.getItem('user_key')
|
||||
|
// if (!user) {
|
||||
|
// next({path: '/login'})
|
||||
|
// } else {
|
||||
|
// next()
|
||||
|
// }
|
||||
|
// }
|
||||
|
// })
|
||||
|
|
||||
|
export default router |
||||
@ -0,0 +1,165 @@ |
|||||
|
<template> |
||||
|
<div class=""> |
||||
|
<div class="m-slider"> |
||||
|
<img src="../assets/images/slider-img.png" width="100%" height="100%" alt=""> |
||||
|
</div> |
||||
|
|
||||
|
<div class="month-card-title f-text-center"> |
||||
|
<h4 class="">{{getData.goodsName}}</h4> |
||||
|
<p class="f-mt5">{{getData.shortDesc}}</p> |
||||
|
<p class="f-price f-mt10 f-flex justify-center"> |
||||
|
<span class="s-gray f-mr15">市场价 : <span class="line-through">¥{{getData.originalPrice | numFilter}}</span></span> |
||||
|
<span>券后价 : </span><span class="f-font-23 s-red">¥{{getData.couponPrice | numFilter}}</span> |
||||
|
</p> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="month-card-area"> |
||||
|
<div class="month-card f-flex" style="margin-bottom: -35px;"> |
||||
|
<div class="month-card-left" style="width: 76%;"> |
||||
|
<div class="f-flex f-mt9"> |
||||
|
<div class="f-mb20 f-mr10"> |
||||
|
<p v-show="getData.type != 3" class="f-font-15" style="line-height:1;">¥</p> |
||||
|
<!-- 定额券 --> |
||||
|
<div v-show="getData.type == 1" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div> |
||||
|
<!-- 满减券 --> |
||||
|
<div v-show="getData.type == 2" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{getData.amount | numFilter}}</div> |
||||
|
<!-- 折扣 --> |
||||
|
<div v-show="getData.type == 3" class="f-bold f-font-45" style="text-shadow: 1px 1px #852B0E;">{{Number(getData.discount/10)}}折</div> |
||||
|
|
||||
|
<!-- 定额券 --> |
||||
|
<p v-show="getData.type != 2" class="f-font-12 f-mt5" style="margin-left: 6px;">{{couponType[getData.type]}}</p> |
||||
|
|
||||
|
<!-- 满减券 --> |
||||
|
<p v-show="getData.type == 2" class="f-font-12 f-mt5" style="margin-left: 6px;">满{{getData.fullAmount | numFilter}}可用</p> |
||||
|
</div> |
||||
|
<div class="f-mb20"> |
||||
|
<p class="new-man">{{getData.batchName}}</p> |
||||
|
<p class="limit-buy">({{getData.goodsName}})</p> |
||||
|
<p class="end-date">{{getData.invalidTimeDesc}}</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<div class="month-card-right justify-center" style="margin-left:10px;"> |
||||
|
<div v-show="getData.couponStatus == 0" class="f-mt-15 f-flex"> |
||||
|
<img src="../assets/images/arrow-right_03.png" width="7" height="12" alt="" class="f-mr15"> |
||||
|
<button class="get-btn" v-on:click="handleGetCoupon">点击领取</button> |
||||
|
</div> |
||||
|
<img v-show="getData.couponStatus > 0" src="../assets/images/get.png" width="60" height="60" alt="" class="f-mt-10"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="f-mt10 f-text-center"> |
||||
|
<button class="btn-md bg-gray s-white f-font-18">立即使用</button> |
||||
|
</div> |
||||
|
<div style="padding: 0 10px 20px;"> |
||||
|
<p class="s-gray-1 f-font-11 f-mt20" style="line-height: 18px;">使用范围:广州市(天河区、海珠区、白云区、番禺区、花都区、从化区、越秀区、黄埔区、南沙区、荔湾区)</p> |
||||
|
<p class="f-mt10 f-font-11 s-orange-2"> |
||||
|
使用流程:领券下单→关注公众号→预约服务 |
||||
|
</p> |
||||
|
<div class="f-text-center"> |
||||
|
<div class="qrcode-img"> |
||||
|
<img src="../assets/images/qrcode.png" width='100%' height="100%" alt=""> |
||||
|
</div> |
||||
|
<p class="f-font-11 f-mt5 s-black-1">预约服务请关注公众号</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import couponModel from '../models/coupon-model'; |
||||
|
|
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
loading: false, |
||||
|
getData: {}, |
||||
|
couponType: { |
||||
|
'1': '定额券', |
||||
|
'2': '满减券', |
||||
|
'3': '折扣券', |
||||
|
} |
||||
|
}; |
||||
|
}, |
||||
|
methods: { |
||||
|
|
||||
|
// 初始化 |
||||
|
handleInit() { |
||||
|
|
||||
|
let that = this; |
||||
|
|
||||
|
// 回去优惠券信息 |
||||
|
couponModel.getCouponInfo('CB180620024554871101').then(function (result) { |
||||
|
|
||||
|
console.log(result.response); |
||||
|
|
||||
|
that.loading = false; |
||||
|
|
||||
|
if (result.code == 0) { |
||||
|
|
||||
|
that.getData = result.response |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
console.log(result.msg); |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
// 领取优惠券 |
||||
|
handleGetCoupon() { |
||||
|
let that = this; |
||||
|
|
||||
|
this.loading = true; |
||||
|
|
||||
|
let params = { |
||||
|
|
||||
|
batchNo: 'CB180620024554871101', |
||||
|
}; |
||||
|
|
||||
|
// 调用领券接口 |
||||
|
couponModel.giveCoupon(params).then(function (result) { |
||||
|
|
||||
|
that.loading = false; |
||||
|
|
||||
|
if (result.code == 0) { |
||||
|
|
||||
|
console.log('领取成功') |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
console.log('领取失败') |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}, |
||||
|
}, |
||||
|
filters: { |
||||
|
numFilter(value) { |
||||
|
// 截取当前数据到小数点后三位 |
||||
|
let transformVal = Number(value/100).toFixed(2) |
||||
|
let realVal = transformVal.substring(0, transformVal.length - 1) |
||||
|
// num.toFixed(3)获取的是字符串 |
||||
|
return Number(realVal) |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
|
||||
|
// 初始化 |
||||
|
this.handleInit(); |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
<style> |
||||
|
body { |
||||
|
background-color: #FFF3E8; |
||||
|
} |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save