lidonghui 7 rokov pred
rodič
commit
cb9789060d
63 zmenil súbory, kde vykonal 5940 pridanie a 27 odobranie
  1. 12 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 14 0
      .gitignore
  4. 10 0
      .postcssrc.js
  5. 72 27
      README.md
  6. 41 0
      build/build.js
  7. 54 0
      build/check-versions.js
  8. 102 0
      build/utils.js
  9. 22 0
      build/vue-loader.conf.js
  10. 82 0
      build/webpack.base.conf.js
  11. 91 0
      build/webpack.dev.conf.js
  12. 145 0
      build/webpack.prod.conf.js
  13. 7 0
      config/dev.env.js
  14. 77 0
      config/index.js
  15. 4 0
      config/prod.env.js
  16. 48 0
      eslintrc.js
  17. BIN
      favicon.ico
  18. 17 0
      index.html
  19. 67 0
      package.json
  20. 30 0
      src/App.vue
  21. 58 0
      src/api/axiosFun.js
  22. 32 0
      src/api/basisMG.js
  23. 32 0
      src/api/payMG.js
  24. 97 0
      src/api/userMG.js
  25. 101 0
      src/assets/icon/iconfont.css
  26. BIN
      src/assets/icon/iconfont.eot
  27. 96 0
      src/assets/icon/iconfont.svg
  28. BIN
      src/assets/icon/iconfont.ttf
  29. BIN
      src/assets/icon/iconfont.woff
  30. BIN
      src/assets/img/bg.png
  31. BIN
      src/assets/img/logo.png
  32. BIN
      src/assets/img/show.png
  33. BIN
      src/assets/img/sq.png
  34. 48 0
      src/components/Pagination.vue
  35. 26 0
      src/components/error.vue
  36. 84 0
      src/components/leftnav.vue
  37. 104 0
      src/components/navcon.vue
  38. 58 0
      src/components/template.vue
  39. 77 0
      src/main.js
  40. 170 0
      src/router/index.js
  41. 90 0
      src/utils/util.js
  42. 18 0
      src/views/druid/login.vue
  43. 265 0
      src/views/goods/Goods.vue
  44. 97 0
      src/views/index.vue
  45. 161 0
      src/views/login.vue
  46. 18 0
      src/views/machine/Machine.vue
  47. 18 0
      src/views/machine/MachineAisle.vue
  48. 312 0
      src/views/machine/MachineConfig.vue
  49. 378 0
      src/views/pay/Config.vue
  50. 363 0
      src/views/pay/Order.vue
  51. 264 0
      src/views/system/Dept.vue
  52. 260 0
      src/views/system/Module.vue
  53. 348 0
      src/views/system/Permission.vue
  54. 423 0
      src/views/system/Role.vue
  55. 282 0
      src/views/system/Variable.vue
  56. 710 0
      src/views/system/user.vue
  57. 22 0
      src/vuex/store.js
  58. 0 0
      static/.gitkeep
  59. BIN
      static/1.png
  60. BIN
      static/2.png
  61. BIN
      static/3.png
  62. BIN
      static/4.png
  63. 24 0
      页面路径.txt

+ 12 - 0
.babelrc

@@ -0,0 +1,12 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"]
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+.DS_Store
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 10 - 0
.postcssrc.js

@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 72 - 27
README.md

@@ -1,39 +1,84 @@
-# vue-elementUI后台管理系统
+vue搭建后台管理界面模版(PC端)
+------------------------
 
