Commit 69b7f885 authored by lijin's avatar lijin

Initial commit

parents
Pipeline #1360 failed with stages
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins":["transform-vue-jsx", "transform-runtime"]
}
# http://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
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
build/*.js
config/*.js
src/
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true,
},
extends: ['plugin:vue/recommended', 'eslint:recommended'],
// add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/name-property-casing": ["error", "PascalCase"],
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
'eqeqeq': [2, 'allow-null'],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
'new-cap': [2, {
'newIsCap': true,
'capIsNew': false
}],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 2,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 2,
'no-unsafe-finally': 2,
'no-unused-vars': [2, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
yarn.lock
.history
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
.history*
package-lock.json
// 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": {}
}
}
language: node_js
node_js: stable
script: npm run test
notifications:
email: false
MIT License
Copyright (c) 2017-present PanJiaChen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# vue-admin-template
> 这是一个 极简的 vue admin 管理后台 它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。
[线上地址](http://panjiachen.github.io/vue-admin-template)
[国内访问](https://panjiachen.gitee.io/vue-admin-template)
## Extra
如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
本项目基于`webpack4`开发,若还想使用`webpack3`开发,请使用该分支[webpack3](https://github.com/PanJiaChen/vue-admin-template/tree/webpack3)
如果你想使用基于 vue + typescript 的管理后台, 可以看看这个项目: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour))
## 相关项目
[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目:
- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
## Build Setup
```bash
# Clone project
git clone https://github.com/PanJiaChen/vue-admin-template.git
# Install dependencies
npm install
# 建议不要用cnpm 安装有各种诡异的bug 可以通过如下操作解决npm速度慢的问题
npm install --registry=https://registry.npm.taobao.org
# Serve with hot reload at localhost:9528
npm run dev
# Build for production with minification
npm run build
# Build for production and view the bundle analyzer report
npm run build --report
```
## Demo
![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
### Element-Ui 使用 cdn 教程
首先找到 `index.html` ([根目录下](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/index.html))
引入 Element 的 css 和 js ,并且引入 vue 。因为 Element-Ui 是依赖 vue 的,所以必须在它之前引入 vue 。
之后找到 [webpack.base.conf.js](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/build/webpack.base.conf.js) 加入 `externals` 让 webpack 不打包 vue 和 element
```
externals: {
vue: 'Vue',
'element-ui':'ELEMENT'
}
```
之后还有一个小细节是如果你用了全局对象方式引入 vue,就不需要 手动 `Vue.use(Vuex)` ,它会自动挂载,具体见 [issue](https://github.com/vuejs/vuex/issues/731)
最终你可以使用 `npm run build --report` 查看效果
如图:
![demo](https://panjiachen.github.io/images/element-cdn.png)
**[具体代码](https://github.com/PanJiaChen/vue-admin-template/commit/746aff560932704ae821f82f10b8b2a9681d5177)**
**[对应分支](https://github.com/PanJiaChen/vue-admin-template/tree/element-ui-cdn)**
## Browsers support
Modern browsers and Internet Explorer 10+.
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| --------- | --------- | --------- | --------- |
| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
## License
[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
Copyright (c) 2017-present PanJiaChen
# vue-admin-template
> A minimal vue admin template with Element UI & axios & iconfont & permission control & lint
**Live demo:** http://panjiachen.github.io/vue-admin-template
[中文文档](https://github.com/PanJiaChen/vue-admin-template/blob/master/README-zh.md)
## Build Setup
```bash
# Clone project
git clone https://github.com/PanJiaChen/vue-admin-template.git
# Install dependencies
npm install
# Serve with hot reload at localhost:9528
npm run dev
# Build for production with minification
npm run build
# Build for production and view the bundle analyzer report
npm run build --report
```
## Demo
![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
## Extra
If you want router permission && generate menu by user roles , you can use this branch [permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
This project is based on `webpack4` development. If you want to use `webpack3` development, please use this branch [webpack3](https://github.com/PanJiaChen/vue-admin-template/tree/webpack3)
For `typescript` version, you can use [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour))
## Related Project
[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
### Element-Ui using cdn tutorial
First find `index.html`([root directory](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/index.html))
Import css and js of `Element`, and then import vue. Because `Element` is vue-dependent, vue must be import before it.
Then find [webpack.base.conf.js](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/build/webpack.base.conf.js)
Add `externals` to make webpack not package vue and element.
```
externals: {
vue: 'Vue',
'element-ui':'ELEMENT'
}
```
Finally there is a small detail to pay attention to that if you import vue in global, you don't need to manually `Vue.use(Vuex)`, it will be automatically mounted, see
[issue](https://github.com/vuejs/vuex/issues/731)
And you can use `npm run build --report` to see the effect
Pictured:
![demo](https://panjiachen.github.io/images/element-cdn.png)
**[Detailed code](https://github.com/PanJiaChen/vue-admin-template/commit/746aff560932704ae821f82f10b8b2a9681d5177)**
**[Branch](https://github.com/PanJiaChen/vue-admin-template/tree/element-ui-cdn)**
## Browsers support
Modern browsers and Internet Explorer 10+.
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| --------- | --------- | --------- | --------- |
| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
## License
[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
Copyright (c) 2017-present PanJiaChen
'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,
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 MiniCssExtractPlugin = require('mini-css-extract-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 = []
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
loaders.push(MiniCssExtractPlugin.loader)
} else {
loaders.push('vue-style-loader')
}
loaders.push(cssLoader)
if (options.usePostCSS) {
loaders.push(postcssLoader)
}
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
return 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')
})
}
}
'use strict'
module.exports = {
//You can set the vue-loader configuration by yourself.
}
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const { VueLoaderPlugin } = require('vue-loader')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
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: {
'@': resolve('src')
}
},
module: {
rules: [
// ...(config.dev.useEslint ? [createLintingRule()] : []),
{
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: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
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]')
}
}
]
},
plugins: [new VueLoaderPlugin()],
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'
}
}
'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 HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
mode: 'development',
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,
compress: true,
host: HOST || config.dev.host,
port: 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
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'vue-admin-template'
})
]
})
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://${
devWebpackConfig.devServer.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 ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
const env = require('../config/prod.env')
// For NamedChunksPlugin
const seen = new Set()
const nameLength = 4
const webpackConfig = merge(baseWebpackConfig, {
mode: 'production',
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:8].js'),
chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
// extract css into its own file
new MiniCssExtractPlugin({
filename: utils.assetsPath('css/[name].[contenthash:8].css'),
chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css')
}),
// 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,
favicon: resolve('favicon.ico'),
title: 'vue-admin-template',
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
}
// default sort mode uses toposort which cannot handle cyclic deps
// in certain cases, and in webpack 4, chunk order in HTML doesn't
// matter anyway
}),
new ScriptExtHtmlWebpackPlugin({
//`runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}),
// keep chunk.id stable when chunk has no name
new webpack.NamedChunksPlugin(chunk => {
if (chunk.name) {
return chunk.name
}
const modules = Array.from(chunk.modulesIterable)
if (modules.length > 1) {
const hash = require('hash-sum')
const joinedHash = hash(modules.map(m => m.id).join('_'))
let len = nameLength
while (seen.has(joinedHash.substr(0, len))) len++
seen.add(joinedHash.substr(0, len))
return `chunk-${joinedHash.substr(0, len)}`
} else {
return modules[0].id
}
}),
// keep module.id stable when vender modules does not change
new webpack.HashedModuleIdsPlugin(),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
],
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // 只打包初始时依赖的第三方
},
elementUI: {
name: 'chunk-elementUI', // 单独将 elementUI 拆包
priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
test: /[\\/]node_modules[\\/]element-ui[\\/]/
}
}
},
runtimeChunk: 'single',
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
mangle: {
safari10: true
}
},
sourceMap: config.build.productionSourceMap,
cache: true,
parallel: true
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSAssetsPlugin()
]
}
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp(
'\\.(' + config.build.productionGzipExtensions.join('|') + ')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin
if (config.build.bundleAnalyzerReport) {
webpackConfig.plugins.push(
new BundleAnalyzerPlugin({
analyzerPort: 8080,
generateStatsFile: false
})
)
}
if (config.build.generateAnalyzerReport) {
webpackConfig.plugins.push(
new BundleAnalyzerPlugin({
analyzerMode: 'static',
reportFilename: 'bundle-report.html',
openAnalyzer: false
})
)
}
}
module.exports = webpackConfig
"use strict";
const merge = require("webpack-merge");
const prodEnv = require("./prod.env");
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
// BASE_API: '"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',
// BASE_API: '"http://bullcms.com"',
BASE_API: '"http://cmstest.huolea.com"',
ZX_NMS_BASE_API: '"http://api.nms.com"',
// CLOND_API: '"http://api.nms.huolea.com"',
CLOND_API: '"http://apitest.nms.huolea.com"',
// BXDD_API: '"http://localhost:9311"',
BXDD_API: '"http://data-api.zhangxinhulian.com"',
PACK_API: '"http://packing.zhangxindiet.com"',
PUTIN_API: '"http://api.putin.zhangxindiet.com"',
// PUTIN_API: '"http://localhost:9314"',
AD_API: '"http://adsptest.huolea.com"',
});
'use strict'
// Template version: 1.2.6
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 9528, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: false,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-source-map',
// 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
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
/**
* You can set by youself according to actual condition
* You will need to set this if you plan to deploy your site under a sub path,
* for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then assetsPublicPath should be set to "/bar/".
* In most cases please use '/' !!!
*/
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: 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 || false,
// `npm run build:prod --generate_report`
generateAnalyzerReport: process.env.npm_config_generate_report || false
}
}
"use strict";
let ZX_NMS_BASE_API = "";
let BASE_API = "";
let CLOND_API = "";
let BXDD_API = "";
let PUTIN_API = "";
let AD_API = '';
const idx = process.argv.indexOf("test");
if (idx > 0) {
ZX_NMS_BASE_API = '"http://apitest.nms.huolea.com"';
BASE_API = '"http://cms.huolea.com:8888"';
CLOND_API = '"http://apitest.nms.huolea.com"';
BXDD_API = '"http://localhost:9311"';
PUTIN_API = '"http://api.putin.zhangxindiet.com"';
AD_API = '"http://adsptest.huolea.com"';
} else {
ZX_NMS_BASE_API = '"http://api.nms.huolea.com"';
BASE_API = '"http://cms.huolea.com"';
CLOND_API = '"http://api.nms.huolea.com"';
BXDD_API = '"http://data-api.zhangxinhulian.com"';
PUTIN_API = '"http://api.putin.zhangxindiet.com"';
AD_API = '"http://adsp.zhangxindiet.com"';
}
console.log("==============", BASE_API);
console.log("==============", ZX_NMS_BASE_API);
console.log("==============", CLOND_API);
console.log("==============", BXDD_API);
console.log("==============", AD_API);
module.exports = {
NODE_ENV: '"production"',
// BASE_API: '"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',
BASE_API: BASE_API,
ZX_NMS_BASE_API: ZX_NMS_BASE_API,
CLOND_API: CLOND_API,
BXDD_API: BXDD_API,
PUTIN_API: PUTIN_API,
AD_API: AD_API,
};
favicon.ico

