初次提交
commit
3d1f00194a
@ -0,0 +1,12 @@
|
||||
{
|
||||
"presets": [
|
||||
["env", {
|
||||
"modules": false,
|
||||
"targets": {
|
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
|
||||
}
|
||||
}],
|
||||
"stage-2"
|
||||
],
|
||||
"plugins": ["transform-vue-jsx", "transform-runtime"]
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
@ -0,0 +1,14 @@
|
||||
.DS_Store
|
||||
node_modules/
|
||||
/dist/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
@ -0,0 +1,10 @@
|
||||
// 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": {}
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
# demo
|
||||
|
||||
> A Vue.js project
|
||||
|
||||
## Build Setup
|
||||
|
||||
``` bash
|
||||
# install dependencies
|
||||
npm install
|
||||
|
||||
# serve with hot reload at localhost:8080
|
||||
npm run dev
|
||||
|
||||
# build for production with minification
|
||||
npm run build
|
||||
|
||||
# build for production and view the bundle analyzer report
|
||||
npm run build --report
|
||||
```
|
||||
|
||||
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
@ -0,0 +1,41 @@
|
||||
'use strict'
|
||||
require('./check-versions')()
|
||||
|
||||
process.env.NODE_ENV = 'development'
|
||||
|
||||
const ora = require('ora')
|
||||
const rm = require('rimraf')
|
||||
const path = require('path')
|
||||
const chalk = require('chalk')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const webpackConfig = require('./webpack.prod.conf')
|
||||
|
||||
const spinner = ora('building for production...')
|
||||
spinner.start()
|
||||
|
||||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
|
||||
if (err) throw err
|
||||
webpack(webpackConfig, (err, stats) => {
|
||||
spinner.stop()
|
||||
if (err) throw err
|
||||
process.stdout.write(stats.toString({
|
||||
colors: true,
|
||||
modules: false,
|
||||
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
|
||||
chunks: false,
|
||||
chunkModules: false
|
||||
}) + '\n\n')
|
||||
|
||||
if (stats.hasErrors()) {
|
||||
console.log(chalk.red(' Build failed with errors.\n'))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log(chalk.cyan(' Build complete.\n'))
|
||||
console.log(chalk.yellow(
|
||||
' Tip: built files are meant to be served over an HTTP server.\n' +
|
||||
' Opening index.html over file:// won\'t work.\n'
|
||||
))
|
||||
})
|
||||
})
|
@ -0,0 +1,54 @@
|
||||
'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)
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,102 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const config = require('../config')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const packageConfig = require('../package.json')
|
||||
|
||||
exports.assetsPath = function (_path) {
|
||||
const assetsSubDirectory = process.env.NODE_ENV === 'production'
|
||||
? config.build.assetsSubDirectory
|
||||
: config.dev.assetsSubDirectory
|
||||
|
||||
return path.posix.join(assetsSubDirectory, _path)
|
||||
}
|
||||
|
||||
exports.cssLoaders = function (options) {
|
||||
options = options || {}
|
||||
|
||||
const cssLoader = {
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
const postcssLoader = {
|
||||
loader: 'postcss-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
// generate loader string to be used with extract text plugin
|
||||
function generateLoaders (loader, loaderOptions) {
|
||||
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
|
||||
|
||||
if (loader) {
|
||||
loaders.push({
|
||||
loader: loader + '-loader',
|
||||
options: Object.assign({}, loaderOptions, {
|
||||
sourceMap: options.sourceMap
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Extract CSS when that option is specified
|
||||
// (which is the case during production build)
|
||||
if (options.extract) {
|
||||
return ExtractTextPlugin.extract({
|
||||
use: loaders,
|
||||
fallback: 'vue-style-loader',
|
||||
publicPath: '../../'
|
||||
})
|
||||
} else {
|
||||
return ['vue-style-loader'].concat(loaders)
|
||||
}
|
||||
}
|
||||
|
||||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
return {
|
||||
css: generateLoaders(),
|
||||
postcss: generateLoaders(),
|
||||
less: generateLoaders('less'),
|
||||
sass: generateLoaders('sass', { indentedSyntax: true }),
|
||||
scss: generateLoaders('sass'),
|
||||
stylus: generateLoaders('stylus'),
|
||||
styl: generateLoaders('stylus')
|
||||
}
|
||||
}
|
||||
|
||||
// Generate loaders for standalone style files (outside of .vue)
|
||||
exports.styleLoaders = function (options) {
|
||||
const output = []
|
||||
const loaders = exports.cssLoaders(options)
|
||||
|
||||
for (const extension in loaders) {
|
||||
const loader = loaders[extension]
|
||||
output.push({
|
||||
test: new RegExp('\\.' + extension + '$'),
|
||||
use: loader
|
||||
})
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
exports.createNotifierCallback = () => {
|
||||
const notifier = require('node-notifier')
|
||||
|
||||
return (severity, errors) => {
|
||||
if (severity !== 'error') return
|
||||
|
||||
const error = errors[0]
|
||||
const filename = error.file && error.file.split('!').pop()
|
||||
|
||||
notifier.notify({
|
||||
title: packageConfig.name,
|
||||
message: severity + ': ' + error.name,
|
||||
subtitle: filename || '',
|
||||
icon: path.join(__dirname, 'logo.png')
|
||||
})
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const isProduction = process.env.NODE_ENV === 'production'
|
||||
const sourceMapEnabled = isProduction
|
||||
? config.build.productionSourceMap
|
||||
: config.dev.cssSourceMap
|
||||
|
||||
module.exports = {
|
||||
loaders: utils.cssLoaders({
|
||||
sourceMap: sourceMapEnabled,
|
||||
extract: isProduction
|
||||
}),
|
||||
cssSourceMap: sourceMapEnabled,
|
||||
cacheBusting: config.dev.cacheBusting,
|
||||
transformToRequire: {
|
||||
video: ['src', 'poster'],
|
||||
source: 'src',
|
||||
img: 'src',
|
||||
image: 'xlink:href'
|
||||
}
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const vueLoaderConfig = require('./vue-loader.conf')
|
||||
|
||||
function resolve (dir) {
|
||||
return path.join(__dirname, '..', dir)
|
||||
}
|
||||
|
||||
|
||||
|
||||
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: {
|
||||
'vue$': 'vue/dist/vue.esm.js',
|
||||
'@': resolve('src'),
|
||||
}
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.vue$/,
|
||||
loader: 'vue-loader',
|
||||
options: vueLoaderConfig
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
loader: 'babel-loader',
|
||||
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
|
||||
},
|
||||
{
|
||||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('img/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('media/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.less$/,
|
||||
loader: "style-loader!css-loader!less-loader"
|
||||
}
|
||||
]
|
||||
},
|
||||
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'
|
||||
}
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const path = require('path')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
|
||||
const portfinder = require('portfinder')
|
||||
|
||||
const HOST = process.env.HOST
|
||||
const PORT = process.env.PORT && Number(process.env.PORT)
|
||||
|
||||
const devWebpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
|
||||
},
|
||||
// cheap-module-eval-source-map is faster for development
|
||||
devtool: config.dev.devtool,
|
||||
|
||||
// these devServer options should be customized in /config/index.js
|
||||
devServer: {
|
||||
clientLogLevel: 'warning',
|
||||
historyApiFallback: {
|
||||
rewrites: [
|
||||
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
|
||||
],
|
||||
},
|
||||
hot: true,
|
||||
contentBase: false, // since we use CopyWebpackPlugin.
|
||||
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(),
|
||||
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: 'index.html',
|
||||
inject: true
|
||||
}),
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.dev.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}
|
||||
])
|
||||
]
|
||||
})
|
||||
|
||||
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)
|
||||
}
|
||||
})
|
||||
})
|
@ -0,0 +1,145 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
|
||||
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
|
||||
|
||||
const env = require('../config/prod.env')
|
||||
|
||||
const webpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
extract: true,
|
||||
usePostCSS: true
|
||||
})
|
||||
},
|
||||
devtool: config.build.productionSourceMap ? config.build.devtool : false,
|
||||
output: {
|
||||
path: config.build.assetsRoot,
|
||||
filename: utils.assetsPath('js/[name].[chunkhash].js'),
|
||||
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
|
||||
},
|
||||
plugins: [
|
||||
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': env
|
||||
}),
|
||||
new UglifyJsPlugin({
|
||||
uglifyOptions: {
|
||||
compress: {
|
||||
warnings: false
|
||||
}
|
||||
},
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
parallel: true
|
||||
}),
|
||||
// extract css into its own file
|
||||
new ExtractTextPlugin({
|
||||
filename: utils.assetsPath('css/[name].[contenthash].css'),
|
||||
// Setting the following option to `false` will not extract CSS from codesplit chunks.
|
||||
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
|
||||
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
|
||||
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
|
||||
allChunks: true,
|
||||
}),
|
||||
// Compress extracted CSS. We are using this plugin so that possible
|
||||
// duplicated CSS from different components can be deduped.
|
||||
new OptimizeCSSPlugin({
|
||||
cssProcessorOptions: config.build.productionSourceMap
|
||||
? { safe: true, map: { inline: false } }
|
||||
: { safe: true }
|
||||
}),
|
||||
// generate dist index.html with correct asset hash for caching.
|
||||
// you can customize output by editing /index.html
|
||||
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: config.build.index,
|
||||
template: 'index.html',
|
||||
inject: true,
|
||||
minify: {
|
||||
removeComments: true,
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true
|
||||
// more options:
|
||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
},
|
||||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||
chunksSortMode: 'dependency'
|
||||
}),
|
||||
// keep module.id stable when vendor modules does not change
|
||||
new webpack.HashedModuleIdsPlugin(),
|
||||
// enable scope hoisting
|
||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||
// split vendor js into its own file
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'vendor',
|
||||
minChunks (module) {
|
||||
// any required modules inside node_modules are extracted to vendor
|
||||
return (
|
||||
module.resource &&
|
||||
/\.js$/.test(module.resource) &&
|
||||
module.resource.indexOf(
|
||||
path.join(__dirname, '../node_modules')
|
||||
) === 0
|
||||
)
|
||||
}
|
||||
}),
|
||||
// extract webpack runtime and module manifest to its own file in order to
|
||||
// prevent vendor hash from being updated whenever app bundle is updated
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'manifest',
|
||||
minChunks: Infinity
|
||||
}),
|
||||
// This instance extracts shared chunks from code splitted chunks and bundles them
|
||||
// in a separate chunk, similar to the vendor chunk
|
||||
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'app',
|
||||
async: 'vendor-async',
|
||||
children: true,
|
||||
minChunks: 3
|
||||
}),
|
||||
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.build.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}
|
||||
])
|
||||
]
|
||||
})
|
||||
|
||||
if (config.build.productionGzip) {
|
||||
const CompressionWebpackPlugin = require('compression-webpack-plugin')
|
||||
|
||||
webpackConfig.plugins.push(
|
||||
new CompressionWebpackPlugin({
|
||||
asset: '[path].gz[query]',
|
||||
algorithm: 'gzip',
|
||||
test: new RegExp(
|
||||
'\\.(' +
|
||||
config.build.productionGzipExtensions.join('|') +
|
||||
')$'
|
||||
),
|
||||
threshold: 10240,
|
||||
minRatio: 0.8
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
if (config.build.bundleAnalyzerReport) {
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
|
||||
}
|
||||
|
||||
module.exports = webpackConfig
|
@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
const merge = require('webpack-merge')
|
||||
const prodEnv = require('./prod.env')
|
||||
|
||||
module.exports = merge(prodEnv, {
|
||||
NODE_ENV: '"development"'
|
||||
})
|
@ -0,0 +1,69 @@
|
||||
'use strict'
|
||||
// Template version: 1.3.1
|
||||
// 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: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
|
||||
autoOpenBrowser: false,
|
||||
errorOverlay: true,
|
||||
notifyOnErrors: true,
|
||||
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
|
||||
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
|
||||
// https://webpack.js.org/configuration/devtool/#development
|
||||
devtool: 'cheap-module-eval-source-map',
|
||||
|
||||
// If you have problems debugging vue-files in devtools,
|
||||
// set this to false - it *may* help
|
||||
// https://vue-loader.vuejs.org/en/options.html#cachebusting
|
||||
cacheBusting: true,
|
||||
|
||||
cssSourceMap: true
|
||||
},
|
||||
|
||||
build: {
|
||||
// Template for index.html
|
||||
index: path.resolve(__dirname, '../dist/index.html'),
|
||||
|
||||
// Paths
|
||||
assetsRoot: path.resolve(__dirname, '../dist'),
|
||||
assetsSubDirectory: 'static',
|
||||
assetsPublicPath: '/',
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
|
||||
productionSourceMap: true,
|
||||
// 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
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
'use strict'
|
||||
module.exports = {
|
||||
NODE_ENV: '"production"'
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<!-- <link rel="stylesheet" href="//at.alicdn.com/t/font_3427532_2tqf4ujedwx.css"> -->
|
||||
<link rel="stylesheet" href="./static/css/iconfont.css" />
|
||||
<title><%= webpackConfig.name %></title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,67 @@
|
||||
{
|
||||
"name": "demo",
|
||||
"version": "1.0.0",
|
||||
"description": "A Vue.js project",
|
||||
"author": "lilu <lilu@myshipping.net>",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
|
||||
"start": "npm run dev",
|
||||
"build": "node build/build.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"ant-design-vue": "1.7.4",
|
||||
"axios": "^0.27.2",
|
||||
"qs": "^6.11.0",
|
||||
"vue": "^2.5.2",
|
||||
"vue-router": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.2",
|
||||
"babel-core": "^6.22.1",
|
||||
"babel-helper-vue-jsx-merge-props": "^2.0.3",
|
||||
"babel-loader": "^7.1.1",
|
||||
"babel-plugin-syntax-jsx": "^6.18.0",
|
||||
"babel-plugin-transform-runtime": "^6.22.0",
|
||||
"babel-plugin-transform-vue-jsx": "^3.5.0",
|
||||
"babel-preset-env": "^1.3.2",
|
||||
"babel-preset-stage-2": "^6.22.0",
|
||||
"chalk": "^2.0.1",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"css-loader": "^0.28.0",
|
||||
"extract-text-webpack-plugin": "^3.0.0",
|
||||
"file-loader": "^1.1.4",
|
||||
"friendly-errors-webpack-plugin": "^1.6.1",
|
||||
"html-webpack-plugin": "^2.30.1",
|
||||
"less": "^3.9.0",
|
||||
"less-loader": "^5.0.0",
|
||||
"node-notifier": "^5.1.2",
|
||||
"optimize-css-assets-webpack-plugin": "^3.2.0",
|
||||
"ora": "^1.2.0",
|
||||
"portfinder": "^1.0.13",
|
||||
"postcss-import": "^11.0.0",
|
||||
"postcss-loader": "^2.0.8",
|
||||
"postcss-url": "^7.2.1",
|
||||
"rimraf": "^2.6.0",
|
||||
"semver": "^5.3.0",
|
||||
"shelljs": "^0.7.6",
|
||||
"uglifyjs-webpack-plugin": "^1.1.1",
|
||||
"url-loader": "^0.5.8",
|
||||
"vue-loader": "^13.3.0",
|
||||
"vue-style-loader": "^3.0.1",
|
||||
"vue-template-compiler": "^2.5.2",
|
||||
"webpack": "^3.6.0",
|
||||
"webpack-bundle-analyzer": "^2.9.0",
|
||||
"webpack-dev-server": "^2.9.1",
|
||||
"webpack-merge": "^4.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.0.0",
|
||||
"npm": ">= 3.0.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie <= 8"
|
||||
]
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import './assets/css/iconfont.css';
|
||||
export default {
|
||||
name: 'App',
|
||||
mounted(){
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -0,0 +1,539 @@
|
||||
/* 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;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,187 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 3427532 */
|
||||
src: url('iconfont.woff2?t=1658476460269') format('woff2'),
|
||||
url('iconfont.woff?t=1658476460269') format('woff'),
|
||||
url('iconfont.ttf?t=1658476460269') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-zhoubao:before {
|
||||
content: "\e661";
|
||||
}
|
||||
|
||||
.icon-fapiaoguanli:before {
|
||||
content: "\e623";
|
||||
}
|
||||
|
||||
.icon-lianjie:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.icon-xiugai:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.icon-shuaxin:before {
|
||||
content: "\e62b";
|
||||
}
|
||||
|
||||
.icon-left-1:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-right-1-copy:before {
|
||||
content: "\e61f";
|
||||
}
|
||||
|
||||
.icon-xia:before {
|
||||
content: "\e63d";
|
||||
}
|
||||
|
||||
.icon-jinggao:before {
|
||||
content: "\e651";
|
||||
}
|
||||
|
||||
.icon-dingdan:before {
|
||||
content: "\e65c";
|
||||
}
|
||||
|
||||
.icon-zhcc_tidan:before {
|
||||
content: "\e682";
|
||||
}
|
||||
|
||||
.icon-icon_baocun:before {
|
||||
content: "\eb8e";
|
||||
}
|
||||
|
||||
.icon-daibanshixiang:before {
|
||||
content: "\ec4e";
|
||||
}
|
||||
|
||||
.icon-fuzhi1:before {
|
||||
content: "\ec7a";
|
||||
}
|
||||
|
||||
.icon-wj-bccl:before {
|
||||
content: "\e70d";
|
||||
}
|
||||
|
||||
.icon-tuandui:before {
|
||||
content: "\e612";
|
||||
}
|
||||
|
||||
.icon-shang:before {
|
||||
content: "\e792";
|
||||
}
|
||||
|
||||
.icon-dayinxiaopiao:before {
|
||||
content: "\e627";
|
||||
}
|
||||
|
||||
.icon-zhizhishu:before {
|
||||
content: "\e613";
|
||||
}
|
||||
|
||||
.icon-beizhu:before {
|
||||
content: "\e614";
|
||||
}
|
||||
|
||||
.icon-chuanbo:before {
|
||||
content: "\e68b";
|
||||
}
|
||||
|
||||
.icon-shiyongwendang:before {
|
||||
content: "\ea3d";
|
||||
}
|
||||
|
||||
.icon-touxiang:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.icon-yunshu1:before {
|
||||
content: "\e637";
|
||||
}
|
||||
|
||||
.icon-bianji1:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.icon-OCR:before {
|
||||
content: "\e694";
|
||||
}
|
||||
|
||||
.icon-printing:before {
|
||||
content: "\ea28";
|
||||
}
|
||||
|
||||
.icon-chuanfanguanli-chuanfanshenqing:before {
|
||||
content: "\e648";
|
||||
}
|
||||
|
||||
.icon-a-xiaopiaofapiao-01:before {
|
||||
content: "\e79f";
|
||||
}
|
||||
|
||||
.icon-tuodong:before {
|
||||
content: "\e656";
|
||||
}
|
||||
|
||||
.icon-duoxuan:before {
|
||||
content: "\e630";
|
||||
}
|
||||
|
||||
.icon-duoxuan1:before {
|
||||
content: "\e696";
|
||||
}
|
||||
|
||||
.icon-guanbi:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-guanbi1:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.icon-shezhi:before {
|
||||
content: "\e622";
|
||||
}
|
||||
|
||||
.icon-ccaozuo:before {
|
||||
content: "\e739";
|
||||
}
|
||||
|
||||
.icon-del:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-yunfei:before {
|
||||
content: "\e77c";
|
||||
}
|
||||
|
||||
.icon-bianji:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-yanjing:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon-biyanjing:before {
|
||||
content: "\e901";
|
||||
}
|
||||
|
||||
.icon-yonghu:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.icon-yonghumimaxiugai:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,310 @@
|
||||
{
|
||||
"id": "3427532",
|
||||
"name": "jy_admin",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "1680687",
|
||||
"name": "周报",
|
||||
"font_class": "zhoubao",
|
||||
"unicode": "e661",
|
||||
"unicode_decimal": 58977
|
||||
},
|
||||
{
|
||||
"icon_id": "6241656",
|
||||
"name": "发票管理",
|
||||
"font_class": "fapiaoguanli",
|
||||
"unicode": "e623",
|
||||
"unicode_decimal": 58915
|
||||
},
|
||||
{
|
||||
"icon_id": "77403",
|
||||
"name": "链接",
|
||||
"font_class": "lianjie",
|
||||
"unicode": "e60b",
|
||||
"unicode_decimal": 58891
|
||||
},
|
||||
{
|
||||
"icon_id": "521051",
|
||||
"name": "修改",
|
||||
"font_class": "xiugai",
|
||||
"unicode": "e620",
|
||||
"unicode_decimal": 58912
|
||||
},
|
||||
{
|
||||
"icon_id": "604646",
|
||||
"name": "刷新",
|
||||
"font_class": "shuaxin",
|
||||
"unicode": "e62b",
|
||||
"unicode_decimal": 58923
|
||||
},
|
||||
{
|
||||
"icon_id": "996913",
|
||||
"name": "右右",
|
||||
"font_class": "left-1",
|
||||
"unicode": "e604",
|
||||
"unicode_decimal": 58884
|
||||
},
|
||||
{
|
||||
"icon_id": "1029274",
|
||||
"name": "右右",
|
||||
"font_class": "right-1-copy",
|
||||
"unicode": "e61f",
|
||||
"unicode_decimal": 58911
|
||||
},
|
||||
{
|
||||
"icon_id": "1305407",
|
||||
"name": "下",
|
||||
"font_class": "xia",
|
||||
"unicode": "e63d",
|
||||
"unicode_decimal": 58941
|
||||
},
|
||||
{
|
||||
"icon_id": "2678614",
|
||||
"name": "警告",
|
||||
"font_class": "jinggao",
|
||||
"unicode": "e651",
|
||||
"unicode_decimal": 58961
|
||||
},
|
||||
{
|
||||
"icon_id": "2859360",
|
||||
"name": "订单",
|
||||
"font_class": "dingdan",
|
||||
"unicode": "e65c",
|
||||
"unicode_decimal": 58972
|
||||
},
|
||||
{
|
||||
"icon_id": "3751207",
|
||||
"name": "zhcc_提单",
|
||||
"font_class": "zhcc_tidan",
|
||||
"unicode": "e682",
|
||||
"unicode_decimal": 59010
|
||||
},
|
||||
{
|
||||
"icon_id": "4347578",
|
||||
"name": "icon_保存",
|
||||
"font_class": "icon_baocun",
|
||||
"unicode": "eb8e",
|
||||
"unicode_decimal": 60302
|
||||
},
|
||||
{
|
||||
"icon_id": "5961300",
|
||||
"name": "待办事项",
|
||||
"font_class": "daibanshixiang",
|
||||
"unicode": "ec4e",
|
||||
"unicode_decimal": 60494
|
||||
},
|
||||
{
|
||||
"icon_id": "5993150",
|
||||
"name": "复制",
|
||||
"font_class": "fuzhi1",
|
||||
"unicode": "ec7a",
|
||||
"unicode_decimal": 60538
|
||||
},
|
||||
{
|
||||
"icon_id": "6517451",
|
||||
"name": "文件-补充材料",
|
||||
"font_class": "wj-bccl",
|
||||
"unicode": "e70d",
|
||||
"unicode_decimal": 59149
|
||||
},
|
||||
{
|
||||
"icon_id": "6756283",
|
||||
"name": "团队",
|
||||
"font_class": "tuandui",
|
||||
"unicode": "e612",
|
||||
"unicode_decimal": 58898
|
||||
},
|
||||
{
|
||||
"icon_id": "7404571",
|
||||
"name": "上",
|
||||
"font_class": "shang",
|
||||
"unicode": "e792",
|
||||
"unicode_decimal": 59282
|
||||
},
|
||||
{
|
||||
"icon_id": "7463934",
|
||||
"name": "打印小票",
|
||||
"font_class": "dayinxiaopiao",
|
||||
"unicode": "e627",
|
||||
"unicode_decimal": 58919
|
||||
},
|
||||
{
|
||||
"icon_id": "8414561",
|
||||
"name": "纸质书",
|
||||
"font_class": "zhizhishu",
|
||||
"unicode": "e613",
|
||||
"unicode_decimal": 58899
|
||||
},
|
||||
{
|
||||
"icon_id": "9826648",
|
||||
"name": "备注",
|
||||
"font_class": "beizhu",
|
||||
"unicode": "e614",
|
||||
"unicode_decimal": 58900
|
||||
},
|
||||
{
|
||||
"icon_id": "10487453",
|
||||
"name": "船舶",
|
||||
"font_class": "chuanbo",
|
||||
"unicode": "e68b",
|
||||
"unicode_decimal": 59019
|
||||
},
|
||||
{
|
||||
"icon_id": "10828733",
|
||||
"name": "新舱单信息",
|
||||
"font_class": "shiyongwendang",
|
||||
"unicode": "ea3d",
|
||||
"unicode_decimal": 59965
|
||||
},
|
||||
{
|
||||
"icon_id": "11346894",
|
||||
"name": "头像",
|
||||
"font_class": "touxiang",
|
||||
"unicode": "e611",
|
||||
"unicode_decimal": 58897
|
||||
},
|
||||
{
|
||||
"icon_id": "12975022",
|
||||
"name": "运输",
|
||||
"font_class": "yunshu1",
|
||||
"unicode": "e637",
|
||||
"unicode_decimal": 58935
|
||||
},
|
||||
{
|
||||
"icon_id": "15391348",
|
||||
"name": "编辑",
|
||||
"font_class": "bianji1",
|
||||
"unicode": "e61c",
|
||||
"unicode_decimal": 58908
|
||||
},
|
||||
{
|
||||
"icon_id": "15556290",
|
||||
"name": "OCR",
|
||||
"font_class": "OCR",
|
||||
"unicode": "e694",
|
||||
"unicode_decimal": 59028
|
||||
},
|
||||
{
|
||||
"icon_id": "18171208",
|
||||
"name": "打印,复印",
|
||||
"font_class": "printing",
|
||||
"unicode": "ea28",
|
||||
"unicode_decimal": 59944
|
||||
},
|
||||
{
|
||||
"icon_id": "19228997",
|
||||
"name": "船返管理-船返申请",
|
||||
"font_class": "chuanfanguanli-chuanfanshenqing",
|
||||
"unicode": "e648",
|
||||
"unicode_decimal": 58952
|
||||
},
|
||||
{
|
||||
"icon_id": "28019357",
|
||||
"name": "小票、发票-01",
|
||||
"font_class": "a-xiaopiaofapiao-01",
|
||||
"unicode": "e79f",
|
||||
"unicode_decimal": 59295
|
||||
},
|
||||
{
|
||||
"icon_id": "5831331",
|
||||
"name": "拖动",
|
||||
"font_class": "tuodong",
|
||||
"unicode": "e656",
|
||||
"unicode_decimal": 58966
|
||||
},
|
||||
{
|
||||
"icon_id": "695132",
|
||||
"name": "多选",
|
||||
"font_class": "duoxuan",
|
||||
"unicode": "e630",
|
||||
"unicode_decimal": 58928
|
||||
},
|
||||
{
|
||||
"icon_id": "2246755",
|
||||
"name": "多选",
|
||||
"font_class": "duoxuan1",
|
||||
"unicode": "e696",
|
||||
"unicode_decimal": 59030
|
||||
},
|
||||
{
|
||||
"icon_id": "8631647",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi",
|
||||
"unicode": "e603",
|
||||
"unicode_decimal": 58883
|
||||
},
|
||||
{
|
||||
"icon_id": "9303783",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi1",
|
||||
"unicode": "e601",
|
||||
"unicode_decimal": 58881
|
||||
},
|
||||
{
|
||||
"icon_id": "560260",
|
||||
"name": "设置",
|
||||
"font_class": "shezhi",
|
||||
"unicode": "e622",
|
||||
"unicode_decimal": 58914
|
||||
},
|
||||
{
|
||||
"icon_id": "992474",
|
||||
"name": "C操作",
|
||||
"font_class": "ccaozuo",
|
||||
"unicode": "e739",
|
||||
"unicode_decimal": 59193
|
||||
},
|
||||
{
|
||||
"icon_id": "1368544",
|
||||
"name": "删除",
|
||||
"font_class": "del",
|
||||
"unicode": "e602",
|
||||
"unicode_decimal": 58882
|
||||
},
|
||||
{
|
||||
"icon_id": "5492015",
|
||||
"name": "运费",
|
||||
"font_class": "yunfei",
|
||||
"unicode": "e77c",
|
||||
"unicode_decimal": 59260
|
||||
},
|
||||
{
|
||||
"icon_id": "20313949",
|
||||
"name": "编辑",
|
||||
"font_class": "bianji",
|
||||
"unicode": "e61a",
|
||||
"unicode_decimal": 58906
|
||||
},
|
||||
{
|
||||
"icon_id": "479192",
|
||||
"name": "眼睛",
|
||||
"font_class": "yanjing",
|
||||
"unicode": "e62f",
|
||||
"unicode_decimal": 58927
|
||||
},
|
||||
{
|
||||
"icon_id": "4354835",
|
||||
"name": "闭眼睛",
|
||||
"font_class": "biyanjing",
|
||||
"unicode": "e901",
|
||||
"unicode_decimal": 59649
|
||||
},
|
||||
{
|
||||
"icon_id": "722471",
|
||||
"name": "用户",
|
||||
"font_class": "yonghu",
|
||||
"unicode": "e61b",
|
||||
"unicode_decimal": 58907
|
||||
},
|
||||
{
|
||||
"icon_id": "25664277",
|
||||
"name": "用户密码修改",
|
||||
"font_class": "yonghumimaxiugai",
|
||||
"unicode": "e600",
|
||||
"unicode_decimal": 58880
|
||||
}
|
||||
]
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,15 @@
|
||||
// The Vue build version to load with the `import` command
|
||||
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
|
||||
import Vue from 'vue'
|
||||
import App from './App'
|
||||
import 'ant-design-vue/dist/antd.css';
|
||||
import router from './router'
|
||||
import Antd from 'ant-design-vue';
|
||||
Vue.use(Antd);
|
||||
Vue.config.productionTip = false
|
||||
new Vue({
|
||||
el: '#app',
|
||||
router,
|
||||
components: { App },
|
||||
template: '<App/>'
|
||||
})
|
@ -0,0 +1,21 @@
|
||||
import Vue from 'vue'
|
||||
import Router from 'vue-router'
|
||||
import index from '@/view/home/index'
|
||||
import examine from '@/view/examine/index'
|
||||
Vue.use(Router)
|
||||
|
||||
export default new Router({
|
||||
mode: 'history',
|
||||
routes: [
|
||||
{
|
||||
path: '/index',
|
||||
name: 'index',
|
||||
component: index
|
||||
},
|
||||
{
|
||||
path: '/examine',
|
||||
name: 'examine',
|
||||
component: examine
|
||||
}
|
||||
]
|
||||
})
|
@ -0,0 +1,15 @@
|
||||
const getters = {
|
||||
sidebar: state => state.app.sidebar,
|
||||
size: state => state.app.size,
|
||||
device: state => state.app.device,
|
||||
visitedViews: state => state.tagsView.visitedViews,
|
||||
cachedViews: state => state.tagsView.cachedViews,
|
||||
token: state => state.user.token,
|
||||
avatar: state => state.user.avatar,
|
||||
name: state => state.user.name,
|
||||
introduction: state => state.user.introduction,
|
||||
roles: state => state.user.roles,
|
||||
permission_routes: state => state.permission.routes,
|
||||
errorLogs: state => state.errorLog.logs
|
||||
}
|
||||
export default getters
|
@ -0,0 +1,25 @@
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
import getters from './getters'
|
||||
|
||||
Vue.use(Vuex)
|
||||
|
||||
// https://webpack.js.org/guides/dependency-management/#requirecontext
|
||||
const modulesFiles = require.context('./modules', true, /\.js$/)
|
||||
|
||||
// you do not need `import app from './modules/app'`
|
||||
// it will auto require all vuex module from modules file
|
||||
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
|
||||
// set './app.js' => 'app'
|
||||
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
|
||||
const value = modulesFiles(modulePath)
|
||||
modules[moduleName] = value.default
|
||||
return modules
|
||||
}, {})
|
||||
|
||||
const store = new Vuex.Store({
|
||||
modules,
|
||||
getters
|
||||
})
|
||||
|
||||
export default store
|
@ -0,0 +1,56 @@
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
const state = {
|
||||
sidebar: {
|
||||
opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
|
||||
withoutAnimation: false
|
||||
},
|
||||
device: 'desktop',
|
||||
size: Cookies.get('size') || 'medium'
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
TOGGLE_SIDEBAR: state => {
|
||||
state.sidebar.opened = !state.sidebar.opened
|
||||
state.sidebar.withoutAnimation = false
|
||||
if (state.sidebar.opened) {
|
||||
Cookies.set('sidebarStatus', 1)
|
||||
} else {
|
||||
Cookies.set('sidebarStatus', 0)
|
||||
}
|
||||
},
|
||||
CLOSE_SIDEBAR: (state, withoutAnimation) => {
|
||||
Cookies.set('sidebarStatus', 0)
|
||||
state.sidebar.opened = false
|
||||
state.sidebar.withoutAnimation = withoutAnimation
|
||||
},
|
||||
TOGGLE_DEVICE: (state, device) => {
|
||||
state.device = device
|
||||
},
|
||||
SET_SIZE: (state, size) => {
|
||||
state.size = size
|
||||
Cookies.set('size', size)
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
toggleSideBar({ commit }) {
|
||||
commit('TOGGLE_SIDEBAR')
|
||||
},
|
||||
closeSideBar({ commit }, { withoutAnimation }) {
|
||||
commit('CLOSE_SIDEBAR', withoutAnimation)
|
||||
},
|
||||
toggleDevice({ commit }, device) {
|
||||
commit('TOGGLE_DEVICE', device)
|
||||
},
|
||||
setSize({ commit }, size) {
|
||||
commit('SET_SIZE', size)
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
const state = {
|
||||
logs: []
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
ADD_ERROR_LOG: (state, log) => {
|
||||
state.logs.push(log)
|
||||
},
|
||||
CLEAR_ERROR_LOG: (state) => {
|
||||
state.logs.splice(0)
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
addErrorLog({ commit }, log) {
|
||||
commit('ADD_ERROR_LOG', log)
|
||||
},
|
||||
clearErrorLog({ commit }) {
|
||||
commit('CLEAR_ERROR_LOG')
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
import { asyncRoutes, constantRoutes } from '@/router'
|
||||
|
||||
/**
|
||||
* Use meta.role to determine if the current user has permission
|
||||
* @param roles
|
||||
* @param route
|
||||
*/
|
||||
function hasPermission(roles, route) {
|
||||
if (route.meta && route.meta.roles) {
|
||||
return roles.some(role => route.meta.roles.includes(role))
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter asynchronous routing tables by recursion
|
||||
* @param routes asyncRoutes
|
||||
* @param roles
|
||||
*/
|
||||
export function filterAsyncRoutes(routes, roles) {
|
||||
const res = []
|
||||
|
||||
routes.forEach(route => {
|
||||
const tmp = { ...route }
|
||||
if (hasPermission(roles, tmp)) {
|
||||
if (tmp.children) {
|
||||
tmp.children = filterAsyncRoutes(tmp.children, roles)
|
||||
}
|
||||
res.push(tmp)
|
||||
}
|
||||
})
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
const state = {
|
||||
routes: [],
|
||||
addRoutes: []
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
SET_ROUTES: (state, routes) => {
|
||||
state.addRoutes = routes
|
||||
state.routes = constantRoutes.concat(routes)
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
generateRoutes({ commit }, roles) {
|
||||
return new Promise(resolve => {
|
||||
let accessedRoutes
|
||||
if (roles.includes('admin')) {
|
||||
accessedRoutes = asyncRoutes || []
|
||||
} else {
|
||||
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
|
||||
}
|
||||
commit('SET_ROUTES', accessedRoutes)
|
||||
resolve(accessedRoutes)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
import variables from '@/styles/element-variables.scss'
|
||||
import defaultSettings from '@/settings'
|
||||
|
||||
const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
|
||||
|
||||
const state = {
|
||||
theme: variables.theme,
|
||||
showSettings: showSettings,
|
||||
tagsView: tagsView,
|
||||
fixedHeader: fixedHeader,
|
||||
sidebarLogo: sidebarLogo
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
CHANGE_SETTING: (state, { key, value }) => {
|
||||
// eslint-disable-next-line no-prototype-builtins
|
||||
if (state.hasOwnProperty(key)) {
|
||||
state[key] = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
changeSetting({ commit }, data) {
|
||||
commit('CHANGE_SETTING', data)
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
||||
|
@ -0,0 +1,160 @@
|
||||
const state = {
|
||||
visitedViews: [],
|
||||
cachedViews: []
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
ADD_VISITED_VIEW: (state, view) => {
|
||||
if (state.visitedViews.some(v => v.path === view.path)) return
|
||||
state.visitedViews.push(
|
||||
Object.assign({}, view, {
|
||||
title: view.meta.title || 'no-name'
|
||||
})
|
||||
)
|
||||
},
|
||||
ADD_CACHED_VIEW: (state, view) => {
|
||||
if (state.cachedViews.includes(view.name)) return
|
||||
if (!view.meta.noCache) {
|
||||
state.cachedViews.push(view.name)
|
||||
}
|
||||
},
|
||||
|
||||
DEL_VISITED_VIEW: (state, view) => {
|
||||
for (const [i, v] of state.visitedViews.entries()) {
|
||||
if (v.path === view.path) {
|
||||
state.visitedViews.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
},
|
||||
DEL_CACHED_VIEW: (state, view) => {
|
||||
const index = state.cachedViews.indexOf(view.name)
|
||||
index > -1 && state.cachedViews.splice(index, 1)
|
||||
},
|
||||
|
||||
DEL_OTHERS_VISITED_VIEWS: (state, view) => {
|
||||
state.visitedViews = state.visitedViews.filter(v => {
|
||||
return v.meta.affix || v.path === view.path
|
||||
})
|
||||
},
|
||||
DEL_OTHERS_CACHED_VIEWS: (state, view) => {
|
||||
const index = state.cachedViews.indexOf(view.name)
|
||||
if (index > -1) {
|
||||
state.cachedViews = state.cachedViews.slice(index, index + 1)
|
||||
} else {
|
||||
// if index = -1, there is no cached tags
|
||||
state.cachedViews = []
|
||||
}
|
||||
},
|
||||
|
||||
DEL_ALL_VISITED_VIEWS: state => {
|
||||
// keep affix tags
|
||||
const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
|
||||
state.visitedViews = affixTags
|
||||
},
|
||||
DEL_ALL_CACHED_VIEWS: state => {
|
||||
state.cachedViews = []
|
||||
},
|
||||
|
||||
UPDATE_VISITED_VIEW: (state, view) => {
|
||||
for (let v of state.visitedViews) {
|
||||
if (v.path === view.path) {
|
||||
v = Object.assign(v, view)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
addView({ dispatch }, view) {
|
||||
dispatch('addVisitedView', view)
|
||||
dispatch('addCachedView', view)
|
||||
},
|
||||
addVisitedView({ commit }, view) {
|
||||
commit('ADD_VISITED_VIEW', view)
|
||||
},
|
||||
addCachedView({ commit }, view) {
|
||||
commit('ADD_CACHED_VIEW', view)
|
||||
},
|
||||
|
||||
delView({ dispatch, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
dispatch('delVisitedView', view)
|
||||
dispatch('delCachedView', view)
|
||||
resolve({
|
||||
visitedViews: [...state.visitedViews],
|
||||
cachedViews: [...state.cachedViews]
|
||||
})
|
||||
})
|
||||
},
|
||||
delVisitedView({ commit, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_VISITED_VIEW', view)
|
||||
resolve([...state.visitedViews])
|
||||
})
|
||||
},
|
||||
delCachedView({ commit, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_CACHED_VIEW', view)
|
||||
resolve([...state.cachedViews])
|
||||
})
|
||||
},
|
||||
|
||||
delOthersViews({ dispatch, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
dispatch('delOthersVisitedViews', view)
|
||||
dispatch('delOthersCachedViews', view)
|
||||
resolve({
|
||||
visitedViews: [...state.visitedViews],
|
||||
cachedViews: [...state.cachedViews]
|
||||
})
|
||||
})
|
||||
},
|
||||
delOthersVisitedViews({ commit, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_OTHERS_VISITED_VIEWS', view)
|
||||
resolve([...state.visitedViews])
|
||||
})
|
||||
},
|
||||
delOthersCachedViews({ commit, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_OTHERS_CACHED_VIEWS', view)
|
||||
resolve([...state.cachedViews])
|
||||
})
|
||||
},
|
||||
|
||||
delAllViews({ dispatch, state }, view) {
|
||||
return new Promise(resolve => {
|
||||
dispatch('delAllVisitedViews', view)
|
||||
dispatch('delAllCachedViews', view)
|
||||
resolve({
|
||||
visitedViews: [...state.visitedViews],
|
||||
cachedViews: [...state.cachedViews]
|
||||
})
|
||||
})
|
||||
},
|
||||
delAllVisitedViews({ commit, state }) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_ALL_VISITED_VIEWS')
|
||||
resolve([...state.visitedViews])
|
||||
})
|
||||
},
|
||||
delAllCachedViews({ commit, state }) {
|
||||
return new Promise(resolve => {
|
||||
commit('DEL_ALL_CACHED_VIEWS')
|
||||
resolve([...state.cachedViews])
|
||||
})
|
||||
},
|
||||
|
||||
updateVisitedView({ commit }, view) {
|
||||
commit('UPDATE_VISITED_VIEW', view)
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
@ -0,0 +1,131 @@
|
||||
import { login, logout, getInfo } from '@/api/user'
|
||||
import { getToken, setToken, removeToken } from '@/utils/auth'
|
||||
import router, { resetRouter } from '@/router'
|
||||
|
||||
const state = {
|
||||
token: getToken(),
|
||||
name: '',
|
||||
avatar: '',
|
||||
introduction: '',
|
||||
roles: []
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
SET_TOKEN: (state, token) => {
|
||||
state.token = token
|
||||
},
|
||||
SET_INTRODUCTION: (state, introduction) => {
|
||||
state.introduction = introduction
|
||||
},
|
||||
SET_NAME: (state, name) => {
|
||||
state.name = name
|
||||
},
|
||||
SET_AVATAR: (state, avatar) => {
|
||||
state.avatar = avatar
|
||||
},
|
||||
SET_ROLES: (state, roles) => {
|
||||
state.roles = roles
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
// user login
|
||||
login({ commit }, userInfo) {
|
||||
const { username, password } = userInfo
|
||||
return new Promise((resolve, reject) => {
|
||||
login({ username: username.trim(), password: password }).then(response => {
|
||||
const { data } = response
|
||||
commit('SET_TOKEN', data.token)
|
||||
setToken(data.token)
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// get user info
|
||||
getInfo({ commit, state }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
getInfo(state.token).then(response => {
|
||||
const { data } = response
|
||||
|
||||
if (!data) {
|
||||
reject('Verification failed, please Login again.')
|
||||
}
|
||||
|
||||
const { roles, name, avatar, introduction } = data
|
||||
|
||||
// roles must be a non-empty array
|
||||
if (!roles || roles.length <= 0) {
|
||||
reject('getInfo: roles must be a non-null array!')
|
||||
}
|
||||
|
||||
commit('SET_ROLES', roles)
|
||||
commit('SET_NAME', name)
|
||||
commit('SET_AVATAR', avatar)
|
||||
commit('SET_INTRODUCTION', introduction)
|
||||
resolve(data)
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// user logout
|
||||
logout({ commit, state, dispatch }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
logout(state.token).then(() => {
|
||||
commit('SET_TOKEN', '')
|
||||
commit('SET_ROLES', [])
|
||||
removeToken()
|
||||
resetRouter()
|
||||
|
||||
// reset visited views and cached views
|
||||
// to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
|
||||
dispatch('tagsView/delAllViews', null, { root: true })
|
||||
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// remove token
|
||||
resetToken({ commit }) {
|
||||
return new Promise(resolve => {
|
||||
commit('SET_TOKEN', '')
|
||||
commit('SET_ROLES', [])
|
||||
removeToken()
|
||||
resolve()
|
||||
})
|
||||
},
|
||||
|
||||
// dynamically modify permissions
|
||||
async changeRoles({ commit, dispatch }, role) {
|
||||
const token = role + '-token'
|
||||
|
||||
commit('SET_TOKEN', token)
|
||||
setToken(token)
|
||||
|
||||
const { roles } = await dispatch('getInfo')
|
||||
|
||||
resetRouter()
|
||||
|
||||
// generate accessible routes map based on roles
|
||||
const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
|
||||
// dynamically add accessible routes
|
||||
router.addRoutes(accessRoutes)
|
||||
|
||||
// reset visited views and cached views
|
||||
dispatch('tagsView/delAllViews', null, { root: true })
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
import axios from 'axios'
|
||||
|
||||
// axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? "http://60.209.125.238:30802": "http://121.42.232.16:5066",
|
||||
axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? "http://60.209.125.238:30802": "/api",
|
||||
axios.defaults.timeout = 50000;
|
||||
|
||||
axios.interceptors.request.use(
|
||||
config => {
|
||||
config.headers = {
|
||||
'Authorization': 'Bearer ' +localStorage.getItem("userToken") || '',
|
||||
} //设置响应头部
|
||||
return config
|
||||
}
|
||||
)
|
||||
export function get(url, params) {
|
||||
return new Promise((resolve, reject) => {
|
||||
axios.defaults.headers = {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
}
|
||||
axios.get(url, {
|
||||
params: params
|
||||
}).then(res => {
|
||||
resolve(res.data)
|
||||
}).catch(err => {
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export function post(url, params = {}, type = 'normal') {
|
||||
return new Promise((resolve, reject) => {
|
||||
if(type == 'url'){
|
||||
let str = objectToQueryString(params);
|
||||
url = url + '?' + str;
|
||||
}
|
||||
axios.defaults.headers = {
|
||||
'Content-Type': 'application/json;charset=UTF-8',
|
||||
}
|
||||
axios.post(url, params)
|
||||
.then(res => {
|
||||
resolve(res.data)
|
||||
})
|
||||
.catch(err => {
|
||||
reject(err.data)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function objectToQueryString(data) {
|
||||
return Object.keys(data).map(function (key) {
|
||||
return "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(data[key]));
|
||||
}).join('&');
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
import { get, post } from './http.js'
|
||||
|
||||
export const baoguanlist = (data) => {
|
||||
return post('/BaoGuan/List', data)
|
||||
}
|
||||
|
||||
export const baoguanDetail = (data) => {
|
||||
return post('/BaoGuan/Detail?id='+data)
|
||||
}
|
||||
|
||||
export const UploadTempFile = (data) => {
|
||||
return post('/BaoGuan/UploadTempFile',data)
|
||||
}
|
||||
|
||||
export const save = (data) => {
|
||||
return post('/BaoGuan/save',data)
|
||||
}
|
||||
|
||||
export const BaoguanDelete = (data) => {
|
||||
return post('/BaoGuan/Delete',data)
|
||||
}
|
||||
|
||||
export const BaoguanSubmit = (data) => {
|
||||
return post('/BaoGuan/Submit',data)
|
||||
}
|
||||
|
||||
export const BaoguanAuditList = (data) => {
|
||||
return post('/BaoGuan/AuditList',data)
|
||||
}
|
||||
|
||||
export const BaoguanAudit = (data) => {
|
||||
return post('/BaoGuan/Audit',data,'url')
|
||||
}
|
||||
|
@ -0,0 +1,466 @@
|
||||
<template>
|
||||
<div class="main">
|
||||
<div class="title">报关管理</div>
|
||||
<div>
|
||||
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-row>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="客户名称">
|
||||
<a-input v-model="form.companyName" />
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="提单号">
|
||||
<a-input v-model="form.blno" />
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="业务类型">
|
||||
<a-select v-model="form.bsType">
|
||||
<a-select-option value="海运出口">
|
||||
海运出口
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="业务状态">
|
||||
<a-select v-model="form.statusDjy">
|
||||
<a-select-option value="已接收">
|
||||
已接收
|
||||
</a-select-option>
|
||||
<a-select-option value="待审核">
|
||||
待审核
|
||||
</a-select-option>
|
||||
<a-select-option value="已驳回">
|
||||
已驳回
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="发送时间">
|
||||
<a-range-picker :placeholder="['开始时间', '结束时间']" valueFormat="YYYY-MM-DD" v-model="form.creatDate">
|
||||
</a-range-picker>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-button type="primary" @click="handleSearch">查询</a-button>
|
||||
<a-button @click="handleReast">重置</a-button>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
<a-row style="margin-bottom: 10px;">
|
||||
<a-button type="primary" @click="handleAccess">通过</a-button>
|
||||
<a-button type="danger" @click="handleNoacc">驳回</a-button>
|
||||
</a-row>
|
||||
</div>
|
||||
<a-table :pagination="pagination" @change="tablePaginationChange" :customRow="handleClickRow" rowKey="id"
|
||||
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :columns="columns"
|
||||
:data-source="data">
|
||||
<div slot="action" slot-scope="text, record">
|
||||
<a-popover placement="bottom">
|
||||
<template slot="content">
|
||||
<div @click="handleDown(index)" class="file" v-for="(item, index) in record.custFileList" :key="index">{{
|
||||
item }}</div>
|
||||
</template>
|
||||
<a>原始单据</a>
|
||||
</a-popover>
|
||||
</div>
|
||||
<div slot="statusDjy" slot-scope="text, record">
|
||||
<div>
|
||||
<a v-if="record.statusDjy == '已接收'">{{ text }}</a>
|
||||
<a v-if="record.statusDjy == '待审核'" style="color: black;">{{ text }}</a>
|
||||
<a v-if="record.statusDjy == '已驳回'" style="color: rgb(217,0,27);">{{ text }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div slot="blno" slot-scope="text, record">
|
||||
<div @click="handleEdit(record)">
|
||||
<a>{{ text }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</a-table>
|
||||
<a-modal width="1200px" title="业务状态" :visible="visible" @ok="visible = false" @cancel="visible = false">
|
||||
<a-table :columns="logColums" :data-source="logData"></a-table>
|
||||
</a-modal>
|
||||
<a-modal width="800px" okText="确定" cancelText="取消" title="驳回原因" :visible="addVisible" @ok="handleSave"
|
||||
@cancel="addVisible = false">
|
||||
<a-form-model :rules="rules" ref="addForm" :model="addForm" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-form-model-item prop="remark" label="驳回原因">
|
||||
<a-textarea v-model="addForm.remark" />
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
</a-modal>
|
||||
<a-modal okText="确定" :footer="null" cancelText="取消" width="800px" title="报关下单" @cancel="editVisible = false" :visible="editVisible">
|
||||
<a-spin :spinning="addLoading">
|
||||
<a-form-model :rules="rules" ref="addForm" :model="addForm" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-form-model-item prop="blno" label="提单号">
|
||||
{{ addForm.blno }}
|
||||
</a-form-model-item>
|
||||
<a-form-model-item prop="bsType" label="业务类型">
|
||||
{{ addForm.bsType }}
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="备注">
|
||||
{{ addForm.customerRemark }}
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="修改内容">
|
||||
{{ addForm.updateRemark }}
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
</a-spin>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios'
|
||||
import { BaoguanAudit, BaoguanAuditList, baoguanDetail, UploadTempFile, save, BaoguanDelete, BaoguanSubmit, BaoguanGetFile } from '@/utils/request.js'
|
||||
const columns = [
|
||||
{
|
||||
title: '业务状态',
|
||||
dataIndex: 'statusDjy',
|
||||
key: 'statusDjy',
|
||||
scopedSlots: { customRender: 'statusDjy' },
|
||||
},
|
||||
{
|
||||
title: '提单号',
|
||||
dataIndex: 'blno',
|
||||
key: 'blno',
|
||||
scopedSlots: { customRender: 'blno' },
|
||||
},
|
||||
{
|
||||
title: '业务类型',
|
||||
dataIndex: 'bsType',
|
||||
key: 'bsType',
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
dataIndex: 'createdUserName',
|
||||
key: 'createdUserName',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createdTime',
|
||||
key: 'createdTime',
|
||||
},
|
||||
{
|
||||
title: '所属公司',
|
||||
dataIndex: 'companyName',
|
||||
key: 'companyName',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
dataIndex: 'action',
|
||||
key: 'action',
|
||||
scopedSlots: { customRender: 'action' },
|
||||
},
|
||||
];
|
||||
const logColums = [
|
||||
{
|
||||
title: '业务状态',
|
||||
dataIndex: 'statusName',
|
||||
key: 'statusName',
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
dataIndex: 'createdUserName',
|
||||
key: 'createdUserName',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createdTime',
|
||||
key: 'createdTime',
|
||||
},
|
||||
{
|
||||
title: '驳回原因',
|
||||
dataIndex: 'remark',
|
||||
key: 'remark',
|
||||
}
|
||||
];
|
||||
export default {
|
||||
name: 'index',
|
||||
data() {
|
||||
return {
|
||||
code: this.$route.query.code,
|
||||
data: [],
|
||||
form: {},
|
||||
logColums,
|
||||
addLoading: false,
|
||||
addForm: {},
|
||||
fileList: [],
|
||||
logData: [],
|
||||
editVisible:false,
|
||||
addVisible: false,
|
||||
selectedRowKeys: [],
|
||||
visible: false,
|
||||
labelCol: { span: 4 },
|
||||
wrapperCol: { span: 14 },
|
||||
pagination: {
|
||||
current: 1,
|
||||
total: 0, // 总数
|
||||
showSizeChanger: true,
|
||||
pageSizeOptions: ['1', '10', '20', '40', '80', '100'],
|
||||
pageSize: 10,
|
||||
showTotal: total => `共有 ${total} 条数据`
|
||||
},
|
||||
columns,
|
||||
rules: {
|
||||
remark: [
|
||||
{ required: true, message: '请输入驳回原因', trigger: 'blur' },
|
||||
]
|
||||
},
|
||||
baseLink:'http://60.209.125.238:30802/'
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.Login()
|
||||
},
|
||||
mounted() { },
|
||||
methods: {
|
||||
Login() {
|
||||
let url = this.baseLink + 'loginWithCode?code=' + this.code
|
||||
axios
|
||||
.post(url)
|
||||
.then((res) => {
|
||||
console.log(res)
|
||||
const { status, data } = res
|
||||
if (status == 200) {
|
||||
localStorage.setItem('userToken', data.data)
|
||||
this.getList()
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err)
|
||||
})
|
||||
},
|
||||
handleNoacc() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
}
|
||||
if (this.selectedRowKeys.length > 1) {
|
||||
this.$message.warning('只能选择一条')
|
||||
return false
|
||||
}
|
||||
this.addVisible = true
|
||||
},
|
||||
handleDown(id) {
|
||||
let baseUrl = this.baseLink + 'BaoGuan/GetFile'
|
||||
let link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.href = baseUrl + '?id=' + id
|
||||
link.target = '_blank'
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
},
|
||||
tablePaginationChange(pagination) {
|
||||
this.pagination.current = pagination.current
|
||||
this.pagination.pageSize = pagination.pageSize
|
||||
this.getList()
|
||||
},
|
||||
onSelectChange(selectedRowKeys) {
|
||||
this.selectedRowKeys = selectedRowKeys;
|
||||
},
|
||||
handleClickRow(record, index) {
|
||||
return {
|
||||
on: {
|
||||
dblclick: () => {
|
||||
baoguanDetail(record.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.addForm = res.data
|
||||
this.addVisible = true
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
handleReast() {
|
||||
this.form = {}
|
||||
},
|
||||
handleSearch() {
|
||||
if (this.form.creatDate) {
|
||||
this.form.createdTimeStart = this.form.creatDate[0]
|
||||
this.form.createdTimeEnd = this.form.creatDate[1]
|
||||
}
|
||||
this.getList()
|
||||
},
|
||||
handleAccess() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
}
|
||||
if (this.selectedRowKeys.length > 1) {
|
||||
this.$message.warning('只能选择一条')
|
||||
return false
|
||||
}
|
||||
const data = {
|
||||
id: this.selectedRowKeys[0],
|
||||
accept: true
|
||||
}
|
||||
BaoguanAudit(data).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('操作成功')
|
||||
this.getList()
|
||||
this.selectedRowKeys = []
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
handleSubimt() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
} else {
|
||||
BaoguanSubmit(this.selectedRowKeys).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('发送成功')
|
||||
this.getList()
|
||||
this.selectedRowKeys = []
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
handleEdit(row) {
|
||||
this.editVisible = true
|
||||
this.addLoading = true
|
||||
baoguanDetail(row.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.addForm = res.data
|
||||
if (Object.keys(this.addForm.fileListBaoGuan).length > 0) {
|
||||
const arr = []
|
||||
Object.keys(this.addForm.fileListBaoGuan).forEach((item, index) => {
|
||||
arr.push({
|
||||
id: item,
|
||||
name: Object.values(this.addForm.fileListBaoGuan)[index]
|
||||
})
|
||||
})
|
||||
this.fileList = arr
|
||||
}
|
||||
}
|
||||
this.addLoading = false
|
||||
})
|
||||
},
|
||||
handleSave() {
|
||||
this.$refs.addForm.validate(valid => {
|
||||
if (valid) {
|
||||
const data = {
|
||||
id: this.selectedRowKeys[0],
|
||||
accept: false,
|
||||
remark: this.addForm.remark
|
||||
}
|
||||
BaoguanAudit(data).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('操作成功')
|
||||
this.addVisible = false
|
||||
this.selectedRowKeys = []
|
||||
this.getList()
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
customRequest(data) {
|
||||
const formData = new FormData()
|
||||
formData.append('file', data.file)
|
||||
UploadTempFile(formData, (percent) => this.setUploadProcess(percent)).then((res) => {
|
||||
console.log(res)
|
||||
if (res.succeeded) {
|
||||
this.$message.success('上传成功')
|
||||
const data = res.data.split('\\')
|
||||
this.fileList.push({
|
||||
name: data[1],
|
||||
id: res.data
|
||||
})
|
||||
} else {
|
||||
this.$message.error('上传失败:' + res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
getList() {
|
||||
const data = {
|
||||
"pageIndex": this.pagination.current,
|
||||
"pageSize": this.pagination.pageSize,
|
||||
...this.form
|
||||
}
|
||||
BaoguanAuditList(data).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.data = res.data.items
|
||||
this.pagination.total = res.data.totalCount
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleOpen(row) {
|
||||
this.visible = true
|
||||
baoguanDetail(row.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.logData = res.data.logListBuss
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDetleFile(index) {
|
||||
this.fileList.splice(index, 1)
|
||||
},
|
||||
handleDownFile(row) {
|
||||
let baseUrl = this.baseLink
|
||||
let link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.href = baseUrl + '?id=' + row.id
|
||||
link.target = '_blank'
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.title {
|
||||
font-size: 20px;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
color: rgb(22, 155, 213);
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.main {
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.fileList {
|
||||
margin-top: 10px;
|
||||
margin-left: 30px;
|
||||
|
||||
span {
|
||||
margin-right: 50px;
|
||||
color: cornflowerblue;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.file {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.file:hover {
|
||||
text-decoration: underline;
|
||||
color: cornflowerblue;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,612 @@
|
||||
<template>
|
||||
<div class="main">
|
||||
<div class="title">报关管理</div>
|
||||
<div>
|
||||
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-row>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="提单号">
|
||||
<a-input v-model="form.blno" />
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="境内发货人">
|
||||
<a-input v-model="form.shipperName" />
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="报关单号">
|
||||
<a-input v-model="form.customsCode" />
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="业务类型">
|
||||
<a-select v-model="form.bsType">
|
||||
<a-select-option value="海运出口">
|
||||
海运出口
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="报关状态">
|
||||
<a-select v-model="form.customsStatus">
|
||||
<a-select-option value="海关放行">
|
||||
海关放行
|
||||
</a-select-option>
|
||||
<a-select-option value="海关审结">
|
||||
海关审结
|
||||
</a-select-option>
|
||||
<a-select-option value="提交单一">
|
||||
提交单一
|
||||
</a-select-option>
|
||||
<a-select-option value="报关行接单">
|
||||
报关行接单
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-form-model-item label="创建时间">
|
||||
<a-range-picker :placeholder="['开始时间', '结束时间']" valueFormat="YYYY-MM-DD" v-model="form.creatDate">
|
||||
</a-range-picker>
|
||||
</a-form-model-item>
|
||||
</a-col>
|
||||
<a-col :span="6">
|
||||
<a-button type="primary" @click="handleSearch">查询</a-button>
|
||||
<a-button @click="handleReast">重置</a-button>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form-model>
|
||||
<a-row style="margin-bottom: 10px;">
|
||||
<a-button type="primary" @click="handleOpenAdd">新建</a-button>
|
||||
<a-button type="primary" @click="handleCopy">复制</a-button>
|
||||
<a-button type="danger" @click="handleDelete">删除</a-button>
|
||||
<a-button type="primary" @click="handleSubimt">发送</a-button>
|
||||
</a-row>
|
||||
</div>
|
||||
<a-table :pagination="pagination" @change="tablePaginationChange" :customRow="handleClickRow" rowKey="id"
|
||||
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" :columns="columns"
|
||||
:data-source="data">
|
||||
<div slot="action" slot-scope="text, record">
|
||||
<a-icon @click="handleEdit(record)" style="cursor: pointer;color:#1890ff;margin-right: 10px;" type="edit"
|
||||
theme="filled" />
|
||||
<a-popover placement="bottom">
|
||||
<template slot="content">
|
||||
<div @click="handleDown(item.id)" class="file" v-for="(item, index) in record.custFileList" :key="index">{{
|
||||
item.fileName }}</div>
|
||||
</template>
|
||||
<a>原始单据</a>
|
||||
</a-popover>
|
||||
<a-popover placement="bottom">
|
||||
<template slot="content">
|
||||
<div @click="handleDownHG(item.id)" class="file" v-for="(item, index) in record.customsFileList" :key="index">{{
|
||||
index.fileName }}</div>
|
||||
</template>
|
||||
<a>海关单据</a>
|
||||
</a-popover>
|
||||
|
||||
</div>
|
||||
<div slot="statusCustomer" slot-scope="text, record">
|
||||
<div @click="handleOpen(record)">
|
||||
<a v-if="record.statusCustomer == '已发送'">{{ text }}</a>
|
||||
<a v-if="record.statusCustomer == '已录入'" style="color: black;">{{ text }}</a>
|
||||
<a v-if="record.statusCustomer == '已驳回'" style="color: rgb(217,0,27);">{{ text }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div slot="customsStatus" slot-scope="text, record">
|
||||
<div @click="handleOpen1(record)">
|
||||
<a>{{ text }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div slot="blno" slot-scope="text, record">
|
||||
<div @click="handleEdit(record)">
|
||||
<a>{{ text }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</a-table>
|
||||
<a-modal width="1200px" okText="确定" cancelText="取消" title="业务状态" :visible="visible" @ok="visible = false"
|
||||
@cancel="visible = false">
|
||||
<a-table :pagination="false" :columns="logColums" :data-source="logData"></a-table>
|
||||
</a-modal>
|
||||
<a-modal width="600px" okText="确定" cancelText="取消" title="报关状态" :visible="BGvisible" @ok="BGvisible = false"
|
||||
@cancel="BGvisible = false">
|
||||
<a-table :pagination="false" :columns="BGcolums" :data-source="BGdata"></a-table>
|
||||
</a-modal>
|
||||
<a-modal width="800px" title="报关下单" @cancel="addVisible = false" :visible="addVisible">
|
||||
<a-spin :spinning="addLoading">
|
||||
<a-form-model :rules="rules" ref="addForm" :model="addForm" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-form-model-item prop="blno" label="提单号">
|
||||
<a-input v-model="addForm.blno" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item prop="bsType" label="业务类型">
|
||||
<a-select v-model="addForm.bsType">
|
||||
<a-select-option value="海运出口">
|
||||
海运出口
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="备注">
|
||||
<a-textarea v-model="addForm.customerRemark" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item v-if="addForm.statusCustomer == '已发送'" label="修改内容">
|
||||
<a-textarea v-model="addForm.updateRemark" />
|
||||
</a-form-model-item>
|
||||
<a-form-model-item>
|
||||
<a-upload :customRequest="customRequest" :showUploadList="false" :multiple="true"
|
||||
style="margin-left: 30px;margin-top: 10px;" name="file">
|
||||
<a-button>
|
||||
<a-icon type="upload" />原始单据上传
|
||||
</a-button>
|
||||
</a-upload>
|
||||
</a-form-model-item>
|
||||
<div style="display: flex;flex-wrap: wrap;">
|
||||
<div v-for="(item, index) in fileList" class="fileList" :key="index">
|
||||
<span @click="handleDownFile(item)">{{ item.name }}</span>
|
||||
<a-icon @click.stop="handleDetleFile(index)" type="delete" />
|
||||
</div>
|
||||
</div>
|
||||
</a-form-model>
|
||||
</a-spin>
|
||||
<template slot="footer">
|
||||
<a-button type="danger" @click="addVisible = false">
|
||||
取消
|
||||
</a-button>
|
||||
<a-button type="primary" @click="handleSave">
|
||||
保存
|
||||
</a-button>
|
||||
<a-button type="primary" v-if="addForm.statusCustomer == '已录入' || addForm.statusCustomer == '已驳回'"
|
||||
@click="handleSend">
|
||||
发送
|
||||
</a-button>
|
||||
<a-button type="primary" v-if="addForm.statusCustomer == '已发送'" @click="handleSave">
|
||||
发送修改
|
||||
</a-button>
|
||||
</template>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios'
|
||||
import { baoguanlist, baoguanDetail, UploadTempFile, save, BaoguanDelete, BaoguanSubmit, BaoguanGetFile } from '@/utils/request.js'
|
||||
const columns = [
|
||||
{
|
||||
title: '业务状态',
|
||||
dataIndex: 'statusCustomer',
|
||||
key: 'statusCustomer',
|
||||
scopedSlots: { customRender: 'statusCustomer' },
|
||||
},
|
||||
{
|
||||
title: '提单号',
|
||||
dataIndex: 'blno',
|
||||
key: 'blno',
|
||||
scopedSlots: { customRender: 'blno' },
|
||||
},
|
||||
{
|
||||
title: '境内发货人',
|
||||
dataIndex: 'shipperName',
|
||||
key: 'shipperName',
|
||||
},
|
||||
{
|
||||
title: '业务类型',
|
||||
dataIndex: 'bsType',
|
||||
key: 'bsType',
|
||||
},
|
||||
{
|
||||
title: '报关单号',
|
||||
dataIndex: 'customsCode',
|
||||
key: 'customsCode',
|
||||
},
|
||||
{
|
||||
title: '报关状态',
|
||||
dataIndex: 'customsStatus',
|
||||
key: 'customsStatus',
|
||||
scopedSlots: { customRender: 'customsStatus' },
|
||||
},
|
||||
{
|
||||
title: '状态时间',
|
||||
dataIndex: 'customsStatusTime',
|
||||
key: 'customsStatusTime',
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
dataIndex: 'createdUserName',
|
||||
key: 'createdUserName',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createdTime',
|
||||
key: 'createdTime',
|
||||
},
|
||||
{
|
||||
title: '所属公司',
|
||||
dataIndex: 'companyName',
|
||||
key: 'companyName',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
dataIndex: 'action',
|
||||
key: 'action',
|
||||
scopedSlots: { customRender: 'action' },
|
||||
},
|
||||
];
|
||||
const logColums = [
|
||||
{
|
||||
title: '业务状态',
|
||||
dataIndex: 'statusName',
|
||||
key: 'statusName',
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
dataIndex: 'createdUserName',
|
||||
key: 'createdUserName',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createdTime',
|
||||
key: 'createdTime',
|
||||
},
|
||||
{
|
||||
title: '驳回原因',
|
||||
dataIndex: 'remark',
|
||||
key: 'remark',
|
||||
}
|
||||
];
|
||||
export default {
|
||||
name: 'index',
|
||||
data() {
|
||||
return {
|
||||
code: this.$route.query.code,
|
||||
data: [],
|
||||
form: {},
|
||||
logColums,
|
||||
BGvisible: false,
|
||||
addLoading: false,
|
||||
addForm: {},
|
||||
fileList: [],
|
||||
logData: [],
|
||||
BGdata: [],
|
||||
BGcolums: [
|
||||
{
|
||||
title: '报关状态',
|
||||
dataIndex: 'statusName',
|
||||
key: 'statusName',
|
||||
},
|
||||
{
|
||||
title: '日期',
|
||||
dataIndex: 'createdTime',
|
||||
key: 'createdTime',
|
||||
},
|
||||
],
|
||||
addVisible: false,
|
||||
selectedRowKeys: [],
|
||||
visible: false,
|
||||
labelCol: { span: 4 },
|
||||
wrapperCol: { span: 14 },
|
||||
pagination: {
|
||||
current: 1,
|
||||
total: 0, // 总数
|
||||
showSizeChanger: true,
|
||||
pageSizeOptions: ['1', '10', '20', '40', '80', '100'],
|
||||
pageSize: 10,
|
||||
showTotal: total => `共有 ${total} 条数据`
|
||||
},
|
||||
columns,
|
||||
rules: {
|
||||
blno: [
|
||||
{ required: true, message: '请输入提单号', trigger: 'blur' },
|
||||
],
|
||||
bsType: [
|
||||
{ required: true, message: '请选择业务类型', trigger: 'blur' },
|
||||
]
|
||||
},
|
||||
baseLink: 'http://60.209.125.238:30802/'
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.Login()
|
||||
},
|
||||
mounted() { },
|
||||
//http://60.209.125.238:30802 http://121.42.232.16:5066
|
||||
methods: {
|
||||
Login() {
|
||||
let url = this.baseLink + 'loginWithCode?code=' + this.code
|
||||
axios
|
||||
.post(url)
|
||||
.then((res) => {
|
||||
const { status, data } = res
|
||||
console.log(res)
|
||||
if (res.data.statusCode == 200) {
|
||||
localStorage.setItem('userToken', data.data)
|
||||
this.getList()
|
||||
} else {
|
||||
this.$message.error(res.data.errors)
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.$message.error(err)
|
||||
})
|
||||
},
|
||||
handleOpenAdd() {
|
||||
this.addVisible = true
|
||||
this.addForm = {}
|
||||
this.addForm.bsType = '海运出口'
|
||||
this.fileList = []
|
||||
this.$refs.addForm.resetFields()
|
||||
},
|
||||
tablePaginationChange(pagination) {
|
||||
this.pagination.current = pagination.current
|
||||
this.pagination.pageSize = pagination.pageSize
|
||||
this.getList()
|
||||
},
|
||||
onSelectChange(selectedRowKeys) {
|
||||
this.selectedRowKeys = selectedRowKeys;
|
||||
},
|
||||
handleClickRow(record, index) {
|
||||
return {
|
||||
on: {
|
||||
dblclick: () => {
|
||||
baoguanDetail(record.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.addForm = res.data
|
||||
this.addVisible = true
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
handleReast() {
|
||||
this.form = {}
|
||||
},
|
||||
handleSend() {
|
||||
BaoguanSubmit([this.addForm.id]).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('发送成功')
|
||||
this.getList()
|
||||
this.addVisible = false
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleSearch() {
|
||||
if (this.form.creatDate) {
|
||||
this.form.createdTimeStart = this.form.creatDate[0]
|
||||
this.form.createdTimeEnd = this.form.creatDate[1]
|
||||
}
|
||||
this.getList()
|
||||
},
|
||||
handleDelete() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
} else {
|
||||
BaoguanDelete(this.selectedRowKeys).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('删除成功')
|
||||
this.getList()
|
||||
this.selectedRowKeys = []
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
handleCopy() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
}
|
||||
if (this.selectedRowKeys.length > 1) {
|
||||
this.$message.warning('只能选择一条数据复制')
|
||||
return false
|
||||
}
|
||||
baoguanDetail(this.selectedRowKeys[0]).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.addForm = res.data
|
||||
this.addForm.files = {}
|
||||
this.addForm.statusCustomer = ''
|
||||
this.addForm.updateRemark = ''
|
||||
delete this.addForm.id
|
||||
this.addVisible = true
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleSubimt() {
|
||||
if (this.selectedRowKeys.length == 0) {
|
||||
this.$message.warning('请先选择')
|
||||
return false
|
||||
} else {
|
||||
BaoguanSubmit(this.selectedRowKeys).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('发送成功')
|
||||
this.getList()
|
||||
this.selectedRowKeys = []
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
handleEdit(row) {
|
||||
this.addVisible = true
|
||||
this.addLoading = true
|
||||
baoguanDetail(row.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.addForm = res.data
|
||||
if (Object.keys(this.addForm.fileListBaoGuan).length > 0) {
|
||||
const arr = []
|
||||
Object.keys(this.addForm.fileListBaoGuan).forEach((item, index) => {
|
||||
arr.push({
|
||||
id: item,
|
||||
name: Object.values(this.addForm.fileListBaoGuan)[index]
|
||||
})
|
||||
})
|
||||
this.fileList = arr
|
||||
}
|
||||
}
|
||||
this.addLoading = false
|
||||
})
|
||||
},
|
||||
handleDownHG(url) {
|
||||
let link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.href = url
|
||||
link.target = '_blank'
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
},
|
||||
handleDown(id) {
|
||||
let baseUrl = this.baseLink + 'BaoGuan/GetFile'
|
||||
let link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.href = baseUrl + '?id=' + id
|
||||
link.target = '_blank'
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
},
|
||||
handleSave() {
|
||||
this.$refs.addForm.validate(valid => {
|
||||
if (valid) {
|
||||
this.addLoading = true
|
||||
const data = {
|
||||
...this.addForm
|
||||
}
|
||||
const filesArr = []
|
||||
const tempFileNamesArr = []
|
||||
if (this.fileList.length > 0) {
|
||||
this.fileList.forEach(item => {
|
||||
if (item.id.indexOf('/') != -1) {
|
||||
tempFileNamesArr.push(item.id)
|
||||
} else {
|
||||
filesArr.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
data.files = filesArr
|
||||
data.tempFileNames = tempFileNamesArr
|
||||
save(data).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.$message.success('操作成功')
|
||||
this.addVisible = false
|
||||
this.getList()
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
this.addLoading = false
|
||||
})
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
customRequest(data) {
|
||||
const formData = new FormData()
|
||||
formData.append('file', data.file)
|
||||
UploadTempFile(formData, (percent) => this.setUploadProcess(percent)).then((res) => {
|
||||
console.log(res)
|
||||
if (res.succeeded) {
|
||||
this.$message.success('上传成功')
|
||||
const data = res.data.split('/')
|
||||
this.fileList.push({
|
||||
name: data[1],
|
||||
id: res.data
|
||||
})
|
||||
} else {
|
||||
this.$message.error('上传失败:' + res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
getList() {
|
||||
const data = {
|
||||
"pageIndex": this.pagination.current,
|
||||
"pageSize": this.pagination.pageSize,
|
||||
...this.form
|
||||
}
|
||||
baoguanlist(data).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.data = res.data.items
|
||||
this.pagination.total = res.data.totalCount
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleOpen(row) {
|
||||
this.visible = true
|
||||
baoguanDetail(row.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.logData = res.data.logListBuss
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleOpen1(row) {
|
||||
this.BGvisible = true
|
||||
baoguanDetail(row.id).then(res => {
|
||||
if (res.succeeded) {
|
||||
this.BGdata = res.data.logListCustoms
|
||||
} else {
|
||||
this.$message.error(res.errors)
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDetleFile(index) {
|
||||
this.fileList.splice(index, 1)
|
||||
},
|
||||
handleDownFile(row) {
|
||||
let baseUrl = this.baseLink + 'BaoGuan/GetFile'
|
||||
let link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.href = baseUrl + '?id=' + row.id
|
||||
link.target = '_blank'
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.title {
|
||||
font-size: 20px;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
color: rgb(22, 155, 213);
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.main {
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.fileList {
|
||||
margin-top: 10px;
|
||||
margin-left: 30px;
|
||||
|
||||
span {
|
||||
margin-right: 50px;
|
||||
color: cornflowerblue;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.file {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.file:hover {
|
||||
text-decoration: underline;
|
||||
color: cornflowerblue;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,539 @@
|
||||
/* 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;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,187 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 3427532 */
|
||||
src: url('iconfont.woff2?t=1658476460269') format('woff2'),
|
||||
url('iconfont.woff?t=1658476460269') format('woff'),
|
||||
url('iconfont.ttf?t=1658476460269') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-zhoubao:before {
|
||||
content: "\e661";
|
||||
}
|
||||
|
||||
.icon-fapiaoguanli:before {
|
||||
content: "\e623";
|
||||
}
|
||||
|
||||
.icon-lianjie:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.icon-xiugai:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.icon-shuaxin:before {
|
||||
content: "\e62b";
|
||||
}
|
||||
|
||||
.icon-left-1:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-right-1-copy:before {
|
||||
content: "\e61f";
|
||||
}
|
||||
|
||||
.icon-xia:before {
|
||||
content: "\e63d";
|
||||
}
|
||||
|
||||
.icon-jinggao:before {
|
||||
content: "\e651";
|
||||
}
|
||||
|
||||
.icon-dingdan:before {
|
||||
content: "\e65c";
|
||||
}
|
||||
|
||||
.icon-zhcc_tidan:before {
|
||||
content: "\e682";
|
||||
}
|
||||
|
||||
.icon-icon_baocun:before {
|
||||
content: "\eb8e";
|
||||
}
|
||||
|
||||
.icon-daibanshixiang:before {
|
||||
content: "\ec4e";
|
||||
}
|
||||
|
||||
.icon-fuzhi1:before {
|
||||
content: "\ec7a";
|
||||
}
|
||||
|
||||
.icon-wj-bccl:before {
|
||||
content: "\e70d";
|
||||
}
|
||||
|
||||
.icon-tuandui:before {
|
||||
content: "\e612";
|
||||
}
|
||||
|
||||
.icon-shang:before {
|
||||
content: "\e792";
|
||||
}
|
||||
|
||||
.icon-dayinxiaopiao:before {
|
||||
content: "\e627";
|
||||
}
|
||||
|
||||
.icon-zhizhishu:before {
|
||||
content: "\e613";
|
||||
}
|
||||
|
||||
.icon-beizhu:before {
|
||||
content: "\e614";
|
||||
}
|
||||
|
||||
.icon-chuanbo:before {
|
||||
content: "\e68b";
|
||||
}
|
||||
|
||||
.icon-shiyongwendang:before {
|
||||
content: "\ea3d";
|
||||
}
|
||||
|
||||
.icon-touxiang:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.icon-yunshu1:before {
|
||||
content: "\e637";
|
||||
}
|
||||
|
||||
.icon-bianji1:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.icon-OCR:before {
|
||||
content: "\e694";
|
||||
}
|
||||
|
||||
.icon-printing:before {
|
||||
content: "\ea28";
|
||||
}
|
||||
|
||||
.icon-chuanfanguanli-chuanfanshenqing:before {
|
||||
content: "\e648";
|
||||
}
|
||||
|
||||
.icon-a-xiaopiaofapiao-01:before {
|
||||
content: "\e79f";
|
||||
}
|
||||
|
||||
.icon-tuodong:before {
|
||||
content: "\e656";
|
||||
}
|
||||
|
||||
.icon-duoxuan:before {
|
||||
content: "\e630";
|
||||
}
|
||||
|
||||
.icon-duoxuan1:before {
|
||||
content: "\e696";
|
||||
}
|
||||
|
||||
.icon-guanbi:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-guanbi1:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.icon-shezhi:before {
|
||||
content: "\e622";
|
||||
}
|
||||
|
||||
.icon-ccaozuo:before {
|
||||
content: "\e739";
|
||||
}
|
||||
|
||||
.icon-del:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-yunfei:before {
|
||||
content: "\e77c";
|
||||
}
|
||||
|
||||
.icon-bianji:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-yanjing:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon-biyanjing:before {
|
||||
content: "\e901";
|
||||
}
|
||||
|
||||
.icon-yonghu:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.icon-yonghumimaxiugai:before {
|
||||
content: "\e600";
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,310 @@
|
||||
{
|
||||
"id": "3427532",
|
||||
"name": "jy_admin",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "1680687",
|
||||
"name": "周报",
|
||||
"font_class": "zhoubao",
|
||||
"unicode": "e661",
|
||||
"unicode_decimal": 58977
|
||||
},
|
||||
{
|
||||
"icon_id": "6241656",
|
||||
"name": "发票管理",
|
||||
"font_class": "fapiaoguanli",
|
||||
"unicode": "e623",
|
||||
"unicode_decimal": 58915
|
||||
},
|
||||
{
|
||||
"icon_id": "77403",
|
||||
"name": "链接",
|
||||
"font_class": "lianjie",
|
||||
"unicode": "e60b",
|
||||
"unicode_decimal": 58891
|
||||
},
|
||||
{
|
||||
"icon_id": "521051",
|
||||
"name": "修改",
|
||||
"font_class": "xiugai",
|
||||
"unicode": "e620",
|
||||
"unicode_decimal": 58912
|
||||
},
|
||||
{
|
||||
"icon_id": "604646",
|
||||
"name": "刷新",
|
||||
"font_class": "shuaxin",
|
||||
"unicode": "e62b",
|
||||
"unicode_decimal": 58923
|
||||
},
|
||||
{
|
||||
"icon_id": "996913",
|
||||
"name": "右右",
|
||||
"font_class": "left-1",
|
||||
"unicode": "e604",
|
||||
"unicode_decimal": 58884
|
||||
},
|
||||
{
|
||||
"icon_id": "1029274",
|
||||
"name": "右右",
|
||||
"font_class": "right-1-copy",
|
||||
"unicode": "e61f",
|
||||
"unicode_decimal": 58911
|
||||
},
|
||||
{
|
||||
"icon_id": "1305407",
|
||||
"name": "下",
|
||||
"font_class": "xia",
|
||||
"unicode": "e63d",
|
||||
"unicode_decimal": 58941
|
||||
},
|
||||
{
|
||||
"icon_id": "2678614",
|
||||
"name": "警告",
|
||||
"font_class": "jinggao",
|
||||
"unicode": "e651",
|
||||
"unicode_decimal": 58961
|
||||
},
|
||||
{
|
||||
"icon_id": "2859360",
|
||||
"name": "订单",
|
||||
"font_class": "dingdan",
|
||||
"unicode": "e65c",
|
||||
"unicode_decimal": 58972
|
||||
},
|
||||
{
|
||||
"icon_id": "3751207",
|
||||
"name": "zhcc_提单",
|
||||
"font_class": "zhcc_tidan",
|
||||
"unicode": "e682",
|
||||
"unicode_decimal": 59010
|
||||
},
|
||||
{
|
||||
"icon_id": "4347578",
|
||||
"name": "icon_保存",
|
||||
"font_class": "icon_baocun",
|
||||
"unicode": "eb8e",
|
||||
"unicode_decimal": 60302
|
||||
},
|
||||
{
|
||||
"icon_id": "5961300",
|
||||
"name": "待办事项",
|
||||
"font_class": "daibanshixiang",
|
||||
"unicode": "ec4e",
|
||||
"unicode_decimal": 60494
|
||||
},
|
||||
{
|
||||
"icon_id": "5993150",
|
||||
"name": "复制",
|
||||
"font_class": "fuzhi1",
|
||||
"unicode": "ec7a",
|
||||
"unicode_decimal": 60538
|
||||
},
|
||||
{
|
||||
"icon_id": "6517451",
|
||||
"name": "文件-补充材料",
|
||||
"font_class": "wj-bccl",
|
||||
"unicode": "e70d",
|
||||
"unicode_decimal": 59149
|
||||
},
|
||||
{
|
||||
"icon_id": "6756283",
|
||||
"name": "团队",
|
||||
"font_class": "tuandui",
|
||||
"unicode": "e612",
|
||||
"unicode_decimal": 58898
|
||||
},
|
||||
{
|
||||
"icon_id": "7404571",
|
||||
"name": "上",
|
||||
"font_class": "shang",
|
||||
"unicode": "e792",
|
||||
"unicode_decimal": 59282
|
||||
},
|
||||
{
|
||||
"icon_id": "7463934",
|
||||
"name": "打印小票",
|
||||
"font_class": "dayinxiaopiao",
|
||||
"unicode": "e627",
|
||||
"unicode_decimal": 58919
|
||||
},
|
||||
{
|
||||
"icon_id": "8414561",
|
||||
"name": "纸质书",
|
||||
"font_class": "zhizhishu",
|
||||
"unicode": "e613",
|
||||
"unicode_decimal": 58899
|
||||
},
|
||||
{
|
||||
"icon_id": "9826648",
|
||||
"name": "备注",
|
||||
"font_class": "beizhu",
|
||||
"unicode": "e614",
|
||||
"unicode_decimal": 58900
|
||||
},
|
||||
{
|
||||
"icon_id": "10487453",
|
||||
"name": "船舶",
|
||||
"font_class": "chuanbo",
|
||||
"unicode": "e68b",
|
||||
"unicode_decimal": 59019
|
||||
},
|
||||
{
|
||||
"icon_id": "10828733",
|
||||
"name": "新舱单信息",
|
||||
"font_class": "shiyongwendang",
|
||||
"unicode": "ea3d",
|
||||
"unicode_decimal": 59965
|
||||
},
|
||||
{
|
||||
"icon_id": "11346894",
|
||||
"name": "头像",
|
||||
"font_class": "touxiang",
|
||||
"unicode": "e611",
|
||||
"unicode_decimal": 58897
|
||||
},
|
||||
{
|
||||
"icon_id": "12975022",
|
||||
"name": "运输",
|
||||
"font_class": "yunshu1",
|
||||
"unicode": "e637",
|
||||
"unicode_decimal": 58935
|
||||
},
|
||||
{
|
||||
"icon_id": "15391348",
|
||||
"name": "编辑",
|
||||
"font_class": "bianji1",
|
||||
"unicode": "e61c",
|
||||
"unicode_decimal": 58908
|
||||
},
|
||||
{
|
||||
"icon_id": "15556290",
|
||||
"name": "OCR",
|
||||
"font_class": "OCR",
|
||||
"unicode": "e694",
|
||||
"unicode_decimal": 59028
|
||||
},
|
||||
{
|
||||
"icon_id": "18171208",
|
||||
"name": "打印,复印",
|
||||
"font_class": "printing",
|
||||
"unicode": "ea28",
|
||||
"unicode_decimal": 59944
|
||||
},
|
||||
{
|
||||
"icon_id": "19228997",
|
||||
"name": "船返管理-船返申请",
|
||||
"font_class": "chuanfanguanli-chuanfanshenqing",
|
||||
"unicode": "e648",
|
||||
"unicode_decimal": 58952
|
||||
},
|
||||
{
|
||||
"icon_id": "28019357",
|
||||
"name": "小票、发票-01",
|
||||
"font_class": "a-xiaopiaofapiao-01",
|
||||
"unicode": "e79f",
|
||||
"unicode_decimal": 59295
|
||||
},
|
||||
{
|
||||
"icon_id": "5831331",
|
||||
"name": "拖动",
|
||||
"font_class": "tuodong",
|
||||
"unicode": "e656",
|
||||
"unicode_decimal": 58966
|
||||
},
|
||||
{
|
||||
"icon_id": "695132",
|
||||
"name": "多选",
|
||||
"font_class": "duoxuan",
|
||||
"unicode": "e630",
|
||||
"unicode_decimal": 58928
|
||||
},
|
||||
{
|
||||
"icon_id": "2246755",
|
||||
"name": "多选",
|
||||
"font_class": "duoxuan1",
|
||||
"unicode": "e696",
|
||||
"unicode_decimal": 59030
|
||||
},
|
||||
{
|
||||
"icon_id": "8631647",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi",
|
||||
"unicode": "e603",
|
||||
"unicode_decimal": 58883
|
||||
},
|
||||
{
|
||||
"icon_id": "9303783",
|
||||
"name": "关闭",
|
||||
"font_class": "guanbi1",
|
||||
"unicode": "e601",
|
||||
"unicode_decimal": 58881
|
||||
},
|
||||
{
|
||||
"icon_id": "560260",
|
||||
"name": "设置",
|
||||
"font_class": "shezhi",
|
||||
"unicode": "e622",
|
||||
"unicode_decimal": 58914
|
||||
},
|
||||
{
|
||||
"icon_id": "992474",
|
||||
"name": "C操作",
|
||||
"font_class": "ccaozuo",
|
||||
"unicode": "e739",
|
||||
"unicode_decimal": 59193
|
||||
},
|
||||
{
|
||||
"icon_id": "1368544",
|
||||
"name": "删除",
|
||||
"font_class": "del",
|
||||
"unicode": "e602",
|
||||
"unicode_decimal": 58882
|
||||
},
|
||||
{
|
||||
"icon_id": "5492015",
|
||||
"name": "运费",
|
||||
"font_class": "yunfei",
|
||||
"unicode": "e77c",
|
||||
"unicode_decimal": 59260
|
||||
},
|
||||
{
|
||||
"icon_id": "20313949",
|
||||
"name": "编辑",
|
||||
"font_class": "bianji",
|
||||
"unicode": "e61a",
|
||||
"unicode_decimal": 58906
|
||||
},
|
||||
{
|
||||
"icon_id": "479192",
|
||||
"name": "眼睛",
|
||||
"font_class": "yanjing",
|
||||
"unicode": "e62f",
|
||||
"unicode_decimal": 58927
|
||||
},
|
||||
{
|
||||
"icon_id": "4354835",
|
||||
"name": "闭眼睛",
|
||||
"font_class": "biyanjing",
|
||||
"unicode": "e901",
|
||||
"unicode_decimal": 59649
|
||||
},
|
||||
{
|
||||
"icon_id": "722471",
|
||||
"name": "用户",
|
||||
"font_class": "yonghu",
|
||||
"unicode": "e61b",
|
||||
"unicode_decimal": 58907
|
||||
},
|
||||
{
|
||||
"icon_id": "25664277",
|
||||
"name": "用户密码修改",
|
||||
"font_class": "yonghumimaxiugai",
|
||||
"unicode": "e600",
|
||||
"unicode_decimal": 58880
|
||||
}
|
||||
]
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
publicPath: '.',
|
||||
outputDir: 'dist'
|
||||
}
|
Loading…
Reference in New Issue