-#### 项目介绍
-{**以下是码云平台说明,您可以替换为您的项目简介**
-码云是开源中国推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
-无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+页面模板还在增加中...
 
-#### 软件架构
-软件架构说明
+![登录](./static/1.png "登录")  
 
+目录结构
+------------------------
 
-#### 安装教程
+```bash
+├── /build/          # 项目构建(webpack)相关配置
+├── /config/         # 项目开发环境配置
+├── /src/            # 源码目录
+│ ├── /assets/       # 组件静态资源(图片)
+│ ├── /components/   # 公共组件
+| ├── /api/          # 请求接口
+│ ├── /router/       # 路由配置
+│ ├── /vuex/         # vuex状态管理
+│ ├── /views/        # 路由组件(页面维度)
+│ ├── /config/       # 接口配置文件(请求地址)
+│ ├── App.vue        # 组件入口
+│ └── main.js        # 程序入口
+├── /static/         # 非组件静态资源
+├── .babelrc         # ES6语法编译配置
+├── .editorconfig    # 定义代码格式
+├── .eslintignore    # ES6规范忽略文件
+├── .eslintrc.js     # ES6语法规范配置
+├── .gitignore       # git忽略文件
+├── index.html       # 页面入口
+├── package.json     # 项目依赖
+└── README.md        # 项目文档
+```
 
-1. xxxx
-2. xxxx
-3. xxxx
+部分页面组件演示
+------------------------
 
-#### 使用说明
+表格组件
+![主页](./static/2.png "主页")
 
-1. xxxx
-2. xxxx
-3. xxxx
+form表单组件
+![table页面](./static/3.png "table页面")
 
-#### 参与贡献
+轮播图
+![增加编辑](./static/4.png "增加编辑")
+
+
+
+运行项目
+------------------------
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+
+# run unit tests
+npm run unit
+
+# run e2e tests
+npm run e2e
+
+# run all tests
+npm test
+
+
+```
+
+项目源码地址:
+------------------------
+
+码云地址:https://gitee.com/ldhblog/vue-element.git
 
-1. Fork 本项目
-2. 新建 Feat_xxx 分支
-3. 提交代码
-4. 新建 Pull Request
 
 
-#### 码云特技
 
-1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
-3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
-4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
-5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/)
-6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 41 - 0
build/build.js

@@ -0,0 +1,41 @@
+'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'
+    ))
+  })
+})

+ 54 - 0
build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

+ 102 - 0
build/utils.js

@@ -0,0 +1,102 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function(_path) {
+    const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
+        config.build.assetsSubDirectory :
+        config.dev.assetsSubDirectory
+
+    return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function(options) {
+    options = options || {}
+
+    const cssLoader = {
+        loader: 'css-loader',
+        options: {
+            sourceMap: options.sourceMap
+        }
+    }
+
+    const postcssLoader = {
+        loader: 'postcss-loader',
+        options: {
+            sourceMap: options.sourceMap
+        }
+    }
+
+    // generate loader string to be used with extract text plugin
+    function generateLoaders(loader, loaderOptions) {
+        const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+        if (loader) {
+            loaders.push({
+                loader: loader + '-loader',
+                options: Object.assign({}, loaderOptions, {
+                    sourceMap: options.sourceMap
+                })
+            })
+        }
+
+        // Extract CSS when that option is specified
+        // (which is the case during production build)
+        if (options.extract) {
+            return ExtractTextPlugin.extract({
+                use: loaders,
+                publicPath: '../../',
+                fallback: 'vue-style-loader'
+            })
+        } else {
+            return ['vue-style-loader'].concat(loaders)
+        }
+    }
+
+    // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+    return {
+        css: generateLoaders(),
+        postcss: generateLoaders(),
+        less: generateLoaders('less'),
+        sass: generateLoaders('sass', { indentedSyntax: true }),
+        scss: generateLoaders('sass'),
+        stylus: generateLoaders('stylus'),
+        styl: generateLoaders('stylus')
+    }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function(options) {
+    const output = []
+    const loaders = exports.cssLoaders(options)
+
+    for (const extension in loaders) {
+        const loader = loaders[extension]
+        output.push({
+            test: new RegExp('\\.' + extension + '$'),
+            use: loader
+        })
+    }
+
+    return output
+}
+
+exports.createNotifierCallback = () => {
+    const notifier = require('node-notifier')
+
+    return (severity, errors) => {
+        if (severity !== 'error') return
+
+        const error = errors[0]
+        const filename = error.file && error.file.split('!').pop()
+
+        notifier.notify({
+            title: packageConfig.name,
+            message: severity + ': ' + error.name,
+            subtitle: filename || '',
+            icon: path.join(__dirname, 'logo.png')
+        })
+    }
+}

+ 22 - 0
build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 82 - 0
build/webpack.base.conf.js

@@ -0,0 +1,82 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  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'
+  }
+}

+ 91 - 0
build/webpack.dev.conf.js

@@ -0,0 +1,91 @@
+'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,
+            favicon: './favicon.ico'
+        }),
+        // 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)
+        }
+    })
+})

+ 145 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,145 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 7 - 0
config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})

+ 77 - 0
config/index.js

@@ -0,0 +1,77 @@
+'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: {
+            '/api': {
+                target: 'http://180.166.211.217:8099', // 你请求的第三方接口
+                changeOrigin: true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
+                pathRewrite: { // 路径重写,
+                    '^/api': '/api' // 替换target中的请求地址,也就是说以后你在请求http://api.jisuapi.com/XXXXX这个地址的时候直接写成/api即可。
+                }
+            }
+        },
+
+        // Various Dev Server settings
+        host: 'localhost', // can be overwritten by process.env.HOST
+        port: 9999, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+        autoOpenBrowser: true,
+        errorOverlay: true,
+        notifyOnErrors: true,
+        poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+
+        /**
+         * Source Maps
+         */
+
+        // https://webpack.js.org/configuration/devtool/#development
+        devtool: 'cheap-module-eval-source-map',
+
+        // If you have problems debugging vue-files in devtools,
+        // set this to false - it *may* help
+        // https://vue-loader.vuejs.org/en/options.html#cachebusting
+        cacheBusting: true,
+
+        cssSourceMap: true
+    },
+
+    build: {
+        // Template for index.html
+        index: path.resolve(__dirname, '../dist/index.html'),
+
+        // Paths
+        assetsRoot: path.resolve(__dirname, '../dist'),
+        assetsSubDirectory: 'static',
+        assetsPublicPath: './',
+
+        /**
+         * Source Maps
+         */
+
+        productionSourceMap: true,
+        // https://webpack.js.org/configuration/devtool/#production
+        devtool: '#source-map',
+
+        // Gzip off by default as many popular static hosts such as
+        // Surge or Netlify already gzip all static assets for you.
+        // Before setting to `true`, make sure to:
+        // npm install --save-dev compression-webpack-plugin
+        productionGzip: false,
+        productionGzipExtensions: ['js', 'css'],
+
+        // Run the build command with an extra argument to
+        // View the bundle analyzer report after build finishes:
+        // `npm run build --report`
+        // Set to `true` or `false` to always turn it on or off
+        bundleAnalyzerReport: process.env.npm_config_report
+    }
+}

+ 4 - 0
config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"'
+}

+ 48 - 0
eslintrc.js

@@ -0,0 +1,48 @@
+{
+    "editor.tabSize": 2,
+    "files.associations": {
+        "*.vue": "vue"
+    },
+    "eslint.autoFixOnSave": true,
+    "eslint.options": {
+        "extensions": [
+            ".js",
+            ".vue"
+        ]
+    },
+    "eslint.validate": [
+        "javascript",
+        "javascriptreact",
+        "vue",
+        "vue-html"
+    ],
+    "search.exclude": {
+        "**/node_modules": true,
+        "**/bower_components": true,
+        "**/dist": true
+    },
+    "emmet.syntaxProfiles": {
+        "javascript": "jsx",
+        "vue": "html",
+        "vue-html": "html"
+    },
+    "git.confirmSync": false,
+    "window.zoomLevel": 0,
+    "vsicons.projectDetection.autoReload": true,
+    "typescript.check.tscVersion": false,
+    "editor.renderWhitespace": "boundary",
+    "editor.cursorBlinking": "smooth",
+    "workbench.colorTheme": "Solarized Light",
+    "workbench.iconTheme": "vscode-great-icons",
+    "editor.minimap.enabled": true,
+    "editor.minimap.renderCharacters": false,
+    "tslint.autoFixOnSave": true,
+    "editor.fontFamily": "'Droid Sans Mono', 'Courier New', monospace, 'Droid Sans Fallback'",
+    "beautify.tabSize": 2,
+    "window.title": "${dirty}${activeEditorMedium}${separator}${rootName}",
+    "typescript.extension.sortImports.maxNamedImportsInSingleLine": 5,
+    "typescript.extension.sortImports.omitSemicolon": true,
+    "editor.codeLens": true,
+    "editor.snippetSuggestions": "top",
+    "react-native-storybooks.port": 6006
+}

BIN
favicon.ico


+ 17 - 0
index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <!-- 页面增加icon图标 -->
+    <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico" rel="external nofollow" />
+    <title>后端管理平台</title>
+</head>
+
+<body>
+    <!-- built files will be auto injected -->
+    <div id="app"></div>
+</body>
+
+</html>

+ 67 - 0
package.json

@@ -0,0 +1,67 @@
+{
+  "name": "vue-ele-project",
+  "version": "1.0.0",
+  "description": "vue-ele-project",
+  "author": "lidonghui",
+  "private": true,
+  "scripts": {
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "element-ui": "^2.3.2",
+    "http-proxy-middleware": "^0.18.0",
+    "js-md5": "^0.7.3",
+    "vue": "^2.5.2",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.0.1"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "axios": "^0.18.0",
+    "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",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^13.3.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 30 - 0
src/App.vue

@@ -0,0 +1,30 @@
+<template>
+  <div id="app">
+    <router-view/>
+  </div>
+</template>
+
+<script>
+export default {
+    name: "App"
+};
+</script>
+
+<style> 
+html,
+body {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    padding: 0px;
+    margin: 0px;
+}
+#app {
+    font-family: "Avenir", Helvetica, Arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    color: #2c3e50;
+    widows: 100%;
+    height: 100%;
+}
+</style>

+ 58 - 0
src/api/axiosFun.js

@@ -0,0 +1,58 @@
+import axios from 'axios';
+
+// 登录请求方法
+const loginreq = (method, url, params) => {
+    return axios({
+        method: method,
+        url: url,
+        headers: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+        },
+        data: params,
+        traditional: true,
+        transformRequest: [
+            function(data) {
+                let ret = ''
+                for (let it in data) {
+                    ret +=
+                        encodeURIComponent(it) +
+                        '=' +
+                        encodeURIComponent(data[it]) +
+                        '&'
+                }
+                return ret
+            }
+        ]
+    }).then(res => res.data);
+};
+// 通用公用方法
+const req = (method, url, params) => {
+    return axios({
+        method: method,
+        url: url,
+        headers: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            token: localStorage.getItem('logintoken')
+        },
+        data: params,
+        traditional: true,
+        transformRequest: [
+            function(data) {
+                let ret = ''
+                for (let it in data) {
+                    ret +=
+                        encodeURIComponent(it) +
+                        '=' +
+                        encodeURIComponent(data[it]) +
+                        '&'
+                }
+                return ret
+            }
+        ]
+    }).then(res => res.data);
+};
+
+export {
+    loginreq,
+    req
+}

+ 32 - 0
src/api/basisMG.js

@@ -0,0 +1,32 @@
+import axios from 'axios';
+import { req } from './axiosFun';
+
+/**
+ * 商品管理
+ **/
+// 商品管理-获取商品管理列表
+export const GoodsList = (params) => { return req("post", "/api/Goods/list", params) };
+// 商品管理-保存商品管理
+export const GoodsSave = (params) => { return req("post", "/api/Goods/save", params) };
+// 商品管理-删除商品管理
+export const GoodsDelete = (params) => { return axios.delete("/api/Goods/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 机器信息管理 
+ **/
+// 机器信息管理-获取机器信息管理列表
+export const MachineList = (params) => { return req("post", "/api/Machine/list", params) };
+// 机器信息管理-保存机器信息管理
+export const MachineSave = (params) => { return req("post", "/api/Machine/save", params) };
+// 机器信息管理-删除机器信息管理
+export const MachineDelete = (params) => { return axios.delete("/api/Machine/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 货道信息管理
+ **/
+// 货道信息管理-获取获取货道信息管理列表
+export const MachineAisleList = (params) => { return req("post", "/api/MachineAisle/list", params) };
+// 货道信息管理-删除货道信息管理
+export const MachineAisleDelete = (params) => { return axios.delete("/api/MachineAisle/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 货道信息管理-保存货道信息管理
+export const MachineAisleRsave = (params) => { return req("post", "/api/MachineAisle/save", params) };

+ 32 - 0
src/api/payMG.js

@@ -0,0 +1,32 @@
+import axios from 'axios';
+import { req } from './axiosFun';
+
+/**
+ * 支付配置信息
+ **/
+// 支付配置信息-获取支付配置信息列表
+export const MachineConfigList = (params) => { return req("post", "/api/MachineConfig/list", params) };
+// 支付配置信息-保存支付配置信息
+export const MachineConfigSave = (params) => { return req("post", "/api/MachineConfig/save", params) };
+// 支付配置信息-删除支付配置信息
+export const MachineConfigDelete = (params) => { return axios.delete("/api/MachineConfig/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 支付配置 
+ **/
+// 支付配置-获取支付配置列表
+export const ConfigList = (params) => { return req("post", "/api/Config/list", params) };
+// 支付配置-保存支付配置
+export const ConfigSave = (params) => { return req("post", "/api/Config/save", params) };
+// 支付配置-删除支付配置
+export const ConfigDelete = (params) => { return axios.delete("/api/Config/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 订单管理-交易订单 
+ **/
+// 交易订单-获取交易订单列表
+export const OrderList = (params) => { return req("post", "/api/Order/list", params) };
+// 交易订单-s删除交易订单
+export const OrderDelete = (params) => { return axios.delete("/api/Order/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 交易订单-交易订单退款
+export const OrderRefund = (params) => { return req("post", "/api/Order/refund", params) };

+ 97 - 0
src/api/userMG.js

@@ -0,0 +1,97 @@
+import axios from 'axios';
+import { loginreq, req } from './axiosFun';
+
+// 登录接口 
+export const login = (params) => { return loginreq("post", "/api/login", params) };
+// 获取用户菜单
+export const menu = (params) => { return axios.get("/api/menu?&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 退出接口
+export const loginout = () => { return axios.delete("/api/login?&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 用户管理 
+ **/
+// 用户管理-获取用户列表
+export const userList = (params) => { return req("post", "/api/User/list", params) };
+// 用户管理-保存(添加编辑)
+export const userSave = (params) => { return req("post", "/api/User/save", params) };
+// 用户管理-删除用户
+export const userDelete = (params) => { return axios.delete("/api/User/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 用户管理-重置密码
+export const userPwd = (params) => { return req("post", "/api/User/pwd", params) };
+// 用户管理-修改状态
+export const userLock = (params) => { return axios.get("/api/User/lock?userId=" + params.userId + "&lock=" + params.lock + "&token=" + localStorage.getItem('logintoken')) };
+// 用户管理-数据权限
+export const UserDeptTree = (params) => { return axios.get("/api/UserDept/tree/" + params + "?token=" + localStorage.getItem('logintoken')) };
+// 用户管理-数据权限保存
+export const UserDeptSave = (params) => { return req("post", "/api/UserDept/save", params) };
+// 用户管理-获取部门设置
+export const UserDeptdeptTree = (params) => { return axios.get("/api/UserDept/deptTree/" + params + "?token=" + localStorage.getItem('logintoken')) };
+// 用户管理-保存部门设置
+export const UserChangeDept = (params) => { return req("post", "/api/User/change/dept", params) };
+// 用户管理-用户下线
+export const userExpireToken = (params) => { return req("get", "/api/User/expireToken/" + params, {}) };
+// 用户管理-刷新缓存
+export const userFlashCache = (params) => { return req("get", "/api/User/flashCache/" + params, {}) };
+
+/**
+ * 菜单管理
+ **/
+// 菜单管理-获取菜单Module/list
+export const ModuleList = () => { return req("post", "/api/Module/list") };
+// 菜单管理-根据菜单获取数据
+export const ModuleGet = (params) => { return axios.get("/api/Module/get/" + params + "?token=" + localStorage.getItem('logintoken')) };
+// 菜单管理-获取父级菜单Module/nodes
+export const ModuleNodes = (params) => { return req("post", "/api/Module/nodes", params) };
+// 菜单管理-修改菜单
+export const ModuleSave = (params) => { return req("post", "/api/Module/save", params) };
+// 菜单管理-删除菜单
+export const ModuleDelete = (params) => { return axios.delete("/api/Module/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 角色管理 
+ **/
+// 角色管理-获取角色列表
+export const roleList = (params) => { return req("post", "/api/Role/list", params) };
+// 角色管理-保存(添加编辑)
+export const roleSave = (params) => { return req("post", "/api/Role/save", params) };
+// 角色管理-删除角色
+export const roleDelete = (params) => { return axios.delete("/api/Role/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 角色管理-菜单权限(获取)
+export const RoleRightTree = (params) => { return axios.get("/api/RoleRight/tree/" + params + "?token=" + localStorage.getItem('logintoken')) };
+// 角色管理-菜单权限(保存)
+export const RoleRightSave = (params) => { return req("post", "/api/RoleRight/save", params) };
+
+/**
+ * 公司管理 
+ **/
+// 公司管理-获取公司列表
+export const deptList = (params) => { return req("post", "/api/Dept/list", params) };
+// 公司管理-保存(添加编辑)
+export const deptSave = (params) => { return req("post", "/api/Dept/save", params) };
+// 公司管理-删除公司
+export const deptDelete = (params) => { return axios.get("/api/Dept/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 系统环境变量 
+ **/
+// 系统环境变量-获取系统环境变量列表
+export const variableList = (params) => { return req("post", "/api/Variable/list", params) };
+// 系统环境变量-保存(添加编辑)
+export const variableSave = (params) => { return req("post", "/api/Variable/save", params) };
+// 系统环境变量-删除系统环境变量
+export const variableDelete = (params) => { return axios.delete("/api/Variable/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+
+/**
+ * 权限管理 
+ **/
+// 权限管理-获取权限列表
+export const permissionList = (params) => { return req("post", "/api/Permission/list", params) };
+// 权限管理-保存权限
+export const ermissionSave = (params) => { return req("post", "/api/Permission/save", params) };
+// 权限管理-删除权限
+export const ermissionDelete = (params) => { return axios.delete("/api/Permission/delete?ids=" + params + "&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 权限管理-获取权限
+export const roleDropDown = () => { return axios.get("/api/Role/dropDown/all?&token=" + localStorage.getItem('logintoken')).then(res => res.data) };
+// 权限管理-配置权限
+export const RolePermission = (params) => { return req("post", "/api/RolePermission/save", params) };

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 101 - 0
src/assets/icon/iconfont.css


BIN
src/assets/icon/iconfont.eot


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 96 - 0
src/assets/icon/iconfont.svg


BIN
src/assets/icon/iconfont.ttf


BIN
src/assets/icon/iconfont.woff


BIN
src/assets/img/bg.png


BIN
src/assets/img/logo.png


BIN
src/assets/img/show.png


BIN
src/assets/img/sq.png


+ 48 - 0
src/components/Pagination.vue

@@ -0,0 +1,48 @@
+/**
+* 分页组件
+*/ 
+<template>
+  <el-pagination class="page-box" @size-change="handleSizeChange" @current-change="handleCurrentChange" background :current-page="childMsg.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="childMsg.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="childMsg.total">
+  </el-pagination>
+</template>
+<script>
+export default {
+  name: 'Pagination',
+  props: ['childMsg'],
+  data() {
+    return {
+      pageparm: {
+        currentPage: this.childMsg.currentPage,
+        pageSize: this.childMsg.pageSize
+      }
+    }
+  },
+  created() {},
+  methods: {
+    handleSizeChange(val) {
+      /**
+       * 子传父
+       * 参数1 父元素方法
+       * 参数2 数据
+       */
+      this.pageparm.pageSize = val
+      this.$emit('callFather', this.pageparm)
+    },
+    handleCurrentChange(val) {
+      /**
+       * 子传父
+       * 参数1 父元素方法
+       * 参数2 数据
+       */
+      this.pageparm.currentPage = val
+      this.$emit('callFather', this.pageparm)
+    }
+  }
+}
+</script>
+
+<style>
+.page-box {
+  margin: 10px auto;
+}
+</style>

+ 26 - 0
src/components/error.vue

@@ -0,0 +1,26 @@
+/**
+* 404
+*/ 
+<template>
+  <div class="page-404">
+    <h1>404!</h1>
+    <h2>Sorry, page not found</h2>
+  </div>
+</template>
+
+<style scoped>
+.page-404 {
+  text-align: center;
+}
+.page-404 h1 {
+  font-size: 98px;
+  font-weight: 700;
+  line-height: 150px;
+  text-shadow: rgba(61, 61, 61, 0.3) 1px 1px, rgba(61, 61, 61, 0.2) 2px 2px,
+    rgba(61, 61, 61, 0.3) 3px 3px;
+}
+.page-404 h2 {
+  line-height: 30px;
+  font-size: 30px;
+}
+</style>

+ 84 - 0
src/components/leftnav.vue

@@ -0,0 +1,84 @@
+/**
+* 左边菜单
+*/ 
+<template>
+  <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b">
+    <div class="logobox">
+      <img class="logoimg" src="../assets/img/logo.png" alt="">
+    </div>
+    <el-submenu v-for="menu in allmenu" :key="menu.menuid" :index="menu.menuname">
+      <template slot="title">
+        <i class="el-icon-setting"></i>
+        <span>{{menu.menuname}}</span>
+      </template>
+      <el-menu-item-group>
+        <el-menu-item v-for="chmenu in menu.menus" :index="'/'+chmenu.url" :key="chmenu.menuid">
+          <i class="iconfont" :class="chmenu.icon"></i>
+          <span>{{chmenu.menuname}}</span>
+        </el-menu-item>
+      </el-menu-item-group>
+    </el-submenu>
+  </el-menu>
+</template>
+<script>
+import { menu } from '../api/userMG'
+export default {
+  name: 'leftnav',
+  data() {
+    return {
+      collapsed: false,
+      allmenu: []
+    }
+  },
+  // 创建完毕状态(里面是操作)
+  created() {
+    // 获取图形验证码
+    menu(localStorage.getItem('logintoken'))
+      .then(res => {
+        if (res.success) {
+          this.allmenu = res.data
+        } else {
+          this.$message.error(res.msg)
+          return false
+        }
+      })
+      .catch(err => {
+        this.$message.error('菜单加载失败,请稍后再试!')
+      })
+    // 监听
+    this.$root.Bus.$on('toggle', value => {
+      this.collapsed = !value
+    })
+  }
+}
+</script>
+<style>
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  width: 240px;
+  min-height: 400px;
+}
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  border: none;
+  text-align: left;
+}
+.el-menu-item-group__title {
+  padding: 0px;
+}
+.el-menu-bg {
+  background-color: #1f2d3d !important;
+}
+.el-menu {
+  border: none;
+}
+.logobox {
+  height: 40px;
+  line-height: 40px;
+  color: #9d9d9d;
+  font-size: 20px;
+  text-align: center;
+  padding: 20px 0px;
+}
+.logoimg {
+  height: 40px;
+}
+</style>

+ 104 - 0
src/components/navcon.vue

@@ -0,0 +1,104 @@
+/**
+* 头部菜单
+*/ 
+<template>
+  <el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
+    <el-button class="buttonimg">
+      <img class="showimg" :src="collapsed?imgsq:imgshow" @click="toggle(collapsed)">
+    </el-button>
+    <el-submenu index="2" class="submenu">
+      <template slot="title">{{user.userRealName}}</template>
+      <el-menu-item index="2-1">设置</el-menu-item>
+      <el-menu-item @click="content()" index="2-2">个人中心</el-menu-item>
+      <el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
+    </el-submenu>
+  </el-menu>
+</template>
+<script>
+import { loginout } from '../api/userMG'
+export default {
+  name: 'navcon',
+  data() {
+    return {
+      collapsed: true,
+      imgshow: require('../assets/img/show.png'),
+      imgsq: require('../assets/img/sq.png'),
+      user: {}
+    }
+  },
+  // 创建完毕状态(里面是操作)
+  created() {
+    this.user = JSON.parse(localStorage.getItem('userdata'))
+  },
+  methods: {
+    // 退出登录
+    exit() {
+      this.$confirm('退出登录, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          loginout()
+            .then(res => {
+              if (res.success) {
+                //如果请求成功就让他2秒跳转路由
+                setTimeout(() => {
+                  this.$store.commit('logout', 'false')
+                  this.$router.push({ path: '/login' })
+                  this.$message({
+                    type: 'success',
+                    message: '已退出登录!'
+                  })
+                }, 1000)
+              } else {
+                this.$message.error(res.msg)
+                this.logining = false
+                return false
+              }
+            })
+            .catch(err => {
+              // 获取图形验证码
+              this.getcode()
+              this.logining = false
+              this.$message.error('退出失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消'
+          })
+        })
+    },
+    // 切换显示
+    toggle(showtype) {
+      this.collapsed = !showtype
+      this.$root.Bus.$emit('toggle', this.collapsed)
+    }
+  }
+}
+</script>
+<style scoped>
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  border: none;
+}
+.submenu {
+  float: right;
+}
+.buttonimg{
+  height:60px;
+  background-color: transparent;
+  border:none;
+}
+.showimg {
+  width: 26px;
+  height: 26px;
+  position: absolute;
+  top: 17px;
+  left: 17px;
+}
+.showimg:active {
+  border: none;
+}
+</style>

+ 58 - 0
src/components/template.vue

@@ -0,0 +1,58 @@
+/**
+* 模版
+**/ 
+
+<template>
+    <div>
+        
+    </div>
+</template>
+
+<script>
+// 导入组件
+import headerComponent from "./head.vue";
+// 导出模块
+export default {
+  // 模块名字
+  name: "template",
+  // 模块数据
+  data() {
+    //数据  
+    return {};
+  },
+  // 注册组件
+  components: {
+    headerComponent
+  },
+  // 监听指定值,只有指定值变化,才会触发
+  watch: {},
+  // 里面的函数只有调用才会执行(实时计算)里面是定义的方法
+  methods: {
+    addFun() {},
+    submitFun() {}
+  },
+  // 创建前状态(里面是操作)
+  beforeCreate() {},
+  // 创建完毕状态(里面是操作)
+  created() {},
+  // 挂载前状态(里面是操作)
+  beforeMount() {},
+  // 挂载结束状态(里面是操作)
+  mounted() {},
+  // 更新前状态(里面是操作)
+  beforeUpdate() {},
+  // 更新完成状态(里面是操作)
+  updated() {},
+  // 销毁前状态(里面是操作)
+  beforeDestroy() {},
+  // 销毁完成状态(里面是操作)
+  destroyed() {}
+};
+</script>
+// scoped 样式只在本组件使用
+<style scoped>
+/**
+ * 导入css样式组件
+ * @import "../assets/css/components/index.css";
+ */
+</style>

+ 77 - 0
src/main.js

@@ -0,0 +1,77 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import Vue from 'vue';
+// 引入element UI
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import App from './App';
+// 引入路由
+import router from './router';
+// 引入状态管理
+import store from './vuex/store';
+// 引入icon
+import './assets/icon/iconfont.css'
+// 
+import axios from 'axios';
+Vue.prototype.$axios = axios;
+
+Vue.config.productionTip = false;
+
+// 使用element UI
+Vue.use(ElementUI);
+// 过滤器
+import * as custom from './utils/util'
+
+Object.keys(custom).forEach(key => {
+    Vue.filter(key, custom[key])
+})
+
+// 路由拦截器
+router.beforeEach((to, from, next) => {
+    if (to.matched.length != 0) {
+        if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
+            if (Boolean(localStorage.getItem("userInfo"))) { // 通过vuex state获取当前的user是否存在
+                next();
+            } else {
+                next({
+                    path: '/login',
+                    query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
+                })
+            }
+        } else {
+            if (Boolean(localStorage.getItem("userInfo"))) { // 判断是否登录
+                if (to.path != "/" && to.path != "/login") { //判断是否要跳到登录界面
+                    next();
+                } else {
+                    /**
+                     * 防刷新,如果登录,修改路由跳转到登录页面,修改路由为登录后的首页 
+                     */
+                    next({
+                        path: '/goods/Goods'
+                    })
+                }
+            } else {
+                next();
+            }
+        }
+    } else {
+        next({
+            path: '/login',
+            query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
+        })
+    }
+})
+
+/* eslint-disable no-new */
+new Vue({
+    el: '#app',
+    router,
+    store, //使用store vuex状态管理
+    components: { App },
+    template: '<App/>',
+    data: {
+        // 空的实例放到根组件下,所有的子组件都能调用
+        Bus: new Vue()
+    }
+
+})

+ 170 - 0
src/router/index.js

@@ -0,0 +1,170 @@
+// 导入组件
+import Vue from 'vue';
+import Router from 'vue-router';
+// 登录
+import login from '@/views/login';
+// 首页
+import index from '@/views/index';
+/**
+ * 基础菜单
+ */
+// 商品管理
+import Goods from '@/views/goods/Goods';
+// 机器信息管理
+import Machine from '@/views/machine/Machine';
+// 货道信息管理
+import MachineAisle from '@/views/machine/MachineAisle';
+/**
+ * 订单管理
+ */
+// 交易订单
+import Order from '@/views/pay/Order';
+/**
+ * 系统管理
+ */
+// 用户管理
+import user from '@/views/system/user';
+// 菜单管理
+import Module from '@/views/system/Module';
+// 角色管理
+import Role from '@/views/system/Role';
+// 公司管理
+import Dept from '@/views/system/Dept';
+// 系统环境变量
+import Variable from '@/views/system/Variable';
+// 权限管理
+import Permission from '@/views/system/Permission';
+/**
+ * 支付管理
+ */
+// 支付配置信息
+import MachineConfig from '@/views/machine/MachineConfig';
+// 支付配置
+import Config from '@/views/pay/Config';
+/**
+ * 数据监控
+ */
+// 监控查询
+import druidLogin from '@/views/druid/login';
+
+
+// 启用路由
+Vue.use(Router);
+
+// 导出路由 
+export default new Router({
+    routes: [{
+        path: '/',
+        name: '',
+        component: login,
+        hidden: true,
+        meta: {
+            requireAuth: false
+        }
+    }, {
+        path: '/login',
+        name: '登录',
+        component: login,
+        hidden: true,
+        meta: {
+            requireAuth: false
+        }
+    }, {
+        path: '/index',
+        name: '首页',
+        component: index,
+        iconCls: 'el-icon-tickets',
+        children: [{
+            path: '/goods/Goods',
+            name: '商品管理',
+            component: Goods,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/machine/Machine',
+            name: '机器信息管理',
+            component: Machine,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/machine/MachineAisle',
+            name: '货道信息管理',
+            component: MachineAisle,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/pay/Order',
+            name: '交易订单',
+            component: Order,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/user',
+            name: '用户管理',
+            component: user,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/Module',
+            name: '菜单管理',
+            component: Module,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/Role',
+            name: '角色管理',
+            component: Role,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/Dept',
+            name: '公司管理',
+            component: Dept,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/Variable',
+            name: '系统环境变量',
+            component: Variable,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/system/Permission',
+            name: '权限管理',
+            component: Permission,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/machine/MachineConfig',
+            name: '支付配置信息',
+            component: MachineConfig,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/pay/Config',
+            name: '支付配置',
+            component: Config,
+            meta: {
+                requireAuth: true
+            }
+        }, {
+            path: '/druid/login',
+            name: '监控查询',
+            component: druidLogin,
+            meta: {
+                requireAuth: true
+            }
+        }]
+    }]
+})

+ 90 - 0
src/utils/util.js

@@ -0,0 +1,90 @@
+/**
+ * 时间戳
+ * @param {*} timestamp  时间戳
+ */
+const timestampToTime = (timestamp) => {
+    let date = new Date(timestamp) //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+    let Y = date.getFullYear() + '-'
+    let M =
+        (date.getMonth() + 1 < 10 ?
+            '0' + (date.getMonth() + 1) :
+            date.getMonth() + 1) + '-'
+    let D =
+        (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '
+    let h =
+        (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
+    let m =
+        (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) +
+        ':'
+    let s =
+        date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+    return Y + M + D + h + m + s
+};
+/**
+ * 存储localStorage
+ */
+const setStore = (name, content) => {
+    if (!name) return;
+    if (typeof content !== 'string') {
+        content = JSON.stringify(content);
+    }
+    window.localStorage.setItem(name, content);
+}
+
+/**
+ * 获取localStorage
+ */
+const getStore = name => {
+    if (!name) return;
+    return window.localStorage.getItem(name);
+}
+
+/**
+ * 删除localStorage
+ */
+const removeStore = name => {
+    if (!name) return;
+    window.localStorage.removeItem(name);
+}
+
+/**
+ * 设置cookie
+ **/
+function setCookie(name, value, day) {
+    let date = new Date();
+    date.setDate(date.getDate() + day);
+    document.cookie = name + '=' + value + ';expires=' + date;
+};
+
+/**
+ * 获取cookie
+ **/
+function getCookie(name) {
+    let reg = RegExp(name + '=([^;]+)');
+    let arr = document.cookie.match(reg);
+    if (arr) {
+        return arr[1];
+    } else {
+        return '';
+    }
+};
+
+/**
+ * 删除cookie
+ **/
+function delCookie(name) {
+    setCookie(name, null, -1);
+};
+
+/**
+ * 导出 
+ **/
+export {
+    timestampToTime,
+    setStore,
+    getStore,
+    removeStore,
+    setCookie,
+    getCookie,
+    delCookie
+}

+ 18 - 0
src/views/druid/login.vue

@@ -0,0 +1,18 @@
+/**
+ * 数据监控 监控查询
+ */
+<template>
+  <div>数据监控 监控查询</div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>
+
+ 

+ 265 - 0
src/views/goods/Goods.vue

@@ -0,0 +1,265 @@
+/**
+ * 基础菜单 商品管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>商品管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.deptName" placeholder="输入部门名称"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.deptNo" placeholder="输入部门代码"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="deptName" label="部门名称" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="deptNo" label="部门代码" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="300">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="300">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="部门名称" prop="deptName">
+          <el-input v-model="editForm.deptName" auto-complete="off" placeholder="请输入部门名称"></el-input>
+        </el-form-item>
+        <el-form-item label="部门代码" prop="deptNo">
+          <el-input v-model="editForm.deptNo" auto-complete="off" placeholder="请输入部门代码"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { deptList, deptSave, deptDelete } from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      editForm: {
+        deptId: '',
+        deptName: '',
+        deptNo: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        deptName: [
+          { required: true, message: '请输入部门名称', trigger: 'blur' }
+        ],
+        deptNo: [{ required: true, message: '请输入部门代码', trigger: 'blur' }]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        varLable: '',
+        varName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除部门
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取公司列表
+    getdata(parameter) {
+      this.loading = true
+      deptList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.deptId = row.deptId
+        this.editForm.deptName = row.deptName
+        this.editForm.deptNo = row.deptNo
+      } else {
+        this.title = '添加'
+        this.editForm.deptId = ''
+        this.editForm.deptName = ''
+        this.editForm.deptNo = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          deptSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '公司保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('公司保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除公司
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          deptDelete(row.deptId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '公司已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('公司删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog() {
+      this.editFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 
+ 

+ 97 - 0
src/views/index.vue

@@ -0,0 +1,97 @@
+<template>
+  <!-- <el-container class="index-con">
+    <el-header class="index-header">
+      <navcon></navcon>
+    </el-header>
+    <el-container class="index-con">
+      <el-aside :class="showclass">
+        <leftnav></leftnav>
+      </el-aside>
+      <el-container class="main-con">
+        <el-main clss="index-main">
+          <router-view></router-view>
+        </el-main>
+      </el-container>
+    </el-container>
+  </el-container> -->
+
+  <el-container class="index-con">
+    <el-aside :class="showclass">
+      <leftnav></leftnav>
+    </el-aside>
+    <el-container class="main-con">
+      <el-header class="index-header">
+        <navcon></navcon>
+      </el-header>
+      <el-main clss="index-main">
+        <router-view></router-view>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+<script>
+// 导入组件
+import navcon from '../components/navcon.vue'
+import leftnav from '../components/leftnav.vue'
+export default {
+  name: 'index',
+  data() {
+    return {
+      showclass: 'asideshow',
+      showtype: false
+    }
+  },
+  // 注册组件
+  components: {
+    navcon,
+    leftnav
+  },
+  methods: {},
+  created() {
+    // 监听
+    this.$root.Bus.$on('toggle', value => {
+      if (value) {
+        this.showclass = 'asideshow'
+      } else {
+        setTimeout(() => {
+          this.showclass = 'aside'
+        }, 300)
+      }
+    })
+  },
+  beforeUpdate() {},
+  // 挂载前状态(里面是操作)
+  beforeMount() {
+    // 弹出登录成功
+    this.$message({
+      message: '登录成功',
+      type: 'success'
+    })
+  }
+}
+</script>
+<style >
+.index-con {
+  height: 100%;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.aside {
+  width: 64px !important;
+  height: 100%;
+  background-color: #334157;
+  margin: 0px;
+}
+.asideshow {
+  width: 240px !important;
+  height: 100%;
+  background-color: #334157;
+  margin: 0px;
+}
+.index-header,
+.index-main {
+  padding: 0px;
+  border-left: 2px solid #333;
+}
+</style>

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 161 - 0
src/views/login.vue


+ 18 - 0
src/views/machine/Machine.vue

@@ -0,0 +1,18 @@
+/**
+ * 基础菜单 机器信息管理
+ */
+<template>
+  <div>基础菜单 机器信息管理</div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>
+
+ 

+ 18 - 0
src/views/machine/MachineAisle.vue

@@ -0,0 +1,18 @@
+/**
+ * 基础菜单 货道信息管理
+ */
+<template>
+  <div>基础菜单 货道信息管理</div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>
+
+ 

+ 312 - 0
src/views/machine/MachineConfig.vue

@@ -0,0 +1,312 @@
+/**
+ * 支付管理 支付配置信息
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>支付配置信息</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.machineNo" placeholder="输入终端号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="machineNo" label="终端号" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="payType" label="支付方式" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="configName" label="显示名称" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="payOpen" label="状态" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="200">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="150">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="终端号" prop="machineNo">
+          <el-input v-model="editForm.machineNo" auto-complete="off" placeholder="请输入终端号"></el-input>
+        </el-form-item>
+        <el-form-item label="支付方式" prop="payType">
+          <el-select v-model="editForm.payType" placeholder="请选择" class="userRole">
+            <el-option v-for="type in payType" :label="type.key" :value="type.value" :key="type.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="配置序号" prop="configId">
+          <el-input v-model="editForm.configId" auto-complete="off" placeholder="请输入配置序号"></el-input>
+        </el-form-item>
+        <el-form-item label="显示名称" prop="configName">
+          <el-input v-model="editForm.configName" auto-complete="off" placeholder="请输入显示名称"></el-input>
+        </el-form-item>
+        <el-form-item label="状态" prop="payOpen">
+          <el-select v-model="editForm.payOpen" placeholder="请选择" class="userRole">
+            <el-option label="正常" value="T"></el-option>
+            <el-option label="禁用" value="N"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  MachineConfigList,
+  MachineConfigSave,
+  MachineConfigDelete
+} from '../../api/payMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      payType: [
+        { key: '现金', value: 1 },
+        { key: '支付宝', value: 2 },
+        { key: '微信', value: 3 },
+        { key: 'POS通', value: 4 },
+        { key: '闪付', value: 5 },
+        { key: 'POS通C扫B', value: 6 },
+        { key: '银联二维码', value: 8 },
+        { key: '会员余额支付', value: 9 }
+      ],
+      editForm: {
+        tcId: '',
+        machineNo: '',
+        payType: '',
+        configId: '',
+        configName: '',
+        payOpen: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        machineNo: [
+          { required: true, message: '请输入终端号', trigger: 'blur' }
+        ],
+        payType: [
+          { required: true, message: '请选择支付方式', trigger: 'blur' }
+        ],
+        configId: [
+          { required: true, message: '请输入配置序号', trigger: 'blur' }
+        ],
+        configName: [
+          { required: true, message: '请输入显示名称', trigger: 'blur' }
+        ],
+        payOpen: [{ required: true, message: '请选择状态', trigger: 'blur' }]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        varLable: '',
+        varName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除部门
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取公司列表
+    getdata(parameter) {
+      this.loading = true
+      MachineConfigList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.tcId = row.tcId
+        this.editForm.machineNo = row.machineNo
+        this.editForm.configId = row.configId
+        this.editForm.payType = row.payType
+        this.editForm.configName = row.configName
+        this.editForm.payOpen = row.payOpen
+      } else {
+        this.title = '添加'
+        this.editForm.tcId = ''
+        this.editForm.machineNo = ''
+        this.editForm.payType = ''
+        this.editForm.configId = ''
+        this.editForm.configName = ''
+        this.editForm.payOpen = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          MachineConfigSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '公司保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('支付配置信息保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除公司
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          MachineConfigDelete(row.deptId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '公司已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('支付配置信息删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog() {
+      this.editFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 
+ 

+ 378 - 0
src/views/pay/Config.vue

@@ -0,0 +1,378 @@
+/**
+ * 支付管理 支付配置
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>支付配置</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.name" placeholder="输入名称"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-select v-model="formInline.payType" placeholder="请选择">
+          <el-option v-for="type in payType" :label="type.key" :value="type.value" :key="type.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.partner" placeholder="输入商户号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="index" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="name" label="名称" width="200" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="payType" label="支付类型" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="partner" label="商户号" width="100" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="subMchId" label="微信子商户" width="140" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="appid" label="应用ID" width="100" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="signType" label="加密类型" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="partnerKey" label="商户签名密钥" width="180" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="notifyUrl" label="通知回调" width="140" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="sellerUserId" label="支付宝卖家" width="150" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="certPath" label="微信证书路径" width="150" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="150">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog('editForm')">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="名称" prop="name">
+          <el-input v-model="editForm.name" auto-complete="off" placeholder="请输入名称"></el-input>
+        </el-form-item>
+        <el-form-item label="支付类型" prop="payType">
+          <el-select v-model="editForm.payType" placeholder="请选择" class="userRole">
+            <el-option v-for="type in payType" :label="type.key" :value="type.value" :key="type.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商户号" prop="partner">
+          <el-input v-model="editForm.partner" auto-complete="off" placeholder="请输入商户号"></el-input>
+        </el-form-item>
+        <el-form-item label="微信子商户" prop="subMchId">
+          <el-input v-model="editForm.subMchId" auto-complete="off" placeholder="请输入微信子商户"></el-input>
+        </el-form-item>
+        <el-form-item label="应用ID" prop="appid">
+          <el-input v-model="editForm.appid" auto-complete="off" placeholder="请输入应用ID"></el-input>
+        </el-form-item>
+        <el-form-item label="通知回调" prop="notifyUrl">
+          <el-input v-model="editForm.notifyUrl" auto-complete="off" placeholder="请输入通知回调"></el-input>
+        </el-form-item>
+        <el-form-item label="加密类型" prop="signType">
+          <el-input v-model="editForm.signType" auto-complete="off" placeholder="请输入加密类型"></el-input>
+        </el-form-item>
+        <el-form-item label="商户签名密钥" prop="partnerKey">
+          <el-input v-model="editForm.partnerKey" auto-complete="off" placeholder="请输入商户签名密钥"></el-input>
+        </el-form-item>
+        <el-form-item label="支付宝卖家" prop="sellerUserId">
+          <el-input v-model="editForm.sellerUserId" auto-complete="off" placeholder="请输入支付宝卖家"></el-input>
+        </el-form-item>
+        <el-form-item label="微信证书路径" prop="certPath">
+          <el-input v-model="editForm.certPath" auto-complete="off" placeholder="请输入微信证书路径"></el-input>
+        </el-form-item>
+        <el-form-item label="微信证书密码" prop="certPassword">
+          <el-input v-model="editForm.certPassword" auto-complete="off" placeholder="请输入微信证书密码"></el-input>
+        </el-form-item>
+        <el-form-item label="支付宝私钥" prop="rsaKey">
+          <el-input v-model="editForm.rsaKey" auto-complete="off" placeholder="请输入支付宝私钥"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog('editForm')">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { ConfigList, ConfigSave, ConfigDelete } from '../../api/payMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      payType: [
+        { key: '请选择', value: 0 },
+        { key: '现金', value: 1 },
+        { key: '支付宝', value: 2 },
+        { key: '微信', value: 3 },
+        { key: 'POS通', value: 4 },
+        { key: '闪付', value: 5 },
+        { key: 'POS通C扫B', value: 6 },
+        { key: '银联二维码', value: 8 },
+        { key: '会员余额支付', value: 9 }
+      ],
+      editForm: {
+        id: '',
+        name: '',
+        payType: 1,
+        partner: '',
+        subMchId: '',
+        appid: '',
+        notifyUrl: '',
+        signType: '',
+        partnerKey: '',
+        sellerUserId: '',
+        certPath: '',
+        certPassword: '',
+        rsaKey: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        payType: [
+          { required: true, message: '请选择支付方式', trigger: 'blur' }
+        ],
+        partner: [{ required: true, message: '请输入商户号', trigger: 'blur' }],
+        subMchId: [
+          { required: true, message: '请输入微信子商户号', trigger: 'blur' }
+        ],
+        appid: [{ required: true, message: '请输入应用ID', trigger: 'blur' }],
+        notifyUrl: [
+          { required: true, message: '请输入通知回调', trigger: 'blur' }
+        ],
+        signType: [
+          { required: true, message: '请输入加密类型', trigger: 'blur' }
+        ],
+        partnerKey: [
+          { required: true, message: '请输入商户签名密钥', trigger: 'blur' }
+        ],
+        sellerUserId: [
+          { required: true, message: '请输入支付宝卖家', trigger: 'blur' }
+        ],
+        certPath: [
+          { required: true, message: '请输入微信证书路径', trigger: 'blur' }
+        ],
+        certPassword: [
+          { required: true, message: '请输入微信证书密码', trigger: 'blur' }
+        ],
+        rsaKey: [
+          { required: true, message: '请输入支付宝私钥', trigger: 'blur' }
+        ]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        name: '',
+        payType: 0,
+        partner: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除部门
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取公司列表
+    getdata(parameter) {
+      this.loading = true
+      ConfigList(parameter)
+        .then(res => {
+          console.log(JSON.stringify(res))
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.id = row.id
+        this.editForm.name = row.name
+        this.editForm.payType = row.payType
+        this.editForm.partner = row.partner
+        this.editForm.subMchId = row.subMchId
+        this.editForm.appid = row.appid
+        this.editForm.notifyUrl = row.notifyUrl
+        this.editForm.signType = row.signType
+        this.editForm.partnerKey = row.partnerKey
+        this.editForm.sellerUserId = row.sellerUserId
+        this.editForm.certPath = row.certPath
+        this.editForm.certPassword = row.certPassword
+        this.editForm.rsaKey = row.rsaKey
+      } else {
+        this.title = '添加'
+        this.editForm.id = ''
+        this.editForm.name = ''
+        this.editForm.payType = ''
+        this.editForm.partner = ''
+        this.editForm.subMchId = ''
+        this.editForm.appid = ''
+        this.editForm.notifyUrl = ''
+        this.editForm.signType = ''
+        this.editForm.partnerKey = ''
+        this.editForm.sellerUserId = ''
+        this.editForm.certPath = ''
+        this.editForm.certPassword = ''
+        this.editForm.rsaKey = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          ConfigSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '公司保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('支付配置信息保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除公司
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          ConfigDelete(row.deptId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '公司已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('支付配置信息删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog(formName) {
+      this.editFormVisible = false
+      this.$refs[formName].resetFields();
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 
+ 

+ 363 - 0
src/views/pay/Order.vue

@@ -0,0 +1,363 @@
+/**
+ * 订单管理 交易订单
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>交易订单</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.machineNo" placeholder="输入终端编号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-input v-model="formInline.orderNo" placeholder="输入订单号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-input v-model="formInline.transId" placeholder="输入交易单号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-select v-model="formInline.payType" placeholder="请选择">
+          <el-option v-for="type in payType" :label="type.key" :value="type.value" :key="type.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-select v-model="formInline.orderStatus" placeholder="请选择">
+          <el-option v-for="type in payway" :label="type.key" :value="type.value" :key="type.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="index" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="machineNo" label="终端编号" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="orderNo" label="订单号" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="transId" label="交易单号" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="payType" label="支付方式" width="140" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="transType" label="交易类型" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="goodsPrice" label="商品价格" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="payAmount" label="支付金额" width="180" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="goodsName" label="商品名称" width="140" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="orderStatus" label="订单状态" width="120" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column sortable prop="addTime" label="创建时间" width="180" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <div>{{scope.row.addTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="150">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">预览</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">退款</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="50%" @click="closeDialog('editForm')">
+      <el-form label-width="120px" :model="editForm" ref="editForm">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="公司编号">
+              <el-input v-model="editForm.deptId" auto-complete="off" placeholder="请输入名称" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="订单号">
+              <el-input v-model="editForm.orderNo" auto-complete="off" placeholder="请输入商户号" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="支付方式">
+              <el-input v-model="editForm.payType" auto-complete="off" placeholder="请输入商户号" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="交易类型">
+              <el-input v-model="editForm.transType" auto-complete="off" placeholder="请输入微信子商户" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="商品编号">
+              <el-input v-model="editForm.goodsNo" auto-complete="off" placeholder="请输入应用ID" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="支付金额">
+              <el-input v-model="editForm.payAmount" auto-complete="off" placeholder="请输入通知回调" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="货道号">
+              <el-input v-model="editForm.aisleNo" auto-complete="off" placeholder="请输入加密类型" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="买家标识">
+              <el-input v-model="editForm.openId" auto-complete="off" placeholder="请输入商户签名密钥" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="子商户号">
+              <el-input v-model="editForm.subMchId" auto-complete="off" placeholder="请输入支付宝卖家" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="公司名称">
+              <el-input v-model="editForm.deptName" auto-complete="off" placeholder="请输入名称" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="交易单号">
+              <el-input v-model="editForm.transId" auto-complete="off" placeholder="请输入商户号" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="子支付方式">
+              <el-input v-model="editForm.subPayType" auto-complete="off" placeholder="请输入商户号" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="终端编号">
+              <el-input v-model="editForm.machineNo" auto-complete="off" placeholder="请输入微信子商户" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="商品价格">
+              <el-input v-model="editForm.goodsPrice" auto-complete="off" placeholder="请输入应用ID" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="商品名称">
+              <el-input v-model="editForm.goodsName" auto-complete="off" placeholder="请输入通知回调" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="订单状态">
+              <el-input v-model="editForm.orderStatus" auto-complete="off" placeholder="请输入加密类型" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="商户号">
+              <el-input v-model="editForm.mchId" auto-complete="off" placeholder="请输入商户签名密钥" disabled></el-input>
+            </el-form-item>
+            <el-form-item label="编辑用户">
+              <el-input v-model="editForm.editUser" auto-complete="off" placeholder="请输入支付宝卖家" disabled></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="备注">
+          <el-input v-model="editForm.remark" auto-complete="off" placeholder="请输入微信证书路径" disabled></el-input>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { OrderList, OrderRefund, OrderDelete } from '../../api/payMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '预览',
+      payType: [
+        { key: '请选择', value: 0 },
+        { key: '现金', value: 1 },
+        { key: '支付宝', value: 2 },
+        { key: '微信', value: 3 },
+        { key: 'POS通', value: 4 },
+        { key: '闪付', value: 5 },
+        { key: 'POS通C扫B', value: 6 },
+        { key: '银联二维码', value: 8 },
+        { key: '会员余额支付', value: 9 }
+      ],
+      payway: [
+        { key: '请选择', value: 0 },
+        { key: '初始化', value: 1 },
+        { key: '已支付', value: 2 },
+        { key: '出货成功', value: 3 },
+        { key: '出货失败', value: 4 },
+        { key: '订单超时', value: 5 },
+        { key: '退款初始化', value: 11 },
+        { key: '退款进行中', value: 12 },
+        { key: '退款成功', value: 13 },
+        { key: '退款失败', value: 14 },
+        { key: '订单处理中', value: 10 }
+      ],
+      editForm: {
+        id: '',
+        name: '',
+        payType: 1,
+        partner: '',
+        subMchId: '',
+        appid: '',
+        notifyUrl: '',
+        signType: '',
+        partnerKey: '',
+        sellerUserId: '',
+        certPath: '',
+        certPassword: '',
+        rsaKey: '',
+        token: localStorage.getItem('logintoken')
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        machineNo: '',
+        orderNo: '',
+        transId: '',
+        payType: 0,
+        orderStatus: 0,
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除部门
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取公司列表
+    getdata(parameter) {
+      this.loading = true
+      OrderList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      this.editForm = row
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          ConfigSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '公司保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('支付配置信息保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除公司
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          ConfigDelete(row.deptId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '公司已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('支付配置信息删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog(formName) {
+      this.editFormVisible = false
+      this.$refs[formName].resetFields()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 
+ 
+
+ 

+ 264 - 0
src/views/system/Dept.vue

@@ -0,0 +1,264 @@
+/**
+ * 系统管理  公司管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>公司管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.deptName" placeholder="输入部门名称"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.deptNo" placeholder="输入部门代码"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="deptName" label="部门名称" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="deptNo" label="部门代码" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="300">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="300">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="部门名称" prop="deptName">
+          <el-input v-model="editForm.deptName" auto-complete="off" placeholder="请输入部门名称"></el-input>
+        </el-form-item>
+        <el-form-item label="部门代码" prop="deptNo">
+          <el-input v-model="editForm.deptNo" auto-complete="off" placeholder="请输入部门代码"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { deptList, deptSave, deptDelete } from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      editForm: {
+        deptId: '',
+        deptName: '',
+        deptNo: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        deptName: [
+          { required: true, message: '请输入部门名称', trigger: 'blur' }
+        ],
+        deptNo: [{ required: true, message: '请输入部门代码', trigger: 'blur' }]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        varLable: '',
+        varName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除部门
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取公司列表
+    getdata(parameter) {
+      this.loading = true
+      deptList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.deptId = row.deptId
+        this.editForm.deptName = row.deptName
+        this.editForm.deptNo = row.deptNo
+      } else {
+        this.title = '添加'
+        this.editForm.deptId = ''
+        this.editForm.deptName = ''
+        this.editForm.deptNo = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          deptSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '公司保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('公司保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除公司
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          deptDelete(row.deptId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '公司已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('公司删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog() {
+      this.editFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 

+ 260 - 0
src/views/system/Module.vue

@@ -0,0 +1,260 @@
+/**
+ * 系统管理 菜单管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>菜单管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 主体内容 -->
+    <el-row>
+      <!-- title -->
+      <div class="modt-box">用户管理</div>
+      <el-col :span="4"> </el-col>
+      <el-col :span="6">
+        <div class="mod-btnbox">
+          <el-button type="primary">全部展开</el-button>
+          <el-button type="primary">全部压缩</el-button>
+        </div>
+        <el-tree class="treeclass" ref="tree" :data="treeData" default-expand-all="" :props="defaultProps" @node-click="nodeclick" @check-change="handleClick" check-strictly node-key="id" show-checkbox></el-tree>
+      </el-col>
+      <el-col :span="18">
+        <div class="mod-btnbox">
+          <el-button type="primary" icon="el-icon-plus" @click="addModule">添加</el-button>
+        </div>
+        <el-form ref="form" :model="form" label-width="80px" :rules="rules">
+          <el-form-item label="父级菜单" prop="parentId">
+            <el-select v-model="form.parentId" placeholder="请选择" class="selectw">
+              <el-option v-for="parm in fmenu" :key="parm.id" :label="parm.name" :value="parm.id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="菜单名称" prop="moduleName">
+            <el-input v-model="form.moduleName"></el-input>
+          </el-form-item>
+          <el-form-item label="图标" prop="moduleIcon">
+            <el-input v-model="form.moduleIcon"></el-input>
+          </el-form-item>
+          <el-form-item label="URL" prop="moduleUrl">
+            <el-input v-model="form.moduleUrl"></el-input>
+          </el-form-item>
+          <el-form-item label="顺序" prop="moduleOrder">
+            <el-input v-model="form.moduleOrder"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="saveModule('form')">保存</el-button>
+            <el-button type="primary" v-show="showdelete" @click="deleteModule">删除</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  ModuleList,
+  ModuleGet,
+  ModuleNodes,
+  ModuleSave,
+  ModuleDelete
+} from '../../api/userMG'
+export default {
+  data() {
+    return {
+      showdelete: false,
+      treeData: [],
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      form: {
+        addUser: '',
+        editUser: '',
+        addTime: '',
+        editTime: '',
+        moduleId: '',
+        parentId: '',
+        moduleLevel: '',
+        systemNo: '',
+        isLeaf: '',
+        fullIndex: '',
+        moduleIcon: '',
+        moduleOrder: '',
+        moduleName: '',
+        moduleNotes: '',
+        moduleUrl: ''
+      },
+      // rules表单验证
+      rules: {
+        parentId: [
+          { required: true, message: '请选择父级菜单', trigger: 'blur' }
+        ],
+        moduleName: [
+          { required: true, message: '请输入菜单名称', trigger: 'blur' }
+        ],
+        moduleIcon: [
+          { required: true, message: '请输入菜单图标', trigger: 'blur' }
+        ],
+        moduleUrl: [{ required: true, message: '请输入URL', trigger: 'blur' }],
+        moduleOrder: [
+          { required: true, message: '请输入菜单顺序', trigger: 'blur' }
+        ]
+      },
+      fmenu: []
+    }
+  },
+  /**
+   * 创建完毕
+   */
+
+  created() {
+    this.getdata()
+    this.getmenu()
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取数据
+    getdata() {
+      ModuleList()
+        .then(res => {
+          this.treeData = res
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单管理列表失败,请稍后再试!')
+        })
+    },
+    // 添加
+    addModule() {
+      this.showdelete = false
+      this.form.addUser = ''
+      this.form.editUser = ''
+      this.form.addTime = ''
+      this.form.editTime = ''
+      this.form.moduleId = ''
+      this.form.parentId = ''
+      this.form.moduleLevel = ''
+      this.form.systemNo = ''
+      this.form.isLeaf = ''
+      this.form.fullIndex = ''
+      this.form.moduleIcon = ''
+      this.form.moduleOrder = ''
+      this.form.moduleName = ''
+      this.form.moduleNotes = ''
+      this.form.moduleUrl = ''
+    },
+    // 获取父级菜单
+    getmenu() {
+      let parm = {
+        page: '1',
+        limit: '10'
+      }
+      ModuleNodes(parm)
+        .then(res => {
+          this.fmenu = res.data
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('父级菜单列表获取失败,请稍后再试!')
+        })
+    },
+    // 复选变单选
+    handleClick(data, checked, node) {
+      if (checked) {
+        this.$refs.tree.setCheckedNodes([])
+        this.$refs.tree.setCheckedNodes([data])
+        this.showdelete = true
+      } else {
+      }
+    },
+    // 点击节点
+    nodeclick(arr, node, self) {
+      ModuleGet(arr.id)
+        .then(res => {
+          console.log(JSON.stringify(res))
+          this.form = res.data.data
+          this.$refs.tree.setCheckedNodes([])
+          this.$refs.tree.setCheckedNodes([arr])
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('用户管理获取失败,请稍后再试!')
+        })
+    },
+    // 保存菜单
+    saveModule(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          ModuleSave(this.form)
+            .then(res => {
+              this.getdata()
+              this.getmenu()
+            })
+            .catch(err => {
+              this.$message.error('菜单管理列表保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除菜单
+    deleteModule() {
+      ModuleDelete(this.form.moduleId)
+        .then(res => {
+          this.getdata()
+          this.getmenu()
+          this.$message.error('菜单管理列表删除成功!')
+        })
+        .catch(err => {
+          this.$message.error('菜单管理列表删除失败,请稍后再试!')
+        })
+    }
+  }
+}
+</script>
+
+<style>
+.user-search {
+  margin-top: 20px !important;
+}
+.user-search td {
+  margin-top: 20px !important;
+}
+.userRole {
+  width: 100%;
+}
+.el-table__expanded-cell {
+  padding: 0px !important;
+  margin: 0px !important;
+}
+.modt-box {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  background-color: #f0f2f5;
+  text-align: center;
+  color: #334157;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  font-size: 24px;
+}
+.mod-btnbox {
+  margin-bottom: 20px;
+}
+.treeclass {
+  border: 1px solid #f3f3f3;
+  padding-top: 20px;
+  padding-bottom: 20px;
+}
+.selectw {
+  width: 100%;
+}
+</style>
+ 
+ 

+ 348 - 0
src/views/system/Permission.vue

@@ -0,0 +1,348 @@
+/**
+ * 系统管理  权限管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>权限管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.permissionName" placeholder="输入权限名称"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.permission" placeholder="输入权限CODE"></el-input>
+      </el-form-item>
+      <el-form-item label="角色:">
+        <el-select v-model="formInline.roleId" placeholder="请选择">
+          <el-option selected label="请选择" value="0"></el-option>
+          <el-option v-for="parm in userparm" :key="parm.roleId" :label="parm.roleName" :value="parm.roleId"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="RolePermission()">配置权限</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table @selection-change="selectChange" :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="permissionName" label="权限名称" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="permission" label="权限CODE" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="300">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="300">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click="closeDialog">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="权限名称" prop="permissionName">
+          <el-input v-model="editForm.permissionName" auto-complete="off" placeholder="权限名称"></el-input>
+        </el-form-item>
+        <el-form-item label="权限CODE" prop="permission">
+          <el-input v-model="editForm.permission" auto-complete="off" placeholder="权限CODE"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  permissionList,
+  ermissionSave,
+  ermissionDelete,
+  roleDropDown,
+  RolePermission
+} from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      editForm: {
+        permissionId: '',
+        permissionName: '',
+        permission: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        permissionName: [
+          { required: true, message: '请输入权限名称', trigger: 'blur' }
+        ],
+        permission: [
+          { required: true, message: '请输入权限CODE', trigger: 'blur' }
+        ]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        permissionName: '',
+        permission: '',
+        roleId: '0',
+        token: localStorage.getItem('logintoken')
+      },
+      // 选择数据
+      selectdata: [],
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  watch: {},
+
+  /**
+   * 创建完毕
+   */
+
+  created() {
+    this.getdata(this.formInline)
+    this.getAccsee()
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+
+  methods: {
+    // 获取数据方法
+    getdata(parameter) {
+      this.loading = true
+      // 获取权限列表
+      permissionList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('权限管理列表获取失败,请稍后再试!')
+        })
+    },
+    // 获取权限
+    getAccsee() {
+      roleDropDown()
+        .then(res => {
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.userparm = res.data
+          }
+        })
+        .catch(err => {
+          this.$message.error('权限获取失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      // 深拷贝并赋值
+      //this.editForm = Object.assign({}, row)
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.permissionId = row.permissionId
+        this.editForm.permissionName = row.permissionName
+        this.editForm.permission = row.permission
+      } else {
+        this.title = '添加'
+        this.editForm.permissionId = ''
+        this.editForm.permissionName = ''
+        this.editForm.permission = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          ermissionSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '权限管理保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('权限管理保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除权限
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          ermissionDelete(row.permissionId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '权限管理已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('权限管理删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 选择复选框事件
+    selectChange(val) {
+      this.selectdata = val
+    },
+    // 配置权限
+    RolePermission() {
+      let parms = {
+        roleId: '',
+        permissionIds: ''
+      }
+      if (this.formInline.roleId == '0') {
+        this.$message({
+          type: 'info',
+          message: '请选择角色'
+        })
+        return false
+      }
+      parms.roleId = this.formInline.roleId
+      let len = this.selectdata
+      let ids = []
+      if (len != 0) {
+        for (let i = 0; i < len.length; i++) {
+          ids.push(len[i].permissionId)
+        }
+      }
+      parms.permissionIds = ids.join(',')
+      RolePermission(parms)
+        .then(res => {
+          if (res.success) {
+            this.$message({
+              type: 'success',
+              message: '配置权限成功!'
+            })
+            this.getdata(this.formInline)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('配置权限失败,请稍后再试!')
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog() {
+      this.editFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 

+ 423 - 0
src/views/system/Role.vue

@@ -0,0 +1,423 @@
+/**
+ * 系统管理  角色管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>角色管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.roleName" placeholder="输入角色名称"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.roleNo" placeholder="输入角色代码"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="roleName" label="角色名称" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="roleNo" label="角色代码" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="300">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="300">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+          <el-button size="mini" type="success" @click="menuAccess(scope.$index, scope.row)">菜单权限</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click='closeDialog("edit")'>
+      <el-form label-width="120px" :model="editForm" ref="editForm" :rules="rules">
+        <el-form-item label="系统编码" prop="systemNo">
+          <el-input v-model="editForm.systemNo" auto-complete="off" placeholder="请输入系统编码"></el-input>
+        </el-form-item>
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="editForm.roleName" auto-complete="off" placeholder="请输入角色名称"></el-input>
+        </el-form-item>
+        <el-form-item label="角色代码" prop="roleNo">
+          <el-input v-model="editForm.roleNo" auto-complete="off" placeholder="请输入角色代码"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click='closeDialog("edit")'>取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+    <!-- 菜单权限 -->
+    <el-dialog title="菜单权限" :visible.sync="menuAccessshow" width="30%" @click='closeDialog("perm")'>
+      <el-tree ref="tree" default-expand-all="" :data="RoleRight" :props="RoleRightProps" :default-checked-keys="checkmenu" node-key="id" show-checkbox>
+      </el-tree>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click='closeDialog("perm")'>取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="menuPermSave">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  roleList,
+  roleSave,
+  roleDelete,
+  rolePwd,
+  RoleRightTree,
+  RoleRightSave
+} from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      menuAccessshow: false, //控制数据权限显示与隐藏
+      title: '添加',
+      editForm: {
+        roleId: '',
+        systemNo: '',
+        roleNo: '',
+        roleName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules 表单验证
+      rules: {
+        systemNo: [
+          { required: true, message: '请输入系统编码', trigger: 'blur' }
+        ],
+        roleNo: [
+          { required: true, message: '请输入角色代码', trigger: 'blur' }
+        ],
+        roleName: [
+          { required: true, message: '请输入角色名称', trigger: 'blur' }
+        ]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        varLable: '',
+        varName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 数据权限
+      RoleRight: [],
+      RoleRightProps: {
+        children: 'children',
+        label: 'name'
+      },
+      // 选中
+      checkmenu: [],
+      //参数role
+      saveroleId: '',
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  watch: {},
+
+  /**
+   * 创建完毕
+   */
+
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+
+  methods: {
+    // 获取角色列表
+    getdata(parameter) {
+      roleList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('获取角色列表失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.roleId = row.roleId
+        this.editForm.systemNo = row.systemNo
+        this.editForm.roleNo = row.roleNo
+        this.editForm.roleName = row.roleName
+      } else {
+        this.title = '添加'
+        this.editForm.roleId = ''
+        this.editForm.systemNo = ''
+        this.editForm.roleNo = ''
+        this.editForm.roleName = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          roleSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '角色保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('角色保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除角色
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          roleDelete(row.roleId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '角色已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('角色删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 数据权限
+    menuAccess: function(index, row) {
+      this.menuAccessshow = true
+      this.saveroleId = row.roleId
+      RoleRightTree(row.roleId)
+        .then(res => {
+          if (res.data.success) {
+            this.$message({
+              type: 'success',
+              message: '获取权限成功'
+            })
+            this.changemenu(res.data.data)
+            this.RoleRight = this.changeArr(res.data.data)
+            
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.data.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('获取权限失败,请稍后再试!')
+        })
+    },
+    // 选中菜单
+    changemenu(arr) {
+      let change = []
+      for (let i = 0; i < arr.length; i++) {
+        if (arr[i].checked) {
+          change.push(arr[i].id)
+        }
+      }
+      this.checkmenu = change
+    },
+    // tree 递归
+    changeArr(list) {
+      var temptree = [],
+        tree = [],
+        items = []
+      for (var i in list) {
+        if (!temptree[list[i].id]) {
+          var trow = {
+            id: list[i].id,
+            pId: list[i].pId,
+            name: list[i].name,
+            open: list[i].open,
+            checked: list[i].checked,
+            children: []
+          }
+          temptree[list[i].id] = trow
+          items.push(trow)
+        }
+        if (list[i].uid > 0) {
+          temptree[list[i].id]['children'].push({
+            id: list[i].id,
+            pId: list[i].pId,
+            name: list[i].name,
+            open: list[i].open,
+            checked: list[i].checked,
+            children: []
+          })
+        }
+      }
+
+      for (var j in items) {
+        if (temptree[items[j].pId]) {
+          temptree[items[j].pId]['children'].push(temptree[items[j].id])
+        } else {
+          tree.push(temptree[items[j].id])
+        }
+      }
+      temptree = null
+      items = null
+      return tree
+    },
+    // 菜单权限-保存
+    menuPermSave() {
+      let parm = {
+        roleId: this.saveroleId,
+        moduleIds: ''
+      }
+      let node = this.$refs.tree.getCheckedNodes()
+      let moduleIds = []
+      if (node.length != 0) {
+        for (let i = 0; i < node.length; i++) {
+          moduleIds.push(node[i].id)
+        }
+        parm.moduleIds = JSON.stringify(moduleIds)
+      }
+      RoleRightSave(parm)
+        .then(res => {
+          if (res.success) {
+            this.$message({
+              type: 'success',
+              message: '权限保存成功'
+            })
+            this.menuAccessshow = false
+            this.getdata(this.formInline)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('权限保存失败,请稍后再试!')
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog(dialog) {
+      if (dialog == 'edit') {
+        this.editFormVisible = false
+      } else if (dialog == 'perm') {
+        this.menuAccessshow = false
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 

+ 282 - 0
src/views/system/Variable.vue

@@ -0,0 +1,282 @@
+/**
+ * 系统管理  系统环境变量
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>系统环境变量</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+
+      <el-form-item label="搜索:">
+        <el-input v-model="formInline.varLable" placeholder="输入变量描述"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.varName" placeholder="输入变量名称"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table :data="listData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="60">
+      </el-table-column>
+      <el-table-column sortable prop="varLable" label="变量描述" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="varName" label="变量名称" width="200">
+      </el-table-column>
+      <el-table-column sortable prop="varValue" label="变量名称" width="300">
+      </el-table-column>
+      <el-table-column sortable prop="editTime" label="修改时间" width="200">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column sortable prop="editUser" label="修改人" width="200">
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog title="修改" :visible.sync="editFormVisible" width="30%" @click="closeDialog">
+      <el-form label-width="120px" :model="editForm" :rules="rules" ref="editForm">
+        <el-form-item label="变量描述" prop="varLable">
+          <el-input v-model="editForm.varLable" auto-complete="off" placeholder="变量描述"></el-input>
+        </el-form-item>
+        <el-form-item label="变量名称" prop="varName">
+          <el-input v-model="editForm.varName" auto-complete="off" placeholder="变量名称"></el-input>
+        </el-form-item>
+        <el-form-item label="变量名称" prop="varValue">
+          <el-input v-model="editForm.varValue" auto-complete="off" placeholder="变量名称"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { variableList, variableSave, variableDelete } from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      title: '添加',
+      editForm: {
+        varId: '',
+        varLable: '',
+        varName: '',
+        varValue: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // rules表单验证
+      rules: {
+        varLable: [
+          { required: true, message: '请输入变量描述', trigger: 'blur' }
+        ],
+        varName: [
+          { required: true, message: '请输入变量名称', trigger: 'blur' }
+        ],
+        varValue: [
+          { required: true, message: '请输入变量名称', trigger: 'blur' }
+        ]
+      },
+      formInline: {
+        page: 1,
+        limit: 10,
+        varLable: '',
+        varName: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 删除
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      userparm: [], //搜索权限
+      listData: [], //用户数据
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+  /**
+   * 数据发生改变
+   */
+
+  watch: {},
+
+  /**
+   * 创建完毕
+   */
+
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+
+  methods: {
+    // 获取数据方法
+    getdata(parameter) {
+      this.loading = true
+      variableList(parameter)
+        .then(res => {
+          this.loading = false
+          if (res.success == false) {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          } else {
+            this.listData = res.data
+            // 分页赋值
+            this.pageparm.currentPage = this.formInline.page
+            this.pageparm.pageSize = this.formInline.limit
+            this.pageparm.total = res.count
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('菜单加载失败,请稍后再试!')
+        })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    // 搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改'
+        this.editForm.varId = row.varId
+        this.editForm.varLable = row.varLable
+        this.editForm.varName = row.varName
+        this.editForm.varValue = row.varValue
+      } else {
+        this.title = '添加'
+        this.editForm.varId = ''
+        this.editForm.varLable = ''
+        this.editForm.varName = ''
+        this.editForm.varValue = ''
+      }
+    },
+    // 编辑、增加页面保存方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          variableSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '系统环境变量保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('系统环境变量保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 删除权限
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          variableDelete(row.varId)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '系统环境变量已删除'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('系统环境变量删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog() {
+      this.editFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 

+ 710 - 0
src/views/system/user.vue

@@ -0,0 +1,710 @@
+/**
+ * 系统管理 用户管理
+ */
+<template>
+  <div>
+    <!-- 面包屑导航 -->
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>用户管理</el-breadcrumb-item>
+    </el-breadcrumb>
+    <!-- 搜索筛选 -->
+    <el-form :inline="true" :model="formInline" class="user-search">
+      <el-form-item label="搜索:">
+        <el-select v-model="formInline.isLock" placeholder="请选择">
+          <el-option label="全部" value=""></el-option>
+          <el-option label="正常" value="N"></el-option>
+          <el-option label="已锁定" value="Y"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.userName" placeholder="输入用户名"></el-input>
+      </el-form-item>
+      <el-form-item label="">
+        <el-input v-model="formInline.userMobile" placeholder="输入手机号"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
+        <el-button type="primary" @click="handleunit()">部门设置</el-button>
+      </el-form-item>
+    </el-form>
+    <!--列表-->
+    <el-table @selection-change="selectChange" :data="userData" highlight-current-row v-loading="loading" border element-loading-text="拼命加载中" style="width: 100%;">
+      <el-table-column align="center" type="selection" width="50">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="deptName" label="公司" width="120">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="userName" label="用户名" width="120">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="userRealName" label="姓名" width="120">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="userMobile" label="手机号" width="120">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="userSex" label="性别" min-width="50">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="userEmail" label="邮件" min-width="120">
+      </el-table-column>
+      <el-table-column align="center" sortable prop="editTime" label="修改时间" min-width="120">
+        <template slot-scope="scope">
+          <div>{{scope.row.editTime|timestampToTime}}</div>
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" sortable prop="isLock" label="状态" min-width="50">
+        <template slot-scope="scope">
+          <el-switch v-model="scope.row.isLock=='N'?nshow:fshow" active-color="#13ce66" inactive-color="#ff4949" @change="editType(scope.$index, scope.row)">
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" min-width="300">
+        <template slot-scope="scope">
+          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+          <el-button size="mini" type="danger" @click="deleteUser(scope.$index, scope.row)">删除</el-button>
+          <el-button size="mini" type="success" @click="resetpwd(scope.$index, scope.row)">重置密码</el-button>
+          <el-button size="mini" type="success" @click="dataAccess(scope.$index, scope.row)">数据权限</el-button>
+          <el-button size="mini" type="success" @click="offlineUser(scope.$index, scope.row)">下线</el-button>
+          <el-button size="mini" type="success" @click="refreshCache(scope.$index, scope.row)">刷新缓存</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <Pagination v-bind:child-msg="pageparm" @callFather="callFather"></Pagination>
+    <!-- 编辑界面 -->
+    <el-dialog :title="title" :visible.sync="editFormVisible" width="30%" @click='closeDialog("edit")'>
+      <el-form label-width="80px" ref="editForm" :model="editForm" :rules="rules">
+        <el-form-item label="用户名" prop="userName">
+          <el-input v-model="editForm.userName" auto-complete="off" placeholder="请输入用户名"></el-input>
+        </el-form-item>
+        <el-form-item label="姓名" prop="userRealName">
+          <el-input v-model="editForm.userRealName" auto-complete="off" placeholder="请输入姓名"></el-input>
+        </el-form-item>
+        <el-form-item label="角色" prop="roleId">
+          <el-select v-model="editForm.roleId" placeholder="请选择" class="userRole">
+            <el-option label="公司管理员" value="1"></el-option>
+            <el-option label="普通用户" value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="手机号" prop="userMobile">
+          <el-input v-model="editForm.userMobile" placeholder="请输入手机号"></el-input>
+        </el-form-item>
+        <el-form-item label="邮件" prop="userEmail">
+          <el-input v-model="editForm.userEmail" placeholder="请输入邮箱地址"></el-input>
+        </el-form-item>
+        <el-form-item label="性别" prop="userSex">
+          <el-radio v-model="editForm.userSex" label="男">男</el-radio>
+          <el-radio v-model="editForm.userSex" label="女">女</el-radio>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click='closeDialog("edit")'>取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="submitForm('editForm')">保存</el-button>
+      </div>
+    </el-dialog>
+    <!-- 数据权限 -->
+    <el-dialog title="数据权限" :visible.sync="dataAccessshow" width="30%" @click='closeDialog("perm")'>
+      <el-tree ref="tree" default-expand-all="" :data="UserDept" :props="defaultProps" :default-checked-keys="checkmenu" node-key="id" show-checkbox>
+      </el-tree>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click='closeDialog("perm")'>取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="menuPermSave">保存</el-button>
+      </div>
+    </el-dialog>
+    <!-- 所属单位 -->
+    <el-dialog title="所属单位" :visible.sync="unitAccessshow" width="30%" @click='closeDialog("unit")'>
+      <el-tree ref="tree" default-expand-all="" :data="UserDept" :props="defaultProps" @check-change="handleClick" :default-checked-keys="checkmenu" node-key="id" show-checkbox check-strictly>
+      </el-tree>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click='closeDialog("unit")'>取消</el-button>
+        <el-button type="primary" :loading="loading" class="title" @click="unitPermSave">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// 导入请求方法
+import {
+  userList,
+  userSave,
+  userDelete,
+  userPwd,
+  userExpireToken,
+  userFlashCache,
+  userLock,
+  UserDeptTree,
+  UserDeptSave,
+  UserDeptdeptTree,
+  UserChangeDept
+} from '../../api/userMG'
+import Pagination from '../../components/Pagination'
+export default {
+  data() {
+    return {
+      nshow: true, //switch开启
+      fshow: false, //switch关闭
+      loading: false, //是显示加载
+      title: '添加用户',
+      editFormVisible: false, //控制编辑页面显示与隐藏
+      dataAccessshow: false, //控制数据权限显示与隐藏
+      unitAccessshow: false, //控制所属单位隐藏与显示
+      // 编辑与添加
+      editForm: {
+        userId: '',
+        userName: '',
+        userRealName: '',
+        roleId: '',
+        userMobile: '',
+        userEmail: '',
+        userSex: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 部门参数
+      unitparm: {
+        userIds: '',
+        deptId: '',
+        deptName: ''
+      },
+      // 选择数据
+      selectdata: [],
+      // rules表单验证
+      rules: {
+        userName: [
+          { required: true, message: '请输入用户名', trigger: 'blur' }
+        ],
+        userRealName: [
+          { required: true, message: '请输入姓名', trigger: 'blur' }
+        ],
+        roleId: [{ required: true, message: '请选择角色', trigger: 'blur' }],
+        userMobile: [
+          { required: true, message: '请输入手机号', trigger: 'blur' },
+          {
+            pattern: /^1(3\d|47|5((?!4)\d)|7(0|1|[6-8])|8\d)\d{8,8}$/,
+            required: true,
+            message: '请输入正确的手机号',
+            trigger: 'blur'
+          }
+        ],
+        userEmail: [
+          { required: true, message: '请输入邮箱', trigger: 'blur' },
+          {
+            pattern: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
+            required: true,
+            message: '请输入正确的邮箱',
+            trigger: 'blur'
+          }
+        ],
+        userSex: [{ required: true, message: '请选择性别', trigger: 'blur' }]
+      },
+      // 删除用户
+      seletedata: {
+        ids: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 重置密码
+      resetpsd: {
+        userId: '',
+        token: localStorage.getItem('logintoken')
+      },
+      // 用户下线
+      offline: {
+        token: localStorage.getItem('logintoken')
+      },
+      // 请求数据参数
+      formInline: {
+        page: 1,
+        limit: 10,
+        deptId: '',
+        userName: '',
+        userMobile: '',
+        isLock: ''
+      },
+      //用户数据
+      userData: [],
+      // 数据权限
+      UserDept: [],
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      // 选中
+      checkmenu: [],
+      //参数role
+      saveroleId: '',
+      // 分页参数
+      pageparm: {
+        currentPage: 1,
+        pageSize: 10,
+        total: 10
+      }
+    }
+  },
+  // 注册组件
+  components: {
+    Pagination
+  },
+
+  /**
+   * 数据发生改变
+   */
+  watch: {},
+
+  /**
+   * 创建完毕
+   */
+  created() {
+    this.getdata(this.formInline)
+  },
+
+  /**
+   * 里面的方法只有被调用才会执行
+   */
+  methods: {
+    // 获取数据方法
+    getdata(parameter) {
+      this.loading = true
+      // 获取用户列表
+      userList(parameter).then(res => {
+        this.loading = false
+        if (res.success == false) {
+          this.$message({
+            type: 'info',
+            message: res.msg
+          })
+        } else {
+          this.userData = res.data
+          // 分页赋值
+          this.pageparm.currentPage = this.formInline.page
+          this.pageparm.pageSize = this.formInline.limit
+          this.pageparm.total = res.count
+        }
+      })
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.page = parm.currentPage
+      this.formInline.limit = parm.pageSize
+      this.getdata(this.formInline)
+    },
+    //搜索事件
+    search() {
+      this.getdata(this.formInline)
+    },
+    // 修改type
+    editType: function(index, row) {
+      this.loading = true
+      let parm = {
+        lock: '',
+        userId: '',
+        token: localStorage.getItem('logintoken')
+      }
+      parm.userId = row.userId
+      let lock = row.isLock
+      if (lock == 'N') {
+        parm.lock = 'Y'
+      } else {
+        parm.lock = 'N'
+      }
+      // 修改状态
+      userLock(parm).then(res => {
+        this.loading = false
+        if (res.success == false) {
+          this.$message({
+            type: 'info',
+            message: res.msg
+          })
+        } else {
+          this.$message({
+            type: 'success',
+            message: '状态修改成功'
+          })
+          this.getdata(this.formInline)
+        }
+      })
+    },
+    //显示编辑界面
+    handleEdit: function(index, row) {
+      this.editFormVisible = true
+      if (row != undefined && row != 'undefined') {
+        this.title = '修改用户'
+        this.editForm.userId = row.userId
+        this.editForm.userName = row.userName
+        this.editForm.userRealName = row.userRealName
+        this.editForm.roleId = row.roleId
+        this.editForm.userMobile = row.userMobile
+        this.editForm.userEmail = row.userEmail
+        this.editForm.userSex = row.userSex
+      } else {
+        this.title = '添加用户'
+        this.editForm.userId = ''
+        this.editForm.userName = ''
+        this.editForm.userRealName = ''
+        this.editForm.roleId = ''
+        this.editForm.userMobile = ''
+        this.editForm.userEmail = ''
+        this.editForm.userSex = ''
+      }
+    },
+    // 编辑、添加提交方法
+    submitForm(editData) {
+      this.$refs[editData].validate(valid => {
+        if (valid) {
+          // 请求方法
+          userSave(this.editForm)
+            .then(res => {
+              this.editFormVisible = false
+              this.loading = false
+              if (res.success) {
+                this.getdata(this.formInline)
+                this.$message({
+                  type: 'success',
+                  message: '数据保存成功!'
+                })
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.editFormVisible = false
+              this.loading = false
+              this.$message.error('保存失败,请稍后再试!')
+            })
+        } else {
+          return false
+        }
+      })
+    },
+    // 显示部门设置
+    handleunit: function(index, row) {
+      this.unitAccessshow = true
+      let parms = 0
+      UserDeptdeptTree(parms)
+        .then(res => {
+          if (res.data.success) {
+            this.UserDept = this.changeArr(res.data.data)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('配置权限失败,请稍后再试!')
+        })
+    },
+    handleClick(data, checked, node) {
+        if(checked){
+            this.$refs.tree.setCheckedNodes([]);
+            this.$refs.tree.setCheckedNodes([data]);
+            this.unitparm.deptId = data.id
+            this.unitparm.deptName = data.name
+            //交叉点击节点
+        }else{
+                        
+        }
+    },
+    // 保存部门
+    unitPermSave() {
+      let len = this.selectdata
+      let ids = []
+      if (len != 0) {
+        for (let i = 0; i < len.length; i++) {
+          ids.push(len[i].userId)
+        }
+      }
+      this.unitparm.userIds = ids.join(',')
+      UserChangeDept(this.unitparm)
+        .then(res => {
+          this.unitAccessshow = false
+          if (res.success) {
+            this.$message({
+              type: 'success',
+              message: '部门设置成功!'
+            })
+            this.getdata(this.formInline)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('部门设置失败,请稍后再试!')
+        })
+    },
+    // 选择复选框事件
+    selectChange(val) {
+      this.selectdata = val
+    },
+    // 关闭编辑、增加弹出框
+    closeDialog(dialog) {
+      if (dialog == 'edit') {
+        this.editFormVisible = false
+      } else if (dialog == 'perm') {
+        this.dataAccessshow = false
+      } else if (dialog == 'unit') {
+        this.unitAccessshow = false
+      }
+    },
+    // 删除用户
+    deleteUser(index, row) {
+      this.$confirm('确定要删除吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          // 删除
+          userDelete(row.id)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '数据已删除!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('数据删除失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除!'
+          })
+        })
+    },
+    // 重置密码
+    resetpwd(index, row) {
+      this.resetpsd.userId = row.userId
+      this.$confirm('确定要重置密码吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          userPwd(this.resetpsd)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '重置密码成功!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('重置密码失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '取消重置密码!'
+          })
+        })
+    },
+    // 数据权限
+    dataAccess: function(index, row) {
+      this.dataAccessshow = true
+      this.saveroleId = row.userId
+      UserDeptTree(row.userId)
+        .then(res => {
+          if (res.data.success) {
+            this.checkmenu = this.changemenu(res.data.data)
+            this.UserDept = this.changeArr(res.data.data)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.data.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('获取权限失败,请稍后再试!')
+        })
+    },
+    //数据格式化
+    changeArr(data) {
+      var pos = {}
+      var tree = []
+      var i = 0
+      while (data.length != 0) {
+        if (data[i].pId == 0) {
+          tree.push({
+            id: data[i].id,
+            name: data[i].name,
+            pId: data[i].pId,
+            open: data[i].open,
+            checked: data[i].checked,
+            children: []
+          })
+          pos[data[i].id] = [tree.length - 1]
+          data.splice(i, 1)
+          i--
+        } else {
+          var posArr = pos[data[i].pId]
+          if (posArr != undefined) {
+            var obj = tree[posArr[0]]
+            for (var j = 1; j < posArr.length; j++) {
+              obj = obj.children[posArr[j]]
+            }
+
+            obj.children.push({
+              id: data[i].id,
+              name: data[i].name,
+              pId: data[i].pId,
+              open: data[i].open,
+              checked: data[i].checked,
+              children: []
+            })
+            pos[data[i].id] = posArr.concat([obj.children.length - 1])
+            data.splice(i, 1)
+            i--
+          }
+        }
+        i++
+        if (i > data.length - 1) {
+          i = 0
+        }
+      }
+      return tree
+    },
+    // 选中菜单
+    changemenu(arr) {
+      let change = []
+      for (let i = 0; i < arr.length; i++) {
+        if (arr[i].checked) {
+          change.push(arr[i].id)
+        }
+      }
+      return change
+    },
+    // 菜单权限-保存
+    menuPermSave() {
+      let parm = {
+        userId: this.saveroleId,
+        deptIds: ''
+      }
+      let node = this.$refs.tree.getCheckedNodes()
+      let moduleIds = []
+      if (node.length != 0) {
+        for (let i = 0; i < node.length; i++) {
+          moduleIds.push(node[i].id)
+        }
+        parm.deptIds = JSON.stringify(moduleIds)
+      }
+      UserDeptSave(parm)
+        .then(res => {
+          if (res.success) {
+            this.$message({
+              type: 'success',
+              message: '权限保存成功'
+            })
+            this.dataAccessshow = false
+            this.getdata(this.formInline)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('权限保存失败,请稍后再试!')
+        })
+    },
+    // 下线用户
+    offlineUser(index, row) {
+      this.$confirm('确定要让' + row.userName + '用户下线吗?', '信息', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          userExpireToken(row.userName)
+            .then(res => {
+              if (res.success) {
+                this.$message({
+                  type: 'success',
+                  message: '用户' + row.userName + '强制下线成功!'
+                })
+                this.getdata(this.formInline)
+              } else {
+                this.$message({
+                  type: 'info',
+                  message: res.msg
+                })
+              }
+            })
+            .catch(err => {
+              this.loading = false
+              this.$message.error('用户下线失败,请稍后再试!')
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消'
+          })
+        })
+    },
+    // 刷新缓存
+    refreshCache(index, row) {
+      userFlashCache(row.userName)
+        .then(res => {
+          if (res.success) {
+            this.$message({
+              type: 'success',
+              message: '刷新成功!'
+            })
+            this.getdata(this.formInline)
+          } else {
+            this.$message({
+              type: 'info',
+              message: res.msg
+            })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+          this.$message.error('刷新失败,请稍后再试!')
+        })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-search {
+  margin-top: 20px;
+}
+.userRole {
+  width: 100%;
+}
+</style>
+
+ 

+ 22 - 0
src/vuex/store.js

@@ -0,0 +1,22 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+
+Vue.use(Vuex);
+// 登录验证
+export default new Vuex.Store({
+    state: {
+        user: false
+    },
+    mutations: {
+        // 登录
+        login(state, user) {
+            state.user = user;
+            localStorage.setItem("userInfo", user);
+        },
+        // 退出
+        logout(state, user) {
+            state.user = "";
+            localStorage.setItem("userInfo", "");
+        }
+    }
+})

+ 0 - 0
static/.gitkeep


BIN
static/1.png


BIN
static/2.png


BIN
static/3.png


BIN
static/4.png


+ 24 - 0
页面路径.txt

@@ -0,0 +1,24 @@
+基础菜单
+  商品管理 goods/Goods
+  机器信息管理 machine/Machine
+  货道信息管理 machine/MachineAisle
+订单管理
+  交易订单 pay/Urder
+系统管理
+  用户管理 system/user
+  菜单管理 system/Module
+  角色管理 system/Role
+  公司管理 system/Dept
+  系统环境变量 system/variable
+  权限管理 system/permission
+支付管理
+  支付配置信息 machine/MachineConfig
+  支付配置 pay/Config
+数据监控
+  监控查询 druid/login
+
+
+
+
+问题
+  1、获取用户管理接口字段isLock