提交 c7d13d25 编写于 作者: L ligang

Initial module escheduler-ui commit

上级 5c45f92f
{
"presets": [
["env", {
"loose": true,
"debug": false,
"useBuiltIns": true,
"targets": {
"browsers": [ "ie > 8", "last 2 version", "safari >= 9" ]
},
"production": {
"plugins": ["transform-remove-console"]
}
}]
],
"plugins": [
[ "transform-runtime", {
"helpers": false,
"polyfill": false,
"regenerator": true } ],
[ "transform-class-properties", { "spec": true } ],
[ "transform-object-rest-spread", { "useBuiltIns": true } ],
[ "transform-vue-jsx" ],
[ "syntax-dynamic-import" ]
],
"comments": false
}
\ No newline at end of file
# editorconfig.org
# author: axin
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.py]
indent_style = space
indent_size = 4
[*.md]
trim_trailing_whitespace = false
[COMMIT_EDITMSG]
max_line_length = 80
# 后端接口地址
API_BASE = http://192.168.xx.xx:12345
# 本地开发如需ip访问项目把"#"号去掉
#DEV_HOST = 192.168.xx.xx
globals:
$: true
expect: true
rules:
"no-new": "off"
"no-labels": [2, {"allowLoop": true}]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var fs = require('fs')
var path = require('path')
var request = require('request')
var cdnUrl = 'https://s1.analysys.cn/libs/??'
var version = '1.0.0'
// js集合
var jslibs = {
'es5': [
'es5-shim/4.5.7/es5-shim.min.js',
'es5-shim/4.5.7/es5-sham.min.js'
],
'3rd': [
'vue/2.5.2/vue.js',
'vue-router/2.7.0/vue-router.min.js',
'vuex/3.0.0/vuex.min.js',
'jquery/3.3.1/jquery.min.js',
'lodash.js/4.17.5/lodash.min.js',
'jqueryui/1.12.1/jquery-ui.min.js',
'twitter-bootstrap/3.3.7/js/bootstrap.min.js',
'jsPlumb/2.8.5/js/jsplumb.min.js',
'clipboard.js/2.0.1/clipboard.min.js',
'd3/3.3.6/d3.min.js',
'echarts/4.1.0/echarts.min.js',
'dayjs/1.7.8/dayjs.min.js',
'codemirror/5.43.0/codemirror.min.js',
'codemirror/5.43.0/mode/sql/sql.min.js',
'codemirror/5.43.0/addon/hint/show-hint.min.js',
'codemirror/5.43.0/addon/hint/sql-hint.min.js',
'codemirror/5.43.0/mode/textile/textile.min.js',
'codemirror/5.43.0/mode/shell/shell.min.js',
'codemirror/5.43.0/mode/python/python.min.js',
'codemirror/5.43.0/addon/hint/xml-hint.min.js',
'codemirror/5.43.0/mode/xml/xml.min.js',
'html2canvas/0.5.0-beta4/html2canvas.min.js',
'canvg/1.5/canvg.min.js'
],
'local': []
}
// css集合
csslibs = {
'base': [
'normalize/7.0.0/normalize.min.css',
'twitter-bootstrap/3.3.7/css/bootstrap.min.css',
'-/@analysys/reset.css@1.0.1',
'-/@vue/animate.css@'
],
'3rd': [
'highlight.js/9.13.1/styles/vs.min.css',
'jsPlumb/2.8.5/css/jsplumbtoolkit-defaults.min.css',
'codemirror/5.43.0/codemirror.min.css',
'codemirror/5.20.0/theme/mdn-like.min.css',
'codemirror/5.43.0/addon/hint/show-hint.min.css'
]
}
// 创建文件夹目录
var dirPath = path.resolve(__dirname, '..', 'src/combo/' + version)
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath)
console.log('文件夹创建成功')
} else {
console.log('文件夹已存在')
}
var jsKeys = Object.keys(jslibs)
var jsUrl = jsKeys.map(v => {
return jslibs[v].join()
})
jsUrl.forEach((v, i) => {
var url = cdnUrl + v
console.log(url)
var stream = fs.createWriteStream(path.join(dirPath, jsKeys[i] + '.js'), { encoding: 'utf-8' })
request(url).pipe(stream).on('close', function (err) {
if (!err) {
console.log('文件[' + version + '/' + jsKeys[i] + '.js' + ']下载完毕')
}
})
})
var cssKeys = Object.keys(csslibs)
var cssUrl = cssKeys.map(v => {
return csslibs[v].join()
})
cssUrl.forEach((v, i) => {
var url = cdnUrl + v
console.log(url)
var stream = fs.createWriteStream(path.join(dirPath, cssKeys[i] + '.css'), { encoding: 'utf-8' })
request(url).pipe(stream).on('close', function (err) {
if (!err) {
console.log('文件[' + version + '/' + cssKeys[i] + '.css' + ']下载完毕')
}
})
})
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const path = require('path')
const glob = require('globby')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const HtmlWebpackExtPlugin = require('html-webpack-ext-plugin')
const isProduction = process.env.NODE_ENV !== 'development'
const resolve = dir => path.join(__dirname, '..', dir)
const assetsDir = resolve('src')
const distDir = resolve('dist')
const viewDir = resolve('src/view')
function moduleName (modules) {
let filename = path.basename(modules)
let parts = filename.split('.')
parts.pop()
filename = parts.join('.')
return path.dirname(modules) + '/' + filename
}
const jsEntry = (() => {
const obj = {}
const files = glob.sync(['js/conf/*/!(_*).js'], { cwd: assetsDir })
files.forEach(val => {
let parts = val.split(/[\\/]/)
parts.shift()
parts.shift()
let modules = parts.join('/')
let entry = moduleName(modules)
obj[entry] = val
})
return obj
})()
const minifierConfig = isProduction ? {
removeComments: true,
removeCommentsFromCDATA: true,
collapseWhitespace: true,
collapseBooleanAttributes: true,
removeRedundantAttributes: true,
useShortDoctype: true,
minifyJS: true,
removeScriptTypeAttributes: true,
maxLineLength: 1024
} : false
const getPageEntry = view => jsEntry[view] ? view : ''
// 重新定向输出页面
const pageRewriter = {
'view/home/index.*': 'index.html'
}
const isEmpty = o => {
for (let k in o) {
if (o.hasOwnProperty(k)) {
return
}
}
return true
}
const unixPath = v => v.replace(/\\/g, '/')
const rewriterPath = p => {
if (isEmpty(pageRewriter)) {
return
}
for (let k in pageRewriter) {
let regx = new RegExp(k)
if (regx.test(unixPath(p))) {
return pageRewriter[k]
}
}
}
const pages = glob.sync(['*/!(_*).html'], { cwd: viewDir }).map(p => {
let pagePath = `${path.join(viewDir, p)}`
let newPagePath = rewriterPath(pagePath)
let entry = getPageEntry(p.replace('.html', ''))
let chunks = ['common']
if (entry) {
chunks.push(entry)
}
return new HtmlWebpackPlugin({
filename: newPagePath || path.join('view', p),
template: `html-loader?min=false!${path.join(viewDir, p)}`,
cache: true,
inject: true,
chunks: chunks,
minify: minifierConfig
})
})
const baseConfig = {
entry: jsEntry,
output: {
path: distDir,
publicPath: '/',
filename: 'js/[name].[chunkhash:7].js'
},
devServer: {
historyApiFallback: true,
hot: true,
inline: true,
progress: true
},
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
cacheIdentifier: true
}
}
]
},
{
test: /\.(png|jpe?g|gif|svg|cur)(\?.*)?$/,
loader: 'file-loader',
options: {
name: 'images/[name].[ext]?[hash]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
// publicPath: distDir,
name: 'font/[name].[hash:7].[ext]'
}
}
]
},
resolve: {
modules: [
resolve('node_modules'),
resolve('src'),
resolve('src/js')
],
alias: {
'@': resolve('src/js'),
'~': resolve('src/lib')
},
extensions: ['.js', 'json', '.vue', '.scss']
},
externals: {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'jquery': '$',
'lodash': '_',
'bootstrap': 'bootstrap',
'd3': 'd3',
'canvg': 'canvg',
'html2canvas': 'html2canvas',
'./jsplumb': 'jsPlumb',
'./highlight.js': 'highlight.js',
'./clipboard': 'clipboard',
'./codemirror': 'CodeMirror'
},
plugins: [
new webpack.ProvidePlugin({ vue: 'Vue', _: 'lodash' }),
new HtmlWebpackExtPlugin({
cache: true,
delimiter: '$',
locals: {
NODE_ENV:isProduction
}
}),
...pages
]
}
module.exports = {
isProduction,
assetsDir,
distDir,
baseConfig
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const fs = require('fs');
const path = require('path')
const glob = require('globby')
function moduleName (modules) {
let filename = path.basename(modules)
let parts = filename.split('.')
parts.pop()
filename = parts.join('.')
return path.dirname(modules) + '/' + filename
}
const jsEntry = () => {
const obj = {}
const files = glob.sync([
'./src/js/conf/login/**/*.vue',
'./src/js/conf/login/**/*.js',
'./src/js/conf/home/**/**/**/**/**/**/**/**/*.vue',
'./src/js/conf/home/**/**/**/**/**/**/**/**/*.js',
'./src/js/module/**/**/**/**/**/*.vue',
'./src/js/module/**/**/**/**/**/*.js'
])
files.forEach(val => {
let parts = val.split(/[\\/]/)
parts.shift()
parts.shift()
let modules = parts.join('/')
let entry = moduleName(modules)
obj[entry] = val
})
return obj
}
/* eslint-disable */
let reg = /\$t\([\w,""''“”~\-\s.?!,。:;《》、\+\/<>()?!\u4e00-\u9fa5]*\)/g
let map = {}
let entryPathList = ''
let matchPathList = ''
let jsEntryObj = jsEntry()
for (let i in jsEntryObj) {
entryPathList += jsEntryObj[i] + '\n'
let data = fs.readFileSync(path.join(jsEntryObj[i]), 'utf-8')
if (reg.test(data)) {
matchPathList += jsEntryObj[i] + '\n'
let str = data.replace(/[""'']/g, '')
str.replace(reg, function () {
if (arguments && arguments[0]) {
let key = arguments[0]
key = key.substring(3, key.length - 1)
map[key] = key
}
})
}
}
let outPath = path.join(__dirname, '../src/js/module/i18n/locale/zh_CN.js')
fs.unlink(outPath, (err) => {
if (err) {
console.error('删除zh_CN.js文件出错 -- \n', err)
} else {
console.log('删除zh_CN.js文件成功')
}
})
fs.writeFile(outPath, 'export default ' + JSON.stringify(map, null, 2), function (err) {
if (err) {
console.error('写入zh_CN.js文件出错 -- \n', err)
} else {
console.log('写入zh_CN.js文件成功')
}
})
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const webpack = require('webpack')
const merge = require('webpack-merge')
const { assetsDir, baseConfig } = require('./config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const ProgressPlugin = require('./../src/lib/@fedor/progress-webpack-plugin')
const getEnv = require('env-parse').getEnv
const config = merge.smart(baseConfig, {
devtool: 'eval-source-map',
output: {
filename: 'js/[name].js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: true // 开启热重载
}
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
}
]
},
devServer: {
hot: true,
contentBase: assetsDir,
publicPath: baseConfig.output.publicPath,
port: getEnv('DEV_PORT', 8888),
host: getEnv('DEV_HOST', 'localhost'),
noInfo: false,
historyApiFallback: true,
disableHostCheck: true,
proxy: {
'/escheduler': {
target: getEnv('API_BASE', 'http://local.dev:8080/backend'),
changeOrigin: true
}
},
progress: false,
quiet: false,
stats: {
colors: true
},
clientLogLevel: 'none'
},
plugins: [
new ProgressPlugin(),
new webpack.HotModuleReplacementPlugin(),
new ExtractTextPlugin({ filename: 'css/[name].css', allChunks: true }),
new webpack.optimize.CommonsChunkPlugin({ name: 'common', filename: 'js/[name].js' }),
new webpack.optimize.OccurrenceOrderPlugin()
]
})
module.exports = config
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const path = require('path')
const webpack = require('webpack')
const merge = require('webpack-merge')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const { baseConfig } = require('./config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const UglifyJSPlugin = require('uglifyjs-webpack-plugin')
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const ProgressPlugin = require('./../src/lib/@fedor/progress-webpack-plugin')
const resolve = dir =>
path.resolve(__dirname, '..', dir)
const config = merge.smart(baseConfig, {
devtool: 'source-map',
output: {
filename: 'js/[name].[chunkhash:7].js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: false // 开启热重载
}
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
}
]
},
plugins: [
new ProgressPlugin(),
new ExtractTextPlugin({ filename: 'css/[name].[contenthash:7].css', allChunks: true }),
new webpack.optimize.CommonsChunkPlugin({ name: 'common', filename: 'js/[name].[hash:7].js' }),
new webpack.optimize.OccurrenceOrderPlugin(),
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorOptions: { discardComments: { removeAll: true } },
canPrint: true
}),
new UglifyJSPlugin({
parallel: true,
sourceMap: true,
uglifyOptions: {
compress: {
drop_console: true,
drop_debugger: true
},
comments: function (n, c) {
/*! IMPORTANT: Please preserve 3rd-party library license info, inspired from @allex/amd-build-worker/config/jsplumb.js */
var text = c.value, type = c.type
if (type === 'comment2') {
return /^!|@preserve|@license|@cc_on|MIT/i.test(text)
}
}
}
}),
new CopyWebpackPlugin([
{
from: resolve('src/combo'),
to: resolve('dist/combo')
},
{
from: resolve('src/lib'),
to: resolve('dist/lib')
},
{
from: resolve('src/images'),
to: resolve('dist/images')
},
]),
]
})
module.exports = config
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const webpack = require('webpack')
const merge = require('webpack-merge')
const { baseConfig } = require('./config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const config = merge.smart(baseConfig, {
devtool: 'inline-source-map',
output: {
filename: 'js/[name].js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: true // 开启热重载
}
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
'browsers': [ '> 1%', 'last 3 versions', 'ie >= 9' ]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
}
]
},
externals: '',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new ExtractTextPlugin({ filename: 'css/[name].css', allChunks: true }),
new webpack.optimize.OccurrenceOrderPlugin()
]
})
module.exports = config
{
"name": "escheduler",
"version": "1.0.0",
"description": "调度平台前端项目",
"author": "gongzijian <gongzijian@analysys.com.cn>",
"scripts": {
"build": "npm run clean && cross-env NODE_ENV=production webpack --config ./build/webpack.config.prod.js",
"dev": "cross-env NODE_ENV=development webpack-dev-server --config ./build/webpack.config.dev.js",
"clean": "rimraf dist",
"lint": "standard \"**/*.{js,vue}\"",
"lint:fix": "standard \"**/*.{js,vue}\" --fix",
"start": "npm run dev",
"combo": "node ./build/combo.js"
},
"dependencies": {
"autoprefixer": "^9.1.0",
"babel-core": "^6.25.0",
"babel-eslint": "^8.2.2",
"babel-helper-vue-jsx-merge-props": "^2.0.2",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.6.1",
"babel-runtime": "^6.26.0",
"bootstrap": "3.3.7",
"canvg": "1.5",
"clipboard": "^2.0.1",
"codemirror": "^5.43.0",
"copy-webpack-plugin": "^4.5.2",
"cross-env": "^5.2.0",
"css-loader": "^0.28.8",
"cssnano": "4.1.10",
"d3": "^3.5.17",
"dayjs": "^1.7.8",
"echarts": "^4.1.0",
"env-parse": "^1.0.5",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.11",
"ghooks": "^2.0.4",
"globby": "^8.0.1",
"html-loader": "^0.5.5",
"html-webpack-ext-plugin": "^1.0.0",
"html-webpack-plugin": "^3.2.0",
"html2canvas": "^0.5.0-beta4",
"jsplumb": "^2.8.6",
"lodash": "^4.17.11",
"node-sass": "^4.9.2",
"optimize-css-assets-webpack-plugin": "3.2.0",
"postcss-loader": "^2.1.6",
"rimraf": "^2.6.2",
"sass-loader": "^7.1.0",
"uglifyjs-webpack-plugin": "^1.2.7",
"url-loader": "^0.5.9",
"vue-loader": "^13.7.0",
"vue-style-loader": "^4.1.1",
"vue-template-compiler": "^2.5.16",
"vuex-router-sync": "^4.1.2",
"webpack": "^3.12.0",
"webpack-dev-server": "^2.11.2",
"webpack-merge": "^4.1.4"
},
"standard": {
"parser": "babel-eslint",
"ignore": [
"src/~/**",
"src/view/docs/**",
"src/font/*",
"src/combo/**",
"dist/**",
"src/lib/**",
"build/**"
]
},
"config": {
"ghooks": {}
},
"devDependencies": {
"jasmine-core": "^3.2.1",
"jquery": "1.12.4",
"karma": "^3.0.0",
"karma-browserstack-launcher": "^1.3.0",
"karma-chrome-launcher": "^2.2.0",
"karma-coverage": "^1.1.2",
"karma-jasmine": "^1.1.2",
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "^0.0.32",
"karma-webpack": "^3.0.0",
"vue": "^2.5.17",
"vue-router": "2.7.0",
"vuex": "^3.0.0"
}
}
.hljs{display:block;overflow-x:auto;padding:0.5em;background:white;color:black}.hljs-comment,.hljs-quote,.hljs-variable{color:#008000}.hljs-keyword,.hljs-selector-tag,.hljs-built_in,.hljs-name,.hljs-tag{color:#00f}.hljs-string,.hljs-title,.hljs-section,.hljs-attribute,.hljs-literal,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-addition{color:#a31515}.hljs-deletion,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-meta{color:#2b91af}.hljs-doctag{color:#808080}.hljs-attr{color:#f00}.hljs-symbol,.hljs-bullet,.hljs-link{color:#00b0e8}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}
.jtk-node{position:absolute}.jtk-group{position:absolute;overflow:visible}[jtk-group-content]{position:relative}.katavorio-clone-drag{pointer-events:none}.jtk-surface{overflow:hidden!important;position:relative;cursor:move;cursor:-moz-grab;cursor:-webkit-grab;touch-action:none}.jtk-surface-panning{cursor:-moz-grabbing;cursor:-webkit-grabbing;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jtk-surface-canvas{overflow:visible!important}.jtk-surface-droppable-node{touch-action:none}.jtk-surface-nopan{overflow:scroll!important;cursor:default}.jtk-surface-tile{border:none;outline:0;margin:0;-webkit-transition:opacity .3s ease .15s;-moz-transition:opacity .3s ease .15s;-o-transition:opacity .3s ease .15s;-ms-transition:opacity .3s ease .15s;transition:opacity .3s ease .15s}.jtk-lasso{border:2px solid #3177b8;background-color:#f5f5f5;opacity:.5;display:none;z-index:20000;position:absolute}.jtk-lasso-select-defeat *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jtk-lasso-mask{position:fixed;z-index:20000;display:none;opacity:.5;background-color:#07234e;top:0;bottom:0;left:0;right:0}.jtk-surface-selected-element{border:2px dashed #f76258!important}.jtk-surface-pan{background-color:Azure;opacity:.4;text-align:center;cursor:pointer;z-index:2;-webkit-transition:background-color .15s ease-in;-moz-transition:background-color .15s ease-in;-o-transition:background-color .15s ease-in;transition:background-color .15s ease-in}.jtk-surface-pan-bottom,.jtk-surface-pan-top{width:100%;height:20px}.jtk-surface-pan-bottom:hover,.jtk-surface-pan-left:hover,.jtk-surface-pan-right:hover,.jtk-surface-pan-top:hover{opacity:.6;background-color:#3177b8;color:#fff;font-weight:700}.jtk-surface-pan-left,.jtk-surface-pan-right{width:20px;height:100%;line-height:40}.jtk-surface-pan-active,.jtk-surface-pan-active:hover{background-color:#f76258}.jtk-miniview{overflow:hidden!important;width:125px;height:125px;position:relative;background-color:#b2c9cd;border:1px solid #e2e6cd;border-radius:4px;opacity:.8}.jtk-miniview-panner{border:5px dotted #f5f5f5;opacity:.4;background-color:#4f6f7e;cursor:move;cursor:-moz-grab;cursor:-webkit-grab}.jtk-miniview-panning{cursor:-moz-grabbing;cursor:-webkit-grabbing}.jtk-miniview-element{background-color:#607a86;position:absolute}.jtk-miniview-group-element{background:0 0;border:2px solid #607a86}.jtk-miniview-collapse{color:#f5f5f5;position:absolute;font-size:18px;top:-1px;right:3px;cursor:pointer;font-weight:700}.jtk-miniview-collapse:before{content:"\2012"}.jtk-miniview-collapsed{background-color:#449ea6;border-radius:4px;height:22px;margin-right:0;padding:4px;width:21px}.jtk-miniview-collapsed .jtk-miniview-element,.jtk-miniview-collapsed .jtk-miniview-panner{visibility:hidden}.jtk-miniview-collapsed .jtk-miniview-collapse:before{content:"+"}.jtk-miniview-collapse:hover{color:#e4f013}.jtk-dialog-underlay{left:0;right:0;top:0;bottom:0;position:fixed;z-index:100000;opacity:.8;background-color:#ccc;display:none}.jtk-dialog-overlay{position:fixed;z-index:100001;display:none;background-color:#fff;font-family:"Open Sans",sans-serif;padding:7px;box-shadow:0 0 5px gray;overflow:hidden}.jtk-dialog-overlay-x{max-height:0;transition:max-height .5s ease-in;-moz-transition:max-height .5s ease-in;-ms-transition:max-height .5s ease-in;-o-transition:max-height .5s ease-in;-webkit-transition:max-height .5s ease-in}.jtk-dialog-overlay-y{max-width:0;transition:max-width .5s ease-in;-moz-transition:max-width .5s ease-in;-ms-transition:max-width .5s ease-in;-o-transition:max-width .5s ease-in;-webkit-transition:max-width .5s ease-in}.jtk-dialog-overlay-top{top:20px}.jtk-dialog-overlay-bottom{bottom:20px}.jtk-dialog-overlay-left{left:20px}.jtk-dialog-overlay-right{right:20px}.jtk-dialog-overlay-x.jtk-dialog-overlay-visible{max-height:1000px}.jtk-dialog-overlay-y.jtk-dialog-overlay-visible{max-width:1000px}.jtk-dialog-buttons{text-align:right;margin-top:5px}.jtk-dialog-button{border:none;cursor:pointer;margin-right:5px;min-width:56px;background-color:#fff;outline:1px solid #ccc}.jtk-dialog-button:hover{color:#fff;background-color:#234b5e}.jtk-dialog-title{text-align:left;font-size:14px;margin-bottom:9px}.jtk-dialog-content{font-size:12px;text-align:left;min-width:250px;margin:0 14px}.jtk-dialog-content ul{width:100%;padding-left:0}.jtk-dialog-content label{cursor:pointer;font-weight:inherit}.jtk-dialog-overlay input,.jtk-dialog-overlay textarea{background-color:#fff;border:1px solid #ccc;color:#333;font-size:14px;font-style:normal;outline:0;padding:6px 4px;margin-right:6px}.jtk-dialog-overlay input:focus,.jtk-dialog-overlay textarea:focus{background-color:#cbeae1;border:1px solid #83b8a8;color:#333;font-size:14px;font-style:normal;outline:0}.jtk-draw-skeleton{position:absolute;left:0;right:0;top:0;bottom:0;outline:2px solid #84acb3;opacity:.8}.jtk-draw-handle{position:absolute;width:7px;height:7px;background-color:#84acb3}.jtk-draw-handle-tl{left:0;top:0;cursor:nw-resize}.jtk-draw-handle-tr{right:0;top:0;cursor:ne-resize}.jtk-draw-handle-bl{left:0;bottom:0;cursor:sw-resize}.jtk-draw-handle-br{bottom:0;right:0;cursor:se-resize}.jtk-draw-drag{display:none;position:absolute;left:50%;top:50%;margin-left:-10px;margin-top:-10px;width:20px;height:20px;background-color:#84acb3;cursor:move}.jtk-drag-select-defeat *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}
.cm-s-mdn-like.CodeMirror{color:#999;background-color:#fff}.cm-s-mdn-like .CodeMirror-line::selection,.cm-s-mdn-like .CodeMirror-line>span::selection,.cm-s-mdn-like .CodeMirror-line>span>span::selection,.cm-s-mdn-like div.CodeMirror-selected{background:#cfc}.cm-s-mdn-like .CodeMirror-line::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span>span::-moz-selection{background:#cfc}.cm-s-mdn-like .CodeMirror-gutters{background:#f8f8f8;border-left:6px solid rgba(0,83,159,.65);color:#333}.cm-s-mdn-like .CodeMirror-linenumber{color:#aaa;padding-left:8px}.cm-s-mdn-like .CodeMirror-cursor{border-left:2px solid #222}.cm-s-mdn-like .cm-keyword{color:#6262FF}.cm-s-mdn-like .cm-atom{color:#F90}.cm-s-mdn-like .cm-number{color:#ca7841}.cm-s-mdn-like .cm-def{color:#8DA6CE}.cm-s-mdn-like span.cm-tag,.cm-s-mdn-like span.cm-variable-2{color:#690}.cm-s-mdn-like .cm-variable,.cm-s-mdn-like span.cm-def,.cm-s-mdn-like span.cm-variable-3{color:#07a}.cm-s-mdn-like .cm-property{color:#905}.cm-s-mdn-like .cm-qualifier{color:#690}.cm-s-mdn-like .cm-operator{color:#cda869}.cm-s-mdn-like .cm-comment{color:#777;font-weight:400}.cm-s-mdn-like .cm-string{color:#07a;font-style:italic}.cm-s-mdn-like .cm-string-2{color:#bd6b18}.cm-s-mdn-like .cm-meta{color:#000}.cm-s-mdn-like .cm-builtin{color:#9B7536}.cm-s-mdn-like .cm-tag{color:#997643}.cm-s-mdn-like .cm-attribute{color:#d6bb6d}.cm-s-mdn-like .cm-header{color:#FF6400}.cm-s-mdn-like .cm-hr{color:#AEAEAE}.cm-s-mdn-like .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-mdn-like .cm-error{border-bottom:1px solid red}div.cm-s-mdn-like .CodeMirror-activeline-background{background:#efefff}div.cm-s-mdn-like span.CodeMirror-matchingbracket{outline:grey solid 1px;color:inherit}.cm-s-mdn-like.CodeMirror{background-image:url(/~/codemirror/5.20.0/theme/mdn-like.min.css)}
.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}
此差异已折叠。
此差异已折叠。
此差异已折叠。
Not found
\ No newline at end of file
此差异已折叠。
此差异已折叠。
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
此差异已折叠。
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1553668631606'); /* IE9 */
src: url('iconfont.eot?t=1553668631606#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
url('iconfont.woff?t=1553668631606') format('woff'),
url('iconfont.ttf?t=1553668631606') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1553668631606#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-bianjixiugai:before {
content: "\e601";
}
.icon-shibai:before {
content: "\e626";
}
.icon-dengdai:before {
content: "\e62a";
}
.icon-shuaxin1:before {
content: "\e6c2";
}
.icon-qidong:before {
content: "\e60b";
}
.icon-gantt:before {
content: "\e694";
}
.icon-gongzuoliuchengtu:before {
content: "\e600";
}
.icon-chenggongyijiejue:before {
content: "\e6d4";
}
.icon-home:before {
content: "\e61d";
}
.icon-fuzhi:before {
content: "\e61e";
}
.icon-shanchu1:before {
content: "\e611";
}
.icon-xitongcaozuorizhi:before {
content: "\e691";
}
.icon-dingwei:before {
content: "\e7c4";
}
.icon-yunxingzhong:before {
content: "\e6bb";
}
.icon-shezhishedingpeizhichilun:before {
content: "\e80f";
}
.icon-zhiyuanshuaxin9:before {
content: "\e633";
}
.icon-tishi2:before {
content: "\e693";
}
.icon-one-line-arrow:before {
content: "\e61c";
}
.icon-quanping:before {
content: "\e6e0";
}
.icon-quanping1:before {
content: "\e660";
}
.icon-shanchu:before {
content: "\e630";
}
.icon-yonghu:before {
content: "\e638";
}
.icon-ai06:before {
content: "\e677";
}
.icon-ai05:before {
content: "\e679";
}
.icon-yonghu1:before {
content: "\e629";
}
.icon-wenjianjia:before {
content: "\e768";
}
.icon-chenggong:before {
content: "\e607";
}
.icon-anquan:before {
content: "\e671";
}
.icon-shuaxin:before {
content: "\e602";
}
.icon-wendangxiugai:before {
content: "\e723";
}
.icon-download:before {
content: "\e610";
}
.icon-icon-xiugai:before {
content: "\e60d";
}
.icon-remove:before {
content: "\e60e";
}
.icon-paibanguanli:before {
content: "\e612";
}
.icon-shezhi-xue:before {
content: "\e631";
}
.icon-tianjia-xue:before {
content: "\e636";
}
.icon-tuichufffpx:before {
content: "\e60c";
}
.icon-jiazaizhong:before {
content: "\e6af";
}
.icon-gou1:before {
content: "\e651";
}
.icon-shalou:before {
content: "\e62e";
}
.icon-stop:before {
content: "\e6e6";
}
.icon-timer:before {
content: "\e75e";
}
.icon-jiantou-copy:before {
content: "\e632";
}
.icon-tingzhi:before {
content: "\e6ae";
}
.icon-yunsuan-dengyu:before {
content: "\e604";
}
.icon-bianji:before {
content: "\e603";
}
.icon-xiangmuguanli:before {
content: "\e635";
}
.icon-yilaiguanxi:before {
content: "\e68c";
}
.icon-erji-xiaxianjilu:before {
content: "\eab6";
}
.icon-daima:before {
content: "\e63b";
}
.icon-wendangxiazai1:before {
content: "\e628";
}
.icon-lishi:before {
content: "\e6ee";
}
.icon-fangda:before {
content: "\e60a";
}
.icon-suoxiao:before {
content: "\e60f";
}
.icon-daohang:before {
content: "\e609";
}
.icon-shijianguanli:before {
content: "\e61a";
}
.icon-shujuku:before {
content: "\eef4";
}
.icon-tiaoduzhongxin:before {
content: "\e692";
}
.icon-shubiaozhizhen:before {
content: "\e781";
}
.icon-yuandian:before {
content: "\e7c2";
}
.icon--Tree-Structure:before {
content: "\e637";
}
.icon-xia:before {
content: "\e61b";
}
.icon-zanting:before {
content: "\e614";
}
.icon-yonghu3:before {
content: "\e64a";
}
.icon-shanchu2:before {
content: "\e6ce";
}
.icon-guanbi:before {
content: "\e6e2";
}
.icon-cuowuguanbishibai:before {
content: "\e75d";
}
.icon-icon_paging_left:before {
content: "\e652";
}
.icon-icon_paging_left-copy:before {
content: "\eef5";
}
.icon-rizhishezhi:before {
content: "\e613";
}
.icon-icon-test:before {
content: "\e615";
}
.icon-zanting1:before {
content: "\e688";
}
.icon-shijianfenlei:before {
content: "\e6dd";
}
.icon-erji-xiaxianjilu-copy:before {
content: "\eef6";
}
.icon-tiaoduzhongxin-copy:before {
content: "\eef7";
}
.icon-juxingkaobei:before {
content: "\e7a5";
}
.icon-LOGO-:before {
content: "\e639";
}
.icon-jiantou-copy-copy:before {
content: "\eef8";
}
此差异已折叠。
此差异已折叠。
<template>
<m-layout>
<m-nav slot="top"></m-nav>
<router-view slot="bottom"></router-view>
</m-layout>
</template>
<script>
import mLayout from '@/module/components/layout/layout'
import mNav from '@/module/components/nav/nav'
export default {
name: 'app',
components: { mLayout, mNav }
}
</script>
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import $ from 'jquery'
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import i18n from '@/module/i18n'
import { sync } from 'vuex-router-sync'
import Chart from '~/@analysys/ana-charts'
import themeData from '@/module/echarts/themeData.json'
import Permissions from '@/module/permissions'
import '~/@analysys/ans-ui/lib/ans-ui.min.css'
import ans from '~/@analysys/ans-ui/lib/ans-ui.min'
import en_US from '~/@analysys/ans-ui/lib/locale/en' // eslint-disable-line
import 'sass/conf/home/index.scss'
// Component internationalization
let useOpt = i18n.globalScope.LOCALE === 'en_US' ? { locale: en_US } : {}
// Vue.use(ans)
Vue.use(ans, useOpt)
sync(store, router)
Vue.config.devtools = true
Vue.config.productionTip = true
Vue.config.silent = true
Chart.config({
theme: {
name: 'themeName',
data: themeData,
default: true
}
})
/* eslint-disable no-new */
Permissions.request().then(res => {
// instance
new Vue({
el: '#app',
router,
store,
render: h => h(App),
mounted () {
document.addEventListener('click', (e) => {
$('#contextmenu').css('visibility', 'hidden')
})
},
methods: {
initApp () {
$('.global-loading').hide()
let bootstrapTooltip = $.fn.tooltip.noConflict()
$.fn.tooltip = bootstrapTooltip
$('body').tooltip({
selector: '[data-toggle="tooltip"]',
trigger: 'hover'
})
// init
i18n.init()
}
},
created () {
this.initApp()
}
})
})
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import i18n from '@/module/i18n'
import Permissions from '@/module/permissions'
/**
* Operation bar config
* @code code
* @icon icon
* @disable disable
* @desc tooltip
*/
const toolOper = (dagThis) => {
let disabled = Permissions.getAuth() === false ? false : !dagThis.$store.state.dag.isDetails
return [
{
code: 'pointer',
icon: '&#xe781;',
disable: disabled,
desc: `${i18n.$t('拖动节点和选中项')}`
},
{
code: 'line',
icon: '&#xe61c;',
disable: disabled,
desc: `${i18n.$t('选择线条连接')}`
},
{
code: 'remove',
icon: '&#xe611;',
disable: disabled,
desc: `${i18n.$t('删除选中的线或节点')}`
},
{
code: 'download',
icon: '&#xe628;',
disable: !!dagThis.type,
desc: `${i18n.$t('下载')}`
},
{
code: 'screen',
icon: '&#xe6e0;',
disable: disabled,
desc: `${i18n.$t('全屏')}`
}
]
}
/**
* Post status
* @id Front end definition id
* @desc tooltip
* @code Backend definition identifier
*/
let publishStatus = [
{
id: 0,
desc: `${i18n.$t('未发布')}`,
code: 'NOT_RELEASE'
},
{
id: 1,
desc: `${i18n.$t('上线')}`,
code: 'ONLINE'
},
{
id: 2,
desc: `${i18n.$t('下线')}`,
code: 'OFFLINE'
}
]
/**
* Operation type
* @desc tooltip
* @code identifier
*/
let runningType = [
{
desc: `${i18n.$t('启动工作流')}`,
code: 'START_PROCESS'
},
{
desc: `${i18n.$t('从当前节点开始执行')}`,
code: 'START_CURRENT_TASK_PROCESS'
},
{
desc: `${i18n.$t('恢复被容错的工作流')}`,
code: 'RECOVER_TOLERANCE_FAULT_PROCESS'
},
{
desc: `${i18n.$t('恢复暂停流程')}`,
code: 'RECOVER_SUSPENDED_PROCESS'
},
{
desc: `${i18n.$t('从失败节点开始执行')}`,
code: 'START_FAILURE_TASK_PROCESS'
},
{
desc: `${i18n.$t('补数')}`,
code: 'COMPLEMENT_DATA'
},
{
desc: `${i18n.$t('调度执行')}`,
code: 'SCHEDULER'
},
{
desc: `${i18n.$t('重跑')}`,
code: 'REPEAT_RUNNING'
},
{
desc: `${i18n.$t('暂停')}`,
code: 'PAUSE'
},
{
desc: `${i18n.$t('停止')}`,
code: 'STOP'
},
{
desc: `${i18n.$t('恢复等待线程')}`,
code: 'RECOVER_WAITTING_THREAD'
}
]
/**
* Task status
* @key key
* @id id
* @desc tooltip
* @color color
* @icoUnicode iconfont
* @isSpin is loading (Need to execute the code block to write if judgment)
*/
let tasksState = {
'SUBMITTED_SUCCESS': {
id: 0,
desc: `${i18n.$t('提交成功')}`,
color: '#A9A9A9',
icoUnicode: '&#xe7c2;',
isSpin: false
},
'RUNNING_EXEUTION': {
id: 1,
desc: `${i18n.$t('正在执行')}`,
color: '#0097e0',
icoUnicode: '&#xe80f;',
isSpin: true
},
'READY_PAUSE': {
id: 2,
desc: `${i18n.$t('准备暂停')}`,
color: '#07b1a3',
icoUnicode: '&#xe677;',
isSpin: false
},
'PAUSE': {
id: 3,
desc: `${i18n.$t('暂停')}`,
color: '#057c72',
icoUnicode: '&#xe679;',
isSpin: false
},
'READY_STOP': {
id: 4,
desc: `${i18n.$t('准备停止')}`,
color: '#FE0402',
icoUnicode: '&#xe6e6;',
isSpin: false
},
'STOP': {
id: 5,
desc: `${i18n.$t('停止')}`,
color: '#e90101',
icoUnicode: '&#xe6ae;',
isSpin: false
},
'FAILURE': {
id: 6,
desc: `${i18n.$t('失败')}`,
color: '#000000',
icoUnicode: '&#xe75d;',
isSpin: false
},
'SUCCESS': {
id: 7,
desc: `${i18n.$t('成功')}`,
color: '#33cc00',
icoUnicode: '&#xe6d4;',
isSpin: false
},
'NEED_FAULT_TOLERANCE': {
id: 8,
desc: `${i18n.$t('需要容错')}`,
color: '#FF8C00',
icoUnicode: '&#xe60d;',
isSpin: false
},
'KILL': {
id: 9,
desc: `${i18n.$t('kill')}`,
color: '#a70202',
icoUnicode: '&#xe6ce;',
isSpin: false
},
'WAITTING_THREAD': {
id: 10,
desc: `${i18n.$t('等待线程')}`,
color: '#912eed',
icoUnicode: '&#xe62e;',
isSpin: false
},
'WAITTING_DEPEND': {
id: 11,
desc: `${i18n.$t('等待依赖')}`,
color: '#5101be',
icoUnicode: '&#xe68c;',
isSpin: false
}
}
/**
* Node type
* @key key
* @desc tooltip
* @color color (tree and gantt)
*/
let tasksType = {
'SHELL': {
desc: 'SHELL',
color: '#646464'
},
'SUB_PROCESS': {
desc: 'SUB_PROCESS',
color: '#0097e0'
},
'PROCEDURE': {
desc: 'PROCEDURE',
color: '#525CCD'
},
'SQL': {
desc: 'SQL',
color: '#7A98A1'
},
'SPARK': {
desc: 'SPARK',
color: '#E46F13'
},
'MR': {
desc: 'MapReduce',
color: '#A0A5CC'
},
'PYTHON': {
desc: 'PYTHON',
color: '#FED52D'
},
'DEPENDENT': {
desc: 'DEPENDENT',
color: '#2FBFD8'
}
}
export {
toolOper,
publishStatus,
runningType,
tasksState,
tasksType
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import _ from 'lodash'
import { jsPlumb } from 'jsplumb'
import JSP from './plugIn/jsPlumbHandle'
import DownChart from './plugIn/downChart'
import store from '@/conf/home/store'
/**
* Prototype method
*/
let Dag = function () {
this.dag = {}
this.instance = {}
}
/**
* init
* @dag dag vue instance
*/
Dag.prototype.init = function ({ dag, instance }) {
this.dag = dag
this.instance = instance
}
/**
* set init config
*/
Dag.prototype.setConfig = function (o) {
JSP.setConfig(o)
}
/**
* create dag
*/
Dag.prototype.create = function () {
jsPlumb.ready(() => {
JSP.init({
dag: this.dag,
instance: this.instance
})
// init event
JSP.handleEvent()
// init draggable
JSP.draggable()
})
}
/**
* Action event on the right side of the toolbar
*/
Dag.prototype.toolbarEvent = function ({ item, code, is }) {
switch (code) {
case 'pointer':
JSP.handleEventPointer(is)
break
case 'line':
JSP.handleEventLine(is)
break
case 'remove':
JSP.handleEventRemove()
break
case 'screen':
JSP.handleEventScreen({ item, is })
break
case 'download':
DownChart.download({
dagThis: this.dag
})
break
}
}
/**
* Echo data display
*/
Dag.prototype.backfill = function () {
jsPlumb.ready(() => {
JSP.init({
dag: this.dag,
instance: this.instance
})
// Backfill
JSP.jspBackfill({
// connects
connects: _.cloneDeep(store.state.dag.connects),
// Node location information
locations: _.cloneDeep(store.state.dag.locations),
// Node data
largeJson: _.cloneDeep(store.state.dag.tasks)
})
})
}
/**
* Get dag storage format data
*/
Dag.prototype.saveStore = function () {
return JSP.saveStore()
}
export default new Dag()
<template>
<x-select
style="width: 170px;"
:disabled="isDetails"
@on-change="_onChange"
v-model="value">
<x-input
ref="input"
slot="trigger"
v-if="isInput"
:disabled="isDetails"
slot-scope="{ selectedModel }"
maxlength="4"
@on-blur="_onBlur"
:placeholder="$t('请选择')"
:value="selectedModel === null ? '0' : selectedModel.value"
style="width: 100%;"
@on-click-icon.stop="_ckIcon">
<i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="!isIconState"></i>
<i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="isIconState"></i>
</x-input>
<x-option
v-for="city in list"
:key="city"
:value="city"
:label="city">
</x-option>
</x-select>
</template>
<script>
import _ from 'lodash'
import i18n from '@/module/i18n'
import disabledState from '@/module/mixin/disabledState'
export default {
name: 'select-input',
data () {
return {
isIconState: false,
isInput: true
}
},
mixins: [disabledState],
props: {
value: String,
list: Array
},
model: {
prop: 'value',
event: 'valueEvent'
},
methods: {
_onChange (o) {
this.$emit('valueEvent', +o.value)
this._setIconState(+o.value)
},
_setIconState (value) {
// Whether there is a list
this.isIconState = _.includes(this.list, parseInt(value))
},
_ckIcon () {
if (this.isDetails) {
return
}
this.isInput = false
this.$emit('valueEvent', +this.list[0])
this.isIconState = true
// Refresh instance
setTimeout(() => {
this.isInput = true
}, 1)
},
_onBlur () {
let val = $(this.$refs['input'].$el).find('input')[0].value
if (this._validation(val)) {
this.$emit('valueEvent', val)
this._setIconState(val)
}
},
_validation (val) {
if (val === '0') return true
if (!(/(^[0-9]*[1-9][0-9]*$)/.test(val))) {
this.$message.warning(`${i18n.$t('请输入正整数')}`)
// init
this._ckIcon()
return false
}
return true
}
},
watch: {
},
created () {
this._setIconState(this.value)
},
mounted () {
},
components: {}
}
</script>
\ No newline at end of file
<template>
<div class="timeout-alarm-model">
<div class="clearfix list">
<div class="text-box">
<span>{{$t('任务超时告警')}}</span>
</div>
<div class="cont-box">
<label class="label-box">
<div style="padding-top: 5px;">
<x-switch v-model="enable" @on-click="_onSwitch" :disabled="isDetails"></x-switch>
</div>
</label>
</div>
</div>
<div class="clearfix list" v-if="enable">
<div class="text-box">
<span>{{$t('超时策略')}}</span>
</div>
<div class="cont-box">
<label class="label-box">
<div style="padding-top: 6px;">
<x-checkbox-group v-model="strategy">
<x-checkbox label="WARN" :disabled="isDetails">{{$t('超时告警')}}</x-checkbox>
<x-checkbox label="FAILED" :disabled="isDetails">{{$t('超时失败')}}</x-checkbox>
</x-checkbox-group>
</div>
</label>
</div>
</div>
<div class="clearfix list" v-if="enable">
<div class="text-box">
<span>{{$t('超时时长')}}</span>
</div>
<div class="cont-box">
<label class="label-box">
<x-input v-model="interval" style="width: 128px;" :disabled="isDetails">
<span slot="append">{{$t('')}}</span>
</x-input>
</label>
</div>
</div>
</div>
</template>
<script>
import _ from 'lodash'
import disabledState from '@/module/mixin/disabledState'
export default {
name: 'timeout-alarm',
data () {
return {
// Timeout display hiding
enable: false,
// Timeout strategy
strategy: [],
// Timeout period
interval: null
}
},
mixins: [disabledState],
props: {
backfillItem: Object
},
methods: {
_onSwitch (is) {
// Timeout strategy
this.strategy = is ? ['WARN'] : []
// Timeout period
this.interval = is ? 30 : null
},
_verification () {
// Verification timeout policy
if (this.enable && !this.strategy.length) {
this.$message.warning(`${this.$t('超时策略必须选一个')}`)
return false
}
// Verify timeout duration Non 0 positive integer
if (this.enable && !parseInt(this.interval) && !_.isInteger(this.interval)) {
this.$message.warning(`${this.$t('超时时长必须为正整数')}`)
return false
}
this.$emit('on-timeout', {
strategy: (() => {
// Handling checkout sequence
let strategy = this.strategy
if (strategy.length === 2 && strategy[0] === 'FAILED') {
return [strategy[1], strategy[0]].join(',')
} else {
return strategy.join(',')
}
})(),
interval: parseInt(this.interval),
enable: this.enable
})
return true
}
},
watch: {
},
created () {
let o = this.backfillItem
// Non-null objects represent backfill
if (!_.isEmpty(o) && o.timeout) {
this.enable = o.timeout.enable || false
this.strategy = _.split(o.timeout.strategy, ',') || ['WARN']
this.interval = o.timeout.interval || null
}
},
mounted () {
},
components: {}
}
</script>
\ No newline at end of file
<template>
<div class="datasource-model">
<div class="select-listpp">
<x-select v-model="type"
style="width: 160px;"
@on-change="_handleTypeChanged"
:disabled="isDetails">
<x-option
v-for="city in typeList"
:key="city.code"
:value="city.code"
:label="city.code">
</x-option>
</x-select>
<x-select :placeholder="$t('请选择数据源')"
v-model="datasource"
style="width: 288px;"
:disabled="isDetails">
<x-option
v-for="city in datasourceList"
:key="city.id"
:value="city"
:label="city.code">
</x-option>
</x-select>
</div>
</div>
</template>
<script>
import _ from 'lodash'
import i18n from '@/module/i18n'
import disabledState from '@/module/mixin/disabledState'
export default {
name: 'datasource',
data () {
return {
// Data source type
type: '',
// Data source type(List)
typeList: [],
// data source
datasource: {},
// data source(List)
datasourceList: []
}
},
mixins: [disabledState],
props: {
data: Object,
supportType: Array
},
methods: {
/**
* Verify data source
*/
_verifDatasource () {
if (!this.datasource) {
this.$message.warning(`${i18n.$t('请选择数据源')}`)
return false
}
this.$emit('on-dsData', {
type: this.type,
datasource: this.datasource.id
})
return true
},
/**
* Get the corresponding datasource data according to type
*/
_getDatasourceData () {
return new Promise((resolve, reject) => {
this.store.dispatch('dag/getDatasourceList', this.type).then(res => {
this.datasourceList = _.map(res.data, v => {
return {
id: v.id,
code: v.name,
disabled: false
}
})
resolve()
})
})
},
/**
* Brush type
*/
_handleTypeChanged ({ value }) {
this.type = value
this._getDatasourceData().then(res => {
this.datasource = this.datasourceList.length && this.datasourceList[0] || {}
this.$emit('on-dsData', {
type: this.type,
datasource: this.datasource.id
})
})
}
},
watch: {},
created () {
let supportType = this.supportType || []
this.typeList = _.cloneDeep(this.store.state.dag.dsTypeListS)
// Have a specified data source
if (supportType.length) {
let is = (type) => {
return !!_.filter(supportType, v => v === type).length
}
this.typeList = _.filter(this.typeList, v => is(v.code))
}
this.type = _.cloneDeep(this.data.type) || this.typeList[0].code
// init data
this._getDatasourceData().then(res => {
if (_.isEmpty(this.data)) {
this.$nextTick(() => {
this.datasource = this.datasourceList[0]
})
} else {
this.$nextTick(() => {
this.datasource = _.filter(this.datasourceList, v => v.id === this.data.datasource)[0]
})
}
this.$emit('on-dsData', {
type: this.type
})
})
},
mounted () {
},
components: { }
}
</script>
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册