Commit b69dc7ab by wangyalan-git

初始化

parents
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"]
}
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
platform
platform.zip
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>vue-manage</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.aptana.ide.core.unifiedBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.aptana.projects.webnature</nature>
</natures>
<filteredResources>
<filter>
<id>1581911416903</id>
<name></name>
<type>26</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-false-node_modules</arguments>
</matcher>
</filter>
<filter>
<id>1581998398191</id>
<name></name>
<type>26</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-false-node_modules</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [2018-2019] [macrozheng]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
# mall-admin-web
<p>
<a href="https://github.com/macrozheng/mall"><img src="http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/badge/%E5%90%8E%E5%8F%B0%E9%A1%B9%E7%9B%AE-mall-blue.svg" alt="后台项目"></a>
<a href="http://qm.qq.com/cgi-bin/qm/qr?k=V6xu5c12j9qhnMUNdDRzakNxRKzOxibQ"><img src="http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/badge/QQ%E7%BE%A4-959351312-red.svg" alt="QQ群"></a>
<a href="http://qm.qq.com/cgi-bin/qm/qr?k=M5Edq2TiJL_ShcOEeYjwcmdGmq4zZrd_"><img src="http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/badge/QQ%E7%BE%A4-553018255-red.svg" alt="QQ群"></a>
<a href="https://gitee.com/macrozheng/mall-admin-web"><img src="http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/badge/%E7%A0%81%E4%BA%91-%E9%A1%B9%E7%9B%AE%E5%9C%B0%E5%9D%80-orange.svg" alt="码云"></a>
</p>
## 前言
该项目为前后端分离项目的前端部分,后端项目`mall`地址:[传送门](https://github.com/macrozheng/mall)。
## 项目介绍
`mall-admin-web`是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等功能。
### 项目演示
项目在线演示地址:[http://www.macrozheng.com/admin/](http://www.macrozheng.com/admin/)
![https://github.com/macrozheng/mall/blob/master/document/resource/mall-admin.gif](https://github.com/macrozheng/mall/blob/master/document/resource/mall-admin.gif)
### 技术选型
技术 | 说明 | 官网
----|----|----
Vue | 前端框架 | [https://vuejs.org/](https://vuejs.org/)
Vue-router | 路由框架 | [https://router.vuejs.org/](https://router.vuejs.org/)
Vuex | 全局状态管理框架 | [https://vuex.vuejs.org/](https://vuex.vuejs.org/)
Element | 前端UI框架 | [https://element.eleme.io/](https://element.eleme.io/)
Axios | 前端HTTP框架 | [https://github.com/axios/axios](https://github.com/axios/axios)
v-charts | 基于Echarts的图表框架 | [https://v-charts.js.org/](https://v-charts.js.org/)
Js-cookie | cookie管理工具 | [https://github.com/js-cookie/js-cookie](https://github.com/js-cookie/js-cookie)
nprogress | 进度条控件 | [https://github.com/rstacruz/nprogress](https://github.com/rstacruz/nprogress)
vue-element-admin | 项目脚手架参考 | [https://github.com/PanJiaChen/vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
### 项目布局
``` lua
src -- 源码目录
├── api -- axios网络请求定义
├── assets -- 静态图片资源文件
├── components -- 通用组件封装
├── icons -- svg矢量图片文件
├── router -- vue-router路由配置
├── store -- vuex的状态管理
├── styles -- 全局css样式
├── utils -- 工具类
└── views -- 前端页面
├── home -- 首页
├── layout -- 通用页面加载框架
├── login -- 登录页
├── oms -- 订单模块页面
├── pms -- 商品模块页面
└── sms -- 营销模块页面
```
## 搭建步骤
- 下载node并安装:[https://nodejs.org/dist/v8.9.4/node-v8.9.4-x64.msi](https://nodejs.org/dist/v8.9.4/node-v8.9.4-x64.msi);
- 该项目为前后端分离项目,访问本地访问接口需搭建后台环境,搭建请参考后端项目[传送门](https://github.com/macrozheng/mall);
- 访问在线接口无需搭建后台环境,只需将config/dev.env.js文件中的BASE_API改为[http://120.27.63.9:8080](http://120.27.63.9:8080)即可;
- 克隆源代码到本地,使用IDEA打开,并完成编译;
- 在IDEA命令行中运行命令:npm install,下载相关依赖;
- 在IDEA命令行中运行命令:npm run dev,运行项目;
- 访问地址:[http://localhost:8090](http://localhost:8090) 即可打开后台管理系统页面;
- 如果遇到无法运行该命令,需要配置npm的环境变量,如在path变量中添加:C:\Users\zhenghong\AppData\Roaming\npm。
## 许可证
[Apache License 2.0](https://github.com/macrozheng/mall-admin-web/blob/master/LICENSE)
Copyright (c) 2018-2019 macrozheng
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
File added
'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.ico')
})
}
}
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
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: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: resolve('src/icons'),
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
'use strict'
const 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)
}
})
})
'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
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
BASE_API: '"http://192.168.31.117:8201/mall-admin"'
})
'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: 8090, // 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, '../platform/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../platform'),
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
}
}
'use strict'
module.exports = {
NODE_ENV: '"production"',
BASE_API: '"http://115.29.198.90:8201/mall-admin"'
// BASE_API: '"http://hhg.api.jsonpro.cn:8201/mall-admin"'
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="static/favicon.ico" />
<title>万科物资管理平台</title>
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 120px;
height: 120px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
/* COLOR 1 */
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-ms-animation: spin 2s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-moz-animation: spin 2s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-o-animation: spin 2s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
animation: spin 2s linear infinite;
/* Chrome, Firefox 16+, IE 10+, Opera */
z-index: 1001;
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
/* COLOR 2 */
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-moz-animation: spin 3s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-o-animation: spin 3s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-ms-animation: spin 3s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
animation: spin 3s linear infinite;
/* Chrome, Firefox 16+, IE 10+, Opera */
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
/* COLOR 3 */
-moz-animation: spin 1.5s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-o-animation: spin 1.5s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-ms-animation: spin 1.5s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
-webkit-animation: spin 1.5s linear infinite;
/* Chrome, Opera 15+, Safari 5+ */
animation: spin 1.5s linear infinite;
/* Chrome, Firefox 16+, IE 10+, Opera */
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg);
/* IE 9 */
transform: rotate(0deg);
/* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg);
/* IE 9 */
transform: rotate(360deg);
/* Firefox 16+, IE 10+, Opera */
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg);
/* IE 9 */
transform: rotate(0deg);
/* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg);
/* IE 9 */
transform: rotate(360deg);
/* Firefox 16+, IE 10+, Opera */
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #4583F3;
/* Old browsers */
z-index: 1000;
-webkit-transform: translateX(0);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: translateX(0);
/* IE 9 */
transform: translateX(0);
/* Firefox 16+, IE 10+, Opera */
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
/* Loaded */
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: translateX(-100%);
/* IE 9 */
transform: translateX(-100%);
/* Firefox 16+, IE 10+, Opera */
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: translateX(100%);
/* IE 9 */
transform: translateX(100%);
/* Firefox 16+, IE 10+, Opera */
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
/* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: translateY(-100%);
/* IE 9 */
transform: translateY(-100%);
/* Firefox 16+, IE 10+, Opera */
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
/* JavaScript Turned Off */
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: "Open Sans";
color: #fff;
font-size: 14px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 14px;
color: #fff;
opacity: 0.5;
}
/* 滚动条优化 start */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f6f6f6;
border-radius: 2px;
}
::-webkit-scrollbar-thumb {
background: #cdcdcd;
border-radius: 2px;
}
::-webkit-scrollbar-thumb:hover {
background: #747474;
}
::-webkit-scrollbar-corner {
background: #f6f6f6;
}
/* 滚动条优化 end */
</style>
</head>
<body>
<!-- built files will be auto injected -->
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">
正在加载 万科物资管理平台 请耐心等待
</div>
</div>
</div>
</body>
<script src="https://cdn.bootcss.com/babel-polyfill/7.6.0/polyfill.js"></script>
<script src="./static/tinymce4.7.5/tinymce.min.js"></script>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "mall-admin-web",
"version": "1.0.0",
"description": "mall后台管理前端",
"author": "macro",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0.0.0.0",
"start": "npm run dev",
"build": "node build/build.js"
},
"dependencies": {
"axios": "^0.18.0",
"echarts": "^4.2.0-rc.2",
"element-china-area-data": "^4.1.2",
"element-ui": "^2.13.0",
"file-saver": "^2.0.2",
"js-cookie": "^2.2.0",
"moment": "^2.24.0",
"normalize.css": "^8.0.0",
"nprogress": "^0.2.0",
"v-charts": "^1.19.0",
"v-distpicker": "^1.0.20",
"vue": "^2.5.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1",
"xlsx": "^0.15.6"
},
"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",
"node-notifier": "^5.1.2",
"node-sass": "^4.13.0",
"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",
"sass-loader": "^7.0.1",
"script-loader": "^0.7.2",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"svg-sprite-loader": "^3.7.3",
"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"
]
}
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
</style>
import request from '@/utils/request'
// 平台管理员列表
export function fetchList(params) {
return request({
url: '/admin/manage/queryPageList',
method: 'get',
params
})
}
// 添加管理员
export function createAdmin(data) {
return request({
url: '/admin/manage/addUmsAdmin',
method: 'post',
data
})
}
// 修改管理员
export function updateAdmin(id, data) {
return request({
url: '/admin/manage/update/' + id,
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/request'
export function bannerPositionList(params) {
return request({
url: '/ad/adPositionList',
method: 'post',
params: params
})
}
export function addBannerPosition(params) {
return request({
url: '/ad/saveAdPosition',
method: 'post',
data: params
})
}
export function updateBannerPosition(params) {
return request({
url: '/ad/updateAdPosition',
method: 'post',
data: params
})
}
export function deleteBannerPosition(params) {
return request({
url: '/ad/deleteAdPosition',
method: 'post',
params: params
})
}
export function bannerList(params, data) {
return request({
url: '/ad/adList',
method: 'post',
params: params,
data: data
})
}
export function addBanner(params) {
return request({
url: '/ad/saveAd',
method: 'post',
data: params
})
}
export function updateBanner(params) {
return request({
url: '/ad/updateAd',
method: 'post',
data: params
})
}
export function deleteBanner(params) {
return request({
url: '/ad/deleteAd',
method: 'post',
params: params
})
}
export function changeStatus(params) {
return request({
url: '/ad/updateAdStatus',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 分类列表【过滤未启用的数据】
export function fetchClassifyList(params) {
return request({
url: '/api/z/productCategory/list/withChildren',
method: 'get',
params: params
})
}
// 分类列表【分页且不过滤数据】
export function getClassifyList(parentId, params) {
return request({
url: '/productCategory/list/' + parentId,
method: 'get',
params: params
})
}
// 添加分类
export function createClassify(data) {
return request({
url: '/productCategory/create',
method: 'post',
data: data
})
}
// 获取分类
export function getClassify(id) {
return request({
url: '/productCategory/' + id,
method: 'get',
})
}
// 修改分类
export function updateClassify(id, data) {
return request({
url: '/productCategory/update/' + id,
method: 'post',
data: data
})
}
// 删除分类
export function deleteClassify(id) {
return request({
url: '/productCategory/delete/' + id,
method: 'post',
})
}
// 转移分类商品
export function moveClassifyProduct(data) {
return request({
url: '/productCategory/updateMoveCategoryProduct',
method: 'post',
params: data
})
}
// 修改显示状态
export function changeShow(params) {
return request({
url: '/productCategory/update/showStatus',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/comment/listAll',
method: 'get',
params: params
})
}
export function auditComment(params) {
return request({
url: '/comment/auditComment',
method: 'post',
params: params
})
}
export function deleteComment(params) {
return request({
url: '/comment/delete',
method: 'post',
params: params
})
}
export function replyComment(params) {
return request({
url: '/comment/replyComment',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 佣金结算列表
export function commissionList (params) {
return request({
url: '/member/settlement',
method: 'get',
params
})
}
// 佣金结算明细
export function commissionDetailList (params) {
return request({
url: '/member/settlement/detail',
method: 'get',
params
})
}
// 佣金数据
export function commissionDetailData (id) {
return request({
url: '/member/settlement/detail/info/' + id,
method: 'get'
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList() {
return request({
url:'/companyAddress/list',
method:'get'
})
}
import request from '@/utils/request'
// 投诉列表
export function complaintList(params) {
return request({
url: '/complaint/getList',
method: 'get',
params
})
}
// 投诉详情
export function complaintDetail(params) {
return request({
url: '/complaint/detail',
method: 'get',
params
})
}
// 投诉审核
export function complaintAudit(params) {
return request({
url: '/complaint/complaintReview',
method: 'post',
params
})
}
// 投诉类型列表
export function complaintTypeList() {
return request({
url: '/complaint/type/list',
method: 'get'
})
}
// 添加投诉类型
export function createComplaintType(data) {
return request({
url: '/complaint/type/add',
method: 'post',
data
})
}
// 修改投诉类型
export function updateComplaintType(data) {
return request({
url: '/complaint/type/update',
method: 'post',
data
})
}
// 删除投诉类型
export function deleteComplaintType(params) {
return request({
url: '/complaint/type/delete',
method: 'get',
params
})
}
// 修改投诉类型状态
export function changeComplaintTypeStatus(params) {
return request({
url: '/complaint/type/updateByType',
method: 'get',
params
})
}
// 获取投诉配置
export function complaintConfig() {
return request({
url: '/complaint/deadline/getOne',
method: 'get'
})
}
// 修改投诉配置
export function updateComplaintConfig(data) {
return request({
url: '/complaint/deadline/update',
method: 'post',
data
})
}
import request from '@/utils/request'
// 平台优惠券列表
export function platformCouponList(params) {
return request({
url: '/coupon/list',
method: 'get',
params: params
})
}
// 供应商优惠券列表
export function supplierCouponList(params) {
return request({
url: '/coupon/mcht/list',
method: 'get',
params
})
}
// 添加优惠券
export function createCoupon(data) {
return request({
url: '/coupon/create',
method: 'post',
data: data
})
}
// 获取优惠券详情
export function couponDetail(id) {
return request({
url: '/coupon/' + id,
method: 'get',
})
}
// 修改优惠券
export function updateCoupon(data) {
return request({
url: '/coupon',
method: 'put',
data: data
})
}
// 删除优惠券
export function deleteCoupon(id) {
return request({
url: '/coupon/delete/' + id,
method: 'post',
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/couponHistory/list',
method:'get',
params:params
})
}
import request from '@/utils/request'
//获取部门列表
export function getList (params) {
return request({
url: '/sys/depart/selectList',
method: 'get',
params: params
})
}
//获取部门树状列表
export function getDepartmentList (params) {
return request({
url: '/sys/depart/list',
method: 'get',
params: params
})
}
//获取部门详情
export function getDepartmentDetail (params) {
return request({
url: '/sys/depart/detail',
method: 'get',
params: params
})
}
//新增部门
export function addDepartment (data) {
return request({
url: '/sys/depart/add',
method: 'post',
data: data
})
}
//修改部门信息
export function updateDepartment (data) {
return request({
url: '/sys/depart/update',
method: 'post',
data: data
})
}
//删除部门
export function deleteDepartment (params) {
return request({
url: '/sys/depart/delete',
method: 'get',
params: params
})
}
//转移部门
export function transferDepartment (params) {
return request({
url: '/sys/depart/transfer',
method: 'get',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 获取保存金配置
export function depositConfig() {
return request({
url: '/funds/config',
method: 'get'
})
}
// 修改保证金配置
export function updateDepositConfig(data) {
return request({
url: '/funds/config',
method: 'post',
data
})
}
// 供应商保证金管理
export function depositList(params) {
return request({
url: '/mch/account',
method: 'get',
params
})
}
// 供应商保证金明细列表
export function depositDetailList(params) {
return request({
url: '/funds/detail',
method: 'get',
params: params
})
}
// 供应商保证金扣款
export function depositRechargeback(data) {
return request({
url: '/mch/account/deduction',
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/request'
// 配送方式列表
export function fetchExpresses(params) {
return request({
url: '/expresses',
method: 'get',
params: params
})
}
// 安装/卸载配送方式
export function postExpresses(params) {
return request({
url: '/expresses',
method: 'post',
params: params,
})
}
// 查询商家所有的快递
export function allExpresses(params) {
return request({
url: '/expresses/business',
method: 'get',
params: params
})
}
// 快递鸟账号配置
export function kuaidn(data) {
return request({
url: '/expresses/kuaidn',
method: 'post',
data: data
})
}
\ No newline at end of file
import request from '@/utils/request'
// 意见反馈分类列表
export function feedbackClassifyList() {
return request({
url: '/feedback/classify/list',
method: 'get'
})
}
// 添加意见反馈分类
export function createFeedbackClassify(data) {
return request({
url: '/feedback/classify/add',
method: 'put',
data
})
}
// 修改意见反馈分类
export function updateFeedbackClassify(data) {
return request({
url: '/feedback/classify/update',
method: 'put',
data
})
}
// 删除意见反馈分类
export function deleteFeedbackClassify(params) {
return request({
url: '/feedback/classify/del',
method: 'delete',
params
})
}
// 意见反馈列表
export function feedbackList(params) {
return request({
url: '/feedback/list',
method: 'get',
params
})
}
// 处理意见反馈
export function handleFeedback(data) {
return request({
url: '/feedback/manage',
method: 'put',
data
})
}
// 意见反馈详情
export function feedbackDetail(params) {
return request({
url: '/feedback/detail',
method: 'get',
params
})
}
// 删除意见反馈
export function deleteFeedback(params) {
return request({
url: '/feedback/del',
method: 'delete',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 提现列表
export function withdrawList(params) {
return request({
url: '/finance/reviewList',
method: 'get',
params
})
}
// 提现详情
export function withdrawDetail(params) {
return request({
url: '/finance/detail',
method: 'get',
params
})
}
// 提现审核
export function withdrawAudit(params) {
return request({
url: '/finance/review',
method: 'get',
params
})
}
// 提现付款
export function withdrawPay(params) {
return request({
url: '/finance/payment',
method: 'get',
params
})
}
// 提现到款
export function withdrawArrival(params) {
return request({
url: '/finance/arrived',
method: 'get',
params
})
}
// 提现设置信息
export function withdrawSettingInfo(params) {
return request({
url: '/withdrawal/amount/select',
method: 'get',
params
})
}
// 修改提现设置信息
export function updateWithdrawSetting(data) {
return request({
url: '/withdrawal/amount/update',
method: 'post',
data
})
}
// 平台资金明细
export function platformFinanceList(params) {
return request({
url: '/platform/account/details',
method: 'get',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 秒杀列表
export function flashList(params) {
return request({
url: '/sec/kill',
method: 'get',
params
})
}
// 添加秒杀
export function createFlash(data) {
return request({
url: '/sec/kill',
method: 'post',
data
})
}
// 修改秒杀
export function updateFlash(data) {
return request({
url: '/sec/kill',
method: 'post',
data
})
}
// 秒杀详情
export function flashDetail(id) {
return request({
url: '/sec/kill/' + id,
method: 'get'
})
}
// 删除秒杀
export function deleteFlash(id) {
return request({
url: '/sec/kill/' + id,
method: 'delete'
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/flashProductRelation/list',
method:'get',
params:params
})
}
export function createFlashProductRelation(data) {
return request({
url:'/flashProductRelation/create',
method:'post',
data:data
})
}
export function deleteFlashProductRelation(id) {
return request({
url:'/flashProductRelation/delete/'+id,
method:'post'
})
}
export function updateFlashProductRelation(id,data) {
return request({
url:'/flashProductRelation/update/'+id,
method:'post',
data:data
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/flashSession/list',
method: 'get',
params: params
})
}
export function fetchSelectList(params) {
return request({
url: '/flashSession/selectList',
method: 'get',
params: params
})
}
export function updateStatus(id, params) {
return request({
url: '/flashSession/update/status/' + id,
method: 'post',
params: params
})
}
export function deleteSession(id) {
return request({
url: '/flashSession/delete/' + id,
method: 'post'
})
}
export function createSession(data) {
return request({
url: '/flashSession/create',
method: 'post',
data: data
})
}
export function updateSession(id, data) {
return request({
url: '/flashSession/update/' + id,
method: 'post',
data: data
})
}
import request from '@/utils/request'
// 楼层列表
export function fetchFloorList(params) {
return request({
url: '/storey/listAll',
method: 'post',
params: params
})
}
// 添加楼层
export function addFloor(params) {
return request({
url: '/storey/create',
method: 'post',
data: params
})
}
// 删除楼层
export function deleteFloor(params) {
return request({
url: '/storey/delete',
method: 'post',
params: params
})
}
// 修改楼层
export function updateFloor(params) {
return request({
url: '/storey/update',
method: 'post',
data: params
})
}
// 楼层类型
export function floorType() {
return request({
url: '/storey/getStoreyTyps',
method: 'post'
})
}
// 获取楼层数据
export function getFloor(params) {
return request({
url: '/storey/info',
method: 'post',
params: params
})
}
// 获取档口列表
export function stallList(params) {
return request({
url: '/stall/list',
method: 'post',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
//运费模板列表
export function freightList (params) {
return request({
url: '/freight',
method: 'get',
params: params
})
}
//添加模板
export function addTheTemplate (data) {
return request({
url: '/freight/create',
method: 'post',
data: data
})
}
//删除模板
export function deleteTheTemplate (id) {
return request({
url: '/freight/delete/' + id,
method: 'get',
})
}
//更新模板
export function updateTheTemplate (id, data) {
return request({
url: '/freight/update/' + id,
method: 'post',
data: data
})
}
//根据编号查询运费模板
export function getFreight (id) {
return request({
url: '/freight/' + id,
method: 'get',
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/home/advertise/list',
method:'get',
params:params
})
}
export function updateStatus(id,params) {
return request({
url:'/home/advertise/update/status/'+id,
method:'post',
params:params
})
}
export function deleteHomeAdvertise(data) {
return request({
url:'/home/advertise/delete',
method:'post',
data:data
})
}
export function createHomeAdvertise(data) {
return request({
url:'/home/advertise/create',
method:'post',
data:data
})
}
export function getHomeAdvertise(id) {
return request({
url:'/home/advertise/'+id,
method:'get',
})
}
export function updateHomeAdvertise(id,data) {
return request({
url:'/home/advertise/update/'+id,
method:'post',
data:data
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/home/brand/list',
method:'get',
params:params
})
}
export function updateRecommendStatus(data) {
return request({
url:'/home/brand/update/recommendStatus',
method:'post',
data:data
})
}
export function deleteHomeBrand(data) {
return request({
url:'/home/brand/delete',
method:'post',
data:data
})
}
export function createHomeBrand(data) {
return request({
url:'/home/brand/create',
method:'post',
data:data
})
}
export function updateHomeBrandSort(params) {
return request({
url:'/home/brand/update/sort/'+params.id,
method:'post',
params:params
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/home/recommendSubject/list',
method:'get',
params:params
})
}
export function updateRecommendStatus(data) {
return request({
url:'/home/recommendSubject/update/recommendStatus',
method:'post',
data:data
})
}
export function deleteHomeSubject(data) {
return request({
url:'/home/recommendSubject/delete',
method:'post',
data:data
})
}
export function createHomeSubject(data) {
return request({
url:'/home/recommendSubject/create',
method:'post',
data:data
})
}
export function updateHomeSubjectSort(params) {
return request({
url:'/home/recommendSubject/update/sort/'+params.id,
method:'post',
params:params
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/home/recommendProduct/list',
method:'get',
params:params
})
}
export function updateRecommendStatus(data) {
return request({
url:'/home/recommendProduct/update/recommendStatus',
method:'post',
data:data
})
}
export function deleteHotProduct(data) {
return request({
url:'/home/recommendProduct/delete',
method:'post',
data:data
})
}
export function createHotProduct(data) {
return request({
url:'/home/recommendProduct/create',
method:'post',
data:data
})
}
export function updateHotProductSort(params) {
return request({
url:'/home/recommendProduct/update/sort/'+params.id,
method:'post',
params:params
})
}
import request from '@/utils/request'
// 积分礼品列表
export function integralGiftList(params) {
return request({
url: '/integral/gifts',
method: 'get',
params
})
}
// 添加积分礼品
export function createIntegralGift(data) {
return request({
url: '/integral/gifts',
method: 'post',
data
})
}
// 编辑积分礼品
export function updateIntegralGift(data) {
return request({
url: '/integral/gifts',
method: 'put',
data
})
}
// 积分礼品详情
export function integralGiftDetail(id) {
return request({
url: '/integral/gifts/' + id,
method: 'get'
})
}
// 上下架礼品
export function onAndOffGift(data) {
return request({
url: '/integral/gifts/upAndDown',
method: 'put',
data
})
}
// 积分礼品兑换记录
export function giftRecordList(params) {
return request({
url: '/integral/gifts/record',
method: 'get',
params
})
}
// 礼品兑换发货
export function giftDelivery(data) {
return request({
url: '/integral/gifts/deliver',
method: 'put',
data
})
}
// 积分规则列表
export function integralRuleList() {
return request({
url: '/integral/getRules',
method: 'get'
})
}
// 添加积分规则
export function settingIntegralRule(data) {
return request({
url: '/integral/setRules',
method: 'put',
data
})
}
// 保存积分规则
export function saveIntegralRules(data) {
return request({
url: '/integral/updateRules',
method: 'put',
data
})
}
// 删除积分规则
export function deleteIntegralRule(params) {
return request({
url: '/integral/delRules',
method: 'delete',
params
})
}
// 积分消费规则
export function integralConsumeRule() {
return request({
url: '/integral/getConsumptionRule',
method: 'get'
})
}
// 设置积分消费规则
export function settingIntegralConsumeRule(data) {
return request({
url: '/integral/consumptionRule',
method: 'post',
data
})
}
\ No newline at end of file
/**
* 库存管理
*/
import request from '@/utils/request'
// 万科后台_入库查询分页
export function getInboundRecordList(params) {
return request({
url: 'vankeInboundRecord/list',
method: 'get',
params
})
}
// 万科后台_出库查询分页操作
export function getOutboundRecordList(params) {
return request({
url: 'vankeOutboundRecord/list',
method: 'get',
params
})
}
// 万科后台_库房分页操作
export function getStockRooms(params) {
return request({
url: 'vankeStockRoom/list',
method: 'get',
params
})
}
// 万科后台_库房插入操作
export function addDepartment(params) {
return request({
url: 'vankeStockRoom/insertDepartment',
method: 'post',
params
})
}
// 万科后台_根据库房id修改一条数据
export function editDepartment(params) {
return request({
url: 'vankeStockRoom/updateDepartment',
method: 'post',
params
})
}
// 万科后台_物品类别分页操作
export function getGoodsCategoryList(params) {
return request({
url: 'vankeGoodsCategory/list',
method: 'get',
params
})
}
// 万科后台_物品类别插入操作
export function addGoodsCategory(params) {
return request({
url: 'vankeGoodsCategory/insertGoodsCategory',
method: 'post',
params
})
}
// 万科后台_根据物品类别id修改一条数据
export function editGoodsCategory(params) {
return request({
url: 'vankeGoodsCategory/updateGoodsCategory',
method: 'post',
params
})
}
// 万科后台_物品分页操作
export function getGoodsList(params) {
return request({
url: 'vankeGoods/list',
method: 'get',
params
})
}
// 万科后台_物品插入操作(单条)
export function addGoods(params) {
return request({
url: 'vankeGoods/insertGoods',
method: 'post',
params
})
}
// 万科后台_插入多条物品信息
export function addGoodList(data) {
return request({
url: 'vankeGoods/insertVankeGoodsList',
method: 'post',
data
})
}
// 万科后台_部门分页操作
export function getDepartmentList(params) {
return request({
url: 'vankeDepartment/list',
method: 'get',
params
})
}
// 万科后台_部门插入操作
export function addDepart(params) {
return request({
url: 'vankeDepartment/insertDepartment',
method: 'post',
params
})
}
// 万科后台_根据部门id修改一条数据
export function editDepart(params) {
return request({
url: 'vankeDepartment/updateDepartment',
method: 'post',
params
})
}
import request from '@/utils/request'
// 配送方式列表
export function fetchExpresses (params) {
return request({
url: '/expresses',
method: 'get',
params: {mchtId:params}
})
}
// 安装/卸载配送方式
export function postExpresses (params) {
return request({
url: '/expresses',
method: 'post',
params:params,
})
}
// 查询商家所有的快递
export function allExpresses (params) {
return request({
url: '/expresses/business',
method: 'get',
params: params
})
}
// 快递鸟账号配置
export function kuaidn (data) {
return request({
url: '/expresses/kuaidn',
method: 'post',
data: data
})
}
\ No newline at end of file
import request from '@/utils/request'
// 生成验证码,返回的是 base64
export function getCaptchaImage() {
return request({
url: '/validateCode/getCaptchaBase64',
method: 'get',
})
}
export function login(username, password,authCode) {
return request({
url: '/admin/login',
method: 'post',
data: {
username,
password,
authCode
}
})
}
export function getInfo() {
return request({
url: '/admin/info',
method: 'get',
})
}
export function logout() {
return request({
url: '/admin/logout',
method: 'post'
})
}
export function fetchList(params) {
return request({
url: '/admin/list',
method: 'get',
params: params
})
}
export function createAdmin(data) {
return request({
url: '/admin/register',
method: 'post',
data: data
})
}
export function updateAdmin(id, data) {
return request({
url: '/admin/update/' + id,
method: 'post',
data: data
})
}
export function updateStatus(id, params) {
return request({
url: '/admin/updateStatus/' + id,
method: 'post',
params: params
})
}
export function deleteAdmin(id) {
return request({
url: '/admin/delete/' + id,
method: 'post'
})
}
export function getRoleByAdmin(id) {
return request({
url: '/admin/role/' + id,
method: 'get'
})
}
export function allocRole(data) {
return request({
url: '/admin/role/update',
method: 'post',
data: data
})
}
// 下面部分为自主添加
export function register(data) {
return request({
url: '/admin/register',
method: 'post',
data: data
})
}
export function fetchSupplierList(data) {
return request({
url: '/admin/list',
method: 'get',
params: data
})
}
export function updateUser(userId, data) {
return request({
url: '/admin/update/' + userId,
method: 'post',
data
})
}
export function updatePassword(data) {
return request({
url: '/admin/updatePwd',
method: 'post',
data
})
}
export function updateBindPhone(data) {
return request({
url: '/admin/updateBindPhone',
method: 'post',
data
})
}
//用户日志列表
export function logRequest(params) {
return request({
url: '/admin/login/list',
method: 'get',
params: params
})
}
import request from '@/utils/request'
// 自定义栏目列表
export function marketMenuList(params) {
return request({
url: '/custom/column/list',
method: 'get',
params
})
}
// 添加自定义栏目
export function createMarketMenu(data) {
return request({
url: '/custom/column/add',
method: 'put',
data
})
}
// 编辑自定义栏目
export function updateMarketMenu(data) {
return request({
url: '/custom/column/update',
method: 'put',
data
})
}
\ No newline at end of file
import request from '@/utils/request'
// 获取会员等级列表
export function memberLevelList(params) {
return request({
url: '/memberLevels',
method: 'get',
params: params
})
}
// 添加修改会员等级
export function editMemberLevel(data) {
return request({
url: '/memberLevels',
method: 'post',
data
})
}
// 删除会员等级
export function deleteMemberLevel(id) {
return request({
url: '/memberLevels/' + id,
method: 'delete'
})
}
// 会员升级汇总
export function memberUpgradeList(params) {
return request({
url: '/memberLevels/upgrade/record',
method: 'get',
params
})
}
// 会员等级即将到期汇总
export function memberLevelExpireList(params) {
return request({
url: '/memberLevels/due/record',
method: 'get',
params
})
}
// 会员列表
export function memberList(params) {
return request({
url: '/member/memberList',
method: 'get',
params: params
})
}
// 获取会员详情
export function memberDetail(params) {
return request({
url: '/member/selectById',
method: 'get',
params
})
}
// 会员列表-禁用 启用
export function setAccount(params) {
return request({
url: '/member/setAccount',
method: 'put',
params: params
})
}
// 会员列表-手动充值
export function memberRecharge(data) {
return request({
url: '/member/account/manual/recharge',
method: 'post',
data: data
})
}
// 会员充值汇总列表
export function memberRechargeList(params) {
return request({
url: '/member/account/amount/history/summary',
method: 'get',
params
})
}
// 会员账户资金列表
export function memberAccountFundsList(params) {
return request({
url: '/member/account/amount',
method: 'get',
params
})
}
// 会员账户资金明细
export function memberAccountFundsDetail(params) {
return request({
url: '/member/account',
method: 'get',
params
})
}
// 实名认证列表
export function certificationList(params) {
return request({
url: '/member/list',
method: 'get',
params
})
}
// 实名审核
export function certificationAudit(data) {
return request({
url: '/member/submit',
method: 'post',
data
})
}
// 更换手机列表
export function changePhoneList(params) {
return request({
url: '/member/phone/list',
method: 'get',
params
})
}
// 更换手机审核
export function changePhoneAudit(params) {
return request({
url: '/member/phone/review',
method: 'get',
params
})
}
// 会员标签列表
export function memberLabelList(params) {
return request({
url: '/member/tags',
method: 'get',
params
})
}
// 新增会员标签
export function createMemberLabel(data) {
return request({
url: '/member/tags',
method: 'post',
data
})
}
// 修改会员标签
export function updateMemberLabel(data) {
return request({
url: '/member/tags',
method: 'put',
data
})
}
// 删除会员标签
export function deleteMemberLabel(id) {
return request({
url: '/member/tags/' + id,
method: 'delete'
})
}
// 获取指定会员标签数据
export function memberLabelData(memberId) {
return request({
url: '/member/member/tags/' + memberId,
method: 'get'
})
}
// 修改指定会员标签
export function updateMemberLabelData(data) {
return request({
url: '/member/member/tags',
method: 'put',
data
})
}
// 会员积分列表
export function memberIntegralList(params) {
return request({
url: '/integral/list',
method: 'get',
params
})
}
// 会员积分记录
export function memberIntegralRecord(params) {
return request({
url: '/integral/record',
method: 'get',
params
})
}
// 会员分销层级列表
export function memberRetailList(params) {
return request({
url: '/hierarchy/list',
method: 'get',
params
})
}
// 会员分销下级列表
export function memberRetailChildrenList(params) {
return request({
url: '/hierarchy/lowers',
method: 'get',
params
})
}
// 会员业绩
export function memberAchievementList(params) {
return request({
url: '/member/settlement/achievementList',
method: 'get',
params
})
}
import request from '@/utils/request'
export function fetchList(parentId, params) {
return request({
url: '/menu/list/' + parentId,
method: 'get',
params: params
})
}
export function deleteMenu(id) {
return request({
url: '/menu/delete/' + id,
method: 'post'
})
}
export function createMenu(data) {
return request({
url: '/menu/create',
method: 'post',
data: data
})
}
export function updateMenu(id, data) {
return request({
url: '/menu/update/' + id,
method: 'post',
data: data
})
}
export function getMenu(id) {
return request({
url: '/menu/' + id,
method: 'get',
})
}
export function updateHidden(id, params) {
return request({
url: '/menu/updateHidden/' + id,
method: 'post',
params: params
})
}
export function fetchTreeList(params) {
return request({
url: '/menu/treeList',
method: 'get',
params
})
}
import request from '@/utils/request'
// 根据分类id 获取类型属性以及规格
export function getAttributeParams(params) {
return request({
url: 'productAttribute/type/getAttributeType',
method: 'get',
params
})
}
// 获取所有商品分类 (默认不传分页参数则不分页查询)
export function getAttributeCategoryList(params) {
return request({
url: 'productAttribute/category/getAttributeCategoryList',
method: 'get',
params: params
})
}
// 获取子标签列表
export function getLabelList(data) {
return request({
url: '/label/getLabelList',
method: 'post',
params: data
})
}
// 获取商品标签列表
export function getProductLableList(data) {
return request({
url: '/label/getProductLableList',
method: 'post',
params: data
})
}
// 删除
export function fetchList(params) {
return request({
url: '/home/newProduct/list',
method: 'get',
params: params
})
}
export function updateRecommendStatus(data) {
return request({
url: '/home/newProduct/update/recommendStatus',
method: 'post',
data: data
})
}
export function deleteNewProduct(data) {
return request({
url: '/home/newProduct/delete',
method: 'post',
data: data
})
}
export function createNewProduct(data) {
return request({
url: '/home/newProduct/create',
method: 'post',
data: data
})
}
export function updateNewProductSort(params) {
return request({
url: '/home/newProduct/update/sort/' + params.id,
method: 'post',
params: params
})
}
export function saveManualAttribute(params) {
return request({
url: '/productAttribute/saveManualAttribute',
method: 'post',
data: params
})
}
import request from '@/utils/request'
// 查询订单
export function fetchList(params) {
return request({
url: '/order/list',
method: 'get',
params: params
})
}
export function closeOrder(params) {
return request({
url: '/order/update/close',
method: 'post',
params: params
})
}
export function deleteOrder(params) {
return request({
url: '/order/delete',
method: 'post',
params: params
})
}
export function deliveryOrder(data) {
return request({
url: '/order/update/delivery',
method: 'post',
data: data
});
}
export function getOrderDetail(id) {
return request({
url: '/order/' + id,
method: 'get'
});
}
export function updateReceiverInfo(data) {
return request({
url: '/order/update/receiverInfo',
method: 'post',
data: data
});
}
export function updateMoneyInfo(data) {
return request({
url: '/order/update/moneyInfo',
method: 'post',
data: data
});
}
export function updateOrderNote(params) {
return request({
url: '/order/update/note',
method: 'post',
params: params
})
}
// 确认订单
export function confirmOrder(id) {
return request({
url: '/order/confirm/' + id,
method: 'post'
})
}
// 放弃订单
export function giveUpOrder(params) {
return request({
url: '/order/update/close',
method: 'post',
params: params
})
}
// 生成发货单
export function createInvoice(id) {
return request({
url: '/order/invoice/' + id,
method: 'post'
})
}
// 发货订单
export function invoiceList(params) {
return request({
url: '/order/invoice/list',
method: 'get',
params: params
})
}
// 退货订单
export function refundList(params) {
return request({
url: '/returnApply/list',
method: 'get',
params: params
})
}
// 取消发货
export function cancelDelivery(params) {
return request({
url: '/order/cancel/delivery',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
export function getOrderSetting(id) {
return request({
url:'/orderSetting/'+id,
method:'get',
})
}
export function updateOrderSetting(id,data) {
return request({
url:'/orderSetting/update/'+id,
method:'post',
data:data
})
}
import request from '@/utils/request'
export function policy() {
return request({
url:'/aliyun/oss/policy',
method:'get',
})
}
import request from '@/utils/request'
// 自有分类列表
export function fetchOwnClassifyList(params) {
return request({
url: '/mchtCagegory/list',
method: 'post',
params: params
})
}
// 添加自有分类
export function createOwnClassify(data) {
return request({
url: '/mchtCagegory/create',
method: 'post',
data: data
})
}
// 获取自有分类
export function getOwnClassify(data) {
return request({
url: '/mchtCagegory/updateInfo',
method: 'post',
params: data
})
}
// 修改自有分类
export function updateOwnClassify(data) {
return request({
url: '/mchtCagegory/update',
method: 'post',
data: data
})
}
// 删除自有分类
export function deleteOwnClassify(data) {
return request({
url: '/mchtCagegory/delete',
method: 'post',
data: data
})
}
// 转移商品
export function moveGoods(params) {
return request({
url: '/mchtCagegory/updateMoveMchtPoruct',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList() {
return request({
url:'/prefrenceArea/listAll',
method:'get',
})
}
import request from '@/utils/request'
// 查询商品
export function getProductAllList(params) {
return request({
url: '/product/getPageList',
method: 'post',
params: params
})
}
// 根据商品名称或货号模糊查询
export function getProductList(params) {
return request({
url: '/product/simpleList',
method: 'get',
params: params
})
}
// 批量修改删除状态
export function deleteProduct(data) {
return request({
url: '/product/batchOperationByDelete',
method: 'post',
data: data
})
}
// 批量上下架 上架状态:0->下架;1->上架
export function updatePublishStatus(data) {
return request({
url: 'product/batchOperationByPublishStatus',
method: 'post',
data: data
})
}
// 复制商品
export function getCopyProduct(data) {
return request({
url: '/product/saveCopyProduct?productId=' + data.productId,
method: 'post',
data: data
})
}
// 批量移动商品到新分类
export function updateProductCategory(data) {
return request({
url: '/product/updateMoveProduct?productIds=' + data.productIds + '&categoryIdI=' + data.categoryIdI + '&categoryIdIi=' + data.categoryIdIi + '&categoryIdIii=' + data.categoryIdIii,
method: 'post',
data: data
})
}
// 批量修改审核状态
export function updateVerifyStatus(data) {
return request({
url: '/product/update/verifyStatus?ids=' + data.ids + '&verifyStatus=' + data.verifyStatus + '&detail=' + data.detail,
method: 'post',
data: data
})
}
// 获取商家所有子标签
export function getProductSubLableList(data) {
return request({
url: '/label/getProductSubLableList?mchtId=' + data.mchtId + '&pageNum=' + data.pageNum + '&pageSize=' + data.pageSize,
method: 'post',
data: data
})
}
// 批量修改商品标签
export function updateProductLabel(data) {
return request({
url: '/product/updateProductLabel',
method: 'post',
data: data
})
}
// 删除
export function fetchList(params) {
return request({
url: '/product/list',
method: 'get',
params: params
})
}
export function fetchSimpleList(params) {
return request({
url: '/product/simpleList',
method: 'get',
params: params
})
}
export function updateDeleteStatus(params) {
return request({
url: '/product/update/deleteStatus',
method: 'post',
params: params
})
}
export function updateNewStatus(params) {
return request({
url: '/product/update/newStatus',
method: 'post',
params: params
})
}
export function updateRecommendStatus(params) {
return request({
url: '/product/update/recommendStatus',
method: 'post',
params: params
})
}
// 创建商品
export function createProduct(data) {
return request({
url: '/product/addProduct',
method: 'post',
data: data
})
}
export function updateProduct(data) {
return request({
url: 'product/update',
method: 'post',
data: data
})
}
export function getProduct(params) {
return request({
url: 'product/getProductInfo',
method: 'get',
params
})
}
// 获取商品的关联商品
export function productRecommendList(params) {
return request({
url: '/recommend/productRecommendList',
method: 'post',
params: params
})
}
import request from '@/utils/request'
// 获取全部相册列表
export function getAlbumList (params) {
return request({
url: '/Album/listAll',
method: 'get',
params: params
})
}
// 创建相册
export function createAlbum (data) {
return request({
url: '/Album/create',
method: 'post',
data: data
})
}
// 更新相册
export function updateAlbum (id, data) {
return request({
url: '/Album/update/' + id,
method: 'post',
data: data
})
}
// 删除相册
export function deleteAlbum (data) {
return request({
url: '/Album/delete',
method: 'post',
params: data
})
}
// 获取相册图片列表
export function getAlbumPicAll (params) {
return request({
url: '/Album/listPicAll',
method: 'get',
params: params
})
}
// 添加相册图片
export function createAlbumPic (data) {
return request({
url: '/Album/createAlbumPic',
method: 'post',
data: data
})
}
// 删除图片
export function deleteAlbumPic (data) {
return request({
url: '/Album/deleteAlbumPic',
method: 'get',
params: data
})
}
// 转移相册
export function changePicAlbum (data) {
return request({
url: '/Album/updateMoveAlbum',
method: 'post',
params: data
})
}
import request from '@/utils/request'
export function fetchList(cid, params) {
return request({
url: '/productAttribute/list/' + cid,
method: 'get',
params: params
})
}
export function deleteProductAttr(data) {
return request({
url: '/productAttribute/delete',
method: 'post',
data: data
})
}
export function createProductAttr(data) {
return request({
url: '/productAttribute/create',
method: 'post',
data: data
})
}
export function updateProductAttr(id, data) {
return request({
url: '/productAttribute/update/' + id,
method: 'post',
data: data
})
}
export function getProductAttr(id) {
return request({
url: '/productAttribute/' + id,
method: 'get'
})
}
export function getProductAttrInfo(productCategoryId) {
return request({
url: '/productAttribute/attrInfo/' + productCategoryId,
method: 'get'
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/productAttribute/category/list',
method:'get',
params:params
})
}
export function createProductAttrCate(data) {
return request({
url:'/productAttribute/category/create',
method:'post',
data:data
})
}
export function deleteProductAttrCate(id) {
return request({
url:'/productAttribute/category/delete/'+id,
method:'get'
})
}
export function updateProductAttrCate(id,data) {
return request({
url:'/productAttribute/category/update/'+id,
method:'post',
data:data
})
}
export function fetchListWithAttr() {
return request({
url:'/productAttribute/category/list/withAttr',
method:'get'
})
}
import request from '@/utils/request'
// 查询历史分类
export function getListCategoryHistory(params) {
return request({
url: '/productCategory/listCategoryHistory',
method: 'get',
params
})
}
// 查询所有一级分类及子分类
export function getProductCategory(params) {
return request({
url: '/api/z/productCategory/list/withChildren',
method: 'get',
params
})
}
// 分页分类及子分类
export function fetchList(params) {
return request({
url: '/productCategory/list',
method: 'get',
params
})
}
// 可删除
export function deleteProductCate(id) {
return request({
url: '/productCategory/delete/' + id,
method: 'post'
})
}
export function createProductCate(data) {
return request({
url: '/productCategory/create',
method: 'post',
data: data
})
}
export function updateProductCate(id, data) {
return request({
url: '/productCategory/update/' + id,
method: 'post',
data: data
})
}
export function getProductCate(id) {
return request({
url: '/productCategory/' + id,
method: 'get',
})
}
export function updateShowStatus(data) {
return request({
url: '/productCategory/update/showStatus',
method: 'post',
data: data
})
}
export function updateNavStatus(data) {
return request({
url: '/productCategory/update/navStatus',
method: 'post',
data: data
})
}
export function getMchtCategory(params) {
return request({
url: '/productCategory/getMchtBusiiCategoryList',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 满减列表
export function reductionList(params) {
return request({
url: '/full/reductions',
method: 'get',
params
})
}
// 添加满减
export function createReduction(data) {
return request({
url: '/full/reductions',
method: 'post',
data
})
}
// 修改满减
export function updateReduction(data) {
return request({
url: '/full/reductions',
method: 'put',
data
})
}
// 满减详情
export function reductionDetail(id) {
return request({
url: '/full/reductions/' + id,
method: 'get'
})
}
// 删除满减
export function deleteReduction(id) {
return request({
url: '/full/reductions/' + id,
method: 'delete'
})
}
\ No newline at end of file
import request from '@/utils/request'
// 万科后台_根据物品id 以及时间list 查询这个时间段内每天的领用情况
export function getRecipientList(data) {
return request({
url: 'vankeStatisticalChart/selectGoodsCollection',
method: 'post',
data
})
}
// 万科后台_根据物品id 以及时间list 查询这个时间段内每天的库存信息
export function getInventoryList(data) {
return request({
url: 'vankeStatisticalChart/OutVankeGoodsStockChange',
method: 'post',
data
})
}
import request from '@/utils/request'
//获取处罚设置
export function getOne (params) {
return request({
url: '/report/punishment/getOne',
method: 'get',
params
})
}
// 修改举报处罚设置
export function updatePunishment (data) {
return request({
url: '/report/punishment/update',
method: 'post',
data
})
}
\ No newline at end of file
import request from '@/utils/request'
//获取举报类型
export function fetchrePortTypeList (params) {
return request({
url: '/report/type/getList',
method: 'get',
params: params
})
}
//举报主题列表
export function fetchreThemeList (params) {
return request({
url: '/report/theme/getList',
method: 'get',
params: params
})
}
// 举报主题详情
export function themeDetail (params) {
return request({
url: '/report/theme/detail',
method: 'get',
params: params
})
}
// 添加举报主题
export function addTheme (data) {
return request({
url: '/report/theme/add',
method: 'post',
data: data
})
}
// 删除举报主题
export function deleteTheme (data) {
return request({
url: '/report/theme/delete',
method: 'get',
params: data
})
}
// 修改举报主题
export function updateTheme (data) {
return request({
url: '/report/theme/update',
method: 'post',
data: data
})
}
\ No newline at end of file
import request from '@/utils/request'
//举报列表
export function fetchrePortTypeList (params) {
return request({
url: '/report/type/getList',
method: 'get',
params: params
})
}
// 举报类型详情查询
export function typeDetail (params) {
return request({
url: '/report/type/detail',
method: 'get',
params: params
})
}
// 添加举报类型
export function addType (data) {
return request({
url: '/report/type/add',
method: 'post',
data: data
})
}
// 删除举报类型
export function deleteType (data) {
return request({
url: '/report/type/delete',
method: 'get',
params: data
})
}
// 修改举报类型
export function updateType (data) {
return request({
url: '/report/type/update',
method: 'post',
data: data
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/resource/list',
method: 'get',
params: params
})
}
export function createResource(data) {
return request({
url: '/resource/create',
method: 'post',
data: data
})
}
export function updateResource(id, data) {
return request({
url: '/resource/update/' + id,
method: 'post',
data: data
})
}
export function deleteResource(id) {
return request({
url: '/resource/delete/' + id,
method: 'post'
})
}
export function fetchAllResourceList() {
return request({
url: '/resource/listAll',
method: 'get'
})
}
import request from '@/utils/request'
export function listAllCate(data) {
return request({
url: '/resourceCategory/listAll',
method: 'get',
params: data
})
}
export function createResourceCategory(data) {
return request({
url: '/resourceCategory/create',
method: 'post',
data: data
})
}
export function updateResourceCategory(id, data) {
return request({
url: '/resourceCategory/update/' + id,
method: 'post',
data: data
})
}
export function deleteResourceCategory(id) {
return request({
url: '/resourceCategory/delete/' + id,
method: 'post'
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url:'/returnApply/list',
method:'get',
params:params
})
}
export function deleteApply(params) {
return request({
url:'/returnApply/delete',
method:'post',
params:params
})
}
export function updateApplyStatus(id,data) {
return request({
url:'/returnApply/update/status/'+id,
method:'post',
data:data
})
}
export function getApplyDetail(id) {
return request({
url:'/returnApply/'+id,
method:'get'
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/returnReason/list',
method: 'get',
params: params
})
}
export function deleteReason(params) {
return request({
url: '/returnReason/delete',
method: 'post',
params: params
})
}
export function updateStatus(params) {
return request({
url: '/returnReason/update/status',
method: 'post',
params: params
})
}
export function addReason(data) {
return request({
url: '/returnReason/create',
method: 'post',
data: data
})
}
export function getReasonDetail(id) {
return request({
url: '/returnReason/' + id,
method: 'get'
})
}
export function updateReason(id, data) {
return request({
url: '/returnReason/update/' + id,
method: 'post',
data: data
})
}
import request from '@/utils/request'
export function fetchList(params) {
return request({
url: '/role/list',
method: 'get',
params: params
})
}
export function createRole(data) {
return request({
url: '/role/create',
method: 'post',
data: data
})
}
export function updateRole(id, data) {
return request({
url: '/role/update/' + id,
method: 'post',
data: data
})
}
export function updateStatus(id, params) {
return request({
url: '/role/updateStatus/' + id,
method: 'post',
params: params
})
}
export function deleteRole(data) {
return request({
url:'/role/delete',
method:'post',
data:data
})
}
export function fetchAllRoleList() {
return request({
url: '/role/listAll',
method: 'get'
})
}
export function listMenuByRole(roleId) {
return request({
url: '/role/listMenu/'+roleId,
method: 'get'
})
}
export function listResourceByRole(roleId) {
return request({
url: '/role/listResource/'+roleId,
method: 'get'
})
}
export function allocMenu(data) {
return request({
url: '/role/allocMenu',
method: 'post',
data:data
})
}
export function allocResource(data) {
return request({
url: '/role/allocResource',
method: 'post',
data:data
})
}
import request from '@/utils/request'
// 服务商入驻设置
export function serviceSettledSetting() {
return request({
url: '/paramset/list',
method: 'get'
})
}
// 入驻必填设置
export function serviceSettledMust(params) {
return request({
url: '/paramset/must',
method: 'put',
params
})
}
// 入驻启用设置
export function serviceSettledStatus(params) {
return request({
url: '/paramset/start',
method: 'put',
params
})
}
// 服务商类目
export function serviceClassifyList(params) {
return request({
url: '/serviceCategory/list',
method: 'get',
params
})
}
// 添加服务商类目
export function createServiceClassify(data) {
return request({
url: '/serviceCategory/add',
method: 'put',
data
})
}
// 修改服务商类目
export function updateServiceClassify(data) {
return request({
url: '/serviceCategory/update',
method: 'put',
data
})
}
// 删除服务商类目
export function deleteServiceClassify(params) {
return request({
url: '/serviceCategory/del',
method: 'delete',
params
})
}
// 服务商分类服务转移
export function moveClassifyService(params) {
return request({
url: '/serviceCategory/transfer',
method: 'put',
params
})
}
// 服务商账号列表
export function serviceAccountList(params) {
return request({
url: '/servicemcht/auditlist',
method: 'get',
params
})
}
// 服务商账号受理
export function serviceAccountCase(data) {
return request({
url: '/servicemcht/accept',
method: 'put',
data
})
}
// 服务商账号审核
export function serviceAccountAudit(data) {
return request({
url: '/servicemcht/audit',
method: 'put',
data
})
}
// 服务商账号详情
export function serviceAccountInfo(params) {
return request({
url: '/servicemcht/auditDetail',
method: 'get',
params
})
}
// 修改服务商账号信息
export function updateServiceAccount(data) {
return request({
url: '/servicemcht/updateAudit',
method: 'put',
data
})
}
// 服务商店铺列表
export function serviceShopList(params) {
return request({
url: '/servicemcht/shopInfoList',
method: 'get',
params
})
}
// 服务商店铺审核
export function serviceShopAudit(data) {
return request({
url: '/servicemcht/auditShop',
method: 'put',
data
})
}
// 服务商店铺详情
export function serviceShopDetail(params) {
return request({
url: '/servicemcht/shopDetail',
method: 'get',
params
})
}
// 修改服务商店铺信息
export function updateServiceShop(data) {
return request({
url: '/servicemcht/updateShop',
method: 'put',
data
})
}
// 服务列表
export function serviceList(params) {
return request({
url: '/smcht/list',
method: 'get',
params
})
}
// 服务审核
export function serviceAudit(params) {
return request({
url: '/smcht/audit',
method: 'put',
params
})
}
// 服务详情
export function serviceDetail(params) {
return request({
url: '/smcht/detail',
method: 'get',
params
})
}
// 服务上架
export function serviceOn(params) {
return request({
url: '/smcht/put',
method: 'put',
params
})
}
// 服务下架
export function serviceOff(params) {
return request({
url: '/smcht/down',
method: 'put',
params
})
}
// 修改服务
export function updateService(data) {
return request({
url: '/smcht/update',
method: 'put',
data
})
}
\ No newline at end of file
import request from '@/utils/request'
// 万科后台_得到一条系统配置信息
export function getSetting(params) {
return request({
url: 'vankeConfig/getOne',
method: 'get',
params
})
}
// 万科后台_修改配置信息
export function editSetting(data) {
return request({
url: 'vankeConfig/insertAndUpdateConfig',
method: 'post',
data
})
}
import request from '@/utils/request'
// 供应商结算数据列表
export function settleList (params) {
return request({
url: '/settlement',
method: 'get',
params
})
}
// 结算数据明细
export function settleDetailList (params) {
return request({
url: '/settlement/detail',
method: 'get',
params
})
}
// 结算数据统计
export function settleData (id) {
return request({
url: '/settlement/detail/info/' + id,
method: 'get'
})
}
\ No newline at end of file
import request from '@/utils/request'
// 店铺等级列表
export function shopLevelList() {
return request({
url: '/shop/level/list',
method: 'get'
})
}
// 添加店铺等级
export function createShopLevel(data) {
return request({
url: '/shop/level/add',
method: 'put',
data
})
}
// 获取店铺等级信息
export function shopLevelDetail(params) {
return request({
url: '/shop/level/detail',
method: 'get',
params
})
}
// 修改店铺等级信息
export function updateShopLevel(data) {
return request({
url: '/shop/level/update',
method: 'put',
data
})
}
// 删除店铺等级
export function deleteShopLevel(params) {
return request({
url: '/shop/level/del',
method: 'delete',
params
})
}
// 设置默认店铺等级
export function settingDefaultShopLevel(params) {
return request({
url: '/shop/level/default',
method: 'put',
params
})
}
// 启用禁用店铺等级
export function settingStatusShopLevel(params) {
return request({
url: '/shop/level/start',
method: 'put',
params
})
}
// 店铺评分列表
export function shopScoreList(params) {
return request({
url: '/mcht/comment/list',
method: 'get',
params
})
}
// 店铺评论明细
export function shopScoreRecord(params) {
return request({
url: '/mcht/comment/detail',
method: 'get',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 商铺分类列表
export function shopClassifyList(params) {
return request({
url: '/mchtPlat/list',
method: 'post',
params
})
}
// 创建商铺分类
export function createShopClassify(params) {
return request({
url: '/mchtPlat/create',
method: 'post',
data: params
})
}
// 删除商铺分类
export function deleteShopClassify(params) {
return request({
url: '/mchtPlat/delete',
method: 'post',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
//获取档口列表
export function getStallList(params) {
return request({
url: '/stall/list',
method: 'post',
params: params
})
}
//添加档口位置数据
export function createStall(data) {
return request({
url: '/stall/save',
method: 'post',
data: data
})
}
//修改档口位置数据
export function updateStall(data) {
return request({
url: '/stall/update',
method: 'post',
data: data
})
}
//删除档口位置数据
export function deleteStall(data) {
return request({
url: '/stall/delete',
method: 'post',
params: data
})
}
//根据编号查询档口
export function stallInfo(data) {
return request({
url: '/stall/stallInfo',
method: 'post',
data: data
})
}
//档口分区名称获取
export function getStallAreaList(params) {
return request({
url: '/stall/getStallAreaList',
method: 'post',
params: params
})
}
\ No newline at end of file
import request from '@/utils/request'
export function fetchList(pid,params) {
return request({
url:'/sku/'+pid,
method:'get',
params:params
})
}
export function update(pid,data) {
return request({
url:'/sku/update/'+pid,
method:'post',
data:data
})
}
/**
* 短信发送
*/
import request from '@/utils/request'
export function sendSms(phone) {
return request({
url:'/sms/sendSms',
method:'post',
params:{phone:phone}
})
}
\ No newline at end of file
/**
* 档口位置管理
*/
import request from '@/utils/request'
export function getProvinceStallList(provinceId) {
var obj = null;
if (provinceId) {
obj = {provinceId:provinceId};
}
return request({
url:'/stall/getProvinceStallList',
method:'post',
params:obj
})
}
export function getStallAreaList(stallId) {
return request({
url:'/stall/getStallAreaList',
method:'post',
params:{stallId:stallId}
})
}
import request from '@/utils/request'
export function fetchListAll() {
return request({
url:'/subject/listAll',
method:'get',
})
}
export function fetchList(params) {
return request({
url:'/subject/list',
method:'get',
params:params
})
}
/**
* 供应商资料
*/
import request from '@/utils/request'
// 万科后台_供应商分页操作
export function getSuppliersList(params) {
return request({
url: 'vankeSupplier/list',
method: 'get',
params
})
}
// 万科后台_供应商插入操作
export function addSupplier(params) {
return request({
url: 'vankeSupplier/insertSupplier',
method: 'post',
params
})
}
// 万科后台_根据供应商id修改一条数据
export function editSupplier(params) {
return request({
url: 'vankeSupplier/updateSupplier',
method: 'post',
params
})
}
// 万科后台_根据供应商id查询一条数据
export function getSupplierDetail(params) {
return request({
url: 'vankeSupplier/selectById',
method: 'get',
params
})
}
import request from '@/utils/request'
export function fetchList (params) {
return request({
url: '/label/list',
method: 'get',
params: params
})
}
export function createTagGroup (data) {
return request({
url: '/label/create',
method: 'post',
data: data
})
}
export function getTagGroup (id) {
return request({
url: '/label/updateInfo/' + id,
method: 'get',
})
}
export function updateTagGroup (id, data) {
return request({
url: '/label/update/' + id,
method: 'post',
data: data
})
}
export function deleteTagGroup (ids, status) {
return request({
url: '/label/update/deleteStatus?ids=' + ids + '&deleteStatus=' + status,
method: 'post',
})
}
export function fetchSupplierTagGroupList (data) {
return request({
url: '/label/getMchtLabelList',
method: 'get',
params: data
})
}
import request from '@/utils/request'
// 活动培训列表
export function trainList(params) {
return request({
url: '/activity/queryPageList',
method: 'get',
params
})
}
// 添加活动培训
export function createTrain(data) {
return request({
url: '/activity/add',
method: 'post',
data
})
}
// 活动培训详情
export function trainDetail(params) {
return request({
url: '/activity/details',
method: 'get',
params
})
}
// 修改活动培训
export function updateTrain(data) {
return request({
url: '/activity/update',
method: 'post',
data
})
}
// 删除活动培训
export function deleteTrain(params) {
return request({
url: '/activity/delete',
method: 'get',
params
})
}
// 活动培训报名情况
export function trainEnrollList(params) {
return request({
url: '/activity/viewHappening',
method: 'get',
params
})
}
// 确认培训报名情况
export function confirmTrainEnroll(data) {
return request({
url: '/activity/confirmStatus',
method: 'post',
data
})
}
\ No newline at end of file
/**
* 用户管理
*/
import request from '@/utils/request'
// 管理员列表查询
export function getAdminList(params) {
return request({
url: 'manage/queryPageList',
method: 'get',
params
})
}
// 万科后台_用户分页操作
export function getMemberList(params) {
return request({
url: 'umsMember/list',
method: 'get',
params
})
}
// 万科后台_设置为普通管理员
export function setUpAdmin(data) {
return request({
url: 'umsMember/setUpAdmin',
method: 'post',
data
})
}
// 万科后台_解除普通管理员
export function cancleAdmin(data) {
return request({
url: 'umsMember/cancleAdmin',
method: 'post',
data
})
}
<template>
<el-breadcrumb class="app-breadcrumb"
separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item,index) in levelList"
:key="item.path">
<span v-if="item.redirect==='noredirect'||index==levelList.length-1"
class="no-redirect">{{item.meta.title}}</span>
<router-link v-else
:to="item.redirect||item.path">{{item.meta.title}}</router-link>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
export default {
created () {
this.getBreadcrumb()
},
data () {
return {
levelList: null
}
},
watch: {
$route () {
this.getBreadcrumb()
}
},
methods: {
getBreadcrumb () {
let matched = this.$route.matched.filter(item => item.name && item.meta.title)
const first = matched[0]
if (first && first.name !== 'home') {
matched = [{ path: '/home', meta: { title: '首页' } }].concat(matched)
}
this.levelList = matched
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 10px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
</style>
<template>
<div>
<svg t="1492500959545" @click="toggleClick" class="hamburger" :class="{'is-active':isActive}" style="" viewBox="0 0 1024 1024"
version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64">
<path d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
p-id="1692"></path>
<path d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
p-id="1693"></path>
<path d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
p-id="1694"></path>
</svg>
</div>
</template>
<script>
export default {
name: 'hamburger',
props: {
isActive: {
type: Boolean,
default: false
},
toggleClick: {
type: Function,
default: null
}
}
}
</script>
<style scoped>
.hamburger {
display: inline-block;
cursor: pointer;
width: 20px;
height: 20px;
transform: rotate(90deg);
transition: .38s;
transform-origin: 50% 50%;
}
.hamburger.is-active {
transform: rotate(0deg);
}
</style>
<template>
<el-select
v-model="select"
popper-class="selectJob"
placeholder="请选择">
<el-option
v-for="item in supplierSelect.options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
<div style="text-align:center;">
<span class="text" @click.stop="prevePage">上一页</span>
<span class="text"
style="padding-left:30px;"
v-show="supplierSelect.selectPage !== supplierSelect.pageCount"
@click.stop="nextPage">下一页</span>
</div>
</el-select>
</template>
<script>
export default {
name: "index",
props: {
supplierSelect: Object,
selectData: String
},
data() {
return {
select: this.selectData,
}
},
mounted() {
// this.getTableList(); // 初始化
},
methods: {
// handleChange(value) {
// this.$emit('getSupplierData', value)
// },
prevePage() {
this.$emit('prevSupplierPage')
--this.selectPage;
if (this.selectPage < 1) { // 判断点击的页数是否小于1
this.selectPage = 1;
}
;
this.getTableList();
},
nextPage() {
this.$emit('nextSupplierPage')
if (this.selectPage < this.pageCount) { // 判断点击的页数是否小于总页数;
++this.selectPage;
this.getTableList();
}
}
}
};
</script>
<style lang="scss" scoped>
.selectJob {
span {
width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.text {
padding-left: 10px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
color: cornflowerblue;
}
}
</style>
<template>
<div class="scroll-container" ref="scrollContainer" @wheel.prevent="handleScroll" >
<div class="scroll-wrapper" ref="scrollWrapper" :style="{top: top + 'px'}">
<slot></slot>
</div>
</div>
</template>
<script>
const delta = 15
export default {
name: 'scrollBar',
data() {
return {
top: 0
}
},
methods: {
handleScroll(e) {
const eventDelta = e.wheelDelta || -e.deltaY * 3
const $container = this.$refs.scrollContainer
const $containerHeight = $container.offsetHeight
const $wrapper = this.$refs.scrollWrapper
const $wrapperHeight = $wrapper.offsetHeight
if (eventDelta > 0) {
this.top = Math.min(0, this.top + eventDelta)
} else {
if ($containerHeight - delta < $wrapperHeight) {
if (this.top < -($wrapperHeight - $containerHeight + delta)) {
this.top = this.top
} else {
this.top = Math.max(this.top + eventDelta, $containerHeight - $wrapperHeight - delta)
}
} else {
this.top = 0
}
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import '../../styles/variables.scss';
.scroll-container {
position: relative;
width: 100%;
height: 100%;
background-color: $menuBg;
.scroll-wrapper {
position: absolute;
width: 100%!important;
}
}
</style>
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName"></use>
</svg>
</template>
<script>
export default {
name: 'svg-icon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String
}
},
computed: {
iconName() {
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1.2em;
height: 1.2em;
vertical-align: -0.18em;
fill: currentColor;
overflow: hidden;
}
</style>
<template>
<div class="upload-container">
<el-button icon='el-icon-upload'
size="mini"
:style="{background:color,borderColor:color}"
@click=" dialogVisible=true"
type="primary">上传图片
</el-button>
<el-dialog append-to-body
:visible.sync="dialogVisible">
<el-upload class="editor-slide-upload"
:action="dataObj.host"
:data="dataObj"
:multiple="true"
:file-list="fileList"
:show-file-list="true"
list-type="picture-card"
:on-remove="handleRemove"
:on-success="handleSuccess"
:before-upload="beforeUpload">
<el-button size="small"
type="primary">点击上传</el-button>
</el-upload>
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary"
@click="handleSubmit">确 定</el-button>
</el-dialog>
<!-- </el-button>-->
<!-- 选择图片-->
<add-photo-modal :modal="modal"
@handlePhoto="handlePhoto"></add-photo-modal>
</div>
</template>
<script>
import { policy } from '@/api/oss'
import { AddPhotoModal } from '@/views/pms/components'
export default {
name: 'editorSlideUpload',
components: {
AddPhotoModal
},
props: {
color: {
type: String,
default: '#1890ff'
},
mchtId: {
type: Number
}
},
data() {
return {
dialogVisible: false,
listObj: {},
fileList: [],
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: 'http://haihaigo.oss-cn-shenzhen.aliyuncs.com'
},
modal: {
addPhotoVisible: false,
flag: 10, // 数量限制
},
}
},
methods: {
checkAllSuccess() {
return Object.keys(this.listObj).every(item => this.listObj[item].hasSuccess)
},
handleSubmit() {
const arr = Object.keys(this.listObj).map(v => this.listObj[v])
if (!this.checkAllSuccess()) {
this.$message('请等待所有图片上传成功 或 出现了网络问题,请刷新页面重新上传!')
return
}
this.$emit('successCBK', arr)
this.listObj = {}
this.fileList = []
this.dialogVisible = false
},
// 图片弹窗
handlePhoto(value) {
const photos = []
for (var i of value) {
photos.push({
url: i
})
}
this.$emit('successCBK', photos)
this.modal.addPhotoVisible = false
},
handleSuccess(response, file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
this.listObj[objKeyArr[i]].url = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.uid + file.name
this.listObj[objKeyArr[i]].hasSuccess = true
return
}
}
},
handleRemove(file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
delete this.listObj[objKeyArr[i]]
return
}
}
},
beforeUpload(file) {
let _self = this
// 最大只能上传10M文件
if (file.size > 10485760) {
this.$message.error('上传失败,最大只能上传10M大小的图片')
return false
}
this.listObj[file.uid] = {}
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy
_self.dataObj.signature = response.data.signature
_self.dataObj.ossaccessKeyId = response.data.accessKeyId
_self.dataObj.key = response.data.dir + '/' + file.uid + file.name
_self.dataObj.dir = response.data.dir
_self.dataObj.host = response.data.host
_self.listObj[file.uid] = { hasSuccess: false, uid: file.uid, width: this.width, height: this.height }
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
}
}
}
</script>
<style>
.editor-slide-upload .el-upload {
margin-bottom: 20px;
}
</style>
<template>
<div class="tinymce-container editor-container">
<textarea class="tinymce-textarea"
:id="tinymceId"></textarea>
<div class="editor-custom-btn-container">
<editorImage color="#1890ff"
class="editor-upload-btn"
:mchtId="mchtId"
@successCBK="imageSuccessCBK"></editorImage>
</div>
</div>
</template>
<script>
import editorImage from './components/editorImage'
import '../../../static/tinymce4.7.5/langs/zh_CN'
const plugins = [
`advlist anchor autolink autosave code codesample colorpicker colorpicker
contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime
legacyoutput link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace
spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount`
];
const toolbar = [
`bold italic underline strikethrough alignleft aligncenter
alignright outdent indent blockquote undo redo removeformat`,
`hr bullist numlist link image charmap preview anchor pagebreak
fullscreen insertdatetime media table forecolor backcolor`
];
export default {
name: 'tinymce',
components: { editorImage },
props: {
id: {
type: String
},
mchtId: {
type: Number
},
value: {
type: String,
default: ''
},
toolbar: {
type: Array,
required: false,
default() {
return []
}
},
menubar: {
default: 'file edit insert view format table'
},
height: {
type: Number,
required: false,
default: 400
},
width: {
type: Number,
required: false,
default: 740
}
},
data() {
return {
hasChange: false,
hasInit: false,
tinymceId: this.id || 'vue-tinymce-' + +new Date()
}
},
watch: {
value(val) {
if (!this.hasChange && this.hasInit) {
this.$nextTick(() => window.tinymce.get(this.tinymceId).setContent(val))
}
}
},
mounted() {
this.initTinymce()
},
activated() {
this.initTinymce()
},
deactivated() {
this.destroyTinymce()
},
methods: {
initTinymce() {
const _this = this
window.tinymce.init({
selector: `#${this.tinymceId}`,
width: this.width,
height: this.height,
language: 'zh_CN',
body_class: 'panel-body ',
object_resizing: false,
toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar,
menubar: false,
plugins: plugins,
end_container_on_empty_block: true,
powerpaste_word_import: 'clean',
code_dialog_height: 450,
code_dialog_width: 1000,
advlist_bullet_styles: 'square',
advlist_number_styles: 'default',
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
default_link_target: '_blank',
link_title: false,
init_instance_callback: editor => {
if (_this.value) {
editor.setContent(_this.value)
}
_this.hasInit = true
editor.on('NodeChange Change KeyUp SetContent', () => {
this.hasChange = true
this.$emit('input', editor.getContent())
})
}
})
},
destroyTinymce() {
if (window.tinymce.get(this.tinymceId)) {
window.tinymce.get(this.tinymceId).destroy()
}
},
setContent(value) {
window.tinymce.get(this.tinymceId).setContent(value)
},
getContent() {
window.tinymce.get(this.tinymceId).getContent()
},
imageSuccessCBK(arr) {
const _this = this
arr.forEach(v => {
window.tinymce.get(_this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`)
})
}
},
destroyed() {
this.destroyTinymce()
}
}
</script>
<style scoped>
.tinymce-container {
position: relative;
}
.tinymce-container >>> .mce-fullscreen {
z-index: 10000;
}
.tinymce-textarea {
visibility: hidden;
z-index: -1;
}
.editor-custom-btn-container {
position: absolute;
right: 10px;
top: 2px;
/*z-index: 2005;*/
}
.editor-upload-btn {
display: inline-block;
}
</style>
tinymce.addI18n('zh_CN',{
"Cut": "\u526a\u5207",
"Heading 5": "\u6807\u98985",
"Header 2": "\u6807\u98982",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002",
"Heading 4": "\u6807\u98984",
"Div": "Div\u533a\u5757",
"Heading 2": "\u6807\u98982",
"Paste": "\u7c98\u8d34",
"Close": "\u5173\u95ed",
"Font Family": "\u5b57\u4f53",
"Pre": "\u9884\u683c\u5f0f\u6587\u672c",
"Align right": "\u53f3\u5bf9\u9f50",
"New document": "\u65b0\u6587\u6863",
"Blockquote": "\u5f15\u7528",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Heading 1": "\u6807\u98981",
"Headings": "\u6807\u9898",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Formats": "\u683c\u5f0f",
"Headers": "\u6807\u9898",
"Select all": "\u5168\u9009",
"Header 3": "\u6807\u98983",
"Blocks": "\u533a\u5757",
"Undo": "\u64a4\u6d88",
"Strikethrough": "\u5220\u9664\u7ebf",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Header 1": "\u6807\u98981",
"Superscript": "\u4e0a\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Font Sizes": "\u5b57\u53f7",
"Subscript": "\u4e0b\u6807",
"Header 6": "\u6807\u98986",
"Redo": "\u91cd\u590d",
"Paragraph": "\u6bb5\u843d",
"Ok": "\u786e\u5b9a",
"Bold": "\u7c97\u4f53",
"Code": "\u4ee3\u7801",
"Italic": "\u659c\u4f53",
"Align center": "\u5c45\u4e2d",
"Header 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Heading 3": "\u6807\u98983",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Header 4": "\u6807\u98984",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
"Underline": "\u4e0b\u5212\u7ebf",
"Cancel": "\u53d6\u6d88",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Inline": "\u6587\u672c",
"Copy": "\u590d\u5236",
"Align left": "\u5de6\u5bf9\u9f50",
"Visual aids": "\u7f51\u683c\u7ebf",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Square": "\u65b9\u5757",
"Default": "\u9ed8\u8ba4",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
"Name": "\u540d\u79f0",
"Anchor": "\u951a\u70b9",
"Id": "\u6807\u8bc6\u7b26",
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Source code": "\u6e90\u4ee3\u7801",
"Language": "\u8bed\u8a00",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"B": "B",
"R": "R",
"G": "G",
"Color": "\u989c\u8272",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Emoticons": "\u8868\u60c5",
"Robots": "\u673a\u5668\u4eba",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Encoding": "\u7f16\u7801",
"Description": "\u63cf\u8ff0",
"Author": "\u4f5c\u8005",
"Fullscreen": "\u5168\u5c4f",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Source": "\u5730\u5740",
"Border": "\u8fb9\u6846",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Style": "\u6837\u5f0f",
"Dimensions": "\u5927\u5c0f",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image": "\u56fe\u7247",
"Zoom in": "\u653e\u5927",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Back": "\u540e\u9000",
"Gamma": "\u4f3d\u9a6c\u503c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Sharpen": "\u9510\u5316",
"Zoom out": "\u7f29\u5c0f",
"Image options": "\u56fe\u7247\u9009\u9879",
"Apply": "\u5e94\u7528",
"Brightness": "\u4eae\u5ea6",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Crop": "\u88c1\u526a",
"Orientation": "\u65b9\u5411",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Invert": "\u53cd\u8f6c",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Url": "\u5730\u5740",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Anchors": "\u951a\u70b9",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Link": "\u94fe\u63a5",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"None": "\u65e0",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Media": "\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Poster": "\u5c01\u9762",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Embed": "\u5185\u5d4c",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print": "\u6253\u5370",
"Save": "\u4fdd\u5b58",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Replace": "\u66ff\u6362",
"Next": "\u4e0b\u4e00\u4e2a",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Replace with": "\u66ff\u6362\u4e3a",
"Find": "\u67e5\u627e",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Prev": "\u4e0a\u4e00\u4e2a",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Finish": "\u5b8c\u6210",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Ignore": "\u5ffd\u7565",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Rows": "\u884c",
"Height": "\u9ad8",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Column group": "\u5217\u7ec4",
"Row": "\u884c",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Row type": "\u884c\u7c7b\u578b",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Body": "\u8868\u4f53",
"Caption": "\u6807\u9898",
"Footer": "\u8868\u5c3e",
"Delete row": "\u5220\u9664\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Scope": "\u8303\u56f4",
"Delete table": "\u5220\u9664\u8868\u683c",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Column": "\u5217",
"Row group": "\u884c\u7ec4",
"Cell": "\u5355\u5143\u683c",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Copy row": "\u590d\u5236\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Header": "\u8868\u5934",
"Right": "\u53f3\u5bf9\u9f50",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Cols": "\u5217",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Width": "\u5bbd",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Left": "\u5de6\u5bf9\u9f50",
"Cut row": "\u526a\u5207\u884c",
"Delete column": "\u5220\u9664\u5217",
"Center": "\u5c45\u4e2d",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Insert template": "\u63d2\u5165\u6a21\u677f",
"Templates": "\u6a21\u677f",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Text color": "\u6587\u5b57\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"Insert": "\u63d2\u5165",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
"Tools": "\u5de5\u5177",
"View": "\u89c6\u56fe",
"Table": "\u8868\u683c",
"Format": "\u683c\u5f0f"
});
\ No newline at end of file
<template> 
<div>
<el-upload :action="dataObj.host"
:data="dataObj"
list-type="picture"
accept="image/*"
:file-list="fileList"
:show-file-list="showFileList"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-preview="handlePreview"
:limit="maxCount"
:on-exceed="handleExceed">
<el-button size="small"
type="primary"
style="float: right;">上传图片</el-button>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%"
:src="dialogImageUrl">
</el-dialog>
</div>
</template>
<script>
import { policy } from '@/api/oss'
export default {
name: 'multiUpload',
props: {
//图片属性数组
value: Array,
//最大上传图片数量
maxCount: {
type: Number,
default: 5
},
showList: {
type: Boolean,
default: true
}
},
data() {
return {
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: 'http://haihaigo.oss-cn-shenzhen.aliyuncs.com'
},
dialogVisible: false,
dialogImageUrl: null
};
},
computed: {
fileList() {
let fileList = [];
for (let i = 0; i < this.value.length; i++) {
fileList.push({ url: this.value[i] })
}
return fileList
},
showFileList: {
get: function () {
return this.value !== null && this.value !== '' && this.value !== undefined && this.showList
},
set: function (newValue) {
}
}
},
methods: {
emitInput(fileList) {
let value = [];
for (let i = 0; i < fileList.length; i++) {
value.push(fileList[i].url)
}
this.$emit('input', value)
},
handleRemove(file, fileList) {
this.emitInput(fileList)
},
handlePreview(file) {
this.dialogVisible = true
this.dialogImageUrl = file.url
},
beforeUpload(file) {
let _self = this
// 最大只能上传10M文件
if (file.size > 10485760) {
this.$message.error('上传失败,最大只能上传10M大小的图片')
return false
}
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy
_self.dataObj.signature = response.data.signature
_self.dataObj.ossaccessKeyId = response.data.accessKeyId
_self.dataObj.key = response.data.dir + '/' + file.uid + file.name.replace(/,/g, '')
_self.dataObj.dir = response.data.dir
_self.dataObj.host = response.data.host
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
},
handleUploadSuccess(res, file) {
this.showFileList = this.showList
this.fileList.push({
name: file.uid + file.name,
url: this.dataObj.host + '/' + this.dataObj.dir + '/' + file.uid + file.name.replace(/,/g, '')
})
this.emitInput(this.fileList)
},
handleExceed(files, fileList) {
this.$message({
message: '最多只能上传' + this.maxCount + '张图片',
type: 'warning',
duration: 1000
})
}
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
<template> 
<div>
<el-upload :action="dataObj.host"
:data="dataObj"
list-type="picture"
accept="image/*"
:multiple="false"
:show-file-list="showFileList"
:file-list="fileList"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-preview="handlePreview">
<el-button size="small"
type="primary"
style="float: right;">上传图片</el-button>
<!--<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过10MB</div>-->
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%"
:src="fileList[0].url">
</el-dialog>
</div>
</template>
<script>
import { policy } from '@/api/oss'
export default {
name: 'singleUpload',
props: {
value: String,
showList: {
type: Boolean,
default: true
}
},
computed: {
imageUrl() {
return this.value;
},
imageName() {
if (this.value != null && this.value !== '') {
return this.value.substr(this.value.lastIndexOf("/") + 1);
} else {
return null;
}
},
fileList() {
return [{
name: this.imageName,
url: this.imageUrl
}]
},
showFileList: {
get: function () {
return this.value !== null && this.value !== '' && this.value !== undefined && this.showList;
},
set: function (newValue) {
}
}
},
data() {
return {
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: 'http://haihaigo.oss-cn-shenzhen.aliyuncs.com'
},
dialogVisible: false
};
},
methods: {
emitInput(val) {
this.$emit('input', val)
},
handleRemove(file, fileList) {
this.emitInput('')
},
handlePreview(file) {
this.dialogVisible = true
},
beforeUpload(file) {
let _self = this
// 最大只能上传10M文件
if (file.size > 10485760) {
this.$message.error('上传失败,最大只能上传10M大小的图片')
return false
}
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy
_self.dataObj.signature = response.data.signature
_self.dataObj.ossaccessKeyId = response.data.accessKeyId
_self.dataObj.key = response.data.dir + '/' + file.uid + file.name.replace(/,/g, '')
_self.dataObj.dir = response.data.dir
_self.dataObj.host = response.data.host
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
},
handleUploadSuccess(res, file) {
this.showFileList = this.showList
this.fileList.pop()
this.fileList.push({
name: file.uid + file.name,
url: this.dataObj.host + '/' + this.dataObj.dir + '/' + file.uid + file.name.replace(/,/g, '')
})
this.emitInput(this.fileList[0].url)
}
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
<template> 
<div>
<el-upload :action="dataObj.host"
:data="dataObj"
list-type="picture"
accept="video/*"
:multiple="false"
:show-file-list="showFileList"
:file-list="fileList"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-preview="handlePreview">
<el-button size="small"
type="primary"
style="float: right;">上传视频</el-button>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%"
:src="fileList[0].url">
</el-dialog>
</div>
</template>
<script>
import { policy } from '@/api/oss'
export default {
name: 'videoUpload',
props: {
value: String,
showList: {
type: Boolean,
default: true
}
},
computed: {
imageUrl() {
return this.value;
},
imageName() {
if (this.value != null && this.value !== '') {
return this.value.substr(this.value.lastIndexOf("/") + 1);
} else {
return null;
}
},
fileList() {
return [{
name: this.imageName,
url: this.imageUrl
}]
},
showFileList: {
get: function () {
return this.value !== null && this.value !== '' && this.value !== undefined && this.showList;
},
set: function (newValue) {
}
}
},
data() {
return {
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: 'http://haihaigo.oss-cn-shenzhen.aliyuncs.com'
},
dialogVisible: false
};
},
methods: {
emitInput(val) {
this.$emit('input', val)
},
handleRemove(file, fileList) {
this.emitInput('')
},
handlePreview(file) {
this.dialogVisible = true
},
beforeUpload(file) {
let _self = this
// 最大只能上传100M文件
if (file.size > 104857600) {
this.$message.error('上传失败,最大只能上传100M大小的视频')
return false
}
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy
_self.dataObj.signature = response.data.signature
_self.dataObj.ossaccessKeyId = response.data.accessKeyId
_self.dataObj.key = response.data.dir + '/' + file.uid + file.name
_self.dataObj.dir = response.data.dir
_self.dataObj.host = response.data.host
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
},
handleUploadSuccess(res, file) {
this.showFileList = this.showList
this.fileList.pop()
this.fileList.push({
name: file.uid + file.name,
url: this.dataObj.host + '/' + this.dataObj.dir + '/' + file.uid + file.name
})
this.emitInput(this.fileList[0].url)
}
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg组件
// register globally
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592799142096" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6733" data-spm-anchor-id="a313x.7781069.0.i30" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M392.6 726.9c2.2-55.2 28-325.1 327.6-337V303c-0.4-4.9-0.2-16 7.8-24.8 9.2-10.2 24.3-12.5 41.5-5.3l3.9 1.8 168.4 174.9c3.3 3.7 17.6 20.9 17.6 40.9 0 20.9-17.8 38.7-21.3 42.1L769.5 717.9c-4.3 4.5-14.7 13.5-28.2 13.5-10.4 0-19.8-5.7-24.8-14.9-3.5-6.5-5.1-14.5-5.1-25.4V585.8c-48.5-1.2-190.3 8.4-273 152.4-5.5 9.4-13.9 14.9-23.1 14.9h-8.8l-7.2-6.5c-7.3-7.2-6.9-16.6-6.7-19.7z m312-180.8c18.6 0 30.1 1.6 30.7 1.6l17.8 2.3v125.6L908 505.3c5.5-5.3 10-12.5 10-15.1 0-4.1-4.3-11.1-7.4-14.7l-149-154.7V429h-20.7C527.3 429 461.8 567.9 442 662.5c89.7-103.9 210-116.4 262.6-116.4z m-188-215.3c0-17.2-14.1-31.3-31.3-31.3H253.6c-17.2 0-31.3 14.1-31.3 31.3 0 17.2 14.1 31.3 31.3 31.3h231.8c17.1 0 31.2-14.1 31.2-31.3zM347.8 575.9h-94.3c-17.2 0-31.3 14.1-31.3 31.3 0 17.2 14.1 31.3 31.3 31.3h94.3c17.2 0 31.3-14.1 31.3-31.3 0-17.3-13.9-31.3-31.3-31.3z m56.8-107c0-17.2-14.1-31.3-31.3-31.3H253.6c-17.2 0-31.3 14.1-31.3 31.3 0 17.2 14.1 31.3 31.3 31.3h119.7c17.4 0.2 31.3-13.9 31.3-31.3z m0 0" p-id="6734" data-spm-anchor-id="a313x.7781069.0.i28" class="selected" fill="#409eff"></path><path d="M800 755v45c0 30.5-29.3 55.4-60 55.4H177.5c-30.5 0-55.4-24.8-55.4-55.4V220.9c1.6-29.3 25.6-52.6 55.4-52.6h576.2c29.5 0 53.8 23.3 55.4 52.6v18.6s33.6 51.4 58.1 83.3V220.9c0-12.9-2.3-25.8-6.7-38.1C845 140.3 804.1 110 756.4 110H174.7c-51.6 0-95.1 35.2-107.4 83.1-2.3 9-3.5 18.4-3.5 27.8v581.7c0 61.2 49.7 110.9 110.7 110.9h581.7c56.3 0 102.7-41.9 109.9-96.2 0 0 0.8-146.7-2.1-143.9-75.1 81.6-63.6 81.8-64 81.6z m0 0" p-id="6735" data-spm-anchor-id="a313x.7781069.0.i31" class="selected" fill="#409eff"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1511504199105" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1815" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M770.56 460.8h250.88C998.4 220.16 803.84 25.6 563.2 2.56v250.88c104.96 20.48 186.88 102.4 207.36 207.36z m0 0M460.8 253.44V2.56C220.16 25.6 25.6 220.16 2.56 460.8h250.88c20.48-104.96 102.4-186.88 207.36-207.36z m0 0M563.2 770.56v250.88c243.2-23.04 435.2-217.6 460.8-460.8H773.12C750.08 668.16 668.16 750.08 563.2 770.56z m0 0M253.44 563.2H2.56c23.04 243.2 217.6 435.2 460.8 460.8V773.12C355.84 750.08 273.92 668.16 253.44 563.2z m0 0" fill="" p-id="1816"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503993826520" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7878" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M941.677063 391.710356c9.337669-14.005992 6.224772-32.68133-6.224772-43.575447-14.005992-10.894118-32.68133-7.78122-43.575447 6.224771-1.556449 1.556449-174.300768 205.426673-379.727441 205.426673-199.200878 0-379.727441-205.426673-381.28389-206.982098-10.894118-12.450567-31.124881-14.005992-43.575448-3.112898-12.450567 10.894118-14.005992 31.124881-3.112897 43.575448 3.112897 4.668323 40.46255 46.687322 99.600439 93.375667l-79.369676 82.48155c-12.450567 12.450567-10.894118 32.68133 1.556449 43.575448 3.112897 6.224772 10.894118 9.337669 18.675338 9.337669 7.78122 0 15.562441-3.112897 21.787213-9.337669l85.594447-88.706321c40.46255 28.013007 88.706321 54.469566 141.619438 73.14388L340.959485 707.631586c-4.668323 17.118889 4.669346 34.237779 21.787213 38.906101h9.337669c14.005992 0 26.456558-9.337669 29.568432-23.343661l32.68133-110.494556c24.90011 4.668323 51.356668 7.78122 77.813227 7.78122s52.913117-3.112897 77.813227-7.78122l32.68133 108.938108c3.112897 14.005992 17.118889 23.343661 29.569456 23.343661 3.112897 0 6.224772 0 7.78122-1.556449 17.118889-4.669346 26.456558-21.787212 21.788236-38.906102l-32.68133-108.938108c52.913117-18.675338 101.156888-45.131897 141.619438-73.14388l84.037998 87.150896c6.224772 6.224772 14.005992 9.337669 21.787212 9.337669 7.78122 0 15.562441-3.112897 21.787212-9.337669 12.450567-12.450567 12.450567-31.124881 1.556449-43.575448l-79.369675-82.48155c63.808258-46.688345 101.158934-91.820242 101.158934-91.820242z" p-id="7879"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1511504319223" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3230" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M942.827259 80.3367c-11.42419-11.406794-26.41051-17.117866-41.377386-17.117866-14.985296 0-29.952172 5.711072-41.358967 17.117866L719.392444 221.014696l-19.441794 19.441794L681.577187 258.832 569.516971 370.909611 375.99749 564.411697l0 0.019443 0 84.372619 81.145112 0 0.010233 0 95.418186-95.435583 213.398228-213.400275 3.14155-3.14155-0.019443 0 9.979282-9.977235 0 0L942.827259 163.073052C965.697129 140.259464 965.697129 103.186104 942.827259 80.3367z" p-id="3231"></path><path d="M793.542234 367.521444 580.14196 580.939115 484.72582 676.376745 473.299583 687.800935 457.152834 687.800935 375.99749 687.800935 337.000314 687.800935 337.000314 648.803759 337.000314 564.411697 337.000314 548.264948 348.424504 536.838711 541.943986 343.338672 654.004201 231.259014 665.428392 219.834824 64.020082 219.834824 64.020082 960.781166 804.966425 960.781166 804.966425 356.116697 796.607036 364.475062Z" p-id="3232"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526283460904" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3665" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M563.197497 0 460.802503 0 0.012259 486.388227c0 0 0.901006 102.396016 51.200051 102.396016s76.797012 0 76.797012 0 0 232.496449 0 332.816677c0 100.300818 102.397038 102.399081 102.397038 102.399081l204.79714 0c0 0 0-272.419617 0-358.416702 0-25.647017 25.600026-25.600026 25.600026-25.600026l102.394994 0c0 0 25.601047 0.851972 25.601047 25.600026 0 92.198911 0 358.416702 0 358.416702s99.647027 0 204.795097 0c105.147048 0 102.398059-102.399081 102.398059-102.399081L895.992721 563.185239c0 0 27.19875 0 76.799055 0 49.59724 0 51.195965-76.79599 51.195965-76.79599L563.197497 0z" p-id="3666"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592798938931" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4282" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M832 548.006c0-23.564 19.103-42.667 42.667-42.667s42.666 19.103 42.666 42.667V846.56c0 38.945-31.637 70.435-70.564 70.435H177.231c-38.927 0-70.564-31.49-70.564-70.435V324.08c0-27.701 16.261-52.803 42.113-64.454l295.445-127.8a170.667 170.667 0 0 1 135.554 0.018L875.468 259.84c25.442 11.306 41.865 36.506 41.865 64.347v91.771c0 23.564-19.102 42.667-42.666 42.667-23.564 0-42.667-19.103-42.667-42.667v-81.951L545.88 210.154a85.333 85.333 0 0 0-67.776-0.008L192 333.899v497.764h640V548.006zM295.753 440.687h53.478c14.768 0 26.74 12.646 26.74 28.244v56.488c0 15.598-11.972 28.244-26.74 28.244h-53.478c-14.768 0-26.74-12.646-26.74-28.244V468.93c0-15.598 11.972-28.244 26.74-28.244z m187.175 0h53.478c14.768 0 26.74 12.646 26.74 28.244v56.488c0 15.598-11.972 28.244-26.74 28.244h-53.478c-14.768 0-26.74-12.646-26.74-28.244V468.93c0-15.598 11.972-28.244 26.74-28.244zM295.753 638.394h53.478c14.768 0 26.74 12.645 26.74 28.244v56.487c0 15.6-11.972 28.244-26.74 28.244h-53.478c-14.768 0-26.74-12.645-26.74-28.244v-56.487c0-15.599 11.972-28.244 26.74-28.244z m187.175 0h53.478c14.768 0 26.74 12.645 26.74 28.244v56.487c0 15.6-11.972 28.244-26.74 28.244h-53.478c-14.768 0-26.74-12.645-26.74-28.244v-56.487c0-15.599 11.972-28.244 26.74-28.244z m187.174 0h53.479c14.768 0 26.74 12.645 26.74 28.244v56.487c0 15.6-11.972 28.244-26.74 28.244h-53.479c-14.767 0-26.739-12.645-26.739-28.244v-56.487c0-15.599 11.972-28.244 26.74-28.244z" p-id="4283"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1542852993843" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2043" xmlns:xlink="http://www.w3.org/1999/xlink" width="54" height="54"><defs><style type="text/css"></style></defs><path d="M825.6 554.666667c-64 0-121.6-38.4-155.733333-89.6C633.6 516.266667 576 554.666667 512 554.666667s-121.6-38.4-155.733333-89.6C320 516.266667 264.533333 554.666667 198.4 554.666667 89.6 554.666667 0 465.066667 0 356.266667v-8.533334L151.466667 0h721.066666L1024 345.6v8.533333c0 110.933333-89.6 200.533333-198.4 200.533334z m-200.533333-219.733334h85.333333c0 61.866667 51.2 134.4 113.066667 134.4 59.733333 0 108.8-46.933333 113.066666-104.533333L817.066667 85.333333H206.933333L85.333333 364.8c4.266667 57.6 53.333333 104.533333 113.066667 104.533333 64 0 113.066667-74.666667 113.066667-134.4h85.333333c0 61.866667 51.2 134.4 113.066667 134.4 66.133333 0 115.2-74.666667 115.2-134.4zM810.666667 1021.866667H213.333333c-83.2 0-149.333333-64-149.333333-142.933334V595.2h85.333333v283.733333c0 32 27.733333 57.6 64 57.6h597.333334c34.133333 0 64-25.6 64-57.6V595.2h85.333333v283.733333c0 78.933333-66.133333 142.933333-149.333333 142.933334z" p-id="2044"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1540454363495" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1978" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M789 112.1c8.1 0 15.9 1.6 23.2 4.8 11.7 4.6 20.9 11.8 27.8 21.7s10.3 20.8 10.3 32.8v681.5c0 12-3.4 22.9-10.3 32.8-6.9 9.9-16.1 17.1-27.8 21.7-6.7 2.8-14.5 4.2-23.2 4.2-16.9 0-31.6-5.7-43.9-16.9l-233-224.3-233.2 224.1C266.2 906.2 251.5 912 235 912c-8.1 0-15.9-1.6-23.2-4.8-11.7-4.6-20.9-11.8-27.8-21.7-6.9-9.9-10.3-20.8-10.3-32.8V171.3c0-12 3.4-22.9 10.3-32.8 6.9-9.9 16.1-17.1 27.8-21.7 7.4-3.2 15.1-4.8 23.2-4.8h554v0.1z" p-id="1979"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1539332319502" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8983" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M348.661 154.658c18.25 0 33.169-14.786 33.169-33.169v-11.056h198.883v11.056c0 18.25 14.786 33.169 33.169 33.169 18.25 0 33.169-14.786 33.169-33.169v-88.319c0-18.25-14.786-33.169-33.169-33.169-18.25 0-33.169 14.786-33.169 33.169v11.056h-198.883v-11.056c0-18.25-14.786-33.169-33.169-33.169-18.25 0-33.169 14.786-33.169 33.169v88.319c0 18.25 14.786 33.169 33.169 33.169v0z" p-id="8984"></path><path d="M430.319 887.849h-210.473c-44.359 0-80.459-37.033-80.459-82.457v-612.636c0-45.425 36.1-82.457 80.459-82.457 18.25 0 33.169-14.786 33.169-33.169s-14.786-33.169-33.169-33.169c-80.859 0-146.798 66.739-146.798 148.796v612.636c0 82.058 65.806 148.796 146.798 148.796h210.473c18.25 0 33.169-14.786 33.169-33.169 0-18.25-14.92-33.169-33.169-33.169v0z" p-id="8985"></path><path d="M742.565 43.96c-18.25 0-33.169 14.786-33.169 33.169 0 18.25 14.786 33.169 33.169 33.169 44.359 0 80.459 37.033 80.459 82.457v325.034c0 18.25 14.786 33.169 33.169 33.169 18.25 0 33.169-14.786 33.169-33.169v-325.034c0-82.058-65.806-148.796-146.798-148.796v0z" p-id="8986"></path><path d="M658.776 317.041h-355.14c-18.25 0-33.303-14.92-33.303-33.303v0c0-18.25 14.92-33.303 33.303-33.303h355.006c18.383 0 33.303 14.92 33.303 33.303v0c0.133 18.25-14.92 33.303-33.169 33.303z" p-id="8987"></path><path d="M658.776 466.237h-355.14c-18.25 0-33.303-14.92-33.303-33.303v0c0-18.25 14.92-33.303 33.303-33.303h355.006c18.383 0 33.303 15.053 33.303 33.303v0c0.133 18.25-14.92 33.303-33.169 33.303z" p-id="8988"></path><path d="M466.153 643.407h-171.709c-13.188 0-24.111-10.79-24.111-24.111v-18.516c0-13.188 10.79-24.111 24.111-24.111h171.709c13.188 0 24.111 10.79 24.111 24.111v18.516c0 13.321-10.79 24.111-24.111 24.111z" p-id="8989"></path><path d="M946.244 748.244c-1.465-26.242 10.79-52.485 36.5-77.928 6.261-6.261 7.327-15.985 2.531-23.312-31.837-48.755-38.365-59.945-39.43-62.076-0.799-1.865-1.865-3.463-3.197-5.062-4.929-5.462-12.522-7.593-19.582-5.328-0.533 0.133-54.483 17.184-95.912-6.261-21.847-12.389-36.5-34.368-43.826-65.673-1.998-8.659-9.858-14.653-18.783-14.387l-78.195 2.931c-9.058 0.4-16.651 7.193-17.717 16.252 0 0.4-6.927 47.157-41.828 71.268-22.912 15.852-53.551 19.316-91.383 10.257-8.126-1.865-16.518 1.865-20.648 9.192-34.235 62.343-37.965 69.003-38.365 69.669-2.131 3.597-2.931 7.859-2.398 12.122 0.799 5.328 3.73 9.991 8.259 12.921 0.4 0.266 38.098 25.31 42.494 64.607 2.931 26.775-10.124 55.149-38.898 84.589-6.128 6.261-7.060 15.985-2.265 23.312l44.492 67.271c5.062 7.726 15.053 10.524 23.445 6.527 0.4-0.133 41.562-19.049 79.26-2.531 25.443 11.056 44.492 36.1 56.748 74.465 2.531 7.993 10.124 13.188 18.383 12.921l79.127-3.064c8.925-0.4 16.252-6.927 17.717-15.719 0.133-0.533 8.126-48.222 44.359-72.333 22.646-15.053 52.219-18.25 88.185-9.458 8.259 1.998 16.785-1.865 20.781-9.325 30.638-57.147 35.168-65.406 35.834-66.472 1.998-3.33 2.931-7.193 2.664-11.056-0.4-5.195-2.931-9.858-6.927-13.055-0.533-0.266-39.164-32.237-41.429-75.264v0zM946.777 595.984c-0.266 1.199-0.666 2.531-1.199 3.863 0.533-1.199 0.932-2.531 1.199-3.863v0zM947.177 591.722c0 1.199 0 2.664-0.4 4.13 0.4-1.465 0.4-2.797 0.4-4.13v0zM929.859 884.252c-40.496-7.193-75.397-1.199-103.771 17.85-35.301 23.578-50.62 61.277-56.615 82.191l-51.286 1.998c-15.985-41.695-40.496-69.936-72.999-83.923-36.899-15.985-74.065-8.792-94.313-2.531l-28.374-42.894c29.706-34.235 42.894-69.136 38.898-103.771-4.396-38.764-29.173-66.472-45.292-80.726 4.929-8.792 12.522-22.646 24.378-44.359 42.361 7.46 78.461 1.199 107.235-18.783 34.235-23.711 48.622-60.611 54.217-81.525l49.022-1.865c10.923 34.102 30.239 59.146 57.68 74.731 40.496 22.912 87.386 17.85 110.831 13.055 5.595 9.325 14.12 22.379 26.509 41.429-26.376 30.106-38.764 62.076-36.899 95.246 2.265 42.761 27.974 75.397 43.56 91.516-4.529 8.259-11.589 21.447-22.779 42.361v0z" p-id="8990"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1539332248248" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7595" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M984.1664 326.2464v-2.4576a27.8528 27.8528 0 0 0-0.8192-3.8912v-1.3312L908.3904 98.7136A70.144 70.144 0 0 0 841.9328 51.2H182.0672a70.144 70.144 0 0 0-66.4576 47.616L40.96 318.5664v1.3312a27.8528 27.8528 0 0 0-0.8192 3.8912v621.056A28.0576 28.0576 0 0 0 67.6864 972.8h888.6272a28.0576 28.0576 0 0 0 28.0576-28.0576V327.68s-0.1024-1.024-0.2048-1.4336zM168.7552 116.6336a14.0288 14.0288 0 0 1 13.312-9.5232h659.8656a14.0288 14.0288 0 0 1 13.312 9.5232l61.952 182.784H106.8032z m759.5008 800.1536H95.744v-561.152h832.512z" fill="" p-id="7596"></path><path d="M399.36 756.5312A28.0576 28.0576 0 1 0 438.8864 716.8l-52.5312-52.5312h317.44a28.0576 28.0576 0 1 0 0-56.1152H389.12l52.5312-52.6336a28.0576 28.0576 0 0 0-39.6288-39.6288l-102.4 102.4a28.0576 28.0576 0 0 0 0 39.6288z" fill="" p-id="7597"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1539332023716" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5427" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M962.92864 602.1888c-9.09824 48.42496-43.42272 80.96256-85.41696 80.96256h-4.8128a54.66624 54.66624 0 0 0-54.0672 55.08096 49.7408 49.7408 0 0 0 2.4576 12.96896q1.08544 3.69664 2.50368 7.2704a100.53632 100.53632 0 0 1-34.78528 122.7776l-3.072 1.9968c-0.54784 0.3584-1.11616 0.70144-1.6896 1.024l-104.14592 58.368a28.672 28.672 0 0 1-2.56 1.2288l-1.024 0.512a100.65408 100.65408 0 0 1-40.61696 8.35072 105.01632 105.01632 0 0 1-75.81184-31.7696 141.89056 141.89056 0 0 0-33.75616-25.72288 26.39872 26.39872 0 0 0-12.288-3.072 23.38304 23.38304 0 0 0-12.17024 3.33312 145.88928 145.88928 0 0 0-33.76128 26.112 104.73984 104.73984 0 0 1-76.31872 32.3328 99.79392 99.79392 0 0 1-39.89504-8.09984l-0.87552-0.35328-3.22048-1.536q-0.88064-0.43008-1.7408-0.9216l-107.8272-59.95008a28.38016 28.38016 0 0 1-2.56-1.64352l-1.024-0.7168a100.52096 100.52096 0 0 1-34.01728-122.46016q1.3312-3.456 2.35008-7.01952a50.04288 50.04288 0 0 0 2.5088-13.02016 54.66624 54.66624 0 0 0-54.04672-55.05536h-4.34688c-42.30656 0-76.8-32.5376-85.888-80.96256a531.18464 531.18464 0 0 1-9.41056-90.50112 520.84736 520.84736 0 0 1 9.46176-90.54208c9.05728-48.41984 43.58144-80.96256 85.98528-80.96256h4.1984A54.66112 54.66112 0 0 0 205.312 285.11744a80.73216 80.73216 0 0 0-4.96128-20.23936 100.6336 100.6336 0 0 1 33.86368-122.15808l0.81408-0.5632 2.9696-1.95072c0.56832-0.3584 1.14688-0.70144 1.7408-1.024l102.16448-57.64608a30.6688 30.6688 0 0 1 2.50368-1.23392l1.024-0.512a99.584 99.584 0 0 1 40.70912-8.46336 103.7568 103.7568 0 0 1 76.88192 33.31072 150.1184 150.1184 0 0 0 35.80416 28.07808 23.35232 23.35232 0 0 0 21.73952 0.1536 148.08064 148.08064 0 0 0 36.46976-28.99968 103.69536 103.69536 0 0 1 77.34272-33.82272 99.6352 99.6352 0 0 1 40.00256 8.192l0.9216 0.41472 3.11808 1.47968q0.86016 0.4352 1.6896 0.92672l105.88672 59.28448a28.55936 28.55936 0 0 1 2.45248 1.536l1.024 0.7168a100.67968 100.67968 0 0 1 34.01728 122.46016c0 0.0512-1.1264 2.82112-2.3552 7.01952a49.92 49.92 0 0 0-2.50368 13.02016 54.67648 54.67648 0 0 0 54.0672 55.08096h4.24448c42.35776 0 76.88704 32.54272 85.9392 80.96256a525.312 525.312 0 0 1 9.46176 90.48576v0.05632a534.3744 534.3744 0 0 1-9.41568 90.50624z m-49.46432-173.92128c-2.96448-15.83104-12.63616-34.35008-30.00832-34.35008h-4.27008a113.96096 113.96096 0 0 1-113.44384-114.176 106.22464 106.22464 0 0 1 4.9408-29.696 133.4016 133.4016 0 0 1 4.94592-14.12096 43.87328 43.87328 0 0 0-14.15168-52.40832l-0.26112-0.1536-0.2048-0.1536-106.74176-59.33568-0.2048-0.1536-0.26112-0.10752a47.77984 47.77984 0 0 0-52.0192 11.72992c-16.69632 18.36544-57.2672 53.13536-91.5456 53.13536-13.824 0-31.05792-6.22592-49.664-18.00704a213.08928 213.08928 0 0 1-41.20576-34.11968 47.77984 47.77984 0 0 0-52.1728-11.3152l-0.256 0.1024-0.20992 0.1536-102.99392 57.94304-0.20992 0.10752-0.26112 0.2048a43.99616 43.99616 0 0 0-14.10048 52.40832 142.47424 142.47424 0 0 1 4.9408 14.12096 105.6256 105.6256 0 0 1 4.9408 29.696 113.98656 113.98656 0 0 1-113.50016 114.176h-4.34688c-17.26976 0.1024-26.89024 18.57536-29.85472 34.35008a466.432 466.432 0 0 0-8.58624 80.896 466.8672 466.8672 0 0 0 8.58624 80.95232c2.96448 15.82592 12.58496 34.35008 29.90592 34.35008h4.352a113.96096 113.96096 0 0 1 113.44896 114.176 105.3952 105.3952 0 0 1-4.9408 29.696 117.02784 117.02784 0 0 1-4.9408 14.11072 43.84256 43.84256 0 0 0 14.20288 52.41344l0.26112 0.1536 0.26112 0.15872 108.544 60.0832 0.256 0.10752 0.31232 0.1024a48.71168 48.71168 0 0 0 52.0192-11.15648c16.384-17.3312 56.22784-50.0224 89.46688-50.0224 32.97792 0 72.61696 32.06656 88.94464 49.03936a48.7936 48.7936 0 0 0 52.17792 10.79296l0.20992-0.1024 0.256-0.15872 104.86272-58.68544 0.26112-0.15872 0.20992-0.1536a43.93984 43.93984 0 0 0 14.14656-52.41344 142.18752 142.18752 0 0 1-4.992-14.11072 107.33056 107.33056 0 0 1-4.8896-29.696 113.98144 113.98144 0 0 1 113.49504-114.176h4.7872c10.61376 0 24.65792-8.97536 29.44512-34.35008h0.04608a478.67392 478.67392 0 0 0 8.58624-80.896 466.65216 466.65216 0 0 0-8.576-80.98304z m-203.8784 142.848a23.95136 23.95136 0 0 1-1.024 8.75008 189.58336 189.58336 0 0 1-73.07264 95.38048 185.856 185.856 0 0 1-107.28448 34.03264 189.48608 189.48608 0 0 1-178.51904-128.8448 24.15104 24.15104 0 0 1-1.024-7.59808 192.12288 192.12288 0 0 1 4.37248-124.21632 24.09472 24.09472 0 0 1 1.39776-6.82496 188.928 188.928 0 0 1 173.76768-116.49024 185.344 185.344 0 0 1 79.04768 17.664 189.29664 189.29664 0 0 1 96.54784 98.9952 23.94112 23.94112 0 0 1 1.536 8.38656 194.41152 194.41152 0 0 1 4.25472 120.75008z m-179.8656-196.98176a142.94016 142.94016 0 1 0 68.29056 267.89888 144.60928 144.60928 0 0 0-26.84416-261.57568 140.98944 140.98944 0 0 0-41.4464-6.33856z" p-id="5428"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1539331790189" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2148" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M260.654545 67.490909v51.2h-6.981818c-18.618182 0-37.236364 0-55.854545 2.327273-46.545455 4.654545-83.781818 44.218182-86.109091 93.090909v628.363636c0 20.945455 2.327273 39.563636 11.636364 58.181818 23.272727 48.872727 62.836364 74.472727 116.363636 74.472728h546.909091c58.181818 0 104.727273-32.581818 121.018182-86.109091 4.654545-13.963636 6.981818-27.927273 6.981818-41.890909V225.745455c0-46.545455-25.6-83.781818-67.490909-97.745455-11.636364-4.654545-23.272727-4.654545-34.909091-4.654545h-48.872727V74.472727c51.2-6.981818 100.072727-6.981818 144.290909 27.927273 34.909091 27.927273 53.527273 62.836364 55.854545 107.054545v633.018182c0 55.854545-18.618182 102.4-60.509091 137.309091-32.581818 30.254545-72.145455 41.890909-116.363636 44.218182H239.709091c-76.8 0-130.327273-37.236364-162.909091-104.727273-11.636364-23.272727-13.963636-46.545455-13.963636-72.145454V225.745455C62.836364 167.563636 88.436364 123.345455 139.636364 93.090909c11.636364-13.963636 27.927273-18.618182 46.545454-20.945454 23.272727-2.327273 48.872727-2.327273 74.472727-4.654546z" p-id="2149"></path><path d="M372.363636 0h276.945455v46.545455h-116.363636v46.545454h93.090909v46.545455h-232.727273V93.090909h93.090909V46.545455h-116.363636c2.327273-16.290909 2.327273-30.254545 2.327272-46.545455zM274.618182 365.381818v-41.890909s2.327273-2.327273 4.654545-2.327273h474.763637v46.545455c-162.909091-2.327273-321.163636-2.327273-479.418182-2.327273zM274.618182 523.636364v-44.218182h477.090909v44.218182H274.618182zM749.381818 640v44.218182H272.290909v-44.218182h477.090909z" p-id="2150"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592968029950" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4682" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M825.611627 483.411895 392.464533 483.411895 392.464533 311.327608c0-75.091232 61.095473-136.186705 136.186705-136.186705 75.096349 0 136.192845 61.095473 136.192845 136.186705 0 25.822109 20.935822 46.75793 46.75793 46.75793 25.822109 0 46.75793-20.935822 46.75793-46.75793 0-126.660748-103.047957-229.702566-229.708705-229.702566S298.948673 184.66686 298.948673 311.327608l0 172.084287-67.25373 0c-25.716708 0-46.75793 21.041222-46.75793 46.75793l0 363.974665c0 25.716708 21.041222 46.75793 46.75793 46.75793l593.916684 0c25.716708 0 46.75793-21.041222 46.75793-46.75793L872.369557 530.168802C872.369557 504.452093 851.328335 483.411895 825.611627 483.411895zM567.353702 706.428178l0 87.700411c0 20.890796-17.093307 37.984103-37.984103 37.984103l-1.430582 0c-20.890796 0-37.984103-17.093307-37.984103-37.984103l0-87.701434c-18.328437-12.419867-30.375821-33.411971-30.375821-57.219189 0-38.149878 30.92636-69.076238 69.075215-69.076238 38.149878 0 69.076238 30.92636 69.076238 69.076238C597.730547 673.016207 585.68214 694.007287 567.353702 706.428178z" p-id="4683" data-spm-anchor-id="a313x.7781069.0.i5" fill="#D7DEE3" class="selected"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592799200925" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6968" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M86.4 824l1-24.6c12.4-65.1 33.7-126.2 74.3-179.9 41.6-55 93.9-95.6 156.4-123.7 8.3-3.7 16.5-7.4 28.1-12.6-30.9-24.6-57.5-50.4-74.2-84.2-42.5-86.3-35.4-168.9 22-245.7C348.1 81 445.8 47.9 532.1 72.6c93.1 26.6 149.2 88.3 168.6 183.6 23.5 115.7-67.6 265.4-230.1 266-114.7 0.4-205.7 52.3-270.9 146.9-44.7 64.9-57.9 138.1-54.5 215.6 0.9 19.7 14.1 14.7 24.5 14.7 111.2 0.2 222.5 0 333.7-0.1 5 0 10.1-0.6 14.9 0.2 17 2.7 27.5 12.8 27 30.1-0.5 17.2-10.9 28.1-28.3 28.8-24.9 1.1-49.8 0.3-74.7 0.3-105.4 0-210.9-0.2-316.3 0.2-17.2 0.1-31.2-3.2-39.2-19.9l-0.4-115z m386.7-361.1c93.1 1.4 172-76.6 171.9-170.1-0.1-92.6-76-168.4-169.9-169.6-91.9-1.2-169.6 76.1-170 168.9-0.4 93.2 74.5 169.4 168 170.8z m0 0" p-id="6969" fill="#409eff"></path><path d="M764.4 956c-33.8 0-67.7 0.2-101.6-0.1-41.6-0.4-69.9-25.3-70.9-67-1.6-71.1-1.5-142.4-0.1-213.5 0.7-36.7 29.8-62.9 66.1-63.3 39-0.4 78.1 0.2 117.2-0.3 14.3-0.2 25 4.7 25.4 19.4 0.4 15.4-9.6 23.1-25.3 23.1-34.7-0.1-69.4 0.5-104.1-0.2-22.6-0.5-33.7 8.1-33.4 32 0.7 64.2 0.6 128.5 0 192.7-0.2 21.7 7.6 31.7 30.5 31.4 64.2-0.8 128.4-0.7 192.7-0.1 22 0.2 31.8-8.6 31.3-30.9-0.8-33.8 0.2-67.7-0.4-101.5-0.3-15.6 6.3-26.5 21.2-27.5 15.3-1 24.5 11.2 24.9 25 1 40.7 2.3 81.7-1.3 122.2-3.3 36.7-31 58-68 58.5-34.7 0.5-69.4 0.1-104.2 0.1z m0 0" p-id="6970" fill="#409eff"></path><path d="M899.4 617.3c15.2-0.4 27 16.6 21 30.6-1.7 4-4.2 7.6-7.2 10.6-63 63.1-126.1 126.2-189.3 189.2-9.3 9.2-20.6 15.2-32.1 4.8-12.8-11.6-6.9-23.7 3-33.9 62.2-63.9 124.5-127.7 187-191.4 4.8-4.8 10-9.7 17.6-9.9z m0 0" p-id="6971" fill="#409eff"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526283646652" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5320" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M885.9 352l0 532.7L139.2 884.7 139.2 139l634.7 0 0-75.2L120.4 63.8c-31.1 0-56.4 25.3-56.4 56.4l0 783.3c0 31.1 25.3 56.4 56.4 56.4l784.3 0c31.1 0 56.4-25.3 56.4-56.4L961.1 352 885.9 352 885.9 352zM885.9 352" p-id="5321"></path><path d="M773.6 541.7c8.3-8.3 12.8-19.3 12.8-30.9 0-11.7-4.6-22.7-12.8-30.9-8.3-8.3-19.3-12.8-30.9-12.8L555 467.1 555 279.3c0-11.7-4.6-22.7-12.8-30.9-8.3-8.3-19.3-12.8-30.9-12.8-11.7 0-22.7 4.6-30.9 12.8-8.3 8.3-12.8 19.3-12.8 30.9L467.6 467.1 279.7 467.1c-11.7 0-22.7 4.6-30.9 12.8-8.3 8.3-12.8 19.3-12.8 30.9 0 11.7 4.6 22.7 12.8 30.9 8.3 8.3 19.3 12.8 30.9 12.8l187.8 0 0 187.8c0 24.1 19.6 43.8 43.8 43.8 11.7 0 22.7-4.6 30.9-12.8 8.3-8.3 12.8-19.3 12.8-30.9L555 554.6l187.8 0C754.4 554.6 765.4 550 773.6 541.7L773.6 541.7zM773.6 541.7" p-id="5322"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526284482639" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3467" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M512 0C229.230204 0 0 229.230204 0 512 0 794.769796 229.230204 1024 512 1024 794.769796 1024 1024 794.769796 1024 512 1024 229.230204 794.769796 0 512 0ZM512 953.37931C268.232934 953.37931 70.62069 755.767066 70.62069 512 70.62069 268.232934 268.232934 70.62069 512 70.62069 755.767066 70.62069 953.37931 268.232934 953.37931 512 953.37931 755.767066 755.767066 953.37931 512 953.37931ZM317.793103 512C317.793103 482.747957 294.079629 459.034483 264.827586 459.034483 235.575543 459.034483 211.862069 482.747957 211.862069 512 211.862069 541.252043 235.575543 564.965517 264.827586 564.965517 294.079629 564.965517 317.793103 541.252043 317.793103 512ZM794.482759 547.310345C813.984115 547.310345 829.793103 531.501356 829.793103 512 829.793103 492.498644 813.984115 476.689655 794.482759 476.689655L406.068966 476.689655C386.567609 476.689655 370.758621 492.498644 370.758621 512 370.758621 531.501356 386.567609 547.310345 406.068966 547.310345L794.482759 547.310345ZM317.793103 335.448276C317.793103 306.196233 294.079629 282.482759 264.827586 282.482759 235.575543 282.482759 211.862069 306.196233 211.862069 335.448276 211.862069 364.700319 235.575543 388.413793 264.827586 388.413793 294.079629 388.413793 317.793103 364.700319 317.793103 335.448276ZM794.482759 370.758621C813.984115 370.758621 829.793103 354.949632 829.793103 335.448276 829.793103 315.94692 813.984115 300.137931 794.482759 300.137931L406.068966 300.137931C386.567609 300.137931 370.758621 315.94692 370.758621 335.448276 370.758621 354.949632 386.567609 370.758621 406.068966 370.758621L794.482759 370.758621ZM317.793103 688.551724C317.793103 659.299681 294.079629 635.586207 264.827586 635.586207 235.575543 635.586207 211.862069 659.299681 211.862069 688.551724 211.862069 717.803767 235.575543 741.517241 264.827586 741.517241 294.079629 741.517241 317.793103 717.803767 317.793103 688.551724ZM794.482759 723.862069C813.984115 723.862069 829.793103 708.05308 829.793103 688.551724 829.793103 669.050368 813.984115 653.241379 794.482759 653.241379L406.068966 653.241379C386.567609 653.241379 370.758621 669.050368 370.758621 688.551724 370.758621 708.05308 386.567609 723.862069 406.068966 723.862069L794.482759 723.862069Z" p-id="3468"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526283705574" class="icon" style="" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6019" xmlns:xlink="http://www.w3.org/1999/xlink" width="128.125" height="128"><defs><style type="text/css"></style></defs><path d="M959.725 0 538.825 0c-17.1 0-33.4 6.8-45.5 18.8L18.825 493.3c-25.1 25.1-25.1 65.8 0 91l420.9 420.9c12.6 12.6 29 18.8 45.5 18.8 16.5 0 32.9-6.3 45.5-18.8l474.5-474.5c12.1-12.1 18.8-28.4 18.8-45.5L1024.025 64.3C1024.025 28.8 995.225 0 959.725 0zM960.025 485.2c0 0.1 0 0.2-0.1 0.2L485.425 959.9c0 0-0.1 0.1-0.1 0.1 0 0-0.1 0-0.1 0-0.1 0-0.1 0-0.1 0 0 0 0 0 0 0 0 0 0 0-0.1-0.1L64.125 539c0 0-0.1-0.1-0.1-0.1 0-0.1 0-0.2 0-0.3 0 0 0 0 0.1-0.1L538.625 64.1c0.1-0.1 0.1-0.1 0.2-0.1l420.9 0c0.1 0 0.1 0 0.1 0 0 0 0 0 0 0 0.1 0 0.2 0.2 0.2 0.2 0 0 0 0 0 0.1L960.025 485.2z" p-id="6020"></path><path d="M704.025 192c-70.7 0-128 57.3-128 128s57.3 128 128 128 128-57.3 128-128S774.725 192 704.025 192zM704.025 384c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64S739.325 384 704.025 384z" p-id="6021"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526284607045" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4194" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M490.479359 397.322168c0 52.616358-42.657542 95.2739-95.274924 95.2739L159.661861 492.596068c-52.617381 0-95.2739-42.658565-95.2739-95.2739L64.387961 161.779593c0-52.617381 42.657542-95.274924 95.2739-95.274924L395.204435 66.50467c52.617381 0 95.274924 42.657542 95.274924 95.274924L490.479359 397.322168zM435.500187 161.779593c0-22.255887-18.040888-40.295751-40.295751-40.295751L159.661861 121.483842c-22.254863 0-40.294728 18.039865-40.294728 40.295751L119.367133 397.322168c0 22.254863 18.039865 40.294728 40.294728 40.294728L395.204435 437.616896c22.254863 0 40.295751-18.039865 40.295751-40.294728L435.500187 161.779593z" p-id="4195"></path><path d="M174.346305 286.423405c-7.597025 0-13.745049-6.148024-13.745049-13.746072l0-24.765033c0-38.066991 25.39539-71.449285 60.321854-71.449285l85.637426 0c7.583722 0 13.745049 6.148024 13.745049 13.745049 0 7.597025-6.161327 13.745049-13.745049 13.745049l-85.637426 0c-21.435195 0-32.831756 23.63735-32.831756 43.959188l0 24.765033C188.091354 280.275381 181.931051 286.423405 174.346305 286.423405z" p-id="4196"></path><path d="M169.112094 333.564052c-3.583618 0-7.154957-1.51654-9.758248-3.986801-2.482541-2.604314-3.986801-6.187933-3.986801-9.759271 0-3.570315 1.503237-7.140631 3.986801-9.758248 5.221932-5.087878 14.282285-5.087878 19.516496 0 2.469238 2.617617 3.986801 6.187933 3.986801 9.758248 0 3.570315-1.51654 7.154957-3.986801 9.624195C176.252725 332.047512 172.682409 333.564052 169.112094 333.564052z" p-id="4197"></path><path d="M957.806927 397.322168c0 52.616358-42.659589 95.2739-95.275947 95.2739L626.989429 492.596068c-52.618405 0-95.274924-42.658565-95.274924-95.2739L531.714506 161.779593c0-52.617381 42.657542-95.274924 95.274924-95.274924l235.541551 0c52.617381 0 95.275947 42.657542 95.275947 95.274924L957.806927 397.322168zM902.826731 161.779593c0-22.255887-18.039865-40.295751-40.295751-40.295751L626.989429 121.483842c-22.254863 0-40.295751 18.039865-40.295751 40.295751L586.693678 397.322168c0 22.254863 18.040888 40.294728 40.295751 40.294728l235.541551 0c22.255887 0 40.295751-18.039865 40.295751-40.294728L902.826731 161.779593z" p-id="4198"></path><path d="M490.479359 864.646666c0 52.617381-42.657542 95.274924-95.274924 95.274924L159.661861 959.921589c-52.617381 0-95.2739-42.658565-95.2739-95.274924L64.387961 629.106138c0-52.617381 42.657542-95.2739 95.2739-95.2739L395.204435 533.832238c52.617381 0 95.274924 42.657542 95.274924 95.2739L490.479359 864.646666zM435.500187 629.106138c0-22.254863-18.040888-40.295751-40.295751-40.295751L159.661861 588.810387c-22.254863 0-40.294728 18.040888-40.294728 40.295751l0 235.541551c0 22.254863 18.039865 40.296775 40.294728 40.296775L395.204435 904.944464c22.254863 0 40.295751-18.041912 40.295751-40.296775L435.500187 629.106138z" p-id="4199"></path><path d="M957.806927 864.646666c0 52.617381-42.659589 95.274924-95.275947 95.274924L626.989429 959.921589c-52.618405 0-95.274924-42.658565-95.274924-95.274924L531.714506 629.106138c0-52.617381 42.657542-95.2739 95.274924-95.2739l235.541551 0c52.617381 0 95.275947 42.657542 95.275947 95.2739L957.806927 864.646666zM902.826731 629.106138c0-22.254863-18.039865-40.295751-40.295751-40.295751L626.989429 588.810387c-22.254863 0-40.295751 18.040888-40.295751 40.295751l0 235.541551c0 22.254863 18.040888 40.296775 40.295751 40.296775l235.541551 0c22.255887 0 40.295751-18.041912 40.295751-40.296775L902.826731 629.106138z" p-id="4200"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526284445051" class="icon" style="" viewBox="0 0 1045 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2364" xmlns:xlink="http://www.w3.org/1999/xlink" width="130.625" height="128"><defs><style type="text/css"></style></defs><path d="M1031.975006 202.254269 501.464325 753.980748 308.593431 753.980748 308.593431 561.109854 841.032821 11.312084C856.115325-3.770421 880.53278-3.770421 895.615284 11.312084L1031.975006 147.671806C1047.05751 162.754309 1047.05751 187.171764 1031.975006 202.254269ZM868.304766 93.127916 385.741788 599.684033 385.741788 676.83239 462.890146 676.83239 950.159172 174.982324 868.304766 93.127916ZM540.038504 98.181134 77.148358 98.181134 77.148358 946.813068 925.780291 946.813068 925.780291 483.922922C925.780291 455.956643 933.958018 450.170516 961.924298 450.170516 989.929151 450.170516 1002.928649 455.956643 1002.928649 483.922922L1002.928649 946.813068C1002.928649 984.075724 963.042948 1023.961426 925.780291 1023.961426L77.148358 1023.961426C39.885701 1023.961426 0 984.075724 0 946.813068L0 98.181134C0 60.879903 39.885701 21.032776 77.148358 21.032776L540.038504 21.032776C568.004783 21.032776 573.79091 34.070849 573.79091 62.037129 573.79091 89.964834 568.004783 98.181134 540.038504 98.181134Z" p-id="2365"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1539331929446" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4013" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M896.021502 255.956996 607.897867 255.956996c-17.717453 0-31.994625-14.277171-31.994625-31.994625 0-17.717453 14.277171-31.994625 31.994625-31.994625l287.951621 0c17.717453 0 31.994625 14.277171 31.994625 31.994625C928.016126 241.679825 913.738955 255.956996 896.021502 255.956996zM896.021502 415.930119 607.897867 415.930119c-17.717453 0-31.994625-14.277171-31.994625-31.994625s14.277171-31.994625 31.994625-31.994625l287.951621 0c17.717453 0 31.994625 14.277171 31.994625 31.994625S913.738955 415.930119 896.021502 415.930119zM896.021502 672.05913 607.897867 672.05913c-17.717453 0-31.994625-14.277171-31.994625-31.994625s14.277171-31.994625 31.994625-31.994625l287.951621 0c17.717453 0 31.994625 14.277171 31.994625 31.994625S913.738955 672.05913 896.021502 672.05913zM896.021502 832.032253 607.897867 832.032253c-17.717453 0-31.994625-14.277171-31.994625-31.994625s14.277171-31.994625 31.994625-31.994625l287.951621 0c17.717453 0 31.994625 14.277171 31.994625 31.994625S913.738955 832.032253 896.021502 832.032253zM383.935495 479.919368 191.967747 479.919368c-52.980346 0-95.983874-43.003528-95.983874-95.983874L95.983874 191.967747c0-52.980346 43.003528-95.983874 95.983874-95.983874l191.967747 0c52.980346 0 95.983874 43.003528 95.983874 95.983874l0 191.967747C479.919368 436.915841 436.915841 479.919368 383.935495 479.919368zM191.967747 159.973123c-17.545439 0-31.994625 14.449185-31.994625 31.994625l0 191.967747c0 17.545439 14.449185 31.994625 31.994625 31.994625l191.967747 0c17.545439 0 31.994625-14.449185 31.994625-31.994625L415.930119 191.967747c0-17.545439-14.449185-31.994625-31.994625-31.994625L191.967747 159.973123 191.967747 159.973123zM383.935495 928.016126 191.967747 928.016126c-52.980346 0-95.983874-43.003528-95.983874-95.983874L95.983874 639.892491c0-52.980346 43.003528-95.983874 95.983874-95.983874l191.967747 0c52.980346 0 95.983874 43.003528 95.983874 95.983874l0 191.967747C479.919368 884.840585 436.915841 928.016126 383.935495 928.016126zM191.967747 607.897867c-17.545439 0-31.994625 14.277171-31.994625 31.994625l0 191.967747c0 17.717453 14.449185 31.994625 31.994625 31.994625l191.967747 0c17.545439 0 31.994625-14.277171 31.994625-31.994625L415.930119 639.892491c0-17.717453-14.449185-31.994625-31.994625-31.994625L191.967747 607.897867 191.967747 607.897867z" p-id="4014"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526284415679" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1677" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M896 256v576a128 128 0 0 1-128 128H256a128 128 0 0 1-128-128V256H64V192h192V128a64 64 0 0 1 64-64h384a64 64 0 0 1 64 64v64h192v64h-64z m-192-128H320v64h384V128z m128 128H192v576a64 64 0 0 0 64 64h512a64 64 0 0 0 64-64V256zM576 384h64v384H576V384zM384 384h64v384H384V384z" p-id="1678"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526283372703" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2234" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M919.096192 1.803429 106.384339 1.803429c-57.74173 0-104.670881 46.928152-104.670881 104.670881l0 812.855807c0 57.74173 46.928152 104.669882 104.670881 104.669882l812.78383 0c57.74173 0 104.669882-46.928152 104.669882-104.669882L1023.838051 106.402334C1023.768073 48.659604 976.836923 1.803429 919.096192 1.803429zM826.535479 292.242533l-2.161316 1.153635-0.288909 2.450225C801.808303 449.608741 667.944658 565.597042 512.739766 565.597042c-155.202893 0-289.069537-115.988301-311.344489-269.750649l-0.359886-2.450225-2.163316-1.153635c-15.427119-9.155103-24.654199-24.654199-24.654199-41.666816 0-26.96047 21.915066-48.875535 48.947513-48.875535 26.96047 0 48.875535 21.915066 48.875535 48.875535 0 14.201507-6.41597 27.46531-18.166252 37.196231l-2.30727 1.80243 0.50484 2.884087c20.5445 128.963195 130.189807 222.533589 260.667523 222.533589 130.478716 0 240.123024-93.641371 260.667523-222.533589l0.50584-2.81211-2.235293-1.80243c-11.822259-9.803898-18.166252-22.995724-18.166252-37.197231 0-26.96047 21.915066-48.875535 48.875535-48.875535l0 0 0 0 0 0c27.032447 0 48.947513 21.914066 48.947513 48.875535C851.261655 267.589333 842.034575 283.088429 826.535479 292.242533z" p-id="2235"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592798464785" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1473" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M959.5 776.4c-2.1-55.9-27.1-329.9-317.8-342v-88.1c0.4-5 0.2-16.3-7.6-25.2-9-10.2-23.4-12.6-40.1-5.4l-3.9 1.7-163.2 177.5c-3.3 3.9-17.2 21.2-17.2 41.5 0 21.2 17.2 39.3 20.7 42.7l163.5 188.1c4.2 4.5 14.2 13.7 27.2 13.7 10.1 0 19.1-5.7 24-15.1 3.4-6.5 5-14.7 5-25.7V633.2c47.1-1.2 184.7 8.5 264.9 154.7 5.2 9.5 13.4 15 22.4 15h8.5l6.9-6.6c7.2-7.3 6.8-16.8 6.7-19.9zM656.9 592.9c-18 0-29.2 1.6-29.7 1.6l-17.3 2.5v127.4L459.7 551.6c-5.3-5.4-9.7-12.6-9.8-15.3 0-4.1 4.1-11.4 7.2-15l144.5-157.1-0.1 109.8h20.1c207.1 0 270.6 140.9 289.9 236.9-87-105.2-203.6-118-254.6-118zM523.4 326.8c0-17.5-14.2-31.8-31.8-31.8H267.9c-17.6 0-31.8 14.2-31.8 31.8s14.2 31.8 31.8 31.8h223.8c17.5-0.1 31.7-14.3 31.7-31.8zM352.2 575.4h-84.3c-17.6 0-31.8 14.2-31.8 31.8s14.2 31.8 31.8 31.8h84.3c17.5 0 31.8-14.2 31.8-31.8-0.1-17.5-14.3-31.7-31.8-31.8zM409.7 467c0-17.5-14.2-31.8-31.8-31.8h-110c-17.6 0-31.8 14.2-31.8 31.8s14.2 31.8 31.8 31.8H378c17.5 0 31.7-14.3 31.7-31.8z m0 0" p-id="1474" fill="#409eff"></path><path d="M805.6 747.7c-0.4-0.1-0.9-0.2-1.3-0.3l-4.7 53.6c0 31-29.8 56.2-60.9 56.2H181.3c-31 0-56.2-25.2-56.2-56.2V220.3c0-1 0-1.9 0.1-2.9 1.5-29.7 26.1-53.4 56.2-53.4H762c30.1 0 54.6 23.7 56.2 53.4 0 1 0.1 1.9 0.1 2.9v18.2l4.7 159.3c26.4 17.6 28.2 35.3 56.4 62.1V215.5c0-13.2-2.3-26.3-6.8-38.7C856.8 133.7 815.5 103 767 103H176.5c-52.4 0-96.4 35.8-108.9 84.3-2.4 9.2-3.6 18.6-3.5 28.1v590.3c0 62.1 50.3 112.5 112.4 112.5h168.7v1.1h84.3v-1.1h84.3v1.1h84.3v-1.1h168.7c57.1 0 104.2-42.5 111.5-97.7 0 0-0.7-2.3-2.2-6.1-22.8-37.7-45.3-45.6-70.5-66.7z m0 0" p-id="1475" fill="#409eff"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592967924437" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3545" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M845.824 220.34432c-10.07616-9.29792-23.26528-13.94688-36.39296-13.94688-1.55648 0-2.33472 0-3.87072 0-0.77824 0-9.29792 0.77824-22.46656 0.77824-22.46656 0-65.04448-1.55648-106.06592-11.61216-52.67456-12.36992-113.84832-70.4512-131.66592-82.08384-8.4992-5.4272-19.3536-8.51968-29.42976-8.51968-10.05568 0-20.11136 3.09248-29.40928 8.51968-2.31424 1.55648-65.80224 67.35872-127.75424 82.08384-41.04192 10.05568-85.17632 11.61216-106.84416 11.61216-13.94688 0-22.44608-0.77824-23.22432-0.77824-0.77824 0-2.33472 0-3.09248 0-13.94688 0-26.33728 4.64896-36.39296 13.94688-10.83392 9.29792-17.01888 23.22432-17.01888 37.1712l0 128.512c0 473.88672 321.31072 535.01952 334.47936 537.35424 3.09248 0.77824 6.20544 0.77824 9.27744 0.77824 3.09248 0 6.22592 0 9.3184-0.77824 13.9264-2.33472 336.7936-63.488 336.7936-537.35424l0-128.512C862.06464 243.56864 855.83872 229.64224 845.824 220.34432L845.824 220.34432zM726.56896 403.8656 504.34048 619.08992c-1.55648 2.33472-3.09248 4.66944-5.4272 6.22592-6.20544 6.18496-14.70464 9.27744-23.22432 9.27744-8.54016 0-17.03936-3.09248-24.00256-9.27744-1.55648-1.55648-3.85024-3.87072-4.64896-6.22592l-119.23456-115.36384c-12.3904-12.3904-12.3904-31.72352 0-44.11392 12.36992-12.41088 33.28-12.41088 45.6704 0l102.21568 98.32448 205.18912-198.20544c13.18912-12.3904 33.28-12.3904 45.6704 0C739.71712 371.34336 739.71712 391.4752 726.56896 403.8656L726.56896 403.8656z" p-id="3546" fill="#D7DEE3"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582825105" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7322" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24"><defs><style type="text/css"></style></defs><path d="M707.296 274.272c0-44.512-7.456-79.2-27.296-98.976-19.744-22.208-51.936-37.088-94.016-37.088h-79.136v269.728h74.208c42.048 0 76.736-12.384 96.544-37.088 19.776-19.84 29.696-54.496 29.696-96.576z" p-id="7323"></path><path d="M588.512 952.288H130.688c-42.048 0-79.2-32.16-79.2-74.208V516.8h742.368c24.704 0 49.472 2.432 49.472 4.96V135.744c0-69.344-51.936-123.744-118.784-123.744H130.688C61.44 12 2.016 68.896 2.016 135.744v742.304c0 69.312 59.424 123.712 128.672 123.712h512.256c-19.84-12.32-37.152-29.632-54.432-49.472z m-121.28-848.704h123.744c51.968 0 94.048 17.28 121.184 49.504 22.336 29.664 37.152 69.216 37.152 121.216 0 51.968-14.816 94.048-42.016 123.776-29.728 32.128-69.28 49.472-123.712 49.472h-118.816V103.584h2.464z m-235.104 0h39.584l136.096 341.472H365.76l-37.152-99.008H175.232l-37.12 99.008H96.032L232.128 103.584z" p-id="7324"></path><path d="M254.432 155.52L190.048 313.888h123.776L254.432 155.52z m259.808 492.416H118.304a24.768 24.768 0 0 0 0 49.504H514.24c12.352 0 24.768-12.352 24.768-24.736 0-12.416-12.416-24.768-24.768-24.768z m0 143.52H118.304a24.8 24.8 0 0 0-24.736 24.736c0 14.88 9.888 24.736 24.736 24.736H514.24a24.832 24.832 0 0 0 24.768-24.736c0-12.32-12.416-24.736-24.768-24.736z m507.296-37.12l-12.448-61.856c-4.928-17.376-22.24-32.224-39.52-34.624l-24.736-2.528c-2.464 0-2.464 0-4.896-2.432v-9.92l2.432-24.768c2.464-19.776-7.392-39.552-24.768-47.008L860.704 544h-2.432c-4.96-2.464-9.92-2.464-14.88-2.464-12.352 0-24.736 4.928-32.16 12.352l-17.312 17.312-4.928 4.928c-2.496 0-2.496-2.4-4.96-4.928l-17.376-17.312c-7.392-7.392-19.744-12.352-32.096-12.352-9.952 0-17.376 2.464-19.808 4.928l-56.896 27.264c-14.848 9.888-27.264 27.2-24.736 44.48l2.432 27.264v4.96s-4.928 2.464-7.392 2.464l-22.272 2.432c-17.28 2.528-34.656 14.88-39.584 34.688l-12.352 61.92c-4.96 17.248 2.464 37.024 19.776 49.44l19.808 12.416 7.424 7.392c0 2.464 0 2.464-2.528 4.928l-14.784 22.272c-9.952 14.784-9.952 37.088 2.4 51.936l39.648 51.936c9.856 9.92 22.272 17.376 34.624 17.376 4.928 0 9.888 0 14.848-2.496l24.704-7.424h7.456c0 2.464 2.432 2.464 2.432 4.96l7.392 22.24c4.928 19.808 24.736 29.728 42.048 29.728h61.92c17.344 0 34.592-12.416 39.552-29.728l7.424-22.24c0-2.496 2.464-2.496 2.464-4.96h7.424l19.808 7.424c4.896 2.496 12.352 2.496 14.848 2.496 14.848 0 29.696-7.456 37.056-17.376l39.616-49.408c9.888-12.416 12.384-34.752 2.464-51.968l-12.384-19.808c0-2.464-2.432-4.96-2.432-7.424l4.96-4.96 22.176-12.416c12.448-14.816 19.904-37.088 17.44-51.936z m-42.112 7.488l-22.24 14.816c-4.928 4.96-19.808 17.312-22.24 29.664-2.496 12.416 2.432 29.728 9.888 37.152l14.816 22.272-37.024 52h-2.56l-24.704-7.52c-17.312-4.864-34.656 0-39.616 2.56-9.888 4.96-19.776 19.776-24.672 29.664l-7.424 22.272-2.464 2.464h-64.352l-9.92-19.776c-2.432-12.352-12.352-27.264-22.272-32.16-7.424-5.024-17.28-5.024-19.808-5.024-7.36 0-14.816 2.56-24.736 5.024l-22.208 7.456h-4.992l-37.088-49.6v-4.96l12.384-19.712c7.392-9.952 12.384-24.736 9.952-39.648-2.528-14.816-17.344-27.168-24.768-32.128l-22.24-12.416s-2.464-2.4 0-2.4l14.816-64.352 22.272-2.496c12.384 0 29.728-7.424 37.12-17.312 7.392-9.856 12.384-24.736 9.92-37.152l-2.496-24.672c0-2.528 2.496-4.96 2.496-4.96l54.432-24.736h4.96l17.312 17.312c9.92 7.424 22.24 14.816 34.624 14.816 12.416 0 29.696-7.36 34.656-17.28l17.344-17.312h2.432l56.928 24.736 2.432 2.464-2.432 24.672c0 4.96 0 24.736 9.888 37.184 4.96 7.424 17.344 14.816 34.656 17.312l22.24 2.464 2.496 2.464 12.352 59.36v7.488h-0.16z" p-id="7325"></path><path d="M788.928 665.248c-61.888 0-113.856 51.936-113.856 113.888 0 61.856 51.968 113.856 113.856 113.856 59.36 0 111.328-52 113.792-113.856 0-61.952-51.936-113.888-113.792-113.888z m0 183.168c-39.616 0-71.808-32.192-71.808-71.776s32.192-71.712 71.808-71.712c37.024 0 69.28 32.128 71.712 71.712-2.432 42.048-34.656 71.776-71.712 71.776z" p-id="7326"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582872263" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8264" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24"><defs><style type="text/css"></style></defs><path d="M695.466667 535.466667h-153.6v-78.933334h147.2v-59.733333h-130.133334l108.8-108.8-38.4-38.4-117.333333 117.333333-117.333333-117.333333-38.4 38.4 108.8 108.8h-130.133334v59.733333h147.2v78.933334h-153.6V597.333333h153.6v177.066667h59.733334V597.333333h153.6z" fill="" p-id="8265"></path><path d="M870.4 936.533333H153.6c-53.333333 0-96-38.4-96-87.466666V661.333333c0-14.933333 12.8-25.6 25.6-25.6 68.266667 0 121.6-55.466667 121.6-121.6 0-68.266667-55.466667-121.6-121.6-121.6-14.933333 0-25.6-12.8-25.6-25.6V172.8c0-49.066667 42.666667-87.466667 96-87.466667h716.8c53.333333 0 96 38.4 96 87.466667V362.666667c0 14.933333-12.8 25.6-25.6 25.6-68.266667 0-121.6 55.466667-121.6 121.6 0 68.266667 55.466667 121.6 121.6 121.6 14.933333 0 25.6 12.8 25.6 25.6v189.866666c0 53.333333-42.666667 89.6-96 89.6zM110.933333 684.8v166.4c0 19.2 19.2 34.133333 42.666667 34.133333h716.8c23.466667 0 42.666667-14.933333 42.666667-34.133333v-166.4c-83.2-12.8-149.333333-85.333333-149.333334-172.8s64-160 149.333334-172.8V172.8c0-19.2-19.2-34.133333-42.666667-34.133333H153.6c-23.466667 0-42.666667 14.933333-42.666667 34.133333v166.4c83.2 12.8 149.333333 85.333333 149.333334 172.8s-64 160-149.333334 172.8z" fill="" p-id="8266"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1542099977341" class="icon" style="" viewBox="0 0 1040 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1384" xmlns:xlink="http://www.w3.org/1999/xlink" width="54.84375" height="54"><defs><style type="text/css"></style></defs><path d="M984.104361 326.757019C933.414889 208.820979 838.555427 114.26851 720.236672 63.756069c31.996738-25.119097 72.263837-40.220027 116.151393-40.220027 103.862509 0 188.064236 83.923388 188.064236 187.452299C1024.453325 254.725472 1009.297137 294.866704 984.104361 326.757019zM976.434681 534.080901c0 122.913401-48.40443 234.320747-126.857223 317.182966l64.928778 64.711837c8.587586 8.563026 13.906731 20.391423 13.906731 33.464159 0 26.137287-21.258163 47.327912-47.487547 47.327912-13.106506 0-24.977881-5.300726-33.564443-13.863752l-69.749574-69.51319c-75.249845 52.398394-166.623925 83.376942-265.383206 83.376942-98.56997 0-189.785437-30.846542-264.950348-83.051531l-69.257364 69.029166c-8.696056 8.67252-20.700461 14.022365-33.957393 14.022365-26.520003 0-48.02069-21.431102-48.02069-47.868217 0-13.214976 5.376451-25.178449 14.06432-33.841759l64.402799-64.184835c-78.218456-82.829474-126.489856-194.070021-126.489856-316.792063 0-255.531837 207.833489-462.687898 464.207507-462.687898C768.608356 71.393004 976.434681 278.549064 976.434681 534.080901zM512.228197 167.119205c-203.332988 0-368.164081 164.305113-368.164081 366.961696 0 202.663746 164.832116 366.961696 368.164081 366.961696 203.323778 0 368.163057-164.298973 368.163057-366.961696C880.391255 331.423295 715.551976 167.119205 512.228197 167.119205zM704.314027 581.944002 512.228197 581.944002c-26.520003 0-48.021713-21.425985-48.021713-47.862078L464.206484 278.808984c0-26.435069 21.502733-47.863101 48.021713-47.863101 26.50977 0 48.019667 21.428032 48.019667 47.863101l0 207.40984L704.314027 486.218824c26.510794 0 48.02069 21.424962 48.02069 47.862078C752.334717 560.518017 730.824821 581.944002 704.314027 581.944002zM41.209564 333.240687c-25.736151-32.570813-41.210587-73.572646-41.210587-118.251218C0 109.25124 85.995583 23.536043 192.084807 23.536043c44.819788 0 85.962837 15.425318 118.635981 41.078581C189.876512 116.213815 92.974531 212.787314 41.209564 333.240687z" p-id="1385"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582669216" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6031" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24"><defs><style type="text/css"></style></defs><path d="M451.854 95.981c0.024-0.064 0.048-0.145 0.081-0.145-0.081-0.064-0.097 0-0.081 0.145z" p-id="6032"></path><path d="M142.588 440.622c-0.015 0.01-0.03 0.021-0.037 0.017 0.006 0.016 0.019 0.006 0.037-0.017zM520.419 629.913c-15.925 0-28.761 5.461-38.505 16.381-9.746 10.92-14.619 27.388-14.619 49.404 0 21.667 5.003 38.092 15.011 49.272 10.005 11.182 22.71 16.772 38.113 16.772 15.401 0 28.04-5.548 37.917-16.643 9.876-11.095 14.814-27.735 14.814-49.926 0-21.927-4.81-38.286-14.423-49.075-9.617-10.789-22.385-16.185-38.308-16.185z" p-id="6033"></path><path d="M854.456 823.017c5.906-8.442 10.995-17.81 15.102-28.309C987.665 491.696 579.58 48.843 537.014 3.807c0.1 0.165 0.207 0.363 0.298 0.529-2.627-2.792-4.105-4.329-4.105-4.329 6.212 28.647 10.144 55.329 12.242 80.458-0.115-0.867-0.189-1.702-0.307-2.569 2.983 33.158 2.553 63.407-0.651 91.353-0.496 4.229-1 8.467-1.62 12.597-0.098 0.668-0.23 1.33-0.33 1.99-20.503 130.632-104.734 208.479-194.253 289.646-23.411-22.543-37.247-55.049-37.238-102.811 0.083-21.742 2.999-46.622 9.186-75.154l-0.207 0.141c0.074-0.354 0.132-0.685 0.207-1.048 0 0-63.854 41.285-116.968 119.19-0.009-0.008-0.017-0.025-0.017-0.025-0.182 0.264-0.355 0.563-0.545 0.827-3.403 5.022-6.766 10.16-10.053 15.48-0.157 0.239-0.298 0.495-0.447 0.735a430.615 430.615 0 0 0-8.847 15.075 376.645 376.645 0 0 0-1.991 3.569c-2.883 5.253-5.716 10.605-8.434 16.116-0.133 0.272-0.281 0.537-0.414 0.809a407.245 407.245 0 0 0-8.095 17.627c-0.627 1.446-1.223 2.917-1.833 4.371a380.69 380.69 0 0 0-5.89 14.935c-0.528 1.421-1.074 2.808-1.586 4.229-1.09 3.058-2.115 6.163-3.139 9.285-0.025 0.066-0.05 0.132-0.066 0.198-1.049 3.172-2.098 6.345-3.064 9.582-0.396 1.306-0.744 2.66-1.123 3.982a368.612 368.612 0 0 0-4.296 16.331 316.228 316.228 0 0 0-1.338 5.69c-1.537 6.873-2.958 13.812-4.122 20.933 0 0.05-0.017 0.1-0.017 0.148a329.55 329.55 0 0 0-1.727 11.696c-0.032 0.266-0.065 0.529-0.099 0.794a352.944 352.944 0 0 0-1.272 11.283c-0.05 0.43-0.083 0.86-0.124 1.298a391.231 391.231 0 0 0-0.884 11.044c-0.033 0.545-0.066 1.106-0.091 1.651a358.25 358.25 0 0 0-0.504 10.922l-0.05 1.949a366.226 366.226 0 0 0-0.124 10.87v2.164c0.033 3.618 0.115 7.253 0.256 10.912 0.025 0.769 0.042 1.545 0.083 2.313 0.157 3.659 0.363 7.344 0.62 11.044 0.074 0.793 0.115 1.57 0.173 2.362 0.281 3.733 0.636 7.492 1.024 11.268 0.083 0.784 0.157 1.553 0.248 2.33 0.413 3.849 0.917 7.723 1.454 11.614 0.107 0.734 0.207 1.462 0.306 2.197 0.578 3.989 1.23 8.028 1.933 12.076 0.124 0.645 0.214 1.289 0.338 1.933a392.635 392.635 0 0 0 2.495 12.771c0.099 0.479 0.19 0.958 0.281 1.438a451.803 451.803 0 0 0 3.18 13.745c0.05 0.231 0.1 0.454 0.157 0.677 4.874 19.627 11.234 39.84 19.346 60.657 4.097 10.499 9.186 19.866 15.101 28.309 69.223 121.396 265.021 200.978 265.021 200.978v-0.008c-0.676-0.277-56.816-23.185-119.421-62.98 62.605 39.796 118.746 62.702 119.421 62.973l0.033 0.016v-0.033c0.041 0.018 0.083 0.033 0.083 0.033 3.709-34.05 18.495-57.277 40.477-73.716-0.017-0.018-0.042-0.018-0.058-0.033 0.124-0.083 0.256-0.166 0.38-0.256 4.436-3.296 9.161-6.32 14.15-9.104 0.264-0.149 0.528-0.29 0.793-0.438 4.998-2.75 10.251-5.261 15.745-7.558 0.165-0.066 0.314-0.141 0.479-0.207 39.089 16.208 66.787 42.806 72.065 91.312 0 0 0.024-0.016 0.033-0.016v0.016s42.739-17.38 95.334-48.258c-0.066 0.066-0.132 0.141-0.198 0.215 60.06-35.229 133.083-88.122 170.048-152.933zM312.641 952.532z m82.736-161.03h-38.636v-83.667h-75.704v83.667h-38.636V600.154h38.636v75.313h75.704v-75.313h38.636v191.348zM587.9 768.594c-16.796 17.448-39.245 26.171-67.352 26.171-28.454 0-51.08-8.679-67.872-26.038-16.795-17.361-25.192-41.268-25.192-71.726 0-19.489 2.915-35.847 8.746-49.075 4.35-9.746 10.289-18.491 17.816-26.236 7.526-7.743 15.771-13.486 24.734-17.229 11.92-5.045 25.669-7.57 41.246-7.57 28.192 0 50.751 8.747 67.678 26.235 16.922 17.49 25.386 41.813 25.386 72.965 0.001 30.89-8.398 55.058-25.19 72.503z m41.637-136.071v-32.369h152.061v32.369H724.95v158.979h-38.635V632.523h-56.778z" p-id="6034"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582554734" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5148" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24"><defs><style type="text/css"></style></defs><path d="M987.04 533.208c-15.951-18.618-12.415-26.62 0.947-42.956 69.21-84.716 31.696-201.788-74.55-229.604-26.705-6.985-38.047-14.813-28.855-37.193C887.36 116.06 783.764 43.795 682.875 81.34c-23.697 8.815-32.08 6.967-46.299-13.836-61.223-89.51-188.549-89.59-249.31 0.046-14.453 21.302-23.543 22.162-46.413 13.935-103.4-37.228-208.124 36.36-201.084 142.258 1.774 26.523-6.729 30.735-29.426 36.824C4.276 289.07-34.412 407.945 35.925 490.36c15.47 18.123 13.656 25.996-0.449 43.293-70.264 86.13-30.09 202.613 79.444 230.943 20.223 5.23 26.623 9.243 25.28 31.722-6.748 112.214 95.964 184.444 205.302 144.714 20.503-7.474 27.514-5.58 39.599 12.37 63.32 94.021 190.484 93.64 253.87-0.987 12.649-18.874 19.977-18.476 39.684-11.11 108.264 40.473 214.39-35.934 204.702-147.362-1.786-20.577 3.608-23.863 22.703-28.612 112.563-27.945 154.277-146.564 80.98-232.123zM214.635 718.206l-58.778-168.943c-5.088-14.651 0.203-24.952 15.841-30.861 8.91-1.167 16.832 0.137 23.728 3.87l145.283 92.081 1.251-0.417-39.036-112.224c-5.094-14.652 0.198-24.953 15.842-30.879 15.358-4.114 25.992 1.052 31.941 15.43l58.743 168.945c4.003 14.153-1.552 23.656-16.633 28.532-8.383 2.727-16.022 2.202-22.93-1.595l-144.888-90.879-1.251 0.4L262.37 702.74c3.984 14.16-1.557 23.657-16.634 28.557-15.906 5.165-26.288 0.798-31.1-13.09zM436.72 645.1l-56.748-163.14c-5.638-16.216-0.63-27.26 15.033-33.188l80.433-26.002c13.675-3.588 23.494 0.56 29.48 12.35 3.127 14.432-2 23.82-15.393 28.157l-56.562 18.286 14.895 42.813 52.794-17.054c14.799-3.062 25.146 1.305 31.133 13.102 2.858 13.662-2.662 23.165-16.634 28.533l-52.794 17.077 15.694 45.113 59.09-19.083c14.518-3.824 24.338 0.319 29.479 12.34 3.127 14.426-2.002 23.814-15.393 28.152l-82.95 26.829c-15.391 4.132-25.906-0.652-31.557-14.285z m178.89-56.54l-97.827-148.59c-2.763-2.52-4.381-5.848-4.878-10.025-3.194-11.831 2.068-20.803 15.788-26.955 13.392-4.321 24.753 0.156 34.047 13.449l69.852 116.436 1.276-0.415-3.609-143.006c0.431-12.131 6.813-20.647 19.114-25.476 12.001-3.027 22.386 0.063 31.169 9.214l86.55 116.21 1.277-0.409-15.823-133.895c-3.146-14.442 2.696-24.483 17.507-30.127 13.92-2.773 23.745 1.322 29.461 12.34 1.361 3.887 2.115 7.504 2.367 10.838l16.135 175.004c-1.042 15.783-9.107 26.13-24.188 30.97-16.785 5.437-29.93 2.41-39.535-9.081l-77.538-102.363 2.133 126.764c-1.306 15.004-9.49 24.935-24.59 29.811-17.62 5.66-30.532 2.118-38.688-10.694z m0 0" fill="" p-id="5149"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582717560" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6519" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24"><defs><style type="text/css"></style></defs><path d="M868.8 98.2H157.3c-32.7 0-59.3 26.5-59.3 59.3V869c0 32.7 26.5 59.3 59.3 59.3h711.5c32.7 0 59.3-26.5 59.3-59.3V157.5c0-32.7-26.6-59.3-59.3-59.3z m-18.5 704.1c0 26.6-21.6 48.2-48.2 48.2H224c-26.6 0-48.2-21.6-48.2-48.2V224.2c0-26.6 21.6-48.2 48.2-48.2h578.1c26.6 0 48.2 21.6 48.2 48.2v578.1z" p-id="6520"></path><path d="M275.9 631.8h118.6v177.9H275.9zM453.7 631.8h118.6v177.9H453.7zM631.6 631.8h118.6v177.9H631.6zM216.6 216.8h592.9V454H216.6z" p-id="6521"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1541582420630" class="icon" style="" viewBox="0 0 1031 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3681" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.1640625" height="24"><defs><style type="text/css"></style></defs><path d="M320 275.2C320 275.2 320 275.2 320 275.2l0 467.2c0 0 0 0 0 0l147.2-128C480 614.4 499.2 608 512 608s32 6.4 44.8 12.8l147.2 128c0 0 0 0 0 0L704 281.6c0 0 0 0 0 0L320 281.6z" p-id="3682"></path><path d="M889.6 0 134.4 0C57.6 0 0 57.6 0 134.4l0 761.6C0 966.4 57.6 1024 134.4 1024l761.6 0c70.4 0 134.4-57.6 134.4-134.4L1030.4 134.4C1024 57.6 966.4 0 889.6 0zM768 742.4c0 38.4-32 64-64 64-12.8 0-32-6.4-44.8-19.2L512 672l-147.2 121.6c-25.6 19.2-64 19.2-89.6 0C262.4 780.8 256 761.6 256 742.4L256 281.6c0-38.4 32-64 64-64L704 217.6c38.4 0 64 32 64 64L768 742.4z" p-id="3683"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1511504440567" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5070" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M568.6 0h454.9v454.9H568.6V0z m0 568.6h454.9v454.9H568.6V568.6zM0 568.6h454.9v454.9H0V568.6zM0 0h454.9v454.9H0V0z" fill="" p-id="5071"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1542700646737" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2301" xmlns:xlink="http://www.w3.org/1999/xlink" width="54" height="54"><defs><style type="text/css"></style></defs><path d="M983.696 422.704A480 480 0 1 0 40.72 602.72a469.456 469.456 0 0 0 69.44 172.688 36.4 36.4 0 1 0 60.672-40.24 408.16 408.16 0 0 1 3.664-452.224 400.832 400.832 0 0 1 260.24-171.2 407.136 407.136 0 1 1-112.576 760.288 36.8 36.8 0 0 0-34.352 65.12 477.024 477.024 0 0 0 223.68 54.88 467.984 467.984 0 0 0 89.92-8.784A481.424 481.424 0 0 0 983.712 422.72z" p-id="2302"></path><path d="M471.712 579.84h-130.768a36.944 36.944 0 0 0 0 73.888h130.768v116.8a36.944 36.944 0 1 0 73.888 0v-116.8h130.768a36.944 36.944 0 1 0 0-73.888H545.6v-71.664a22.784 22.784 0 0 0-0.736-7.392h131.504a36.944 36.944 0 1 0 0-73.888H341.68a36.944 36.944 0 1 0 0 73.888h131.504a25.152 25.152 0 0 0-0.736 7.392v71.664z" p-id="2303"></path><path d="M405.968 383.312a37.104 37.104 0 0 0 52.464-52.464l-79.792-79.792a37.104 37.104 0 1 0-52.464 52.464z" p-id="2304"></path><path d="M602.48 383.312l79.792-79.792a37.088 37.088 0 1 0-52.448-52.464l-79.792 79.792a36.576 36.576 0 0 0 0 52.464 37.936 37.936 0 0 0 52.448 0z" p-id="2305"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1542700697957" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3201" xmlns:xlink="http://www.w3.org/1999/xlink" width="54" height="54"><defs><style type="text/css"></style></defs><path d="M38.16448 558.0288v419.90144c0 33.01376 51.2 33.01376 51.2 0V558.0288c0-33.01376-51.2-33.01376-51.2 0z" p-id="3202"></path><path d="M327.39328 420.70016v557.23008c0 33.01376 51.2 33.01376 51.2 0V420.70016c0-33.01888-51.2-33.01888-51.2 0z" p-id="3203"></path><path d="M629.21216 558.0288v419.90144c0 33.01376 51.2 33.01376 51.2 0V558.0288c0-33.01376-51.2-33.01376-51.2 0z" p-id="3204"></path><path d="M936.92928 420.70016v557.23008c0 33.01376 51.2 33.01376 51.2 0V420.70016c0-33.01888-51.2-33.01888-51.2 0zM81.86368 414.58176l277.27872-277.27872h-36.20352c95.55968 95.5648 191.11424 191.1296 286.65856 286.69952 9.86112 9.86112 26.3424 9.86112 36.19328 0 99.6864-99.67616 199.35744-199.35232 299.02848-299.02848 23.36256-23.36768-12.83584-59.5712-36.1984-36.20352-99.68128 99.67616-199.35744 199.35232-299.02336 299.02848h36.19328L359.13728 101.09952c-9.86112-9.86112-26.3424-9.86112-36.20352 0L45.65504 378.37824c-23.36256 23.36768 12.84096 59.5712 36.20864 36.20352z" p-id="3205"></path><path d="M779.06944 87.3728h190.208l-25.6-25.6v178.70336c0 33.01888 51.2 33.01888 51.2 0V61.7728c0-13.95712-11.63776-25.6-25.6-25.6h-190.208c-33.01376 0-33.01376 51.2 0 51.2z" p-id="3206"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1542700674974" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2435" xmlns:xlink="http://www.w3.org/1999/xlink" width="54" height="54"><defs><style type="text/css"></style></defs><path d="M910.08512 255.34976c-0.9216 37.56032-33.67936 64.52736-62.77632 83.2256-49.06496 31.52896-107.008 48.10752-163.55328 60.01152-138.17344 29.09696-290.7648 23.57248-425.43104-19.46624-58.35776-18.65216-189.14816-75.15136-141.824-157.70624 21.99552-38.36928 69.44256-61.7984 108.63616-77.824 61.00992-24.93952 127.1552-37.65248 192.49152-44.0832 113.5104-11.17184 231.46496-2.74432 340.38784 32.07168 53.44256 17.08032 150.37952 55.00928 152.06912 123.77088 0.80896 32.95744 52.00896 33.03936 51.2 0-2.37568-96.73216-111.27296-147.01568-189.65504-173.14304-133.31456-44.43648-282.62912-47.11424-420.352-25.3952-97.09568 15.3088-223.18592 49.46432-278.9888 138.76224-50.43712 80.71168 17.99168 157.66016 86.2976 196.29056 68.02944 38.47168 147.73248 56.832 224.57344 66.6368 93.83424 11.97568 188.50304 10.11712 281.91232-4.61312 73.80992-11.63776 149.60128-33.51552 212.93056-74.21952 43.58656-28.01152 81.95584-70.0416 83.28704-124.31872 0.80384-33.03936-50.39616-32.95744-51.20512 0z" p-id="2436"></path><path d="M910.08512 423.22944c-1.4336 56.79616-74.50624 91.82208-118.88128 110.01344-89.00096 36.52096-187.52 48.3584-283.02848 48.80896-95.91296 0.45568-193.50528-13.50656-283.03872-48.80896-44.45696-17.52064-117.4528-53.66784-118.88128-110.01344-0.83456-32.95744-52.03456-33.03936-51.2 0 1.8688 73.86624 71.37792 120.97536 131.85024 148.91008 99.38432 45.91104 212.75136 60.60032 321.26976 61.11744 109.08672 0.51712 221.13792-16.65536 321.25952-61.11744 60.65664-26.93632 130.00192-75.7504 131.85024-148.91008 0.83456-33.03936-50.36544-32.95232-51.2 0z" p-id="2437"></path><path d="M910.08512 594.62656c-1.4336 56.80128-74.50624 91.8272-118.88128 110.0288-89.00096 36.52096-187.52 48.3584-283.02848 48.80896-95.91296 0.45568-193.50528-13.50656-283.03872-48.80896-44.45696-17.53088-117.4528-53.67808-118.88128-110.0288-0.83456-32.95744-52.03456-33.03424-51.2 0 1.8688 73.87136 71.37792 120.9856 131.85024 148.92544 99.38432 45.91104 212.75136 60.60032 321.26976 61.11744 109.08672 0.51712 221.13792-16.65536 321.25952-61.11744 60.65664-26.93632 130.00192-75.76576 131.85024-148.92544 0.83456-33.03424-50.36544-32.95744-51.2 0z" p-id="2438"></path><path d="M910.08512 776.06912c-1.4336 56.80128-74.50624 91.8272-118.88128 110.0288-89.00096 36.52096-187.52 48.3584-283.02848 48.80896-95.91296 0.45568-193.50528-13.50656-283.03872-48.80896-44.45696-17.53088-117.4528-53.67808-118.88128-110.0288-0.83456-32.95744-52.03456-33.03424-51.2 0 1.8688 73.87136 71.37792 120.9856 131.85024 148.92032 99.38432 45.91616 212.75136 60.60544 321.26976 61.12256 109.08672 0.51712 221.13792-16.65536 321.25952-61.12256 60.65664-26.9312 130.00192-75.76064 131.85024-148.92032 0.83456-33.03424-50.36544-32.95232-51.2 0zM386.23744 151.69024l102.20032 102.1952c9.86624 9.86112 26.3424 9.86112 36.20352 0l103.49568-103.49056c23.36768-23.36256-12.83584-59.5712-36.1984-36.20352L488.43776 217.68192h36.20352l-102.20032-102.1952c-23.36768-23.36768-59.56608 12.83584-36.20352 36.20352z" p-id="2439"></path><path d="M388.992 261.38624h235.45344c33.01376 0 33.01376-51.2 0-51.2H388.992c-33.01888 0-33.01888 51.2 0 51.2zM388.992 335.40608h235.45344c33.01376 0 33.01376-51.2 0-51.2H388.992c-33.01888 0-33.01888 51.2 0 51.2z" p-id="2440"></path><path d="M481.11616 234.49088V375.5008c0 33.01888 51.20512 33.01888 51.20512 0V234.49088c0-33.01376-51.20512-33.01376-51.20512 0z" p-id="2441"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1511512690058" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3507" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M1013.703 693.345c6.865 6.865 10.297 14.874 10.297 24.027l0 205.944c0 9.916-3.432 18.115-10.297 24.599-6.865 6.483-15.255 9.725-25.171 9.725L782.588 957.64c-9.153 0-17.162-3.242-24.027-9.725-6.865-6.483-10.297-14.683-10.297-24.599L748.264 717.372c0-6.102 1.526-11.823 4.577-17.162s7.246-9.534 12.586-12.586 11.06-4.577 17.162-4.577l77.801 0L860.39 546.896c0-4.577-1.144-8.772-3.432-12.586s-5.339-6.865-9.153-9.153-8.009-3.432-12.585-3.432L543.464 521.725l0 161.323 77.801 0c9.153 0 17.162 3.432 24.027 10.297s10.297 14.874 10.297 24.027l0 205.944c0 6.102-1.526 11.823-4.577 17.162s-7.246 9.534-12.585 12.585-11.06 4.577-17.162 4.577L415.321 957.64c-6.102 0-11.823-1.526-17.162-4.577s-9.725-7.246-13.158-12.585-5.149-11.06-5.149-17.162L379.852 717.372c0-9.153 3.432-17.162 10.297-24.027s15.255-10.297 25.171-10.297l76.657 0L491.977 521.725 188.782 521.725c-7.628 0-13.92 2.479-18.878 7.437-4.958 4.958-7.437 10.869-7.437 17.734l0 136.152 77.801 0c9.916 0 18.115 3.432 24.599 10.297s9.725 14.874 9.725 24.027l0 205.944c0 9.916-3.242 18.115-9.725 24.599-6.483 6.483-14.683 9.725-24.599 9.725L34.324 957.64c-3.814 0-7.437-0.572-10.869-1.716-3.432-1.144-6.483-2.67-9.153-4.577-2.67-1.907-5.149-4.386-7.437-7.437-2.288-3.051-4.004-6.293-5.149-9.725C0.572 930.753 0 927.13 0 923.316L0 717.372c0-3.051 0.381-6.102 1.144-9.153s1.907-5.721 3.432-8.009 3.432-4.577 5.721-6.865 4.577-4.195 6.865-5.721 4.958-2.67 8.009-3.432 6.102-1.144 9.153-1.144l77.801 0L112.125 495.41c0-6.865 2.479-12.776 7.437-17.734s10.869-7.437 17.734-7.437l354.682 0L491.978 342.096l-76.657 0c-9.916 0-18.306-3.432-25.171-10.297s-10.297-14.874-10.297-24.027L379.853 101.828c0-9.916 3.432-18.306 10.297-25.171s15.255-10.297 25.171-10.297l205.944 0c6.102 0 11.823 1.716 17.162 5.149 5.339 3.432 9.534 7.818 12.585 13.158 3.051 5.339 4.577 11.06 4.577 17.162l0 205.944c0 9.153-3.432 17.162-10.297 24.027s-14.874 10.297-24.027 10.297l-77.801 0 0 128.143L885.56 470.24c7.628 0 13.92 2.479 18.878 7.437s7.437 10.869 7.437 17.734l0 187.638 76.657 0C998.448 683.048 1006.838 686.48 1013.703 693.345z" p-id="3508"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1580710958385" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4938" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M512 1024C229.248 1024 0 794.752 0 512S229.248 0 512 0s512 229.248 512 512-229.248 512-512 512z m0-938.666667C276.352 85.333333 85.333333 276.352 85.333333 512s191.018667 426.666667 426.666667 426.666667 426.666667-191.018667 426.666667-426.666667S747.648 85.333333 512 85.333333z m0 768a340.650667 340.650667 0 0 1-266.24-128A340.650667 340.650667 0 0 1 512 597.333333a340.48 340.48 0 0 1 266.197333 128A340.48 340.48 0 0 1 512 853.333333z m0-298.666666a170.666667 170.666667 0 1 1 0-341.333334 170.666667 170.666667 0 0 1 0 341.333334z" p-id="4939"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1580711460345" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7290" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M374.272 440.832H127.488c-33.792 0-61.44-27.648-61.44-61.44V132.608c0-33.792 27.648-61.44 61.44-61.44h247.296c33.792 0 61.44 27.648 61.44 61.44v247.296c-0.512 33.792-27.648 60.928-61.952 60.928zM127.488 132.608v247.296h247.296V132.608H127.488zM762.88 492.032c-16.384 0-31.744-6.144-43.52-17.92l-174.592-174.592c-11.776-11.776-17.92-27.136-17.92-43.52s6.144-31.744 17.92-43.52l174.592-174.592c11.776-11.776 27.136-17.92 43.52-17.92s31.744 6.144 43.52 17.92l174.592 174.592c11.776 11.776 17.92 27.136 17.92 43.52s-6.144 31.744-17.92 43.52l-174.592 174.592c-11.776 11.776-27.136 17.92-43.52 17.92z m0-410.624L588.288 256 762.88 430.592 937.472 256 762.88 81.408zM374.272 952.832H127.488c-33.792 0-61.44-27.648-61.44-61.44v-247.296c0-33.792 27.648-61.44 61.44-61.44h247.296c33.792 0 61.44 27.648 61.44 61.44v247.296c-0.512 34.304-27.648 61.44-61.952 61.44z m-246.784-308.224v247.296h247.296v-247.296H127.488zM886.272 952.832h-247.296c-33.792 0-61.44-27.648-61.44-61.44v-247.296c0-33.792 27.648-61.44 61.44-61.44h247.296c33.792 0 61.44 27.648 61.44 61.44v247.296c0 34.304-27.136 61.44-61.44 61.44z m-246.784-308.224v247.296h247.296v-247.296h-247.296z" p-id="7291"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1580711541501" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10218" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M955.092096 763.262604l0-102.226243-69.523423-11.606339c-0.642636-1.61887-1.313925-3.234671-2.01182-4.845355l40.981367-57.363476-72.29249-72.29556-57.378825 40.951691c-1.604544-0.693802-3.218298-1.360997-4.835122-2.001587l-11.605316-69.505004-102.224196 0-11.606339 69.51933c-1.626034 0.644683-3.248997 1.316995-4.864798 2.016937l-57.343009-40.986483-15.316847 15.31787c-8.084119-3.351328-16.255219-6.407943-24.503067-9.169847 17.087167-10.036587 33.016974-22.307052 47.39852-36.68962 44.329625-44.329625 68.743664-103.270015 68.743664-165.964916 0-62.694901-24.413016-121.636315-68.743664-165.965939-44.328601-44.329625-103.270015-68.743664-165.964916-68.743664-62.694901 0-121.636315 24.413016-165.965939 68.743664-44.330648 44.329625-68.743664 103.271038-68.743664 165.965939 0 62.694901 24.413016 121.635291 68.743664 165.964916 14.387685 14.387685 30.321586 26.662243 47.415916 36.699853-9.124821 3.051499-18.155499 6.456039-27.076682 10.229992-44.551682 18.844184-84.556814 45.815465-118.907157 80.165808-34.349319 34.348296-61.320601 74.355475-80.163761 118.906134-19.515473 46.13883-29.40982 95.134731-29.40982 145.627728l51.223638 0c0-0.243547 0.008186-0.48607 0.00921-0.729617L568.286446 875.278817l34.093493 34.094516 57.376779-40.945551c1.613754 0.698918 3.227508 1.36816 4.838192 2.006703l11.607362 69.494771 102.224196 0 11.604292-69.518307c1.627057-0.645706 3.252067-1.319042 4.869914-2.02103l57.340963 40.961924 72.299653-72.29863-41.001833-57.354266c0.700965-1.613754 1.373277-3.230578 2.015913-4.850471L955.092096 763.262604zM260.51585 318.411957c0-101.174284 82.311681-183.485965 183.485965-183.485965 101.173261 0 183.484941 82.311681 183.484941 183.485965 0 101.173261-82.311681 183.483918-183.484941 183.483918C342.826508 501.895875 260.51585 419.585217 260.51585 318.411957zM539.391349 824.052109 125.316635 824.052109c24.923646-153.425322 158.330028-270.933619 318.685179-270.933619 35.588543 0 70.209038 5.66093 103.32425 16.864086l-17.237593 17.238616 40.98853 57.369615c-0.696872 1.611707-1.36509 3.224438-2.004657 4.839215l-69.537749 11.605316 0 102.224196 69.530586 11.610432c0.645706 1.629103 1.314948 3.243881 2.00568 4.842285L539.391349 824.052109zM855.620593 831.341119l-9.087982 9.081843-47.445592-33.836643-14.563694 8.170077c-7.928576 4.419659-16.367783 7.907087-25.115004 10.370185l-16.07614 4.564969-9.592472 57.466829-12.849656 0-9.575076-57.482179-16.138562-4.51585c-8.56098-2.400676-17.007349-5.90243-25.092491-10.402931l-14.59337-8.140401-47.397496 33.841759-9.086959-9.085936 33.890878-47.432289-8.192589-14.647605c-4.408403-7.848759-7.894807-16.273638-10.370185-25.073048l-4.562922-16.078187-57.467853-9.572006 0-12.849656 57.415664-9.586332 4.626367-16.118096c2.429329-8.650007 5.92085-17.084097 10.389628-25.091468l8.124028-14.612813-33.855062-47.38624 9.087982-9.087982 47.418986 33.863249 14.628162-8.157797c7.888667-4.426823 16.325827-7.92346 25.062815-10.387581l16.114003-4.524037 9.573029-57.493435 12.850679 0 9.596566 57.466829 16.095583 4.524037c8.613168 2.430352 17.060561 5.940292 25.146727 10.453073l14.57802 8.077979 47.376007-33.82334 9.087982 9.089006-33.898041 47.439452 8.190543 14.598486c4.41352 7.880481 7.91118 16.327874 10.404977 25.12626l4.569062 16.041348 57.434084 9.589402 0 12.844539-57.470923 9.549493-4.572132 16.159028c-2.397606 8.570189-5.889127 17.002232-10.379395 25.059745l-8.136308 14.595416L855.620593 831.341119zM727.311299 627.965152c-46.417169 0-84.181261 37.764092-84.181261 84.183308 0 46.420239 37.763069 84.186378 84.181261 84.186378 46.419216 0 84.184331-37.765115 84.184331-84.186378C811.49563 665.730267 773.730515 627.965152 727.311299 627.965152zM727.311299 743.063563c-17.045211 0-30.913057-13.868869-30.913057-30.915104s13.867846-30.915104 30.913057-30.915104c17.047258 0 30.916127 13.868869 30.916127 30.915104S744.358557 743.063563 727.311299 743.063563z" p-id="10219"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1580711048745" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6525" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M508.928 546.304c-120.32 0-218.112-97.792-218.112-218.112s97.792-218.112 218.112-218.112S727.04 207.872 727.04 328.192s-97.792 218.112-218.112 218.112z m0-385.024c-92.16 0-166.912 74.752-166.912 166.912s74.752 166.912 166.912 166.912S675.84 420.352 675.84 328.192s-74.752-166.912-166.912-166.912z" p-id="6526"></path><path d="M851.456 884.736c-14.336 0-25.6-11.264-25.6-25.6 0-167.936-136.704-304.64-304.64-304.64S216.576 691.2 216.576 859.136c0 14.336-11.264 25.6-25.6 25.6s-25.6-11.264-25.6-25.6c0-196.096 159.744-355.84 355.84-355.84s355.84 159.744 355.84 355.84c0 14.336-11.264 25.6-25.6 25.6zM293.888 451.072C194.048 451.072 112.64 370.176 112.64 270.336c0-99.84 80.896-180.736 180.736-180.736 42.496 0 83.456 14.848 115.2 41.472l-32.768 38.912c-22.016-18.432-52.224-29.184-82.432-29.184-71.68 0-129.536 57.856-129.536 129.536s58.368 129.536 130.048 129.536v51.2z" p-id="6527"></path><path d="M35.84 726.016c-14.336 0-25.6-11.264-25.6-25.6 0-161.792 131.584-293.376 293.376-293.376 14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6c-133.632 0-242.176 108.544-242.176 242.176 0 14.336-11.264 25.6-25.6 25.6z" p-id="6528"></path><path d="M736.768 458.24v-51.2c71.68 0 129.536-57.856 129.536-129.536s-57.856-129.536-129.536-129.536c-30.72 0-59.392 10.24-82.432 29.184l-32.768-39.424c32.256-27.136 72.192-41.472 115.2-41.472 99.84 0 180.736 80.896 180.736 180.736 0 100.352-80.896 181.248-180.736 181.248z" p-id="6529"></path><path d="M994.304 726.016c-14.336 0-25.6-11.264-25.6-25.6 0-133.632-108.544-242.176-242.176-242.176-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6c161.792 0 293.376 131.584 293.376 293.376 0 14.336-11.264 25.6-25.6 25.6z" p-id="6530"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1580698548494" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2117" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M512 38.4L85.344 183.456V550.4c0 149.344 85.344 281.6 226.144 345.6l192 89.6 204.8-93.856c140.8-59.744 230.4-196.256 230.4-349.856v-358.4L512.032 38.432z m341.344 503.456c0 119.456-68.256 226.144-179.2 273.056l-170.656 76.8-157.856-72.544c-106.656-46.944-174.944-153.6-174.944-268.8v-307.2l341.344-115.2 341.344 115.2v298.656z" p-id="2118"></path><path d="M341.344 384c0 81.056 55.456 145.056 128 166.4V768h85.344v-42.656h42.656V640h-42.656v-89.6c72.544-17.056 128-85.344 128-166.4 0-93.856-76.8-170.656-170.656-170.656s-170.656 76.8-170.656 170.656z m256 0c0 46.944-38.4 85.344-85.344 85.344s-85.344-38.4-85.344-85.344 38.4-85.344 85.344-85.344c46.944 0 85.344 38.4 85.344 85.344z" p-id="2119"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503993891882" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7986" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M504.951 511.98c93.49 0 169.28-74.002 169.28-165.26 0-91.276-75.79-165.248-169.28-165.248-93.486 0-169.287 73.972-169.279 165.248-0.001 91.258 75.793 165.26 169.28 165.26z m77.6 55.098H441.466c-120.767 0-218.678 95.564-218.678 213.45V794.3c0 48.183 97.911 48.229 218.678 48.229H582.55c120.754 0 218.66-1.78 218.66-48.229v-13.77c0-117.887-97.898-213.45-218.66-213.45z" p-id="7987"></path></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1592798608137" class="icon" viewBox="0 0 1094 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2153" xmlns:xlink="http://www.w3.org/1999/xlink" width="213.671875" height="200"><defs><style type="text/css"></style></defs><path d="M1079.89132 363.781049l-77.980105-53.286648a32.012732 32.012732 0 0 0-10.462343-7.14466L555.653726 5.587677a32.012732 32.012732 0 0 0-36.567271 0.305576L13.503553 364.101177a32.012732 32.012732 0 0 0 37.018359 52.166202l32.303757-22.889104v456.443359a174.382084 174.382084 0 0 0 174.178367 174.178366H836.841926a174.382084 174.382084 0 0 0 174.178366-174.178366V394.265901l32.754846 22.37981A32.012732 32.012732 0 1 0 1079.89132 363.781049zM946.994827 849.792531a110.283863 110.283863 0 0 1-110.152901 110.152902H257.004036a110.283863 110.283863 0 0 1-110.152902-110.152902V348.09481L537.915762 71.024612 946.994827 350.524868z" fill="#409eff" p-id="2154"></path><path d="M514.910248 353.333258v368.233729a32.012732 32.012732 0 0 0 64.025465 0V353.333258a32.012732 32.012732 0 0 0-64.025465 0z" fill="#409eff" p-id="2155"></path><path d="M546.922981 829.318934m-38.924573 0a38.924572 38.924572 0 1 0 77.849145 0 38.924572 38.924572 0 1 0-77.849145 0Z" fill="#409eff" p-id="2156"></path></svg>
\ No newline at end of file
import Vue from 'vue'
import 'normalize.css/normalize.css'// A modern alternative to CSS resets
import ElementUI from 'element-ui'
import locale from 'element-ui/lib/locale/lang/zh-CN' // lang i18n
import VCharts from 'v-charts'
import '@/styles/index.scss' // global css
import App from './App'
import router from './router'
import store from './store'
import '@/icons' // icon
import '@/permission' // permission control
import common from '@/utils/validate'
import moment from 'moment'
Vue.prototype.common = common
Vue.prototype.moment = moment
Vue.use(ElementUI, { locale })
Vue.use(VCharts)
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store,
template: '<App/>',
components: { App }
})
import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import { Message } from 'element-ui'
import { getToken } from '@/utils/auth' // 验权
const whiteList = ['/login', '/forget'] // 不重定向白名单
router.beforeEach((to, from, next) => {
NProgress.start()
if (getToken()) {
if (to.path === '/login') {
next({ path: '/' })
NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
} else {
if (store.getters.roles.length === 0) {
store.dispatch('GetInfo').then(res => { // 拉取用户信息
let menus = res.data.menus || []
let username = res.data.username
store.dispatch('GenerateRoutes', { menus, username }).then(() => { // 生成可访问的路由表
router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
next({ ...to, replace: true })
})
}).catch((err) => {
store.dispatch('FedLogOut').then(() => {
Message.error(err || 'Verification failed, please login again')
next({ path: '/' })
})
})
} else {
next()
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next('/login')
NProgress.done()
}
}
})
router.afterEach(() => {
NProgress.done() // 结束Progress
})
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
/* Layout */
import Layout from '../views/layout/Layout'
/**
* hidden: true if `hidden:true` will not show in the sidebar(default is false)
* alwaysShow: true if set true, will always show the root menu, whatever its child routes length
* if not set alwaysShow, only more than one route under the children
* it will becomes nested mode, otherwise not show the root menu
* redirect: noredirect if `redirect:noredirect` will no redirct in the breadcrumb
* name:'router-name' the name is used by <keep-alive> (must set!!!)
* meta : {
title: 'title' the name show in submenu and breadcrumb (recommend set)
icon: 'svg-name' the icon show in the sidebar,
}
**/
export const constantRouterMap = [
{ path: '/login', component: () => import('@/views/login/index'), hidden: true },
{ path: '/forget', component: () => import('@/views/login/forgetPwd'), hidden: true },
{ path: '/404', component: () => import('@/views/404'), hidden: true },
{
path: '',
component: Layout,
redirect: '/home',
children: [{
path: 'home',
name: 'home',
component: () => import('@/views/home/index'),
meta: { title: '首页', icon: 'home' }
}]
}]
export const asyncRouterMap = [
// 库存模块
{
path: '/inv',
component: Layout,
redirect: '/inv/stockAdmin',
name: 'inv',
meta: { title: '库存管理', icon: 'sms-subject' },
children: [{
path: 'stockAdmin',
name: 'stockAdmin',
component: () => import('@/views/inv/stockAdmin'),
meta: { title: '入库管理', icon: 'product-list' },
},
{
path: 'warehouseAdmin',
name: 'warehouseAdmin',
component: () => import('@/views/inv/warehouseAdmin'),
meta: { title: '出库管理', icon: 'product-list' },
},
{
path: 'storeList',
name: 'storeList',
component: () => import('@/views/inv/StoreList'),
meta: { title: '库存清单', icon: 'product-cate' }
},
{
path: 'goodsCategory',
name: 'goodsCategory',
component: () => import('@/views/inv/GoodsCateogory'),
meta: { title: '物品类别', icon: 'product-cate' }
}, {
path: 'depotAdmin',
name: 'depotAdmin',
component: () => import('@/views/inv/DepotAdmin'),
meta: { title: '库房管理', icon: 'product-cate' }
}]
},
// 供应商模块
{
path: '/ssm',
component: Layout,
redirect: '/ssm/supplierShopList',
name: 'ssm',
meta: { title: '供应商', icon: 'sms-subject' },
children: [{
path: 'supplierList',
name: 'supplierList',
component: () => import('@/views/ssm/SupplierList'),
meta: { title: '供应商列表', icon: 'product-list' },
}]
},
// 报表管理
{
path: '/sta',
component: Layout,
redirect: '/sta/inventoryChart',
name: 'sta',
meta: { title: '报表管理', icon: 'sms-subject' },
children: [{
path: 'inventoryChart',
name: 'inventoryChart',
component: () => import('@/views/sta/InventoryChart'),
meta: { title: '库存情况', icon: 'product-list' },
},
{
path: 'recipients',
name: 'recipients',
component: () => import('@/views/sta/Recipients'),
meta: { title: '领用情况', icon: 'product-list' },
}]
},
// 部门管理
{
path: '/dep',
component: Layout,
redirect: '/dep/departmentList',
name: 'dep',
meta: { title: '部门管理', icon: 'sms-subject' },
children: [{
path: 'departmentList',
name: 'departmentList',
component: () => import('@/views/dep/DepartmentList'),
meta: { title: '部门列表', icon: 'product-list' }
}]
},
// 管理员
{
path: '/use',
component: Layout,
redirect: '/use/adminList',
name: 'use',
meta: { title: '用户管理', icon: 'product-list' },
children: [{
path: 'adminList',
name: 'adminList',
component: () => import('@/views/use/AdminList'),
meta: { title: '管理员列表', icon: 'product-list' },
},
{
path: 'userList',
name: 'userList',
component: () => import('@/views/use/UserList'),
meta: { title: '用户列表', icon: 'product-cate' }
}]
},
{
path: '/set',
component: Layout,
redirect: '/set/log',
name: 'set',
meta: { title: '系统设置', icon: 'product-list' },
children: [
{
path: 'log',
name: 'log',
component: () => import('@/views/set/log'),
meta: { title: '操作日志', icon: 'ums-role' },
hidden: false
},
{
path: 'setting',
name: 'setting',
component: () => import('@/views/set/setting'),
meta: { title: '配置管理', icon: 'product-list' },
}]
},
// 权限模块
{
path: '/ums',
component: Layout,
redirect: '/ums/role',
name: 'ums',
meta: { title: '权限', icon: 'ums' },
children: [
// {
// path: 'admin',
// name: 'admin',
// component: () => import('@/views/ums/admin/index'),
// meta: { title: '用户列表', icon: 'ums-admin' }
// },
{
path: 'role',
name: 'role',
component: () => import('@/views/ums/role/index'),
meta: { title: '角色列表', icon: 'ums-role' }
},
{
path: 'allocMenu',
name: 'allocMenu',
component: () => import('@/views/ums/role/allocMenu'),
meta: { title: '分配菜单' },
hidden: true
},
{
path: 'allocResource',
name: 'allocResource',
component: () => import('@/views/ums/role/allocResource'),
meta: { title: '分配资源' },
hidden: true
},
{
path: 'menu',
name: 'menu',
component: () => import('@/views/ums/menu/index'),
meta: { title: '菜单列表', icon: 'ums-menu' }
},
{
path: 'addMenu',
name: 'addMenu',
component: () => import('@/views/ums/menu/add'),
meta: { title: '添加菜单' },
hidden: true
},
{
path: 'updateMenu',
name: 'updateMenu',
component: () => import('@/views/ums/menu/update'),
meta: { title: '修改菜单' },
hidden: true
},
// {
// path: 'resource',
// name: 'resource',
// component: () => import('@/views/ums/resource/index'),
// meta: { title: '资源列表', icon: 'ums-resource' },
// hidden: true
// },
// {
// path: 'resourceCategory',
// name: 'resourceCategory',
// component: () => import('@/views/ums/resource/categoryList'),
// meta: { title: '资源分类' },
// hidden: true
// }
]
},
{ path: '*', redirect: '/404', hidden: true }
]
export default new Router({
// mode: 'history', //后端支持可开
scrollBehavior: () => ({ y: 0 }),
routes: constantRouterMap
})
const getters = {
sidebar: state => state.app.sidebar,
device: state => state.app.device,
token: state => state.user.token,
avatar: state => state.user.avatar,
stockRoomId: state => state.user.stockRoomId,
type: state => state.user.type,
memberId: state => state.user.memberId,
userId: state => state.user.userId,
name: state => state.user.name,
roles: state => state.user.roles,
addRouters: state => state.permission.addRouters,
routers: state => state.permission.routers
}
export default getters
import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import user from './modules/user'
import permission from './modules/permission'
import getters from './getters'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
app,
user,
permission
},
getters
})
export default store
import Cookies from 'js-cookie'
const app = {
state: {
sidebar: {
opened: !+Cookies.get('sidebarStatus'),
withoutAnimation: false
},
device: 'desktop'
},
mutations: {
TOGGLE_SIDEBAR: state => {
if (state.sidebar.opened) {
Cookies.set('sidebarStatus', 1)
} else {
Cookies.set('sidebarStatus', 0)
}
state.sidebar.opened = !state.sidebar.opened
},
CLOSE_SIDEBAR: (state, withoutAnimation) => {
Cookies.set('sidebarStatus', 1)
state.sidebar.opened = false
state.sidebar.withoutAnimation = withoutAnimation
},
TOGGLE_DEVICE: (state, device) => {
state.device = device
}
},
actions: {
ToggleSideBar: ({ commit }) => {
commit('TOGGLE_SIDEBAR')
},
CloseSideBar({ commit }, { withoutAnimation }) {
commit('CLOSE_SIDEBAR', withoutAnimation)
},
ToggleDevice({ commit }, device) {
commit('TOGGLE_DEVICE', device)
}
}
}
export default app
import { asyncRouterMap, constantRouterMap } from '@/router/index'
//判断是否有权限访问该菜单
function hasPermission(menus, route) {
if (route.name) {
let currMenu = getMenu(route.name, menus);
if (currMenu != null) {
//设置菜单的标题、图标和可见性
if (currMenu.title != null && currMenu.title !== '') {
route.meta.title = currMenu.title
}
if (currMenu.icon != null && currMenu.title !== '') {
route.meta.icon = currMenu.icon
}
if (currMenu.hidden != null) {
route.hidden = currMenu.hidden !== 0
}
if (currMenu.sort != null && currMenu.sort !== '') {
route.sort = currMenu.sort
}
return true
} else {
route.sort = 0
if (route.hidden !== undefined && route.hidden === true) {
return true
} else {
return false
}
}
} else {
return true
}
}
//根据路由名称获取菜单
function getMenu(name, menus) {
for (let i = 0; i < menus.length; i++) {
let menu = menus[i]
if (name === menu.name) {
return menu
}
}
return null
}
//对菜单进行排序
function sortRouters(accessedRouters) {
for (let i = 0; i < accessedRouters.length; i++) {
let router = accessedRouters[i]
if (router.children && router.children.length > 0) {
router.children.sort(compare("sort"))
}
}
accessedRouters.sort(compare("sort"))
}
//降序比较函数
function compare(p) {
return function (m, n) {
let a = m[p]
let b = n[p]
return b - a
}
}
const permission = {
state: {
routers: constantRouterMap,
addRouters: []
},
mutations: {
SET_ROUTERS: (state, routers) => {
state.addRouters = routers
state.routers = constantRouterMap.concat(routers)
}
},
actions: {
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const { menus } = data
const { username } = data
const accessedRouters = asyncRouterMap.filter(v => {
// admin帐号直接返回所有菜单
if (username === 'admin') return true
// if (hasPermission(menus, v)) {
// if (v.children && v.children.length > 0) {
// v.children = v.children.filter(child => {
// if (hasPermission(menus, child)) {
// return child
// }
// return false
// })
// return v
// } else {
// return v
// }
// }
// return false
})
//对菜单进行排序
sortRouters(accessedRouters)
commit('SET_ROUTERS', accessedRouters)
resolve()
})
}
}
}
export default permission
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { setCookie, getCookie } from '@/utils/support'
const user = {
state: {
token: getToken(),
name: '',
userId: getCookie("userId"),
memeberId: getCookie("memeberId"),
stockRoomId: getCookie("stockRoomId"),
avatar: '',
roles: []
},
mutations: {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_USERID: (state, userId) => {
state.userId = userId
setCookie("userId", userId, 15)
},
SET_MEMBERID: (state, memeberId) => {
state.memeberId = memeberId
setCookie("memeberId", memeberId, 15)
},
SET_STOCKROOMID: (state, stockRoomId) => {
state.stockRoomId = stockRoomId
setCookie("stockRoomId", stockRoomId, 15)
},
SET_TYPE: (state, type) => {
state.type = type
setCookie("type", type, 15)
},
SET_ROLES: (state, roles) => {
state.roles = roles
}
},
actions: {
// 登录
Login({ commit }, userInfo) {
const username = userInfo.username.trim()
return new Promise((resolve, reject) => {
login(username, userInfo.password, userInfo.authCode).then(response => {
const data = response.data
const tokenStr = data.tokenHead+data.token
setToken(tokenStr)
commit('SET_TOKEN', tokenStr)
resolve()
}).catch(error => {
reject(error)
})
})
},
// 获取用户信息
GetInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo().then(response => {
const data = response.data
if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', data.roles)
} else {
reject('getInfo: roles must be a non-null array !')
}
commit('SET_NAME', data.username)
commit('SET_AVATAR', data.icon)
commit('SET_USERID', data.userId)
commit('SET_MEMBERID', data.memberId)
commit('SET_STOCKROOMID', data.stockRoomId)
commit('SET_TYPE', data.type)
resolve(response)
}).catch(error => {
reject(error)
})
})
},
// 登出
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
}).catch(error => {
reject(error)
})
})
},
// 前端 登出
FedLogOut({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
}
}
}
export default user
//to reset element-ui default css
.el-upload {
input[type="file"] {
display: none !important;
}
}
.el-upload__input {
display: none;
}
//暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461
.el-dialog {
transform: none;
left: 0;
position: relative;
margin: 0 auto;
}
.dialog-center .el-dialog__footer {
text-align: center;
}
//element ui upload
.upload-container {
.el-upload {
width: 100%;
.el-upload-dragger {
width: 100%;
height: 200px;
}
}
}
@import "./variables.scss";
@import "./mixin.scss";
@import "./transition.scss";
@import "./element-ui.scss";
@import "./sidebar.scss";
/* 改变主题色变量 */
$--color-primary: #4583F3;
/* 改变 icon 字体路径变量,必需 */
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
Microsoft YaHei, Arial, sans-serif;
}
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
div:focus {
outline: none;
}
a:focus,
a:active {
outline: none;
}
a,
a:focus,
a:hover {
cursor: pointer;
color: inherit;
text-decoration: none;
}
.clearfix {
&:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
}
//main-container全局样式
.app-main {
min-height: 100%;
padding: 8px;
}
.app-container {
padding: 20px;
}
//搜索栏样式
.filter-container {
.el-card__body {
margin: -10px 0;
.el-form-item {
margin-bottom: 0;
margin: 10px 0;
margin-right: 10px;
}
.btn-add {
float: right;
margin-top: 10px;
margin-left: 15px;
}
}
//.el-form-item {
// margin-bottom: 0;
//}
}
//操作栏样式
.operate-container {
margin-top: 20px;
}
.operate-container .btn-add {
float: right;
}
//表格栏样式
.table-container {
margin-top: 20px;
}
//批量操作栏样式
.batch-operate-container {
display: inline-block;
margin-top: 20px;
}
// 导出栏
.export-container {
margin-top: 20px;
text-align: right;
}
.export-container .btn-content {
display: inline-block;
}
//分页栏样式
.pagination-container {
float: right;
margin: 20px 0;
}
//添加、更新表单样式
.form-container {
position: absolute;
left: 0;
right: 0;
width: 720px;
padding: 35px 35px 15px 35px;
margin: 20px auto;
}
//主标题
.font-extra-large {
font-size: 20px;
color: #303133;
}
//标题
.font-title-large {
font-size: 18px;
color: #303133;
}
//小标题
.font-title-medium {
font-size: 16px;
color: #303133;
}
//正文
.font-medium {
font-size: 16px;
color: #606266;
}
//正文
.font-small {
font-size: 14px;
color: #606266;
}
//正文(小)
.font-extra-small {
font-size: 13px;
color: #606266;
}
.color-main {
color: #409eff;
}
.color-success {
color: #67c23a;
}
.color-warning {
color: #e6a23c;
}
.color-danger {
color: #f56c6c;
}
.color-info {
color: #909399;
}
//表单下注意
.notice {
display: block;
color: #999999;
font-size: 12px;
line-height: 25px;
}
@mixin clearfix {
&:after {
content: "";
display: table;
clear: both;
}
}
@mixin scrollBar {
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
@mixin relative {
position: relative;
width: 100%;
height: 100%;
}
#app {
// 主体区域
.main-container {
min-height: 100%;
transition: margin-left .28s;
margin-left: 180px;
}
// 侧边栏
.sidebar-container {
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
}
transition: width .28s;
width: 180px !important;
height: 100%;
position: fixed;
font-size: 0px;
top: 0;
bottom: 0;
left: 0;
z-index: 1001;
overflow: hidden;
a {
display: inline-block;
width: 100%;
}
.svg-icon {
margin-right: 16px;
}
.el-menu {
border: none;
width: 100% !important;
}
}
.hideSidebar {
.sidebar-container {
width: 36px !important;
}
.main-container {
margin-left: 36px;
}
.submenu-title-noDropdown {
padding-left: 10px !important;
position: relative;
.el-tooltip {
padding: 0 10px !important;
}
}
.el-submenu {
&>.el-submenu__title {
padding-left: 10px !important;
&>span {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
.el-submenu__icon-arrow {
display: none;
}
}
}
}
.sidebar-container .nest-menu .el-submenu>.el-submenu__title,
.sidebar-container .el-submenu .el-menu-item {
min-width: 180px !important;
background-color: $subMenuBg !important;
&:hover {
background-color: $menuHover !important;
}
}
.el-menu--collapse .el-menu .el-submenu {
min-width: 180px !important;
}
//适配移动端
.mobile {
.main-container {
margin-left: 0px;
}
.sidebar-container {
top: 50px;
transition: transform .28s;
width: 180px !important;
}
&.hideSidebar {
.sidebar-container {
transition-duration: 0.3s;
transform: translate3d(-180px, 0, 0);
}
}
}
.withoutAnimation {
.main-container,
.sidebar-container {
transition: none;
}
}
}
//globl transition css
/*fade*/
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.28s;
}
.fade-enter,
.fade-leave-active {
opacity: 0;
}
/*fade*/
.breadcrumb-enter-active,
.breadcrumb-leave-active {
transition: all .5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
}
.breadcrumb-move {
transition: all .5s;
}
.breadcrumb-leave-active {
position: absolute;
}
//sidebar
$menuBg: #304156;
$subMenuBg: #1f2d3d;
$menuHover: #001528;
import Cookies from 'js-cookie'
const TokenKey = 'loginToken'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}
// date.js
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
}
return fmt;
}
function padLeftZero(str) {
return ('00' + str).substr(str.length);
}
export function str2Date(dateStr, separator) {
if (!separator) {
separator = "-";
}
let dateArr = dateStr.split(separator);
let year = parseInt(dateArr[0]);
let month;
//处理月份为04这样的情况
if (dateArr[1].indexOf("0") == 0) {
month = parseInt(dateArr[1].substring(1));
} else {
month = parseInt(dateArr[1]);
}
let day = parseInt(dateArr[2]);
let date = new Date(year, month - 1, day);
return date;
}
export function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if (('' + time).length === 10) time = parseInt(time) * 1000
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
export function formatTime(time, option) {
time = +time * 1000
const d = new Date(time)
const now = Date.now()
const diff = (now - d) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) { // less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
if (option) {
return parseTime(time, option)
} else {
return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
}
}
import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
// 创建axios实例
const service = axios.create({
// baseURL: process.env.BASE_API,
withCredentials: true,
baseURL: 'http://192.168.31.127:8201/mall-admin',
// baseURL: 'http://hhg.api.jsonpro.cn:8201/mall-admin',
timeout: 60000 // 请求超时时间
})
// request拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
config.headers['Access-Control-Allow-Credentials']= true
}
return config
}, error => {
// Do something with request error
console.log(error) // for debug
Promise.reject(error)
})
// respone拦截器
service.interceptors.response.use(
response => {
/**
* code为非200是抛错 可结合自己业务进行修改
*/
const res = response.data
if (res.code !== 200) {
Message({
message: res.message,
type: 'error',
duration: 3 * 1000
})
// 401:未登录;
if (res.code === 401) {
MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
store.dispatch('FedLogOut').then(() => {
location.reload()// 为了重新实例化vue-router对象 避免bug
})
})
}
return Promise.reject('error')
} else {
return response.data
}
},
error => {
console.log('err' + error)// for debug
Message({
message: error.message,
type: 'error',
duration: 3 * 1000
})
return Promise.reject(error)
}
)
export default service
import Cookies from "js-cookie";
const SupportKey='supportKey';
export function getSupport() {
return Cookies.get(SupportKey)
}
export function setSupport(isSupport) {
return Cookies.set(SupportKey, isSupport,{ expires: 3 })
}
export function setCookie(key,value,expires) {
return Cookies.set(key, value,{ expires: expires})
}
export function getCookie(key) {
return Cookies.get(key)
}
export default {
// 获取分类label值
getCascaderObj(val, opt) {
return val.map(function (value, index, array) {
for (var itm of opt) {
if (itm.id == value) {
opt = itm.children;
return itm.name;
}
}
return null;
})
},
// 数组对象合并去重
removingDplicate(a, b) {
let ab = a.concat(b);
let obj = {};
let result = ab.reduce((cur,next) => {
obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
return cur;
},[]); //设置cur默认类型为数组,并且初始值为空的数组
console.log(result);
return result;
},
/* 合法uri*/
validateURL(textval) {
const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
return urlregex.test(textval)
},
/* 小写字母*/
validateLowerCase(str) {
const reg = /^[a-z]+$/
return reg.test(str)
},
/* 大写字母*/
validateUpperCase(str) {
const reg = /^[A-Z]+$/
return reg.test(str)
},
/* 大小写字母*/
validatAlphabets(str) {
const reg = /^[A-Za-z]+$/
return reg.test(str)
}
}
/* eslint-disable */
require('script-loader!file-saver');
require('script-loader!xlsx/dist/xlsx.core.min');
function generateArray(table) {
var out = [];
var rows = table.querySelectorAll('tr');
var ranges = [];
for (var R = 0; R < rows.length; ++R) {
var outRow = [];
var row = rows[R];
var columns = row.querySelectorAll('td');
for (var C = 0; C < columns.length; ++C) {
var cell = columns[C];
var colspan = cell.getAttribute('colspan');
var rowspan = cell.getAttribute('rowspan');
var cellValue = cell.innerText;
if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
//Skip ranges
ranges.forEach(function (range) {
if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
}
});
//Handle Row Span
if (rowspan || colspan) {
rowspan = rowspan || 1;
colspan = colspan || 1;
ranges.push({ s: { r: R, c: outRow.length }, e: { r: R + rowspan - 1, c: outRow.length + colspan - 1 } });
}
;
//Handle Value
outRow.push(cellValue !== "" ? cellValue : null);
//Handle Colspan
if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
}
out.push(outRow);
}
return [out, ranges];
};
function datenum(v, date1904) {
if (date1904) v += 1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
for (var R = 0; R != data.length; ++R) {
for (var C = 0; C != data[R].length; ++C) {
if (range.s.r > R) range.s.r = R;
if (range.s.c > C) range.s.c = C;
if (range.e.r < R) range.e.r = R;
if (range.e.c < C) range.e.c = C;
var cell = { v: data[R][C] };
if (cell.v == null) continue;
var cell_ref = XLSX.utils.encode_cell({ c: C, r: R });
if (typeof cell.v === 'number') cell.t = 'n';
else if (typeof cell.v === 'boolean') cell.t = 'b';
else if (cell.v instanceof Date) {
cell.t = 'n';
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
}
else cell.t = 's';
ws[cell_ref] = cell;
}
}
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
}
function Workbook() {
if (!(this instanceof Workbook)) return new Workbook();
this.SheetNames = [];
this.Sheets = {};
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
export function export_table_to_excel(id) {
var theTable = document.getElementById(id);
console.log('a')
var oo = generateArray(theTable);
var ranges = oo[1];
/* original data */
var data = oo[0];
var ws_name = "SheetJS";
console.log(data);
var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
/* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
ws['!merges'] = ranges;
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' });
saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), "test.xlsx")
}
export function export_json_to_excel(th, jsonData, defaultTitle) {
/* original data */
var data = jsonData;
data.unshift(th);
var ws_name = "SheetJS";
var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' });
var title = defaultTitle || '列表'
saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), title + ".xlsx")
}
<template>
<div>
<div class="app-container">
<el-col :span="12">
<img :src="img_404" alt="404" class="img-style">
</el-col>
<el-col :span="12">
<div style="margin-left: 100px;margin-top: 60px">
<h1 class="color-main">OOPS!</h1>
<h2 style="color: #606266">很抱歉,页面它不小心迷路了!</h2>
<div style="color:#909399;font-size: 14px">请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告</div>
<el-button style="margin-top: 20px" type="primary" round @click="handleGoMain">返回首页</el-button>
</div>
</el-col>
</div>
</div>
</template>
<script>
import img_404 from '@/assets/images/gif_404.gif';
export default {
name: 'wrongPage',
data() {
return {
img_404
}
},
methods: {
handleGoMain() {
this.$router.push({path: '/'})
}
},
}
</script>
<style scoped>
.app-container {
width: 80%;
margin: 120px auto;
}
.img-style {
width: auto;
height: auto;
max-width: 100%;
max-height: 100%;
}
</style>
<template> 
<div class="app-container">
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<el-row type="flex" class="btn-groups">
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-row>
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="物品类别"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="创建时间"
align="center">
<template slot-scope="scope">{{scope.row.createtime | formatTime}}</template>
</el-table-column>
<el-table-column label="操作"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="danger"
@click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- 弹窗-->
<add-department-modal ref="addDepartment" @ok="getList"></add-department-modal>
</div>
</template>
<script>
import moment from 'moment'
import { getDepartmentList, editDepart } from '@/api/inventory'
import AddDepartmentModal from './modules/addDepartmentModal'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10
}
export default {
name: 'DepartmentList',
components: {AddDepartmentModal},
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
getDepartmentList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 添加
handleAdd(){
this.$refs.addDepartment.add()
},
// 删除
handleDelete(id){
this.$confirm('是否删除该部门?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
editDepart({id: id,deleteStatus: 0 }).then(res=>{
this.getList()
})
}).catch(() => {
});
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button{
width: 100px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="500px">
<!-- start -->
<el-form :model="model"
ref="attributeForm"
v-loading="loading"
label-width="150px">
<el-form-item label="部门:"
:rules="[{required: true, trigger: 'blur', message: '请输入部门名称'}]"
prop="name">
<el-input size="small"
class="input-width"
placeholder="请输入部门名称"
v-model="model.name"></el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认</el-button>
<el-button @click="close">取消</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { addDepart } from '@/api/inventory'
// 移动属性
export default {
name: 'addDepartmentModal',
data () {
return {
visible: false,
title: null,
loading: false,
id: null,
model: {}
}
},
methods: {
init () {
this.model = {
name: null
}
this.$nextTick(() => {
this.$refs.attributeForm.clearValidate()
})
},
add(){
this.id = null
this.title="新增部门"
this.init()
this.visible= true
},
// detail (id) {
// this.id = id
// this.init()
// this.visible = true
// this.title = '移动属性'
// this.loading = true
// getAttribute(id).then(res => {
// this.model = res.data
// this.loading = false
// }).catch(err => {
// this.loading = false
// this.close()
// })
// },
// 提交保存
submit () {
this.$refs.attributeForm.validate((valid) => {
if (valid) {
// 验证通过
addDepart(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
}
})
},
close () {
this.$emit('close')
this.visible = false
}
}
}
</script>
<style scoped>
.input-width {
width: 200px;
}
</style>
<template>
<el-card class="app-container">
<div class="total-layout">
<el-row :gutter="20" type="flex">
<el-col>
<div class="total-frame">
<svg-icon icon-class="delivery"
class="total-icon">
</svg-icon>
<div class="total-title">今日出库(件)</div>
<div class="total-value">200</div>
</div>
</el-col>
<el-col>
<div class="total-frame">
<svg-icon icon-class="put"
class="total-icon">
</svg-icon>
<div class="total-title">今日入库(件)</div>
<div class="total-value">5000.00</div>
</div>
</el-col>
<el-col>
<div class="total-frame">
<svg-icon icon-class="warn"
class="total-icon">
</svg-icon>
<div class="total-title">库存预警</div>
<div class="total-value">¥50000.00</div>
</div>
</el-col>
<el-col>
<div class="total-frame">
<svg-icon icon-class="person"
class="total-icon">
</svg-icon>
<div class="total-title">今日申领人</div>
<div class="total-value">50000.00</div>
</div>
</el-col>
<el-col>
<div class="total-frame">
<svg-icon icon-class="inventory"
class="total-icon">
</svg-icon>
<div class="total-title">剩余库存</div>
<div class="total-value">5000.00</div>
</div>
</el-col>
</el-row>
</div>
<div class="overview-layout">
<el-row :gutter="20">
<el-col :span="12">
<div class="out-border">
<div class="layout-title">出库入库</div>
<div style="padding: 10px;border-left:1px solid #DCDFE6">
<el-button type="primary" plain>7天</el-button>
<el-button plain>15天</el-button>
<div>
<ve-line :data="chartData"
:legend-visible="false"
:loading="loading"
:data-empty="dataEmpty"
:settings="chartSettings"></ve-line>
</div>
</div>
</div>
</el-col>
<el-col :span="12">
<div class="out-border">
<div class="layout-title">库存预警</div>
<div style="padding: 40px">
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="date"
label="日期"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
</div>
</div>
</el-col>
</el-row>
</div>
<div class="overview-layout">
<el-row :gutter="20">
<el-col :span="8">
<div class="out-border">
<div class="layout-title">领取物品类别分布</div>
<div style="padding: 10px;border-left:1px solid #DCDFE6">
<el-button type="primary" plain>昨天</el-button>
<el-button type="primary" plain>7天</el-button>
<el-button plain>15天</el-button>
<div>
<ve-pie :data="chartData1" :settings="chartSettings1"></ve-pie>
</div>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="out-border">
<div class="layout-title">入库物品类别分布</div>
<div style="padding: 10px;border-left:1px solid #DCDFE6">
<el-button type="primary" plain>昨天</el-button>
<el-button type="primary" plain>7天</el-button>
<el-button plain>15天</el-button>
<div>
<ve-pie :data="chartData1" :settings="chartSettings1"></ve-pie>
</div>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="out-border">
<div class="layout-title">申领人部门分布</div>
<div style="padding: 10px;border-left:1px solid #DCDFE6">
<el-button type="primary" plain>昨天</el-button>
<el-button type="primary" plain>7天</el-button>
<el-button plain>15天</el-button>
<div>
<ve-pie :data="chartData1" :settings="chartSettings1"></ve-pie>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</el-card>
</template>
<script>
import { str2Date } from '@/utils/date'
const DATA_FROM_BACKEND = {
columns: ['date', 'orderCount', 'orderAmount'],
rows: [
{ date: '2018-11-01', orderCount: 10, orderAmount: 100 },
{ date: '2018-11-02', orderCount: 20, orderAmount: 2230 },
{ date: '2018-11-03', orderCount: 33, orderAmount: 3623 },
{ date: '2018-11-04', orderCount: 50, orderAmount: 6423 },
{ date: '2018-11-05', orderCount: 80, orderAmount: 8492 },
{ date: '2018-11-06', orderCount: 60, orderAmount: 6293 },
{ date: '2018-11-07', orderCount: 20, orderAmount: 2293 },
{ date: '2018-11-08', orderCount: 60, orderAmount: 6293 },
{ date: '2018-11-09', orderCount: 50, orderAmount: 5293 },
{ date: '2018-11-10', orderCount: 30, orderAmount: 3293 },
{ date: '2018-11-11', orderCount: 20, orderAmount: 2293 },
{ date: '2018-11-12', orderCount: 80, orderAmount: 8293 },
{ date: '2018-11-13', orderCount: 100, orderAmount: 10293 },
{ date: '2018-11-14', orderCount: 10, orderAmount: 1293 },
{ date: '2018-11-15', orderCount: 40, orderAmount: 4293 }
]
}
export default {
name: 'home',
data() {
return {
chartData1: {
columns: ['日期', '访问用户'],
rows: [
{ '日期': '1/1', '访问用户': 1393 },
{ '日期': '1/2', '访问用户': 3530 },
{ '日期': '1/3', '访问用户': 2923 },
{ '日期': '1/4', '访问用户': 1723 },
{ '日期': '1/5', '访问用户': 3792 },
{ '日期': '1/6', '访问用户': 4593 }
]
},
chartSettings1:{
dimension: '日期',
metrics: '访问用户'
},
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}],
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date()
let start = new Date()
start.setFullYear(2018)
start.setMonth(10)
start.setDate(1)
end.setTime(start.getTime() + 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一月',
onClick(picker) {
const end = new Date()
let start = new Date()
start.setFullYear(2018)
start.setMonth(10)
start.setDate(1)
end.setTime(start.getTime() + 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}]
},
orderCountDate: '',
chartSettings: {
xAxisType: 'time',
area: true,
axisSite: { right: ['orderAmount'] },
labelMap: { 'orderCount': '订单数量', 'orderAmount': '订单金额' }
},
chartData: {
columns: [],
rows: []
},
loading: false,
dataEmpty: false
}
},
created() {
this.initOrderCountDate()
this.getData()
},
methods: {
handleDateChange() {
this.getData()
},
initOrderCountDate() {
let start = new Date()
start.setFullYear(2018)
start.setMonth(10)
start.setDate(1)
const end = new Date()
end.setTime(start.getTime() + 1000 * 60 * 60 * 24 * 7)
this.orderCountDate = [start, end]
},
getData() {
setTimeout(() => {
this.chartData = {
columns: ['date', 'orderCount', 'orderAmount'],
rows: []
}
for (let i = 0; i < DATA_FROM_BACKEND.rows.length; i++) {
let item = DATA_FROM_BACKEND.rows[i]
let currDate = str2Date(item.date)
let start = this.orderCountDate[0]
let end = this.orderCountDate[1]
if (currDate.getTime() >= start.getTime() && currDate.getTime() <= end.getTime()) {
this.chartData.rows.push(item)
}
}
this.dataEmpty = false
this.loading = false
}, 1000)
}
}
}
</script>
<style scoped>
.app-container {
margin: 10px;
overflow: hidden;
}
.total-layout {
margin-top: 0px;
}
.total-frame {
border: 1px solid #dcdfe6;
padding: 20px;
height: 100px;
}
.total-icon {
color: #4583F3;
width: 60px !important;
height: 60px !important;
}
.total-title {
position: relative;
font-size: 16px;
color: #909399;
left: 70px;
top: -50px;
}
.total-value {
position: relative;
font-size: 18px;
color: #606266;
left: 70px;
top: -40px;
}
.un-handle-layout {
margin-top: 20px;
border: 1px solid #dcdfe6;
}
.layout-title {
color: #606266;
padding: 15px 20px;
background: #f2f6fc;
font-weight: bold;
}
.un-handle-content {
padding: 20px 40px;
}
.un-handle-item {
border-bottom: 1px solid #ebeef5;
padding: 10px;
}
.overview-layout {
margin-top: 20px;
}
.overview-item-value {
font-size: 24px;
text-align: center;
}
.overview-item-title {
margin-top: 10px;
text-align: center;
}
.out-border {
border: 1px solid #dcdfe6;
}
.statistics-layout {
margin-top: 20px;
border: 1px solid #dcdfe6;
}
.mine-layout {
position: absolute;
right: 140px;
top: 107px;
width: 250px;
height: 235px;
}
.address-content {
padding: 20px;
font-size: 18px;
}
</style>
<template> 
<div class="app-container">
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<el-row type="flex" class="btn-groups">
<el-button type="primary" size="medium" @click="handleAdd">新增</el-button>
</el-row>
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="库房名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="管理员"
align="center">
<template slot-scope="scope">{{scope.row.username}}</template>
</el-table-column>
<el-table-column label="创建时间"
align="center">
<template slot-scope="scope">{{scope.row.createtime | formatTime}}</template>
</el-table-column>
<el-table-column label="操作"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="danger"
@click="handleDelete(scope.row.id)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- 弹窗-->
<add-depot ref="addDepot" @ok="getList"></add-depot>
</div>
</template>
<script>
import moment from 'moment'
import { getStockRooms, editDepartment } from '@/api/inventory'
import AddDepot from './modules/addDepot'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10
}
export default {
name: 'DepotAdmin',
components: { AddDepot },
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
getStockRooms(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 添加
handleAdd() {
this.$refs.addDepot.add()
},
// 删除
handleDelete(id){
this.$confirm('是否删除该库房?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
editDepartment({id: id,deleteStatus: 0 }).then(res=>{
this.getList()
})
}).catch(() => {
});
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button {
width: 100px;
}
</style>
<template> 
<div class="app-container">
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<el-row type="flex" class="btn-groups">
<el-button type="primary" @click="handleAdd">新增</el-button>
</el-row>
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="物品类别"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="创建时间"
align="center">
<template slot-scope="scope">{{scope.row.createtime | formatTime}}</template>
</el-table-column>
<el-table-column label="操作"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="danger"
@click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- 弹窗-->
<add-category ref="addCategory" @ok="getList"></add-category>
</div>
</template>
<script>
import moment from 'moment'
import { getGoodsCategoryList, editGoodsCategory } from '@/api/inventory'
import AddCategory from './modules/addCategory'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10
}
export default {
name: 'goodsCategory',
components: {AddCategory},
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
getGoodsCategoryList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 添加
handleAdd(){
this.$refs.addCategory.add()
},
// 删除
handleDelete(id){
this.$confirm('是否删除该物品类别?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
editGoodsCategory({id: id,deleteStatus: 0 }).then(res=>{
this.getList()
})
}).catch(() => {
});
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button{
width: 100px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="物品名称:">
<el-input v-model="listQuery.goodsMame"
class="input-width"
placeholder="请输入物品名称"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="物品名称"
align="center">
<template slot-scope="scope">{{scope.row.goodsName}}</template>
</el-table-column>
<el-table-column label="总数量"
align="center">
<template slot-scope="scope">{{scope.row.inboundNum}}</template>
</el-table-column>
<el-table-column label="入库人"
align="center">
<template slot-scope="scope">{{$store.getters.type == 1? scope.row.backInboundName : scope.row.receptInboundName}}
</template>
</el-table-column>
<el-table-column label="入库日期"
align="center">
<template slot-scope="scope">{{scope.row.createtime | formatTime}}</template>
</el-table-column>
<el-table-column label="所属库房"
align="center">
<template slot-scope="scope">{{scope.row.stockRoomName || '--'}}</template>
</el-table-column>
<el-table-column label="操作"
width="220"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="success"
@click="handleView(scope.row)">查看详情
</el-button>
<el-button size="mini"
type="primary"
@click="exportEntry(scope.row.id)">生成入库单
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- end -->
<!-- 弹窗 -->
<inventory-details-modal ref="detail"
@ok="getList"></inventory-details-modal>
<!-- end -->
</div>
</template>
<script>
import moment from 'moment'
import { getInboundRecordList } from '@/api/inventory'
import inventoryDetailsModal from './modules/inventoryDetailsModal'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
goodsMame: ''
}
export default {
name: 'StockAdmin',
components: { inventoryDetailsModal },
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
if(this.$store.getters.type == 2){
this.listQuery.stockRoomId = this.$store.getters.stockRoomId
}
getInboundRecordList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 查看
handleView(id) {
this.$refs.detail.init()
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="物品名称:">
<el-input v-model="listQuery.name"
class="input-width"
placeholder="请输入物品名称"></el-input>
</el-form-item>
<el-form-item label="物品类别:">
<el-select v-model="listQuery.goodsCategoryId"
class="input-width"
clearable
placeholder="请选择物品类别">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="供应商:">
<el-select v-model="listQuery.supplierId"
class="input-width"
clearable
placeholder="请选择供应商">
<el-option v-for="item in supplierOptions"
:key="item.id"
:label="item.supplierName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<!-- 超级管理员可见-->
<el-form-item label="库房:"
v-if="$store.getters.type == 1">
<el-select v-model="listQuery.stockRoomId"
class="input-width"
clearable
placeholder="请选择库房">
<el-option v-for="item in depotOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<el-row type="flex" class="btn-groups" justify="end">
<el-button type="primary" @click="handleAdd">新增</el-button>
<el-button type="success" @click="handleAdd">扫码入库</el-button>
<el-button type="info" @click="handleAdd">扫码出库</el-button>
<el-button type="warning" @click="handleImport">导入</el-button>
</el-row>
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="物品名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="型号"
align="center">
<template slot-scope="scope">{{scope.row.goodsNo}}</template>
</el-table-column>
<el-table-column label="物品类别"
align="center">
<template slot-scope="scope">{{scope.row.goodsCategoryName}}</template>
</el-table-column>
<el-table-column label="数量"
align="center">
<template slot-scope="scope">{{scope.row.goodsNum}}</template>
</el-table-column>
<el-table-column label="价格"
align="center">
<template slot-scope="scope">{{scope.row.prict || 0}}</template>
</el-table-column>
<el-table-column label="供应商"
align="center">
<template slot-scope="scope">{{scope.row.supplierName || '--'}}</template>
</el-table-column>
<el-table-column label="所属库房"
align="center">
<template slot-scope="scope">{{scope.row.stockRoomName || '--'}}</template>
</el-table-column>
<!-- <el-table-column label="操作"-->
<!-- align="center">-->
<!-- <template slot-scope="scope">-->
<!-- <el-button size="mini"-->
<!-- type="danger"-->
<!-- @click="handleDelete(scope.row.id)">删除</el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- 弹窗-->
<add-goods-modal ref="addGoods" @ok="getList"></add-goods-modal>
<import-goods-modal ref="importGoods" @ok="getList"></import-goods-modal>
</div>
</template>
<script>
import moment from 'moment'
import { getGoodsList,getGoodsCategoryList,getStockRooms, editGoods } from '@/api/inventory'
import {getSuppliersList} from '@/api/supplier'
import AddGoodsModal from './modules/addGoodsModal'
import ImportGoodsModal from './modules/importGoodsModal'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
name: '',
goodsCategoryId: '',
supplierId: '',
stockRoomId: ''
}
export default {
name: 'StoreList',
components: {
AddGoodsModal,
ImportGoodsModal
},
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
categoryOptions: [],
supplierOptions: [],
depotOptions: []
}
},
created() {
this.getList()
this.getGoodsCategoryList()
this.getSuppliersList()
this.getStockRooms()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
// 删除
// handleDelete(id){
// this.$confirm('是否删除该物品?', '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// editGoods({id: id,deleteStatus: 0 }).then(res=>{
// this.getList()
// })
// }).catch(() => {
// });
// },
// 物品类别
getGoodsCategoryList(){
getGoodsCategoryList().then(res=>{
this.categoryOptions = res.data.list
})
},
// 供应商
getSuppliersList(){
getSuppliersList().then(res=>{
this.supplierOptions = res.data.list
})
},
// 库房
getStockRooms(){
getStockRooms().then(res=>{
this.depotOptions = res.data.list
})
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
if(this.$store.getters.type == 2){
this.listQuery.stockRoomId = this.$store.getters.stockRoomId
}
getGoodsList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 新增
handleAdd(){
this.$refs.addGoods.add()
},
// 导入
handleImport(){
this.$refs.importGoods.add()
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button{
width: 100px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="物品名称:">
<el-input v-model="listQuery.goodsMame"
class="input-width"
placeholder="请输入物品名称"></el-input>
</el-form-item>
<el-form-item label="物品类别:">
<el-select v-model="listQuery.goodsCategoryId"
class="input-width"
clearable
placeholder="请选择物品类别">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="部门:">
<el-select v-model="listQuery.departId"
class="input-width"
clearable
placeholder="请选择部门">
<el-option v-for="item in departmentOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<!-- 超级管理员可见-->
<el-form-item label="库房:" v-if="$store.getters.type == 1">
<el-select v-model="listQuery.stockRoomId"
class="input-width"
clearable
placeholder="请选择库房">
<el-option v-for="item in depotOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="物品名称"
align="center">
<template slot-scope="scope">{{scope.row.goodsName}}</template>
</el-table-column>
<el-table-column label="型号"
align="center">
<template slot-scope="scope">{{scope.row.goodsNo}}</template>
</el-table-column>
<el-table-column label="物品类别"
align="center">
<template slot-scope="scope">{{scope.row.goodsCategoryName}}</template>
</el-table-column>
<el-table-column label="数量"
align="center">
<template slot-scope="scope">{{scope.row.outboundNum}}</template>
</el-table-column>
<el-table-column label="申领人"
align="center">
<template slot-scope="scope">{{$store.getters.type == 1? scope.row.backOutboundName : scope.row.receptOutboundName}}</template>
</el-table-column>
<el-table-column label="所属部门"
align="center">
<template slot-scope="scope">{{scope.row.departmentName || '--'}}</template>
</el-table-column>
<el-table-column label="所属库房"
align="center">
<template slot-scope="scope">{{scope.row.stockRoomName || '--'}}</template>
</el-table-column>
<el-table-column label="出库日期"
align="center">
<template slot-scope="scope">{{scope.row.createtime | formatTime }}</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
</div>
</template>
<script>
import moment from 'moment'
import { getOutboundRecordList, getGoodsCategoryList, getStockRooms, getDepartmentList } from '@/api/inventory'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
goodsCategoryId: '',
stockRoomId: '',
goodsMame: '',
memberName: '',
departId: ''
}
export default {
name: 'WarehouseAdmin',
components: {},
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
categoryOptions: [],
depotOptions: [],
departmentOptions: []
}
},
created() {
this.getList()
this.getGoodsCategoryList()
this.getStockRooms()
this.getDepartmentList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
// 物品类别
getGoodsCategoryList() {
getGoodsCategoryList().then(res => {
this.categoryOptions = res.data.list
})
},
// 库房
getStockRooms() {
getStockRooms().then(res => {
this.depotOptions = res.data.list
})
},
getDepartmentList() {
getDepartmentList().then(res => {
this.departmentOptions = res.data.list
})
},
//请求数据
getList() {
this.listLoading = true
//请求数据
console.log('listQuery', this.listQuery)
if (this.$store.getters.type == 2) {
this.listQuery.stockRoomId = this.$store.getters.stockRoomId
}
getOutboundRecordList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="500px">
<!-- start -->
<el-form :model="model"
ref="attributeForm"
v-loading="loading"
label-width="150px">
<el-form-item label="物品类别:"
:rules="[{required: true, trigger: 'blur', message: '请输入物品类别名称'}]"
prop="name">
<el-input size="small"
class="input-width"
placeholder="请输入物品类别名称"
v-model="model.name"></el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认</el-button>
<el-button @click="close">取消</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { addGoodsCategory } from '@/api/inventory'
// 移动属性
export default {
name: 'addCategory',
data () {
return {
visible: false,
title: null,
loading: false,
id: null,
model: {}
}
},
methods: {
init () {
this.model = {
name: null
}
this.$nextTick(() => {
this.$refs.attributeForm.clearValidate()
})
},
add(){
this.id = null
this.title="新增物品类别"
this.init()
this.visible= true
},
// detail (id) {
// this.id = id
// this.init()
// this.visible = true
// this.title = '移动属性'
// this.loading = true
// getAttribute(id).then(res => {
// this.model = res.data
// this.loading = false
// }).catch(err => {
// this.loading = false
// this.close()
// })
// },
// 提交保存
submit () {
this.$refs.attributeForm.validate((valid) => {
if (valid) {
// 验证通过
addGoodsCategory(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
}
})
},
close () {
this.$emit('close')
this.visible = false
}
}
}
</script>
<style scoped>
.input-width {
width: 200px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="500px">
<!-- start -->
<el-form :model="model"
ref="myForm"
v-loading="loading"
label-width="150px">
<el-form-item label="库房名称:"
:rules="[{required: true, trigger: 'blur', message: '请输入库房名称'}]"
prop="name">
<el-input size="small"
class="input-width"
placeholder="请输入库房名称"
v-model="model.name"></el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认</el-button>
<el-button @click="close">取消</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { addDepartment} from '@/api/inventory'
// 移动属性
export default {
name: 'addDepot',
data () {
return {
visible: false,
title: null,
loading: false,
id: null,
model: {
name: null
},
typeOptions: [],
groupOptions: []
}
},
methods: {
init () {
this.model = {
name: null
}
this.$nextTick(() => {
this.$refs.myForm.clearValidate()
})
},
add(){
this.id = null
this.title="新增库房"
this.init()
this.visible= true
},
// detail (id) {
// this.id = id
// this.init()
// this.visible = true
// this.title = '移动属性'
// this.loading = true
// getAttribute(id).then(res => {
// this.model = res.data
// this.loading = false
// }).catch(err => {
// this.loading = false
// this.close()
// })
// },
// 提交保存
submit () {
this.$refs.myForm.validate((valid) => {
if (valid) {
// 验证通过
addDepartment(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
}
})
},
close () {
this.$emit('close')
this.visible = false
}
}
}
</script>
<style scoped>
.input-width {
width: 200px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="1000px"
:close-on-click-modal="false">
<!-- start -->
<el-row style="padding: 10px 0;text-align: left;">
<el-button type="primary" size="medium" @click="handleAdd">新增</el-button>
</el-row>
<div class="scroll-container no-bottom"
ref="scrollContainer">
<el-form :model="formData" ref="formData">
<el-table
:data="formData.tableData"
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="name" label="物品名称" align="left" style="justify-content: flex-start;">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.name'"
:rules="[{required: true,trigger: 'change',message: '物品名称不能为空'}]">
<el-autocomplete
:maxlength="30"
class="input-width"
v-model="scope.row.name"
:fetch-suggestions="querySearch"
v-if="scope.row.isOK"
placeholder="物品名称"
@select="handleSelect(scope.$index,scope.row)"
></el-autocomplete>
<span v-else>{{scope.row.name}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="型号">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsNo'"
:rules="[{required: true,trigger: 'blur',message: '型号不能为空'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.goodsNo" class="input-width"
placeholder="型号"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.goodsNo}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="条形码">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.barCode'"
:rules="[{required: true,trigger: 'blur',message: '条形码不能为空'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.barCode" class="input-width"
placeholder="条形码"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.barCode}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="物品类别">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsCategoryId'"
:rules="[{required: true,trigger: 'change',message: '类别不能为空'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.goodsCategoryId"
class="input-width"
clearable
placeholder="物品类别"
:disabled="scope.row.id? true: false">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.goodsCategoryId, categoryOptions)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsNum'"
:rules="[{validator: validateNum,trigger: 'blur'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.goodsNum" class="input-width"
placeholder="数量"></el-input>
<span v-else>{{scope.row.goodsNum}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="价格(元)">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.prict'"
:rules="[{validator: validatePrice,trigger: 'blur'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.prict" class="input-width"
placeholder="价格"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.prict}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="供应商">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.supplierId'"
:rules="[{required: true,trigger: 'change',message: '供应商不能为空'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.supplierId"
class="input-width"
clearable
placeholder="供应商"
:disabled="scope.row.id? true: false">
<el-option v-for="item in supplierOptions"
:key="item.id"
:label="item.supplierName"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.supplierId, supplierOptions,1)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库房">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.stockRoomId'"
:rules="[{required: true,trigger: 'change',message: '库房不能为空'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.stockRoomId"
class="input-width"
clearable
placeholder="库房"
:disabled="scope.row.id || ($store.getters.type == 2)? true: false">
<el-option v-for="item in depotOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.stockRoomId, depotOptions)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作"
align="center"
width="50">
<template slot-scope="scope">
<el-link type="danger" :underline="false" @click="handleDelete(scope.$index)">删除</el-link>
<!-- <el-button type="danger" size="small" @click="handleDelete(scope.$index)">删除</el-button>-->
</template>
</el-table-column>
</el-table>
</el-form>
</div>
<div slot="footer">
<el-button type="primary"
@click="submit('formData')">确认
</el-button>
<el-button
@click="close">返回
</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { getGoodsCategoryList, addGoodList, getStockRooms, getGoodsList } from '@/api/inventory'
import { getSuppliersList } from '@/api/supplier'
// 添加编辑属性
export default {
name: 'addGoodsModal',
data() {
var validatePrice = (rule, value, callback) => {
if (value === '') {
callback(new Error('价格不能为空'))
} else {
let priceReg = /^[0-9]+(.[0-9]{2})?$/
if (!priceReg.test(value)) {
callback(new Error('价格不符合要求'))
}
callback()
}
}
var validateNum = (rule, value, callback) => {
if (value === '') {
callback(new Error('数量不能为空'))
} else {
let myReg = /^\d{1,}$/
if (!myReg.test(value)) {
callback(new Error('数量必须为正整数'))
}
callback()
}
}
return {
validatePrice: validatePrice,
validateNum: validateNum,
visible: false,
title: null,
loading: false,
formData: {
tableData: [],
},
categoryOptions: [],
supplierOptions: [],
depotOptions: [],
goodsList: []
}
},
methods: {
// 物品类别
getGoodsCategoryList() {
getGoodsCategoryList().then(res => {
this.categoryOptions = res.data.list
})
},
// 供应商
getSuppliersList() {
getSuppliersList().then(res => {
this.supplierOptions = res.data.list
})
},
// 库房
getStockRooms() {
getStockRooms().then(res => {
this.depotOptions = res.data.list
})
},
// 物品
getGoodsList() {
console.log(12121212)
getGoodsList().then(res => {
for (var i of res.data.list) {
i.value = i.name
}
this.goodsList = res.data.list
})
},
init() {
this.getGoodsList()
this.getGoodsCategoryList()
this.getSuppliersList()
this.getStockRooms()
this.formData.tableData = []
this.$nextTick(() => {
this.$refs.scrollContainer.scrollTop = 0
})
},
add() {
this.init()
this.title = '新增物品'
this.visible = true
},
close() {
this.visible = false
},
handleAdd() {
// for (var i of this.formData.tableData) {
// i.isOK = false
// }
this.formData.tableData.push({
name: '',
goodsNo: '',
goodsNum: '',
prict: '',
supplierId: '',
goodsCategoryId: '',
stockRoomId: this.$store.getters.stockRoomId,
barCode: '',
isOK: true
},)
},
tableRowClassName({ row, rowIndex }) {
// 把每一行的索引放进row
row.index = rowIndex
},
// dbclick(row, event, column) {
// for (var i of this.formData.tableData) {
// i.isOK = false
// }
// row.isOK = !row.isOK
// },
submit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
let data = this.formData.tableData
addGoodList({ vankeGoodsList: this.formData.tableData }).then(res => {
this.$emit('ok')
this.visible = false
})
} else {
this.$message.warning('请检查必填项')
}
})
},
// 删除
handleDelete(index) {
this.formData.tableData.splice(index, 1)
},
// 获取名称
getName(id, arr, type) {
if (!id) {
return ''
}
let name = null
console.log('arr,id', arr, id)
if (type) {
name = arr.filter(item => item.id == id)[0].supplierName
} else {
name = arr.filter(item => item.id == id)[0].name
}
return name
},
querySearch(queryString, cb) {
var goodsList = this.goodsList
var results = queryString ? goodsList.filter(this.createFilter(queryString)) : goodsList
// 调用 callback 返回建议列表的数据
cb(results)
},
createFilter(queryString) {
return (restaurant) => {
return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0)
}
},
handleSelect(index, row) {
let item = this.goodsList.filter(good => good.name === row.name)[0]
this.formData.tableData[index].id = item.id
this.formData.tableData[index].goodsNo = item.goodsNo
this.formData.tableData[index].barCode = item.barCode
this.formData.tableData[index].stockRoomId = item.stockRoomId
this.formData.tableData[index].prict = item.prict
this.formData.tableData[index].supplierId = item.supplierId
this.formData.tableData[index].supplierId = item.supplierId
this.formData.tableData[index].goodsCategoryId = item.goodsCategoryId
console.log('item', item)
}
}
}
</script>
<style scoped>
.scroll-container {
max-height: 50vh;
overflow: hidden;
overflow-y: auto;
}
.input-width {
width: 100px;
}
</style>
<style>
.no-bottom .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
margin-bottom: 0;
}
.no-bottom .el-form-item__error {
position: relative;
top: 0;
margin: 5px 0;
}
.no-bottom .el-table th, .el-table td {
vertical-align: top;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="1000px"
:close-on-click-modal="false">
<!-- excel表格上传 -->
<el-upload
:auto-upload="false"
:on-change="elInFile"
:on-remove="remove"
ref="upload"
action="https://jsonplaceholder.typicode.com"
class="upload-demo"
accept=".xlsx, .xls">
<el-button slot="trigger" size="mini" type="primary" plain>选取文件</el-button>
<div slot="tip" class="el-upload__tip">只能选取Excel文件</div>
</el-upload>
<div class="scroll-container no-bottom"
ref="scrollContainer">
<el-form :model="formData" ref="formData">
<el-table
:data="formData.tableData"
style="width: 100%"
:row-class-name="tableRowClassName">
<el-table-column prop="name" label="物品名称">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.name'"
:rules="[{required: true,trigger: 'change',message: '物品名称不能为空'}]">
<el-autocomplete
:maxlength="30"
class="input-width"
v-model="scope.row.name"
:fetch-suggestions="querySearch"
v-if="scope.row.isOK"
placeholder="物品名称"
@select="handleSelect(scope.$index,scope.row)"
></el-autocomplete>
<span v-else>{{scope.row.name}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="型号">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsNo'"
:rules="[{required: true,trigger: 'blur',message: '型号不能为空'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.goodsNo" class="input-width"
placeholder="型号"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.goodsNo}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="条形码">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.barCode'"
:rules="[{required: true,trigger: 'blur',message: '条形码不能为空'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.barCode" class="input-width"
placeholder="条形码"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.barCode}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="物品类别">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsCategoryId'"
:rules="[{required: true,message: '请选择物品类别',trigger: 'change'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.goodsCategoryId"
class="input-width"
clearable
placeholder="物品类别"
:disabled="scope.row.id? true: false">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.goodsCategoryId, categoryOptions)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.goodsNum'"
:rules="[{validator: validateNum,trigger: 'blur'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.goodsNum" class="input-width"
placeholder="数量"></el-input>
<span v-else>{{scope.row.goodsNum}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="价格(元)">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.prict'"
:rules="[{validator: validatePrice,trigger: 'blur'}]">
<el-input v-if="scope.row.isOK" v-model="scope.row.prict" class="input-width"
placeholder="价格"
:disabled="scope.row.id? true: false"></el-input>
<span v-else>{{scope.row.prict}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="供应商">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.supplierId'"
:rules="[{required: true,trigger: 'change',message: '供应商不能为空'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.supplierId"
class="input-width"
clearable
placeholder="供应商"
:disabled="scope.row.id? true: false">
<el-option v-for="item in supplierOptions"
:key="item.id"
:label="item.supplierName"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.supplierId, supplierOptions,1)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库房">
<template slot-scope="scope">
<el-form-item size="mini" :prop="'tableData.' + scope.$index + '.stockRoomId'"
:rules="[{required: true,trigger: 'change',message: '库房不能为空'}]">
<el-select v-if="scope.row.isOK" v-model="scope.row.stockRoomId"
class="input-width"
clearable
placeholder="库房"
:disabled="scope.row.id || ($store.getters.type == 2)? true: false">
<el-option v-for="item in depotOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
<span v-else>{{getName(scope.row.stockRoomId, depotOptions)}}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作"
align="center"
width="50">
<template slot-scope="scope">
<el-link type="danger" :underline="false" @click="handleDelete(scope.$index)">删除</el-link>
<!-- <el-button type="danger" size="small" @click="handleDelete(scope.$index)">删除</el-button>-->
</template>
</el-table-column>
</el-table>
</el-form>
</div>
<div slot="footer">
<el-button type="primary"
@click="submit('formData')">确认
</el-button>
<el-button
@click="close">返回
</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { getGoodsCategoryList, addGoodList, getStockRooms, getGoodsList } from '@/api/inventory'
import { getSuppliersList } from '@/api/supplier'
import XLSX from 'xlsx'
// 添加编辑属性
export default {
name: 'importGoodsModal',
data() {
var validatePrice = (rule, value, callback) => {
if (!value) {
callback(new Error('价格不能为空'))
} else {
let priceReg = /^[0-9]+(.[0-9]{2})?$/
if (!priceReg.test(value)) {
callback(new Error('价格不符合要求'))
}
callback()
}
}
var validateNum = (rule, value, callback) => {
if (!value) {
callback(new Error('数量不能为空'))
} else {
let myReg = /^\d{1,}$/
if (!myReg.test(value)) {
callback(new Error('数量必须为正整数'))
}
callback()
}
}
return {
validatePrice:validatePrice,
validateNum:validateNum,
files: null, //文件列表
visible: false,
title: null,
loading: false,
formData: {
tableData: [],
},
categoryOptions: [],
supplierOptions: [],
depotOptions: [],
goodsList: []
}
},
beforeCreate() {
/**
* 读取Excel文件,转为{@link Object}对象(自定义函数)
* @return {@link Object}:workbook,整个文档对象;
*/
FileReader.prototype.read2workbook = function () {
let redABS = false //是否将文件读取为二进制字符串
let bytes = new Uint8Array(this.result) //无符号整型数组
if (redABS) {
// let fix = new TextDecoder(encode || 'UTF-8').decode(bytes);
let fix = fixdata(bytes)
let b2a = btoa(fix) //js原生方法:将字符转为base64编码。对应的atob(base64)方法,将base64转字符
var wb = XLSX.read(b2a, {
type: 'base64'
})
} else {
let len = bytes.byteLength
let binarys = new Array(len) //创建定长数组,存储文本
for (let i = 0; i < len; i++)
binarys[i] = String.fromCharCode(bytes[i])
let binary = binarys.join('')
var wb = XLSX.read(binary, {
type: 'binary'
})
}
return wb //workbook
}
/**
* 解析为...格式
*/
FileReader.prototype.read2 = function (format = 'json') {
let wb = this.read2workbook()
if (!wb)
return null
let r = {}
let formats = ['json', 'formulae', 'html', 'txt', 'csv', 'dif', 'slk', 'eth'] //可被解析的格式
format = formats.indexOf(format) == -1 ? 'json' : format
wb.SheetNames.forEach(name => { //遍历每张纸数据
r[name] = XLSX.utils['sheet_to_' + format](wb.Sheets[name])
})
return r
}
/**
* 解析为JSON
* @description: 此解析方式,XLSX将使用表格首行的每列名称,当作sheet数组对象的Key。
* 故Excel每个工作表格的第一行必须有表头,且名称不可重复。
*/
FileReader.prototype.read2JS = function () {
return this.read2()
}
/* 重写readAsBinaryString函数 */
FileReader.prototype.readAsBinaryString = function (f) {
if (!this.onload) //如果this未重写onload函数,则创建一个公共处理方式
this.onload = e => { //在this.onload函数中,完成公共处理
let rs = this.read2workbook()
}
this.readAsArrayBuffer(f) //内部会回调this.onload方法
}
/**
* char值转String
* @param data {@link Array}:char值;
* @return {@link String}
*/
function fixdata(data) {
let w = 1024 << 10 //每次读取1M字节
let len = Math.floor(data.byteLength / w)
let o = new Array(len)
for (var i = 0; i < len; i++)
o[i] = String.fromCharCode.apply(null, new Uint8Array(data.slice(i * w, (i + 1) * w)))
o[i] = String.fromCharCode.apply(null, new Uint8Array(data.slice(i * w)))
return o.join('')
}
},
methods: {
// 物品类别
getGoodsCategoryList() {
getGoodsCategoryList().then(res => {
this.categoryOptions = res.data.list
})
},
// 供应商
getSuppliersList() {
getSuppliersList().then(res => {
this.supplierOptions = res.data.list
})
},
// 库房
getStockRooms() {
getStockRooms().then(res => {
this.depotOptions = res.data.list
})
},
// 物品
getGoodsList() {
getGoodsList().then(res => {
for (var i of res.data.list) {
i.value = i.name
}
this.goodsList = res.data.list
})
},
init() {
this.getGoodsList()
this.getGoodsCategoryList()
this.getSuppliersList()
this.getStockRooms()
this.formData.tableData = []
this.$nextTick(() => {
this.$refs.scrollContainer.scrollTop = 0
})
},
add() {
this.init()
this.title = '新增物品'
this.visible = true
},
close() {
this.visible = false
},
tableRowClassName ({row, rowIndex}) {
// 把每一行的索引放进row
row.index = rowIndex;
},
// dbclick(row, event, column) {
// console.log('row, event, column',row, event, column)
// for (var i of this.formData.tableData) {
// i.isOK = false
// }
// row.isOK = !row.isOK
// this.formData.tableData.splice(row.index,1,row)
// console.log('this.formData.tableData',this.formData.tableData)
// },
submit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
addGoodList({ vankeGoodsList: this.formData.tableData }).then(res => {
this.$emit('ok')
this.visible = false
})
} else {
this.$message.warning('请检查必填项是否输入')
}
})
},
// 删除
handleDelete(index) {
this.formData.tableData.splice(index, 1)
},
// 获取名称
getName(id, arr, type) {
if (!id) {
return ''
}
let name = null
if (type) {
name = arr.filter(item => item.id == id)[0].supplierName
} else {
name = arr.filter(item => item.id == id)[0].name
}
return name
},
// 物品名称搜索作用
querySearch(queryString, cb) {
var goodsList = this.goodsList
var results = queryString ? goodsList.filter(this.createFilter(queryString)) : goodsList
// 调用 callback 返回建议列表的数据
cb(results)
},
createFilter(queryString) {
return (restaurant) => {
return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0)
}
},
handleSelect(index, row) {
let item = this.goodsList.filter(good => good.name === row.name)[0]
this.formData.tableData[index].id = item.id
this.formData.tableData[index].goodsNo = item.goodsNo
this.formData.tableData[index].barCode = item.barCode
this.formData.tableData[index].stockRoomId = item.stockRoomId
this.formData.tableData[index].prict = item.prict
this.formData.tableData[index].supplierId = item.supplierId
this.formData.tableData[index].goodsCategoryId = item.goodsCategoryId
},
//删除文件
remove() {
this.formData.tableData = []
},
/**
* input-file调用此函数时,默认传入"$event"
* @param e {@link Object}:$event事件对象;
*/
inFile(e) {
this.files = (e.target || e.srcElement).files //获取"input-file"的FileList对象
if (!this.files || !this.files.length)
return
for (let i = 0, len = this.files.length; i < len; i++)
this.read(this.files[i])
},
/**
* 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用。
* @param f {@link Object}:当前上传的文件;
* @param fs {@link Array}:当前文件列表;
*/
elInFile(f, fs) {
if (fs.length > 1) {
fs.splice(0, 1)
}
this.read(f.raw)
this.$nextTick(() => {
this.$refs.formData.clearValidate()
})
},
/**
* 解析
* @param f {@link File}
*/
read(f) {
let rd = new FileReader()
rd.onload = e => { //this.readAsArrayBuffer函数内,会回调this.onload函数。在这里处理结果
let sheetArray = rd.read2JS()
let tables = []
for (var sheet of sheetArray.Sheet1) {
let rowTable = {}
rowTable.isOK = true
rowTable.name = sheet['物品名称']
rowTable.goodsNo = sheet['型号']
rowTable.goodsNum = sheet['数量']
rowTable.prict = sheet['价格']
rowTable.barCode = sheet['条形码']
if (sheet['物品类别']) {
let isExist = this.categoryOptions.findIndex(item =>
item.name === sheet['物品类别']
)
isExist === -1 && (rowTable.goodsCategoryId = null)
isExist !== -1 && (rowTable.goodsCategoryId = this.categoryOptions[isExist].id)
}
if (sheet['供应商']) {
let isExist = this.supplierOptions.findIndex(item =>
item.supplierName === sheet['供应商']
)
isExist === -1 && (rowTable.supplierId = null)
isExist !== -1 && (rowTable.supplierId = this.supplierOptions[isExist].id)
}
if (sheet['所属库房']) {
let isExist = this.depotOptions.findIndex(item =>
item.name === sheet['所属库房']
)
isExist === -1 && (rowTable.stockRoomId = null)
isExist !== -1 && (rowTable.stockRoomId = this.depotOptions[isExist].id)
}
if (sheet['物品名称']) {
let isExist = this.goodsList.findIndex(item =>
item.name === sheet['物品名称']
)
isExist === -1 && (rowTable.id = null)
if( isExist !== -1){
rowTable.id = this.goodsList[isExist].id
rowTable.prict = this.goodsList[isExist].prict
rowTable.goodsNo = this.goodsList[isExist].goodsNo
rowTable.barCode = this.goodsList[isExist].barCode
rowTable.goodsCategoryId = this.goodsList[isExist].goodsCategoryId
rowTable.stockRoomId = this.goodsList[isExist].stockRoomId
rowTable.supplierId = this.goodsList[isExist].supplierId
}
}
tables.push(rowTable)
this.formData.tableData = tables
}
}
rd.readAsBinaryString(f)
}
}
}
</script>
<style scoped>
.scroll-container {
max-height: 50vh;
overflow: hidden;
overflow-y: auto;
}
.input-width {
width: 100px;
}
.el-upload__tip {
color: #999;
font-size: 10px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
title="物品详情"
center
width="720px">
<!-- start -->
<div class="scroll-container"
ref="scrollContainer">
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="date"
label="物品名称">
</el-table-column>
<el-table-column
prop="name"
label="型号">
</el-table-column>
<el-table-column
prop="address"
label="物品类别">
</el-table-column>
<el-table-column
prop="address"
label="数量">
</el-table-column>
<el-table-column
prop="address"
label="价格(元)">
</el-table-column>
<el-table-column
prop="address"
label="供应商">
</el-table-column>
</el-table>
</div>
<div slot="footer">
<el-button type="primary"
@click="close">返回
</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { addMember,updateMcht } from '@/api/inventory'
// 添加编辑属性
export default {
name: 'inventoryDetailsModal',
data() {
return {
visible: false,
title: null,
loading: false,
tableData: new Array(10).fill({
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
})
// tableData: [{
// date: '2016-05-02',
// name: '王小虎',
// address: '上海市普陀区金沙江路 1518 弄'
// }, {
// date: '2016-05-04',
// name: '王小虎',
// address: '上海市普陀区金沙江路 1517 弄'
// }, {
// date: '2016-05-01',
// name: '王小虎',
// address: '上海市普陀区金沙江路 1519 弄'
// }, {
// date: '2016-05-03',
// name: '王小虎',
// address: '上海市普陀区金沙江路 1516 弄'
// }]
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.scrollContainer.scrollTop = 0
})
},
close() {
this.visible = false
}
}
}
</script>
<style scoped>
.scroll-container {
max-height: 50vh;
overflow: hidden;
overflow-y: auto;
}
</style>
<template>
<div class="app-wrapper"
:class="classObj">
<sidebar class="sidebar-container"></sidebar>
<div class="main-container">
<navbar></navbar>
<app-main></app-main>
</div>
</div>
</template>
<script>
import { Navbar, Sidebar, AppMain } from './components'
import ResizeMixin from './mixin/ResizeHandler'
export default {
name: 'layout',
components: {
Navbar,
Sidebar,
AppMain
},
mixins: [ResizeMixin],
computed: {
sidebar () {
return this.$store.state.app.sidebar
},
device () {
return this.$store.state.app.device
},
classObj () {
return {
hideSidebar: !this.sidebar.opened,
withoutAnimation: this.sidebar.withoutAnimation,
mobile: this.device === 'mobile'
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
.app-wrapper {
@include clearfix;
position: relative;
height: 100%;
width: 100%;
}
</style>
<template>
<section class="app-main">
<transition name="fade" mode="out-in">
<!-- <router-view :key="key"></router-view> -->
<router-view></router-view>
</transition>
</section>
</template>
<script>
export default {
name: 'AppMain',
computed: {
// key() {
// return this.$route.name !== undefined ? this.$route.name + +new Date() : this.$route + +new Date()
// }
}
}
</script>
<template>
<el-menu class="navbar"
mode="horizontal">
<hamburger class="hamburger-container"
:toggleClick="toggleSideBar"
:isActive="sidebar.opened"></hamburger>
<breadcrumb></breadcrumb>
<el-dropdown @command="handleCommand"
class="avatar-container"
trigger="click">
<div class="avatar-wrapper">
<img class="user-avatar"
:src="avatar">
<i class="el-icon-caret-bottom"></i>
</div>
<el-dropdown-menu class="user-dropdown"
slot="dropdown">
<el-dropdown-item command="PersonalInfo">
编辑个人资料
</el-dropdown-item>
<el-dropdown-item command="ChangeTel">
更换绑定手机号码
</el-dropdown-item>
<el-dropdown-item divided>
<span @click="logout"
style="display:block;">退出</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- 弹窗 -->
<PersonalInfo ref="detailModal"></PersonalInfo>
<ChangeTel ref="changeModal"></ChangeTel>
</el-menu>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
import PersonalInfo from '@/views/sys/PersonalInfo'
import ChangeTel from '@/views/sys/ChangeTel'
export default {
components: {
Breadcrumb,
Hamburger,
PersonalInfo,
ChangeTel
},
computed: {
...mapGetters([
'sidebar',
'avatar'
])
},
methods: {
toggleSideBar () {
this.$store.dispatch('ToggleSideBar')
},
logout () {
this.$store.dispatch('LogOut').then(() => {
location.reload() // 为了重新实例化vue-router对象 避免bug
})
},
handleCommand (command) {
if (command === 'PersonalInfo') {
this.$refs.detailModal.detail()
} else if (command === 'ChangeTel') {
this.$refs.changeModal.detail()
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.navbar {
height: 50px;
line-height: 50px;
border-radius: 0px !important;
.hamburger-container {
line-height: 58px;
height: 50px;
float: left;
padding: 0 10px;
}
.screenfull {
position: absolute;
right: 90px;
top: 16px;
color: red;
}
.avatar-container {
height: 50px;
display: inline-block;
position: absolute;
right: 35px;
.avatar-wrapper {
cursor: pointer;
margin-top: 5px;
position: relative;
.user-avatar {
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
</style>
<template>
<div class="menu-wrapper">
<template v-for="item in routes.filter(item => !item.hidden)">
<router-link v-if="hasOneShowingChildren(item.children) && !item.children[0].children&&!item.alwaysShow"
:to="item.path+'/'+item.children[0].path"
:key="item.children[0].name">
<el-menu-item :index="item.path+'/'+item.children[0].path"
:class="{'submenu-title-noDropdown':!isNest}">
<svg-icon v-if="item.children[0].meta&&item.children[0].meta.icon"
:icon-class="item.children[0].meta.icon"></svg-icon>
<span v-if="item.children[0].meta&&item.children[0].meta.title"
slot="title">{{item.children[0].meta.title}}</span>
</el-menu-item>
</router-link>
<el-submenu v-else
:index="item.name||item.path"
:key="item.name">
<template slot="title">
<svg-icon v-if="item.meta&&item.meta.icon"
:icon-class="item.meta.icon"></svg-icon>
<span v-if="item.meta&&item.meta.title"
slot="title">{{item.meta.title}}</span>
</template>
<template v-for="child in item.children.filter(item => !item.hidden)">
<sidebar-item :is-nest="true"
class="nest-menu"
v-if="child.children&&child.children.length>0"
:routes="[child]"
:key="child.path"></sidebar-item>
<router-link v-else
:to="item.path+'/'+child.path"
:key="child.name">
<el-menu-item :index="item.path+'/'+child.path">
<svg-icon v-if="child.meta&&child.meta.icon"
:icon-class="child.meta.icon"></svg-icon>
<span v-if="child.meta&&child.meta.title"
slot="title">{{child.meta.title}}</span>
</el-menu-item>
</router-link>
</template>
</el-submenu>
</template>
</div>
</template>
<script>
export default {
name: 'SidebarItem',
props: {
routes: {
type: Array
},
isNest: {
type: Boolean,
default: false
}
},
methods: {
hasOneShowingChildren (children) {
const showingChildren = children.filter(item => {
return !item.hidden
})
if (showingChildren.length === 1) {
return true
}
return false
}
}
}
</script>
<template>
<scroll-bar>
<el-menu mode="vertical"
:show-timeout="200"
:default-active="$route.path"
:collapse="isCollapse"
:unique-opened="true"
background-color="#304156"
text-color="#bfcbd9"
active-text-color="#409EFF">
<sidebar-item :routes="routes"></sidebar-item>
</el-menu>
</scroll-bar>
</template>
<script>
import { mapGetters } from 'vuex'
import SidebarItem from './SidebarItem'
import ScrollBar from '@/components/ScrollBar'
export default {
components: { SidebarItem, ScrollBar },
computed: {
...mapGetters([
'sidebar',
'routers'
]),
routes() {
return this.routers
},
isCollapse() {
return !this.sidebar.opened
}
}
}
</script>
export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar'
export { default as AppMain } from './AppMain'
import store from '@/store'
const { body } = document
const WIDTH = 1024
const RATIO = 3
export default {
watch: {
$route(route) {
if (this.device === 'mobile' && this.sidebar.opened) {
store.dispatch('CloseSideBar', { withoutAnimation: false })
}
}
},
beforeMount() {
window.addEventListener('resize', this.resizeHandler)
},
mounted() {
const isMobile = this.isMobile()
if (isMobile) {
store.dispatch('ToggleDevice', 'mobile')
store.dispatch('CloseSideBar', { withoutAnimation: true })
}
},
methods: {
isMobile() {
const rect = body.getBoundingClientRect()
return rect.width - RATIO < WIDTH
},
resizeHandler() {
if (!document.hidden) {
const isMobile = this.isMobile()
store.dispatch('ToggleDevice', isMobile ? 'mobile' : 'desktop')
if (isMobile) {
store.dispatch('CloseSideBar', { withoutAnimation: true })
}
}
}
}
}
<template>
<div class="footer">
<el-link style="color: #fff;font-size: 12px;">如遇问题请联系我们</el-link>
<div>Copyright © 2020 Powered By 泉州六方网络科技有限公司</div>
</div>
</template>
<script>
export default {
name: 'bottomFooter',
methods: {}
}
</script>
<style scoped>
.footer {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 88px;
padding: 0 20px;
color: #FFFFFF;
font-size: 12px;
}
.footer div {
margin-top: 10px;
}
</style>
<template>
<div class="nav">
<img src="@/assets/images/ic_logo.png" />
</div>
</template>
<script>
export default {
name: 'topNav',
methods: {}
}
</script>
<style scoped>
.nav {
display: flex;
flex-direction: row;
align-items: center;
height: 88px;
background-color: white;
}
.nav img {
height: 43px;
margin-left: 104px;
}
</style>
<template>
<div class="container">
<div class="content">
<img class="logo"
src="@/assets/images/ic_logo.png"/>
<el-row :gutter="20" type="flex" justify="space-between" align="middle" class="my-form">
<el-col :span="12">
<img class="bg-img"
src="@/assets/images/Diagram.png"/>
</el-col>
<el-col :span="9">
<div class="password-form-layout">
<div class="password-title">找回密码(1/2)</div>
<el-form>
<el-form-item prop="username">
<el-input type="text"
placeholder="请输入登录手机号">
<span slot="prefix">
<i class="el-icon-user" />
</span>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="text"
placeholder="请输入短信验证码">
<span slot="prefix">
<i class="el-icon-mobile-phone" />
</span>
<span slot="suffix">
<el-button type="primary"
size="mini">发送短信</el-button>
</span>
</el-input>
<div class="row">
<el-link style="color:#C5CDD3;" @click="goLogin">立即登录</el-link>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary"
style="width: 100%;border-radius: 20px;"
:loading="loading"
@click.native.prevent="resetPassword">重设密码</el-button>
</el-form-item>
</el-form>
</div>
</el-col>
</el-row>
</div>
<bottom-footer />
</div>
</template>
<script>
import TopNav from './components/TopNav'
import BottomFooter from './components/BottomFooter'
export default {
name: 'ForgetPwd',
components: {
TopNav,
BottomFooter
},
data () {
return {
loading: false
}
},
created () {
},
methods: {
resetPassword () {
},
goLogin () {
this.$router.go(-1)
}
}
}
</script>
<style scoped>
.container {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: url("~@/assets/images/bg.png") no-repeat;
background-size: 100% 100%;
}
.container .content {
width: 60%;
padding: 3%;
height: 70%;
background: #FFFFFF;
border-radius: 10px;
display: flex;
flex-direction: column;
}
.content .bg-img {
width: 100%;
}
.row{
padding-bottom: 5px;
font-size:10px;
color: #C5CDD3;
}
.container .logo {
width: 12%;
}
.my-form {
padding-top: 5%;
flex: 1;
align-items: center;
}
.password-form-layout {
z-index: 9;
}
.password-title {
color: #AFB0B3;
font-size: 25px;
text-align: center;
margin-bottom: 20px;
}
.password-form-layout .el-input .el-divider {
margin: 0;
}
</style>
<style>
.password-form-layout .el-input__inner {
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
}
</style>
<template>
<div class="container">
<div class="content">
<img class="logo"
src="@/assets/images/ic_logo.png"/>
<el-row :gutter="20" type="flex" justify="space-between" align="middle" class="my-form">
<el-col :span="12">
<img class="bg-img"
src="@/assets/images/Diagram.png"/>
</el-col>
<el-col :span="9">
<div class="login-form-layout">
<div class="login-title">账号登录</div>
<el-form autoComplete="on"
:model="loginForm"
:rules="loginRules"
ref="loginForm"
label-position="left">
<el-form-item prop="username">
<el-input name="username"
type="text"
v-model="loginForm.username"
autoComplete="on"
placeholder="请输入用户名">
<span slot="prefix">
<i class="el-icon-user-solid"/>
</span>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input name="password"
:type="pwdType"
@keyup.enter.native="handleLogin"
v-model="loginForm.password"
autoComplete="on"
placeholder="请输入密码">
<span slot="prefix">
<svg-icon style="width: 15px;"
icon-class="password"></svg-icon>
</span>
<!-- <span slot="suffix"
@click="showPwd">
<svg-icon icon-class="eye"></svg-icon>
</span> -->
</el-input>
</el-form-item>
<el-form-item prop="authCode">       
<el-input type="text" v-model="loginForm.authCode" autoComplete="on"
placeholder="请输入验证码">
<span slot="prefix">
<svg-icon style="width: 15px;"
icon-class="safe"></svg-icon>
</span>
 
</el-input>
<img style="width:100px; padding: 8px;position: absolute;bottom: 10px;right: 10px;"
:src="captchaImage" alt="" @click="refreshCode"> 
</el-form-item>
<div class="row">
<p @click="forgetPwd">忘记密码</p>
</div>
<el-form-item>
<el-button type="primary"
style="width: 100%;border-radius: 20px;"
:loading="loading"
@click.native.prevent="handleLogin">登录
</el-button>
</el-form-item>
</el-form>
</div>
</el-col>
</el-row>
</div>
<bottom-footer/>
</div>
</template>
<script>
import { setSupport, getSupport, setCookie, getCookie } from '@/utils/support'
import { getCaptchaImage } from '@/api/login'
import TopNav from './components/TopNav'
import BottomFooter from './components/BottomFooter'
export default {
name: 'login',
components: {
TopNav,
BottomFooter
},
data() {
const validateUsername = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入正确的用户名'))
} else {
callback()
}
}
const validatePass = (rule, value, callback) => {
if (value.length < 3) {
callback(new Error('密码不能小于3位'))
} else {
callback()
}
}
return {
captchaImage: null,
codeList: [],
loginForm: {
username: '',
password: '',
authCode: null,
},
loginRules: {
username: [{ required: true, trigger: 'blur', validator: validateUsername }],
password: [{ required: true, trigger: 'blur', validator: validatePass }],
authCode: [{ required: true, trigger: 'blur', message: '验证码不能为空' }],
},
loading: false,
pwdType:
'password'
}
},
created() {
let username = getCookie('username')
let password = getCookie('password')
if (username) {
this.loginForm.username = username
}
if (password) {
this.loginForm.password = password
}
this.getCaptchaImage()
},
methods: {
getCaptchaImage() {
// axios.get('/user?ID=12345')
// .then(function (response) {
// console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
getCaptchaImage().then(res => {
console.log(res)
this.captchaImage = res.data.url
})
},
refreshCode() {
console.log('re')
this.getCaptchaImage()
},
showPwd() {
if (this.pwdType === 'password') {
this.pwdType = ''
} else {
this.pwdType = 'password'
}
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
console.log('this.loginForm', this.loginForm)
this.$store.dispatch('Login', this.loginForm).then(() => {
this.loading = false
setCookie('username', this.loginForm.username, 15)
setCookie('password', this.loginForm.password, 15)
this.$router.push({ path: '/' })
}).catch(() => {
this.loading = false
})
} else {
console.log('参数验证不合法!')
return false
}
})
},
forgetPwd() {
this.$router.push('/forget')
}
}
}
</script>
<style scoped>
.container {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: url("~@/assets/images/bg.png") no-repeat;
background-size: 100% 100%;
}
.container .content {
width: 60%;
padding: 3%;
height: 70%;
background: #FFFFFF;
border-radius: 10px;
display: flex;
flex-direction: column;
}
.content .bg-img {
width: 100%;
}
.row{
padding-bottom: 5px;
font-size:10px;
color: #C5CDD3;
}
.container .logo {
width: 12%;
}
.my-form {
padding-top: 5%;
flex: 1;
align-items: center;
}
.login-form-layout {
z-index: 9;
}
.login-title {
color: #AFB0B3;
font-size: 25px;
text-align: center;
margin-bottom: 20px;
}
.login-form-layout .el-input .el-divider {
margin: 0;
}
</style>
<style>
.login-form-layout .el-input__inner {
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
}
</style>
<template>
<el-card class="operate-container"
shadow="never">
<!--操作栏-->
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="操作人:">
<el-input v-model="listQuery.name"
placeholder="请输入操作人名称"></el-input>
</el-form-item>
<el-form-item label="操作时间:">
<el-date-picker type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始时间"
v-model="listQuery.startingTime">
</el-date-picker>
<el-date-picker type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="结束时间"
v-model="listQuery.endTime">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
size="small">搜索</el-button>
<el-button style="float:right;margin-right: 15px"
@click="handleResetSearch"
size="small">重置</el-button>
</el-form-item>
</el-form>
<el-divider></el-divider>
<!--列表-->
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
border>
<el-table-column label="操作人"
align="center"
prop="adminName">
</el-table-column>
<el-table-column label="操作内容"
align="center"
prop="content">
</el-table-column>
<el-table-column label="操作时间"
align="center"
prop="module">
<template slot-scope="scope">{{scope.row.createTime | formatTime}}</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:page-size="listQuery.pageSize"
:page-sizes="[10, 20, 30, 50, 100]"
:current-page.sync="listQuery.pageNum"
:total="total">
</el-pagination>
</div>
</el-card>
</template>
<script>
import { logRequest } from '@/api/login'
import moment from 'moment/moment'
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
startingTime: null,
endTime: null,
type: 0,
name: null
}
export default {
name: "capitalSubsidiary",
comments: [],
data() {
return {
total: 0,
listLoading: false,
list: [],
listQuery: Object.assign({}, defaultListQuery)
}
},
created() {
let name = this.$route.params.name
if (name) {
this.listQuery.name = name
}
this.logRequest()
},
methods: {
//时间戳转化时间
dateFormat: function (row, column) {
var date = row[column.property]
if (date == undefined) {
return ""
}
return this.moment(date).format("YYYY-MM-DD")
},
//时间戳转化时间
timeFormat: function (row, column) {
var date = row[column.property]
if (date == undefined) {
return "--"
}
return this.moment(date).format("HH:mm:ss")
},
// 条件查询
handleSearchList() {
this.listQuery.pageNum = 1
this.logRequest()
},
//表单重置
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
his.logRequest()
},
// 每页页数变化
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.logRequest()
},
//当前页变化
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.logRequest()
},
// 日志
logRequest() {
this.listLoading = true
logRequest(this.listQuery).then(response => {
this.listLoading = false
this.list = response.data.list
this.total = response.data.total
}).catch(err => {
this.listLoading = false
})
}
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
}
</script>
<style scoped>
.operate-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
padding-top: 20px;
margin-top: 0;
}
</style>
<template> 
<el-card class="form-container" shadow="never">
<el-form :model="setting"
ref="orderSettingForm"
:rules="rules">
<el-form-item prop="stockWarning">
<div>物品数量少于多少预警(个/件):</div>
<el-input v-model="setting.stockWarning" class="input-width">
</el-input>
</el-form-item>
<el-form-item prop="receiveInterval">
<div>物品领用间隔时间(小时):</div>
<el-input v-model="setting.receiveInterval" class="input-width">
</el-input>
</el-form-item>
<el-form-item>
<el-button
@click="confirm('orderSettingForm')"
type="primary">提交</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
import {getSetting,editSetting} from '@/api/setting';
const defaultOrderSetting = {
id: null,
stockWarning: 0,
receiveInterval: 0
};
const checkTime = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入'))
} else {
let myReg = /^\d{1,}$/
if (!myReg.test(value)) {
callback(new Error('请输入数字值'))
}
callback()
}
}
// const checkTime = (rule, value, callback) => {
// if (!value) {
// return callback(new Error('时间不能为空'));
// }
// console.log("checkTime",value);
// let intValue = parseInt(value);
// if (!Number.isInteger(intValue)) {
// return callback(new Error('请输入数字值'));
// }
// callback();
// };
export default {
name: 'setting',
data() {
return {
setting: Object.assign({}, defaultOrderSetting),
rules: {
stockWarning:{validator: checkTime, trigger: 'blur' },
receiveInterval: {validator: checkTime, trigger: 'blur' }
}
}
},
created(){
this.getDetail();
},
methods:{
confirm(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
this.$confirm('是否要提交修改?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
editSetting(this.setting).then(response=>{
this.$message({
type: 'success',
message: '提交成功!',
duration:1000
});
})
});
} else {
this.$message({
message: '提交参数不合法',
type: 'warning'
});
return false;
}
});
},
getDetail(){
getSetting().then(res=>{
if(res.data){
this.setting={
id: res.data.id,
receiveInterval: res.data.receiveInterval,
stockWarning: res.data.stockWarning
}
}
})
}
}
}
</script>
<style scoped>
.input-width {
width: 50%;
}
.note-margin {
margin-left: 15px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="供应商名称:">
<el-input v-model="listQuery.name"
class="input-width"
placeholder="请输入供应商名称"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置</el-button>
</el-form-item>
<el-button class="btn-add"
size="small"
type="primary"
@click="handleAdd">添加供应商
</el-button>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="供应商名称"
align="center">
<template slot-scope="scope">{{scope.row.supplierName}}</template>
</el-table-column>
<el-table-column label="联系人"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="联系方式"
align="center">
<template slot-scope="scope">{{scope.row.tel || '--'}}</template>
</el-table-column>
<el-table-column label="供应物品"
align="center">
<template slot-scope="scope">{{scope.row.goodsNum || 0}}</template>
</el-table-column>
<el-table-column label="备注"
align="center">
<template slot-scope="scope">{{scope.row.remarks}}</template>
</el-table-column>
<el-table-column label="操作"
width="220"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="primary"
@click="handleEdit(scope.row.id)">编辑</el-button>
<el-button size="mini"
type="danger"
@click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- end -->
<!-- 弹窗 -->
<add-supplier ref="addSupplier"
@ok="getList"></add-supplier>
<!-- end -->
</div>
</template>
<script>
import { getSuppliersList, editSupplier } from '@/api/supplier'
import AddSupplier from './modules/AddSupplier'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
name: ''
}
export default {
name: 'SupplierList',
components: {AddSupplier},
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
getSuppliersList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 添加供应商
handleAdd () {
this.$refs.addSupplier.add()
},
// 删除
handleDelete(id) {
this.$confirm('是否删除该供应商?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
editSupplier({id: id,deleteStatus: 0 }).then(res=>{
this.getList()
})
}).catch(() => {
});
},
//编辑
handleEdit(id) {
this.$refs.addSupplier.detail(id)
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.primary{
color: #409EFF;
}
.el-row {
margin-bottom: 20px;
}
.mt15 {
margin-top: 15px;
}
.el-input {
width: 200px;
}
.input-width {
width: 180px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="720px">
<!-- start -->
<el-form :model="model"
ref="myForm"
v-loading="loading"
label-width="200px">
<div class="scroll-container"
ref="scrollContainer">
<el-form-item label="供应商名称:"
:rules="[{required: true, trigger: 'blur', message: '供应商名称不能为空'}]"
prop="supplierName">
<el-input size="small"
class="input-width"
v-model="model.supplierName"></el-input>
</el-form-item>
<el-form-item label="联系人:"
:rules="[{required: true, trigger: 'blur', message: '联系人不能为空'}]"
prop="name">
<el-input size="small"
class="input-width"
v-model="model.name"></el-input>
</el-form-item>
<el-form-item label="联系方式:"
:rules="[ {required: true,validator: validatePhone, trigger: 'blur'}]"
prop="tel">
<el-input size="small"
class="input-width"
v-model="model.tel"></el-input>
</el-form-item>
<el-form-item label="备注:"
prop="remarks"
:rules="[{required: true, trigger: 'blur', message: '备注不能为空'}]">
<el-input size="small"
type="textarea"
class="input-width"
maxlength="32"
show-word-limit
:autosize="{ minRows: 3, maxRows: 6}"
v-model="model.remarks"></el-input>
</el-form-item>
</div>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认
</el-button>
<el-button @click="close">取消</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { addSupplier,getSupplierDetail, editSupplier } from '@/api/supplier'
// 添加编辑属性
export default {
name: 'AddSupplier',
data() {
const validatePhone = (rule, value, callback) => {
if (value === '') {
callback(new Error('请填写手机号码'))
} else {
if (!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(value))) {
callback(new Error('手机号码格式有误'))
} else {
callback()
}
}
}
return {
visible: false,
title: null,
loading: false,
id: null,
model: {},
validatePhone: validatePhone
}
},
methods: {
init() {
this.model = {
supplierName: null,
name: null,
remarks: null,
tel: null
}
this.$nextTick(() => {
this.$refs.myForm.clearValidate()
this.$refs.scrollContainer.scrollTop = 0
})
},
add() {
this.id = null
this.init()
this.visible = true
this.title = '添加供应商'
},
detail(id) {
this.id = id
this.init()
this.visible = true
this.title = '编辑供应商'
this.loading = true
getSupplierDetail({ id: id }).then(res => {
this.model = res.data
this.loading = false
}).catch(err => {
this.loading = false
this.close()
})
},
// 提交保存
submit() {
this.$refs.myForm.validate((valid) => {
if (valid) {
// 验证通过
if (this.id) {
// 修改属性
this.loading = true
let params = {
id: this.model.id,
supplierName: this.model.supplierName,
name: this.model.name,
tel: this.model.tel,
remarks: this.model.remarks
}
editSupplier(params).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
} else {
// 添加属性
this.loading = true
addSupplier(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
}
}
})
},
close() {
this.$emit('close')
this.visible = false
}
}
}
</script>
<style scoped>
.scroll-container {
max-height: 50vh;
overflow: hidden;
overflow-y: auto;
}
.input-width {
width: 300px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="供应商:">
<el-select v-model="listQuery.supplierId"
class="input-width"
clearable
placeholder="请选择供应商">
<el-option v-for="item in supplierOptions"
:key="item.id"
:label="item.supplierName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="物品类别:">
<el-select v-model="listQuery.goodsCategoryId"
class="input-width"
clearable
placeholder="请选择物品类别"
@visible-change="handleOpenCate">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="物品:">
<el-select v-model="listQuery.goodsId"
class="input-width"
clearable
placeholder="请选择物品"
@visible-change="handleOpenGoods">
<el-option v-for="item in goodOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<ve-line :data="chartData"
:legend-visible="false"
:loading="loading"
:data-empty="dataEmpty"
></ve-line>
</div>
</el-card>
</div>
</template>
<script>
import moment from 'moment'
import { str2Date } from '@/utils/date'
import { getSuppliersList } from '@/api/supplier'
import { getGoodsList, getGoodsCategoryList } from '@/api/inventory'
import { getInventoryList } from '@/api/report'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
goodsId: '',
supplierId: '',
goodsCategoryId: ''
}
export default {
name: 'InventoryChart',
data() {
return {
categoryOptions: [],
supplierOptions: [],
goodOptions: [],
inventoryList: [],
orderCountDate: '',
statusOptions: [{
label: '启用',
value: 1
},
{
label: '禁用',
value: 0
}],
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
chartData: {
columns: ['data', 'num'],
rows: []
},
loading: false,
dataEmpty: false
}
},
created() {
this.getSuppliersList()
// this.getData()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
getDay(day) {
var today = new Date()
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day
today.setTime(targetday_milliseconds) //注意,这行是关键代码
var tYear = today.getFullYear()
var tMonth = today.getMonth()
var tDate = today.getDate()
tMonth = this.doHandleMonth(tMonth + 1)
tDate = this.doHandleMonth(tDate)
console.log('tYear + \'-\' + tMonth + \'-\' + tDate',tYear + '-' + tMonth + '-' + tDate)
return tYear + '-' + tMonth + '-' + tDate
},
doHandleMonth(month) {
var m = month
if (month.toString().length == 1) {
m = '0' + month
}
return m
},
formatEveryDay() {
let start1 = this.getDay(-7)
let end1 = this.getDay(0)
console.log('start1','end1',start1,end1)
let dateList = []
var startTime = this.getDate(start1)
var endTime = this.getDate(end1)
while ((endTime.getTime() - startTime.getTime()) >= 0) {
var year = startTime.getFullYear()
var month = startTime.getMonth() + 1 < 10 ? '0' + (startTime.getMonth() + 1) : startTime.getMonth() + 1
var day = startTime.getDate().toString().length == 1 ? '0' + startTime.getDate() : startTime.getDate()
dateList.push(year + '-' + month + '-' + day)
startTime.setDate(startTime.getDate() + 1)
}
console.log('dateList',dateList)
return dateList
},
getDate(datestr) {
var temp = datestr.split('-')
var date = new Date(temp[0], temp[1] - 1, temp[2])
console.log('date', date)
return date
},
handleOpenCate(visible) {
if (visible) {
this.getGoodsCategoryList()
}
},
handleOpenGoods(visible) {
if (visible) {
this.getGoodsList()
}
},
// 物品
getGoodsList() {
getGoodsList({
goodsCategoryI: this.listQuery.goodsCategoryId,
supplierId: this.listQuery.supplierId
}).then(res => {
this.goodOptions = res.data.list
})
},
// 物品类别
getGoodsCategoryList() {
getGoodsCategoryList({ supplierId: this.listQuery.supplierId }).then(res => {
this.categoryOptions = res.data.list
})
},
// 供应商
getSuppliersList() {
getSuppliersList().then(res => {
this.supplierOptions = res.data.list
})
},
getList() {
if (!this.listQuery.goodsId) {
this.$message.warning('请选择物品')
return
}
getInventoryList({ dateList: this.formatEveryDay(), goodsId: this.listQuery.goodsId }).then(res => {
this.chartData.rows = res.data
console.log('res', this.chartData)
})
},
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
handleAdd() {
this.$refs.addGoods.add()
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button {
width: 100px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="供应商:">
<el-select v-model="listQuery.supplierId"
class="input-width"
clearable
placeholder="请选择供应商">
<el-option v-for="item in supplierOptions"
:key="item.id"
:label="item.supplierName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="物品类别:">
<el-select v-model="listQuery.goodsCategoryId"
class="input-width"
clearable
placeholder="请选择物品类别"
@visible-change="handleOpenCate">
<el-option v-for="item in categoryOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="物品:">
<el-select v-model="listQuery.goodsId"
class="input-width"
clearable
placeholder="请选择物品"
@visible-change="handleOpenGoods">
<el-option v-for="item in goodOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<ve-line :data="chartData"
:legend-visible="false"
:loading="loading"
:data-empty="dataEmpty"
></ve-line>
</div>
</el-card>
</div>
</template>
<script>
import moment from 'moment'
import { str2Date } from '@/utils/date'
import { getSuppliersList } from '@/api/supplier'
import { getGoodsList, getGoodsCategoryList } from '@/api/inventory'
import { getRecipientList } from '@/api/report'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
goodsId: '',
supplierId: '',
goodsCategoryId: ''
}
export default {
name: 'Recipients',
data() {
return {
categoryOptions: [],
supplierOptions: [],
goodOptions: [],
inventoryList: [],
orderCountDate: '',
statusOptions: [{
label: '启用',
value: 1
},
{
label: '禁用',
value: 0
}],
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
chartData: {
columns: ['data', 'num'],
rows: []
},
loading: false,
dataEmpty: false
}
},
created() {
this.getSuppliersList()
// this.getData()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
getDay(day) {
var today = new Date()
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day
today.setTime(targetday_milliseconds) //注意,这行是关键代码
var tYear = today.getFullYear()
var tMonth = today.getMonth()
var tDate = today.getDate()
tMonth = this.doHandleMonth(tMonth + 1)
tDate = this.doHandleMonth(tDate)
console.log('tYear + \'-\' + tMonth + \'-\' + tDate',tYear + '-' + tMonth + '-' + tDate)
return tYear + '-' + tMonth + '-' + tDate
},
doHandleMonth(month) {
var m = month
if (month.toString().length == 1) {
m = '0' + month
}
return m
},
formatEveryDay() {
let start1 = this.getDay(-7)
let end1 = this.getDay(0)
console.log('start1','end1',start1,end1)
let dateList = []
var startTime = this.getDate(start1)
var endTime = this.getDate(end1)
while ((endTime.getTime() - startTime.getTime()) >= 0) {
var year = startTime.getFullYear()
var month = startTime.getMonth() + 1 < 10 ? '0' + (startTime.getMonth() + 1) : startTime.getMonth() + 1
var day = startTime.getDate().toString().length == 1 ? '0' + startTime.getDate() : startTime.getDate()
dateList.push(year + '-' + month + '-' + day)
startTime.setDate(startTime.getDate() + 1)
}
console.log('dateList',dateList)
return dateList
},
getDate(datestr) {
var temp = datestr.split('-')
var date = new Date(temp[0], temp[1] - 1, temp[2])
console.log('date', date)
return date
},
handleOpenCate(visible) {
if (visible) {
this.getGoodsCategoryList()
}
},
handleOpenGoods(visible) {
if (visible) {
this.getGoodsList()
}
},
// 物品
getGoodsList() {
getGoodsList({
goodsCategoryI: this.listQuery.goodsCategoryId,
supplierId: this.listQuery.supplierId
}).then(res => {
this.goodOptions = res.data.list
})
},
// 物品类别
getGoodsCategoryList() {
getGoodsCategoryList({ supplierId: this.listQuery.supplierId }).then(res => {
this.categoryOptions = res.data.list
})
},
// 供应商
getSuppliersList() {
getSuppliersList().then(res => {
this.supplierOptions = res.data.list
})
},
getList() {
if(!this.listQuery.goodsId){
this.$message.warning('请选择物品')
return
}
getRecipientList({ dateList: this.formatEveryDay(), goodsId: this.listQuery.goodsId }).then(res => {
this.chartData.rows = res.data
})
},
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
handleAdd() {
this.$refs.addGoods.add()
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.mt15 {
margin-top: 15px;
}
.input-width {
width: 180px;
}
.btn-groups button {
width: 100px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="600px">
<el-form :model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="140px">
<el-form-item label="请输入新手机号:"
prop="phone">
<el-input v-model="ruleForm.phone">
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary">获取验证码</el-button>
</el-form-item>
<el-form-item label="请输入验证码:"
prop="code">
<el-input v-model="ruleForm.code">
</el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submitForm('ruleForm')">保存</el-button>
</div>
</el-dialog>
</template>
<script>
import { getInfo, updateBindPhone } from '@/api/login'
export default {
neme: 'ChangeTel',
data () {
var checkTel = (rule, value, callback) => {
if (!value) {
return callback(new Error('手机号不能为空'))
} else {
const reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/
console.log(reg.test(value));
if (reg.test(value)) {
callback()
} else {
return callback(new Error('请输入正确手机号'));
}
}
}
return {
visible: false,
title: null,
loading: false,
model: null,
ruleForm: {
tel: '',
code: '666666'
},
userData: {},
rules: {
tel: [
{ type: 'number', required: true, validator: checkTel, trigger: 'blur' }
],
code: [
{ required: true, message: '验证码不能为空', trigger: 'blur' }
]
}
}
},
methods: {
detail () {
this.visible = true
this.title = '更换绑定手机号码'
this.getUserInfo()
},
getUserInfo () {
getInfo().then(res => {
this.ruleForm.userId = res.data.userId
})
},
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
updateBindPhone(this.ruleForm).then(res => {
this.visible = false
this.$message({
type: 'success',
message: '修改成功,请重新登录!'
})
this.$store.dispatch('LogOut').then(() => {
location.reload()
})
})
}
})
}
}
}
</script>
<style scoped>
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
v-model="loading"
top="100px"
center
width="600px">
<el-upload class="avatar-uploader"
:action="dataObj.host"
:data="dataObj"
list-type="picture"
:multiple="false"
:show-file-list="false"
:before-upload="beforeUpload"
:on-success="handleUploadSuccess">
<img v-if="imageUrl"
:src="imageUrl"
class="avatar">
<i v-else
class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<div class="postil">上传企业Logo / 个人头像</div>
<el-form :model="userForm"
status-icon
size="small"
ref="userForm"
label-width="120px">
<el-form-item label="用户名:"
prop="username">
<el-input v-model="userForm.username"
disabled></el-input>
</el-form-item>
<el-form-item label="注册手机号:"
prop="phone">
<el-input v-model="userForm.phone"
disabled></el-input>
</el-form-item>
<!-- <el-form-item label="请输入验证码:"
prop="code">
<el-input v-model="userForm.code">
<template slot="append">发送验证码</template>
</el-input>
</el-form-item> -->
<el-form-item label="请输入新密码:"
:rules="[{ required: true, validator: validatePass, trigger: 'blur' }]"
prop="password">
<el-input type="password"
v-model="userForm.password"
auto-complete="new-password"></el-input>
</el-form-item>
<el-form-item label="请再次输入:"
:rules="[{ required: true, validator: validateCheckPass, trigger: 'blur' }]"
prop="checkPassword">
<el-input type="password"
v-model="userForm.checkPassword"
auto-complete="new-password"></el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submitForm('userForm')">保存</el-button>
</div>
</el-dialog>
</template>
<script>
import SingleUpload from '@/components/Upload/singleUpload'
import { policy } from '@/api/oss'
import { getInfo, updateUser, updatePassword } from '@/api/login'
export default {
name: 'PersonalInfo',
components: {
SingleUpload
},
data() {
return {
visible: false,
title: null,
loading: false,
imageUrl: '',
userForm: {},
dataObj: {
policy: '',
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: 'http://haihaigo.oss-cn-shenzhen.aliyuncs.com'
}
}
},
methods: {
detail() {
this.visible = true
this.title = '编辑个人资料'
this.getUserInfo()
},
getUserInfo() {
this.loading = true
getInfo().then(res => {
this.loading = false
this.userForm = res.data
this.imageUrl = res.data.icon
}).catch(err => {
this.loading = false
})
},
validatePass(rule, value, callback) {
if (value === '') {
callback(new Error('请输入密码'))
} else {
callback()
}
},
validateCheckPass(rule, value, callback) {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== this.userForm.password) {
callback(new Error('两次输入密码不一致!'))
} else {
callback()
}
},
beforeUpload(file) {
let _self = this
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy
_self.dataObj.signature = response.data.signature
_self.dataObj.ossaccessKeyId = response.data.accessKeyId
_self.dataObj.key = response.data.dir + '/${filename}'
_self.dataObj.dir = response.data.dir
_self.dataObj.host = response.data.host
resolve(true)
}).catch(err => {
reject(false)
})
})
},
handleUploadSuccess(res, file) {
let imgUrl = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.name
this.loading = true
updateUser(this.userForm.userId, { icon: imgUrl }).then(res => {
this.loading = false
this.$store.commit('SET_AVATAR', imgUrl)
this.imageUrl = imgUrl
this.$message.success('头像修改成功')
}).catch(err => {
this.loading = false
})
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
let params = {
userId: this.userForm.userId,
code: '666666',
pwd: this.userForm.password
}
this.loading = true
updatePassword(params).then(res => {
this.loading = false
this.visible = false
this.$message.success('修改成功,请重新登录!')
this.$store.dispatch('LogOut').then(() => {
location.reload()
})
}).catch(err => {
this.loading = false
})
}
})
}
}
}
</script>
<style scoped>
.avatar-uploader {
text-align: center;
height: 100px;
}
.avatar-uploader .avatar-uploader-icon {
border: 2px solid #8c939d;
border-radius: 50%;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader img {
border: 2px solid #8c939d;
border-radius: 50%;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .avatar-uploader-icon:hover {
border-color: #409eff;
color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
.postil {
font-size: 12px;
text-align: center;
}
</style>
<template> 
<div class="app-container">
<!-- 操作栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<!-- <el-form-item label="部门:">-->
<!-- <el-cascader v-model="listQuery.departIds"-->
<!-- style="width: 250px;"-->
<!-- :props="{ expandTrigger: 'hover', checkStrictly: true, value: 'id', label: 'departName', children: 'departParamList' }"-->
<!-- :options="allDepartList"></el-cascader>-->
<!-- </el-form-item>-->
<el-form-item label="角色名:">
<el-select v-model="listQuery.roleId"
style="width: 250px;">
<el-option v-for="item in allRoleList"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
size="small">搜索</el-button>
<el-button style="float:right;margin-right: 15px"
@click="handleResetSearch"
size="small">重置</el-button>
</el-form-item>
<el-button size="small"
type="primary"
class="btn-add"
@click="handleAdd">添加</el-button>
</el-form>
</el-card>
<!-- 表格栏 -->
<div class="table-container">
<el-table ref="adminTable"
:data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="55"></el-table-column>
<el-table-column label="编号"
align="center"
prop="id">
</el-table-column>
<el-table-column label="登录名"
align="center"
prop="username">
</el-table-column>
<el-table-column label="姓名"
align="center"
prop="nickName">
</el-table-column>
<el-table-column label="手机号"
align="center"
prop="phone">
</el-table-column>
<el-table-column label="角色"
align="center"
prop="roleName">
</el-table-column>
<!-- <el-table-column label="部门"-->
<!-- align="center"-->
<!-- prop="departName">-->
<!-- </el-table-column>-->
<el-table-column label="添加时间"
align="center">
<template slot-scope="scope">{{scope.row.createDate | formatDateTime}}</template>
</el-table-column>
<el-table-column label="最后登录时间"
align="center">
<template slot-scope="scope">{{scope.row.loginTime | formatDateTime}}</template>
</el-table-column>
<el-table-column label="操作"
width="220"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="warning"
@click="handleUpdate(scope.row)">编辑
</el-button>
<el-button size="mini"
type="danger"
@click="handleDelete(scope.row)">删除
</el-button>
<el-button size="mini"
type="info"
@click="handleLook(scope.row)">日志
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 导出操作 -->
<!-- <div class="export-container">-->
<!-- <div class="content">-->
<!-- <el-button @click="exportData(0)"-->
<!-- :loading="exportLoading"-->
<!-- size="small">导出全部数据</el-button>-->
<!-- <el-button @click="exportData(1)"-->
<!-- :loading="exportLoading"-->
<!-- size="small">导出本页数据</el-button>-->
<!-- <el-button @click="exportData(2)"-->
<!-- :loading="exportLoading"-->
<!-- size="small">导出已选数据</el-button>-->
<!-- </div>-->
<!-- </div>-->
<!-- 分页 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,15,20]"
:total="total">
</el-pagination>
</div>
<!-- 弹窗 -->
<el-dialog :title="isEdit?'编辑用户':'添加用户'"
:visible.sync="dialogVisible"
center
width="550px">
<el-form :model="admin"
ref="adminForm"
label-width="150px"
size="small">
<el-form-item label="用户名称:"
prop="username"
:rules="[{ required: true, message: '用户名称不能为空', trigger: 'blur' }]">
<el-input v-model="admin.username"
:disabled="isEdit"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="姓名:"
prop="nickName"
:rules="[{ required: true, message: '姓名不能为空', trigger: 'blur' }]">
<el-input v-model="admin.nickName"
:disabled="isEdit"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="手机号:"
prop="phone"
:rules="[{ required: true, message: '手机号不能为空', trigger: 'blur' }]">
<el-input v-model="admin.phone"
:maxlength="11"
:disabled="isEdit"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="登录密码:"
prop="password"
:rules="[{ required: true, message: '登录密码不能为空', trigger: 'blur' }]">
<el-input v-model="admin.password"
type="password"
auto-complete="new-password"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="角色分配:"
prop="roleId"
:rules="[{ required: true, message: '角色不能为空', trigger: 'change' }]">
<el-select v-model="admin.roleId"
style="width: 250px;">
<el-option v-for="item in allRoleList"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="所属部门:"-->
<!-- prop="departIds">-->
<!-- <el-cascader v-if="isShowDepart"-->
<!-- v-model="admin.departIds"-->
<!-- style="width: 250px;"-->
<!-- :props="{ expandTrigger: 'hover', checkStrictly: true, value: 'id', label: 'departName', children: 'departParamList' }"-->
<!-- :options="allDepartList"></el-cascader>-->
<!-- </el-form-item>-->
</el-form>
<span slot="footer"
class="dialog-footer">
<el-button @click="dialogVisible = false"
size="small">取 消</el-button>
<el-button type="primary"
@click="submit"
size="small">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { fetchList, createAdmin, updateAdmin } from '@/api/admin'
import { getDepartmentList, getDepartmentDetail } from '@/api/department'
import { deleteAdmin, getRoleByAdmin } from '@/api/login'
import { fetchAllRoleList } from '@/api/role'
import { formatDate } from '@/utils/date'
const defaultListQuery = {
userId: null,
pageNum: 1,
pageSize: 10,
departIds: [],
departId: null,
roleId: null
}
const defaultAdmin = {
id: null,
username: null,
password: null,
nickName: null,
phone: null,
departIds: [],
departId: null,
roleId: null,
type: 1,
status: 1
}
export default {
name: 'adminList',
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
exportLoading: false,
multipleSelection: [],
dialogVisible: false,
admin: Object.assign({}, defaultAdmin),
isShowDepart: true,
allRoleList: [],
allDepartList: [],
isEdit: false
}
},
created() {
this.listQuery.userId = this.$store.getters.userId
this.getList()
this.getDataList()
},
filters: {
formatDateTime(time) {
if (time == null || time === '') {
return '--'
}
let date = new Date(time)
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.listQuery.userId = this.$store.getters.userId
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(val) {
this.multipleSelection = val
},
handleAdd() {
this.admin = Object.assign({}, defaultAdmin)
this.dialogVisible = true
this.isEdit = false
},
handleDelete(row) {
this.$confirm('该操作无法回退,请谨慎操作?', '是否要删除该管理员', {
confirmButtonText: '确定',
cancelButtonText: '取消',
center: true
}).then(() => {
deleteAdmin(row.id).then(response => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getList()
})
})
},
handleUpdate(row) {
this.admin = Object.assign({}, row)
this.admin.departIds = []
this.departDetail(row.departId)
this.dialogVisible = true
this.isEdit = true
},
departDetail(id) {
if (id == 0) {
this.isShowDepart = false
this.$nextTick(() => {
this.isShowDepart = true
})
} else {
getDepartmentDetail({ id }).then(res => {
this.admin.departIds.unshift(id)
this.departDetail(res.data.parentId)
})
}
},
handleLook(row) {
this.$router.push({ name: 'log', params: { name: row.username } })
},
getList() {
this.listLoading = true
let departIds = this.listQuery.departIds
if (departIds && departIds.length > 0) {
this.listQuery.departId = departIds[departIds.length - 1]
} else {
this.listQuery.departId = null
}
let params = Object.assign({}, this.listQuery)
delete params.departIds
fetchList(params).then(response => {
this.listLoading = false
this.list = response.data.list
this.total = response.data.total
}).catch(err => {
this.listLoading = false
})
},
getDataList() {
fetchAllRoleList().then(response => {
this.allRoleList = response.data
})
getDepartmentList().then(res => {
this.allDepartList = res.data
})
},
submit() {
this.$refs.adminForm.validate((valide) => {
if (valide) {
let departIds = this.admin.departIds
if (departIds && departIds.length > 0) {
this.admin.departId = departIds[departIds.length - 1]
} else {
this.admin.departId = null
}
if (this.admin.id) {
updateAdmin(this.admin.id, this.admin).then(res => {
this.dialogVisible = false
this.getList()
})
} else {
createAdmin({ roleId: this.admin.roleId, admin: this.admin }).then(res => {
this.dialogVisible = false
this.getList()
})
}
}
})
},
// 导出数据
// exportData(type) {
// this.exportLoading = true
// if (type == 0) {
// // 导出全部数据
// let params = Object.assign({}, this.listQuery)
// params.pageSize = this.total
// delete params.departIds
// fetchList(params).then(res => {
// this.exportExcel(res.data.list)
// }).catch(() => {
// this.exportLoading = false
// this.$message.error('获取导出数据失败,请重试!')
// })
// } else if (type == 2) {
// // 导出选中数据
// if (this.multipleSelection.length == 0) {
// this.exportLoading = false
// this.$message.warning('请选择要导出的数据')
// return
// }
// this.exportExcel(this.multipleSelection)
// } else {
// // 导出本页数据
// this.exportExcel(this.list)
// }
// },
// // 导出表格
// exportExcel(list) {
// require.ensure([], () => {
// const { export_json_to_excel } = require('@/vendor/Export2Excel')
// const tHeader = ['编号', '登录名', '姓名', '手机号', '角色', '部门', '添加时间', '最后登录时间']
// const filterVal = ['id', 'username', 'nickName', 'phone', 'roleName', 'departName', 'createTime', 'loginTime']
// const data = this.formatJson(filterVal, list)
// export_json_to_excel(tHeader, data, '管理员列表')
// this.exportLoading = false
// })
// },
// // 格式化导出数据
// formatJson(filterVal, jsonData) {
// return jsonData.map(v => {
// return filterVal.map(j => {
// if (j === 'createTime') {
// return this.$options.filters.formatDateTime(v[j])
// } else if (j === 'loginTime') {
// return this.$options.filters.formatDateTime(v[j])
// } else {
// return v[j] || '--'
// }
// })
// })
// }
}
}
</script>
<style></style>
<template>
<div class="app-container">
<!-- 添加部门 -->
<el-card shadow="never">
<el-button style="float:right;margin-bottom:15px;"
class="search-button"
type="primary"
size="small"
@click="addDepartment()">添加新部门</el-button>
</el-card>
<!-- 表格栏 -->
<div class="table-container">
<el-table :data="list"
ref="table"
row-key="id"
lazy
:load="loadChildren"
:tree-props="{children:'departParamList'}"
v-loading="listLoading"
border>
<el-table-column label="部门层级"
align="center">
<template slot-scope="scope">{{scope.row.level | formatLevel}}</template>
</el-table-column>
<el-table-column label="排序"
align="center">
<template slot-scope="scope">{{scope.row.departOrder}}</template>
</el-table-column>
<el-table-column label="部门名称"
align="center">
<template slot-scope="scope">{{scope.row.departName}}</template>
</el-table-column>
<el-table-column label="分类图标"
align="center">
<template slot-scope="scope">
<el-image fit="contain"
:src="scope.row.url"
:preview-src-list="[scope.row.url]"></el-image>
</template>
</el-table-column>
<el-table-column label="成员数量"
align="center">
<template slot-scope="scope">{{scope.quantity || 0}}</template>
</el-table-column>
<el-table-column label="部门描述"
align="center">
<template slot-scope="scope">{{scope.row.description}}</template>
</el-table-column>
<el-table-column label="操作"
width="160"
align="center">
<template slot-scope="scope">
<el-row>
<el-button v-if="scope.row.level < 3"
size="mini"
type="text"
@click="addDepartment(scope.row)">添加子部门</el-button>
<el-button size="mini"
type="text"
@click="handleChange(scope.row)">转移</el-button>
</el-row>
<el-row>
<el-button size="mini"
type="text"
@click="handleEdit(scope.row)">编辑</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.row)">删除</el-button>
</el-row>
</template>
</el-table-column>
</el-table>
</div>
<!-- 转移部门弹窗 -->
<department-move-modal ref="moveModal"
@ok="getList"></department-move-modal>
<!-- 添加部门弹窗 -->
<add-department-modal ref="detailModal"
@ok="getList"></add-department-modal>
</div>
</template>
<script>
import { getDepartmentList, deleteDepartment } from '@/api/department'
import departmentMoveModal from './modules/departmentMoveModal'
import addDepartmentModal from './modules/addDepartmentModal'
export default {
name: 'department',
components: {
departmentMoveModal,
addDepartmentModal
},
data () {
return {
list: [],
listLoading: false
}
},
created () {
this.getList()
},
filters: {
formatLevel (level) {
if (level == 3) {
return '三级'
} else if (level == 2) {
return '二级'
} else {
return '一级'
}
}
},
methods: {
// 添加新部门
addDepartment (row) {
this.$refs.detailModal.add(row)
},
// 转移新部门
handleChange (row) {
this.$refs.moveModal.show(row)
},
// 编辑部门
handleEdit (row) {
this.$refs.detailModal.detail(row.id)
},
//删除部门
handleDelete (row) {
this.$confirm('删除这条数据前请确保其部门下没有任何成员', '您确定要删除' + row.departName + '吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
center: true
}).then(() => {
deleteDepartment({ id: row.id }).then(res => {
this.getList(row.parentId)
})
})
},
getList () {
this.listLoading = true
//请求数据
getDepartmentList().then(res => {
this.listLoading = false
this.list = res.data
list.map(item => {
item.hasChildren = item.level < 3
})
this.list = list
}).catch(err => {
this.listLoading = false
})
},
//加载子节点数据
loadChildren (row, treeNode, resolve) {
getDepartmentList().then(res => {
let list = res.data
list.map(item => {
item.hasChildren = item.level < 3
})
resolve(list)
})
},
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="650px">
<el-form :model="model"
v-loading="loading"
ref="rulesForm"
label-width="100px">
<el-form-item label="部门排序:"
prop="departOrder">
<el-input v-model="model.departOrder"></el-input>
<p class="remark">数字越小,排名越靠前,如果为空,默认排序方式为创建时间</p>
</el-form-item>
<el-form-item label="上级部门:"
prop="parent"
disabled>
<el-input v-model="model.parent"></el-input>
</el-form-item>
<el-form-item label="部门名称:"
prop="departName"
:rules="[{required:true,message:'请输入部门名称',trigger:'blur'}]">
<el-input v-model="model.departName"></el-input>
</el-form-item>
<el-form-item label="部门图标:"
prop="url">
<el-row type="flex"
align="bottom">
<el-image v-if="model.url"
:src="model.url"
style="width:100px;height:100px;"></el-image>
<single-upload v-model="model.url"
:showList="false"
class="upload"></single-upload>
</el-row>
<p class="remark">分类图标最佳尺寸200*200,商品分类图标显示在部门页面,标识部门特征</p>
</el-form-item>
<el-form-item label="部门描述:"
size="small"
prop="description">
<el-input v-model="model.description"></el-input>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submitForm">保存</el-button>
<el-button @click="close">返回部门列表</el-button>
</div>
</el-dialog>
</template>
<script>
import singleUpload from '@/components/Upload/singleUpload'
import { addDepartment, updateDepartment, getDepartmentDetail } from '@/api/department'
const defaultModel = {
id: null,
departOrder: '',
level: '',
parentId: '',
departName: '',
url: '',
description: ''
}
export default {
name: 'addDepartmentModal',
components: {
singleUpload
},
data () {
return {
visible: false,
title: null,
loading: false,
model: Object.assign({}, defaultModel)
}
},
methods: {
//添加数据
add (data) {
if (data) {
this.model.parentId = data.id
this.model.parent = data.departName
} else {
this.model.parentId = 0
this.model.parent = '顶级部门'
}
this.visible = true
this.title = '添加新部门'
},
//编辑部门
detail (id) {
this.model.id = id
this.visible = true
this.title = '编辑部门'
this.loading = true
getDepartmentDetail({ id }).then(res => {
res.data.parent = ''
this.model = res.data
this.loading = false
this.getParent(this.model.parentId)
}).catch(err => {
this.loading = false
this.close()
})
},
//判断上级部门的显示
getParent (id) {
if (id == 0) {
this.model.parent = '顶级部门'
} else {
getDepartmentDetail({ id }).then(res => {
let data = res.data
this.model.parent = data.departName
})
}
},
submitForm () {
this.$refs.rulesForm.validate((valid) => {
if (valid) {
//验证通过
this.loading = true
//修改编辑
if (this.model.id) {
updateDepartment(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok', this.model.parentId)
}).catch(err => {
this.loading = false
})
} else {
//新建部门
addDepartment(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok', this.model.parentId)
}).catch(err => {
this.loading = false
})
}
}
})
},
close () {
this.$emit('close')
this.visible = false
}
},
}
</script>
<style scoped>
.upload {
width: 100px;
display: inline-block;
margin-left: 10px;
line-height: 0px;
}
.remark {
margin: 0;
line-height: 25px;
font-size: 12px;
color: #999999;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="650px">
<el-form :model="model"
ref="moveForm"
v-loading="loading"
label-width="180px">
<el-form-item label="请选择要转移的部门:"
prop="parentId">
<el-cascader v-model="model.parentId"
size="small"
class="input-width"
expand-trigger="hover"
:props="props"></el-cascader>
<div class="tip">选择新部门后,所选成员将归属新的部门。</div>
</el-form-item>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认</el-button>
<el-button @click="close">取消</el-button>
</div>
</el-dialog>
</template>
<script>
import { getDepartmentList, transferDepartment } from '@/api/department'
export default {
name: 'departmentMoveModal',
data () {
const that = this
return {
visible: false,
title: null,
loading: false,
id: null,
model: {},
props: {
lazy: true,
checkStrictly: true,
lazyLoad (row, resolve) {
if (row.level == 0) {
row.value = 0
}
getDepartmentList().then(res => {
let list = res.data
list.map(item => {
item.value = item.id
item.label = item.departName
item.leaf = item.level >= 1
})
resolve(list)
})
}
}
}
},
methods: {
show (data) {
this.model = Object.assign({}, data)
this.title = '转移部门'
this.visible = true
},
submit () {
// 提交保存
this.$refs.moveForm.validate((valid) => {
if (valid) {
// 验证通过
this.loading = true
// 转移部门
let params = {
id: this.model.id,
transferId: this.model.parentId[this.model.parentId.length - 1]
}
transferDepartment(params).then(res => {
this.loading = false
this.visible = false
this.$emit('ok', this.model.parentId)
}).catch(err => {
this.loading = false
})
}
})
},
close () {
this.$emit('close')
this.visible = false
}
},
}
</script>
<style scoped>
.input-width {
width: 300px;
}
.tip {
color: #999;
}
</style>
<template> 
<menu-detail :is-edit='false'></menu-detail>
</template>
<script>
import MenuDetail from './components/MenuDetail'
export default {
name: 'addMenu',
components: { MenuDetail }
}
</script>
<style>
</style>
<template>
<el-card class="form-container"
shadow="never">
<el-form :model="menu"
:rules="rules"
ref="menuFrom"
label-width="150px">
<el-form-item label="菜单名称:"
prop="title">
<el-input v-model="menu.title"></el-input>
</el-form-item>
<el-form-item label="上级菜单:">
<el-select v-model="menu.parentId"
placeholder="请选择菜单">
<el-option v-for="item in selectMenuList"
:key="item.id"
:label="item.title"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="前端名称:"
prop="name">
<el-input v-model="menu.name"></el-input>
</el-form-item>
<el-form-item label="前端图标:"
prop="icon">
<el-input v-model="menu.icon"
style="width: 80%"></el-input>
<svg-icon style="margin-left: 8px"
:icon-class="menu.icon"></svg-icon>
</el-form-item>
<el-form-item label="是否显示:">
<el-radio-group v-model="menu.hidden">
<el-radio :label="0">是</el-radio>
<el-radio :label="1">否</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="排序:">
<el-input v-model="menu.sort"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="onSubmit('menuFrom')">提交</el-button>
<el-button v-if="!isEdit"
@click="resetForm('menuFrom')">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
import { fetchList, createMenu, updateMenu, getMenu } from '@/api/menu';
const defaultMenu = {
title: '',
parentId: 0,
name: '',
icon: '',
hidden: 0,
sort: 0,
type: 1
}
export default {
name: "MenuDetail",
props: {
isEdit: {
type: Boolean,
default: false
}
},
data() {
return {
menu: Object.assign({}, defaultMenu),
selectMenuList: [],
rules: {
title: [
{ required: true, message: '请输入菜单名称', trigger: 'blur' },
{ min: 2, max: 140, message: '长度在 2 到 140 个字符', trigger: 'blur' }
],
name: [
{ required: true, message: '请输入前端名称', trigger: 'blur' },
{ min: 2, max: 140, message: '长度在 2 到 140 个字符', trigger: 'blur' }
],
icon: [
{ required: true, message: '请输入前端图标', trigger: 'blur' },
{ min: 2, max: 140, message: '长度在 2 到 140 个字符', trigger: 'blur' }
]
}
}
},
created() {
if (this.isEdit) {
getMenu(this.$route.query.id).then(response => {
this.menu = response.data
this.getSelectMenuList()
});
} else {
this.menu = Object.assign({}, defaultMenu)
this.menu.type = this.$route.query.type
this.getSelectMenuList()
}
},
methods: {
getSelectMenuList() {
fetchList(0, { pageSize: 100, pageNum: 1, type: this.menu.type }).then(response => {
this.selectMenuList = response.data.list
this.selectMenuList.unshift({ id: 0, title: '无上级菜单' })
})
},
onSubmit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.$confirm('是否提交数据', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (this.isEdit) {
updateMenu(this.$route.query.id, this.menu).then(response => {
this.$message({
message: '修改成功',
type: 'success',
duration: 1000
})
this.$router.back()
})
} else {
createMenu(this.menu).then(response => {
this.$refs[formName].resetFields()
this.resetForm(formName)
this.$message({
message: '提交成功',
type: 'success',
duration: 1000
})
this.$router.back()
})
}
})
} else {
this.$message({
message: '验证失败',
type: 'error',
duration: 1000
})
return false
}
})
},
resetForm(formName) {
this.$refs[formName].resetFields()
this.menu = Object.assign({}, defaultMenu)
this.getSelectMenuList()
}
}
}
</script>
<style scoped>
</style>
<template>
<div class="app-container">
<el-card class="operate-container"
shadow="never">
<!-- <span style="margin-top: 5px">菜单所属:</span>-->
<!-- <el-select size="small"-->
<!-- v-model="listQuery.type"-->
<!-- @change="getList">-->
<!-- <el-option label="平台菜单"-->
<!-- :value="1"></el-option>-->
<!-- <el-option label="供应商菜单"-->
<!-- :value="2"></el-option>-->
<!-- </el-select>-->
<el-button class="btn-add"
type="primary"
@click="handleAddMenu"
size="small">添加</el-button>
</el-card>
<div class="table-container">
<el-table ref="menuTable"
style="width: 100%"
:data="list"
v-loading="listLoading"
border>
<el-table-column label="编号"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<el-table-column label="菜单名称"
align="center">
<template slot-scope="scope">{{scope.row.title}}</template>
</el-table-column>
<el-table-column label="菜单级数"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.level | levelFilter}}</template>
</el-table-column>
<el-table-column label="前端名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="前端图标"
width="100"
align="center">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon"></svg-icon>
</template>
</el-table-column>
<el-table-column label="是否显示"
width="100"
align="center">
<template slot-scope="scope">
<el-switch @change="handleHiddenChange(scope.$index, scope.row)"
:active-value="0"
:inactive-value="1"
v-model="scope.row.hidden">
</el-switch>
</template>
</el-table-column>
<el-table-column label="排序"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.sort }}</template>
</el-table-column>
<el-table-column label="设置"
width="120"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="text"
:disabled="scope.row.level | disableNextLevel"
@click="handleShowNextLevel(scope.$index, scope.row)">查看下级
</el-button>
</template>
</el-table-column>
<el-table-column label="操作"
width="200"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="text"
@click="handleUpdate(scope.$index, scope.row)">编辑
</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes,prev, pager, next,jumper"
:page-size="listQuery.pageSize"
:page-sizes="[10,15,20]"
:current-page.sync="listQuery.pageNum"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
import { fetchList, deleteMenu, updateMenu, updateHidden } from '@/api/menu'
export default {
name: "menuList",
data() {
return {
list: null,
total: null,
listLoading: true,
listQuery: {
pageNum: 1,
pageSize: 10,
type: 1
},
parentId: 0
}
},
created() {
this.resetParentId()
this.getList()
},
watch: {
$route(route) {
this.resetParentId()
this.getList()
}
},
methods: {
resetParentId() {
this.listQuery.pageNum = 1
if (this.$route.query.parentId != null) {
this.parentId = this.$route.query.parentId
} else {
this.parentId = 0
}
},
handleAddMenu() {
this.$router.push({ path: 'addMenu', query: { type: this.listQuery.type } })
},
getList() {
this.listLoading = true
fetchList(this.parentId, this.listQuery).then(response => {
this.listLoading = false
this.list = response.data.list
this.total = response.data.total
})
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleHiddenChange(index, row) {
updateHidden(row.id, { hidden: row.hidden }).then(response => {
this.$message({
message: '修改成功',
type: 'success',
duration: 1000
})
})
},
handleShowNextLevel(index, row) {
this.$router.push({ path: '/ums/menu', query: { parentId: row.id } })
},
handleUpdate(index, row) {
this.$router.push({ path: '/ums/updateMenu', query: { id: row.id } })
},
handleDelete(index, row) {
this.$confirm('是否要删除该菜单', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteMenu(row.id).then(response => {
this.$message({
message: '删除成功',
type: 'success',
duration: 1000
});
this.getList()
})
})
}
},
filters: {
levelFilter(value) {
if (value === 0) {
return '一级'
} else if (value === 1) {
return '二级'
}
},
disableNextLevel(value) {
if (value === 0) {
return false
} else {
return true
}
}
}
}
</script>
<style scoped>
</style>
<template> 
<menu-detail :is-edit='true'></menu-detail>
</template>
<script>
import MenuDetail from './components/MenuDetail'
export default {
name: 'updateMenu',
components: { MenuDetail }
}
</script>
<style>
</style>
<template> 
<div class="app-container">
<el-card shadow="never"
class="operate-container">
<i class="el-icon-tickets"></i>
<span>数据列表</span>
<el-button size="mini"
class="btn-add"
@click="handleAdd()">添加</el-button>
</el-card>
<div class="table-container">
<el-table ref="resourceCategoryTable"
:data="list"
style="width: 100%;"
v-loading="listLoading"
border>
<el-table-column label="编号"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<el-table-column label="名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="创建时间"
align="center">
<template slot-scope="scope">{{scope.row.createTime | formatDateTime}}</template>
</el-table-column>
<el-table-column label="排序"
align="center">
<template slot-scope="scope">{{scope.row.sort}}</template>
</el-table-column>
<el-table-column label="操作"
width="180"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="text"
@click="handleUpdate(scope.$index, scope.row)">编辑
</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-dialog title="添加分类"
:visible.sync="dialogVisible"
width="40%">
<el-form :model="resourceCategory"
ref="resourceCategoryForm"
label-width="150px"
size="small">
<el-form-item label="名称:">
<el-input v-model="resourceCategory.name"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="排序:">
<el-input v-model="resourceCategory.sort"
style="width: 250px"></el-input>
</el-form-item>
</el-form>
<span slot="footer"
class="dialog-footer">
<el-button @click="dialogVisible = false"
size="small">取 消</el-button>
<el-button type="primary"
@click="handleDialogConfirm()"
size="small">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { listAllCate, createResourceCategory, updateResourceCategory, deleteResourceCategory } from '@/api/resourceCategory'
import { formatDate } from '@/utils/date'
const defaultResourceCategory = {
name: null,
sort: 0
}
export default {
name: 'resourceCategoryList',
data() {
return {
list: null,
listLoading: false,
dialogVisible: false,
isEdit: false,
resourceCategory: Object.assign({}, defaultResourceCategory)
}
},
created() {
this.getList()
},
filters: {
formatDateTime(time) {
if (time == null || time === '') {
return 'N/A'
}
let date = new Date(time)
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
}
},
methods: {
handleAdd() {
this.dialogVisible = true
this.isEdit = false
this.resourceCategory = Object.assign({}, defaultResourceCategory)
},
handleUpdate(index, row) {
this.dialogVisible = true
this.isEdit = true
this.resourceCategory = Object.assign({}, row)
},
handleDelete(index, row) {
this.$confirm('是否要删除该分类?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteResourceCategory(row.id).then(response => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getList()
})
})
},
handleDialogConfirm() {
this.$confirm('是否要确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (this.isEdit) {
updateResourceCategory(this.resourceCategory.id, this.resourceCategory).then(response => {
this.$message({
message: '修改成功!',
type: 'success'
})
this.dialogVisible = false
this.getList()
})
} else {
createResourceCategory(this.resourceCategory).then(response => {
this.$message({
message: '添加成功!',
type: 'success'
})
this.dialogVisible = false
this.getList()
})
}
})
},
getList() {
this.listLoading = true
listAllCate({ userId: this.$store.getters.userId }).then(response => {
this.listLoading = false
this.list = response.data
})
}
}
}
</script>
<style>
</style>
<template> 
<div class="app-container">
<el-card class="filter-container"
shadow="never">
<div>
<i class="el-icon-search"></i>
<span>筛选搜索</span>
<el-button style="float:right"
type="primary"
@click="handleSearchList()"
size="small">
查询搜索
</el-button>
<el-button style="float:right;margin-right: 15px"
@click="handleResetSearch()"
size="small">
重置
</el-button>
</div>
<div style="margin-top: 15px">
<el-form :inline="true"
:model="listQuery"
size="small"
label-width="140px">
<el-form-item label="资源名称:">
<el-input v-model="listQuery.nameKeyword"
class="input-width"
placeholder="资源名称"
clearable></el-input>
</el-form-item>
<el-form-item label="资源路径:">
<el-input v-model="listQuery.urlKeyword"
class="input-width"
placeholder="资源路径"
clearable></el-input>
</el-form-item>
<el-form-item label="资源分类:">
<el-select v-model="listQuery.categoryId"
placeholder="全部"
clearable
class="input-width">
<el-option v-for="item in categoryOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card class="operate-container"
shadow="never">
<i class="el-icon-tickets"></i>
<span>数据列表</span>
<el-button size="mini"
class="btn-add"
@click="handleAdd()"
style="margin-left: 20px">添加</el-button>
<el-button size="mini"
class="btn-add"
@click="handleShowCategory()">资源分类</el-button>
</el-card>
<div class="table-container">
<el-table ref="resourceTable"
:data="list"
style="width: 100%;"
v-loading="listLoading"
border>
<el-table-column label="编号"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<el-table-column label="资源名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="资源路径"
align="center">
<template slot-scope="scope">{{scope.row.url}}</template>
</el-table-column>
<el-table-column label="描述"
align="center">
<template slot-scope="scope">{{scope.row.description}}</template>
</el-table-column>
<el-table-column label="添加时间"
width="160"
align="center">
<template slot-scope="scope">{{scope.row.createTime | formatDateTime}}</template>
</el-table-column>
<el-table-column label="操作"
width="140"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="text"
@click="handleUpdate(scope.$index, scope.row)">
编辑
</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes,prev, pager, next,jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,15,20]"
:total="total">
</el-pagination>
</div>
<el-dialog :title="isEdit?'编辑资源':'添加资源'"
:visible.sync="dialogVisible"
width="40%">
<el-form :model="resource"
ref="resourceForm"
label-width="150px"
size="small">
<el-form-item label="资源名称:">
<el-input v-model="resource.name"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="资源路径:">
<el-input v-model="resource.url"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="资源分类:">
<el-select v-model="resource.categoryId"
placeholder="全部"
clearable
style="width: 250px">
<el-option v-for="item in categoryOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="描述:">
<el-input v-model="resource.description"
type="textarea"
:rows="5"
style="width: 250px"></el-input>
</el-form-item>
</el-form>
<span slot="footer"
class="dialog-footer">
<el-button @click="dialogVisible = false"
size="small">取 消</el-button>
<el-button type="primary"
@click="handleDialogConfirm()"
size="small">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { fetchList, createResource, updateResource, deleteResource } from '@/api/resource';
import { listAllCate } from '@/api/resourceCategory';
import { formatDate } from '@/utils/date';
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
nameKeyword: null,
urlKeyword: null,
categoryId: null
}
const defaultResource = {
id: null,
name: null,
url: null,
categoryId: null,
description: ''
}
export default {
name: 'resourceList',
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: null,
total: null,
listLoading: false,
dialogVisible: false,
resource: Object.assign({}, defaultResource),
isEdit: false,
categoryOptions: [],
defaultCategoryId: null
}
},
created() {
this.getList();
this.getCateList();
},
filters: {
formatDateTime(time) {
if (time == null || time === '') {
return 'N/A';
}
let date = new Date(time);
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery);
},
handleSearchList() {
this.listQuery.pageNum = 1;
this.getList();
},
handleSizeChange(val) {
this.listQuery.pageNum = 1;
this.listQuery.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.listQuery.pageNum = val;
this.getList();
},
handleAdd() {
this.dialogVisible = true;
this.isEdit = false;
this.resource = Object.assign({}, defaultResource);
this.resource.categoryId = this.defaultCategoryId;
},
handleDelete(index, row) {
this.$confirm('是否要删除该资源?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteResource(row.id).then(response => {
this.$message({
type: 'success',
message: '删除成功!'
});
this.getList();
});
});
},
handleUpdate(index, row) {
this.dialogVisible = true;
this.isEdit = true;
this.resource = Object.assign({}, row);
},
handleDialogConfirm() {
this.$confirm('是否要确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (this.isEdit) {
updateResource(this.resource.id, this.resource).then(response => {
this.$message({
message: '修改成功!',
type: 'success'
});
this.dialogVisible = false;
this.getList();
})
} else {
createResource(this.resource).then(response => {
this.$message({
message: '添加成功!',
type: 'success'
});
this.dialogVisible = false;
this.getList();
})
}
})
},
handleShowCategory() {
this.$router.push({ path: '/ums/resourceCategory' })
},
getList() {
this.listLoading = true
if (!this.listQuery.userId) {
this.listQuery.userId = this.$store.getters.userId
}
fetchList(this.listQuery).then(response => {
this.listLoading = false
this.list = response.data.list
this.total = response.data.total
})
},
getCateList() {
listAllCate({ userId: this.$store.getters.userId }).then(response => {
let cateList = response.data
for (let i = 0; i < cateList.length; i++) {
let cate = cateList[i]
this.categoryOptions.push({ label: cate.name, value: cate.id })
}
this.defaultCategoryId = cateList[0].id
})
}
}
}
</script>
<style></style>
<template>
<el-card class="form-container"
v-loading="loading"
shadow="never">
<el-tree :data="menuTreeList"
show-checkbox
default-expand-all
node-key="id"
ref="tree"
highlight-current
:props="defaultProps">
</el-tree>
<div style="margin-top: 20px"
align="center">
<el-button type="primary"
@click="handleSave()">保存</el-button>
<el-button @click="handleClear()">清空</el-button>
</div>
</el-card>
</template>
<script>
import { fetchTreeList } from '@/api/menu';
import { listMenuByRole, allocMenu } from '@/api/role';
export default {
name: "allocMenu",
data() {
return {
loading: false,
menuTreeList: [],
defaultProps: {
children: 'children',
label: 'title'
},
roleId: null
};
},
created() {
this.roleId = this.$route.query.roleId
this.treeList()
this.getRoleMenu(this.roleId)
},
methods: {
treeList() {
fetchTreeList({ type: 1 }).then(response => {
this.menuTreeList = response.data
})
},
getRoleMenu(roleId) {
listMenuByRole(roleId).then(response => {
let menuList = response.data
let checkedMenuIds = []
if (menuList != null && menuList.length > 0) {
for (let i = 0; i < menuList.length; i++) {
let menu = menuList[i];
if (menu.parentId !== 0) {
checkedMenuIds.push(menu.id)
}
}
}
this.$refs.tree.setCheckedKeys(checkedMenuIds)
})
},
handleSave() {
let checkedNodes = this.$refs.tree.getCheckedNodes()
let checkedMenuIds = new Set()
if (checkedNodes != null && checkedNodes.length > 0) {
for (let i = 0; i < checkedNodes.length; i++) {
let checkedNode = checkedNodes[i]
checkedMenuIds.add(checkedNode.id)
if (checkedNode.parentId !== 0) {
checkedMenuIds.add(checkedNode.parentId)
}
}
}
this.$confirm('是否分配菜单?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = new URLSearchParams()
params.append("roleId", this.roleId)
params.append("menuIds", Array.from(checkedMenuIds))
this.loading = true
allocMenu(params).then(response => {
this.loading = false
this.$message({
message: '分配成功',
type: 'success',
duration: 1000
})
this.$router.back()
})
})
},
handleClear() {
this.$refs.tree.setCheckedKeys([])
}
}
}
</script>
<style scoped>
</style>
<template>
<el-card class="form-container"
shadow="never">
<div v-for="(cate,index) in allResourceCate"
:class="index===0?'top-line':null"
:key="'cate'+cate.id">
<el-row class="table-layout"
style="background: #F2F6FC;">
<el-checkbox v-model="cate.checked"
:indeterminate="isIndeterminate(cate.id)"
@change="handleCheckAllChange(cate)">
{{cate.name}}
</el-checkbox>
</el-row>
<el-row class="table-layout">
<el-col :span="8"
v-for="resource in getResourceByCate(cate.id)"
:key="resource.id"
style="padding: 4px 0">
<el-checkbox v-model="resource.checked"
@change="handleCheckChange(resource)">
{{resource.name}}
</el-checkbox>
</el-col>
</el-row>
</div>
<div style="margin-top: 20px"
align="center">
<el-button type="primary"
@click="handleSave()">保存</el-button>
<el-button @click="handleClear()">清空</el-button>
</div>
</el-card>
</template>
<script>
import { fetchAllResourceList } from '@/api/resource';
import { listAllCate } from '@/api/resourceCategory';
import { allocResource, listResourceByRole } from '@/api/role';
export default {
name: "allocResource",
data() {
return {
roleId: null,
allResource: null,
allResourceCate: null
};
},
created() {
this.roleId = this.$route.query.roleId;
this.getAllResourceCateList();
},
methods: {
getAllResourceList() {
fetchAllResourceList().then(response => {
this.allResource = response.data;
for (let i = 0; i < this.allResource.length; i++) {
this.allResource[i].checked = false;
}
this.getResourceByRole(this.roleId);
});
},
getAllResourceCateList() {
listAllCate({ userId: this.$store.getters.userId }).then(response => {
this.allResourceCate = response.data;
for (let i = 0; i < this.allResourceCate.length; i++) {
this.allResourceCate[i].checked = false;
}
this.getAllResourceList();
});
},
getResourceByCate(categoryId) {
let cateResource = [];
if (this.allResource == null) return null;
for (let i = 0; i < this.allResource.length; i++) {
let resource = this.allResource[i];
if (resource.categoryId === categoryId) {
cateResource.push(resource);
}
}
return cateResource;
},
getResourceByRole(roleId) {
listResourceByRole(roleId).then(response => {
let allocResource = response.data;
this.allResource.forEach(item => {
item.checked = this.getResourceChecked(item.id, allocResource);
});
this.allResourceCate.forEach(item => {
item.checked = this.isAllChecked(item.id);
});
this.$forceUpdate();
});
},
getResourceChecked(resourceId, allocResource) {
if (allocResource == null || allocResource.length === 0) return false;
for (let i = 0; i < allocResource.length; i++) {
if (allocResource[i].id === resourceId) {
return true;
}
}
return false;
},
isIndeterminate(categoryId) {
let cateResources = this.getResourceByCate(categoryId);
if (cateResources == null) return false;
let checkedCount = 0;
for (let i = 0; i < cateResources.length; i++) {
if (cateResources[i].checked === true) {
checkedCount++;
}
}
return !(checkedCount === 0 || checkedCount === cateResources.length);
},
isAllChecked(categoryId) {
let cateResources = this.getResourceByCate(categoryId);
if (cateResources == null) return false;
let checkedCount = 0;
for (let i = 0; i < cateResources.length; i++) {
if (cateResources[i].checked === true) {
checkedCount++;
}
}
if (checkedCount === 0) {
return false;
}
return checkedCount === cateResources.length;
},
handleSave() {
this.$confirm('是否分配资源?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let checkedResourceIds = new Set();
if (this.allResource != null && this.allResource.length > 0) {
this.allResource.forEach(item => {
if (item.checked) {
checkedResourceIds.add(item.id);
}
});
}
let params = new URLSearchParams();
params.append("roleId", this.roleId);
params.append("resourceIds", Array.from(checkedResourceIds));
allocResource(params).then(response => {
this.$message({
message: '分配成功',
type: 'success',
duration: 1000
});
this.$router.back();
})
})
},
handleClear() {
this.allResourceCate.forEach(item => {
item.checked = false;
});
this.allResource.forEach(item => {
item.checked = false;
});
this.$forceUpdate();
},
handleCheckAllChange(cate) {
let cateResources = this.getResourceByCate(cate.id);
for (let i = 0; i < cateResources.length; i++) {
cateResources[i].checked = cate.checked;
}
this.$forceUpdate();
},
handleCheckChange(resource) {
this.allResourceCate.forEach(item => {
if (item.id === resource.categoryId) {
item.checked = this.isAllChecked(resource.categoryId);
}
});
this.$forceUpdate();
}
}
}
</script>
<style scoped>
.table-layout {
padding: 20px;
border-left: 1px solid #dcdfe6;
border-right: 1px solid #dcdfe6;
border-bottom: 1px solid #dcdfe6;
}
.top-line {
border-top: 1px solid #dcdfe6;
}
</style>
<template> 
<div class="app-container">
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="输入搜索:">
<el-input v-model="listQuery.keyword"
class="input-width"
placeholder="角色名称"
clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
size="small">搜索</el-button>
<el-button style="float:right;margin-right: 15px"
@click="handleResetSearch"
size="small">重置</el-button>
</el-form-item>
<el-button size="small"
type="primary"
class="btn-add"
@click="handleAdd">添加</el-button>
</el-form>
</el-card>
<div class="table-container">
<el-table ref="roleTable"
:data="list"
style="width: 100%;"
v-loading="listLoading"
border>
<el-table-column label="编号"
width="100"
align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<el-table-column label="角色名称"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="描述"
align="center">
<template slot-scope="scope">{{scope.row.description}}</template>
</el-table-column>
<!-- <el-table-column label="用户数"-->
<!-- width="100"-->
<!-- align="center">-->
<!-- <template slot-scope="scope">{{scope.row.adminCount}}</template>-->
<!-- </el-table-column>-->
<el-table-column label="添加时间"
width="160"
align="center">
<template slot-scope="scope">{{scope.row.createTime | formatDateTime}}</template>
</el-table-column>
<el-table-column label="是否启用"
width="140"
align="center">
<template slot-scope="scope">
<el-switch @change="handleStatusChange(scope.$index, scope.row)"
:active-value="1"
:inactive-value="0"
v-model="scope.row.status">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作"
width="160"
align="center">
<template slot-scope="scope">
<el-row>
<el-button size="mini"
type="text"
@click="handleSelectMenu(scope.$index, scope.row)">分配菜单
</el-button>
<!-- <el-button size="mini"-->
<!-- type="text"-->
<!-- @click="handleSelectResource(scope.$index, scope.row)">分配资源-->
<!-- </el-button>-->
</el-row>
<el-row>
<el-button size="mini"
type="text"
@click="handleUpdate(scope.$index, scope.row)">
编辑
</el-button>
<el-button size="mini"
type="text"
@click="handleDelete(scope.$index, scope.row)">删除
</el-button>
</el-row>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,15,30]"
:total="total">
</el-pagination>
</div>
<el-dialog :title="isEdit?'编辑角色':'添加角色'"
:visible.sync="dialogVisible"
center
width="500px">
<el-form :model="role"
ref="roleForm"
label-width="150px"
size="small">
<el-form-item label="角色名称:">
<el-input v-model="role.name"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="描述:">
<el-input v-model="role.description"
type="textarea"
:rows="5"
style="width: 250px"></el-input>
</el-form-item>
<el-form-item label="是否启用:">
<el-radio-group v-model="role.status">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer"
class="dialog-footer">
<el-button @click="dialogVisible = false"
size="small">取 消</el-button>
<el-button type="primary"
@click="handleDialogConfirm()"
size="small">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { fetchList, createRole, updateRole, updateStatus, deleteRole } from '@/api/role'
import { formatDate } from '@/utils/date'
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
keyword: null
}
const defaultRole = {
id: null,
name: null,
description: null,
adminCount: 0,
status: 1
}
export default {
name: 'roleList',
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: null,
total: null,
listLoading: false,
dialogVisible: false,
role: Object.assign({}, defaultRole),
isEdit: false
}
},
created() {
this.getList()
},
filters: {
formatDateTime(time) {
if (time == null || time === '') {
return 'N/A'
}
let date = new Date(time)
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
}
},
methods: {
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleAdd() {
this.dialogVisible = true
this.isEdit = false
this.role = Object.assign({}, defaultRole)
},
handleStatusChange(index, row) {
this.$confirm('是否要修改该状态?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateStatus(row.id, { status: row.status }).then(response => {
this.$message({
type: 'success',
message: '修改成功!'
})
})
}).catch(() => {
this.$message({
type: 'info',
message: '取消修改'
})
this.getList()
})
},
handleDelete(index, row) {
this.$confirm('是否要删除该角色?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let ids = []
ids.push(row.id)
let params = new URLSearchParams();
params.append("ids", ids)
deleteRole(params).then(response => {
this.$message({
type: 'success',
message: '删除成功!'
})
this.getList()
})
})
},
handleUpdate(index, row) {
this.dialogVisible = true
this.isEdit = true
this.role = Object.assign({}, row)
},
handleDialogConfirm() {
this.$confirm('是否要确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (this.isEdit) {
updateRole(this.role.id, this.role).then(response => {
this.$message({
message: '修改成功!',
type: 'success'
})
this.dialogVisible = false;
this.getList()
})
} else {
createRole({ role: this.role, userId: this.$store.getters.userId }).then(response => {
this.$message({
message: '添加成功!',
type: 'success'
})
this.dialogVisible = false
this.getList()
})
}
})
},
handleSelectMenu(index, row) {
this.$router.push({ path: '/ums/allocMenu', query: { roleId: row.id } })
},
handleSelectResource(index, row) {
this.$router.push({ path: '/ums/allocResource', query: { roleId: row.id } })
},
getList() {
this.listLoading = true
if (!this.listQuery.userId) {
this.listQuery.userId = this.$store.getters.userId
}
fetchList(this.listQuery).then(response => {
this.listLoading = false
this.list = response.data.list
this.total = response.data.total
})
}
}
}
</script>
<style></style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="管理员名称:">
<el-input v-model="listQuery.name"
class="input-width"
placeholder="请输入管理员名称"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
<!-- <el-button class="btn-add"-->
<!-- size="small"-->
<!-- type="primary"-->
<!-- @click="handleAdd">添加管理员-->
<!-- </el-button>-->
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="姓名"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="AD用户"
align="center">
<template slot-scope="scope">{{scope.row.departName || '--'}}</template>
</el-table-column>
<el-table-column label="部门"
align="center">
<template slot-scope="scope">{{scope.row.departName || '--'}}</template>
</el-table-column>
<el-table-column label="所属库房"
align="center">
<template slot-scope="scope">{{scope.row.stockRoomName}}</template>
</el-table-column>
<el-table-column label="联系方式"
align="center">
<template slot-scope="scope">{{scope.row.phone}}</template>
</el-table-column>
<el-table-column label="操作"
width="220"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="success"
@click="handleDelete(scope.row.id)">解绑
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
</div>
</template>
<script>
import moment from 'moment'
import { getAdminList, cancleAdmin } from '@/api/user'
import AddDepot from './modules/AddAdmin'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
name: '',
condition: 0,
roleId: '',
departId: ''
}
export default {
name: 'AdminList',
components: { AddDepot },
data() {
return {
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
// 添加管理员
handleAdd() {
this.$refs.addSupplier.add()
},
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
getAdminList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 删除
handleDelete(id) {
this.$confirm('是否取消管理员权限?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
cancleAdmin({ id: id, deleteStatus: 1 }).then(res => {
this.getList()
})
}).catch(() => {
})
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.el-row {
margin-bottom: 20px;
}
.mt15 {
margin-top: 15px;
}
.el-input {
width: 200px;
}
.input-width {
width: 180px;
}
</style>
<template> 
<div class="app-container">
<!-- 搜索栏 -->
<el-card class="filter-container"
shadow="never">
<el-form :inline="true"
:model="listQuery"
size="small">
<el-form-item label="用户名称:">
<el-input v-model="listQuery.name"
class="input-width"
placeholder="请输入用户名称"></el-input>
</el-form-item>
<el-form-item label="部门:">
<el-select v-model="listQuery.departId"
class="input-width"
clearable
placeholder="请选择部门">
<el-option v-for="item in departmentOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleSearchList"
icon="el-icon-search"
size="small">搜索
</el-button>
<el-button @click="handleResetSearch"
icon="el-icon-refresh"
size="small">重置
</el-button>
</el-form-item>
<el-button class="btn-add"
size="small"
type="primary"
@click="handleAdd">导入用户
</el-button>
</el-form>
</el-card>
<!-- 表格栏 -->
<el-card class="filter-container mt15"
shadow="never">
<div class="table-container">
<el-table :data="list"
v-loading="listLoading"
@selection-change="handleSelectionChange"
border>
<el-table-column type="selection"
align="center"
width="50"></el-table-column>
<el-table-column label="姓名"
align="center">
<template slot-scope="scope">{{scope.row.name}}</template>
</el-table-column>
<el-table-column label="AD用户"
align="center">
<template slot-scope="scope">{{scope.row.jobNo || '--'}}</template>
</el-table-column>
<el-table-column label="部门"
align="center">
<template slot-scope="scope">{{scope.row.departName || '--'}}</template>
</el-table-column>
<el-table-column label="联系方式"
align="center">
<template slot-scope="scope">{{scope.row.phone}}</template>
</el-table-column>
<el-table-column label="操作"
width="220"
align="center">
<template slot-scope="scope">
<el-button size="mini"
type="success"
@click="handleSet(scope.row)">设置为管理员
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页栏 -->
<div class="pagination-container">
<el-pagination background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="listQuery.pageNum"
:page-size="listQuery.pageSize"
:page-sizes="[10,30,50]"
:total="total">
</el-pagination>
</div>
</el-card>
<!-- end -->
<!-- 弹窗 -->
<add-admin ref="addAdmin"
@ok="getList"></add-admin>
<!-- end -->
</div>
</template>
<script>
import moment from 'moment'
import { getMemberList, getAuditDetail, updateMcht } from '@/api/user'
import { getDepartmentList} from '@/api/inventory'
import AddAdmin from './modules/AddAdmin'
// 列表查询参数默认值
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
name: null,
departId: null
}
export default {
name: 'UserList',
components: { AddAdmin },
data() {
return {
departmentOptions: [],
listQuery: Object.assign({}, defaultListQuery),
list: [],
total: 0,
listLoading: false,
multipleSelection: [],
}
},
created() {
this.getList()
this.getDepartmentList()
},
filters: {
formatTime(time) {
if (!time) {
return '--'
}
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
},
methods: {
// 部门
getDepartmentList() {
getDepartmentList().then(res => {
this.departmentOptions = res.data.list
})
},
handleResetSearch() {
this.listQuery = Object.assign({}, defaultListQuery)
this.getList()
},
handleSearchList() {
this.listQuery.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.listQuery.pageNum = 1
this.listQuery.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.listQuery.pageNum = val
this.getList()
},
handleSelectionChange(vals) {
this.multipleSelection = vals
},
//请求数据
getList() {
this.listLoading = true
//请求数据
getMemberList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.data.list
this.total = res.data.total
}).catch(err => {
this.listLoading = false
})
},
// 添加管理员
handleAdd() {
this.$refs.addSupplier.add()
},
// 设置为管理员
handleSet(row) {
this.$refs.addAdmin.add(row)
}
}
}
</script>
<style scoped>
.app-container {
font-size: 14px;
color: #606266;
padding: 0 15px;
margin-top: 0;
}
.el-row {
margin-bottom: 20px;
}
.mt15 {
margin-top: 15px;
}
.el-input {
width: 200px;
}
.input-width {
width: 180px;
}
</style>
<template>
<el-dialog :visible.sync="visible"
:title="title"
center
width="720px">
<!-- start -->
<el-form :model="model"
ref="myForm"
v-loading="loading"
label-width="200px">
<div class="scroll-container"
ref="scrollContainer">
<el-form-item label="用户名称:"
prop="username"
:rules="[{ required: true, message: '用户名称不能为空', trigger: 'blur' }]">
<el-input v-model="model.username"
:disabled="isEdit"
class="input-width"></el-input>
<div class="tip">可使用手机号作为用户名称</div>
</el-form-item>
<el-form-item label="登录密码:"
prop="password"
:rules="[{ required: true, message: '登录密码不能为空', trigger: 'blur' }]">
<el-input
:maxlength="6"
v-model="model.password"
type="password"
auto-complete="new-password"
class="input-width"></el-input>
</el-form-item>
<el-form-item label="库房:"
prop="stockRoomId"
:rules="[{ required: true, trigger: 'change', message: '请选择库房' }]">
<el-select size="small"
class="input-width"
v-model="model.stockRoomId">
<el-option
v-for="item in depotOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="角色分配:"
prop="roleId"
:rules="[{ required: true, message: '角色不能为空', trigger: 'change' }]">
<el-select v-model="model.roleId"
class="input-width">
<el-option v-for="item in allRoleList"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</div>
</el-form>
<div slot="footer">
<el-button type="primary"
@click="submit">确认
</el-button>
<el-button @click="close">取消</el-button>
</div>
<!-- end -->
</el-dialog>
</template>
<script>
import { setUpAdmin } from '@/api/user'
import { fetchAllRoleList } from '@/api/role'
import { getStockRooms } from '@/api/inventory'
// 添加编辑属性
export default {
name: 'AddAdmin',
data() {
return {
allRoleList: [],
depotOptions: [],
visible: false,
title: null,
loading: false,
id: null,
model: {},
isEdit: false
}
},
methods: {
// 库房
getStockRooms() {
getStockRooms().then(res => {
this.depotOptions = res.data.list
})
},
// 角色分配
fetchAllRoleList() {
fetchAllRoleList().then(response => {
this.allRoleList = response.data
})
},
init() {
this.fetchAllRoleList()
this.getStockRooms()
this.$nextTick(() => {
this.$refs.myForm.clearValidate()
this.$refs.scrollContainer.scrollTop = 0
})
},
add(row) {
this.id = null
this.visible = true
this.init()
this.model = {
departId: row.departId,
roleId: null,
stockRoomId: null,
password: null,
username: null,
id: row.id,
memberId: row.id
}
this.title = '设置管理员'
},
// detail(id) {
// this.id = id
// this.init()
// this.visible = true
// this.title = '编辑管理员'
// this.loading = true
// getSupplierDetail({ id: id }).then(res => {
// this.model = res.data
// this.loading = false
// }).catch(err => {
// this.loading = false
// this.close()
// })
// },
// 提交保存
submit() {
this.$refs.myForm.validate((valid) => {
if (valid) {
// 验证通过
// if (this.id) {
// // 修改属性
// this.loading = true
// updateMcht(this.model).then(res => {
// this.loading = false
// this.visible = false
// this.$emit('ok')
// }).catch(err => {
// this.loading = false
// })
// } else {
// 添加属性
this.loading = true
setUpAdmin(this.model).then(res => {
this.loading = false
this.visible = false
this.$emit('ok')
}).catch(err => {
this.loading = false
})
// }
}
})
},
close() {
this.$emit('close')
this.visible = false
}
}
}
</script>
<style scoped>
.scroll-container {
max-height: 50vh;
overflow: hidden;
overflow-y: auto;
}
.input-width {
width: 300px;
}
.tip {
color: #999;
font-size: 10px;
line-height: 30px;
}
</style>
tinymce.addI18n('zh_CN',{
"Cut": "\u526a\u5207",
"Heading 5": "\u6807\u98985",
"Header 2": "\u6807\u98982",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002",
"Heading 4": "\u6807\u98984",
"Div": "Div\u533a\u5757",
"Heading 2": "\u6807\u98982",
"Paste": "\u7c98\u8d34",
"Close": "\u5173\u95ed",
"Font Family": "\u5b57\u4f53",
"Pre": "\u9884\u683c\u5f0f\u6587\u672c",
"Align right": "\u53f3\u5bf9\u9f50",
"New document": "\u65b0\u6587\u6863",
"Blockquote": "\u5f15\u7528",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Heading 1": "\u6807\u98981",
"Headings": "\u6807\u9898",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Formats": "\u683c\u5f0f",
"Headers": "\u6807\u9898",
"Select all": "\u5168\u9009",
"Header 3": "\u6807\u98983",
"Blocks": "\u533a\u5757",
"Undo": "\u64a4\u6d88",
"Strikethrough": "\u5220\u9664\u7ebf",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Header 1": "\u6807\u98981",
"Superscript": "\u4e0a\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Font Sizes": "\u5b57\u53f7",
"Subscript": "\u4e0b\u6807",
"Header 6": "\u6807\u98986",
"Redo": "\u91cd\u590d",
"Paragraph": "\u6bb5\u843d",
"Ok": "\u786e\u5b9a",
"Bold": "\u7c97\u4f53",
"Code": "\u4ee3\u7801",
"Italic": "\u659c\u4f53",
"Align center": "\u5c45\u4e2d",
"Header 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Heading 3": "\u6807\u98983",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Header 4": "\u6807\u98984",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
"Underline": "\u4e0b\u5212\u7ebf",
"Cancel": "\u53d6\u6d88",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Inline": "\u6587\u672c",
"Copy": "\u590d\u5236",
"Align left": "\u5de6\u5bf9\u9f50",
"Visual aids": "\u7f51\u683c\u7ebf",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Square": "\u65b9\u5757",
"Default": "\u9ed8\u8ba4",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
"Name": "\u540d\u79f0",
"Anchor": "\u951a\u70b9",
"Id": "\u6807\u8bc6\u7b26",
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Source code": "\u6e90\u4ee3\u7801",
"Language": "\u8bed\u8a00",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"B": "B",
"R": "R",
"G": "G",
"Color": "\u989c\u8272",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Emoticons": "\u8868\u60c5",
"Robots": "\u673a\u5668\u4eba",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Encoding": "\u7f16\u7801",
"Description": "\u63cf\u8ff0",
"Author": "\u4f5c\u8005",
"Fullscreen": "\u5168\u5c4f",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Source": "\u5730\u5740",
"Border": "\u8fb9\u6846",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Style": "\u6837\u5f0f",
"Dimensions": "\u5927\u5c0f",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image": "\u56fe\u7247",
"Zoom in": "\u653e\u5927",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Back": "\u540e\u9000",
"Gamma": "\u4f3d\u9a6c\u503c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Sharpen": "\u9510\u5316",
"Zoom out": "\u7f29\u5c0f",
"Image options": "\u56fe\u7247\u9009\u9879",
"Apply": "\u5e94\u7528",
"Brightness": "\u4eae\u5ea6",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Crop": "\u88c1\u526a",
"Orientation": "\u65b9\u5411",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Invert": "\u53cd\u8f6c",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Url": "\u5730\u5740",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Anchors": "\u951a\u70b9",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Link": "\u94fe\u63a5",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"None": "\u65e0",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Media": "\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Poster": "\u5c01\u9762",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Embed": "\u5185\u5d4c",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print": "\u6253\u5370",
"Save": "\u4fdd\u5b58",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Replace": "\u66ff\u6362",
"Next": "\u4e0b\u4e00\u4e2a",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Replace with": "\u66ff\u6362\u4e3a",
"Find": "\u67e5\u627e",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Prev": "\u4e0a\u4e00\u4e2a",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Finish": "\u5b8c\u6210",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Ignore": "\u5ffd\u7565",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Rows": "\u884c",
"Height": "\u9ad8",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Column group": "\u5217\u7ec4",
"Row": "\u884c",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Row type": "\u884c\u7c7b\u578b",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Body": "\u8868\u4f53",
"Caption": "\u6807\u9898",
"Footer": "\u8868\u5c3e",
"Delete row": "\u5220\u9664\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Scope": "\u8303\u56f4",
"Delete table": "\u5220\u9664\u8868\u683c",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Column": "\u5217",
"Row group": "\u884c\u7ec4",
"Cell": "\u5355\u5143\u683c",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Copy row": "\u590d\u5236\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Header": "\u8868\u5934",
"Right": "\u53f3\u5bf9\u9f50",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Cols": "\u5217",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Width": "\u5bbd",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Left": "\u5de6\u5bf9\u9f50",
"Cut row": "\u526a\u5207\u884c",
"Delete column": "\u5220\u9664\u5217",
"Center": "\u5c45\u4e2d",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Insert template": "\u63d2\u5165\u6a21\u677f",
"Templates": "\u6a21\u677f",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Text color": "\u6587\u5b57\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"Insert": "\u63d2\u5165",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
"Tools": "\u5de5\u5177",
"View": "\u89c6\u56fe",
"Table": "\u8868\u683c",
"Format": "\u683c\u5f0f"
});
\ No newline at end of file
/* http://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;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
direction: ltr;
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;
}
.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: #a67f59;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function {
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;
}
.mce-visualblocks p {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
background-repeat: no-repeat;
}
.mce-visualblocks h1 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks h2 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks h3 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
background-repeat: no-repeat;
}
.mce-visualblocks h4 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks h5 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks h6 {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks div:not([data-mce-bogus]) {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
background-repeat: no-repeat;
}
.mce-visualblocks section {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
background-repeat: no-repeat;
}
.mce-visualblocks article {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
background-repeat: no-repeat;
}
.mce-visualblocks blockquote {
padding-top: 10px;
border: 1px dashed #BBB;
background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
background-repeat: no-repeat;
}
.mce-visualblocks address {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
background-repeat: no-repeat;
}
.mce-visualblocks pre {
padding-top: 10px;
border: 1px dashed #BBB;
margin-left: 3px;
background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks figure {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
background-repeat: no-repeat;
}
.mce-visualblocks hgroup {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
background-repeat: no-repeat;
}
.mce-visualblocks aside {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
background-repeat: no-repeat;
}
.mce-visualblocks figcaption {
border: 1px dashed #BBB;
}
.mce-visualblocks ul {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks ol {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
background-repeat: no-repeat;
}
.mce-visualblocks dl {
padding-top: 10px;
border: 1px dashed #BBB;
margin: 0 0 1em 3px;
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
background-repeat: no-repeat;
}
.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2}.mce-content-body{line-height:1.3}
\ No newline at end of file
body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2} a {color: #1478F0;}
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="tinymce-small" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe000;" glyph-name="save" d="M960 80v591.938l-223.938 224.062h-592.062c-44.182 0-80-35.816-80-80v-736c0-44.184 35.818-80 80-80h736c44.184 0 80 35.816 80 80zM576 768h64v-192h-64v192zM704 128h-384v255.882c0.034 0.042 0.076 0.082 0.116 0.118h383.77c0.040-0.036 0.082-0.076 0.116-0.118l-0.002-255.882zM832 128h-64v256c0 35.2-28.8 64-64 64h-384c-35.2 0-64-28.8-64-64v-256h-64v640h64v-192c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v171.010l128-128.072v-490.938z" />
<glyph unicode="&#xe001;" glyph-name="newdocument" d="M850.746 717.254l-133.492 133.49c-24.888 24.892-74.054 45.256-109.254 45.256h-416c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v544c0 35.2-20.366 84.364-45.254 109.254zM805.49 672.002c6.792-6.796 13.792-19.162 18.894-32.002h-184.384v184.386c12.84-5.1 25.204-12.1 32-18.896l133.49-133.488zM831.884 64h-639.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h383.886v-256h256v-511.884c-0.034-0.040-0.076-0.082-0.116-0.116z" />
<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
<glyph unicode="&#xe003;" glyph-name="alignleft" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h576v-128h-576zM64 192h576v-128h-576z" />
<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM256 576h512v-128h-512zM256 192h512v-128h-512z" />
<glyph unicode="&#xe005;" glyph-name="alignright" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM384 576h576v-128h-576zM384 192h576v-128h-576z" />
<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h896v-128h-896zM64 192h896v-128h-896z" />
<glyph unicode="&#xe007;" glyph-name="cut" d="M864.408 289.868c-46.47 46.47-106.938 68.004-161.082 62.806l-63.326 63.326 192 192c0 0 128 128 0 256l-320-320-320 320c-128-128 0-256 0-256l192-192-63.326-63.326c-54.144 5.198-114.61-16.338-161.080-62.806-74.98-74.98-85.112-186.418-22.626-248.9 62.482-62.482 173.92-52.354 248.9 22.626 46.47 46.468 68.002 106.938 62.806 161.080l63.326 63.326 63.328-63.328c-5.196-54.144 16.336-114.61 62.806-161.078 74.978-74.98 186.418-85.112 248.898-22.626 62.488 62.482 52.356 173.918-22.624 248.9zM353.124 201.422c-2.212-24.332-15.020-49.826-35.14-69.946-22.212-22.214-51.080-35.476-77.218-35.476-10.524 0-25.298 2.228-35.916 12.848-21.406 21.404-17.376 73.132 22.626 113.136 22.212 22.214 51.080 35.476 77.218 35.476 10.524 0 25.298-2.228 35.916-12.848 13.112-13.11 13.47-32.688 12.514-43.19zM512 352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zM819.152 108.848c-10.62-10.62-25.392-12.848-35.916-12.848-26.138 0-55.006 13.262-77.218 35.476-20.122 20.12-32.928 45.614-35.138 69.946-0.958 10.502-0.6 30.080 12.514 43.192 10.618 10.622 25.39 12.848 35.916 12.848 26.136 0 55.006-13.262 77.216-35.474 40.004-40.008 44.032-91.736 22.626-113.14z" />
<glyph unicode="&#xe008;" glyph-name="paste" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h384l192 192v384h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM704 90.51v101.49h101.49l-101.49-101.49zM832 256h-192v-192h-256v448h448v-256z" />
<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M888 576h-56v256h64v64h-320v-64h64v-256h-256v256h64v64h-320v-64h64v-256h-56c-39.6 0-72-32.4-72-72v-432c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v312h128v-312c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v432c0 39.6-32.4 72-72 72zM348 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM860 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM128 768c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 448c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 128c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64z" />
<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM320 430v146h-64v320h-128v-64h64v-256h-64v-64h128v-50l-128-60v-146h128v-64h-128v-64h128v-64h-128v-64h192v320h-128v50z" />
<glyph unicode="&#xe00c;" glyph-name="indent" d="M64 768h896v-128h-896zM384 384h576v-128h-576zM384 576h576v-128h-576zM64 192h896v-128h-896zM64 576l224-160-224-160z" />
<glyph unicode="&#xe00d;" glyph-name="outdent" d="M64 768h896v-128h-896zM64 384h576v-128h-576zM64 576h576v-128h-576zM64 192h896v-128h-896zM960 576l-224-160 224-160z" />
<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M256.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.954-10.578-19.034-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498zM768.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.956-10.578-19.036-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498z" />
<glyph unicode="&#xe00f;" glyph-name="undo" d="M704 0c59 199 134.906 455.266-256 446.096v-222.096l-336.002 336 336.002 336v-217.326c468.092 12.2 544-358.674 256-678.674z" />
<glyph unicode="&#xe010;" glyph-name="redo" d="M576 678.674v217.326l336.002-336-336.002-336v222.096c-390.906 9.17-315-247.096-256-446.096-288 320-212.092 690.874 256 678.674z" />
<glyph unicode="&#xe011;" glyph-name="unlink" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM352 250c-9.724 0-19.45 3.71-26.87 11.128-14.84 14.84-14.84 38.898 0 53.738l320 320c14.84 14.84 38.896 14.84 53.736 0 14.844-14.84 14.844-38.9 0-53.74l-320-320c-7.416-7.416-17.142-11.126-26.866-11.126z" />
<glyph unicode="&#xe012;" glyph-name="link" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM800 122c-9.724 0-19.45 3.708-26.87 11.13l-128 127.998c-14.844 14.84-14.844 38.898 0 53.738 14.84 14.844 38.896 14.844 53.736 0l128-128c14.844-14.84 14.844-38.896 0-53.736-7.416-7.422-17.142-11.13-26.866-11.13zM608 0c-17.674 0-32 14.326-32 32v128c0 17.674 14.326 32 32 32s32-14.326 32-32v-128c0-17.674-14.326-32-32-32zM928 320h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32h128c17.674 0 32-14.326 32-32s-14.326-32-32-32zM224 774c9.724 0 19.45-3.708 26.87-11.13l128-128c14.842-14.84 14.842-38.898 0-53.738-14.84-14.844-38.898-14.844-53.738 0l-128 128c-14.842 14.84-14.842 38.898 0 53.738 7.418 7.422 17.144 11.13 26.868 11.13zM416 896c17.674 0 32-14.326 32-32v-128c0-17.674-14.326-32-32-32s-32 14.326-32 32v128c0 17.674 14.326 32 32 32zM96 576h128c17.674 0 32-14.326 32-32s-14.326-32-32-32h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32z" />
<glyph unicode="&#xe013;" glyph-name="bookmark" d="M256 896v-896l256 256 256-256v896h-512zM704 170.51l-192 192-192-192v661.49h384v-661.49z" />
<glyph unicode="&#xe014;" glyph-name="image" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 128.116c-0.012-0.014-0.030-0.028-0.042-0.042l-191.958 319.926-160-128-224 288-191.968-479.916c-0.010 0.010-0.022 0.022-0.032 0.032v639.77c0.034 0.040 0.076 0.082 0.114 0.114h767.77c0.040-0.034 0.082-0.076 0.116-0.116v-639.768zM640 608c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96s-96-42.981-96-96z" />
<glyph unicode="&#xe015;" glyph-name="media" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM256 128h-128v128h128v-128zM256 384h-128v128h128v-128zM256 640h-128v128h128v-128zM704 128h-384v640h384v-640zM896 128h-128v128h128v-128zM896 384h-128v128h128v-128zM896 640h-128v128h128v-128zM384 640v-384l288 192z" />
<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128v128zM704 704c35.346 0 64-28.654 64-64v-166l-228-154h-92v64l192 128v64h-320v128h384zM512 896c-119.666 0-232.166-46.6-316.784-131.216-84.614-84.618-131.216-197.118-131.216-316.784 0-119.664 46.602-232.168 131.216-316.784 84.618-84.616 197.118-131.216 316.784-131.216 119.664 0 232.168 46.6 316.784 131.216s131.216 197.12 131.216 316.784c0 119.666-46.6 232.166-131.216 316.784-84.616 84.616-197.12 131.216-316.784 131.216z" />
<glyph unicode="&#xe017;" glyph-name="code" d="M416 256l-192 192 192 192-64 64-256-256 256-256zM672 704l-64-64 192-192-192-192 64-64 256 256z" />
<glyph unicode="&#xe018;" glyph-name="insertdatetime" d="M77.798 655.376l81.414-50.882c50.802 81.114 128.788 143.454 221.208 174.246l-30.366 91.094c-113.748-37.898-209.728-114.626-272.256-214.458zM673.946 869.834l-30.366-91.094c92.422-30.792 170.404-93.132 221.208-174.248l81.412 50.882c-62.526 99.834-158.506 176.562-272.254 214.46zM607.974 255.992c-4.808 0-9.692 1.090-14.286 3.386l-145.688 72.844v211.778c0 17.672 14.328 32 32 32s32-14.328 32-32v-172.222l110.31-55.156c15.806-7.902 22.214-27.124 14.31-42.932-5.604-11.214-16.908-17.696-28.646-17.698zM512 768c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384zM512 96c-159.058 0-288 128.942-288 288s128.942 288 288 288c159.058 0 288-128.942 288-288s-128.942-288-288-288z" />
<glyph unicode="&#xe019;" glyph-name="preview" d="M64 504.254c45.318 49.92 97.162 92.36 153.272 125.124 90.332 52.744 192.246 80.622 294.728 80.622 102.48 0 204.396-27.878 294.726-80.624 56.112-32.764 107.956-75.204 153.274-125.124v117.432c-33.010 28.118-68.124 53.14-104.868 74.594-105.006 61.314-223.658 93.722-343.132 93.722s-238.128-32.408-343.134-93.72c-36.742-21.454-71.856-46.478-104.866-74.596v-117.43zM512 640c-183.196 0-345.838-100.556-448-256 102.162-155.448 264.804-256 448-256s345.838 100.552 448 256c-102.162 155.444-264.804 256-448 256zM512 448c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.348 28.654 64 64 64s64-28.652 64-64zM728.066 263.338c-67.434-39.374-140.128-59.338-216.066-59.338s-148.632 19.964-216.066 59.338c-51.554 30.104-98.616 71.31-138.114 120.662 39.498 49.35 86.56 90.558 138.116 120.66 13.276 7.752 26.758 14.74 40.426 20.982-10.512-23.742-16.362-50.008-16.362-77.642 0-106.040 85.962-192 192-192 106.040 0 192 85.96 192 192 0 27.634-5.85 53.9-16.36 77.642 13.668-6.244 27.15-13.23 40.426-20.982 51.554-30.102 98.616-71.31 138.116-120.66-39.498-49.352-86.56-90.558-138.116-120.662z" />
<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M651.168 676.166c-24.612 81.962-28.876 91.834-107.168 91.834h-64c-79.618 0-82.664-10.152-108.418-96 0-0.002 0-0.002-0.002-0.004l-143.998-479.996h113.636l57.6 192h226.366l57.6-192h113.63l-145.246 484.166zM437.218 512l38.4 136c10.086 33.618 36.38 30 36.38 30s26.294 3.618 36.38-30h0.004l38.4-136h-149.564z" />
<glyph unicode="&#xe01b;" glyph-name="table" d="M64 768v-704h896v704h-896zM384 320v128h256v-128h-256zM640 256v-128h-256v128h256zM640 640v-128h-256v128h256zM320 640v-128h-192v128h192zM128 448h192v-128h-192v128zM704 448h192v-128h-192v128zM704 512v128h192v-128h-192zM128 256h192v-128h-192v128zM704 128v128h192v-128h-192z" />
<glyph unicode="&#xe01c;" glyph-name="hr" d="M64 512h896v-128h-896z" />
<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M64 192h512v-128h-512v128zM768 768h-220.558l-183.766-512h-132.288l183.762 512h-223.15v128h576v-128zM929.774 64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774-62.226-62.226z" />
<glyph unicode="&#xe01e;" glyph-name="subscript" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
<glyph unicode="&#xe01f;" glyph-name="superscript" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 128v37.004c151.348 61.628 256 193.82 256 346.996 0 212.078-200.576 384-448 384s-448-171.922-448-384c0-153.176 104.654-285.368 256-346.996v-37.004h-192l-64 96v-224h320v222.812c-100.9 51.362-170.666 161.54-170.666 289.188 0 176.732 133.718 320 298.666 320s298.666-143.268 298.666-320c0-127.648-69.766-237.826-170.666-289.188v-222.812h320v224l-64-96h-192z" />
<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 820c99.366 0 192.782-38.694 263.042-108.956s108.958-163.678 108.958-263.044-38.696-192.782-108.958-263.042-163.676-108.958-263.042-108.958-192.782 38.696-263.044 108.958-108.956 163.676-108.956 263.042 38.694 192.782 108.956 263.044 163.678 108.956 263.044 108.956zM512 896c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM320 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM576 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM512 304c-101.84 0-192.56 36.874-251.166 94.328 23.126-117.608 126.778-206.328 251.166-206.328s228.040 88.72 251.168 206.328c-58.608-57.454-149.328-94.328-251.168-94.328z" />
<glyph unicode="&#xe022;" glyph-name="print" d="M256 832h512v-128h-512v128zM896 640h-768c-35.2 0-64-28.8-64-64v-256c0-35.2 28.796-64 64-64h128v-192h512v192h128c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM704 128h-384v256h384v-256zM910.4 544c0-25.626-20.774-46.4-46.398-46.4s-46.402 20.774-46.402 46.4 20.778 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M480 576l-192 192 128 128h-352v-352l128 128 192-192zM640 480l192 192 128-128v352h-352l128-128-192-192zM544 320l192-192-128-128h352v352l-128-128-192 192zM384 416l-192-192-128 128v-352h352l-128 128 192 192z" />
<glyph unicode="&#xe024;" glyph-name="spellcheck" d="M960 832v64h-192c-35.202 0-64-28.8-64-64v-320c0-15.856 5.858-30.402 15.496-41.614l-303.496-260.386-142 148-82-70 224-288 416 448h128v64h-192v320h192zM256 448h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192h128v-192zM128 704v128h128v-128h-128zM640 512v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64zM448 832h128v-128h-128v128zM448 640h128v-128h-128v128z" />
<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 448h-128v128h128v128h128v-128h128v-128h-128v-128h-128v128zM960 384v-320h-896v320h128v-192h640v192h128z" />
<glyph unicode="&#xe026;" glyph-name="template" d="M512 576h128v-64h-128zM512 192h128v-64h-128zM576 384h128v-64h-128zM768 384v-192h-64v-64h128v256zM384 384h128v-64h-128zM320 192h128v-64h-128zM320 576h128v-64h-128zM192 768v-256h64v192h64v64zM704 512h128v256h-64v-192h-64zM64 896v-896h896v896h-896zM896 64h-768v768h768v-768zM192 384v-256h64v192h64v64zM576 768h128v-64h-128zM384 768h128v-64h-128z" />
<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M816 896l16-384h-640l16 384h32l16-320h512l16 320h32zM208 0l-16 320h640l-16-320h-32l-16 256h-512l-16-256h-32zM64 448h128v-64h-128zM256 448h128v-64h-128zM448 448h128v-64h-128zM640 448h128v-64h-128zM832 448h128v-64h-128z" />
<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
<glyph unicode="&#xe02a;" glyph-name="bold" d="M625.442 465.818c48.074 38.15 78.558 94.856 78.558 158.182 0 114.876-100.29 208-224 208h-224v-768h288c123.712 0 224 93.124 224 208 0 88.196-59.118 163.562-142.558 193.818zM384 656c0 26.51 21.49 48 48 48h67.204c42.414 0 76.796-42.98 76.796-96s-34.382-96-76.796-96h-115.204v144zM547.2 192h-115.2c-26.51 0-48 21.49-48 48v144h163.2c42.418 0 76.8-42.98 76.8-96s-34.382-96-76.8-96z" />
<glyph unicode="&#xe02b;" glyph-name="italic" d="M832 832v-64h-144l-256-640h144v-64h-448v64h144l256 640h-144v64h448z" />
<glyph unicode="&#xe02c;" glyph-name="underline" d="M192 128h576v-64h-576v64zM640 832v-384c0-31.312-14.7-61.624-41.39-85.352-30.942-27.502-73.068-42.648-118.61-42.648-45.544 0-87.668 15.146-118.608 42.648-26.692 23.728-41.392 54.040-41.392 85.352v384h-128v-384c0-141.382 128.942-256 288-256s288 114.618 288 256v384h-128z" />
<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M960 448h-265.876c-50.078 35.42-114.43 54.86-182.124 54.86-89.206 0-164.572 50.242-164.572 109.712s75.366 109.714 164.572 109.714c75.058 0 140.308-35.576 159.12-82.286h113.016c-7.93 50.644-37.58 97.968-84.058 132.826-50.88 38.16-117.676 59.174-188.078 59.174-70.404 0-137.196-21.014-188.074-59.174-54.788-41.090-86.212-99.502-86.212-160.254s31.424-119.164 86.212-160.254c1.956-1.466 3.942-2.898 5.946-4.316h-265.872v-64h512.532c58.208-17.106 100.042-56.27 100.042-100.572 0-59.468-75.368-109.71-164.572-109.71-75.060 0-140.308 35.574-159.118 82.286h-113.016c7.93-50.64 37.582-97.968 84.060-132.826 50.876-38.164 117.668-59.18 188.072-59.18 70.402 0 137.198 21.016 188.074 59.174 54.79 41.090 86.208 99.502 86.208 160.254 0 35.298-10.654 69.792-30.294 100.572h204.012v64z" />
<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448z" />
<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM64 64l224 192-224 192z" />
<glyph unicode="&#xe030;" glyph-name="rtl" d="M320 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM960 448l-224-192 224-192z" />
<glyph unicode="&#xe031;" glyph-name="copy" d="M832 640h-192v64l-192 192h-384v-704h384v-192h576v448l-192 192zM832 549.49l101.49-101.49h-101.49v101.49zM448 805.49l101.49-101.49h-101.49v101.49zM128 832h256v-192h192v-384h-448v576zM960 64h-448v128h128v384h128v-192h192v-320z" />
<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM840.34 256h87.66l32 448h-896l64-640h356.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM874.996 110.25l-134.496 110.692c17.454 28.922 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l110.692-134.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM576 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
<glyph unicode="&#xe035;" glyph-name="pastetext" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h576v576h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM832 64h-448v448h448v-448zM448 448v-128h32l32 64h64v-192h-48v-64h160v64h-48v192h64l32-64h32v128z" />
<glyph unicode="&#xe603;" glyph-name="codesample" d="M200.015 577.994v103.994c0 43.077 34.919 77.997 77.997 77.997h26v103.994h-26c-100.51 0-181.991-81.481-181.991-181.991v-103.994c0-43.077-34.919-77.997-77.997-77.997h-26v-103.994h26c43.077 0 77.997-34.919 77.997-77.997v-103.994c0-100.509 81.481-181.991 181.991-181.991h26v103.994h-26c-43.077 0-77.997 34.919-77.997 77.997v103.994c0 50.927-20.928 96.961-54.642 129.994 33.714 33.032 54.642 79.065 54.642 129.994zM823.985 577.994v103.994c0 43.077-34.919 77.997-77.997 77.997h-26v103.994h26c100.509 0 181.991-81.481 181.991-181.991v-103.994c0-43.077 34.919-77.997 77.997-77.997h26v-103.994h-26c-43.077 0-77.997-34.919-77.997-77.997v-103.994c0-100.509-81.482-181.991-181.991-181.991h-26v103.994h26c43.077 0 77.997 34.919 77.997 77.997v103.994c0 50.927 20.928 96.961 54.642 129.994-33.714 33.032-54.642 79.065-54.642 129.994zM615.997 603.277c0-57.435-46.56-103.994-103.994-103.994s-103.994 46.56-103.994 103.994c0 57.435 46.56 103.994 103.994 103.994s103.994-46.56 103.994-103.994zM512 448.717c-57.435 0-103.994-46.56-103.994-103.994 0-55.841 26-100.107 105.747-103.875-23.715-33.413-59.437-46.608-105.747-50.94v-61.747c0 0 207.991-18.144 207.991 216.561-0.202 57.437-46.56 103.996-103.994 103.996z" />
</font></defs></svg>
\ No newline at end of file
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="tinymce" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe000;" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" />
<glyph unicode="&#xe001;" glyph-name="newdocument" d="M903.432 760.57l-142.864 142.862c-31.112 31.112-92.568 56.568-136.568 56.568h-480c-44 0-80-36-80-80v-864c0-44 36-80 80-80h736c44 0 80 36 80 80v608c0 44-25.456 105.458-56.568 136.57zM858.178 715.314c3.13-3.13 6.25-6.974 9.28-11.314h-163.458v163.456c4.34-3.030 8.184-6.15 11.314-9.28l142.864-142.862zM896 16c0-8.672-7.328-16-16-16h-736c-8.672 0-16 7.328-16 16v864c0 8.672 7.328 16 16 16h480c4.832 0 10.254-0.61 16-1.704v-254.296h254.296c1.094-5.746 1.704-11.166 1.704-16v-608z" />
<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
<glyph unicode="&#xe003;" glyph-name="alignleft" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe005;" glyph-name="alignright" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe007;" glyph-name="cut" d="M890.774 250.846c-45.654 45.556-103.728 69.072-157.946 69.072h-29.112l-63.904 64.008 255.62 256.038c63.904 64.010 63.904 192.028 0 256.038l-383.43-384.056-383.432 384.054c-63.904-64.008-63.904-192.028 0-256.038l255.622-256.034-63.906-64.008h-29.114c-54.22 0-112.292-23.518-157.948-69.076-81.622-81.442-92.65-202.484-24.63-270.35 29.97-29.902 70.288-44.494 112.996-44.494 54.216 0 112.29 23.514 157.946 69.072 53.584 53.464 76.742 124 67.084 185.348l65.384 65.488 65.376-65.488c-9.656-61.348 13.506-131.882 67.084-185.348 45.662-45.558 103.732-69.072 157.948-69.072 42.708 0 83.024 14.592 112.994 44.496 68.020 67.866 56.988 188.908-24.632 270.35zM353.024 114.462c-7.698-17.882-19.010-34.346-33.626-48.926-14.636-14.604-31.172-25.918-49.148-33.624-16.132-6.916-32.96-10.568-48.662-10.568-15.146 0-36.612 3.402-52.862 19.612-16.136 16.104-19.52 37.318-19.52 52.288 0 15.542 3.642 32.21 10.526 48.212 7.7 17.884 19.014 34.346 33.626 48.926 14.634 14.606 31.172 25.914 49.15 33.624 16.134 6.914 32.96 10.568 48.664 10.568 15.146 0 36.612-3.4 52.858-19.614 16.134-16.098 19.522-37.316 19.522-52.284 0.002-15.542-3.638-32.216-10.528-48.214zM512.004 293.404c-49.914 0-90.376 40.532-90.376 90.526 0 49.992 40.462 90.52 90.376 90.52s90.372-40.528 90.372-90.52c0-49.998-40.46-90.526-90.372-90.526zM855.272 40.958c-16.248-16.208-37.712-19.612-52.86-19.612-15.704 0-32.53 3.652-48.666 10.568-17.972 7.706-34.508 19.020-49.142 33.624-14.614 14.58-25.926 31.042-33.626 48.926-6.886 15.998-10.526 32.672-10.526 48.212 0 14.966 3.384 36.188 19.52 52.286 16.246 16.208 37.712 19.614 52.86 19.614 15.7 0 32.53-3.654 48.66-10.568 17.978-7.708 34.516-19.018 49.15-33.624 14.61-14.58 25.924-31.042 33.626-48.926 6.884-15.998 10.526-32.67 10.526-48.212-0.002-14.97-3.39-36.186-19.522-52.288z" />
<glyph unicode="&#xe008;" glyph-name="paste" d="M832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h448l192 192v512h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM832 26.51v101.49h101.49l-101.49-101.49zM960 192h-192v-192h-320v576h512v-384z" />
<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M64 960h384v-64h-384zM576 960h384v-64h-384zM952 640h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 896h640v-128h-640v128zM384 512h640v-128h-640v128zM384 128h640v-128h-640v128zM0 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 448c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 64c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128z" />
<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 128h640v-128h-640zM384 512h640v-128h-640zM384 896h640v-128h-640zM192 960v-256h-64v192h-64v64zM128 434v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM256 256v-320h-192v64h128v64h-128v64h128v64h-128v64z" />
<glyph unicode="&#xe00c;" glyph-name="indent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM0 256v384l256-192z" />
<glyph unicode="&#xe00d;" glyph-name="outdent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM256 640v-384l-256 192z" />
<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M225 512c123.712 0 224-100.29 224-224 0-123.712-100.288-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.634-11.636-22.252-24.016-31.83-37.020 11.438 1.8 23.16 2.746 35.104 2.746zM801 512c123.71 0 224-100.29 224-224 0-123.712-100.29-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.636-11.636-22.254-24.016-31.832-37.020 11.44 1.8 23.16 2.746 35.106 2.746z" />
<glyph unicode="&#xe00f;" glyph-name="undo" d="M761.862-64c113.726 206.032 132.888 520.306-313.862 509.824v-253.824l-384 384 384 384v-248.372c534.962 13.942 594.57-472.214 313.862-775.628z" />
<glyph unicode="&#xe010;" glyph-name="redo" d="M576 711.628v248.372l384-384-384-384v253.824c-446.75 10.482-427.588-303.792-313.86-509.824-280.712 303.414-221.1 789.57 313.86 775.628z" />
<glyph unicode="&#xe011;" glyph-name="link" d="M320 256c17.6-17.6 47.274-16.726 65.942 1.942l316.118 316.116c18.668 18.668 19.54 48.342 1.94 65.942s-47.274 16.726-65.942-1.942l-316.116-316.116c-18.668-18.668-19.542-48.342-1.942-65.942zM476.888 284.888c4.56-9.050 6.99-19.16 6.99-29.696 0-17.616-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.382 99.382c-12.248 12.248-18.992 28.694-18.992 46.308s6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994 10.536 0 20.644-2.43 29.696-6.99l65.338 65.338c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-60.67-60.67-60.67-159.948 0-220.618l99.382-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c55.82 55.82 60.238 144.298 13.344 205.344l-65.34-65.34zM978.498 815.116l-99.382 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994s34.060-6.746 46.308-18.994l99.382-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c60.67 60.666 60.67 159.944 0 220.614z" />
<glyph unicode="&#xe012;" glyph-name="unlink" d="M476.888 284.886c4.56-9.048 6.99-19.158 6.99-29.696 0-17.616-6.744-34.058-18.992-46.308l-163.38-163.38c-12.248-12.248-28.696-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.38 99.38c-12.248 12.25-18.992 28.696-18.992 46.308s6.744 34.060 18.992 46.308l163.38 163.382c12.248 12.246 28.696 18.992 46.308 18.992 10.538 0 20.644-2.43 29.696-6.988l65.338 65.336c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.38-163.382c-60.67-60.67-60.67-159.95 0-220.618l99.38-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.38 163.38c55.82 55.82 60.238 144.298 13.344 205.346l-65.34-65.338zM978.496 815.116l-99.38 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.97-15.166-110.306-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.246 12.248 28.694 18.994 46.306 18.994 17.616 0 34.060-6.746 46.308-18.994l99.38-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.38-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.504l163.38 163.38c60.672 60.666 60.672 159.944 0 220.614zM233.368 681.376l-191.994 191.994 45.256 45.256 191.994-191.994zM384 960h64v-192h-64zM0 576h192v-64h-192zM790.632 214.624l191.996-191.996-45.256-45.256-191.996 191.996zM576 128h64v-192h-64zM832 384h192v-64h-192z" />
<glyph unicode="&#xe013;" glyph-name="anchor" d="M192 960v-1024l320 320 320-320v1024h-640zM768 90.51l-256 256-256-256v805.49h512v-805.49z" />
<glyph unicode="&#xe014;" glyph-name="image" d="M0 832v-832h1024v832h-1024zM960 64h-896v704h896v-704zM704 608c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96s-96 42.981-96 96zM896 128h-768l192 512 256-320 128 96z" />
<glyph unicode="&#xe015;" glyph-name="media" d="M0 832v-768h1024v768h-1024zM192 128h-128v128h128v-128zM192 384h-128v128h128v-128zM192 640h-128v128h128v-128zM768 128h-512v640h512v-640zM960 128h-128v128h128v-128zM960 384h-128v128h128v-128zM960 640h-128v128h128v-128zM384 640v-384l256 192z" />
<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
<glyph unicode="&#xe017;" glyph-name="code" d="M320 704l-256-256 256-256h128l-256 256 256 256zM704 704h-128l256-256-256-256h128l256 256z" />
<glyph unicode="&#xe018;" glyph-name="inserttime" d="M512 768c-212.076 0-384-171.922-384-384s171.922-384 384-384c212.074 0 384 171.922 384 384s-171.926 384-384 384zM715.644 180.354c-54.392-54.396-126.716-84.354-203.644-84.354s-149.25 29.958-203.646 84.354c-54.396 54.394-84.354 126.718-84.354 203.646s29.958 149.25 84.354 203.646c54.396 54.396 126.718 84.354 203.646 84.354s149.252-29.958 203.642-84.354c54.402-54.396 84.358-126.718 84.358-203.646s-29.958-149.252-84.356-203.646zM325.93 756.138l-42.94 85.878c-98.874-49.536-179.47-130.132-229.006-229.008l85.876-42.94c40.248 80.336 105.732 145.822 186.070 186.070zM884.134 570.070l85.878 42.938c-49.532 98.876-130.126 179.472-229.004 229.008l-42.944-85.878c80.338-40.248 145.824-105.732 186.070-186.068zM512 576h-64v-192c0-10.11 4.7-19.11 12.022-24.972l-0.012-0.016 160-128 39.976 49.976-147.986 118.39v176.622z" />
<glyph unicode="&#xe019;" glyph-name="preview" d="M512 640c-209.368 0-395.244-100.556-512-256 116.756-155.446 302.632-256 512-256s395.244 100.554 512 256c-116.756 155.444-302.632 256-512 256zM448 512c35.346 0 64-28.654 64-64s-28.654-64-64-64-64 28.654-64 64 28.654 64 64 64zM773.616 254.704c-39.648-20.258-81.652-35.862-124.846-46.376-44.488-10.836-90.502-16.328-136.77-16.328-46.266 0-92.282 5.492-136.768 16.324-43.194 10.518-85.198 26.122-124.846 46.376-63.020 32.202-120.222 76.41-167.64 129.298 47.418 52.888 104.62 97.1 167.64 129.298 32.336 16.522 66.242 29.946 101.082 40.040-19.888-30.242-31.468-66.434-31.468-105.336 0-106.040 85.962-192 192-192s192 85.96 192 192c0 38.902-11.582 75.094-31.466 105.34 34.838-10.096 68.744-23.52 101.082-40.042 63.022-32.198 120.218-76.408 167.638-129.298-47.42-52.886-104.618-97.1-167.638-129.296zM860.918 716.278c-108.72 55.554-226.112 83.722-348.918 83.722s-240.198-28.168-348.918-83.722c-58.772-30.032-113.732-67.904-163.082-112.076v-109.206c55.338 58.566 120.694 107.754 192.194 144.29 99.62 50.904 207.218 76.714 319.806 76.714s220.186-25.81 319.804-76.716c71.502-36.536 136.858-85.724 192.196-144.29v109.206c-49.35 44.174-104.308 82.046-163.082 112.078z" />
<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M322.018 128l57.6 192h264.764l57.6-192h113.632l-191.996 640h-223.236l-192-640h113.636zM475.618 640h72.764l57.6-192h-187.964l57.6 192z" />
<glyph unicode="&#xe01b;" glyph-name="table" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
<glyph unicode="&#xe01c;" glyph-name="hr" d="M0 512h1024v-128h-1024z" />
<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M0 64h576v-128h-576zM192 960h704v-128h-704zM277.388 128l204.688 784.164 123.85-32.328-196.25-751.836zM929.774-64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774z" />
<glyph unicode="&#xe01e;" glyph-name="sub" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
<glyph unicode="&#xe01f;" glyph-name="sup" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 64h256l64 128v-256h-384v214.214c131.112 56.484 224 197.162 224 361.786 0 214.432-157.598 382.266-352 382.266-194.406 0-352-167.832-352-382.266 0-164.624 92.886-305.302 224-361.786v-214.214h-384v256l64-128h256v32.59c-187.63 66.46-320 227.402-320 415.41 0 247.424 229.23 448 512 448s512-200.576 512-448c0-188.008-132.37-348.95-320-415.41v-32.59z" />
<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 960c-282.77 0-512-229.228-512-512 0-282.77 229.228-512 512-512 282.77 0 512 229.23 512 512 0 282.772-229.23 512-512 512zM512 16c-238.586 0-432 193.412-432 432 0 238.586 193.414 432 432 432 238.59 0 432-193.414 432-432 0-238.588-193.41-432-432-432zM384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64 28.654 64 64 64 64-28.654 64-64zM768 640c0-35.346-28.652-64-64-64s-64 28.654-64 64 28.652 64 64 64 64-28.654 64-64zM512 308c141.074 0 262.688 57.532 318.462 123.192-20.872-171.22-156.288-303.192-318.462-303.192-162.118 0-297.498 132.026-318.444 303.168 55.786-65.646 177.386-123.168 318.444-123.168z" />
<glyph unicode="&#xe022;" glyph-name="print" d="M256 896h512v-128h-512zM960 704h-896c-35.2 0-64-28.8-64-64v-320c0-35.2 28.796-64 64-64h192v-256h512v256h192c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64zM704 64h-384v320h384v-320zM974.4 608c0-25.626-20.774-46.4-46.398-46.4-25.626 0-46.402 20.774-46.402 46.4s20.776 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" />
<glyph unicode="&#xe024;" glyph-name="spellchecker" d="M128 704h128v-192h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192zM128 896h128v-128h-128v128zM960 896v64h-192c-35.202 0-64-28.8-64-64v-320c0-35.2 28.798-64 64-64h192v64h-192v320h192zM640 800v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64zM576 576h-128v128h128v-128zM576 768h-128v128h128v-128zM832 384l-416-448-224 288 82 70 142-148 352 302z" />
<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 384h-192v128h192v192h128v-192h192v-128h-192v-192h-128zM1024 320v-384h-1024v384h128v-256h768v256z" />
<glyph unicode="&#xe026;" glyph-name="template" d="M384 768h128v-64h-128zM576 768h128v-64h-128zM896 768v-256h-192v64h128v128h-64v64zM320 576h128v-64h-128zM512 576h128v-64h-128zM192 704v-128h64v-64h-128v256h192v-64zM384 384h128v-64h-128zM576 384h128v-64h-128zM896 384v-256h-192v64h128v128h-64v64zM320 192h128v-64h-128zM512 192h128v-64h-128zM192 320v-128h64v-64h-128v256h192v-64zM960 896h-896v-896h896v896zM1024 960v0-1024h-1024v1024h1024z" />
<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" />
<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
<glyph unicode="&#xe02a;" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" />
<glyph unicode="&#xe02b;" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
<glyph unicode="&#xe02c;" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" />
<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M731.42 442.964c63.92-47.938 100.58-116.086 100.58-186.964s-36.66-139.026-100.58-186.964c-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128-82.138 0-160.062 24.518-219.42 69.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 82.136 0 160.062-24.518 219.42-69.036zM0 448h1024v-64h-1024z" />
<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224z" />
<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM64 512l256-224-256-224z" />
<glyph unicode="&#xe030;" glyph-name="rtl" d="M256 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM960 64l-256 224 256 224z" />
<glyph unicode="&#xe031;" glyph-name="copy" d="M832 704h-192v64l-192 192h-448v-768h384v-256h640v576l-192 192zM832 613.49l101.49-101.49h-101.49v101.49zM448 869.49l101.49-101.49h-101.49v101.49zM64 896h320v-192h192v-448h-512v640zM960 0h-512v192h192v448h128v-192h192v-448z" />
<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
<glyph unicode="&#xe033;" glyph-name="checkbox" d="M128 416l288-288 480 480-128 128-352-352-160 160z" />
<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM904.34 256h74.86l44.8 448h-1024l64-640h484.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM1002.996 46.25l-198.496 174.692c17.454 28.92 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l174.692-198.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM640 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
<glyph unicode="&#xe035;" glyph-name="pastetext" d="M512 448v-128h32l32 64h64v-256h-48v-64h224v64h-48v256h64l32-64h32v128zM832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h640v704h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM960 0h-512v576h512v-576z" />
<glyph unicode="&#xe600;" glyph-name="gamma" d="M483.2 320l-147.2 336c-9.6 25.6-19.2 44.8-25.6 54.4s-16 12.8-25.6 12.8c-16 0-25.6-3.2-28.8-3.2v70.4c9.6 6.4 25.6 6.4 38.4 9.6 32 0 57.6-6.4 73.6-22.4 6.4-6.4 12.8-16 19.2-25.6 6.4-12.8 12.8-25.6 16-41.6l121.6-291.2 150.4 371.2h92.8l-198.4-470.4v-224h-86.4v224zM0 960v-1024h1024v1024h-1024zM960 0h-896v896h896v-896z" />
<glyph unicode="&#xe601;" glyph-name="orientation" d="M627.2 80h-579.2v396.8h579.2v-396.8zM553.6 406.4h-435.2v-256h435.2v256zM259.2 732.8c176 176 457.6 176 633.6 0s176-457.6 0-633.6c-121.6-121.6-297.6-160-454.4-108.8 121.6-28.8 262.4 9.6 361.6 108.8 150.4 150.4 160 384 22.4 521.6-121.6 121.6-320 128-470.4 19.2l86.4-86.4-294.4-22.4 22.4 294.4 92.8-92.8z" />
<glyph unicode="&#xe602;" glyph-name="invert" d="M892.8-22.4l-89.6 89.6c-70.4-80-172.8-131.2-288-131.2-208 0-380.8 166.4-384 377.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4v0c0 0 0 0 0 3.2 0 0 0 3.2 0 3.2 3.2 105.6 48 211.2 105.6 304l-192 192 44.8 44.8 182.4-182.4c0 0 0 0 0 0l569.6-569.6c0 0 0 0 0 0l99.2-99.2-48-44.8zM896 326.4c0 0 0 0 0 0 0 3.2 0 6.4 0 6.4-9.6 316.8-384 627.2-384 627.2s-108.8-89.6-208-220.8l70.4-70.4c6.4 9.6 16 22.4 22.4 32 41.6 51.2 83.2 96 115.2 128v0c32-32 73.6-76.8 115.2-128 108.8-137.6 169.6-265.6 172.8-371.2 0 0 0-3.2 0-3.2v0 0c0-3.2 0-3.2 0-6.4s0-3.2 0-3.2v0 0c0-22.4-3.2-41.6-9.6-64l76.8-76.8c16 41.6 28.8 89.6 28.8 137.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4z" />
<glyph unicode="&#xe603;" glyph-name="codesample" d="M199.995 578.002v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-100.518 0-182.003-81.485-182.003-182.003v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-100.515 81.485-182.003 182.003-182.003h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 50.931-20.928 96.966-54.646 130.002 33.716 33.036 54.646 79.072 54.646 130.002zM824.005 578.002v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c100.515 0 182.003-81.485 182.003-182.003v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-100.515-81.488-182.003-182.003-182.003h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 50.931 20.928 96.966 54.646 130.002-33.716 33.036-54.646 79.072-54.646 130.002zM616.002 603.285c0-57.439-46.562-104.002-104.002-104.002s-104.002 46.562-104.002 104.002c0 57.439 46.562 104.002 104.002 104.002s104.002-46.562 104.002-104.002zM512 448.717c-57.439 0-104.002-46.562-104.002-104.002 0-55.845 26-100.115 105.752-103.88-23.719-33.417-59.441-46.612-105.752-50.944v-61.751c0 0 208.003-18.144 208.003 216.577-0.202 57.441-46.56 104.004-104.002 104.004z" />
<glyph unicode="&#xe604;" glyph-name="tablerowprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
<glyph unicode="&#xe605;" glyph-name="tablecellprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
<glyph unicode="&#xe606;" glyph-name="table2" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-896v192h896v-192z" />
<glyph unicode="&#xe607;" glyph-name="tablemergecells" d="M0 896v-896h1024v896h-1024zM384 64v448h576v-448h-576zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192z" />
<glyph unicode="&#xe608;" glyph-name="tableinsertcolbefore" d="M320 188.8v182.4h-182.4v89.6h182.4v182.4h86.4v-182.4h185.6v-89.6h-185.6v-182.4zM0 896v-896h1024v896h-1024zM640 64h-576v704h576v-704zM960 64h-256v192h256v-192zM960 320h-256v192h256v-192zM960 576h-256v192h256v-192z" />
<glyph unicode="&#xe609;" glyph-name="tableinsertcolafter" d="M704 643.2v-182.4h182.4v-89.6h-182.4v-182.4h-86.4v182.4h-185.6v89.6h185.6v182.4zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v704h576v-704z" />
<glyph unicode="&#xe60a;" glyph-name="tableinsertrowbefore" d="M691.2 508.8h-144v-144h-70.4v144h-144v67.2h144v144h70.4v-144h144zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM640 64h-256v192h256v-192zM960 64h-256v192h256v-192zM960 316.8h-896v451.2h896v-451.2z" />
<glyph unicode="&#xe60b;" glyph-name="tableinsertrowafter" d="M332.8 323.2h144v144h70.4v-144h144v-67.2h-144v-144h-70.4v144h-144zM0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM64 768h256v-192h-256v192zM960 64h-896v451.2h896v-451.2zM960 576h-256v192h256v-192z" />
<glyph unicode="&#xe60d;" glyph-name="tablesplitcells" d="M0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v448h576v-448zM960 576h-256v192h256v-192zM864 156.8l-60.8-60.8-131.2 131.2-131.2-131.2-60.8 60.8 131.2 131.2-131.2 131.2 60.8 60.8 131.2-131.2 131.2 131.2 60.8-60.8-131.2-131.2z" />
<glyph unicode="&#xe60e;" glyph-name="tabledelete" d="M0 896h1024v-896h-1024v896zM60.8 768v-704h899.2v704h-899.2zM809.6 211.2l-96-96-204.8 204.8-204.8-204.8-96 96 204.8 204.8-204.8 204.8 96 96 204.8-204.8 204.8 204.8 96-96-204.8-204.8z" />
<glyph unicode="&#xe62a;" glyph-name="tableleftheader" d="M0 896v-832h1024v832h-1024zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM640 640h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-256v192h256v-192z" />
<glyph unicode="&#xe62b;" glyph-name="tabletopheader" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192z" />
<glyph unicode="&#xe800;" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" />
<glyph unicode="&#xe801;" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" />
<glyph unicode="&#xe900;" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" />
<glyph unicode="&#xe901;" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM0 512h128v-128h-128v128zM192 512h832v-128h-832v128zM0 128h128v-128h-128v128zM192 128h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM192 320h128v-128h-128v128zM384 320h640v-128h-640v128z" />
<glyph unicode="&#xe902;" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" />
<glyph unicode="&#xe903;" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" />
<glyph unicode="&#xe904;" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" />
<glyph unicode="&#xe905;" glyph-name="count" d="M0 480h1024v-64h-1024v64zM304 912v-339.2h-67.2v272h-67.2v67.2zM444.8 694.4v-54.4h134.4v-67.2h-201.6v153.6l134.4 64v54.4h-134.4v67.2h201.6v-153.6zM854.4 912v-339.2h-204.8v67.2h137.6v67.2h-137.6v70.4h137.6v67.2h-137.6v67.2zM115.2 166.4c3.2 57.6 38.4 83.2 108.8 83.2 38.4 0 67.2-9.6 86.4-25.6s25.6-35.2 25.6-70.4v-112c0-25.6 0-28.8 9.6-41.6h-73.6c-3.2 9.6-3.2 9.6-6.4 19.2-22.4-19.2-41.6-25.6-70.4-25.6-54.4 0-89.6 32-89.6 76.8s28.8 70.4 99.2 80l38.4 6.4c16 3.2 22.4 6.4 22.4 16 0 12.8-12.8 22.4-38.4 22.4s-41.6-9.6-44.8-28.8h-67.2zM262.4 115.2c-6.4-3.2-12.8-6.4-25.6-6.4l-25.6-6.4c-25.6-6.4-38.4-16-38.4-28.8 0-16 12.8-25.6 35.2-25.6s41.6 9.6 54.4 32v35.2zM390.4 336h73.6v-112c22.4 16 41.6 22.4 67.2 22.4 64 0 105.6-51.2 105.6-124.8 0-76.8-44.8-134.4-108.8-134.4-32 0-48 9.6-67.2 35.2v-28.8h-70.4v342.4zM460.8 121.6c0-41.6 22.4-70.4 51.2-70.4s51.2 28.8 51.2 70.4c0 44.8-19.2 70.4-51.2 70.4-28.8 0-51.2-28.8-51.2-70.4zM851.2 153.6c-3.2 22.4-19.2 35.2-44.8 35.2-32 0-51.2-25.6-51.2-70.4 0-48 19.2-73.6 51.2-73.6 25.6 0 41.6 12.8 44.8 41.6l70.4-3.2c-9.6-60.8-54.4-96-118.4-96-73.6 0-121.6 51.2-121.6 128 0 80 48 131.2 124.8 131.2 64 0 108.8-35.2 112-96h-67.2z" />
<glyph unicode="&#xe906;" glyph-name="reload" d="M889.68 793.68c-93.608 102.216-228.154 166.32-377.68 166.32-282.77 0-512-229.23-512-512h96c0 229.75 186.25 416 416 416 123.020 0 233.542-53.418 309.696-138.306l-149.696-149.694h352v352l-134.32-134.32zM928 448c0-229.75-186.25-416-416-416-123.020 0-233.542 53.418-309.694 138.306l149.694 149.694h-352v-352l134.32 134.32c93.608-102.216 228.154-166.32 377.68-166.32 282.77 0 512 229.23 512 512h-96z" />
<glyph unicode="&#xe907;" glyph-name="translate" d="M553.6 304l-118.4 118.4c80 89.6 137.6 195.2 172.8 304h137.6v92.8h-326.4v92.8h-92.8v-92.8h-326.4v-92.8h518.4c-32-89.6-80-176-147.2-249.6-44.8 48-80 99.2-108.8 156.8h-92.8c35.2-76.8 80-147.2 137.6-211.2l-236.8-233.6 67.2-67.2 233.6 233.6 144-144c3.2 0 38.4 92.8 38.4 92.8zM816 540.8h-92.8l-208-560h92.8l51.2 140.8h220.8l51.2-140.8h92.8l-208 560zM691.2 214.4l76.8 201.6 76.8-201.6h-153.6z" />
<glyph unicode="&#xe908;" glyph-name="drag" d="M576 896h128v-128h-128v128zM576 640h128v-128h-128v128zM320 640h128v-128h-128v128zM576 384h128v-128h-128v128zM320 384h128v-128h-128v128zM320 128h128v-128h-128v128zM576 128h128v-128h-128v128zM320 896h128v-128h-128v128z" />
<glyph unicode="&#xe90b;" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />
<glyph unicode="&#xe911;" glyph-name="books" d="M576.234 670.73l242.712 81.432 203.584-606.784-242.712-81.432zM0 64h256v704h-256v-704zM64 640h128v-64h-128v64zM320 64h256v704h-256v-704zM384 640h128v-64h-128v64z" />
<glyph unicode="&#xe914;" glyph-name="upload" d="M839.432 760.57c27.492-27.492 50.554-78.672 55.552-120.57h-318.984v318.984c41.898-4.998 93.076-28.060 120.568-55.552l142.864-142.862zM512 576v384h-368c-44 0-80-36-80-80v-864c0-44 36-80 80-80h672c44 0 80 36 80 80v560h-384zM576 192v-192h-192v192h-160l256 256 256-256h-160z" />
<glyph unicode="&#xe915;" glyph-name="editimage" d="M768 416v-352h-640v640h352l128 128h-512c-52.8 0-96-43.2-96-96v-704c0-52.8 43.2-96 96-96h704c52.798 0 96 43.2 96 96v512l-128-128zM864 960l-608-608v-160h160l608 608c0 96-64 160-160 160zM416 320l-48 48 480 480 48-48-480-480z" />
<glyph unicode="&#xe91c;" glyph-name="bubble" d="M928 896h-832c-52.8 0-96-43.2-96-96v-512c0-52.8 43.2-96 96-96h160v-256l307.2 256h364.8c52.8 0 96 43.2 96 96v512c0 52.8-43.2 96-96 96zM896 320h-379.142l-196.858-174.714v174.714h-192v448h768v-448z" />
<glyph unicode="&#xe91d;" glyph-name="user" d="M622.826 257.264c-22.11 3.518-22.614 64.314-22.614 64.314s64.968 64.316 79.128 150.802c38.090 0 61.618 91.946 23.522 124.296 1.59 34.054 48.96 267.324-190.862 267.324s-192.45-233.27-190.864-267.324c-38.094-32.35-14.57-124.296 23.522-124.296 14.158-86.486 79.128-150.802 79.128-150.802s-0.504-60.796-22.614-64.314c-71.22-11.332-337.172-128.634-337.172-257.264h896c0 128.63-265.952 245.932-337.174 257.264z" />
<glyph unicode="&#xe926;" glyph-name="lock" d="M592 512h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 704c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" />
<glyph unicode="&#xe927;" glyph-name="unlock" d="M768 896c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" />
<glyph unicode="&#xe928;" glyph-name="settings" d="M448 832v16c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576zM256 704v128h128v-128h-128zM832 528c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-576v-128h576v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h192v128h-192v16zM640 384v128h128v-128h-128zM448 208c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576v16zM256 64v128h128v-128h-128z" />
<glyph unicode="&#xe92a;" glyph-name="remove2" d="M192-64h640l64 704h-768zM640 832v128h-256v-128h-320v-192l64 64h768l64-64v192h-320zM576 832h-128v64h128v-64z" />
<glyph unicode="&#xe92d;" glyph-name="menu" d="M384 896h256v-256h-256zM384 576h256v-256h-256zM384 256h256v-256h-256z" />
<glyph unicode="&#xe930;" glyph-name="warning" d="M1009.956 44.24l-437.074 871.112c-16.742 29.766-38.812 44.648-60.882 44.648s-44.14-14.882-60.884-44.648l-437.074-871.112c-33.486-59.532-5-108.24 63.304-108.24h869.308c68.302 0 96.792 48.708 63.302 108.24zM512 64c-35.346 0-64 28.654-64 64 0 35.348 28.654 64 64 64 35.348 0 64-28.652 64-64 0-35.346-28.652-64-64-64zM556 256h-88l-20 256c0 35.346 28.654 64 64 64s64-28.654 64-64l-20-256z" />
<glyph unicode="&#xe931;" glyph-name="question" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
<glyph unicode="&#xe932;" glyph-name="pluscircle" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384zM768 384h-192v-192h-128v192h-192v128h192v192h128v-192h192z" />
<glyph unicode="&#xe933;" glyph-name="info" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM448 768h128v-128h-128v128zM640 128h-256v64h64v256h-64v64h192v-320h64v-64z" />
<glyph unicode="&#xe934;" glyph-name="notice" d="M1024 224l-288 736h-448l-288-288v-448l288-288h448l288 288v448l-288 288zM576 128h-128v128h128v-128zM576 384h-128v384h128v-384z" />
<glyph unicode="&#xe935;" glyph-name="drop" d="M864.626 486.838c-65.754 183.44-205.11 348.15-352.626 473.162-147.516-125.012-286.87-289.722-352.626-473.162-40.664-113.436-44.682-236.562 12.584-345.4 65.846-125.14 198.632-205.438 340.042-205.438s274.196 80.298 340.040 205.44c57.27 108.838 53.25 231.962 12.586 345.398zM738.764 201.044c-43.802-83.252-132.812-137.044-226.764-137.044-55.12 0-108.524 18.536-152.112 50.652 13.242-1.724 26.632-2.652 40.112-2.652 117.426 0 228.668 67.214 283.402 171.242 44.878 85.292 40.978 173.848 23.882 244.338 14.558-28.15 26.906-56.198 36.848-83.932 22.606-63.062 40.024-156.34-5.368-242.604z" />
<glyph unicode="&#xe939;" glyph-name="minus" d="M0 544v-192c0-17.672 14.328-32 32-32h960c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32h-960c-17.672 0-32-14.328-32-32z" />
<glyph unicode="&#xe93a;" glyph-name="plus" d="M992 576h-352v352c0 17.672-14.328 32-32 32h-192c-17.672 0-32-14.328-32-32v-352h-352c-17.672 0-32-14.328-32-32v-192c0-17.672 14.328-32 32-32h352v-352c0-17.672 14.328-32 32-32h192c17.672 0 32 14.328 32 32v352h352c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32z" />
<glyph unicode="&#xe93b;" glyph-name="arrowup" d="M0 320l192-192 320 320 320-320 192 192-511.998 512z" />
<glyph unicode="&#xe93c;" glyph-name="arrowright" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" />
<glyph unicode="&#xe93d;" glyph-name="arrowdown" d="M1024 576l-192 192-320-320-320 320-192-192 512-511.998z" />
<glyph unicode="&#xe93f;" glyph-name="arrowup2" d="M768 320l-256 256-256-256z" />
<glyph unicode="&#xe940;" glyph-name="arrowdown2" d="M256 576l256-256 256 256z" />
<glyph unicode="&#xe941;" glyph-name="menu2" d="M256 704l256-256 256 256zM255.996 384.004l256-256 256 256z" />
<glyph unicode="&#xe961;" glyph-name="newtab" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" />
<glyph unicode="&#xeaa8;" glyph-name="rotateleft" d="M607.998 831.986c-212.070 0-383.986-171.916-383.986-383.986h-191.994l246.848-246.848 246.848 246.848h-191.994c0 151.478 122.798 274.276 274.276 274.276 151.48 0 274.276-122.798 274.276-274.276 0-151.48-122.796-274.276-274.276-274.276v-109.71c212.070 0 383.986 171.916 383.986 383.986s-171.916 383.986-383.986 383.986z" />
<glyph unicode="&#xeaa9;" glyph-name="rotateright" d="M416.002 831.986c212.070 0 383.986-171.916 383.986-383.986h191.994l-246.848-246.848-246.848 246.848h191.994c0 151.478-122.798 274.276-274.276 274.276-151.48 0-274.276-122.798-274.276-274.276 0-151.48 122.796-274.276 274.276-274.276v-109.71c-212.070 0-383.986 171.916-383.986 383.986s171.916 383.986 383.986 383.986z" />
<glyph unicode="&#xeaaa;" glyph-name="flipv" d="M0 576h1024v384zM1024 0v384h-1024z" />
<glyph unicode="&#xeaac;" glyph-name="fliph" d="M576 960v-1024h384zM0-64h384v1024z" />
<glyph unicode="&#xeb35;" glyph-name="zoomin" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM448 768h-128v-128h-128v-128h128v-128h128v128h128v128h-128z" />
<glyph unicode="&#xeb36;" glyph-name="zoomout" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM192 640h384v-128h-384z" />
<glyph unicode="&#xeba7;" glyph-name="sharpen" d="M768 832h-512l-256-256 512-576 512 576-256 256zM512 181.334v2.666h-2.37l-14.222 16h16.592v16h-30.814l-14.222 16h45.036v16h-59.258l-14.222 16h73.48v16h-87.704l-14.222 16h101.926v16h-116.148l-14.222 16h130.37v16h-144.592l-14.222 16h158.814v16h-173.038l-14.222 16h187.26v16h-201.482l-14.222 16h215.704v16h-229.926l-14.222 16h244.148v16h-258.372l-14.222 16h272.594v16h-286.816l-14.222 16h301.038v16h-315.26l-14.222 16h329.482v16h-343.706l-7.344 8.262 139.072 139.072h211.978v-3.334h215.314l16-16h-231.314v-16h247.314l16-16h-263.314v-16h279.314l16-16h-295.314v-16h311.314l16-16h-327.314v-16h343.312l7.738-7.738-351.050-394.928z" />
<glyph unicode="&#xec6a;" glyph-name="options" d="M64 768h896v-192h-896zM64 512h896v-192h-896zM64 256h896v-192h-896z" />
<glyph unicode="&#xeccc;" glyph-name="sun" d="M512 128c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM512 768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64s64-28.654 64-64v-64c0-35.346-28.654-64-64-64zM960 512c35.346 0 64-28.654 64-64s-28.654-64-64-64h-64c-35.348 0-64 28.654-64 64s28.652 64 64 64h64zM192 448c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64s28.654 64 64 64h64c35.346 0 64-28.654 64-64zM828.784 221.726l45.256-45.258c24.992-24.99 24.992-65.516 0-90.508-24.994-24.992-65.518-24.992-90.51 0l-45.256 45.256c-24.992 24.99-24.992 65.516 0 90.51 24.994 24.992 65.518 24.992 90.51 0zM195.216 674.274l-45.256 45.256c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.51 0l45.256-45.256c24.994-24.994 24.994-65.516 0-90.51s-65.516-24.994-90.51 0zM828.784 674.274c-24.992-24.992-65.516-24.992-90.51 0-24.992 24.994-24.992 65.516 0 90.51l45.256 45.254c24.992 24.994 65.516 24.994 90.51 0 24.992-24.994 24.992-65.516 0-90.51l-45.256-45.254zM195.216 221.726c24.992 24.992 65.518 24.992 90.508 0 24.994-24.994 24.994-65.52 0-90.51l-45.254-45.256c-24.994-24.992-65.516-24.992-90.51 0s-24.994 65.518 0 90.508l45.256 45.258zM512 704c-141.384 0-256-114.616-256-256 0-141.382 114.616-256 256-256 141.382 0 256 114.618 256 256 0 141.384-114.616 256-256 256zM512 288c-88.366 0-160 71.634-160 160s71.634 160 160 160 160-71.634 160-160-71.634-160-160-160z" />
<glyph unicode="&#xeccd;" glyph-name="moon" d="M715.812 895.52c-60.25 34.784-124.618 55.904-189.572 64.48 122.936-160.082 144.768-384.762 37.574-570.42-107.2-185.67-312.688-279.112-512.788-252.68 39.898-51.958 90.376-97.146 150.628-131.934 245.908-141.974 560.37-57.72 702.344 188.198 141.988 245.924 57.732 560.372-188.186 702.356z" />
<glyph unicode="&#xecd4;" glyph-name="contrast" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM128 448c0 212.078 171.922 384 384 384v-768c-212.078 0-384 171.922-384 384z" />
<glyph unicode="&#xed6a;" glyph-name="remove22" d="M893.254 738.746l-90.508 90.508-290.746-290.744-290.746 290.744-90.508-90.506 290.746-290.748-290.746-290.746 90.508-90.508 290.746 290.746 290.746-290.746 90.508 90.51-290.744 290.744z" />
<glyph unicode="&#xedc0;" glyph-name="arrowleft" d="M672-64l192 192-320 320 320 320-192 192-512-512z" />
<glyph unicode="&#xedf9;" glyph-name="resize2" d="M0 896v-384c0-35.346 28.654-64 64-64s64 28.654 64 64v229.488l677.488-677.488h-229.488c-35.346 0-64-28.652-64-64 0-35.346 28.654-64 64-64h384c35.346 0 64 28.654 64 64v384c0 35.348-28.654 64-64 64s-64-28.652-64-64v-229.488l-677.488 677.488h229.488c35.346 0 64 28.654 64 64s-28.652 64-64 64h-384c-35.346 0-64-28.654-64-64z" />
<glyph unicode="&#xee78;" glyph-name="crop" d="M832 704l192 192-64 64-192-192h-448v192h-128v-192h-192v-128h192v-512h512v-192h128v192h192v128h-192v448zM320 640h320l-320-320v320zM384 256l320 320v-320h-320z" />
</font></defs></svg>
\ No newline at end of file
.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#595959;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2)}.mce-statusbar>.mce-container-body{display:flex;padding-right:16px}.mce-statusbar>.mce-container-body .mce-path{flex:1}.mce-wordcount{font-size:inherit;text-transform:uppercase;padding:8px 0}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative;font-size:11px}.mce-fullscreen .mce-resizehandle{display:none}.mce-statusbar .mce-flow-layout-item{margin:0}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid #c5c5c5;width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:white}.mce-grid td.mce-grid-cell div{border:1px solid #c5c5c5;width:15px;height:15px;margin:0;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#91bbe9}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#91bbe9}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#c5c5c5;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#91bbe9;background:#bdd6f2}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#8b8b8b}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-container b{font-weight:bold}.mce-container p{margin-bottom:5px}.mce-container a{cursor:pointer;color:#2276d2}.mce-container a:hover{text-decoration:underline}.mce-container ul{margin-left:15px}.mce-container .mce-table-striped{border-collapse:collapse;margin:10px}.mce-container .mce-table-striped thead>tr{background-color:#fafafa}.mce-container .mce-table-striped thead>tr th{font-weight:bold}.mce-container .mce-table-striped td,.mce-container .mce-table-striped th{padding:5px}.mce-container .mce-table-striped tr:nth-child(even){background-color:#fafafa}.mce-container .mce-table-striped tbody>tr:hover{background-color:#e1e1e1}.mce-branding{font-size:inherit;text-transform:uppercase;white-space:pre;padding:8px 0}.mce-branding a{font-size:inherit;color:inherit}.mce-top-part{position:relative}.mce-top-part::before{content:'';position:absolute;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);top:0;right:0;bottom:0;left:0;pointer-events:none}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-rtl .mce-statusbar>.mce-container-body>*:last-child{padding-right:0;padding-left:10px}.mce-rtl .mce-path{text-align:right;padding-right:16px}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.5;filter:alpha(opacity=50);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#2276d2}.mce-croprect-handle-move:focus{outline:1px solid #2276d2}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:#c5c5c5;border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:#c5c5c5;border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#fff;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#fff;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:#c5c5c5;border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#fff;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:#c5c5c5;border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#fff;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid #c5c5c5;border-left-width:1px}.mce-sidebar-toolbar .mce-btn{border-left:0;border-right:0}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{background-color:#555c66}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:white;text-shadow:1px 1px none}.mce-sidebar-panel{border:0 solid #c5c5c5;border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #f3f3f3;border:0 solid #c5c5c5;background-color:#fff}.mce-floatpanel{position:absolute;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2)}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);top:0;left:0;background:#FFF;border:1px solid #c5c5c5;border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#c5c5c5;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#FFF}#mce-modal-block.mce-in{opacity:.5;filter:alpha(opacity=50);zoom:1}.mce-window-move{cursor:move}.mce-window{-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#9b9b9b}.mce-close:hover i{color:#bdbdbd}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#e2e4e7}.mce-window .mce-btn:hover{border-color:#c5c5c5}.mce-window .mce-btn:focus{border-color:#2276d2}.mce-window-body .mce-btn,.mce-foot .mce-btn{border-color:#c5c5c5}.mce-foot .mce-btn.mce-primary{border-color:transparent}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1;margin-top:1px}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-inner{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#595959}.mce-bar{display:block;width:0;height:100%;background-color:#dfdfdf;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#fff;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#c5c5c5;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0;box-sizing:border-box}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#595959}.mce-notification .mce-progress .mce-bar-container{border-color:#c5c5c5}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#595959}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#9b9b9b;cursor:pointer}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b3b3b3;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);background:white;display:inline-block;*display:inline;*zoom:1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn:hover,.mce-btn:active{background:white;color:#595959;border-color:#e2e4e7}.mce-btn:focus{background:white;color:#595959;border-color:#e2e4e7}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover,.mce-btn.mce-active:focus,.mce-btn.mce-active:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#555c66;color:white;border-color:transparent}.mce-btn.mce-active button,.mce-btn.mce-active:hover button,.mce-btn.mce-active i,.mce-btn.mce-active:hover i{color:white}.mce-btn:hover .mce-caret{border-top-color:#b5bcc2}.mce-btn.mce-active .mce-caret,.mce-btn.mce-active:hover .mce-caret{border-top-color:white}.mce-btn button{padding:4px 6px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#595959;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:white;border:1px solid transparent;border-color:transparent;background-color:#2276d2}.mce-primary:hover,.mce-primary:focus{background-color:#1e6abc;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#1e6abc;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-primary button,.mce-primary button i{color:white;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #b5bcc2;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #b5bcc2;border-top:0}.mce-btn-flat{border:0;background:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-toolbar .mce-btn-group{margin:0;padding:2px 0}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:0;margin-left:2px}.mce-btn-group{margin-left:2px}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:white;text-indent:-10em;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#595959;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid #2276d2;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#bdbdbd}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#bdbdbd}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid black;background:white;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal;font-size:inherit}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#595959;font-size:inherit;text-transform:uppercase}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#555c66;color:white}.mce-path .mce-divider{display:inline;font-size:inherit}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid #c5c5c5;width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #e2e4e7}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar{border:1px solid #e2e4e7}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-menubar .mce-menubtn button span{color:#595959}.mce-menubar .mce-caret{border-top-color:#b5bcc2}.mce-menubar .mce-active .mce-caret,.mce-menubar .mce-menubtn:hover .mce-caret{border-top-color:#b5bcc2}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#e2e4e7;background:white;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-menubar .mce-menubtn.mce-active{border-bottom:none;z-index:65537}div.mce-menubtn.mce-opened{border-bottom-color:white;z-index:65537}.mce-menubtn button{color:#595959}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-rtl .mce-menubtn.mce-fixed-width span{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 4px 6px 4px;clear:both;font-weight:normal;line-height:20px;color:#595959;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-caret{margin-top:4px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #595959}.mce-menu-item .mce-menu-shortcut{display:inline-block;padding:0 10px 0 20px;color:#aaa}.mce-menu-item .mce-ico{padding-right:4px}.mce-menu-item:hover,.mce-menu-item:focus{background:#ededee}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:#aaa}.mce-menu-item:hover .mce-text,.mce-menu-item:focus .mce-text,.mce-menu-item:hover .mce-ico,.mce-menu-item:focus .mce-ico{color:#595959}.mce-menu-item.mce-selected{background:#ededee}.mce-menu-item.mce-selected .mce-text,.mce-menu-item.mce-selected .mce-ico{color:#595959}.mce-menu-item.mce-active.mce-menu-item-normal{background:#555c66}.mce-menu-item.mce-active.mce-menu-item-normal .mce-text,.mce-menu-item.mce-active.mce-menu-item-normal .mce-ico{color:white}.mce-menu-item.mce-active.mce-menu-item-checkbox .mce-ico{visibility:visible}.mce-menu-item.mce-disabled,.mce-menu-item.mce-disabled:hover{background:white}.mce-menu-item.mce-disabled:focus,.mce-menu-item.mce-disabled:hover:focus{background:#ededee}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled:hover .mce-text,.mce-menu-item.mce-disabled .mce-ico,.mce-menu-item.mce-disabled:hover .mce-ico{color:#aaa}.mce-menu-item.mce-menu-item-preview.mce-active{border-left:5px solid #555c66;background:white}.mce-menu-item.mce-menu-item-preview.mce-active .mce-text,.mce-menu-item.mce-menu-item-preview.mce-active .mce-ico{color:#595959}.mce-menu-item.mce-menu-item-preview.mce-active:hover{background:#ededee}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:#595959}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #595959;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:#595959}.mce-rtl .mce-menu-item .mce-ico{padding-right:0;padding-left:4px}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:180px;background:white;border:1px solid #c5c9cf;border:1px solid #e2e4e7;z-index:1002;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);box-shadow:0 1px 2px rgba(0, 0, 0, 0.2);max-height:500px;overflow:auto;overflow-x:hidden}.mce-menu.mce-animate{opacity:.01;transform:rotateY(10deg) rotateX(-10deg);transform-origin:left top}.mce-menu.mce-menu-align .mce-menu-shortcut,.mce-menu.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block}.mce-menu.mce-in.mce-animate{opacity:1;transform:rotateY(0) rotateX(0);transition:opacity .075s ease,transform .1s ease}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-rtl .mce-menu-item .mce-ico{padding-right:0;padding-left:4px}.mce-rtl.mce-menu-align .mce-caret,.mce-rtl .mce-menu-shortcut{right:auto;left:0}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#595959}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #c5c5c5;background:#fff;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #c5c5c5;background:#e6e6e6;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{border-color:#2276d2}.mce-spacer{visibility:hidden}.mce-splitbtn:hover .mce-open{border-left:1px solid #e2e4e7}.mce-splitbtn .mce-open{border-left:1px solid transparent;padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open:focus{border-left:1px solid #e2e4e7}.mce-splitbtn .mce-open:hover,.mce-splitbtn .mce-open:active{border-left:1px solid #e2e4e7}.mce-splitbtn.mce-active:hover .mce-open{border-left:1px solid white}.mce-splitbtn.mce-opened{border-color:#e2e4e7}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#fff;padding:8px 15px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-tab:focus{color:#2276d2}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#595959}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#2276d2;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#bdbdbd}.mce-rtl .mce-textbox{text-align:right;direction:rtl}.mce-dropzone{border:3px dashed gray;text-align:center}.mce-dropzone span{text-transform:uppercase;display:inline-block;vertical-align:middle}.mce-dropzone:after{content:"";height:100%;display:inline-block;vertical-align:middle}.mce-dropzone.mce-disabled{opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-dropzone.mce-disabled.mce-dragenter{cursor:not-allowed}.mce-browsebutton{position:relative;overflow:hidden}.mce-browsebutton button{position:relative;z-index:1}.mce-browsebutton input{opacity:0;filter:alpha(opacity=0);zoom:1;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#595959}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#BBB}.mce-rtl .mce-filepicker input{direction:ltr}/*# sourceMappingURL=skin.min.css.map */
\ No newline at end of file
{"version":3,"sources":["./src/skins/lightgray/main/less/desktop/Reset.less","./src/skins/lightgray/main/less/desktop/Variables.less","./src/skins/lightgray/main/less/desktop/Mixins.less","./src/skins/lightgray/main/less/desktop/Animations.less","./src/skins/lightgray/main/less/desktop/TinyMCE.less","./src/skins/lightgray/main/less/desktop/CropRect.less","./src/skins/lightgray/main/less/desktop/ImagePanel.less","./src/skins/lightgray/main/less/desktop/Arrows.less","./src/skins/lightgray/main/less/desktop/Sidebar.less","./src/skins/lightgray/main/less/desktop/Container.less","./src/skins/lightgray/main/less/desktop/Scrollable.less","./src/skins/lightgray/main/less/desktop/Panel.less","./src/skins/lightgray/main/less/desktop/FloatPanel.less","./src/skins/lightgray/main/less/desktop/Window.less","./src/skins/lightgray/main/less/desktop/ToolTip.less","./src/skins/lightgray/main/less/desktop/Progress.less","./src/skins/lightgray/main/less/desktop/Notification.less","./src/skins/lightgray/main/less/desktop/AbsoluteLayout.less","./src/skins/lightgray/main/less/desktop/Button.less","./src/skins/lightgray/main/less/desktop/ButtonGroup.less","./src/skins/lightgray/main/less/desktop/Checkbox.less","./src/skins/lightgray/main/less/desktop/ComboBox.less","./src/skins/lightgray/main/less/desktop/ColorBox.less","./src/skins/lightgray/main/less/desktop/ColorButton.less","./src/skins/lightgray/main/less/desktop/ColorPicker.less","./src/skins/lightgray/main/less/desktop/Path.less","./src/skins/lightgray/main/less/desktop/FieldSet.less","./src/skins/lightgray/main/less/desktop/FitLayout.less","./src/skins/lightgray/main/less/desktop/FlowLayout.less","./src/skins/lightgray/main/less/desktop/Iframe.less","./src/skins/lightgray/main/less/desktop/InfoBox.less","./src/skins/lightgray/main/less/desktop/Label.less","./src/skins/lightgray/main/less/desktop/MenuBar.less","./src/skins/lightgray/main/less/desktop/MenuButton.less","./src/skins/lightgray/main/less/desktop/MenuItem.less","./src/skins/lightgray/main/less/desktop/Throbber.less","./src/skins/lightgray/main/less/desktop/Menu.less","./src/skins/lightgray/main/less/desktop/ListBox.less","./src/skins/lightgray/main/less/desktop/ResizeHandle.less","./src/skins/lightgray/main/less/desktop/SelectBox.less","./src/skins/lightgray/main/less/desktop/Slider.less","./src/skins/lightgray/main/less/desktop/Spacer.less","./src/skins/lightgray/main/less/desktop/SplitButton.less","./src/skins/lightgray/main/less/desktop/StackLayout.less","./src/skins/lightgray/main/less/desktop/TabPanel.less","./src/skins/lightgray/main/less/desktop/TextBox.less","./src/skins/lightgray/main/less/desktop/DropZone.less","./src/skins/lightgray/main/less/desktop/BrowseButton.less","./src/skins/lightgray/main/less/desktop/Icons.less","./src/skins/lightgray/main/less/desktop/FilePicker.less"],"names":[],"mappings":"AAEA,CAAC,GAAS,WAAY,CAAC,GAAS,UAAW,GAAG,CAAC,GAAS,QAAS,CAAC,GAAS,OAAQ,GAAG,CAAC,GAAS,OAC9F,QAAA,CAAW,SAAA,CAAY,QAAA,CAAW,SAAA,CAClC,kBAAA,CAAqB,sBAAA,CACrB,oBAAA,CAAuB,aAAA,CACvB,YCU+B,2CDV/B,CACA,cAAA,CAAuB,gBAAA,CAAmB,UAAA,CAC1C,eAAA,CAAkB,UAAA,CAAa,WAAA,CAC/B,kBAAA,CAAqB,cAAA,CACrB,uCAAA,CACA,kBAAA,CAAqB,kBAAA,CACrB,eAAA,CACA,2BAAA,CACA,8BAAA,CACA,sBAAA,CACA,aAAA,CACA,eAGF,CAAC,GAAS,OAAQ,QAChB,0BAAA,CACA,6BAAA,CACA,sBAGF,CAAC,GAAS,UAAW,EAAC,eACpB,qBAAA,CACA,wBAAA,CACA,mBAAA,CACA,iBEyBF,WACE,oBAAA,CACA,wBAAA,CACA,oBAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,aC7DF,CAAC,GAAS,MACR,SAAA,CDqCA,sCAAA,CACA,+BCnCA,CAJD,GAAS,KAIP,CAAC,GAAS,IACT,UCPJ,CAAC,GAAS,SAER,kBAAA,YACA,kBAGF,CAAC,GAAS,YACR,QAAA,CAAW,SAAA,CAAY,QAAA,CACvB,eAAA,CACA,WAAA,CACA,YAGF,GAAG,CAAC,GAAS,YACX,cAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CACA,YAGF,CAAC,GAAS,SACR,aAAA,CFaA,+CAAA,CACA,4CAAA,CACA,wCEVF,CAAC,GAAS,UAAW,EAAG,GAAS,gBAC/B,YAAA,CACA,mBAFF,CAAC,GAAS,UAAW,EAAG,GAAS,eAI/B,EAAC,GAAS,MACR,OAIJ,CAAC,GAAS,WACR,iBAAA,CACA,wBAAA,CACA,cAGF,GAAG,CAAC,GAAS,WACX,eAAA,CACA,YAGF,CAAC,GAAS,WACR,kBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,gBAC7B,iBAAA,CACA,eAGF,CAAC,GAAS,WAAY,EAAC,GAAS,cAC9B,aAGF,CAAC,GAAS,UAAW,EAAC,GAAS,kBAC7B,SAKF,CAAC,GAAS,SACR,yBAGF,CAAC,GAAS,QAAS,IACjB,cAAA,CACA,wBAAA,CACA,UAAA,CACA,WAAA,CACA,gBAAA,CACA,iBAAA,CACA,qBAAA,CACA,YAGF,CAAC,GAAS,QAAS,GAAG,KACpB,kBAGF,CAAC,GAAS,QAAS,GAAE,OACnB,iBAGF,CAAC,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,KACrC,wBAAA,CACA,UAAA,CAAa,WAAA,CACb,QAAA,CACA,eAEA,CAND,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,IAMpC,OACC,qBAGF,CAVD,GAAS,KAAM,GAAE,CAAC,GAAS,UAAW,IAUpC,WACC,mBAIJ,CAAC,GAAS,MACR,kBAAA,CACA,yBAFF,CAAC,GAAS,KAIR,GACE,aAAA,CACA,6BAEA,CARH,GAAS,KAIR,EAIG,OAAQ,CARZ,GAAS,KAIR,EAIY,OACR,qBAKN,CAAC,GAAS,aACR,mBADF,CAAC,GAAS,YAGR,GACE,oBAAA,CACA,UAAA,CAAa,YALjB,CAAC,GAAS,YAQR,EAAC,OARH,CAAC,GAAS,YAQC,EAAC,CAAC,GAAS,QAClB,oBAAA,CACA,mBAIJ,CAAC,GAAS,aACR,kBAGF,GAAG,CAAC,GAAS,gBACX,WAGF,CAAC,GAAS,eAAgB,KACxB,iBAAA,CACA,qBAAA,CACA,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,WACR,YAAa,gCASf,CAAC,GAAS,YAAa,EAAC,GAAS,kBAC/B,gBAKF,CAAC,GAAS,UAAW,GACnB,iBAGF,CAAC,GAAS,UAAW,GACnB,kBAGF,CAAC,GAAS,UAAW,GACnB,cAAA,CACA,cACA,CAHD,GAAS,UAAW,EAGlB,OACC,0BAIJ,CAAC,GAAS,UAAW,IACnB,iBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,wBAAA,CACA,YAFF,CAAC,GAAS,UAAW,EAAC,GAAS,cAG7B,MAAM,IACJ,yBAJJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAG7B,MAAM,GAEJ,IACE,iBANN,CAAC,GAAS,UAAW,EAAC,GAAS,cAS7B,IATF,CAAC,GAAS,UAAW,EAAC,GAAS,cASzB,IACF,YAVJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAY7B,GAAE,UAAU,OACV,yBAbJ,CAAC,GAAS,UAAW,EAAC,GAAS,cAe7B,MAAM,GAAI,OACR,yBAIJ,CAAC,GAAS,UACR,iBAAA,CACA,wBAAA,CACA,eAAA,CACA,cAJF,CAAC,GAAS,SAMR,GACE,iBAAA,CACA,cAIJ,CAAC,GAAS,UACR,kBAGF,CAAC,GAAS,SAAS,SAEjB,QAAS,EAAT,CACA,iBAAA,CF7LA,+CAAA,CACA,4CAAA,CACA,uCAAA,CE6LA,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,oBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,WACvB,MAAA,CACA,WAGF,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAG,GAAS,eAC/B,EAAG,YACD,eAAA,CACA,kBAJN,CAAC,GAAS,IAQR,EAAC,GAAS,MACR,gBAAA,CACA,mBCvPJ,CAAC,GAAS,oBACR,iBAAA,CACA,KAAA,CACA,OAGF,CAAC,GAAS,iBACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CAAa,WAAA,CACb,uBAGF,CAAC,GAAS,oBACR,wBAAA,CACA,oBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,qBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,uBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,oBACR,wBAAA,CACA,sBAAA,CACA,gBAAA,CACA,SAAA,CAAY,WAGd,CAAC,GAAS,sBACR,iBAAA,CACA,WAAA,CACA,SAGF,CAAC,GAAS,gBH9CR,UAAA,CAEA,wBAAA,CACA,MAAA,CG6CA,iBAAA,CACA,iBAGF,CAAC,GAAS,gBAAgB,OACxB,qBAGF,CAAC,GAAS,qBAAqB,OAC7B,0BC1DF,CAAC,GAAS,YACR,aAAA,CACA,iBAGF,CAAC,GAAS,eACR,iBAAA,CACA,eAAgB,sGAGlB,CAAC,GAAS,WAAY,KACpB,kBAGF,CAAC,GAAS,UAAU,CAAC,GAAS,IAAK,EAAC,GAAS,KAC3C,aAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,gBAAA,CACA,cAAA,CACA,YCrBF,CAAC,GAAS,UACR,gBAGF,CAAC,GAAS,YACR,iBAGF,CAAC,GAAS,MAAM,QAChB,CAAC,GAAS,MAAM,OACd,iBAAA,CACA,QAAA,CACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,kBAAA,CACA,wBAAA,CACA,QAAS,GAGX,CAAC,GAAS,MAAM,CAAC,GAAS,SAAS,QACjC,QAAA,CACA,2BAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACnC,WAAA,CACA,wBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SAAS,OACjC,QAAA,CACA,wBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,WAAA,CACA,qBAAA,CACA,sBAAA,CACA,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACrC,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QACnC,SAEF,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OACnC,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QACtC,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OACpC,SAAA,CACA,SAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QACpC,UAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OACpC,UAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,QAC1E,SAAA,CACA,OAAA,CACA,0BAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,WAAW,OAC1E,SAAA,CACA,OAAA,CACA,uBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAC/D,iBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,QAC3E,UAAA,CACA,OAAA,CACA,yBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,YAAY,OAC3E,UAAA,CACA,OAAA,CACA,sBAAA,CACA,0BAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,aAAa,CAAC,GAAS,MAAM,CAAC,GAAS,aAC/D,kBC/GF,CAAC,GAAS,oBAAqB,EAAG,GAAS,gBACzC,aADF,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAGzC,EAAC,GAAS,WACR,OAJJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAOzC,EAAC,GAAS,QAAS,EAAG,GAAS,gBAC7B,YAAA,CACA,mBAAA,CACA,YAVJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAazC,EAAC,GAAS,eACR,eAAA,CACA,eAAA,CACA,kBAhBJ,CAAC,GAAS,oBAAqB,EAAG,GAAS,eAazC,EAAC,GAAS,cAKR,EAAG,GAAS,gBACV,iBAAA,CACA,UAAA,CAAa,WAAA,CACb,aAAA,CACA,KAAA,CAAQ,OAKd,CAAC,GAAS,iBACR,sBAAA,CACA,sBAFF,CAAC,GAAS,gBAIR,EAAC,GAAS,KACR,aAAA,CACA,eANJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,QAT1B,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,OAC9D,yBAVJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,OAGtB,QAZJ,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,MAG9D,QAZJ,CAAC,GAAS,gBASR,EAAC,GAAS,IAAI,CAAC,GAAS,OAGd,OAAO,GAZnB,CAAC,GAAS,gBASyB,EAAC,GAAS,IAAI,CAAC,GAAS,OAAO,MAGtD,OAAO,GACb,WAAA,CACA,yBAKN,CAAC,GAAS,eACR,sBAAA,CACA,sBChDF,CAAC,GAAS,WAAY,CAAC,GAAS,gBAC9B,cAGF,CAAC,GAAS,YACR,gBCLF,CAAC,GAAS,WACR,iBAAA,CACA,SAAA,CACA,WAAA,CACA,OAAA,CACA,SAAA,CRJA,UAAA,CAEA,wBAAA,CACA,OQKF,CAAC,GAAS,aACR,QAAA,CACA,UAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,WAGF,CAAC,GAAS,iBACR,iBAAA,CACA,qBAAA,CACA,qBAAA,CACA,+BAAA,CACA,SAAA,CACA,YAIF,CAAC,GAAS,YAAa,EAAC,GAAS,iBAC/B,UAAA,CACA,WAGF,CAAC,GAAS,UAAU,OAAQ,CAAC,GAAS,UAAU,CAAC,GAAS,QACxD,qBAAA,CRjCA,UAAA,CAEA,wBAAA,CACA,OQmCF,CAAC,GAAS,QACR,kBCxCF,CAAC,GAAS,OACR,sBAAA,CACA,sBAAA,CACA,sBCHF,CAAC,GAAS,YACR,iBAAA,CV+BA,+CAAA,CACA,4CAAA,CACA,wCU7BF,CAAC,GAAS,WAAW,CAAC,GAAS,OAC7B,eAKF,CAAC,GAAS,WAAY,EAAC,GAAS,OAChC,CAAC,GAAS,WAAY,EAAC,GAAS,MAAM,OACpC,iBAAA,CACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,wBAAA,CACA,mBAGF,CAAC,GAAS,WAAY,EAAC,GAAS,OAC9B,kBAGF,CAAC,GAAS,WAAY,EAAC,GAAS,MAAM,OACpC,iBAAA,CACA,QAAS,GAGX,CAAC,GAAS,WAAW,CAAC,GAAS,SVmB7B,OAAQ,2DAAR,CACA,sBAAA,CAlBA,+CAAA,CACA,4CAAA,CACA,uCAAA,CUAA,KAAA,CACA,MAAA,CACA,eAAA,CACA,wBAAA,CACA,kCAEA,CAVD,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,QACT,eAAA,CACA,cAEA,CAdH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAIP,EAAG,GAAS,OACZ,QAAA,CACA,iBAAA,CACA,kBAAA,CACA,2BAAA,CACA,oCAAA,CACA,UAEA,CAtBL,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAIP,EAAG,GAAS,MAQX,OACC,OAAA,CACA,iBAAA,CACA,kBAAA,CACA,yBAIJ,CA9BH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAoBR,CAAC,GAAS,OAAS,kBACpB,CA/BH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAqBR,CAAC,GAAS,MAAO,EAAG,GAAS,OAAS,UAEvC,CAjCH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAuBR,CAAC,GAAS,KAAO,iBAClB,CAlCH,GAAS,WAAW,CAAC,GAAS,QAU5B,CAAC,GAAS,OAwBR,CAAC,GAAS,IAAK,EAAG,GAAS,OAAS,UAAA,CAAa,UChEtD,CAAC,GAAS,YACR,QAAA,CAAW,SAAA,CAAY,QAAA,CACvB,eAAA,CACA,YAGF,GAAG,CAAC,GAAS,YACX,cAAA,CACA,KAAA,CAAQ,OAGV,CAAC,GAAS,aXVR,SAAA,CAEA,uBAAA,CACA,MAAA,CWSA,cAAA,CACA,MAAA,CAAS,KAAA,CACT,UAAA,CAAa,WAAA,CACb,gBAGF,CAAC,GAAS,YAAY,CAAC,GAAS,IXlB9B,UAAA,CAEA,wBAAA,CACA,OWmBF,CAAC,GAAS,aACR,YAGF,CAAC,GAAS,QXKR,+CAAA,CACA,4CAAA,CACA,uCAAA,CAeA,OAAQ,2DAAR,CACA,sBAAA,CWnBA,eAAA,CACA,cAAA,CACA,KAAA,CAAQ,MAAA,CACR,SAAA,CACA,UAAW,SAAX,CACA,yDAGF,CAAC,GAAS,OAAO,CAAC,GAAS,IACzB,UAAW,QAAX,CACA,UAGF,CAAC,GAAS,aACR,gBAAA,CACA,+BAAA,CACA,kBAGF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,iBAAA,CACA,OAAA,CACA,KAAA,CACA,WAAA,CACA,UAAA,CACA,iBAAA,CACA,eAPF,CAAC,GAAS,YAAa,EAAC,GAAS,MAS/B,GACE,cAIJ,CAAC,GAAS,MAAM,MAAO,GACrB,cAGF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,gBAAA,CACA,cAAA,CACA,gBAAA,CACA,iCAAA,CACA,mBAGF,CAAC,GAAS,OAAQ,EAAC,GAAS,gBAC1B,cAGF,CAAC,GAAS,MACR,aAAA,CACA,qBAAA,CACA,6BAIF,CAAC,GAAS,YAAa,EAAC,GAAS,OAC/B,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,WAAA,CACA,SAAA,CACA,YAGF,CAAC,GAAS,OAAQ,QAChB,UAAA,CACA,YAOF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,qBAGF,CAAC,GAAS,OACR,EAAC,GAAS,IAAI,OACZ,qBAFJ,CAAC,GAAS,OAKR,EAAC,GAAS,IAAI,OACZ,qBAIJ,CAAC,GAAS,YAAa,EAAC,GAAS,KAAM,CAAC,GAAS,KAAM,EAAC,GAAS,KAC/D,qBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,IAAI,CAAC,GAAS,SACtC,yBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,iBAAA,CACA,UAAA,CACA,UAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,SAAA,CACA,QAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,OAC9C,aAAA,CACA,iBC7IF,CAAC,GAAS,SACR,iBAAA,CACA,WAAA,CZDA,UAAA,CAEA,wBAAA,CACA,MAAA,CYAA,eAGF,CAAC,GAAS,eACR,cAAA,CACA,qBAAA,CACA,WAAA,CACA,eAAA,CACA,uBAAA,CACA,iBAAA,CACA,mBAOF,CAAC,GAAS,eZWR,uBAAA,CACA,oBAAA,CACA,gBYTF,CAAC,GAAS,eACR,iBAAA,CACA,OAAA,CACA,QAAA,CACA,aAAA,CACA,uBAGF,CAAC,GAAS,iBACR,yBAGF,CAAC,GAAS,iBACR,sBAGF,CAAC,GAAS,iBACR,uBAGF,CAAC,GAAS,iBACR,wBAGF,CAAC,GAAS,YAAa,CAAC,GAAS,YAC/B,kBAGF,CAAC,GAAS,YAAa,CAAC,GAAS,YAC/B,iBAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,KAAA,CACA,QAAA,CACA,gBAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,KAAA,CACA,SAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,KAAA,CACA,UAAA,CACA,yBAAA,CACA,eAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,QAAA,CACA,QAAA,CACA,gBAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,QAAA,CACA,SAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,WAAY,EAAC,GAAS,eAC9B,QAAA,CACA,UAAA,CACA,sBAAA,CACA,kBAAA,CACA,6BAAA,CACA,+BAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,OAAA,CACA,OAAA,CACA,eAAA,CACA,uBAAA,CACA,iBAAA,CACA,4BAAA,CACA,gCAGF,CAAC,GAAS,UAAW,EAAC,GAAS,eAC7B,MAAA,CACA,OAAA,CACA,eAAA,CACA,wBAAA,CACA,gBAAA,CACA,4BAAA,CACA,gCClIF,CAAC,GAAS,UACR,oBAAA,CACA,iBAAA,CACA,YAGF,CAAC,GAAS,SAAU,EAAC,GAAS,eAC5B,oBAAA,CACA,WAAA,CACA,WAAA,CACA,gBAAA,CACA,qBAAA,CACA,gBAIF,CAAC,GAAS,SAAU,EAAC,GAAS,MAC5B,oBAAA,CACA,eAAA,CACA,kBAAA,CACA,cAAA,CACA,UAAA,CACA,cAGF,CAAC,GAAS,KACR,aAAA,CACA,OAAA,CACA,WAAA,CACA,wBAAA,CbSA,iCAAA,CACA,0BcvCF,CAAC,GAAS,cACR,iBAAA,CACA,qBAAA,CACA,WAAA,CACA,cAAA,CACA,gBAAA,CACA,kBAAA,CACA,oBAAA,CACA,wDAAA,CACA,SAAA,CACA,sBAGF,CAAC,GAAS,aAAa,CAAC,GAAS,IAC/B,UAGF,CAAC,GAAS,sBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,mBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,sBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,oBACR,wBAAA,CACA,qBAGF,CAAC,GAAS,aAAa,CAAC,GAAS,WAC/B,mBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,KAChC,eAGF,CAAC,GAAS,oBdSR,oBAAA,CACA,wBAAA,CACA,oBAAA,CACA,qBAAA,CACA,gBAAA,CACA,iBAAA,CACA,oBAAA,CACA,YAAA,CcdA,oBAAA,CACA,cAAA,CACA,sBAAA,CACA,iBAAA,CACA,kBAAA,CACA,cAGF,CAAC,GAAS,mBAAoB,GAC5B,yBAAA,CACA,eAGF,CAAC,GAAS,aAAc,EAAC,GAAS,UAChC,iBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,MACpD,eAGF,CAAC,GAAS,aAAc,GAAG,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/E,cAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,eACpD,qBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KAC7E,yBAGF,CAAC,GAAS,qBAAsB,GAAG,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/F,cAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC5D,qBAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACrF,yBAGF,CAAC,GAAS,kBAAmB,GAAG,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,MACzF,cAGF,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,eACzD,qBAGF,CAAC,GAAS,kBAAmB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KAClF,yBAGF,CAAC,GAAS,qBAAsB,GAAG,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC/F,cAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC5D,qBAGF,CAAC,GAAS,qBAAsB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACrF,yBAGF,CAAC,GAAS,mBAAoB,GAAG,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,MAC3F,cAGF,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,eAC1D,qBAGF,CAAC,GAAS,mBAAoB,EAAC,GAAS,SAAU,EAAC,GAAS,cAAe,EAAC,GAAS,KACnF,yBAGF,CAAC,GAAS,aAAc,EAAC,GAAS,OAChC,iBAAA,CACA,OAAA,CACA,SAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,aAAA,CACA,eCxIF,CAAC,GAAS,YACR,kBAGF,IAAK,EAAC,GAAS,iBAAkB,CAAC,GAAS,SACzC,kBAGF,CAAC,GAAS,SACR,SAAA,CAAY,WAGd,CAAC,GAAS,eAAe,CAAC,GAAS,YACjC,gBCbF,CAAC,GAAS,KACR,wBAAA,CACA,4DAAA,CACA,iBAAA,CACA,4CAAA,CACA,gBAAA,ChBsCA,oBAAA,CACA,eAAA,CACA,OAAA,CAbA,uBAAA,CACA,oBAAA,CACA,gBgBvBA,CAXD,GAAS,IAWP,OAAQ,CAXV,GAAS,IAWE,QACR,gBAAA,CACA,aAAA,CACA,qBAGF,CAjBD,GAAS,IAiBP,OACC,gBAAA,CACA,aAAA,CACA,qBAGF,CAvBD,GAAS,IAuBP,CAAC,GAAS,SAAU,QAAQ,CAvB9B,GAAS,IAuBsB,CAAC,GAAS,SAAS,MAAO,QACtD,cAAA,ChBQF,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OgByBA,CA7BD,GAAS,IA6BP,CAAC,GAAS,QACX,CA9BD,GAAS,IA8BP,CAAC,GAAS,OAAO,OAClB,CA/BD,GAAS,IA+BP,CAAC,GAAS,OAAO,OAClB,CAhCD,GAAS,IAgCP,CAAC,GAAS,OAAO,QhBAlB,uBAAA,CACA,oBAAA,CACA,eAAA,CgBAE,kBAAA,CACA,WAAA,CACA,yBAGF,CAvCD,GAAS,IAuCP,CAAC,GAAS,OAAQ,QAAQ,CAvC5B,GAAS,IAuCoB,CAAC,GAAS,OAAO,MAAO,QACpD,CAxCD,GAAS,IAwCP,CAAC,GAAS,OAAQ,GAAG,CAxCvB,GAAS,IAwCe,CAAC,GAAS,OAAO,MAAO,GAC7C,YAGF,CA5CD,GAAS,IA4CP,MAAO,EAAC,GAAS,OAChB,yBAGF,CAhDD,GAAS,IAgDP,CAAC,GAAS,OAAQ,EAAC,GAAS,OAAQ,CAhDtC,GAAS,IAgD8B,CAAC,GAAS,OAAO,MAAO,EAAC,GAAS,OACtE,uBAIJ,CAAC,GAAS,IAAK,QACb,eAAA,CACA,cAAA,CACA,gBAAA,CACA,iBAAA,CACA,cAAA,CACA,aAAA,CACA,iBAAA,CAGA,gBAAA,CACA,wBACA,CAZD,GAAS,IAAK,OAYZ,mBACC,QAAA,CACA,UAIJ,CAAC,GAAS,IAAK,GACb,yBAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,cAC1B,eAGF,CAAC,GAAS,SACR,WAAA,CACA,4BAAA,CACA,wBAAA,CACA,yBAEA,CAND,GAAS,QAMP,OAAQ,CANV,GAAS,QAME,OACR,wBAAA,CACA,yBAGF,CAXD,GAAS,QAWP,CAAC,GAAS,SAAU,QAAQ,CAX9B,GAAS,QAWsB,CAAC,GAAS,SAAS,MAAO,QACtD,cAAA,ChB3DF,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OgB4FA,CAjBD,GAAS,QAiBP,CAAC,GAAS,QAAS,CAjBrB,GAAS,QAiBa,CAAC,GAAS,OAAO,OAAQ,CAjB/C,GAAS,QAiBuC,IAAI,eAAqB,QACtE,wBAAA,ChBjEF,uBAAA,CACA,oBAAA,CACA,gBgBoEF,CAAC,GAAS,QAAS,QAAQ,CAAC,GAAS,QAAS,OAAO,GACnD,WAAA,CACA,yBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,KACvB,iBAAA,CACA,mBAAA,CACA,cAGF,CAAC,GAAS,UAAW,QACnB,gBAAA,CACA,cAAA,CACA,mBAIF,CAAC,GAAS,UAAW,GACnB,eAGF,CAAC,GAAS,UAAW,QACnB,eAAA,CACA,cAAA,CACA,oBAGF,CAAC,GAAS,UAAW,GACnB,gBAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,OACvB,cAAA,CACA,cAGF,CAAC,GAAS,UAAW,EAAC,GAAS,OAC7B,cAAA,CACA,cAGF,CAAC,GAAS,OhBvGR,oBAAA,CACA,eAAA,CACA,OAAA,CgBuGA,OAAA,CAAU,QAAA,CACV,kBAAA,CACA,4BAAA,CACA,kCAAA,CACA,iCAAA,CACA,QAAS,GAGX,CAAC,GAAS,SAAU,EAAC,GAAS,OAC5B,sBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,IACxB,+BAAA,CACA,aAGF,CAAC,GAAS,UACR,QAAA,CACA,sBAAA,ChBvIA,uBAAA,CACA,oBAAA,CACA,eAAA,CgBwIA,YAGF,CAAC,GAAS,SAAS,OAAQ,CAAC,GAAS,SAAS,CAAC,GAAS,QAAS,CAAC,GAAS,SAAS,OAAQ,CAAC,GAAS,SAAS,QAC7G,QAAA,CACA,kBAAA,CACA,WAAA,ChBhJA,uBAAA,CACA,oBAAA,CACA,gBgBkJF,CAAC,GAAS,aAAc,EAAC,GAAS,KAChC,kBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,IAAK,QAC5B,cC3LF,CAAC,GAAS,QAAS,EAAC,GAAS,WAC3B,QAAA,CACA,cAWF,CAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,gBAAA,CACA,QAAA,CAEA,gBAcF,CAAC,GAAS,UAAU,IAAI,eACtB,6BAAA,CACA,cAAA,CACA,gBAGF,CAAC,GAAS,WAGR,gBAYF,CAAC,GAAS,UAAW,EAAC,GAAS,IAAI,CAAC,GAAS,kBAC3C,SAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,KAC5C,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,OAC5C,eAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,IAAI,eACrC,gBAAA,CACA,8BAAA,CACA,iBAAA,CACA,iBCvEF,CAAC,GAAS,UACR,eAGF,CAAC,CAAC,GAAS,YACT,gBAAA,CACA,wBAAA,ClB0BA,uBAAA,CACA,oBAAA,CACA,eAAA,CkBzBA,sBAAA,CACA,iBAAA,CACA,gBAGF,CAAC,GAAS,QAAS,EAAC,CAAC,GAAS,YAC5B,aAAA,CACA,cAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,SAAS,MAAO,EAAC,CAAC,GAAS,YAAa,CAAC,GAAS,SAAS,CAAC,GAAS,MAAO,EAAC,CAAC,GAAS,YAC/F,wBAAA,ClBUA,uBAAA,CACA,oBAAA,CACA,gBkBRF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,OAAQ,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,CAAC,GAAS,YACzG,cAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAC5B,sBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UACvB,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,CAAC,GAAS,YACxB,iBC1CF,CAAC,GAAS,UACR,iBAAA,CnB0CA,oBAAA,CACA,eAAA,CACA,OAAA,CAbA,uBAAA,CACA,oBAAA,CACA,eAAA,CmB7BA,aAGF,CAAC,GAAS,SAAU,OAClB,wBAAA,CACA,0BAAA,CACA,YAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,OACrC,cAOF,CAAC,GAAS,SAAU,EAAC,GAAS,KAC5B,wBAAA,CACA,aAAA,CAEA,SAGF,CAAC,GAAS,SAAU,QAClB,iBAAA,CACA,iBAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,IAAK,QACpD,cAAA,CnBHA,uBAAA,CACA,oBAAA,CACA,eAAA,CAjCA,UAAA,CAEA,wBAAA,CACA,OmBoCF,CAAC,GAAS,SAAU,EAAC,GAAS,QAC5B,iBAAA,CACA,SAAA,CACA,OAAA,CACA,gBAAA,CACA,eAAA,CACA,cAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,eAGF,CAAC,GAAS,SAAS,CAAC,GAAS,WAAY,OACvC,mBAGF,CAAC,GAAS,SAAS,CAAC,GAAS,SAAU,EAAC,GAAS,QAC/C,WAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAAO,CAAC,GAAS,WAC7C,cAGF,CAAC,GAAS,SAAU,EAAC,GAAS,OAAO,CAAC,GAAS,aAC7C,cAGF,CAAC,GAAS,KAAK,CAAC,GAAS,eACvB,YAAA,CACA,YAAA,CACA,iBAHF,CAAC,GAAS,KAAK,CAAC,GAAS,cAKvB,EAAC,GAAS,WACR,uBAAA,CACA,eAPJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAUvB,EAAC,GAAS,eACR,UAXJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAcvB,EAAC,GAAS,MACR,eAfJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAkBvB,EAAC,GAAS,gBAlBZ,CAAC,GAAS,KAAK,CAAC,GAAS,cAkBI,EAAC,GAAS,eAAgB,GACnD,eAnBJ,CAAC,GAAS,KAAK,CAAC,GAAS,cAsBvB,EAAC,GAAS,KAAM,GACd,eC5FJ,CAAC,GAAS,SAAU,GAClB,wBAAA,CACA,UAAA,CAAa,YCFf,CAAC,GAAS,YAAa,EAAC,GAAS,KAC/B,kBAGF,CAAC,GAAS,kBACR,WAQF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,iBAAA,CACA,aAAA,CACA,iBAAA,CACA,QAAA,CACA,OAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,UAAA,CACA,gBAGF,CAAC,GAAS,YAAY,CAAC,GAAS,UAAW,EAAC,GAAS,SACnD,iBAAA,CACA,eAAA,CACA,WAmBF,CAAC,GAAS,IAAK,EAAC,GAAS,aACvB,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,SAC9C,aAAA,CACA,eAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAY,CAAC,GAAS,UAAW,EAAC,GAAS,SAClE,aAAA,CACA,eAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,YAAa,EAAC,GAAS,MAC9C,gBAAA,CACA,iBAAA,CACA,cCpEF,CAAC,GAAS,aACR,iBAAA,CACA,WAAA,CACA,aAGF,CAAC,GAAS,gBACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,SAAA,CACA,WAAA,CACA,wBAAA,CACA,gBAAA,CACA,gBAGF,CAAC,GAAS,qBACR,WAGF,CAAC,GAAS,sBAAuB,CAAC,GAAS,sBACzC,UAAA,CACA,WAAA,CACA,iBAAA,CACA,KAAA,CACA,OAGF,CAAC,GAAS,sBACR,OAAQ,yEAAwE,uBAAuB,YAAvG,CACA,WAAY,6GAAZ,CACA,WAAY,qDAGd,CAAC,GAAS,sBACR,OAAQ,yEAAwE,yBAAyB,UAAzG,CACA,WAAY,6GAAZ,CACA,WAAY,gDAGd,CAAC,GAAS,uBACR,eAAA,CACA,iBAAA,CACA,UAAA,CACA,WAAA,CACA,oBAAA,CACA,sBAAA,CACA,kBAGF,CAAC,GAAS,uBACR,iBAAA,CACA,UAAA,CACA,WAAA,CACA,sBAAA,CACA,kBAGF,CAAC,GAAS,eACR,iBAAA,CACA,KAAA,CAAQ,OAAA,CACR,UAAA,CACA,WAAA,CACA,wBAAA,CACA,iBAGF,CAAC,GAAS,sBACR,eAAA,CACA,iBAAA,CACA,KAAA,CACA,SAAA,CACA,UAAA,CACA,sBAAA,CACA,gBAAA,CACA,UAAA,CACA,YC5EF,CAAC,GAAS,MvB2CR,oBAAA,CACA,eAAA,CACA,OAAA,CuB3CA,WAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,KACxB,oBAAA,CACA,kBAGF,CAAC,GAAS,KAAM,EAAC,GAAS,WACxB,qBAGF,CAAC,GAAS,WvB2BR,oBAAA,CACA,eAAA,CACA,OAAA,CuB3BA,cAAA,CACA,aAAA,CACA,iBAAA,CACA,yBAGF,CAAC,GAAS,UAAU,OAClB,0BAGF,CAAC,GAAS,UAAU,OAClB,kBAAA,CACA,YAGF,CAAC,GAAS,KAAM,EAAC,GAAS,SACxB,cAAA,CACA,kBAGF,CAAC,GAAS,SAAU,EAAC,GAAS,WAC5B,WAKF,CAAC,GAAS,IAAK,EAAC,GAAS,MACvB,cC7CF,CAAC,GAAS,UACR,uBAIF,CAAC,GAAS,SAAU,EAAG,GAAS,gBAC9B,iBAGF,CAAC,GAAS,gBACR,eAAA,CACA,oBCXF,CAAC,GAAS,YzB2CR,oBAAA,CACA,eAAA,CACA,QyBzCF,CAAC,GAAS,iBACR,kBCLF,CAAC,GAAS,kB1B2CR,oBAAA,CACA,eAAA,CACA,Q0BzCF,CAAC,GAAS,kBACR,qBAGF,CAAC,GAAS,iBAAiB,CAAC,GAAS,MACnC,iBAGF,CAAC,GAAS,aACR,mBAGF,CAAC,GAAS,eAAgB,EAAC,GAAS,aAClC,mBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,aACvB,gBAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,kBACvB,qBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,iBAAiB,CAAC,GAAS,MAClD,gBChCF,CAAC,GAAS,QACR,sBAAA,CACA,UAAA,CAAa,YCFf,CAAC,GAAS,S5B2CR,oBAAA,CACA,eAAA,CACA,OAAA,C4B3CA,4CAAA,CACA,eAAA,CACA,qBAJF,CAAC,GAAS,QAMR,KACE,aAAA,CACA,WARJ,CAAC,GAAS,QAMR,IAIE,QACE,iBAAA,CACA,OAAA,CAAU,SAAA,CACV,cAAA,CACA,eAAA,CACA,aAfN,CAAC,GAAS,QAMR,IAYE,OAAM,OACJ,0BAKN,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,KACE,kBAFJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAK1B,QACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,QAI1B,KACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,SAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,QAI1B,KACE,cAIJ,CAAC,GAAS,QAAQ,CAAC,GAAS,OAC1B,kBAAA,CACA,qBAFF,CAAC,GAAS,QAAQ,CAAC,GAAS,MAI1B,KACE,cAMJ,CAAC,GAAS,IAAK,EAAC,GAAS,QACvB,KACE,gBAAA,CACA,cClEJ,CAAC,GAAS,O7B2CR,oBAAA,CACA,eAAA,CACA,OAAA,C6B3CA,4CAAA,CACA,gBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,YACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,UACxB,WAGF,CAAC,GAAS,MAAM,CAAC,GAAS,WACxB,qBAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,SACxB,cAGF,CAAC,GAAS,MAAM,CAAC,GAAS,OACxB,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,OACvB,gBAAA,CACA,cClCF,CAAC,GAAS,SACR,yBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,SAC3B,wBAAA,CACA,sBAAA,C9B0BA,uBAAA,CACA,oBAAA,CACA,eAAA,C8BzBA,YAGF,CAAC,GAAS,QAAS,EAAC,GAAS,QAAS,OAAO,MAC3C,cAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,yBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,EAAC,GAAS,OAD0B,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,MACzE,EAAC,GAAS,OACR,yBAIJ,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,OAAQ,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,CAAC,GAAS,QAAS,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,OACxI,oBAAA,CACA,gBAAA,CACA,WAAA,C9BGA,uBAAA,CACA,oBAAA,CACA,gB8BDF,CAAC,GAAS,QAAS,EAAC,GAAS,QAAQ,CAAC,GAAS,QAC7C,kBAAA,CACA,cCnCF,GAAG,CAAC,GAAS,QAAQ,CAAC,GAAS,QAC7B,yBAAA,CACA,cAGF,CAAC,GAAS,QAAS,QACjB,cAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,UAAW,MACrC,eAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,YAAa,MACvC,oBAAA,CACA,iBAAA,CACA,sBAAA,CACA,WAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,YAAY,CAAC,GAAS,UAAW,MAC3D,WAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,gBAKF,CAAC,GAAS,IACR,EAAC,GAAS,QAAS,QACjB,aAAA,CACA,iBAHJ,CAAC,GAAS,IAMR,EAAC,GAAS,QAAQ,CAAC,GAAS,YAAa,MACvC,aAAA,CACA,iBCtCJ,CAAC,GAAS,WACR,aAAA,CACA,uBAAA,CACA,UAAA,CACA,kBAAA,CACA,gBAAA,CACA,aAAA,CACA,kBAAA,CACA,cAAA,CACA,kBAAA,CACA,iCAAA,CACA,kBAXF,CAAC,GAAS,UAaR,EAAC,GAAS,OACR,cAAA,CACA,gBAAA,CACA,gCAAA,CACA,mCAAA,CACA,8BAlBJ,CAAC,GAAS,UAqBR,EAAC,GAAS,eACR,oBAAA,CACA,qBAAA,CACA,WAxBJ,CAAC,GAAS,UA2BR,EAAC,GAAS,KACR,kBAGF,CA/BD,GAAS,UA+BP,OAAQ,CA/BV,GAAS,UA+BE,OACR,mBADF,CA/BD,GAAS,UA+BP,MAGC,EAAC,GAAS,eAHH,CA/BV,GAAS,UA+BE,MAGR,EAAC,GAAS,eACR,WAJJ,CA/BD,GAAS,UA+BP,MAOC,EAAC,GAAS,MAPH,CA/BV,GAAS,UA+BE,MAOR,EAAC,GAAS,MAPZ,CA/BD,GAAS,UA+BP,MAOkB,EAAC,GAAS,KAPpB,CA/BV,GAAS,UA+BE,MAOS,EAAC,GAAS,KACzB,cAIJ,CA3CD,GAAS,UA2CP,CAAC,GAAS,UACT,mBADF,CA3CD,GAAS,UA2CP,CAAC,GAAS,SAGT,EAAC,GAAS,MAHZ,CA3CD,GAAS,UA2CP,CAAC,GAAS,SAGQ,EAAC,GAAS,KACzB,cAIJ,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,kBAC1B,mBADF,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,iBAG1B,EAAC,GAAS,MAHZ,CAnDD,GAAS,UAmDP,CAAC,GAAS,OAAO,CAAC,GAAS,iBAGT,EAAC,GAAS,KACzB,YAIJ,CA3DD,GAAS,UA2DP,CAAC,GAAS,OAAO,CAAC,GAAS,mBAC1B,EAAC,GAAS,KACR,mBAIJ,CAjED,GAAS,UAiEP,CAAC,GAAS,UAAW,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,OACxC,iBAEA,CApEH,GAAS,UAiEP,CAAC,GAAS,SAGR,OAAD,CApEH,GAAS,UAiEe,CAAC,GAAS,SAAS,MAGvC,OACC,mBAJJ,CAjED,GAAS,UAiEP,CAAC,GAAS,SAOT,EAAC,GAAS,MAPU,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,MAOxC,EAAC,GAAS,MAPZ,CAjED,GAAS,UAiEP,CAAC,GAAS,SAOQ,EAAC,GAAS,KAPP,CAjEvB,GAAS,UAiEe,CAAC,GAAS,SAAS,MAOvB,EAAC,GAAS,KACzB,WAIJ,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,QACrC,6BAAA,CACA,iBAFF,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAIrC,EAAC,GAAS,MAJZ,CA7ED,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAIpB,EAAC,GAAS,KACzB,cAGF,CArFH,GAAS,UA6EP,CAAC,GAAS,kBAAkB,CAAC,GAAS,OAQpC,OACC,mBAKN,CAAC,GAAS,gBACR,UAAA,CACA,eAAA,CACA,sBAAA,CACA,mBAJF,CAAC,GAAS,eAMR,GACE,WAIJ,CAAC,GAAS,oBACR,aAAA,CACA,sBAAA,CACA,kBAAA,CACA,gBAGF,CAAC,GAAS,UAAU,MAAO,GAAG,CAAC,GAAS,UAAU,CAAC,GAAS,SAAU,GAAG,CAAC,GAAS,UAAU,MAAO,GAClG,cAGF,GAAG,CAAC,GAAS,KAAM,EAAC,GAAS,eAAgB,CAAC,GAAS,cAAc,OACnE,QAAA,CACA,SAAA,CACA,UAAA,CACA,cAAA,CACA,eAAA,CACA,sBAAA,CACA,uCAAA,CACA,cAAA,CACA,YAGF,GAAG,CAAC,GAAS,KAAM,EAAC,GAAS,UAAW,GACtC,iBAGF,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAChC,CAAC,GAAS,oBAAsB,kBAIhC,CAAC,GAAS,KAAK,CAAC,GAAS,KACvB,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,WACvB,gBAAA,CACA,aAAA,CACA,0BAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAW,EAAC,GAAS,OAC5C,eAAA,CACA,cAAA,CACA,8BAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,CAAC,GAAS,SAAU,EAAC,GAAS,OAAQ,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,MAAO,EAAC,GAAS,OAAQ,CAAC,GAAS,IAAK,EAAC,GAAS,UAAU,MAAO,EAAC,GAAS,OACvL,6BAAA,CACA,2BAGF,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,eAAA,CACA,iBCpKJ,CAAC,GAAS,UACR,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,UAAA,CAAa,WAAA,CjCFb,UAAA,CAEA,wBAAA,CACA,MAAA,CiCCA,oBlCyO6C,0CkCtO/C,CAAC,GAAS,iBACR,eAAA,CACA,YAGF,CAAC,GAAS,KAAM,EAAC,GAAS,iBACxB,WAAA,CACA,wBCfF,CAAC,GAAS,MACR,iBAAA,CACA,MAAA,CAAS,KAAA,ClC+CT,OAAQ,2DAAR,CACA,sBAAA,CkC9CA,YAAA,CACA,mBAAA,CACA,eAAA,CACA,eAAA,CACA,gBAAA,CACA,wBAAA,CACA,wBAAA,CACA,YAAA,ClCqBA,+CAAA,CACA,4CAAA,CACA,uCAAA,CkCpBA,gBAAA,CACA,aAAA,CACA,kBAEA,CAlBD,GAAS,KAkBP,CAAC,GAAS,SACT,WAAA,CACA,UAAW,eAAe,eAA1B,CACA,0BAGF,CAxBD,GAAS,KAwBP,CAAC,GAAS,WACT,EAAC,GAAS,eADZ,CAxBD,GAAS,KAwBP,CAAC,GAAS,WACiB,EAAC,GAAS,OAClC,iBAAA,CACA,QAKN,CAAC,GAAS,KAAM,GACd,aAGF,CAAC,GAAS,eAAgB,GACxB,qBAIA,CADD,GAAS,KAAK,CAAC,GAAS,GACtB,CAAC,GAAS,SACT,SAAA,CACA,UAAW,WAAW,UAAtB,CACA,iDAIJ,CAAC,GAAS,gBAAkB,qBAC5B,CAAC,GAAS,gBAAkB,oBAC5B,CAAC,GAAS,gBAAkB,oBAC5B,CAAC,GAAS,gBAAkB,mBAI5B,CAAC,GAAS,IACR,EAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,eAAA,CACA,iBAGF,CAND,GAAS,IAMP,CAAC,GAAS,WAAY,EAAC,GAAS,OANnC,CAAC,GAAS,IAMiC,EAAC,GAAS,eACjD,UAAA,CACA,OC/DJ,CAAC,GAAS,QAAS,QACjB,eAAA,CACA,kBAAA,CACA,kBAGF,CAAC,GAAS,QAAS,EAAC,GAAS,OAC3B,iBAAA,CACA,eAAA,CACA,SAAA,CACA,QAKF,CAAC,GAAS,IAAK,EAAC,GAAS,QAAS,EAAC,GAAS,OAC1C,UAAA,CACA,SAGF,CAAC,GAAS,IAAK,EAAC,GAAS,QAAS,QAChC,kBAAA,CACA,kBCxBF,CAAC,GAAS,eAAgB,EAAC,GAAS,cAClC,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,WAAA,CACA,kBAAA,CACA,eAAA,CACA,SAGF,CAAC,GAAS,eAAgB,EAAC,GAAS,mBAClC,iBAGF,CAAC,CAAC,GAAS,UACT,cCdF,CAAC,GAAS,WACR,eAAA,CACA,yBCFF,CAAC,GAAS,QAER,wBAAA,CACA,eAAA,CACA,WAAA,CACA,WAAA,CACA,iBAAA,CACA,cAGF,CAAC,GAAS,OAAO,CAAC,GAAS,UACzB,UAAA,CACA,aAGF,CAAC,GAAS,eAER,wBAAA,CACA,kBAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,iBAAA,CACA,KAAA,CAAQ,MAAA,CACR,gBAAA,CACA,gBAGF,CAAC,GAAS,cAAc,OACtB,qBC7BF,CAAC,GAAS,QACR,kBCAA,CADD,GAAS,SACP,MAAO,EAAC,GAAS,MAChB,8BAFJ,CAAC,GAAS,SAKR,EAAC,GAAS,MACR,iCAAA,CACA,iBAAA,CACA,iBARJ,CAAC,GAAS,SAWR,EAAC,GAAS,KAAK,OACb,8BAZJ,CAAC,GAAS,SAeR,EAAC,GAAS,KAAK,OAfjB,CAAC,GAAS,SAee,EAAC,GAAS,KAAK,QACpC,8BAGF,CAnBD,GAAS,SAmBP,CAAC,GAAS,OAAO,MAAO,EAAC,GAAS,MACjC,4BAGF,CAvBD,GAAS,SAuBP,CAAC,GAAS,QACT,qBAIJ,CAAC,GAAS,SAAS,CAAC,GAAS,UAAW,EAAC,GAAS,MAChD,oBAKF,CAAC,GAAS,IAAK,EAAC,GAAS,UACvB,aAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,SAAU,QACjC,iBAAA,CACA,iBAGF,CAAC,GAAS,IAAK,EAAC,GAAS,SAAU,EAAC,GAAS,MAC3C,cC7CF,CAAC,GAAS,mBACR,cCDF,CAAC,GAAS,MACR,aAAA,CACA,gCAGF,CAAC,GAAS,MACV,CAAC,GAAS,KAAM,EAAG,GAAS,gBAC1B,gBAGF,CAAC,GAAS,K1CiCR,oBAAA,CACA,eAAA,CACA,OAAA,C0CjCA,wBAAA,CACA,sBAAA,CACA,eAAA,CACA,gBAAA,CACA,4CAAA,CACA,WAAA,CACA,eAGF,CAAC,GAAS,IAAI,OACZ,mBAGF,CAAC,GAAS,IAAI,CAAC,GAAS,QACtB,kBAAA,CACA,+BAAA,CACA,kBAAA,CACA,YAIF,CAAC,GAAS,IAAI,OACZ,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,MACvB,gBAAA,CACA,cAGF,CAAC,GAAS,IAAK,EAAC,GAAS,KACvB,uBC7CF,CAAC,GAAS,SACR,eAAA,CACA,wBAAA,C3C8BA,uBAAA,CACA,oBAAA,CACA,eAAA,C2C7BA,oBAAA,C3CiCA,2DAAA,CACA,mDAAA,C2ChCA,WAAA,CACA,WAAA,CACA,mBAAA,CACA,oBAAA,CACA,gBAAA,CACA,cAGF,CAAC,GAAS,QAAQ,OAAQ,CAAC,GAAS,QAAQ,CAAC,GAAS,OACpD,oBAAA,C3CgBA,uBAAA,CACA,oBAAA,CACA,gB2CdF,CAAC,GAAS,YAAa,EAAC,GAAS,SAC/B,WAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,WAC1B,WAAA,CACA,YAGF,CAAC,GAAS,QAAQ,CAAC,GAAS,UAC1B,cAKF,CAAC,GAAS,IAAK,EAAC,GAAS,SACvB,gBAAA,CACA,cCrCF,CAAC,GAAS,UACR,sBAAA,CACA,kBAEA,CAJD,GAAS,SAIN,MACA,wBAAA,CACA,oBAAA,CACA,sBAGF,CAVD,GAAS,SAUP,OACC,QAAQ,EAAR,CACA,WAAA,CACA,oBAAA,CACA,sBAGF,CAjBD,GAAS,SAiBP,CAAC,GAAS,U5ChBX,UAAA,CAEA,wBAAA,CACA,O4CgBE,CApBH,GAAS,SAiBP,CAAC,GAAS,SAGR,CAAC,GAAS,WACT,mBCrBN,CAAC,GAAS,cACR,iBAAA,CACA,gBAEA,CAJD,GAAS,aAIN,QACA,iBAAA,CACA,UAGF,CATD,GAAS,aASN,O7CRF,SAAA,CAEA,uBAAA,CACA,MAAA,C6COE,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,UChBJ,WACE,YAAa,SAAb,CACA,QAAQ,oBAAR,CACA,QAAQ,4BAA4B,OAAO,yBACrC,sBAAsB,OAAO,YAC7B,qBAAqB,OAAO,gBAC5B,6BAA6B,OAAO,MAH1C,CAIA,kBAAA,CACA,kBAGF,WACE,YAAa,eAAb,CACA,QAAQ,0BAAR,CACA,QAAQ,kCAAkC,OAAO,yBAC3C,4BAA4B,OAAO,YACnC,2BAA2B,OAAO,gBAClC,mCAAmC,OAAO,MAHhD,CAIA,kBAAA,CACA,kBAGF,CAAC,GAAS,KACR,YAAa,eAAb,CACA,iBAAA,CACA,kBAAA,CACA,mBAAA,CACA,cAAA,CACA,gBAAA,CACA,UAAA,CACA,uBAAA,CACA,kCAAA,CACA,iCAAA,CAEA,oBAAA,CACA,oCAAA,CACA,qBAAA,CACA,UAAA,CACA,WAAA,CACA,cAGF,CAAC,GAAS,UAAW,EAAC,GAAS,KAC7B,YAAa,sBAGf,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,KAAK,QAA4B,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,eAAe,QAAkB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,gBAAgB,QAAiB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,uBAAuB,QAAU,QAAS,QACpD,CAAC,GAAS,sBAAsB,QAAW,QAAS,QACpD,CAAC,GAAS,uBAAuB,QAAU,QAAS,QACpD,CAAC,GAAS,sBAAsB,QAAW,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,kBAAkB,QAAe,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,iBAAiB,QAAgB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,cAAc,QAAmB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,UAAU,QAAuB,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAsB,QAAS,QACpD,CAAC,GAAS,aAAa,QAAoB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,OAAO,QAA0B,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,QAAQ,QAAyB,QAAS,QACpD,CAAC,GAAS,SAAS,QAAwB,QAAS,QACpD,CAAC,GAAS,MAAM,QAA2B,QAAS,QACpD,CAAC,GAAS,YAAY,QAAqB,QAAS,QACpD,CAAC,GAAS,WAAW,QAAS,CAAC,GAAS,WAAW,QACjD,QAAS,QAGX,CAAC,GAAS,UAA2B,eACrC,CAAC,GAAS,YAA2B,kBACrC,CAAC,CAAC,GAAS,aAA0B,gBAAA,CAAmB,gBCjLxD,CAAC,GAAS,IAAK,EAAC,GAAS,WAAY,OACnC"}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment