Commit 2c6a8bc5 by 周志凯

init

0 parents
Showing 677 changed files with 2225 additions and 0 deletions
{
"presets": [
[
"env",
{
"modules": false,
"useBuiltIns": "entry",
"targets": {
"browsers": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
}
],
"stage-2"
],
"plugins": ["transform-runtime","transform-vue-jsx"],
"env": {
"test": {
"presets": [
"env",
"stage-2"
],
"plugins": ["transform-vue-jsx","istanbul"]
}
}
}
\ No newline at end of file \ No newline at end of file
# https://editorconfig.org/
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
simpleHttp.py*
/.history/
static/js/config.js
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>business</name>
<comment>Create By HBuilder</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.aptana.ide.core.unifiedBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.aptana.projects.webnature</nature>
</natures>
<filteredResources>
<filter>
<id>1520908530282</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.orFilterMatcher</id>
<arguments>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-projectRelativePath-matches-false-false-bin</arguments>
</matcher>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-projectRelativePath-matches-false-false-setting</arguments>
</matcher>
</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
# project
> A Vue.js project
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
```
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
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'
))
})
})
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const 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++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function(_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
config.build.assetsSubDirectory :
config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function(options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders(loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [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',
publicPath: '../../'
})
} 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) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
\ No newline at end of file \ No newline at end of file
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
},
}
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
var webpack = require('webpack')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: ['babel-polyfill', './src/main.js'],
xincheng: ['babel-polyfill', './src/xincheng.js']
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
chunkFilename: '[name].[chunkhash:5].chunk.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'),
}
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery'
// jQuery: 'jquery',
// jquery: 'jquery',
// 'window.jQuery': 'jquery'
}),
// new webpack.DllReferencePlugin({
// context: __dirname,
// manifest: require('./element-manifest.json')
// }),
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./xlsx-manifest.json')
})
],
module: {
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]'),
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
},
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
\ No newline at end of file \ No newline at end of file
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: true,
hot: true,
host: process.env.HOST || config.dev.host,
port: process.env.PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay ? {
warnings: false,
errors: true,
} : false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
},
// ie9兼容
noInfo: true,
overlay: true,
proxy: {
'/api': {
target: 'http://localhost:8081/myserver',
pathRewrite: {
'^/api': ''
}
}
},
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
chunks: ['app']
}),
new HtmlWebpackPlugin({
filename: 'xincheng.html',
template: 'xincheng.html',
inject: true,
chunks: ['xincheng']
}),
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${config.dev.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const CSSSplitWebpackPlugin = require('css-split-webpack-plugin').default;
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// const GenerateAssetPlugin = require('generate-asset-webpack-plugin')
const env = require('../config/prod.env')
// const fs = require('fs')
// const content = `getVersion('${+new Date()}')`
// fs.writeFile(config.build.assetsRoot + '/version.js', content, function(err) {
// if (err) {
// return console.error(err)
// }
// // console.log('The file was saved')
// })
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js?t=[chunkhash:5]'),
chunkFilename: utils.assetsPath('js/[name].[chunkhash].js?t=[chunkhash:5]')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
exclude: [/en_US/,/mall_CN/,/zh_CN/,/zh_TW/],
uglifyOptions: {
compress: {
warnings: false
}
},
// sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap ? { safe: true, map: { inline: false } } : { 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',
chunks: ['manifest', 'vendor', 'app']
}),
new HtmlWebpackPlugin({
filename: config.build.xincheng,
template: 'xincheng.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',
chunks: ['manifest', 'vendor', 'xincheng']
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks(module) {
// 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',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}]),
new CSSSplitWebpackPlugin({
size: 4000,
filename: 'static/css/[name]-[part].[ext]'
}),
new BundleAnalyzerPlugin(
{
analyzerMode: 'server',
analyzerHost: '127.0.0.1',
analyzerPort: 8888,
reportFilename: 'report.html',
defaultSizes: 'parsed',
openAnalyzer: true,
generateStatsFile: false,
statsFilename: 'stats.json',
statsOptions: null,
logLevel: 'info'
}
),
]
})
if (config.build.productionGzip) {
const 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) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
// 打包输出可配置文件
// let createServerConfig = function(compilation) {
// let cfgJson = {
// ApiUrl: 'http://192.168.9.228:9500'
// };
// return JSON.stringify(cfgJson);
// }
// webpackConfig.plugins.push(
// // 输出可配置文件
// new GenerateAssetPlugin({
// filename: 'serverconfig.json',
// fn: (compilation, cb) => {
// cb(null, createServerConfig(compilation));
// },
// extraFiles: []
// })
// )
module.exports = webpackConfig
\ No newline at end of file \ No newline at end of file
{"name":"xlsx_library","content":{"../node_modules/webpack/buildin/global.js":{"id":0,"meta":{}},"../node_modules/buffer/index.js":{"id":1,"meta":{}},"../node_modules/xlsx/dist/cpexcel.js":{"id":2,"meta":{}},"../node_modules/xlsx/xlsx.js":{"id":5,"meta":{}},"../node_modules/base64-js/index.js":{"id":6,"meta":{}},"../node_modules/ieee754/index.js":{"id":7,"meta":{}},"../node_modules/isarray/index.js":{"id":8,"meta":{}},"../node_modules/process/browser.js":{"id":9,"meta":{}},"../node_modules/xlsx/jszip.js":{"id":10,"meta":{}},"../node_modules/webpack/buildin/amd-options.js":{"id":11,"meta":{}}}}
\ No newline at end of file \ No newline at end of file
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
'use strict'
// Template version: 1.2.8
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
useLocalIp: true,
// Various Dev Server settings
host: '0.0.0.0', // can be overwritten by process.env.HOST
port: 8999, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: '#cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true,
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
xincheng: path.resolve(__dirname, '../dist/xincheng.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
/**
* Source Maps
*/
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// 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: true,
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
}
}
\ No newline at end of file \ No newline at end of file
'use strict'
module.exports = {
NODE_ENV: '"production"'
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
<meta http-equiv="Expires" content="0">
<link rel="shortcut icon" href="./static/img/favicon.ico" type="image/x-icon" />
<style type="text/css">
html,
body {
width: 100%;
height: 100%;
font-size: 100%;
}
body {
background: #f0f3f9;
}
</style>
<script>
var _hmt = _hmt || [];
(function() {
var randomH = Date.parse(new Date()) / 1000;
document.write("<script type='text/javascript' src='./static/js/config.js?s=" + randomH + "' charset='utf-8'><\/script>");
var host = window.location.host || 'store.keliuyun.com'
var hm = document.createElement("script");
if (/^store.*/.test(host)) {
hm.src = /^store.*/.test(host)
? "https://hm.baidu.com/hm.js?313a8a08b743caaeec321c891b5172df"
: "https://hm.baidu.com/hm.js?801fd373e0924a6b18bd747218134480"
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
_hmt.push(['_requirePlugin', 'UrlChangeTracker', {
shouldTrackUrlChange: function (newPath, oldPath) {
return newPath && oldPath;
}}
])
})();
</script>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="./static/js/rem.js" type="text/javascript" charset="utf-8"></script>
<script src="https://api.map.baidu.com/api?v=2.0&ak=7eRXXHqcpdDuvgcqwWFyBGw5U7c5Iz6i" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript' src='./static/js/dateUnit.js' charset='utf-8'></script>
<script type='text/javascript' src='./static/js/xlsx.dll.js' charset='utf-8'></script>
<!-- [if gte IE 9]>
<script src="./static/js/jquery.xdomainrequest.min.js"></script>
<![endif]-->
</body>
</html>
\ No newline at end of file \ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>监控</title>
<link rel="stylesheet" href="./static/monitor/css/common.css">
<script src="./static/monitor/js/jquery-3.1.0.min.js"></script>
<script src="./static/monitor/js/colorpicker.js"></script>
<script src="./static/monitor/js/js.cookie.js"></script>
<script src="./static/monitor/js/login.js"></script>
<script>
var randomH = Date.parse(new Date()) / 1000;
document.write("<script type='text/javascript' src='./static/js/config.js?s=" + randomH + "' charset='utf-8'><\/script>");
</script>
</head>
<body>
<div class="control-wrapper">
<div class="control-right">
<!-- <span id="colorPickerBtn" class="color-picker-btn"></span> -->
<div id="color-picker" class="cp-default">
<div class="picker-wrapper">
<div id="picker" class="picker"></div>
<div id="picker-indicator" class="picker-indicator"></div>
</div>
<div class="slide-wrapper">
<div id="slide" class="slide"></div>
<div id="slide-indicator" class="slide-indicator"></div>
</div>
</div>
<select class="refresh-selector" id="refreshTime">
<option value="30">30s</option>
<option value="60">60s</option>
<option value="90">90s</option>
</select>
<select class="refresh-selector" id="colorType">
<option value="background">背景颜色</option>
<option value="font">字体颜色</option>
</select>
<span id="colorPickerBtn" class="color-picker-btn"></span>
<span class="size-decrease" id="decrease">A-</span>
<span class="size-number" id="sizeNum">30</span>
<span class="size-inscrease" id="inscrease">A+</span>
</div>
</div>
<div class="main-wrapper">
</div>
<script src="./static/monitor/js/common.js"></script>
</body>
</html>
\ No newline at end of file \ No newline at end of file
## 平台上线
### store.keliuyun.com
method: XShell
remote: 47.94.47.137
username: root
password: Vion-tech
### mall.keliuyun.com
method: mstsc
remote: 47.94.54.89
username: root
password: Vion-tech
### 吾悦
method: mstsc
remote: 47.94.54.89
username: administrator
password: Vion-tech
### 菏泽万达
method: teamViewer
remote: 1061533065
password: vion-tech
platform username and password: wanda vion123!
vion 123456
### 华为
method: mstsc
remote: 59.110.235.201
username: administrator
password: Vion-tech
### store
method: XShell/WinScp
remote: 47.94.47.137
username: root
password: Vion-tech
### 新城吾悦
method: 堡垒机
remote: https://sslvpn.xincheng.com
username: chenjianming
password: vion1234!
\ No newline at end of file \ No newline at end of file
{
"name": "project",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "xiaxinran",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --useLocalIp --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js",
"analyz": "NODE_ENV=production npm_config_report=true npm run build",
"dll": "webpack --config build/webpack.dll.config.js"
},
"dependencies": {
"@riophae/vue-treeselect": "^0.2.0",
"@sentry/browser": "^5.15.5",
"@sentry/integrations": "^5.15.5",
"axios": "^0.17.1",
"copy-webpack-plugin": "^4.5.2",
"echarts": "^4.0.4",
"echarts-extension-amap": "^1.0.0-rc.4",
"element-ui": "^2.0.10",
"es6-promise": "^4.2.4",
"jquery-form": "^4.2.2",
"normalize-wheel": "^1.0.1",
"qrcodejs2": "0.0.2",
"resize-observer-polyfill": "^1.5.0",
"vue": "^2.6.11",
"vue-baidu-map": "^0.21.11",
"vue-i18n": "^7.4.2",
"vue-router": "^3.0.1",
"vue-upload-component": "^2.8.19",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.4",
"babel-plugin-import": "^1.6.3",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.7.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"compression-webpack-plugin": "^1.1.12",
"css-loader": "^0.28.0",
"css-split-webpack-plugin": "^0.2.6",
"express": "^4.16.4",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"file-saver": "^1.3.8",
"friendly-errors-webpack-plugin": "^1.6.1",
"generate-asset-webpack-plugin": "^0.3.0",
"heatmap.js": "^2.0.5",
"html-webpack-plugin": "^2.30.1",
"i18n-webpack-plugin": "^1.0.0",
"inline-svg": "^2.2.3",
"jquery": "^3.1.0",
"js-cookie": "^2.2.0",
"less": "^3.0.4",
"less-loader": "^4.1.0",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"svg-pan-zoom": "^3.6.0",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-lazyload": "^1.2.6",
"vue-loader": "^13.7.1",
"vue-simple-svg": "^1.3.2",
"vue-style-loader": "^3.0.1",
"vue-svgicon": "^3.2.2",
"vue-template-compiler": "^2.6.11",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.13.1",
"webpack-dev-server": "^2.9.3",
"webpack-merge": "^4.1.0",
"xlsx": "^0.13.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
<template>
<div id="app" style="width:100%;height:100%">
<router-view v-if="isRouterAlive"></router-view>
</div>
</template>
<script>
export default {
data() {
return {
isRouterAlive: true
}
},
provide() {
return {
reload: this.reload
}
},
methods: {
reload() {
this.isRouterAlive = false;
this.$nextTick(() => {
this.isRouterAlive = true;
})
}
},
created() {
let webV = localStorage.getItem('webVersion');
if(webV && webV !== 'undefined') {
if(window._vionConfig.webVersion != webV){
localStorage.setItem('webVersion', window._vionConfig.webVersion);
this.removeStorge();
this.$router.push('/');
} else {
}
}else {
if(window._vionConfig.webVersion) {
localStorage.setItem('webVersion', window._vionConfig.webVersion);
}
}
},
mounted() {
let langObj = ['zh_CN','mall_CN','en_US','zh_TW']
if(this.$Project === 'store') {
let _lang = localStorage.getItem('lang') || 'zh_CN';
if(langObj.includes(_lang)){
_lang = _lang == 'mall_CN' ? 'zh_CN' : _lang;
}else{
_lang = 'zh_CN'
}
localStorage.setItem('lang', _lang)
}else{
let _lang = 'mall_CN';
localStorage.setItem('lang', _lang)
}
}
}
</script>
import req from '@/api/http.js'
// analysisReport 是定义综合分析报表的接口
const analysisReport = {
/**
* 基础分析报表
*/
baseAnalysis(analysisLevel, params, config) {
return req('get', `/report/basics/${analysisLevel}`, params, config)
},
/**
* 日期对比报表
*/
dateComparedAnalysis(analysisLevel, params, config) {
return req('get', `/report/dateCompared/${analysisLevel}`, params, config)
},
/**
* 综合分析报表
*/
synthesizeAnalysis(analysisLevel, params, config) {
return req('get', `/report/synthesize/${analysisLevel}`, params, config)
},
/**
* 活动报表
*/
holidayObjectAnalysis(analysisLevel, params, config) {
return req('get', `/report/holidayObject/${analysisLevel}`, params, config)
},
/**
* 节假日活动报表
*/
holidayEventAnalysis(analysisLevel, params, config) {
return req('get', `/report/holidayeEvent/${analysisLevel}`, params, config)
},
/**
* 进出客流报表
*/
trafficInAndOutAnalysis(analysisLevel, params, config) {
return req('get', `/report/trafficInAndOut/${analysisLevel}`, params, config)
},
/**
* 主力店报表
*/
mainZoneYOAnalysis(params, config) {
return req('get', '/report/mainZoneYOAnalysis/zone', params, config)
},
/**
* 排行榜报表
*/
rankingAnalysis(analysisLevel, params, config) {
return req('get', `/report/ranking/${analysisLevel}`, params, config)
},
/**
* 同环比报表
*/
yoyOrMomAnalysis(analysisLevel, params, config) {
return req('get', `/report/yoyOrMom/${analysisLevel}`, params, config)
},
/**
* 进店率报表
*/
enteringRateAnalysis(analysisLevel, params, config) {
return req('get', `/report/enteringRate/${analysisLevel}`, params, config)
},
/**
* 时间对比报表
*/
timeCompareAnalysis(analysisLevel, params, config) {
return req('get', `/report/timeCompareAnalysis/${analysisLevel}`, params, config)
},
/**
* 时段客流报表
*/
thermodynamicAnalysis(analysisLevel, params, config) {
return req('get', `/report/thermodynamic/${analysisLevel}`, params, config)
},
/**
* 天气分析报表
*/
weatherAnalysis(analysisLevel, params, config) {
return req('get', `/report/weather/${analysisLevel}`, params, config)
},
/**
* 周中周末对比报表
*/
weekComparedAnalysis(analysisLevel, params, config) {
return req('get', `/report/weekCompared/${analysisLevel}`, params, config)
},
/**
* 获取活动对象
*/
events(params, config) {
return req('get', '/events/getEvent', params, config)
},
/**
* 获取监控点热力数据
*/
heatmapTraffic(params,config) {
return req('get', '/report/heatmapTraffic/mall', params, config)
},
/**
* 返店分析报表
*/
returnshopReport(params,config) {
return req('get', '/returnMallAnalysis/mall', params, config)
},
/**
* 循环获取报表
*/
getMultipleReport(url,params,config) {
return req('get', url, params, config)
},
/**
* 集团区域客流
*/
blocAreaTrafficReport(params, config) {
return req('get', '/report/region/account', params, config)
},
/**
* 多次到店顾客
*/
historyArrival(params) {
return req('get', window._vionConfig.repeatInStoreUrl + '/api/v1/face/historyArrival', params)
},
// 滞留时间统计
residenceTime(analysisLevel, params) {
return req('get', `/residenceTime/${analysisLevel}`, params)
},
retentionInAndOut(params) {
return req('get', '/report/retentionInAndOut/mall', params)
},
retentionFishEye(params) {
return req('get', '/report/retentionFishEye/mall', params)
}
}
export default analysisReport;
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
// base.js 定义基本的接口 account mall floor zone gate channel
const base = {
/**
* login
*/
login(params, config) {
return req('post', '/users/login', params, config)
},
/**
* accounts
*/
account(params, config) {
// if(!params.sortName) {
// params.sortName = "convert_to(\"account\".name, 'GBK')";
// }
return req('get', '/accounts', params, config)
},
/**
* malls
*/
mall(params, config, switchStatus) {
if(!switchStatus) {
params.status = 1
}
if(!params.sortName) {
params.sortName = "convert_to(\"mall\".name, 'GBK')";
}
return req('get', '/malls', params, config)
},
/**
* floors
*/
floor(params, config, switchStatus){
if(!switchStatus) {
params.status = 1
}
if(!params.sortName) {
params.sortName = "convert_to(\"floor\".name, 'GBK')";
}
return req('get', '/floors', params, config)
},
/**
* single floors
*/
singleFloor(floorId, params, config){
return req('get', `/floors/${floorId}`, params, config)
},
/**
* floor picture mark
*/
markFloorImage(params, config) {
return req('post', '/floors/svgUpdate', params, config)
},
/**
* zones
*/
zone(params, config, switchStatus) {
if(!switchStatus) {
params.status = 1
}
if(!params.sortName) {
params.sortName = "convert_to(\"zone\".name, 'GBK')";
}
return req('get', '/zones', params, config)
},
/**
* gates
*/
gate(params, config, switchStatus) {
if(!switchStatus) {
params.status = 1;
}
if(!params.sortName) {
params.sortName = "convert_to(\"gate\".name, 'GBK')";
}
return req('get', '/gates', params, config)
},
/**
* floorGates
*/
floorGate(params, config) {
return req('get', '/floorGates', params, config)
},
/**
* zoneGates
*/
zoneGate(params, config) {
return req('get', '/zoneGates', params, config)
},
/**
* channels
*/
channel(params, config) {
return req('get', '/channels', params, config)
},
/**
* single channel
*/
singleChannel(channelId, params, config) {
return req('get', `/channels/${channelId}`, params, config)
},
/**
* format
*/
// format(params, config) {
// return req('get', '/formats', params, config)
// },
/**
* citys
*/
city(params, config) {
return req('get', '/citys', params, config)
},
country(params, config) {
return req('get', '/citys/countries', params, config)
},
/**
* provinces
*/
province(params, config) {
return req('get', '/provinces', params, config)
},
/**
* dataDics
*/
dataDic(params, config) {
return req('get', '/dataDics', params, config)
},
/**
* 获取集团商场楼层店铺
*/
bases(url, params, config) {
return req('get', url, params, config)
},
video(params, config) {
return req('get', '/deviceMappings/shilian/devices', params, config)
},
format(accoutId, params, config,) {
return req('get', '/formats/tree' + (accoutId ? '/'+ accoutId : ''), params, config)
},
}
export default base;
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
// baseReport 是定义基础报表的接口
const baseReport = {
/**
* 集团取报表 key id
* @param {Object} params
* @param {Object} config
*/
reportChart(params, config) {
return req('get', '/reportCharts', params, config)
},
/**
* 集团单个报表
* @param {String} reportType
* @param {Number} chartId
* @param {Object} params
* @param {Object} config
*/
reportAccSingleChart(reportType, chartId, params, config) {
return req('get', `/report/${reportType}/account/${chartId}`, params, config)
},
/**
* 集团报表
* @param {String} reportType
* @param {Object} params
* @param {Object} config
*/
accountReport(reportType, params, config) {
return req('get', `/report/${reportType}/account`, params, config)
},
/**
* 商场报表
* @param {String} reportType
* @param {Object} params
* @param {Object} config
*/
mallReport(reportType, params, config) {
return req('get', `/report/${reportType}/mall`, params, config)
},
/**
* 月份里客流最高位和最低位
*/
mallReportMaxMin(reportType, params, config){
return req('get', `mallDayCountDatas/threshold/${reportType}`, params, config)
},
/**
* 商场单个报表
* @param {String} reportType
* @param {Number} chartId
* @param {Object} params
* @param {Object} config
*/
reportMallSingleChart(reportType, chartId, params, config) {
return req('get', `/report/${reportType}/mall/${chartId}`, params, config)
},
/**
* 楼层报表
* @param {String} reportType
* @param {Object} params
* @param {Object} config
*/
floorReport(reportType, params, config) {
return req('get', `/report/${reportType}/floor`, params, config)
},
/**
* 楼层单个报表
* @param {String} reportType
* @param {Number} chartId
* @param {Object} params
* @param {Object} config
*/
reportFloorSingleChart(reportType, chartId, params, config) {
return req('get', `/report/${reportType}/floor/${chartId}`, params, config)
},
/**
* 店铺报表
* @param {String} reportType
* @param {Object} params
* @param {Object} config
*/
zoneReport(reportType, params, config) {
return req('get', `/report/${reportType}/zone`, params, config)
},
/**
* 店铺单个报表
* @param {String} reportType
* @param {Number} chartId
* @param {Object} params
* @param {Object} config
*/
reportZoneSingleChart(reportType, chartId, params, config) {
return req('get', `/report/${reportType}/zone/${chartId}`, params, config)
},
}
export default baseReport;
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
// analysisReport 是定义顾客行为报表的接口
const customerReport = {
/**
* 区域热力报表
*/
zoneHotMapReport(params, config) {
return req('get', '/heatmap/zoneHotmap/mall', params, config)
},
/**
* 顾客轨迹动线
*/
movingLineReport(personUnid, params, config) {
return req('get', `/report/movingLine/customerLine/${personUnid}`, params, config)
},
/**
* 客流动线
*/
flowMovingLineReport(params, config) {
return req('get', '/report/movingLine/floor', params, config)
},
/**
* 客流方向
*/
faceMavingLineReport(params, config) {
return req('get', '/report/movingLine/faceMavingLines', params, config)
},
/**
* 单楼层
*/
moveLineSimpleFloor(params, config) {
return req('get', '/report/movingLine/floorMovingLine', params, config)
},
/**
* 多楼层
*/
moveLineMultipleFloor(params, config) {
return req('get', '/report/movingLine/floorMovingLines', params, config)
},
/**
* facepage
*/
facePageReport(params, config) {
return req('get', '/faceRecognitions/report/facePage/gate', params, config)
},
/**
* 展台热力
*/
trackHeatmapReport(channelId, params, config) {
return req('get', `/heatmap/trackHeatmap/${channelId}`, params, config)
},
/**
* 楼层热力
*/
floorHeatmapReport(floorId, params, config) {
return req('get', `/heatmap/floorHeatmap/${floorId}`, params, config)
},
/**
* 开心指数
*/
happyIndexReport(analysisLevel, params, config) {
return req('get', `/report/happyIndex/${analysisLevel}`, params, config)
},
/**
* 店内热力
*/
inStoreHeatReport(params, config) {
return req('get', '/heatmapDataRaws', params, config)
},
/**
* 滞留时间
*/
residenceReport(params, config) {
return req('get', '/report/residence/mall', params, config)
},
/**
* 动线分析
*/
movingLineAnalysis(params, config) {
return req('get', '/report/movingLine/customerLines', params, config)
},
/**
* 通道抓拍 删除
*/
channelSnapshot(analysisLevel, orgId, params, config) {
return req('get', `/channelSnapshots/${analysisLevel}/${orgId}`, params, config)
},
/**
* 点位热力
*/
floorHeatmap(orgId, params, config) {
return req('get', `/heatmap/floor/${orgId}`, params, config)
},
trafficHeatmap(analysisLevel, orgId, params, config) {
return req('get', `/heatmap/${analysisLevel}/${orgId}`, params, config)
},
/**
* 点位热力
*/
heatmap(channelSerialnum, params, config) {
return req('get', `/heatmap/${channelSerialnum}`, params, config)
},
heatmapDataRaw(params, config) {
return req('get', '/heatmapDataRaws', params, config)
},
analysisSankey(params, config) {
return req('get', '/report/faceAnalyze/sankey', params, config)
}
}
export default customerReport;
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
// analysisReport 是定义顾客行为报表的接口
const flowReport = {
/**
* 特别抓拍记录列表
*/
uniqueCaptureRecord(params, config) {
return req('get', '/faceRecognitions/unique', params, config)
},
/**
* 抓拍记录列表
*/
captureRecord(params, config) {
return req('get', '/faceRecognitions', params, config)
},
/**
* 区域客流分时
*/
zoneCustomerTimeShare(params, config) {
return req('get', '/report/zoneCustomerTimeShare/zone', params, config)
},
/**
* 区域客群
*/
trafficAnalyze(params, config) {
return req('get', '/report/trafficAnalyze/zone', params, config)
},
/**
* 出入口/门店客群
*/
faceAnalyzeSta(analysisLevel, params, config) {
return req('get', `/report/faceAnalyzeSta/${analysisLevel}`, params, config)
},
/**
* 新老顾客
*/
mallDayFaceRecognitionStas(params, config) {
return req('get', '/mallDayFaceRecognitionStas', params, config)
},
newAndRegularAnalysis(analysisLevel, params, config) {
return req('get', `/newAndRegularAnalysis/${analysisLevel}`, params, config)
},
mallDayHistoryArriveCounts(analysisLevel, params) {
return req('get', `/mallDayHistoryArriveCounts/${analysisLevel}`, params)
},
/**
* 有效客流统计
*/
mallDayEffective(params, config) {
return req('get', '/mallDayFaceRecognitionStas/effective', params, config)
},
/**
* 区域客流
*/
faceDistribution(params, config) {
return req('get', '/report/faceDistribution/gate', params, config)
},
/**
* 客群分时
*/
faceCountAnalyzeSta(analysisLevel, params, config) {
return req('get', `/report/faceCountAnalyzeSta/${analysisLevel}`, params, config)
},
historyCapture(params, config) {
return req('get', '/faceRecognitions/history', params, config)
},
lossCustomer(params, config) {
return req('get', '/report/lossCustomer/mall', params, config)
}
}
export default flowReport;
\ No newline at end of file \ No newline at end of file
import axios from 'axios'
import qs from 'qs'
import * as Cookies from 'js-cookie'
import router from '@/router'
import Vue from 'vue'
import {
loading,
Message
} from 'element-ui'
// 创建 axios 的一个实例
const Axios = axios.create({
baseURL: window._vionConfig.apiUrl, // 因为我本地做了反向代理
timeout: 0,
// responseType: "json",
// changeOrigin: true,//允许跨域
withCredentials: true, // 是否允许带cookie这些
headers: {
"Content-Type": "application/json;charset=UTF-8"
// 'Content-Type': 'application/x-www-form-urlencoded'
}
})
window.axios = Axios;
var loadingStatus;
let store = {
source: {
token: null,
cancel: null
}
}
// 请求拦截器
Axios.interceptors.request.use(
config => {
let language = localStorage.getItem('lang')
, aToken = Cookies.get('atoken');
if(language) {
let languageObj = {
'mall_CN': 'zh-CN,zh;q=0.9',
'zh_CN': 'zh-CN,zh;q=0.9',
'en_US': 'en-US,en;q=0.5',
'zh_TW': 'zh-TW,zh;q=0.3',
// 'zh_ar': 'zh-AR,zh;q=0.9'
}
languageObj[language] && (config.headers['Accept-Language'] = languageObj[language]);
}
aToken && (config.headers.Authorization = aToken);
config.cancelToken = store.source.token
return config;
}, error => {
Message({
showClose: true,
message: error,
type: 'error.data.error.message'
})
return Promise.reject(error.data.msg)
}
)
// 跳转路由打断请求
router.beforeEach((to, from, next) => {
if (!to.matched.some(item => item.path === from.fullPath)) {
let CancelToken = axios.CancelToken;
store.source.cancel && store.source.cancel();
store.source = CancelToken.source();
}
next()
})
// 响应拦截器
Axios.interceptors.response.use(
res => {
if(res.data && !res.data.success) {
if(res.data.ecode && res.data.ecode != 200) {
Vue.prototype.removeStorge()
router.push({
path: '/'
})
Message({
showClose: true,
message: res.data.enote,
type: 'error'
})
return
} else {
// 非标准返回体
if(res.status == 200) {
return res;
}
}
if(res.data.code == 500) {
Message({
showClose: true,
message: res.data.msg,
type: 'error'
})
}
return Promise.reject(res.data.msg);
} else if(!res.data && res.status == 200) {
return res;
} else if(res.data.success && res.config.method != 'get') {
//
}
return res;
}
// , error => {
// return Promise.reject(error)
// }
)
export default function(method, url, data = null, config = null,bodyDelete) {
method = method.toLowerCase()
if(method == 'post') {
return Axios.post(url, data, config)
} else if(method == 'get') {
let defaultParam = {
_t: Date.parse(new Date()) / 1000
}
return Axios.get(url, { params: {...defaultParam, ...data}, config})
} else if(bodyDelete) {
return Axios.delete(url, { data: data }, config)
}else if(method == 'delete') {
return Axios.delete(url, { params: data }, config)
} else if(method == 'put') {
return Axios.put(url, data, config)
} else {
console.error('unknown method' + method)
return false
}
}
\ No newline at end of file \ No newline at end of file
// api接口统一出口
// 基本接口
import base from '@/api/base.js'
// 首页基础报表
import baseReport from '@/api/baseReport.js'
// 客流统计报表
import analysisReport from '@/api/analysis.js'
// 顾客行为报表
import customerReport from '@/api/customer.js'
// 精准客流报表
import flowReport from '@/api/flowReport.js'
// 后台管理
import management from '@/api/backendManage.js'
import login from '@/api/login.js'
// other
export default {
base,
baseReport,
analysisReport,
customerReport,
flowReport,
management,
login
}
// usage demo
/* this.$http.baseReport.accDReport({
orgIds: this.$cookie.get('accountId'),
date: this.searchTime,
chartIds: this.chartIds,
_t: Date.parse(new Date()) / 1000
}).then(res => {
// doSomething...
}) */
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
// base.js 定义基本的接口 account mall floor zone gate channel
const login = {
/**
* login
*/
userLogin(params, config) {
return req('post', '/users/login', params, config)
},
loginVideo(params, config, body) {
console.log(body)
return req('post', 'https://video.keliuyun.com:18443/webapi/login', params, config, body)
},
videoUrl(atoken,params, config) {
return req('post', '/webapi/v4/preview/view?tk=' + atoken, params, config)
}
}
export default login
\ No newline at end of file \ No newline at end of file
import req from '@/api/http.js'
const user = {
login: (data) => req('post', '/users/login', data),
// 获取应用 appid
getMenuApp: (param) => req('get', `${window._vionConfig.menuUrl}/api/v1/auth/apps`, param),
// 获取菜单节点
getMenuNode: (appId, param) => req('get', `${window._vionConfig.menuUrl}/api/v1/auth/apps/${appId}/menus`, param)
}
export default user;
\ No newline at end of file \ No newline at end of file
.base-analysis {
width: 100%;
}
/* 生成图片栏 */
.heatmap-img-div{
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.inside-bg-box {
margin: 0 auto;
}
.inside-bg-box:after,
.inside-bg-box:before {
content: '';
display: table;
}
.inside-bg-box:after {
clear: both;
}
.inside-bg-item {
float: left;
position: relative;
overflow: hidden;
margin-bottom: 10px;
}
/* .inside-bg-item:nth-child(2n) {
margin-left: 10px;
margin-right: 10px;
} */
.inside-bg-item+.inside-bg-item {
margin-left: 1%;
}
.inside-bg-item:nth-child(3n-2) {
margin-left: 0;
}
.area-img {
height: auto;
vertical-align: top;
width: 100%;
}
\ No newline at end of file \ No newline at end of file
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
html,
body,
ul,
li,
p,
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
padding: 0;
font-family: "PingFang SC", "Lantinghei SC", "Microsoft YaHei", "HanHei SC", "Helvetica Neue", "Open Sans", Arial, "Hiragino Sans GB", 微软雅黑, STHeiti, "WenQuanYi Micro Hei", SimSun, sans-serif;
}
body {
font-style: normal;
font-variant-ligatures: normal;
font-variant-caps: normal;
font-variant-numeric: normal;
font-variant-east-asian: normal;
font-weight: normal;
font-stretch: normal;
font-size: 14px;
}
ul li,
ol li,
dl li {
list-style: none;
}
a:link {
text-decoration: none;
/* 指正常的未被访问过的链接*/
}
a:visited {
text-decoration: none;
/*指已经访问过的链接*/
}
a:hover {
text-decoration: none;
/*指鼠标在链接*/
}
a:active {
text-decoration: none;
/* 指正在点的链接*/
}
input:-webkit-autofill,
textarea:-webkit-autofill,
select:-webkit-autofill {
background-color: rgb(255, 255, 255);
background-image: none;
color: rgb(0, 0, 0);
}
img {
border: none;
width: auto;
height: auto;
}
.qrcode-wrapper img{
width: 100% !important;
}
@font-face {
font-family: 'Nunito Sans';
font-style: normal;
font-weight: 300;
src: local('Nunito Sans Light'),local('NunitoSans-Light'),url(https://fonts.gstatic.com/s/nunitosans/v3/pe03MImSLYBIv1o4X1M8cc8WAc5tU1Q.ttf) format('truetype')
}
@font-face {
font-family: 'Nunito Sans';
font-style: normal;
font-weight: 400;
src: local('Nunito Sans Regular'),local('NunitoSans-Regular'),url(https://fonts.gstatic.com/s/nunitosans/v3/pe0qMImSLYBIv1o4X1M8cce9I94.ttf) format('truetype')
}
@font-face {
font-family: 'Nunito Sans';
font-style: normal;
font-weight: 600;
src: local('Nunito Sans SemiBold'),local('NunitoSans-SemiBold'),url(https://fonts.gstatic.com/s/nunitosans/v3/pe03MImSLYBIv1o4X1M8cc9iB85tU1Q.ttf) format('truetype')
}
@font-face {
font-family: 'Nunito Sans';
font-style: normal;
font-weight: 700;
src: local('Nunito Sans Bold'),local('NunitoSans-Bold'),url(https://fonts.gstatic.com/s/nunitosans/v3/pe03MImSLYBIv1o4X1M8cc8GBs5tU1Q.ttf) format('truetype')
}
@font-face {
font-family: 'Nunito Sans';
font-style: normal;
font-weight: 800;
src: local('Nunito Sans ExtraBold'),local('NunitoSans-ExtraBold'),url(https://fonts.gstatic.com/s/nunitosans/v3/pe03MImSLYBIv1o4X1M8cc8aBc5tU1Q.ttf) format('truetype')
}
.showbox-img{
height: 12px;
}
.rise-text {
color: green;
}
.decline-text {
color: red;
}
import Vue from 'vue'
import locale from 'element-ui/lib/locale'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n({
})
var lang = ['zh_CN','en_US','zh_TW','mall_CN']
function loadI18nMessages(lang) {
return import(/* webpackChunkName: "[request]" */`./langs/${lang}`).then(msg => {
i18n.setLocaleMessage(lang, msg.default)
i18n.locale = localStorage.getItem('lang') || 'mall_CN'
return Promise.resolve()
})
}
lang.forEach((item,index)=>{
loadI18nMessages(item).then(() => {
if(item=='mall_CN'){
locale.i18n((key, value) => i18n.t(key, value))
}
})
})
export default i18n
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="38px" viewBox="0 0 41 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图表" transform="translate(-2587.000000, -168.000000)" fill="#3BB8FF" fill-rule="nonzero">
<g id="图表-柱状图" transform="translate(2586.500000, 167.750000)">
<path d="M1.00380522,1.23245496 C1.00380522,1.17530805 1.02604462,1.11820475 1.07052341,1.07458266 C1.1150467,1.03100853 1.17333555,1.00922146 1.23167335,1.00922146 L2.67330387,1.00922146 C2.73163723,1.00922146 2.78992607,1.03100853 2.83445382,1.07458266 C2.87893261,1.11820039 2.90117201,1.17530369 2.90117201,1.23245496 L2.90117201,35.7065823 L41.2533383,35.7065823 C41.3116271,35.7065823 41.370005,35.7283694 41.4144393,35.7719915 C41.4589626,35.8155656 41.4812064,35.8727125 41.4812064,35.9298158 L41.4812064,37.3421249 C41.4812064,37.3992282 41.458967,37.4564187 41.4144393,37.4999492 C41.3699605,37.5435669 41.3116271,37.5653584 41.2533383,37.5653584 L1.00380522,37.5653584 L1.0038054,1.23245583 L1.00380522,1.23245496 Z M14.9179363,1.67892195 C14.9179363,1.50752484 14.9846545,1.33612337 15.1181887,1.20540098 C15.2516741,1.07463062 15.4266296,1.00922146 15.6015407,1.00922146 L21.8238432,1.00922146 C21.9987987,1.00922146 22.1737587,1.07458266 22.3071951,1.20540098 C22.4406804,1.33617133 22.5074476,1.50756844 22.5074476,1.67892195 L22.5074476,33.2281548 L14.9179348,33.2281548 L14.9179348,1.67892282 L14.9179363,1.67892195 Z M5.43105604,10.9728474 C5.43105604,10.8014503 5.49777423,10.6300489 5.63130852,10.4993265 C5.76479385,10.3685561 5.9397494,10.3031469 6.11466044,10.3031469 L12.3369644,10.3031469 C12.5119199,10.3031469 12.6868799,10.3685081 12.8203163,10.4993265 C12.9538016,10.6300968 13.0205688,10.8014939 13.0205688,10.9728474 L13.0205688,33.2282001 L5.43105533,33.2282001 L5.43105533,10.9728476 L5.43105604,10.9728474 Z M24.404861,20.2668165 C24.404861,20.0954194 24.4716281,19.9240179 24.6051135,19.7932956 C24.7385988,19.6625732 24.9135543,19.597116 25.0884654,19.597116 L31.3107693,19.597116 C31.4857249,19.597116 31.6606849,19.6625252 31.7941212,19.7932956 C31.9275576,19.9240659 31.9943737,20.095463 31.9943737,20.2668165 L31.9943737,33.2281998 L24.4048599,33.2281998 L24.4048599,20.266817 L24.404861,20.2668165 Z M33.8917412,29.560742 C33.8917412,29.3893449 33.9585084,29.2179434 34.0919937,29.087221 C34.225479,28.9564986 34.4004346,28.8910415 34.5753456,28.8910415 L40.7976495,28.8910415 C40.9726051,28.8910415 41.1475651,28.9564507 41.2810015,29.087221 C41.4144378,29.2179914 41.4812539,29.3893885 41.4812539,29.560742 L41.4812539,33.2282451 L33.8917394,33.2282451 L33.8917394,29.5607418 L33.8917412,29.560742 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="43px" height="41px" viewBox="0 0 43 41" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>relitu</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="relitu" fill="#3BB8FF" fill-rule="nonzero">
<path d="M40.4538246,24.0993808 C33.4641129,17.0310614 34.1722385,14.3364646 35.2034633,11.5139343 C36.2346881,8.69406935 33.7360547,-3.72612984 24.4711864,1.10335534 C15.206318,5.93284052 17.9661233,12.3988069 11.3587456,12.1082915 C4.74598286,11.8231067 -3.37457594,15.3306136 1.47191141,28.2812032 C3.36742646,33.3425677 6.96459707,38.2493459 12.5380575,38.9556448 C18.111518,39.664609 27.2659941,37.8602152 32.8394545,40.6027871 C38.4102225,43.3533548 47.4462289,31.1677002 40.4538246,24.0993808 Z M31.3343509,37.3538122 C26.6332582,35.1869406 18.9381133,36.4609438 14.2127881,35.9438798 C9.49015547,35.4268157 5.84721248,32.1618491 4.29364404,28.0813073 C0.319524418,17.6254186 8.00389935,14.6722897 13.6150547,14.837537 C19.2208251,15.0027843 16.8406613,8.5368179 24.7538981,4.53090387 C32.6644425,0.527655122 33.1706311,10.9009202 32.263261,13.2010558 C31.2131887,15.8556735 31.3101185,18.3716967 37.4328475,24.2806197 C43.2917122,29.9443372 36.0327512,39.5233492 31.3316584,37.3538122 L31.3343509,37.3538122 Z M7.8315798,21.7006299 C5.28717395,23.8701668 7.47078574,29.0034938 10.7475497,30.0536136 C14.0323911,31.109064 17.2741526,29.9496677 19.821251,27.7508127 C22.3629644,25.5492925 22.0264027,17.9799007 17.7964963,19.9442111 C13.5638973,21.9111869 13.0227062,17.2789324 7.83427229,21.7032952 L7.8315798,21.7006299 Z M26.2886191,7.14021181 C23.251487,7.91314266 20.3920595,12.963846 21.6144513,15.2080107 C22.8395356,17.4468449 25.4862562,21.4314367 24.6192735,24.3205989 C23.7576757,27.1991 24.398489,30.6959458 27.298304,31.7354045 C30.1981189,32.772198 36.3908527,32.4257117 36.468935,29.4006203 C36.5470173,26.3781942 29.1561241,23.1638679 28.9461097,18.222441 C28.7387877,13.2836794 31.2239587,5.88220022 26.2886191,7.14021181 Z" id="Shape"></path>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="34px" viewBox="0 0 41 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Mask</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M20.3315031,23.6379703 L20.3315031,33.3308137 C20.3312259,33.5077333 20.3993121,33.6774603 20.5206708,33.8023759 C20.6416861,33.9276113 20.8060576,33.9978929 20.9774068,33.9976663 L25.7260528,33.9976663 C25.8914068,33.9976663 26.0567609,33.9325695 26.1828307,33.8023759 C26.3041112,33.6774097 26.3721705,33.5077119 26.3719565,33.3308137 L26.371957,20.4137313 L21.5438199,24.7045795 L20.331545,23.6379703 L20.3315031,23.6379703 Z M0.039326087,33.3308137 C0.0390571872,33.5077486 0.107176376,33.6774827 0.22857764,33.8023759 C0.349580086,33.9276047 0.513936148,33.9978862 0.685271739,33.9976663 L5.43328882,33.9976663 C5.59860093,33.9976663 5.76395497,33.9325695 5.89002484,33.8023759 C6.01135531,33.6774338 6.07946173,33.5077315 6.0792764,33.3308137 L6.07927677,23.4427665 L0.039326087,28.5863221 L0.039326087,33.3308137 Z M10.1841568,19.9455451 L10.1841568,33.3307271 C10.1841568,33.5014331 10.2472127,33.672139 10.3733665,33.8022893 C10.494362,33.927534 10.6587189,33.9978315 10.8300606,33.997623 L15.5793773,33.997623 C15.7446894,33.997623 15.9100435,33.9324829 16.0360714,33.8022893 C16.1573869,33.6773439 16.2254652,33.5076363 16.2252391,33.3307271 L16.2252391,20.0291668 L13.2065217,17.3755635 L10.1841568,19.9455451 Z M30.4775916,33.3308137 C30.4773145,33.5077333 30.5454006,33.6774603 30.6667593,33.8023759 C30.7877486,33.927625 30.9521132,33.9979102 31.1234534,33.9976663 L35.8741118,33.9976663 C36.0395078,33.9976663 36.204778,33.9325695 36.3308478,33.8023759 C36.4521125,33.6773989 36.5201691,33.5077081 36.5199736,33.3308137 L36.519974,11.3935404 L30.4775916,16.7645885 L30.4775916,33.3308137 Z M29.435618,0.0343229771 C29.3481921,0.0343330264 29.2694463,0.0889029566 29.236325,0.172430676 C29.2032038,0.255958396 29.2222794,0.351869092 29.2846025,0.415165191 L33.8244596,5.02336031 L21.5436522,15.9398416 L13.2065637,8.60861817 L0.00469565217,19.8517953 L0.00469565217,24.7083884 L13.2066056,13.4659037 L21.543736,20.7957854 L36.3778882,7.61247275 L40.1288339,11.4208949 C40.1906566,11.4837596 40.2830032,11.5021415 40.3630345,11.4675133 C40.4430657,11.4328851 40.4951213,11.3520226 40.4950528,11.2624379 L40.4950528,0.256621603 C40.4951057,0.197631022 40.4724003,0.141047354 40.431955,0.0993764885 C40.391646,0.0576211883 40.3368681,0.0341907444 40.2797655,0.0342796947 L29.435618,0.0342796947 L29.435618,0.0343229771 Z" id="path-1"></path>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="折线图" transform="translate(-2664.000000, -171.000000)">
<g id="图表-折线图" transform="translate(2664.000000, 171.000000)">
<g id="Shape">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#3BB8FF" fill-rule="nonzero" xlink:href="#path-1"></use>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="34px" viewBox="0 0 41 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图表" transform="translate(-2740.000000, -171.000000)" fill="#3BB8FF" fill-rule="nonzero">
<g id="图表-表格" transform="translate(2740.500000, 171.000000)">
<path d="M37.5977647,0.00362136345 L2.90223529,0.00362136345 C1.31202353,0.00362136345 0.0109411762,1.27503038 0.0109411762,2.82897474 L0.0109411762,31.0825085 C0.0109411762,32.6364529 1.31202353,33.9078619 2.90223529,33.9078619 L37.5977647,33.9078619 C39.1879765,33.9078619 40.4890588,32.6364529 40.4890588,31.0825085 L40.4890588,2.82897474 C40.4890588,1.27503038 39.1879765,0.00362136345 37.5977647,0.00362136345 Z M13.0217647,31.0825085 L2.90223529,31.0825085 L2.90223529,24.0191251 L13.0217647,24.0191251 L13.0217647,31.0825085 Z M13.0217647,21.1937717 L2.90223529,21.1937717 L2.90223529,14.1303882 L13.0217647,14.1303882 L13.0217647,21.1937717 Z M13.0217647,11.3050349 L2.90223529,11.3050349 L2.90223529,4.24165143 L13.0217647,4.24165143 L13.0217647,11.3050349 Z M24.5869412,31.0825085 L15.9130588,31.0825085 L15.9130588,24.0191251 L24.5869412,24.0191251 L24.5869412,31.0825085 Z M24.5869412,21.1937717 L15.9130588,21.1937717 L15.9130588,14.1303882 L24.5869412,14.1303882 L24.5869412,21.1937717 Z M24.5869412,11.3050349 L15.9130588,11.3050349 L15.9130588,4.24165143 L24.5869412,4.24165143 L24.5869412,11.3050349 Z M37.5977647,31.0825085 L27.4782353,31.0825085 L27.4782353,24.0191251 L37.5977647,24.0191251 L37.5977647,31.0825085 Z M37.5977647,21.1937717 L27.4782353,21.1937717 L27.4782353,14.1303882 L37.5977647,14.1303882 L37.5977647,21.1937717 Z M37.5977647,11.3050349 L27.4782353,11.3050349 L27.4782353,4.24165143 L37.5977647,4.24165143 L37.5977647,11.3050349 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="38px" viewBox="0 0 41 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>mdpi/图表 柱状图</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图表" transform="translate(-2587.000000, -168.000000)" fill="#DBDBDB" fill-rule="nonzero">
<g id="图表-柱状图" transform="translate(2587.500000, 168.750000)">
<path d="M0.00380521978,0.232454958 C0.00380521978,0.175308055 0.0260446154,0.118204752 0.0705234066,0.0745826598 C0.115046703,0.0310085278 0.173335549,0.0092214618 0.231673352,0.0092214618 L1.67330387,0.0092214618 C1.73163723,0.0092214618 1.78992607,0.0310085278 1.83445382,0.0745826598 C1.87893261,0.118200392 1.90117201,0.175303695 1.90117201,0.232454958 L1.90117201,34.7065823 L40.2533383,34.7065823 C40.3116271,34.7065823 40.370005,34.7283694 40.4144393,34.7719915 C40.4589626,34.8155656 40.4812064,34.8727125 40.4812064,34.9298158 L40.4812064,36.3421249 C40.4812064,36.3992282 40.458967,36.4564187 40.4144393,36.4999492 C40.3699605,36.5435669 40.3116271,36.5653584 40.2533383,36.5653584 L0.00380521978,36.5653584 L0.0038053978,0.23245583 L0.00380521978,0.232454958 Z M13.9179363,0.67892195 C13.9179363,0.507524841 13.9846545,0.336123373 14.1181887,0.205400977 C14.2516741,0.0746306202 14.4266296,0.0092214618 14.6015407,0.0092214618 L20.8238432,0.0092214618 C20.9987987,0.0092214618 21.1737587,0.0745826598 21.3071951,0.205400977 C21.4406804,0.336171333 21.5074476,0.507568442 21.5074476,0.67892195 L21.5074476,32.2281548 L13.9179348,32.2281548 L13.9179348,0.678922822 L13.9179363,0.67892195 Z M4.43105604,9.97284744 C4.43105604,9.80145033 4.49777423,9.63004886 4.63130852,9.49932646 C4.76479385,9.36855611 4.9397494,9.30314695 5.11466044,9.30314695 L11.3369644,9.30314695 C11.5119199,9.30314695 11.6868799,9.36850815 11.8203163,9.49932646 C11.9538016,9.63009682 12.0205688,9.80149393 12.0205688,9.97284744 L12.0205688,32.2282001 L4.43105533,32.2282001 L4.43105533,9.97284761 L4.43105604,9.97284744 Z M23.404861,19.2668165 C23.404861,19.0954194 23.4716281,18.9240179 23.6051135,18.7932956 C23.7385988,18.6625732 23.9135543,18.597116 24.0884654,18.597116 L30.3107693,18.597116 C30.4857249,18.597116 30.6606849,18.6625252 30.7941212,18.7932956 C30.9275576,18.9240659 30.9943737,19.095463 30.9943737,19.2668165 L30.9943737,32.2281998 L23.4048599,32.2281998 L23.4048599,19.266817 L23.404861,19.2668165 Z M32.8917412,28.560742 C32.8917412,28.3893449 32.9585084,28.2179434 33.0919937,28.087221 C33.225479,27.9564986 33.4004346,27.8910415 33.5753456,27.8910415 L39.7976495,27.8910415 C39.9726051,27.8910415 40.1475651,27.9564507 40.2810015,28.087221 C40.4144378,28.2179914 40.4812539,28.3893885 40.4812539,28.560742 L40.4812539,32.2282451 L32.8917394,32.2282451 L32.8917394,28.5607418 L32.8917412,28.560742 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="43px" height="41px" viewBox="0 0 43 41" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>relitu copy</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="relitu-copy" fill="#DBDBDB" fill-rule="nonzero">
<path d="M40.4538246,24.0993808 C33.4641129,17.0310614 34.1722385,14.3364646 35.2034633,11.5139343 C36.2346881,8.69406935 33.7360547,-3.72612984 24.4711864,1.10335534 C15.206318,5.93284052 17.9661233,12.3988069 11.3587456,12.1082915 C4.74598286,11.8231067 -3.37457594,15.3306136 1.47191141,28.2812032 C3.36742646,33.3425677 6.96459707,38.2493459 12.5380575,38.9556448 C18.111518,39.664609 27.2659941,37.8602152 32.8394545,40.6027871 C38.4102225,43.3533548 47.4462289,31.1677002 40.4538246,24.0993808 Z M31.3343509,37.3538122 C26.6332582,35.1869406 18.9381133,36.4609438 14.2127881,35.9438798 C9.49015547,35.4268157 5.84721248,32.1618491 4.29364404,28.0813073 C0.319524418,17.6254186 8.00389935,14.6722897 13.6150547,14.837537 C19.2208251,15.0027843 16.8406613,8.5368179 24.7538981,4.53090387 C32.6644425,0.527655122 33.1706311,10.9009202 32.263261,13.2010558 C31.2131887,15.8556735 31.3101185,18.3716967 37.4328475,24.2806197 C43.2917122,29.9443372 36.0327512,39.5233492 31.3316584,37.3538122 L31.3343509,37.3538122 Z M7.8315798,21.7006299 C5.28717395,23.8701668 7.47078574,29.0034938 10.7475497,30.0536136 C14.0323911,31.109064 17.2741526,29.9496677 19.821251,27.7508127 C22.3629644,25.5492925 22.0264027,17.9799007 17.7964963,19.9442111 C13.5638973,21.9111869 13.0227062,17.2789324 7.83427229,21.7032952 L7.8315798,21.7006299 Z M26.2886191,7.14021181 C23.251487,7.91314266 20.3920595,12.963846 21.6144513,15.2080107 C22.8395356,17.4468449 25.4862562,21.4314367 24.6192735,24.3205989 C23.7576757,27.1991 24.398489,30.6959458 27.298304,31.7354045 C30.1981189,32.772198 36.3908527,32.4257117 36.468935,29.4006203 C36.5470173,26.3781942 29.1561241,23.1638679 28.9461097,18.222441 C28.7387877,13.2836794 31.2239587,5.88220022 26.2886191,7.14021181 Z" id="Shape"></path>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="34px" viewBox="0 0 41 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图表" transform="translate(-2664.000000, -171.000000)" fill="#DBDBDB" fill-rule="nonzero">
<g id="图表-折线图" transform="translate(2664.000000, 171.000000)">
<path d="M20.3315031,23.6379703 L20.3315031,33.3308137 C20.3312259,33.5077333 20.3993121,33.6774603 20.5206708,33.8023759 C20.6416861,33.9276113 20.8060576,33.9978929 20.9774068,33.9976663 L25.7260528,33.9976663 C25.8914068,33.9976663 26.0567609,33.9325695 26.1828307,33.8023759 C26.3041112,33.6774097 26.3721705,33.5077119 26.3719565,33.3308137 L26.371957,20.4137313 L21.5438199,24.7045795 L20.331545,23.6379703 L20.3315031,23.6379703 Z M0.039326087,33.3308137 C0.0390571872,33.5077486 0.107176376,33.6774827 0.22857764,33.8023759 C0.349580086,33.9276047 0.513936148,33.9978862 0.685271739,33.9976663 L5.43328882,33.9976663 C5.59860093,33.9976663 5.76395497,33.9325695 5.89002484,33.8023759 C6.01135531,33.6774338 6.07946173,33.5077315 6.0792764,33.3308137 L6.07927677,23.4427665 L0.039326087,28.5863221 L0.039326087,33.3308137 Z M10.1841568,19.9455451 L10.1841568,33.3307271 C10.1841568,33.5014331 10.2472127,33.672139 10.3733665,33.8022893 C10.494362,33.927534 10.6587189,33.9978315 10.8300606,33.997623 L15.5793773,33.997623 C15.7446894,33.997623 15.9100435,33.9324829 16.0360714,33.8022893 C16.1573869,33.6773439 16.2254652,33.5076363 16.2252391,33.3307271 L16.2252391,20.0291668 L13.2065217,17.3755635 L10.1841568,19.9455451 Z M30.4775916,33.3308137 C30.4773145,33.5077333 30.5454006,33.6774603 30.6667593,33.8023759 C30.7877486,33.927625 30.9521132,33.9979102 31.1234534,33.9976663 L35.8741118,33.9976663 C36.0395078,33.9976663 36.204778,33.9325695 36.3308478,33.8023759 C36.4521125,33.6773989 36.5201691,33.5077081 36.5199736,33.3308137 L36.519974,11.3935404 L30.4775916,16.7645885 L30.4775916,33.3308137 Z M29.435618,0.0343229771 C29.3481921,0.0343330264 29.2694463,0.0889029566 29.236325,0.172430676 C29.2032038,0.255958396 29.2222794,0.351869092 29.2846025,0.415165191 L33.8244596,5.02336031 L21.5436522,15.9398416 L13.2065637,8.60861817 L0.00469565217,19.8517953 L0.00469565217,24.7083884 L13.2066056,13.4659037 L21.543736,20.7957854 L36.3778882,7.61247275 L40.1288339,11.4208949 C40.1906566,11.4837596 40.2830032,11.5021415 40.3630345,11.4675133 C40.4430657,11.4328851 40.4951213,11.3520226 40.4950528,11.2624379 L40.4950528,0.256621603 C40.4951057,0.197631022 40.4724003,0.141047354 40.431955,0.0993764885 C40.391646,0.0576211883 40.3368681,0.0341907444 40.2797655,0.0342796947 L29.435618,0.0342796947 L29.435618,0.0343229771 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="41px" height="34px" viewBox="0 0 41 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="折线图" transform="translate(-2740.000000, -171.000000)" fill="#DBDBDB" fill-rule="nonzero">
<g id="图表-表格" transform="translate(2739.500000, 171.000000)">
<path d="M38.5977647,0.00362136345 L3.90223529,0.00362136345 C2.31202353,0.00362136345 1.01094118,1.27503038 1.01094118,2.82897474 L1.01094118,31.0825085 C1.01094118,32.6364529 2.31202353,33.9078619 3.90223529,33.9078619 L38.5977647,33.9078619 C40.1879765,33.9078619 41.4890588,32.6364529 41.4890588,31.0825085 L41.4890588,2.82897474 C41.4890588,1.27503038 40.1879765,0.00362136345 38.5977647,0.00362136345 Z M14.0217647,31.0825085 L3.90223529,31.0825085 L3.90223529,24.0191251 L14.0217647,24.0191251 L14.0217647,31.0825085 Z M14.0217647,21.1937717 L3.90223529,21.1937717 L3.90223529,14.1303882 L14.0217647,14.1303882 L14.0217647,21.1937717 Z M14.0217647,11.3050349 L3.90223529,11.3050349 L3.90223529,4.24165143 L14.0217647,4.24165143 L14.0217647,11.3050349 Z M25.5869412,31.0825085 L16.9130588,31.0825085 L16.9130588,24.0191251 L25.5869412,24.0191251 L25.5869412,31.0825085 Z M25.5869412,21.1937717 L16.9130588,21.1937717 L16.9130588,14.1303882 L25.5869412,14.1303882 L25.5869412,21.1937717 Z M25.5869412,11.3050349 L16.9130588,11.3050349 L16.9130588,4.24165143 L25.5869412,4.24165143 L25.5869412,11.3050349 Z M38.5977647,31.0825085 L28.4782353,31.0825085 L28.4782353,24.0191251 L38.5977647,24.0191251 L38.5977647,31.0825085 Z M38.5977647,21.1937717 L28.4782353,21.1937717 L28.4782353,14.1303882 L38.5977647,14.1303882 L38.5977647,21.1937717 Z M38.5977647,11.3050349 L28.4782353,11.3050349 L28.4782353,4.24165143 L38.5977647,4.24165143 L38.5977647,11.3050349 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file \ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 23"><defs><style>.cls-1{fill:#6784e3;}</style></defs><title>资源 1</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M22.57,20.61c1.2-.21,1.94-.87,1.94-2.65a6.55,6.55,0,0,0-5-6.29,6.87,6.87,0,0,1,1.74-.22A6.62,6.62,0,0,1,28,18c0,3.17-2.33,2.79-5.43,2.65ZM21.28,10.09a4.11,4.11,0,0,1-1.74-.38,3.84,3.84,0,0,0,0-7,4.12,4.12,0,0,1,1.74-.39,4,4,0,0,1,4,3.89,4,4,0,0,1-4,3.89ZM3.49,18c0,1.78.74,2.44,1.94,2.65C2.33,20.74,0,21.12,0,18a6.62,6.62,0,0,1,6.72-6.51,6.9,6.9,0,0,1,1.74.22,6.55,6.55,0,0,0-5,6.29Zm5-8.25a4.12,4.12,0,0,1-1.74.38,4,4,0,0,1-4-3.89,4,4,0,0,1,4-3.89,4.12,4.12,0,0,1,1.74.39,3.84,3.84,0,0,0,0,7Zm5.67,0a4.94,4.94,0,0,1-5-4.87,5,5,0,0,1,5-4.87,5,5,0,0,1,5,4.87h0a4.94,4.94,0,0,1-5,4.86Zm0,13.11c-4.64,0-8.41,1.22-8.41-3.28a8.28,8.28,0,0,1,8.41-8.15,8.28,8.28,0,0,1,8.4,8.15c0,4.5-3.76,3.28-8.4,3.28Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><defs><style>.cls-1{fill:#3bb8ff;}</style></defs><title>资源 2</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M13.47,11.52V0A11.65,11.65,0,0,1,25,11.52Zm9.57,2A11.52,11.52,0,1,1,11.52,2V13.48Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 26"><defs><style>.cls-1{fill:#ff9631;}</style></defs><title>资源 3</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M20.48,26h-19A1.52,1.52,0,0,1,0,24.47V1.53A1.52,1.52,0,0,1,1.52,0H17l5,5.35V24.47A1.52,1.52,0,0,1,20.48,26ZM14.41,5,11,11,7.58,5H5.31l4.17,6.88H5.69v1.91H9.86v1.91H5.69v1.91H9.86V21h2.27V17.59h4.17V15.68H12.14V13.77h4.17V11.85h-3.8L16.69,5Zm2.66-3.44V4.59a.76.76,0,0,0,.76.76h3L17.07,1.53Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23"><defs><style>.cls-1{fill:#ffc62e;}</style></defs><title>资源 4</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M8.37,0H2.09A2.09,2.09,0,0,0,0,2.09V8.37a2.38,2.38,0,0,0,2,2.45H8.79c1.15,0,2-1.55,2-2.71V2A2.38,2.38,0,0,0,8.37,0ZM20.91,0H14.63a2.38,2.38,0,0,0-2.45,2V8.11c0,1.15.88,2.71,2,2.71H21a2.38,2.38,0,0,0,2-2.45V2.09A2.09,2.09,0,0,0,20.91,0ZM8.79,12.18H2a2.38,2.38,0,0,0-2,2.45V20.9A2.1,2.1,0,0,0,2.09,23H8.37a2.38,2.38,0,0,0,2.45-2V14.2a2,2,0,0,0-2-2Zm12.18,0H14.21a2,2,0,0,0-2,2V21a2.38,2.38,0,0,0,2.45,2h6.28A2.1,2.1,0,0,0,23,20.9V14.63a2.38,2.38,0,0,0-2-2.45Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27 24"><defs><style>.cls-1{fill:#87d14b;}</style></defs><title>资源 5</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M27,10a3.38,3.38,0,0,1-6.75,0h0a3.38,3.38,0,0,1-6.75,0h0a3.38,3.38,0,0,1-6.75,0h0A3.38,3.38,0,0,1,0,10H0L2.39,3.72H24.67L27,10Zm-4.24-7.5H4.23A1.28,1.28,0,0,1,2.94,1.2,1.23,1.23,0,0,1,4.23,0H22.76a1.28,1.28,0,0,1,1.29,1.26,1.23,1.23,0,0,1-1.29,1.2Zm-19,12h0a.79.79,0,0,0,.37-.06h.06a.23.23,0,0,0,.18-.06l.68-.18h0v6.12H22V14.16h0l.68.18a.23.23,0,0,1,.18.06h.06c.12,0,.25.06.37.06h.43a4.13,4.13,0,0,0,.86-.06v8.34A1.28,1.28,0,0,1,23.26,24H3.8a1.28,1.28,0,0,1-1.29-1.26V14.4a3.86,3.86,0,0,0,.86.06Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><style>.cls-1{fill:#7460ee;}</style></defs><title>资源 6</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M22.65,24H1.34A1.26,1.26,0,0,1,0,22.83v-.32a1.26,1.26,0,0,1,1.34-1.17H3.44V1.65A1.64,1.64,0,0,1,5.06,0H18.94a1.62,1.62,0,0,1,1.62,1.65v19.7h2.14A1.25,1.25,0,0,1,24,22.51v.32A1.26,1.26,0,0,1,22.65,24ZM17,3.62H7.08V21.11L17,16.6v-13ZM11.47,11.1H10v.56a.55.55,0,1,1-1.11,0V10.53A.54.54,0,0,1,9.41,10h2.06a.56.56,0,0,1,0,1.13Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 23"><defs><style>.cls-1{fill:#6784e3;}</style></defs><title>资源 1</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M22.57,20.61c1.2-.21,1.94-.87,1.94-2.66a6.55,6.55,0,0,0-5-6.29,6.88,6.88,0,0,1,1.74-.22A6.62,6.62,0,0,1,28,18c0,3.17-2.34,2.79-5.43,2.66ZM21.28,10.09a4.13,4.13,0,0,1-1.74-.38,3.84,3.84,0,0,0,0-7,4.09,4.09,0,0,1,1.74-.38,4,4,0,0,1,4,3.89,4,4,0,0,1-4,3.89ZM3.49,18c0,1.78.74,2.44,1.94,2.66C2.33,20.74,0,21.12,0,18a6.62,6.62,0,0,1,6.72-6.51,6.92,6.92,0,0,1,1.75.22,6.55,6.55,0,0,0-5,6.29Zm5-8.25a4.15,4.15,0,0,1-1.75.38,4,4,0,0,1-4-3.89,4,4,0,0,1,4-3.89,4.11,4.11,0,0,1,1.75.38,3.84,3.84,0,0,0,0,7Zm5.67,0a5,5,0,0,1-5-4.87,5,5,0,0,1,5-4.87,5,5,0,0,1,5,4.87h0a4.94,4.94,0,0,1-5,4.86Zm0,13.11c-4.64,0-8.41,1.22-8.41-3.28a8.28,8.28,0,0,1,8.41-8.15,8.28,8.28,0,0,1,8.41,8.15c0,4.5-3.76,3.28-8.41,3.28Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><defs><style>.cls-1{fill:#3bb8ff;}</style></defs><title>资源 2</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M13.48,11.52V0A11.65,11.65,0,0,1,25,11.52Zm9.57,2A11.52,11.52,0,1,1,11.52,2V13.47Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 26"><defs><style>.cls-1{fill:#ff9631;}</style></defs><title>资源 3</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M20.48,26h-19A1.52,1.52,0,0,1,0,24.47V1.53A1.52,1.52,0,0,1,1.52,0H17l5,5.35V24.47A1.52,1.52,0,0,1,20.48,26ZM14.41,5,11,11,7.59,5H5.31l4.17,6.88H5.69v1.91H9.86v1.91H5.69v1.91H9.86V21h2.28V17.59h4.17V15.68H12.14V13.76h4.17V11.85H12.52L16.69,5Zm2.65-3.44V4.59a.76.76,0,0,0,.76.77h3L17.07,1.53Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23"><defs><style>.cls-1{fill:#ffc62e;}</style></defs><title>资源 4</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M8.37,0H2.09A2.1,2.1,0,0,0,0,2.09V8.37a2.38,2.38,0,0,0,2,2.45H8.79c1.15,0,2-1.55,2-2.71V2A2.38,2.38,0,0,0,8.37,0ZM20.91,0H14.63a2.38,2.38,0,0,0-2.45,2V8.12c0,1.15.88,2.71,2,2.71H21a2.38,2.38,0,0,0,2-2.45V2.09A2.09,2.09,0,0,0,20.91,0ZM8.79,12.18H2a2.38,2.38,0,0,0-2,2.45v6.28A2.09,2.09,0,0,0,2.09,23H8.37a2.38,2.38,0,0,0,2.45-2V14.21a2,2,0,0,0-2-2Zm12.18,0H14.21a2,2,0,0,0-2,2V21a2.38,2.38,0,0,0,2.45,2h6.28A2.09,2.09,0,0,0,23,20.91V14.63a2.38,2.38,0,0,0-2-2.45Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27 24"><defs><style>.cls-1{fill:#87d14b;}</style></defs><title>资源 5</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M27,10a3.38,3.38,0,0,1-6.75,0h0a3.38,3.38,0,0,1-6.75,0h0a3.38,3.38,0,0,1-6.75,0h0A3.38,3.38,0,0,1,0,10H0L2.39,3.72H24.67L27,10Zm-4.23-7.5H4.24A1.28,1.28,0,0,1,2.95,1.2,1.23,1.23,0,0,1,4.24,0H22.77a1.28,1.28,0,0,1,1.29,1.26,1.23,1.23,0,0,1-1.29,1.2Zm-19,12h0a.83.83,0,0,0,.37-.06h.06a.22.22,0,0,0,.18-.06l.67-.18h0v6.12H22V14.16h0l.67.18a.23.23,0,0,1,.18.06h.06c.12,0,.25.06.37.06h.43a4.29,4.29,0,0,0,.86-.06v8.34A1.28,1.28,0,0,1,23.26,24H3.81a1.28,1.28,0,0,1-1.29-1.26V14.4a4,4,0,0,0,.86.06Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><style>.cls-1{fill:#7460ee;}</style></defs><title>资源 6</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M22.66,24H1.34A1.26,1.26,0,0,1,0,22.83v-.32a1.26,1.26,0,0,1,1.34-1.17h2.1V1.65A1.64,1.64,0,0,1,5.06,0H18.94a1.62,1.62,0,0,1,1.62,1.65v19.7H22.7A1.25,1.25,0,0,1,24,22.51v.32A1.26,1.26,0,0,1,22.66,24ZM17,3.62H7.08V21.11L17,16.6v-13Zm-5.5,7.48H10v.56a.55.55,0,1,1-1.11,0V10.53A.54.54,0,0,1,9.41,10h2.06a.56.56,0,0,1,0,1.13Z"/></g></g></svg>
\ No newline at end of file \ No newline at end of file
This diff is collapsed. Click to expand it.
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
No preview for this file type
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!