66.1 KB

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>投放数据平台</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
{
"name": "vue-admin-template",
"version": "3.8.0",
"license": "MIT",
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
"author": "Pan <panfree23@gmail.com>",
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js",
"build:report": "npm_config_report=true npm run build",
"lint": "eslint --ext .js,.vue src",
"test": "node build/build.js test",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
},
"dependencies": {
"@chenfengyuan/vue-qrcode": "^1.0.2",
"ali-oss": "^6.12.0",
"axios": "0.18.0",
"chart.js": "^2.7.3",
"downloadjs": "^1.4.7",
"echarts": "^4.1.0",
"el-tree-transfer": "^2.3.1",
"element-ui": "^2.12.0",
"file-saver": "^2.0.5",
"js-cookie": "2.2.0",
"md5": "^2.3.0",
"moment": "^2.24.0",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"peer": "^0.2.10",
"v-charts": "^1.19.0",
"v-viewer": "^1.4.0",
"view-design": "^4.0.2",
"viewerjs": "^1.3.2",
"vue": "2.5.17",
"vue-chartjs": "^3.4.0",
"vue-clipboard2": "^0.3.1",
"vue-json-editor": "^1.4.0",
"vue-json-ui-editor": "^1.0.0",
"vue-json-views": "^1.3.0",
"vue-router": "3.0.1",
"vuex": "3.0.1",
"xlsx": "^0.16.9"
},
"devDependencies": {
"autoprefixer": "8.5.0",
"babel-core": "6.26.0",
"babel-eslint": "8.2.6",
"babel-helper-vue-jsx-merge-props": "2.0.3",
"babel-loader": "7.1.5",
"babel-plugin-syntax-jsx": "6.18.0",
"babel-plugin-transform-runtime": "6.23.0",
"babel-plugin-transform-vue-jsx": "3.7.0",
"babel-preset-env": "1.7.0",
"babel-preset-stage-2": "6.24.1",
"chalk": "2.4.1",
"compression-webpack-plugin": "2.0.0",
"copy-webpack-plugin": "4.5.2",
"css-loader": "1.0.0",
"eslint": "4.19.1",
"eslint-friendly-formatter": "4.0.1",
"eslint-loader": "2.0.0",
"eslint-plugin-vue": "4.7.1",
"eventsource-polyfill": "0.9.6",
"file-loader": "1.1.11",
"friendly-errors-webpack-plugin": "1.7.0",
"html-webpack-plugin": "4.0.0-alpha",
"mini-css-extract-plugin": "0.4.1",
"node-notifier": "5.2.1",
"node-sass": "^4.7.2",
"optimize-css-assets-webpack-plugin": "5.0.0",
"ora": "3.0.0",
"path-to-regexp": "2.4.0",
"portfinder": "1.0.16",
"postcss-import": "12.0.0",
"postcss-loader": "2.1.6",
"postcss-url": "7.3.2",
"rimraf": "2.6.2",
"sass-loader": "7.0.3",
"script-ext-html-webpack-plugin": "2.0.1",
"semver": "5.5.0",
"shelljs": "0.8.2",
"svg-sprite-loader": "3.8.0",
"svgo": "1.0.5",
"uglifyjs-webpack-plugin": "1.2.7",
"url-loader": "1.0.1",
"vue-loader": "15.3.0",
"vue-style-loader": "4.1.2",
"vue-template-compiler": "2.5.17",
"webpack": "4.16.5",
"webpack-bundle-analyzer": "2.13.1",
"webpack-cli": "3.1.0",
"webpack-dev-server": "3.1.14",
"webpack-merge": "4.1.4"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
import request from "@/utils/request";
export function putonAgent(_method, _params) {
if (_method === "get" || _method === "delete") {
return request({
url: "/data/api/puton/agent",
method: _method,
params: _params
});
} else {
return request({
url: "/data/api/puton/agent",
method: _method,
data: _params
});
}
}
import request from '@/utils/request'
export function openFetchTask(params) {
return request({
url: process.env.PUTIN_API + '/material/fetch/task/open',
method: 'POST',
params
})
}
export function delFetchTask(params) {
return request({
url: process.env.PUTIN_API + '/material/fetch/task/del',
method: 'POST',
params
})
}
export function opPutinTask(params) {
return request({
url: process.env.PUTIN_API + '/putin/op/task',
method: 'GET',
params
})
}
export function switchPutinAdvertise(params) {
return request({
url: process.env.PUTIN_API + '/putin/switch/putin/advertise',
method: 'POST',
params
})
}
export function resetPutinStatus(params) {
return request({
url: process.env.PUTIN_API + '/putin/reset/status',
method: 'POST',
params
})
}
import request from "@/utils/request";
export function dataReport(_method, _params) {
return request({
url: "/data/api/puton/data/reportAll",
method: _method,
params: _params
});
}
import request from '@/utils/request'
export function userList(params) {
return request({
url: '/api/app/getAppInfoListApi',
method: 'get',
params
})
}
export function storeAppInfo(data) {
return request({
url: '/api/app/storeAppInfo',
method: 'post',
data
})
}
import request from "@/utils/request";
export function userList(params) {
return request({
url: process.env.ZX_NMS_BASE_API + "/user/userList",
method: "get",
params
});
}
export function accept(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/user/accept",
method: "post",
data
});
}
export function reject(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/user/reject",
method: "post",
data
});
}
export function queryTotalWithdraw(params) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/queryTotalApi",
method: "get",
params
});
}
export function queryWithdrawList(params) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/queryApi",
method: "get",
params
});
}
export function acceptWd(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/accept",
method: "post",
data
});
}
export function goBackWd(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/goBack",
method: "post",
data
});
}
export function rejectWd(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/reject",
method: "post",
data
});
}
export function rollbackWd(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/withdraw/rollback",
method: "post",
data
});
}
export function changeSourceInfo(data) {
return request({
url: process.env.ZX_NMS_BASE_API + "/user/changeSourceInfo",
method: "post",
data
});
}
export function auditInfo(params) {
return request({
url: process.env.ZX_NMS_BASE_API + "/cloudDistribute/auditInfo",
method: "get",
params
});
}
// 保存文章
export function pArticleSaveApi(data) {
return request({
url: process.env.CLOND_API + "/pArticle/save",
method: "post",
data
});
}
// 文章列表
export function pArticleListApi(params) {
return request({
url: process.env.CLOND_API + "/pArticle/fetch",
method: "get",
params
});
}
// 当前文章
export function currPArticleApi(params) {
return request({
url: process.env.CLOND_API + "/pArticle/getArticle",
method: "GET",
params
});
}
// del文章
export function delPArticleApi(params) {
return request({
url: process.env.CLOND_API + "/pArticle/delArticle",
method: "POST",
params
});
}
// 获取默认信息
export function getEnums(params) {
return request({
url: process.env.PUTIN_API + "/v1/global/enums",
method: "GET",
params
});
}
/* 获取抓取任务列表 */
export function getTask(params) {
return request({
url: process.env.PUTIN_API + "/material/fetch/task",
method: "GET",
params
});
}
/* 创建抓取任务列表 */
export function cresteTask(data) {
return request({
url: process.env.PUTIN_API + "/material/fetch/task",
method: "POST",
data: data
});
}
/* 获取原始素材列表*/
export function getOlist(params) {
return request({
url: process.env.PUTIN_API + "/material/origin/list",
method: "GET",
params
});
}
/* 获取原始素材库*/
export function getTextlist(params) {
return request({
url: process.env.PUTIN_API + "/material/origin/text/list",
method: "GET",
params
});
}
/* 删除/入库的文案*/
export function getTextedit(params) {
return request({
url: process.env.PUTIN_API + "/material/origin/text/edit",
method: "POST",
params
});
}
/* 创建素材组的下拉列表*/
export function getSelectApps(params) {
return request({
url: process.env.BXDD_API + "/cms/menu/selectApps",
method: "GET",
params
});
}
/* 获取投放任务列表*/
export function putinFetchPutinTasks(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/putin/tasks",
method: "GET",
params
});
}
/* 获取创意素材库列表 */
export function getBusinlist(params) {
return request({
url: process.env.PUTIN_API + "/material/business/list",
method: "GET",
params
});
}
// 获取回显素材列表
export function getShowParams(params) {
return request({
url: process.env.PUTIN_API + "/material/group/list",
method: 'get',
params
})
}
/* 获取创意素材 */
export function getBusinIncome(params) {
return request({
url: process.env.BXDD_API + "/stat/common/v2/tableMapping",
method: "GET",
params
});
}
/* 删除创意素材库列表 */
export function getBusindel(params) {
return request({
url: process.env.PUTIN_API + "/material/business/del",
method: "POST",
params
});
}
/* 文件上传 */
export function getUpload(data) {
return request({
url: process.env.PUTIN_API + "/v1/global/upload",
method: "POST",
data
});
}
/* 本地上传到素材库*/
export function getbusinUpload(params) {
return request({
url: process.env.PUTIN_API + "/material/business/upload",
method: "POST",
params
});
}
/* 获取文案库列表*/
export function getBusinText(params) {
return request({
url: process.env.PUTIN_API + "/material/business/text/list",
method: "GET",
params
});
}
/* 删除文案库*/
export function getBusinTextDel(params) {
return request({
url: process.env.PUTIN_API + "/material/business/text/del",
method: "POST",
params
});
}
/* 修改文案库*/
export function getBusinTextEdit(params) {
return request({
url: process.env.PUTIN_API + "/material/business/text/edit",
method: "POST",
params
});
}
/* 添加文案库*/
export function getBusinTextAdd(params) {
return request({
url: process.env.PUTIN_API + "/material/business/text/input-add",
method: "POST",
params
});
}
/* 操作原始素材*/
export function getoriginedit(params) {
return request({
url: process.env.PUTIN_API + "/material/origin/edit",
method: "POST",
params
});
}
/* 获取素材组的列表*/
export function getGrouplist(params) {
return request({
url: process.env.PUTIN_API + "/material/v2/group/list",
method: "GET",
params
});
}
/* 清洗素材 */
export function getCleanService(params) {
return request({
url: process.env.PUTIN_API + "/material/clean/service",
method: "POST",
params
});
}
/* 创建素材组 */
export function getCreateOrUpdate(data) {
return request({
url: process.env.PUTIN_API + "/material/group/createOrUpdate",
method: "POST",
data
});
}
export function deriveTask(params) {
return request({
url: process.env.PUTIN_API + '/material/derive/tasks',
method: 'GET',
params
})
}
export function createDeriveTask(data) {
return request({
url: process.env.PUTIN_API + '/material/create/derive',
method: 'POST',
data
})
}
export function openDeriveTask(params) {
return request({
url: process.env.PUTIN_API + '/material/open/derive',
method: 'POST',
params
})
}
// 通用接口
import request from '@/utils/request'
export function fetchCommonTable(params) {
return request({
url: process.env.BXDD_API + "/stat/common/v2/tableMapping",
method: "GET",
params
});
}
\ No newline at end of file
import request from "@/utils/request";
export function appList(params) {
return request({
url: process.env.BXDD_API + "/cms/app/list",
method: "get",
params
});
}
import request from "@/utils/request";
export function costDetails(_method, _params) {
return request({
url: "/data/api/puton/cost/details",
method: _method,
params: _params
});
}
export function rechargeRecord(_method, _params) {
return request({
url: "/data/api/puton/recharge/record",
method: _method,
params: _params
});
}
import request from "@/utils/request";
export function invoiceRecord(_method, _params) {
if (_method === "get" || _method === "delete") {
return request({
url: "/data/api/puton/invoice/record",
method: _method,
params: _params
});
} else {
return request({
url: "/data/api/puton/invoice/record",
method: _method,
data: _params
});
}
}
import request from '@/utils/request'
export function login(account, password) {
return request({
url: '/user/login',
method: 'post',
data: {
account,
password
}
})
}
export function getInfo(token) {
return request({
url: '/user/info',
method: 'get',
params: { token }
})
}
export function logout() {
return request({
url: '/user/logout',
method: 'post'
})
}
export function loginV2(username, password) {
return request({
url: process.env.BXDD_API + '/data/gateway/login',
method: 'post',
params: {
username,
password
}
})
}
export function getInfoV2() {
return request({
url: process.env.BXDD_API + '/data/gateway/user/roles',
method: 'get',
})
}
export function gatewayUserRouters() {
return request({
url: process.env.BXDD_API + "/data/gateway/user/routers?platformId=4",
method: "get"
});
}
\ No newline at end of file
import request from "@/utils/request";
export function oceanEngineList(params) {
return request({
url: "/v1/data/ocean-engine/list",
method: "get",
params
});
}
export function oauthCallback(params) {
return request({
url: "/v1/data/ocean-engine/oauth/callback",
method: "get",
params
});
}
export function gdtCallback(params) {
return request({
url: "/v1/gdt/callback",
method: "get",
params
});
}
export function kuaishouCallback(params) {
return request({
url: "/v1/kuaishou/callback",
method: "get",
params
});
}
export function weiboCallback(params) {
return request({
url: "/v1/weibo/callback",
method: "get",
params
});
}
export function tiktokCallback(params) {
return request({
url: "/v1/tiktok/callback",
method: "get",
params
});
}
export function ceanEngineUpdate(data) {
return request({
url: "/v1/data/ocean-engine/update",
method: "post",
data
});
}
export function diff(params) {
return request({
url: "/data/api/puton/cost/diff",
method: "get",
params
});
}
export function statusManage(_method, _params) {
if (_method === "get" || _method === "delete") {
return request({
url: "/data/api/puton/status/manage",
method: _method,
params: _params
});
} else {
return request({
url: "/data/api/puton/status/manage",
method: _method,
data: _params
});
}
}
import request from "@/utils/request";
export function dataReport(_method, _params) {
return request({
url: "/data/api/puton/data/report",
method: _method,
params: _params
});
}
import request from "@/utils/request";
export function invoiceRecord(_method, _params) {
if (_method === "get" || _method === "delete") {
return request({
url: "/data/api/puton/agent/cash/record",
method: _method,
params: _params
});
} else {
return request({
url: "/data/api/puton/agent/cash/record",
method: _method,
data: _params
});
}
}
import request from "@/utils/request";
export function getRoiData(params) {
return request({
url: process.env.BXDD_API + "/data/api/roi/agent/roiData",
method: "get",
params
});
}
// 获取页面App列表权限
export function menuSelectApps(params) {
return request({
url: process.env.BXDD_API + "/cms/menu/selectApps",
method: "get",
params
});
}
// 获取创建的素材组列表
export function materialGroupList(params) {
return request({
url: process.env.PUTIN_API + "/material/v2/group/list",
method: "get",
params
});
}
// 获取投放账号列表
export function putinFetchAccount(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/account",
method: "get",
params
});
}
// 获取转化ID列表
export function putinFetchConvertIds(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/convert-ids",
method: "get",
params
});
}
// 更新或新增投放账号转化ID
export function putinUpdateAdvertiseConversion(params) {
return request({
url: process.env.PUTIN_API + "/putin/update/advertise/conversion",
method: "post",
params
});
}
// 创建投放任务
export function putinCreatePutinTask(data) {
return request({
url: process.env.PUTIN_API + "/putin/create/putin-task",
method: "post",
data
});
}
// 获取人群包列表
export function getCrowdList(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/custom_audience/select",
method: "get",
params
});
}
// 获取已创建的定向包
export function getCreatedDirectPkg(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/his/orientation",
method: "get",
params
});
}
// 抓取创意三级分类信息列表
export function putinFetchIndustryList(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/industryList",
method: "get",
params
});
}
// 投放归因
export function putinFetchAttribution_analysis(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/attribution_analysis",
method: "get",
params
});
}
//获取图片尺寸列
export function getPictureSizeLsit(params) {
return request({
url: process.env.PUTIN_API + "/material/fetch/materialSize",
method: "get",
params
});
}
//获取行动号召列表
export function getCallActionList(params) {
return request({
url: process.env.PUTIN_API + "/putin/action/texts",
method: 'get',
params
})
}
//智能投放->投放归因,更改 广告组、广告计划、创意 状态
export function attributionStatusChange(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/update/status",
method: "post",
params
});
}
//获取试玩素材列表
export function getPlayableUrlListAPI(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/play/list",
method: "get",
params
});
}
// 获取广告主下的广告组列表
export function getAdvList(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/campaign-ids",
method: "get",
params
})
}
/**
* 通过sqlID来请求数据,不同id参数和返回值不同
*/
export function getAttributeGraphApi(params) {
return request({
url: process.env.BXDD_API + "/stat/common/v2/tableMapping",
method: "get",
params
})
}
/**
* 投放归因页面 修改广告主下的出价OCMP字段,单次修改一个广告主下的所有
*/
export function modifyAdvertiserOcmp(data) {
return request({
url: process.env.PUTIN_API + "/op/putin/batch/task",
method: "post",
data
})
}
/**
* 获取任务中心的列表
*/
export function getTaskList(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/common/taskList",
method: "get",
params
})
}
/**
* Ocmp相关操作
* post提交任务(上面接口就是提交任务)
* get拉取详细列表
* put开启任务
*/
export function handleAdvertiserOcmp(params, means) {
return request({
url: process.env.PUTIN_API + "/op/putin/batch/task",
method: means,
params
})
}
/**
* 通用接口通过sqlid来区分获取不同的数据
* @param {Object} params
*/
export function v2TableMappingAPI(params) {
return request({
url: process.env.BXDD_API + "/stat/common/v2/tableMapping",
method: "get",
params
})
}
/**
* 智能投放->投放归因,广告计划 预算和出价更改
*/
export function planRevision(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/plan",
method: "post",
params
});
}
/**
* 投放考核 列表获取
*/
export function putAssessGetList(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/checkIndex/list",
method: "get",
params
})
}
/**
* 投放考核 编辑考核值
*/
export function putAssessEditSave(data) {
return request({
url: process.env.PUTIN_API + "/op/putin/fill/checkIndex",
method: "post",
data
})
}
/**
* 投放考核 列表获取V2
*/
export function putAssessGetListV2(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/checkIndex/list/v2",
method: "get",
params
})
}
/**
* 投放考核 编辑考核值V2
*/
export function putAssessEditSaveV2(data) {
return request({
url: process.env.PUTIN_API + "/op/putin/fill/checkIndex/v2",
method: "post",
data
})
}
/**
* 下面三个是计划修改组件所需接口
*/
export function fetchPlanInfo(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/planInfo",
method: "get",
params
});
}
export function opPutinPlan(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/plan",
method: "post",
params
});
}
export function fetchHis(params) {
return request({
url: process.env.PUTIN_API + "/op/putin/history",
method: "get",
params
});
}
// 试玩素材列表获取(自有库)
export function tryPlayList(params) {
return request({
url: process.env.PUTIN_API + '/putin/fetch/play-material',
method: 'get',
params
})
}
// 试玩素材上传-保存试玩素材
export function uploadSaveMaterial(params) {
return request({
url: process.env.PUTIN_API + '/putin/save/play-material',
method: 'post',
params
})
}
// 批量删除试玩素材(自有库)
export function batchRemove(params) {
return request({
url: process.env.PUTIN_API + '/putin/del/play-material',
method: 'post',
params
})
}
// 上传素材到平台广告主
export function uploadToAdver(params) {
return request({
url: process.env.PUTIN_API + '/putin/upload/platform/play-material',
method: 'post',
params
})
}
//更新或新增投放账号试玩素材
export function newAcountMaterials(params) {
return request({
url: process.env.PUTIN_API + '/putin/update/advertise/playable',
method: 'post',
params
})
}
//获取广告主下面试玩素材的个数
export function getAdvertiseCount(params) {
return request({
url: process.env.PUTIN_API + "/putin/fetch/play/size",
method: "get",
params
});
}
// ------广告投放配置请求---------------
// 获取列表数据
export function fetchAdvCfgList(params) {
return request({
url: process.env.AD_API + "/v1/putin/cfgList",
method: "get",
params
});
}
// 新增/更新列表
export function updateOrAddList(data) {
return request({
url: process.env.AD_API + "/v1/putin/cfg",
method: "post",
data
});
}
// 开关
export function switchData(params) {
return request({
url: process.env.AD_API + "/v1/putin/switch/cfg",
method: "post",
params
});
}
// 删除
export function deletePutin(params) {
return request({
url: process.env.AD_API + "/v1/putin/del/cfg",
method: "post",
params
});
}
// 同步缓存
export function asyncCache(params) {
return request({
url: process.env.AD_API + "/v1/putin/sync/cfg",
method: "post",
params
});
}
// 查看计划配置详情
export function planDetailCfg(params) {
return request({
url: process.env.AD_API + "/v1/putin/details",
method: "get",
params
});
}
// 获取包的所有投放匹配ID配置
export function matchIdCfg(params) {
return request({
url: process.env.AD_API + "/v1/putin/matchIds",
method: "get",
params
});
}
// 虚拟回传
export function backhaul(params) {
return request({
url: 'http://report.zhangxinhulian.com' + '/mock/callback',
method: "get",
params
})
}
// ----------------------------------------
\ No newline at end of file
@charset "utf-8";
.bkg-0 {
background-color: #000000;
}
.bkg-1 {
background-color: #111111;
}
.bkg-2 {
background-color: #222222;
}
.bkg-3 {
background-color: #333333;
}
.bkg-4 {
background-color: #444444;
}
.bkg-5 {
background-color: #555555;
}
.bkg-6 {
background-color: #666666;
}
.bkg-7 {
background-color: #777777;
}
.bkg-8 {
background-color: #888888;
}
.bkg-9 {
background-color: #999999;
}
.bkg-a {
background-color: #aaaaaa;
}
.bkg-b {
background-color: #bbbbbb;
}
.bkg-c {
background-color: #cccccc;
}
.bkg-d {
background-color: #dddddd;
}
.bkg-e {
background-color: #eeeeee;
}
.bkg-f {
background-color: #ffffff;
}
.bkg-trans {
background-color: transparent;
}
.bkg-f5 {
background-color: #f5f5f5;
}
.bkg-f6 {
background-color: #f6f6f6;
}
.bkg-fa {
background-color: #fafafa;
}
.bkg-sys1 {
background-color: #e5bf76;
}
.bkg-sys2 {
background-color: #ec723b;
}
.bkg-sys3 {
background-color: #fdf2ec;
}
.bkg-sys3 {
background-color: #ff8700;
}
.bkg-sys4 {
background: linear-gradient(
132deg,
rgba(255, 214, 97, 1) 0%,
rgba(255, 178, 0, 1) 100%
);
}
.bkg-sys5 {
background: linear-gradient(
90deg,
rgba(255, 44, 60, 1) 0%,
rgba(255, 116, 123, 1) 100%
);
}
@charset "utf-8";
/* 横向换行 */
.row-wrap {
display: flex;
flex-wrap: wrap;
}
/* 竖向换行 */
.col-wrap {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
/* 垂直居中,水平变化 */
.row-center-start {
display: flex;
align-items: center;
justify-content: flex-start;
}
.row-center-end {
display: flex;
align-items: center;
justify-content: flex-end;
}
.row-center-center {
display: flex;
align-items: center;
justify-content: center;
}
.row-center-around {
display: flex;
align-items: center;
justify-content: space-around;
}
.row-center-between {
display: flex;
align-items: center;
justify-content: space-between;
}
/* 垂直居上,水平变化 */
.row-start-start {
display: flex;
align-items: flex-start;
justify-content: flex-start;
}
.row-start-end {
display: flex;
align-items: flex-start;
justify-content: flex-end;
}
.row-start-center {
display: flex;
align-items: flex-start;
justify-content: center;
}
.row-start-around {
display: flex;
align-items: flex-start;
justify-content: space-around;
}
.row-start-between {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
/* 垂直居下,水平变化 */
.row-end-start {
display: flex;
align-items: flex-end;
justify-content: flex-start;
}
.row-end-end {
display: flex;
align-items: flex-end;
justify-content: flex-end;
}
.row-end-center {
display: flex;
align-items: flex-end;
justify-content: center;
}
.row-end-around {
display: flex;
align-items: flex-end;
justify-content: space-around;
}
.row-end-between {
display: flex;
align-items: flex-end;
justify-content: space-between;
}
/* 水平居中,垂直变化 */
.col-center-start {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
}
.col-center-end {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
}
.col-center-center {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.col-center-around {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
}
.col-center-between {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
}
/* 水平左对齐,垂直变化 */
.col-start-start {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
}
.col-start-end {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-end;
}
.col-start-center {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.col-start-around {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: space-around;
}
.col-start-between {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: space-between;
}
/* 水平右对齐,垂直变化 */
.col-end-start {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: flex-start;
}
.col-end-end {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: flex-end;
}
.col-end-center {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: center;
}
.col-end-around {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: space-around;
}
.col-end-between {
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: space-between;
}
@charset "utf-8";
.fc-0 {
color: #000000;
}
.fc-1 {
color: #111111;
}
.fc-2 {
color: #222222;
}
.fc-3 {
color: #333333;
}
.fc-4 {
color: #444444;
}
.fc-5 {
color: #555555;
}
.fc-6 {
color: #666666;
}
.fc-7 {
color: #777777;
}
.fc-8 {
color: #888888;
}
.fc-9 {
color: #999999;
}
.fc-a {
color: #aaaaaa;
}
.fc-b {
color: #bbbbbb;
}
.fc-c {
color: #cccccc;
}
.fc-d {
color: #dddddd;
}
.fc-e {
color: #eeeeee;
}
.fc-f {
color: #ffffff;
}
.fc-sys1 {
color: #957b00;
}
.fc-sys2 {
color: #674c0c;
}
.fc-sys3 {
color: #624b0c;
}
.fc-sys4 {
color: #ea504b;
}
.fc-sys5 {
color: #e5bf76;
}
.fc-sys6 {
color: #ee8630;
}
.fc-sys7 {
color: #5aa1ed;
}
.fc-sys8 {
color: #060606;
}
.fc-sys9 {
color: #ec723b;
}
.fc-sys10 {
color: #f7d15e;
}
.fc-sysy11 {
color: #8c3000;
}
.fc-sys12 {
color: #ff014c;
}
.fc-sys13 {
color: #ff2f11;
}
.fc-sys14 {
color: #ff3c20;
}
.fc-sys15 {
color: #5f0f00;
}
.fc-sys16 {
color: #ffb7b0;
}
.fc-sys17 {
color: #fee456;
}
.fc-sys18 {
color: #ff2f3f;
}
.fc-sys19 {
color: #723000;
}
.fc-sys20 {
color: #ff7300;
}
.fc-sys21 {
color: #fff825;
}
.fc-sys22 {
color: #ff1e1e;
}
.fc-sys23 {
color: #568efc;
}
.fc-sys24 {
color: #ffc039;
}
.fc-sys25 {
color: #ff0000;
}
.fc-sys26 {
color: #ff3130;
}
.fc-sys27 {
color: #fad9bb;
}
.fc-sys28 {
color: #866429;
}
.fc-sys29 {
color: #daa44b;
}
.fc-sys30 {
color: #a96f13;
}
.fc-sys31 {
color: #8d5313;
}
@charset "utf-8";
.pf-sc-m {
font-family: PingFangSC-Medium, PingFang SC;
}
.pf-sc-r {
font-family: PingFang-SC-Regular, PingFang-SC;
}
.n-s-s-c {
font-family: Noto Sans S Chinese;
}
@charset "utf-8";
.fw-b {
font-weight: bold;
}
.fw-600 {
font-weight: 600;
}
.fw-500 {
font-weight: 500;
}
.fw-400 {
font-weight: 400;
}
.fs-1 {
font-size: 0.02rem;
}
.fs-2 {
font-size: 0.04rem;
}
.fs-3 {
font-size: 0.06rem;
}
.fs-4 {
font-size: 0.08rem;
}
.fs-5 {
font-size: 0.1rem;
}
.fs-6 {
font-size: 0.12rem;
}
.fs-7 {
font-size: 0.14rem;
}
.fs-8 {
font-size: 0.16rem;
}
.fs-9 {
font-size: 0.18rem;
}
.fs-10 {
font-size: 0.2rem;
}
.fs-11 {
font-size: 0.22rem;
}
.fs-12 {
font-size: 0.24rem;
}
.fs-13 {
font-size: 0.26rem;
}
.fs-14 {
font-size: 0.28rem;
}
.fs-15 {
font-size: 0.3rem;
}
.fs-16 {
font-size: 0.32rem;
}
.fs-17 {
font-size: 0.34rem;
}
.fs-18 {
font-size: 0.36rem;
}
.fs-19 {
font-size: 0.38rem;
}
.fs-20 {
font-size: 0.4rem;
}
.fs-21 {
font-size: 0.42rem;
}
.fs-22 {
font-size: 0.44rem;
}
.fs-23 {
font-size: 0.46rem;
}
.fs-24 {
font-size: 0.48rem;
}
.fs-25 {
font-size: 0.5rem;
}
.fs-26 {
font-size: 0.52rem;
}
.fs-27 {
font-size: 0.54rem;
}
.fs-28 {
font-size: 0.56rem;
}
.fs-29 {
font-size: 0.58rem;
}
.fs-30 {
font-size: 0.6rem;
}
.fs-31 {
font-size: 0.62rem;
}
.fs-32 {
font-size: 0.64rem;
}
.fs-33 {
font-size: 0.66rem;
}
.fs-34 {
font-size: 0.68rem;
}
.fs-35 {
font-size: 0.7rem;
}
.fs-36 {
font-size: 0.72rem;
}
.fs-37 {
font-size: 0.74rem;
}
.fs-38 {
font-size: 0.76rem;
}
.fs-39 {
font-size: 0.78rem;
}
.fs-40 {
font-size: 0.8rem;
}
.fs-42 {
font-size: 0.84rem;
}
.fs-45 {
font-size: 0.9rem;
}
.fs-52 {
font-size: 1.04rem;
}
.fs-78 {
font-size: 1.56rem;
}
.ellipsis1 {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
word-break: break-all;
}
.ellipsis2 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
word-break: break-all;
}
.mask-layer {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
overflow: hidden;
background-color: #000;
opacity: 0.6;
z-index: 1;
}
/* 旋转效果 */
@keyframes draw {
0% {
transform: rotate(0deg);
-ms-transform: rotate(0deg); /* IE 9 */
-moz-transform: rotate(0deg); /* Firefox */
-o-transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
-ms-transform: rotate(360deg); /* IE 9 */
-moz-transform: rotate(360deg); /* Firefox */
-o-transform: rotate(360deg);
}
}
@-webkit-keyframes draw {
0% {
-moz-transform: rotate(0deg);
}
100% {
-moz-transform: rotate(360deg);
}
}
\ No newline at end of file
export const dateOptions = {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
}
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
}
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
}
}
]
};
import FileSaver from 'file-saver'
import XLSX from 'xlsx'
export function exportExcel(id, title) {
var wb = XLSX.utils.table_to_book(document.querySelector("#" + id));
var wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array"
});
try {
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
title + ".xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
return wbout;
}
<template>
<el-cascader
v-model="value"
:options="options"
@change="handleChange"
filterable
></el-cascader>
</template>
<script>
import { menuSelectApps } from "@/api/report";
export default {
name: "ZxAppSelect",
props: {
menuCode: {
type: String,
default: "game.Overview",
},
platformId: {
type: Number,
default: 5,
},
all: {
type: Boolean,
default: false,
},
defaultValue: {
type: [Array, String],
default: () => ["", ""],
},
},
data() {
return {
options: [],
value: [],
};
},
created() {
this.APIMenuSelectApps(); // 获取应用
this.$emit("input", this.defaultValue);
},
watch: {
/* 保证数据双向绑定 */
value(val) {
this.$emit("input", val);
},
},
methods: {
APIMenuSelectApps() {
let params = {
platformId: this.platformId,
menuCode: this.menuCode,
belongGroup: true,
};
menuSelectApps(params).then((res) => {
this.options = res.result.data;
if (this.all) {
this.options.unshift({
label: "全部",
value: "",
children: [{ label: "全部", value: "" }],
});
}
this.value = this.defaultValue;
});
},
/* 将级联数据 发射出去 */
handleChange() {
this.$nextTick(() => {
this.$emit("change", this.value);
});
},
},
};
</script>
<style></style>
<template>
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item,index) in levelList" :key="index">
<span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
import pathToRegexp from 'path-to-regexp'
export default {
data() {
return {
levelList: null
}
},
watch: {
$route() {
this.getBreadcrumb()
}
},
created() {
this.getBreadcrumb()
},
methods: {
getBreadcrumb() {
let matched = this.$route.matched.filter(item => item.name)
const first = matched[0]
if (first && first.name !== 'dashboard') {
matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
}
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
},
pathCompile(path) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(this.pathCompile(path))
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 10px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
</style>
<template>
<div>
<svg
:class="{'is-active':isActive}"
class="hamburger"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
@click="toggleClick">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
</svg>
</div>
</template>
<script>
export default {
name: 'Hamburger',
props: {
isActive: {
type: Boolean,
default: false
},
toggleClick: {
type: Function,
default: null
}
}
}
</script>
<style scoped>
.hamburger {
display: inline-block;
cursor: pointer;
width: 20px;
height: 20px;
}
.hamburger.is-active {
transform: rotate(180deg);
}
</style>
<template>
<json-view :data="json" :deep="3" />
</template>
<script>
import JsonView from "vue-json-views";
export default {
components: {
JsonView,
},
props: {
json: {
type: [Object, Array],
require: true,
},
},
};
</script>
<style>
</style>
\ No newline at end of file
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName"/>
</svg>
</template>
<script>
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
}
},
computed: {
iconName() {
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
<template>
<el-table
empty-text="暂无数据"
:header-cell-style="headerCellStyle"
:cell-style="cellStyle"
ref="table"
:data="tableList"
v-loading="loading"
border
stripe
fit
highlight-current-row
:height="inTableHeight"
@selection-change="selectionChange"
@row-click="rowClick"
>
<!-- 选择框 -->
<el-table-column
v-if="select"
type="selection"
fixed="left"
width="55"
align="center"
/>
<template v-for="(itm, idx) in header">
<!-- 特殊处理列 -->
<el-table-column
v-if="itm.render"
:key="idx"
:prop="itm.prop ? itm.prop : null"
:label="itm.label ? itm.label : null"
:width="itm.width ? itm.width : null"
:sortable="itm.sortable ? itm.sortable : false"
:align="itm.align ? itm.align : 'center'"
:fixed="itm.fixed ? itm.fixed : null"
:show-overflow-tooltip="itm.tooltip"
min-width="50"
>
<template slot-scope="scope">
<ex-slot
:render="itm.render"
:row="scope.row"
:index="scope.$index"
:column="itm"
/>
</template>
</el-table-column>
<!-- 正常列 -->
<el-table-column
v-else
:key="idx"
:prop="itm.prop ? itm.prop : null"
:label="itm.label ? itm.label : null"
:width="itm.width ? itm.width : null"
:sortable="itm.sortable ? itm.sortable : false"
:align="itm.align ? itm.align : 'center'"
:fixed="itm.fixed ? itm.fixed : null"
:formatter="itm.formatter"
:show-overflow-tooltip="itm.tooltip"
min-width="50"
/>
</template>
</el-table>
</template>
<script>
// 自定义内容的组件
var exSlot = {
functional: true,
props: {
row: Object,
render: Function,
index: Number,
column: {
type: Object,
default: null,
},
},
render: (h, context) => {
const params = {
row: context.props.row,
index: context.props.index,
};
if (context.props.column) params.column = context.props.column;
return context.props.render(h, params);
},
};
export default {
name: "ZxTable",
components: { exSlot },
props: {
loading: {
type: [Boolean, String],
default: false,
},
tableList: {
type: Array,
default: () => [],
},
header: {
type: Array,
default: () => [],
},
select: {
type: Boolean,
default: () => false,
},
height: {
type: [Number, String, Function],
default: () => null,
},
headerCellStyle: {
type: [Object, String],
default: () => "",
},
cellStyle: {
type: [Object, String],
default: () => "",
},
},
data() {
return {
inTableHeight: null,
};
},
created() {
//该阶段可以接收父组件的传递参数
this.inTableHeight = this.height;
},
mounted() {
this.$nextTick(() => {
//表格高度自适应浏览器大小
this.changeTableHight();
if (!this.height) {
window.onresize = () => {
this.changeTableHight();
};
}
});
},
destroyed() {
//高度自适应事件注销
window.onresize = null;
},
watch: {
/**
* 数据变化后 高度自适应
*/
tableList() {
this.$nextTick(() => {
this.changeTableHight();
});
},
},
methods: {
/**
* 选择框选择后更改,事件分发
*/
selectionChange(selection) {
this.$emit("selection-change", selection);
},
/**
* 点击事件
*/
rowClick(row, column, event) {
this.$emit("row-click", row, column, event);
},
/**
* 高度自适应
* 当表格展示空间小于460按460px展示,大于的时候高度填充
*/
changeTableHight() {
if (this.height) {
//如果有传进来高度就取消自适应
this.inTableHeight = this.height;
this.$refs.table.doLayout();
return;
}
let tableHeight = window.innerHeight || document.body.clientHeight;
//高度设置
let disTop = this.$refs.table.$el;
//如果表格上方有元素则减去这些高度适应窗口,66是底下留白部分
tableHeight -= disTop.offsetTop + 66;
if (disTop.offsetParent) tableHeight -= disTop.offsetParent.offsetTop;
this.inTableHeight = tableHeight < 460 ? 460 : tableHeight;
//重绘表格
this.$refs.table.doLayout();
},
},
};
</script>
<style></style>
<template>
<div class="upload-container">
<el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true">上传图片
</el-button>
<el-dialog :visible.sync="dialogVisible">
<el-upload
:multiple="true"
:file-list="fileList"
:show-file-list="true"
:on-remove="handleRemove"
:on-success="handleSuccess"
:before-upload="beforeUpload"
:action="image_upload_url"
class="editor-slide-upload"
list-type="picture-card">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="handleSubmit">确 定</el-button>
</el-dialog>
</div>
</template>
<script>
// import { getToken } from 'api/qiniu'
export default {
name: 'EditorSlideUpload',
props: {
color: {
type: String,
default: '#1890ff'
}
},
data() {
return {
dialogVisible: false,
listObj: {},
fileList: [],
image_upload_url: process.env.BASE_API + '/upload/uploadImage'
}
},
methods: {
checkAllSuccess() {
return Object.keys(this.listObj).every(item => this.listObj[item].hasSuccess)
},
handleSubmit() {
const arr = Object.keys(this.listObj).map(v => this.listObj[v])
if (!this.checkAllSuccess()) {
this.$message('请等待所有图片上传成功 或 出现了网络问题,请刷新页面重新上传!')
return
}
this.$emit('successCBK', arr)
this.listObj = {}
this.fileList = []
this.dialogVisible = false
},
handleSuccess(response, file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
this.listObj[objKeyArr[i]].url = response.file_url
this.listObj[objKeyArr[i]].hasSuccess = true
return
}
}
},
handleRemove(file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
delete this.listObj[objKeyArr[i]]
return
}
}
},
beforeUpload(file) {
const _self = this
const _URL = window.URL || window.webkitURL
const fileName = file.uid
this.listObj[fileName] = {}
return new Promise((resolve, reject) => {
const img = new Image()
img.src = _URL.createObjectURL(file)
img.onload = function() {
_self.listObj[fileName] = { hasSuccess: false, uid: file.uid, width: this.width, height: this.height }
}
resolve(true)
})
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.editor-slide-upload {
margin-bottom: 20px;
/deep/ .el-upload--picture-card {
width: 100%;
}
}
</style>
<template>
<div :class="{fullscreen:fullscreen}" class="tinymce-container editor-container">
<textarea :id="tinymceId" class="tinymce-textarea"/>
<div class="editor-custom-btn-container">
<editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK"/>
</div>
</div>
</template>
<script>
import editorImage from './components/editorImage'
import plugins from './plugins'
import toolbar from './toolbar'
import axios from "axios";
export default {
name: 'Tinymce',
components: { editorImage },
props: {
id: {
type: String,
default: function() {
return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
}
},
value: {
type: String,
default: ''
},
toolbar: {
type: Array,
required: false,
default() {
return []
}
},
menubar: {
type: String,
default: 'file edit insert view format table'
},
height: {
type: Number,
required: false,
default: 360
}
},
data() {
return {
hasChange: false,
hasInit: false,
tinymceId: this.id,
fullscreen: false,
languageTypeList: {
'en': 'en',
'zh': 'zh_CN'
}
}
},
computed: {
language() {
return this.languageTypeList[this.$store.getters.language]
}
},
watch: {
value(val) {
if (!this.hasChange && this.hasInit) {
this.$nextTick(() =>
window.tinymce.get(this.tinymceId).setContent(val || ''))
}
},
language() {
this.destroyTinymce()
this.$nextTick(() => this.initTinymce())
}
},
mounted() {
this.initTinymce()
},
activated() {
this.initTinymce()
},
deactivated() {
this.destroyTinymce()
},
destroyed() {
this.destroyTinymce()
},
methods: {
initTinymce() {
const _this = this
window.tinymce.init({
language: this.language,
selector: `#${this.tinymceId}`,
height: this.height,
body_class: 'panel-body ',
object_resizing: false,
toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar,
menubar: this.menubar,
plugins: plugins,
end_container_on_empty_block: true,
powerpaste_word_import: 'clean',
code_dialog_height: 450,
code_dialog_width: 1000,
advlist_bullet_styles: 'square',
advlist_number_styles: 'default',
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
default_link_target: '_blank',
link_title: false,
nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
init_instance_callback: editor => {
if (_this.value) {
editor.setContent(_this.value)
}
_this.hasInit = true
editor.on('NodeChange Change KeyUp SetContent', () => {
this.hasChange = true
this.$emit('input', editor.getContent())
})
},
setup(editor) {
editor.on('FullscreenStateChanged', (e) => {
_this.fullscreen = e.state
})
},
// 整合七牛上传
// images_dataimg_filter(img) {
// setTimeout(() => {
// const $image = $(img);
// $image.removeAttr('width');
// $image.removeAttr('height');
// if ($image[0].height && $image[0].width) {
// $image.attr('data-wscntype', 'image');
// $image.attr('data-wscnh', $image[0].height);
// $image.attr('data-wscnw', $image[0].width);
// $image.addClass('wscnph');
// }
// }, 0);
// return img
// },
images_upload_handler(blobInfo, success, failure, progress) {
progress(0);
const token = _this.$store.getters.token;
getToken(token).then(response => {
const url = response.data.qiniu_url;
const formData = new FormData();
formData.append('token', response.data.qiniu_token);
formData.append('key', response.data.qiniu_key);
formData.append('file', blobInfo.blob(), url);
upload(formData).then(() => {
success(url);
progress(100);
})
}).catch(err => {
failure('出现未知问题,刷新页面,或者联系程序员')
console.log(err);
});
},
})
},
destroyTinymce() {
const tinymce = window.tinymce.get(this.tinymceId)
if (this.fullscreen) {
tinymce.execCommand('mceFullScreen')
}
if (tinymce) {
tinymce.destroy()
}
},
setContent(value) {
window.tinymce.get(this.tinymceId).setContent(value)
},
getContent() {
return window.tinymce.get(this.tinymceId).getContent()
},
imageSuccessCBK(arr) {
const _this = this
arr.forEach(v => {
window.tinymce.get(_this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`)
})
}
}
}
</script>
<style scoped>
.tinymce-container {
position: relative;
line-height: normal;
}
.tinymce-container>>>.mce-fullscreen {
z-index: 10000;
}
.tinymce-textarea {
visibility: hidden;
z-index: -1;
}
.editor-custom-btn-container {
position: absolute;
right: 4px;
top: 4px;
/*z-index: 2005;*/
}
.fullscreen .editor-custom-btn-container {
z-index: 10000;
position: fixed;
}
.editor-upload-btn {
display: inline-block;
}
</style>
// Any plugins you want to use has to be imported
// Detail plugins list see https://www.tinymce.com/docs/plugins/
// Custom builds see https://www.tinymce.com/download/custom-builds/
const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount']
export default plugins
// Here is a list of the toolbar
// Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
export default toolbar
<template>
<div>
<el-form inline>
<el-form-item label="分组选择应用">
<el-cascader
:value="malValue"
:options="options"
@change="handleChange"
filterable
></el-cascader>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { menuSelectApps } from "@/api/report";
export default {
name: "ZxAppsSelect",
// model绑定value和change事件,实现双向绑定
model: {
prop: "myValue",
event: "changeValue",
},
props: {
menuCode: {
type: String,
default: "game.Overview",
},
platformId: {
type: Number,
default: 5,
},
},
data() {
return {
options: [],
malValue: [],
};
},
created() {
this.APIMenuSelectApps(); // 获取应用
},
methods: {
APIMenuSelectApps() {
let params = {
platformId: this.platformId,
menuCode: this.menuCode,
belongGroup: true,
};
menuSelectApps(params).then((res) => {
this.options = res.result.data;
});
},
// 值改变时,发出事件个改变的值,通过model注册这个事件,实现双向绑定
handleChange(val) {
this.$emit("changeValue", val);
},
},
};
</script>
<style>
</style>
\ No newline at end of file
- name: zx-apps-select
- 使用方式:
1. 引入组件 `import ZxAppsSelect from '@/components/ZxAppsSelect'`
2. 注册组件 `component: {ZxAppsSelect}`
3. 使用 `<zx-apps-select v-model='' />` 绑定的数据类型是Array ['1', 'com.ym.ywdr']
4. 接收参数
- `menuCode=''`, type: String, default: 'game.Overview'
- `platformId= `, type: Number, default: 5
- 这两个参数是用来请求数据的
\ No newline at end of file
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins
export default {
extends: Line,
mixins: [reactiveProp],
props: ['options'],
mounted() {
this.renderChart(this.chartData, this.options)
}
}
import ZxAppSelect from './zx-app-select'
import ZxAgentSelect from './zx-agent-select'
import ZxTableBasis from './zx-table-basis'
export default {
ZxAppSelect,
ZxAgentSelect,
ZxTableBasis
}
\ No newline at end of file
<template>
<div>
<el-select
v-model="value"
filterable
placeholder="请选择"
@change="handleChange"
>
<el-option
v-for="item in list"
:key="item.agent_id"
:value="item.agent_id"
:label="item.agent_name"
/>
</el-select>
</div>
</template>
<script>
import { fetchCommonTable } from "@/api/common";
export default {
name: "ZxAgentSelect",
props: {
pkg: {
type: String,
default: "",
},
},
data() {
return {
value: "",
list: [],
};
},
watch: {
value(val) {
this.$emit("input", val);
},
pkg(val) {
this._fetchCommonTable();
},
},
created() {
this._fetchCommonTable();
},
methods: {
_fetchCommonTable() {
let params = {
sqlId: 1109,
pkg: this.pkg,
};
fetchCommonTable(params).then((res) => {
this.list = res.result.data;
this.list.unshift({ agent_id: "", agent_name: "全部" });
});
},
handleChange(val) {
this.$emit("change", val);
},
},
};
</script>
<style>
</style>
\ No newline at end of file
<template>
<div>
<slot></slot>
<el-select
:value="value"
filterable
placeholder="请选择"
@change="handleChange"
>
<el-option
v-for="item in list"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select>
</div>
</template>
<script>
import { menuSelectApps } from "@/api/report";
export default {
name: "ZxAppSelect",
model: {
prop: "value",
event: "change",
},
props: {
platformId: {
type: Number,
default: 5,
},
menuCode: {
type: String,
default: "game.Overview",
},
defaultValue: {
type: String,
required: false,
},
addAllOption: {
type: [Boolean, String],
required: false,
},
value: {
type: [String, Number],
},
},
data() {
return {
queryDate: [],
selectValue: "",
list: [],
};
},
created() {
this.init();
},
// 子组件监控日期组件的值发生变化的时候,通过emit传给父组件,父组件用v-model接收。这样就把子组件的v-model功能,传给了父组件
watch: {
value(val) {
this.$emit("input", val);
},
},
methods: {
// 获取App名称配置列表
init: function () {
this.selectValue = this.defaultValue;
menuSelectApps({
platformId: this.platformId,
menuCode: this.menuCode,
}).then((res) => {
this.list = res.result.data;
if (this.addAllOption == "true" || this.addAllOption) {
this.list.unshift({
id: null,
label: "全部",
sku: null,
value: "",
});
}
});
},
handleChange(value) {
this.$emit("change", value);
},
},
};
</script>
<template>
<el-table
:data="data"
:height="height"
:border="border"
:stripe="stripe"
fit
:cell-style="{ textAlign: 'center' }"
:header-cell-style="{ textAlign: 'center' }"
>
<el-table-column
v-for="(item, index) in tHeader"
:key="item.id ? item.id : index"
:prop="item.prop"
:label="item.label"
:sortable="item.sortable ? item.sortable : false"
/>
</el-table>
</template>
<script>
export default {
name: "ZxTableBasis",
props: {
data: {
type: Array,
require: true,
},
tHeader: {
type: Array,
require: true,
},
height: {
type: String,
default: "80vh",
},
border: {
type: Boolean,
default: true,
},
stripe: {
type: Boolean,
default: true,
},
},
};
</script>
<style>
</style>
\ No newline at end of file
export const pkgOption = JSON.parse(window.localStorage.getItem("pkgOption"));
export const payTypeList = [
{
value: 'alipay',
label: '支付宝'
},
{
value: 'weixin',
label: '微信'
}
]
export const sourceOption = [{
value: 'common',
label: '默认'
}, {
value: 'toutiao',
label: '头条'
}, {
value: 'kuaishou',
label: '快手'
}, {
value: 'oppo',
label: 'oppo'
}, {
value: 'youmi',
label: '有米'
}, {
value: 'vivo',
label: 'vivo'
}, {
value: 'qutoutiao',
label: '趣头条'
}, {
value: 'xiaomi',
label: '小米'
}, {
value: '_360',
label: '_360'
}, {
value: 'dsp',
label: 'dsp'
}, {
value: 'yyb',
label: '应用宝'
}, {
value: 'meizu',
label: '魅族'
}]
export const gobackRemarkOption = [{
value: '提现绑定微信未进行实名认证',
label: '提现绑定微信未进行实名认证'
}]
export const rejectRemarkOption = [{
value: '系统判定有作弊行为',
label: '系统判定有作弊行为'
}]
export const cashOption = [{
value: '0.3',
label: '0.3'
}, {
value: '0.36',
label: '0.36'
}, {
value: '1',
label: '1'
}, {
value: '2',
label: '2'
}, {
value: '5',
label: '5'
}, {
value: '10',
label: '10'
}, {
value: '20',
label: '20'
}, {
value: '50',
label: '50'
}]
export const adPlatformOption = [{
value: 'chuanshanjia',
label: '穿山甲'
}, {
value: 'guangdiantong',
label: '广点通'
}, {
value: 'baidu',
label: '百度'
}, {
value: 'kuaishou',
label: '快手'
}, {
value: 'feima',
label: '飞马'
}, {
value: 'sogou',
label: '搜狗'
}, {
value: 'xunfei',
label: '讯飞'
}, {
value: 'baihui',
label: '百汇'
}, {
value: 'self_dsp',
label: '非sdk联盟广告'
}]
export const pageOption = [{
value: '首页',
label: '首页'
}, {
value: '内文页',
label: '内文页'
}]
export const adIdOption = [
{
value: '118',
label: '穿山甲大图广告'
}, {
value: '1934',
label: '穿山甲激励视频'
}, {
value: '2086',
label: '穿山甲全屏视频'
}, {
value: '141',
label: '广点通大图广告'
}, {
value: '2046',
label: '广点通激励视频'
}, {
value: '2112',
label: '快手API大图广告'
}, {
value: '2232',
label: '快手SDK大图广告'
}, {
value: '2039',
label: '快手激励视频'
}, {
value: '2156',
label: '快手全屏视频'
}, {
value: '2176',
label: '飞马激励视频'
}, {
value: '2230',
label: '搜狗大图广告'
}, {
value: '2239',
label: '讯飞大图广告'
}, {
value: '2240',
label: '讯飞激励视频'
}, {
value: '2263',
label: '百汇激励视频'
}, {
value: '2264',
label: '百汇全屏视频'
}]
export const adTypeOption = [
{
value: '信息流广告',
label: '信息流广告'
}, {
value: '开屏广告',
label: '开屏广告'
}, {
value: '激励视频广告',
label: '激励视频广告'
}, {
value: '非SDK联盟广告',
label: '非SDK联盟广告'
}]
export const sdkRenderTypeOption = [
{
value: 1,
label: '自渲染'
}, {
value: 2,
label: '模板渲染'
}]
// ----------广告投放配置--------------------
// 匹配ID类型
export const matchIdType = [
{ label: '广告主', value: 1, id: 1 },
{ label: '广告组', value: 2, id: 2 },
{ label: '计划', value: 3, id: 3 },
{ label: '包', value: 4, id: 4 },
]
// 上报类型
export const reportType = [
// { label: '激活', value: 'active', id: 1 },
{ label: '关键行为', value: 'keyword', id: 2 },
{ label: '付费', value: 'pay', id: 3 },
{ label: '次留', value: 'retain', id: 4 },
{ label: '注册', value: 'register', id: 5 },
]
// 统计方式
export const statMethod = [
{ label: '事件累计', value: 'accumulate', id: 1 },
{ label: 'ecpm', value: 'cpm', id: 2 },
{ label: '混合', value: 'mix', id: 3 },
]
// 上报时间
export const reportTimeMethod = [
{ label: '自然天', value: 'day', id: 1 },
{ label: '顺延小时', value: 'nextHour', id: 2 },
]
// 激活统计方式
export const activeStatMethod = [
{ label: '默认', value: 'default', id: 1 },
{ label: '事件累计', value: 'accumulate', id: 2 },
{ label: 'ecpm', value: 'cpm', id: 3 },
{ label: '混合', value: 'mix', id: 4 },
]
// ------------------------------------------
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg组件
// register globally
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"/></svg>
\ No newline at end of file
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
\ No newline at end of file
<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
\ No newline at end of file
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
\ No newline at end of file
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
\ No newline at end of file
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment