瀏覽代碼

更新项目配置

Rockery 3 年之前
父節點
當前提交
f32a7ec4a0
共有 58 個文件被更改,包括 1897 次插入265 次删除
  1. 1 0
      .env.development
  2. 1 0
      .env.production
  3. 1 0
      .env.staging
  4. 25 15
      .eslintrc.js
  5. 2 0
      .gitignore
  6. 1 1
      README.md
  7. 6 4
      package.json
  8. 二進制
      public/favicon.ico
  9. 1 0
      src/assets/icons/svg/homeicon.svg
  10. 1 0
      src/assets/icons/svg/partybuild.svg
  11. 1 0
      src/assets/icons/svg/partydevelop.svg
  12. 1 0
      src/assets/icons/svg/partyillustrate.svg
  13. 1 0
      src/assets/icons/svg/partyorgrelate.svg
  14. 1 0
      src/assets/icons/svg/partyuser.svg
  15. 二進制
      src/assets/images/profile.jpg
  16. 二進制
      src/assets/logo/logo.png
  17. 299 0
      src/assets/styles/cust-global.scss
  18. 145 0
      src/components/CheckboxMultipleSelect/index.vue
  19. 261 0
      src/components/CommonFilterSelectTree/index.vue
  20. 284 0
      src/components/CommonFilterSelectTreeMainpage/index.vue
  21. 419 0
      src/components/CustPaginationSelect/index.vue
  22. 4 3
      src/components/Editor/index.vue
  23. 2 2
      src/components/FileUpload/index.vue
  24. 3 3
      src/components/ImageUpload/index.vue
  25. 1 0
      src/layout/components/AppMain.vue
  26. 0 9
      src/layout/components/Navbar.vue
  27. 50 33
      src/main.js
  28. 1 1
      src/router/index.js
  29. 1 0
      src/store/getters.js
  30. 9 6
      src/store/modules/app.js
  31. 3 2
      src/store/modules/settings.js
  32. 2 2
      src/utils/auth.js
  33. 58 0
      src/utils/exportexcel.js
  34. 1 0
      src/utils/jsonlint.js
  35. 16 2
      src/utils/request.js
  36. 42 0
      src/utils/rockeryutil.js
  37. 24 15
      src/views/login.vue
  38. 25 21
      src/views/system/config/index.vue
  39. 12 8
      src/views/system/dept/index.vue
  40. 22 18
      src/views/system/dict/data.vue
  41. 27 23
      src/views/system/dict/index.vue
  42. 14 10
      src/views/system/logininfor/index.vue
  43. 21 11
      src/views/system/menu/index.vue
  44. 9 5
      src/views/system/notice/index.vue
  45. 10 6
      src/views/system/operlog/index.vue
  46. 10 6
      src/views/system/post/index.vue
  47. 16 12
      src/views/system/role/index.vue
  48. 24 18
      src/views/system/user/index.vue
  49. 1 1
      src/views/system/user/profile/resetPwd.vue
  50. 2 2
      src/views/system/user/profile/userAvatar.vue
  51. 1 1
      src/views/system/user/profile/userInfo.vue
  52. 1 1
      src/views/tool/build/IconsDialog.vue
  53. 11 11
      src/views/tool/build/RightPanel.vue
  54. 1 1
      src/views/tool/build/TreeNodeDialog.vue
  55. 5 5
      src/views/tool/gen/basicInfoForm.vue
  56. 2 2
      src/views/tool/gen/editTable.vue
  57. 14 4
      src/views/tool/gen/index.vue
  58. 1 1
      vue.config.js

+ 1 - 0
.env.development

@@ -3,6 +3,7 @@ ENV = 'development'
 
 # 智慧党建管理系统/开发环境
 VUE_APP_BASE_API = '/party-dev-api'
+VUE_APP_PROJECT_KEY = 'PartyConstruct_Devops'
 
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 0
.env.production

@@ -3,3 +3,4 @@ ENV = 'production'
 
 # 智慧党建管理系统/生产环境
 VUE_APP_BASE_API = '/party-prod-api'
+VUE_APP_PROJECT_KEY = 'PartyConstruct_Prod'

+ 1 - 0
.env.staging

@@ -5,3 +5,4 @@ ENV = 'staging'
 
 # 智慧党建管理系统/测试环境
 VUE_APP_BASE_API = '/party-stage-api'
+VUE_APP_PROJECT_KEY = 'PartyConstruct_Stage'

+ 25 - 15
.eslintrc.js

@@ -8,24 +8,24 @@ module.exports = {
   env: {
     browser: true,
     node: true,
-    es6: true,
+    es6: true
   },
   extends: ['plugin:vue/recommended', 'eslint:recommended'],
 
   // add your custom rules here
-  //it is base on https://github.com/vuejs/eslint-config-vue
+  // it is base on https://github.com/vuejs/eslint-config-vue
   rules: {
-    "vue/max-attributes-per-line": [2, {
-      "singleline": 10,
-      "multiline": {
-        "max": 1,
-        "allowFirstLine": false
+    'vue/max-attributes-per-line': [2, {
+      'singleline': 10,
+      'multiline': {
+        'max': 1,
+        'allowFirstLine': false
       }
     }],
-    "vue/singleline-html-element-content-newline": "off",
-    "vue/multiline-html-element-content-newline":"off",
-    "vue/name-property-casing": ["error", "PascalCase"],
-    "vue/no-v-html": "off",
+    'vue/singleline-html-element-content-newline': 'off',
+    'vue/multiline-html-element-content-newline': 'off',
+    'vue/name-property-casing': ['error', 'PascalCase'],
+    'vue/no-v-html': 'off',
     'accessor-pairs': 2,
     'arrow-spacing': [2, {
       'before': true,
@@ -48,7 +48,7 @@ module.exports = {
     'curly': [2, 'multi-line'],
     'dot-location': [2, 'property'],
     'eol-last': 2,
-    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
     'generator-star-spacing': [2, {
       'before': true,
       'after': true
@@ -167,7 +167,8 @@ module.exports = {
       'avoidEscape': true,
       'allowTemplateLiterals': true
     }],
-    'semi': [2, 'never'],
+    // 'semi': [2, 'never'],
+    'semi': ['error', 'always'],
     'semi-spacing': [2, {
       'before': false,
       'after': true
@@ -194,6 +195,15 @@ module.exports = {
     'object-curly-spacing': [2, 'always', {
       objectsInObjects: false
     }],
-    'array-bracket-spacing': [2, 'never']
+    'array-bracket-spacing': [2, 'never'],
+    'vue/html-self-closing': ['error', {
+      'html': {
+        'void': 'always',
+        'normal': 'never',
+        'component': 'always'
+      },
+      'svg': 'always',
+      'math': 'always'
+    }]
   }
-}
+};

+ 2 - 0
.gitignore

@@ -1,6 +1,8 @@
 .DS_Store
 node_modules/
 dist/
+dist-staging/
+
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*

+ 1 - 1
README.md

@@ -5,7 +5,7 @@
 git clone http://172.16.90.201:3000/party_construct/party_construct_web.git
 
 # 进入项目目录
-cd ruoyi-ui
+cd party_construct_web
 
 # 安装依赖
 npm install

+ 6 - 4
package.json

@@ -1,8 +1,8 @@
 {
-  "name": "ruoyi",
+  "name": "party_construct_web",
   "version": "2.5.0",
   "description": "智慧党建管理系统",
-  "author": "Rockery",
+  "author": "future",
   "license": "MIT",
   "scripts": {
     "dev": "vue-cli-service serve",
@@ -37,11 +37,11 @@
   },
   "dependencies": {
     "@riophae/vue-treeselect": "0.4.0",
-    "axios": "^0.21.1",
+    "axios": "0.21.1",
     "clipboard": "2.0.6",
     "core-js": "3.8.1",
     "echarts": "4.9.0",
-    "element-ui": "2.15.0",
+    "element-ui": "2.15.1",
     "file-saver": "2.0.4",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
@@ -49,9 +49,11 @@
     "js-cookie": "2.2.1",
     "jsencrypt": "3.0.0-rc.1",
     "nprogress": "0.2.0",
+    "qrcodejs2": "0.0.2",
     "quill": "1.3.7",
     "screenfull": "5.0.2",
     "sortablejs": "1.10.2",
+    "v-viewer": "1.5.1",
     "vue": "2.6.12",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",

二進制
public/favicon.ico


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/homeicon.svg


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/partybuild.svg


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/partydevelop.svg


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/partyillustrate.svg


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/partyorgrelate.svg


文件差異過大導致無法顯示
+ 1 - 0
src/assets/icons/svg/partyuser.svg


二進制
src/assets/images/profile.jpg


二進制
src/assets/logo/logo.png


+ 299 - 0
src/assets/styles/cust-global.scss

@@ -0,0 +1,299 @@
+/**
+ * 定制全局公共 css
+ * Copyright (c) 2016~2021 Rockery(1113269755@qq.com)
+ */
+
+.mt15 {
+  margin-top: 15px;
+}
+
+.ml10 {
+  margin-left: 10px;
+}
+
+.ml20 {
+  margin-left: 20px;
+}
+
+.mr20 {
+  margin-right: 20px;
+}
+
+.pdr20 {
+  padding-right: 20px;
+}
+
+.pdl20 {
+  padding-left: 20px;
+}
+
+.brad-10{
+  border-radius: 10px;
+}
+
+.el-scrollbar .svg-icon,
+.app-menu .svg-icon,
+.el-menu--vertical > .el-menu .svg-icon {
+  width: 2em !important;
+  height: 1.5em !important;
+}
+
+.app-container {
+  padding: 15px;
+
+  .commonfilterselecttreemainpage {
+    .cfstreepage-container {
+      &-left {
+        margin: 0 !important;
+        overflow: hidden;
+      }
+
+      &-right {
+        padding: 0 0 0 10px !important;
+      }
+
+      &-rightdefault {
+        padding: 0 !important;
+      }
+
+      &-switch {
+        &-leftbtn {
+          left: 258px !important;
+        }
+
+        &-rightbtn {
+          left: 5px !important;
+        }
+      }
+    }
+  }
+
+  &-headtree {
+    padding: 5px;
+    background: #ffffff;
+    border-radius: 10px;
+  }
+
+  &-queryform {
+    padding: 10px;
+    background: #ffffff;
+    border-radius: 10px;
+
+    .el-form {
+      .el-form-item {
+        margin-bottom: 16px;
+
+        .el-form-item__content {
+          .el-form-item__error {
+            padding-top: 1px;
+          }
+        }
+      }
+    }
+  }
+
+  &-main {
+    padding: 10px 15px 15px;
+    background: #ffffff;
+    border-radius: 10px;
+    min-height: calc(100vh - 198px);
+
+    .cust-spanlink {
+      color: #337ab7;
+      text-decoration: none;
+      cursor: pointer;
+
+      &:hover {
+        color: #409eff;
+        text-decoration: underline;
+      }
+    }
+
+    .cust-operategroup {
+      .cust-editbtn {
+        color: #13ce66;
+      }
+
+      .cust-viewbtn {
+        color: #909399;
+      }
+
+      .cust-deletebtn {
+        color: #ff4949;
+      }
+
+      .cust-resetpassword {
+        color: #ffba00;
+      }
+
+      .cust-primarybtn {
+        color: #1890ff;
+      }
+
+      .cust-defaultbtn {
+        color: #606266;
+      }
+    }
+  }
+}
+
+.custdialog-add {
+  .el-dialog__header {
+    border-bottom: 1px solid #dfe4ed;
+  }
+
+  .el-dialog__body {
+    padding: 20px;
+
+    .el-form {
+      .el-form-item {
+        margin-bottom: 18px;
+
+        .el-form-item__content {
+          .el-select {
+            width: 100%;
+          }
+        }
+      }
+
+      .form-item-remark {
+        margin-bottom: 5px;
+      }
+
+      .form-item-radiogroup {
+        margin-bottom: 12px;
+
+        .el-form-item__error {
+          padding-top: 0;
+        }
+      }
+    }
+
+    .custdialog-add-divider {
+      margin: 14px 0;
+    }
+  }
+}
+
+.custdialog-view {
+  .el-dialog__header {
+    border-bottom: 1px solid #dfe4ed;
+  }
+
+  .el-dialog__body {
+    padding: 20px 10px 30px 10px;
+  }
+
+  &-form {
+    .el-form-item {
+      margin-bottom: 5px;
+    }
+
+    .el-form-item--medium .el-form-item__label {
+      border: 1px solid #dfe4ed;
+      background-color: #f5f7fa;
+      border-radius: 4px 0px 0px 4px;
+    }
+
+    .el-input.is-disabled .el-input__inner {
+      background-color: #ffffff;
+      color: #606266;
+      cursor: text;
+      height: 38px;
+      line-height: 38px;
+      border-radius: 0px 4px 4px 0px;
+    }
+
+    .el-textarea.is-disabled .el-textarea__inner {
+      background-color: #ffffff;
+      color: #606266;
+      cursor: text;
+      border-radius: 0px 4px 4px 0px;
+    }
+  }
+}
+
+.amap-dialog {
+  .el-dialog__body {
+    min-height: 600px;
+  }
+}
+
+.custdialog-recordview {
+  .el-dialog__body {
+    padding: 5px 10px 30px 10px;
+  }
+}
+
+.paginationselect-select {
+  .el-scrollbar {
+    .el-scrollbar__wrap {
+      max-height: 460px;
+    }
+  }
+}
+
+.paginationselect-noquery {
+  .el-scrollbar {
+    .el-scrollbar__wrap {
+      max-height: 300px;
+    }
+  }
+}
+
+.details-container {
+  &-form {
+    .el-form-item {
+      margin-bottom: 5px;
+    }
+
+    .el-form-item--medium .el-form-item__label {
+      border: 1px solid #dfe4ed;
+      background-color: #f5f7fa;
+      border-radius: 4px 0px 0px 4px;
+    }
+
+    .el-input.is-disabled .el-input__inner {
+      background-color: #ffffff;
+      color: #606266;
+      cursor: text;
+      height: 38px;
+      line-height: 38px;
+      border-radius: 0px 4px 4px 0px;
+    }
+
+    .el-textarea.is-disabled .el-textarea__inner {
+      background-color: #ffffff;
+      color: #606266;
+      cursor: text;
+      border-radius: 0px 4px 4px 0px;
+    }
+  }
+}
+
+.statistical-total {
+  line-height: 25px;
+  span {
+    color: #ffba00;
+  }
+}
+
+.statements-total {
+  line-height: 25px;
+  span {
+    color: #ffba00;
+  }
+
+  .statements-all {
+    color: #409eff;
+  }
+}
+
+.operationalanalysis-tab-pane {
+  min-height: 630px;
+
+  &-nodata {
+    text-align: center;
+    color: #909399;
+  }
+}

+ 145 - 0
src/components/CheckboxMultipleSelect/index.vue

@@ -0,0 +1,145 @@
+<!--
+ * @Description: 带多选按钮的多选下拉框
+ * @Author: Rockery
+ * @Date: 2021-06-21 09:54:49
+ * @LastEditors: Rockery
+ * @LastEditTime: 2021-07-15 08:51:45
+ * @FilePath: \pc_web\src\components\CheckboxMultipleSelect\index.vue
+ * @Copyright: Copyright (c) 2016~2021 Rockery(1113269755@qq.com)
+-->
+
+<template>
+  <el-select
+    v-model="selectValues"
+    v-bind="$attrs"
+    :size="size"
+    multiple
+    :filterable="filterable"
+    :clearable="clearable"
+    :collapse-tags="collapseTags"
+    placeholder="请选择"
+    style="width: 50%;"
+    @change="changeSelect"
+  >
+    <el-option v-if="options.length" label="全选" value="全选">
+      <el-checkbox v-model="isSelectAll" @click.prevent.native>全选</el-checkbox>
+    </el-option>
+    <el-option
+      v-for="item in options"
+      :key="item[props.value]"
+      :label="item[props.label]"
+      :value="item[props.value]"
+    >
+      <el-checkbox v-model="item.isCheck" @click.prevent.native>{{item[props.label]}}</el-checkbox>
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+export default {
+  name: "MultipleSelect",
+  inheritAttrs: false,
+  model: {
+    prop: "initSelectValues",
+    event: "change"
+  },
+  props: {
+    initSelectValues: {
+      type: Array,
+      default: () => []
+    },
+    // 下拉选项
+    options: {
+      type: Array,
+      default: () => []
+    },
+    // 选项键值对
+    props: {
+      type: Object,
+      default: () => {
+        return {
+          label: "label",
+          value: "value"
+        }
+      }
+    },
+    filterable: {
+      type: Boolean,
+      default: true
+    },
+    clearable: {
+      type: Boolean,
+      default: true
+    },
+    collapseTags: {
+      type: Boolean,
+      default: true
+    },
+    size: {
+      type: String,
+      default: 'small'
+    }
+  },
+  data() {
+    return {
+      selectValues: [],
+      isSelectAll: false
+    }
+  },
+  watch: {
+    // 监听(全选,全不选以及checkbox是否勾选)
+    selectValues: {
+      handler(arr) {
+        this.options.forEach(item => {
+          if (arr.includes(item[this.props.value])) {
+            item.isCheck = true;
+          } else {
+            item.isCheck = false;
+          }
+        });
+
+        if (arr.length === this.options.length) {
+          this.isSelectAll = true;
+        } else {
+          this.isSelectAll = false;
+        }
+        // 强制更新(checkbox回显)
+        this.$forceUpdate();
+      }
+    },
+    initSelectValues(newVal, oldVal){
+      this.selectValues = this.initSelectValues;
+    }
+  },
+  created() {
+    // 回显
+    this.selectValues = this.initSelectValues;
+  },
+  methods: {
+    changeSelect(val) {
+      let currentChangSelect = [];
+      if (val.includes("全选")) {
+        // 说明已经全选了,所以全不选
+        if (val.length > this.options.length) {
+          this.selectValues = [];
+          currentChangSelect = [];
+        } else {
+          this.selectValues = this.options.map(item => item[this.props.value]);
+          currentChangSelect = this.options;
+        }
+      }else{
+        for(let valIndex = 0; valIndex < val.length; valIndex++){
+          for(let optIndex = 0; optIndex < this.options.length; optIndex++){
+            if (val[valIndex] == this.options[optIndex][this.props.value]){
+              currentChangSelect.push(this.options[optIndex]);
+              break;
+            }
+          }
+        }
+      }
+      this.$emit("change", this.selectValues);
+      this.$emit("all-change", currentChangSelect);
+    }
+  }
+}
+</script>

+ 261 - 0
src/components/CommonFilterSelectTree/index.vue

@@ -0,0 +1,261 @@
+<!--
+ * @Tite: 树形控件
+ * @Des: 带关键字过滤功能树形控件的组件
+ * @Author: Rockery <1113269755@qq.com>
+-->
+
+<template>
+  <div class="commonfilterselecttree" v-loading="loading">
+    <el-row :gutter="10" class="cfstree-row">
+      <el-col :span="24" class="mt10 mb20 cfstree-filtertext">
+        <el-input
+          v-model="filterText"
+          placeholder="请输入关键字进行过滤"
+          clearable
+          size="small"
+          style="text-align: center;"
+        >
+          <i slot="suffix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+      </el-col>
+
+      <el-col :span="24" class="cfstree-tree">
+        <el-tree
+          class="filter-tree cfstree-row-tree"
+          :data="currentTreeData"
+          :props="defaultProps"
+          :lazy="isTreeLazy"
+          :load="handleLoadNode"
+          :node-key="treeNodeKey"
+          :highlight-current="true"
+          :default-expanded-keys="defaultExpandedKeys"
+          :filter-node-method="filterNodeMethod"
+          ref="custFilterSelectTreeRef"
+          @node-click="handleNodeClick"
+        ></el-tree>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'CommonFilterSelectTree',
+  props: {
+    // 树形控件数据对象
+    treeData: {
+      required: false,
+      type: Array,
+      default() {
+        return [{
+          id: '0001',
+          label: '一级 1',
+          children: [{
+            id: '00010001',
+            label: '二级 1-1',
+            children: [{
+              id: '000100010001',
+              label: '三级 1-1-1'
+            }]
+          }]
+        }, {
+          id: '0002',
+          label: '一级 2',
+          children: [{
+            id: '00020001',
+            label: '二级 2-1',
+            children: [{
+              id: '000200010001',
+              label: '三级 2-1-1'
+            }]
+          }, {
+            id: '00020002',
+            label: '二级 2-2',
+            children: [{
+              id: '000200020001',
+              label: '三级 2-2-1'
+            }]
+          }]
+        }, {
+          id: '0003',
+          label: '一级 3',
+          children: [{
+            id: '00030001',
+            label: '二级 3-1',
+            children: [{
+              id: '00030002',
+              label: '三级 3-1-1'
+            }]
+          }, {
+            id: '00030002',
+            label: '二级 3-2',
+            children: [{
+              id: '000300020001',
+              label: '三级 3-2-1'
+            }]
+          }]
+        }];
+      }
+    },
+    // 树形控件默认属性
+    defaultProps: {
+      required: false,
+      type: Object,
+      default() {
+        return {
+          children: 'children',
+          label: 'label',
+          isLeaf: 'leaf'
+        };
+      }
+    },
+    // 树形控件节点标识
+    treeNodeKey: {
+      required: false,
+      type: String,
+      default: 'id'
+    },
+    // 树形控件过滤字段标识
+    filterKeyWord: {
+      required: false,
+      type: String,
+      default: 'label'
+    },
+    // 树形控件默认展开节点标识
+    defaultExpandedKeys: {
+      required: false,
+      type: Array,
+      default() {
+        return [];
+      }
+    },
+    // 是否懒加载
+    isTreeLazy: {
+      required: false,
+      type: Boolean,
+      default: false
+    },
+    // 懒加载数据请求方法
+    treeLazyRequstFun: {
+      type: Function,
+      require: false
+    },
+    /**
+    * 懒加载数据请求参数Key值
+    * @key 参数属性
+    * @value 参数取值属性
+    */
+    treeLazyRequstParam: {
+      type: Array,
+      require: false,
+      default() {
+        return [
+          {
+            key: 'parentId',
+            value: 'id'
+          }
+        ];
+      }
+    }
+  },
+  data() {
+    return {
+      loading: true,
+      filterText: '',
+      handleLoadNodeTimeout: null
+    };
+  },
+  computed: {
+    // 当前树形控件数据
+    currentTreeData: {
+      get() {
+        return this.treeData;
+      },
+      set(value) {
+        this.$emit('update:treeData', value);
+      }
+    },
+  },
+  watch: {
+    filterText(val) {
+      this.$refs.custFilterSelectTreeRef?.filter?.(val);
+    }
+  },
+  methods: {
+    /** 过滤节点数据 */
+    filterNodeMethod(value, data) {
+      if (!value) return true;
+      return data[this.filterKeyWord].indexOf(value) !== -1;
+    },
+    /** 选择树形控件节点操作 */
+    handleNodeClick(value) {
+      this.$emit('selectTreeNodeClick', value);
+    },
+    handleLoadNode(node, resolve) {
+      this.loading = true;
+      // 判断是否为懒加载操作
+      if (!this.isTreeLazy) return resolve([]);
+
+      // 判断懒加载请求方法是否存在
+      if (!this.treeLazyRequstFun) {
+        this.msgWarning('Sorry,懒加载请求方法不在!');
+        return resolve([]);
+      }
+
+      // 获取当前节点数据
+      let currNodeDataObj = node?.data ?? '';
+
+      // 如果当前节点数据不存在返回空
+      if (!currNodeDataObj) {
+        return resolve([]);
+      }
+
+      this.handleLoadNodeTimeout = setTimeout(() => {
+        // 组装请求参数
+        let treeLazyReqObj = {};
+        for (let item of this.treeLazyRequstParam) {
+          treeLazyReqObj[item?.key] = currNodeDataObj[item?.value];
+        }
+
+        // 获取懒加载请求数据
+        this.treeLazyRequstFun(treeLazyReqObj).then(
+          response => {
+            resolve(response?.data || []);
+            this.closeHandleLoadNodeTimeout();
+            this.loading = false;
+          }
+        ).catch(() => {
+          resolve([]);
+          this.closeHandleLoadNodeTimeout();
+          this.loading = false;
+        });
+      }, 300);
+    },
+    closeHandleLoadNodeTimeout() {
+      this.handleLoadNodeTimeout != null && clearTimeout(this.handleLoadNodeTimeout);
+    }
+  },
+  beforeDestroy() {
+    this.closeHandleLoadNodeTimeout();
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.commonfilterselecttree {
+  background: #fff;
+  .cfstree-row {
+    margin: 0 !important;
+
+    &-tree {
+      height: calc(100vh - 220px);
+      overflow-y: auto;
+      margin-bottom: -17px;
+      margin-right: -17px;
+      overflow-x: hidden;
+      /* border: 1px solid #dcdfe6; */
+    }
+  }
+}
+</style>

+ 284 - 0
src/components/CommonFilterSelectTreeMainpage/index.vue

@@ -0,0 +1,284 @@
+<!--
+ * @Tite: 带关键字过滤树形控件的交互类组件
+ * @Des: 拥有可以通过关键字过滤的树形控件和交互功能的组件
+ * @Author: Rockery <1113269755@qq.com>
+-->
+
+<template>
+  <div class="commonfilterselecttreemainpage">
+    <el-container class="cfstreepage-container">
+      <!-- 顶部插槽 -->
+      <slot name="bottomHeader" />
+
+      <!-- 左侧带关键字过滤功能树形控件区域 -->
+      <el-aside class="cfstreepage-container-left" v-show="showCotaampLeftCont">
+        <!-- 左侧顶部插槽 -->
+        <slot name="leftHeader" />
+        <cust-filter-select-tree
+          ref="filterSelectTreeRef"
+          :tree-data="selectTreeDataList"
+          :isTreeLazy="isSelectTreeLazy"
+          :defaultProps="selectTreeDefaultProps"
+          :treeNodeKey="selectTreeNodeKey"
+          :treeLazyRequstParam="selectTreeLazyRequstParam"
+          :treeLazyRequstFun="selectTreeLazyRequstFun"
+          :filterKeyWord="selectTreeFilterKeyWord"
+          :defaultExpandedKeys="isDefaultExpanded ? getDefaultExpandedKeys() : []"
+          @selectTreeNodeClick="selectTreeNodeClick"
+        />
+
+        <!-- 左侧底部部插槽 -->
+        <slot name="leftBottom" />
+      </el-aside>
+
+      <!-- 列表区域 -->
+      <el-main
+        class="cfstreepage-container-right"
+        :class="showCotaampSwitchRightBtn?'cfstreepage-container-rightdefault':''"
+      >
+        <!-- 数据区域插槽 -->
+        <slot name="rightContainer" />
+      </el-main>
+
+      <!-- 底部部插槽 -->
+      <slot name="bottomContainer" />
+
+      <!-- 隐藏左侧带关键字过滤功能树形控件 -->
+      <div class="cfstreepage-container-switch">
+        <el-tooltip content="隐藏左侧控件" effect="dark" placement="bottom">
+          <i
+            v-show="showCotaampSwitchLeftBtn"
+            class="el-icon-d-arrow-left cfstreepage-container-switch-leftbtn"
+            @click="classHouseSwitchLeftBtn"
+          />
+        </el-tooltip>
+        <el-tooltip content="显示左侧控件" effect="dark" placement="bottom">
+          <i
+            v-show="showCotaampSwitchRightBtn"
+            class="el-icon-d-arrow-right cfstreepage-container-switch-rightbtn"
+            @click="classHouseSwitchRightBtn"
+          />
+        </el-tooltip>
+      </div>
+    </el-container>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'CommonFilterSelectTreeMainpage',
+  props: {
+    // 树形控件数据对象
+    selectTreeDataList: {
+      required: false,
+      type: Array,
+      default() {
+        return [{
+          id: '0001',
+          label: '一级 1',
+          children: [{
+            id: '00010001',
+            label: '二级 1-1',
+            children: [{
+              id: '000100010001',
+              label: '三级 1-1-1'
+            }]
+          }]
+        }, {
+          id: '0002',
+          label: '一级 2',
+          children: [{
+            id: '00020001',
+            label: '二级 2-1',
+            children: [{
+              id: '000200010001',
+              label: '三级 2-1-1'
+            }]
+          }, {
+            id: '00020002',
+            label: '二级 2-2',
+            children: [{
+              id: '000200020001',
+              label: '三级 2-2-1'
+            }]
+          }]
+        }, {
+          id: '0003',
+          label: '一级 3',
+          children: [{
+            id: '00030001',
+            label: '二级 3-1',
+            children: [{
+              id: '00030002',
+              label: '三级 3-1-1'
+            }]
+          }, {
+            id: '00030002',
+            label: '二级 3-2',
+            children: [{
+              id: '000300020001',
+              label: '三级 3-2-1'
+            }]
+          }]
+        }];
+      }
+    },
+    // 树形控件默认属性
+    selectTreeDefaultProps: {
+      required: false,
+      type: Object,
+      default() {
+        return {
+          children: 'children',
+          label: 'label',
+          isLeaf: 'leaf'
+        };
+      }
+    },
+    // 树形控件节点标识
+    selectTreeNodeKey: {
+      required: false,
+      type: String,
+      default: 'id'
+    },
+    // 树形控件过滤字段标识
+    selectTreeFilterKeyWord: {
+      required: false,
+      type: String,
+      default: 'label'
+    },
+    // 是否默认展开
+    isDefaultExpanded: {
+      required: false,
+      type: Boolean,
+      default: false
+    },
+    // 是否懒加载
+    isSelectTreeLazy: {
+      required: false,
+      type: Boolean,
+      default: false
+    },
+    // 懒加载数据请求方法
+    selectTreeLazyRequstFun: {
+      type: Function,
+      require: false
+    },
+    // 懒加载数据请求参数Key值
+    selectTreeLazyRequstParam: {
+      type: Array,
+      require: false,
+      default() {
+        return [
+          {
+            key: 'parentId',
+            value: 'id'
+          }
+        ];
+      }
+    }
+  },
+  data() {
+    return {
+      // 是否显示左侧带关键字过滤功能树形控件
+      showCotaampLeftCont: true,
+      // 是否隐藏左侧带关键字过滤功能树形控件
+      showCotaampSwitchLeftBtn: true,
+      // 是否展示左侧带关键字过滤功能树形控件
+      showCotaampSwitchRightBtn: false
+    };
+  },
+  components: {
+    CustFilterSelectTree: () => import('@/components/CommonFilterSelectTree') // 树形控件
+  },
+  methods: {
+    /** 获取树形控件默认展开唯一标识key */
+    getDefaultExpandedKeys() {
+      for (let dataIndex = 0, dataLength = this.selectTreeDataList?.length ?? 0; dataIndex < dataLength; dataIndex++) {
+        this.selectTreeExpandedKeys.push(this.selectTreeDataList[dataIndex][this.selectTreeNodeKey]);
+      }
+    },
+    /**
+    * 带关键字过滤功能树形控件选择节点数据
+    * @param {Object} nodeObj
+    * @return void
+    * @emits {Object} commSelectTreeNodeClick
+    */
+    selectTreeNodeClick(nodeObj) {
+      // 发送节点选择数据通信
+      this.$emit('commSelectTreeNodeClick', nodeObj);
+    },
+    /**
+     * 隐藏左侧带关键字过滤功能树形控件
+     * @return void
+     * @emits {Object} switchShowLeftContainer
+    */
+    classHouseSwitchLeftBtn() {
+      this.showCotaampSwitchLeftBtn = false;
+      this.showCotaampSwitchRightBtn = true;
+      this.$nextTick(() => {
+        this.showCotaampLeftCont = false;
+        this.$emit('switchShowLeftContainer', 'LEFT');
+      });
+    },
+    /**
+     * 展示左侧带关键字过滤功能树形控件
+     * @return void
+     * @emits {Object} switchShowLeftContainer
+     */
+    classHouseSwitchRightBtn() {
+      this.showCotaampSwitchRightBtn = false;
+      this.showCotaampSwitchLeftBtn = true;
+      this.$nextTick(() => {
+        this.showCotaampLeftCont = true;
+        this.$emit('switchShowLeftContainer', 'RIGHT');
+      });
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.commonfilterselecttreemainpage {
+  width: 100%;
+
+  .cfstreepage-container {
+    width: 100%;
+
+    &-left {
+      background: #fff;
+      padding: 0;
+      width: 260px !important;
+      border-radius: 10px;
+      margin: 0 0 0 10px;
+    }
+
+    &-switch {
+      font-size: 28px;
+      cursor: pointer;
+      color: #1890ff;
+
+      &-leftbtn {
+        position: absolute;
+        top: 50%;
+        left: 260px;
+        cursor: pointer;
+      }
+
+      &-rightbtn {
+        position: absolute;
+        top: 50%;
+        left: 0;
+        cursor: pointer;
+      }
+    }
+
+    &-right {
+      padding: 0 10px;
+      width: auto;
+      /* background: #f5f5f5; */
+    }
+  }
+}
+</style>

+ 419 - 0
src/components/CustPaginationSelect/index.vue

@@ -0,0 +1,419 @@
+<!--
+ * @Tite: 支持分页远程搜索功能的[el-select]下拉框
+ * @Author: Rockery <1113269755@qq.com>
+-->
+
+<template>
+  <div class="paginationselect">
+    <el-select
+      v-model="selectModelValue"
+      ref="paginationSelectRef"
+      filterable
+      remote
+      :clearable="clearable"
+      reserve-keyword
+      :size="size"
+      style="width: 100%;"
+      :popper-class="purposeType != 'QUERY'?'paginationselect-select paginationselect-noquery':'paginationselect-select'"
+      placeholder="请选择路段或输入关键词搜索"
+      :remote-method="handleSelectRemoteMethod"
+      :loading="remoteLoading"
+      @change="handleSelectChange"
+      @visible-change="handleSelectVisibleChange"
+    >
+      <div class="paginationselect-currentselectoption">
+        <el-divider>选中选项</el-divider>
+        <el-option
+          :key="currentSelectOption.id"
+          :label="currentSelectOption.label"
+          remote
+          disabled
+          :value="currentSelectOption.value"
+          placeholder="当前选中值"
+        />
+      </div>
+
+      <el-option
+        v-for="item in selectOptiones"
+        :key="item.id || getComponentKey('OPTION_KEY-')"
+        :label="item.label"
+        remote
+        :value="item.value"
+        placeholder="请选择"
+      />
+
+      <el-pagination
+        v-show="total>0"
+        small
+        class="fr mt5 mb10"
+        :total="total"
+        @current-change="handleCurrentChange"
+        :current-page.sync="currentPage"
+        :page-size.sync="currentPageSize"
+        layout="total, prev, pager, next"
+      />
+    </el-select>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: "CustPaginationSelect",
+  props: {
+    // 向父组件传递查询参数数据
+    value: String,
+    // 远程查询方法
+    queryFun: {
+      type: Function,
+      require: true
+    },
+    // 父组件操作方式
+    parentOperationType: {
+      type: String,
+      require: false,
+      default: ''
+    },
+    // 下拉框大小
+    size: {
+      type: String,
+      require: false
+    },
+    // 起始页码
+    pageNum: {
+      type: Number,
+      default: 1
+    },
+    // 每一页目录条数
+    pageSize: {
+      type: Number,
+      default: 10
+    },
+    // 查询条件
+    queryConditions: {
+      required: false,
+      type: Object,
+      default: () => ({})
+    },
+    // 关键字
+    keywordField: {
+      type: String,
+      require: false,
+      default() {
+        return 'label';
+      }
+    },
+    // 选项对象属性
+    defaultProps: {
+      required: false,
+      type: Object,
+      default() {
+        return {
+          id: 'id',
+          value: 'value',
+          label: 'label'
+        };
+      }
+    },
+    // 应用类型
+    purposeType: {
+      type: String,
+      require: false,
+      default() {
+        return 'QUERY';
+      }
+    },
+    // 是否立即查询
+    isImmediatelyQuery: {
+      type: Boolean,
+      require: false,
+      default: true
+    },
+    // 是否设置默认值
+    isSetDefaultValue: {
+      type: Boolean,
+      require: false,
+      default: false
+    },
+    // 是否可以清空
+    clearable: {
+      type: Boolean,
+      require: false,
+      default: true
+    }
+  },
+  data() {
+    return {
+      // 当前选中选项
+      currentSelectOption: {},
+      // 远程搜索定时器
+      handleRemoteTimeout: null,
+      // 下拉框选项列表
+      selectOptiones: [],
+      // 是否正在从远程获取数据
+      remoteLoading: false,
+      // 列表查询入参
+      queryParams: {},
+      // 操作方式
+      operationType: '',
+      // 数据总数
+      total: 0
+    };
+  },
+  computed: {
+    // 组件绑定值
+    selectModelValue: {
+      get() {
+        return this.value;
+      },
+      set(value) {
+        this.$emit('input', value);
+      }
+    },
+    // 当前页码
+    currentPage: {
+      get() {
+        return this.pageNum;
+      },
+      set(val) {
+        this.$emit('update:pageNum', val);
+      }
+    },
+    // 当前每一页目录条数
+    currentPageSize: {
+      get() {
+        return this.pageSize;
+      },
+      set(val) {
+        this.$emit('update:pageSize', val);
+      }
+    },
+    // 查询条件
+    currentQueryConditions: {
+      get() {
+        return this.queryConditions;
+      },
+      set(val) {
+        this.$emit('update:queryConditions', val);
+      }
+    }
+  },
+  watch: {
+    value(newValue, oldValue) {
+      if (!this.operationType) {
+        this.parentOperationType != 'CANCEL' && this.initData(newValue);
+      } else {
+        this.parentOperationType != '';
+      }
+    },
+    isImmediatelyQuery() {
+      this.initData();
+    }
+  },
+  created() {
+    if (this.parentOperationType == 'EDIT') {
+      this.value && this.initData(this.value);
+    } else {
+      this.initData(this.value);
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    /** 初始化数据 */
+    initData(currModelValue) {
+      this.initCurrentOption(currModelValue);
+      this.assembleQueryParams();
+      if (this.isImmediatelyQuery) {
+        this.selectOptiones = [];
+        this.option = 0;
+        this.getOptiones();
+      }
+    },
+    /** 组装查询条件 */
+    assembleQueryParams() {
+      this.queryParams[this.keywordField] = '';
+      this.queryParams['pageNum'] = this.currentPage;
+      this.queryParams['pageSize'] = this.currentPageSize;
+      for (let item in this.currentQueryConditions) {
+        this.queryParams[item] = this.currentQueryConditions[item];
+      }
+    },
+    /** 初始化当前数据项 */
+    initCurrentOption(param) {
+      if (param) {
+        this.getCurrentOption(param);
+      } else {
+        this.currentSelectOption = { id: `curr_page_select_${new Date().getTime()}`, value: `curr_page_select_${new Date().getTime()}`, label: '暂无选中数据' };
+      }
+    },
+    /** 初始化拉框选项数据 */
+    initGetOptiones() {
+      // 开启加载状态
+      this.remoteLoading = true;
+      this.selectOptiones = [];
+      this.option = 0;
+      this.getOptiones();
+    },
+    /** 获取当前选中选项数据 */
+    getCurrentOption(param) {
+      let queryCurrReq = { pageNum: 1, pageSize: 2 };
+      queryCurrReq[this.defaultProps.value] = param;
+
+      this.queryFun(queryCurrReq).then(
+        response => {
+          let currentOptiones = (response?.rows || []).map((item, index) => {
+            return Object.assign({}, { id: `curr_page_select_${new Date().getTime()}`, value: item[this.defaultProps?.value], label: item[this.defaultProps?.label] });
+          });
+          this.currentSelectOption = (currentOptiones?.length > 0) ? currentOptiones[0] : { id: `curr_page_select_${new Date().getTime()}`, value: `curr_page_select_${new Date().getTime()}`, label: '暂无选中数据' };
+        }
+      );
+    },
+    /** 获取下拉框选项数据 */
+    getOptiones() {
+      // 通过查询条件远程获取选项
+      this.queryFun(this.queryParams).then( // 成功返回数据
+        response => {
+          // 定义是否含当前数据项标识
+          let isHasCurrentSelectOption = false;
+
+          // 处理返回数据
+          this.selectOptiones = (response?.rows || []).map((item, index) => {
+
+            // 组装新元素对象
+            let tempItemObj = Object.assign({}, { id: item[this.defaultProps.id], value: item[this.defaultProps.value], label: item[this.defaultProps.label] });
+
+            // 判断是否存在当前选项数据
+            if (!isHasCurrentSelectOption && tempItemObj.value == this.currentSelectOption?.value) {
+              isHasCurrentSelectOption = true;
+              this.currentSelectOption = { ...tempItemObj };
+            }
+
+            return tempItemObj;
+          });
+
+          // 如果存在当前数据,更改数据id
+          if (isHasCurrentSelectOption) {
+            this.currentSelectOption.id = `curr_page_select_${new Date().getTime()}`;
+          }
+
+          // 数目总条数
+          this.total = response?.total ?? 0;
+
+          if (this.isSetDefaultValue && !this.selectModelValue && this.selectOptiones?.length > 0) {
+            this.selectModelValue = this.selectOptiones?.[0]?.value;
+            this.$nextTick(() => {
+              this.$emit('component-rendering-complete', this.$refs.paginationSelectRef);
+            });
+          }
+
+          // 关闭加载状态
+          this.remoteLoading = false;
+
+          this.handleRemoteTimeout != null && clearTimeout(this.handleRemoteTimeout);
+        }
+      ).catch(() => { // 异常返回数据
+        this.selectOptiones = [];
+        this.total = 0;
+        this.remoteLoading = false;
+      });
+    },
+    /** 远程搜索方法 */
+    handleSelectRemoteMethod(query) {
+      // 更新操作方式
+      this.operationType = 'HANDLEREMOTEMETHOD';
+
+      // 绑定关键字查询条件
+      this.queryParams[this.keywordField] = query;
+      this.currentPage = 1;
+      this.queryParams.pageNum = 1;
+
+      // 开启加载状态
+      this.remoteLoading = true;
+
+      // 设置定时器
+      this.handleRemoteTimeout = setTimeout(() => {
+        this.selectOptiones = [];
+        this.option = 0;
+        this.getOptiones();
+      }, 500);
+    },
+    /** 分页当前页码改变操作 */
+    handleCurrentChange(val) {
+      // 更新操作方式
+      this.operationType = 'HANDLEREMOTEMETHOD';
+
+      // 设置当前页码
+      this.queryParams.pageNum = val;
+      this.currentPage = val;
+      this.initGetOptiones();
+    },
+    /** 选中值操作事件 */
+    handleSelectChange(val) {
+      // 更新操作方式
+      this.operationType = 'HANDLESELECTCHANGE';
+
+      // 处理选中数据
+      if (val) {
+        for (let index = 0; index < this.selectOptiones?.length; index++) {
+          if (val == this.selectOptiones[index]?.value) {
+            this.currentSelectOption = {
+              id: `curr_page_select_${new Date().getTime()}`,
+              value: this.selectOptiones[index]?.value,
+              label: this.selectOptiones[index]?.label
+            };
+            this.$emit('pagination-select-change', this.selectOptiones[index]);
+            break;
+          }
+        }
+      } else {
+        this.currentPage = 1;
+        this.queryParams.pageNum = 1;
+        this.queryParams[this.keywordField] = '';
+        this.currentSelectOption = { id: `curr_page_select_${new Date().getTime()}`, value: `curr_page_select_${new Date().getTime()}`, label: '暂无选中数据' };
+        this.selectOptiones = [];
+        this.option = 0;
+        this.getOptiones();
+      }
+      this.$emit('handleSelectChange', val)
+    },
+    handleSelectVisibleChange(val) {
+      if (this.isImmediatelyQuery && val) {
+        this.currentPage = 1;
+        this.queryParams.pageNum = 1;
+        this.queryParams[this.keywordField] = '';
+        this.selectOptiones = [];
+        this.option = 0;
+        this.getOptiones();
+      }
+    },
+    /** 获取随机唯一标识 */
+    getComponentKey(param) {
+      return `${param}${new Date().getTime()}_${this.option++}`
+    },
+  },
+  beforeDestroy() {
+    this.handleRemoteTimeout != null && clearTimeout(this.handleRemoteTimeout);
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.paginationselect {
+  &-currentselectoption {
+    border-bottom: 1px solid #e7eaec;
+
+    .el-divider--horizontal {
+      margin: 10px 0 !important;
+    }
+
+    .el-select-dropdown__item.selected {
+      font-size: 14px;
+      color: #c0c4cc;
+      cursor: text;
+      font-weight: normal;
+    }
+  }
+}
+</style>

+ 4 - 3
src/components/Editor/index.vue

@@ -143,9 +143,10 @@ export default {
         const html = this.$refs.editor.children[0].innerHTML;
         const text = this.Quill.getText();
         const quill = this.Quill;
-        this.currentValue = html;
-        this.$emit("input", html);
-        this.$emit("on-change", { html, text, quill });
+        const currentHtml = (('<p><br></p>' == html) ? undefined : html);
+        this.currentValue = currentHtml;
+        this.$emit("input", currentHtml);
+        this.$emit("on-change", { html: currentHtml, text, quill });
       });
       this.Quill.on("text-change", (delta, oldDelta, source) => {
         this.$emit("on-text-change", delta, oldDelta, source);

+ 2 - 2
src/components/FileUpload/index.vue

@@ -18,8 +18,8 @@
       <!-- 上传提示 -->
       <div class="el-upload__tip" slot="tip" v-if="showTip">
         请上传
-        <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
-        <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
+        <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c;">{{ fileSize }}MB</b> </template>
+        <template v-if="fileType"> 格式为 <b style="color: #f56c6c;">{{ fileType.join("/") }}</b> </template>
         的文件
       </div>
     </el-upload>

+ 3 - 3
src/components/ImageUpload/index.vue

@@ -9,7 +9,7 @@
       name="file"
       :show-file-list="false"
       :headers="headers"
-      style="display: inline-block; vertical-align: top"
+      style="display: inline-block; vertical-align: top;"
     >
       <el-image v-if="!value" :src="value">
         <div slot="error" class="image-slot">
@@ -17,7 +17,7 @@
         </div>
       </el-image>
       <div v-else class="image">
-        <el-image :src="value" :style="`width:150px;height:150px;`" fit="fill"/>
+        <el-image :src="value" style="width: 150px; height: 150px;" fit="fill" />
         <div class="mask">
           <div class="actions">
             <span title="预览" @click.stop="dialogVisible = true">
@@ -31,7 +31,7 @@
       </div>
     </el-upload>
     <el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body>
-      <img :src="value" style="display: block; max-width: 100%; margin: 0 auto;">
+      <img :src="value" style="display: block; max-width: 100%; margin: 0 auto;" />
     </el-dialog>
   </div>
 </template>

+ 1 - 0
src/layout/components/AppMain.vue

@@ -39,6 +39,7 @@ export default {
   .app-main {
     /* 84 = navbar + tags-view = 50 + 34 */
     min-height: calc(100vh - 84px);
+    background: #f2f2f2;
   }
 
   .fixed-header+.app-main {

+ 0 - 9
src/layout/components/Navbar.vue

@@ -8,15 +8,6 @@
     <div class="right-menu">
       <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item" />
-        
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
-          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
-          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
         <el-tooltip content="布局大小" effect="dark" placement="bottom">

+ 50 - 33
src/main.js

@@ -1,55 +1,72 @@
-import Vue from 'vue'
+import Vue from 'vue';
 
-import Cookies from 'js-cookie'
+import Cookies from 'js-cookie';
 
-import Element from 'element-ui'
-import './assets/styles/element-variables.scss'
+import Element from 'element-ui';
+import './assets/styles/element-variables.scss';
 
-import '@/assets/styles/index.scss' // global css
-import '@/assets/styles/ruoyi.scss' // ruoyi css
-import App from './App'
-import store from './store'
-import router from './router'
-import permission from './directive/permission'
-import { download } from '@/utils/request'
+import '@/assets/styles/index.scss'; // global css
+import '@/assets/styles/ruoyi.scss'; // ruoyi css
+import '@/assets/styles/cust-global.scss'; // 定制全局样式
+import App from './App';
+import store from './store';
+import router from './router';
+import permission from './directive/permission';
+import { download } from '@/utils/request';
 
-import './assets/icons' // icon
-import './permission' // permission control
+import './assets/icons'; // icon
+import './permission'; // permission control
 import { getDicts } from "@/api/system/dict/data";
 import { getConfigKey } from "@/api/system/config";
+import { getToken } from "@/utils/auth";
 import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+import { handleOpenLoading, handleCloseLoading } from "@/utils/rockeryutil";
+
+// 分页组件
 import Pagination from "@/components/Pagination";
 // 自定义表格工具扩展
-import RightToolbar from "@/components/RightToolbar"
+import RightToolbar from "@/components/RightToolbar";
 
 // 全局方法挂载
-Vue.prototype.getDicts = getDicts
-Vue.prototype.getConfigKey = getConfigKey
-Vue.prototype.parseTime = parseTime
-Vue.prototype.resetForm = resetForm
-Vue.prototype.addDateRange = addDateRange
-Vue.prototype.selectDictLabel = selectDictLabel
-Vue.prototype.selectDictLabels = selectDictLabels
-Vue.prototype.download = download
-Vue.prototype.handleTree = handleTree
+Vue.prototype.getDicts = getDicts;
+Vue.prototype.getConfigKey = getConfigKey;
+Vue.prototype.parseTime = parseTime;
+Vue.prototype.resetForm = resetForm;
+Vue.prototype.addDateRange = addDateRange;
+Vue.prototype.selectDictLabel = selectDictLabel;
+Vue.prototype.selectDictLabels = selectDictLabels;
+Vue.prototype.download = download;
+Vue.prototype.handleTree = handleTree;
+Vue.prototype.getToken = getToken;
+Vue.prototype.baseApiUrl = process.env.VUE_APP_BASE_API;
+Vue.prototype.handleOpenLoading = handleOpenLoading;
+Vue.prototype.handleCloseLoading = handleCloseLoading;
 
+// 成功消息提示框
 Vue.prototype.msgSuccess = function (msg) {
   this.$message({ showClose: true, message: msg, type: "success" });
-}
+};
+
+// 警告消息提示框
+Vue.prototype.msgWarning = function (msg) {
+  this.$message({ showClose: true, message: msg, type: "warning" });
+};
 
+// 错误消息提示框
 Vue.prototype.msgError = function (msg) {
   this.$message({ showClose: true, message: msg, type: "error" });
-}
+};
 
+// 默认消息提示框
 Vue.prototype.msgInfo = function (msg) {
   this.$message.info(msg);
-}
+};
 
 // 全局组件挂载
-Vue.component('Pagination', Pagination)
-Vue.component('RightToolbar', RightToolbar)
+Vue.component('Pagination', Pagination);
+Vue.component('RightToolbar', RightToolbar);
 
-Vue.use(permission)
+Vue.use(permission);
 
 /**
  * If you don't want to use mock-server
@@ -61,14 +78,14 @@ Vue.use(permission)
  */
 
 Vue.use(Element, {
-  size: Cookies.get('size') || 'medium' // set element-ui default size
-})
+  size: Cookies.get(process.env.VUE_APP_PROJECT_KEY + '-size') || 'medium' // set element-ui default size
+});
 
-Vue.config.productionTip = false
+Vue.config.productionTip = false;
 
 new Vue({
   el: '#app',
   router,
   store,
   render: h => h(App)
-})
+});

+ 1 - 1
src/router/index.js

@@ -62,7 +62,7 @@ export const constantRoutes = [
         path: 'index',
         component: (resolve) => require(['@/views/index'], resolve),
         name: '首页',
-        meta: { title: '首页', icon: 'dashboard', noCache: true, affix: true }
+        meta: { title: '首页', icon: 'homeicon', noCache: true, affix: true }
       }
     ]
   },

+ 1 - 0
src/store/getters.js

@@ -14,5 +14,6 @@ const getters = {
   topbarRouters:state => state.permission.topbarRouters,
   defaultRoutes:state => state.permission.defaultRoutes,
   sidebarRouters:state => state.permission.sidebarRouters,
+  projectName: state => state.settings.projectName
 }
 export default getters

+ 9 - 6
src/store/modules/app.js

@@ -1,12 +1,15 @@
 import Cookies from 'js-cookie'
 
+const sidebarStatusCookiesKey = process.env.VUE_APP_PROJECT_KEY + '-sidebarStatus'
+const sizeCookiesKey = process.env.VUE_APP_PROJECT_KEY + '-size'
+
 const state = {
   sidebar: {
-    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+    opened: Cookies.get(sidebarStatusCookiesKey) ? !!+Cookies.get(sidebarStatusCookiesKey) : true,
     withoutAnimation: false
   },
   device: 'desktop',
-  size: Cookies.get('size') || 'medium'
+  size: Cookies.get(sizeCookiesKey) || 'medium'
 }
 
 const mutations = {
@@ -14,13 +17,13 @@ const mutations = {
     state.sidebar.opened = !state.sidebar.opened
     state.sidebar.withoutAnimation = false
     if (state.sidebar.opened) {
-      Cookies.set('sidebarStatus', 1)
+      Cookies.set(sidebarStatusCookiesKey, 1)
     } else {
-      Cookies.set('sidebarStatus', 0)
+      Cookies.set(sidebarStatusCookiesKey, 0)
     }
   },
   CLOSE_SIDEBAR: (state, withoutAnimation) => {
-    Cookies.set('sidebarStatus', 0)
+    Cookies.set(sidebarStatusCookiesKey, 0)
     state.sidebar.opened = false
     state.sidebar.withoutAnimation = withoutAnimation
   },
@@ -29,7 +32,7 @@ const mutations = {
   },
   SET_SIZE: (state, size) => {
     state.size = size
-    Cookies.set('size', size)
+    Cookies.set(sizeCookiesKey, size)
   }
 }
 

+ 3 - 2
src/store/modules/settings.js

@@ -1,7 +1,7 @@
 import variables from '@/assets/styles/element-variables.scss'
 import defaultSettings from '@/settings'
 
-const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo } = defaultSettings
+const { title, sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo } = defaultSettings
 
 const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
 const state = {
@@ -11,7 +11,8 @@ const state = {
   topNav:  storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
   tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
   fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
-  sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo
+  sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
+  projectName: title
 }
 const mutations = {
   CHANGE_SETTING: (state, { key, value }) => {

+ 2 - 2
src/utils/auth.js

@@ -1,8 +1,8 @@
 import Cookies from 'js-cookie'
 
-const TokenKey = 'Admin-Token'
+const TokenKey = process.env.VUE_APP_PROJECT_KEY + '-Token'
 
-const ExpiresInKey = 'Admin-Expires-In'
+const ExpiresInKey = process.env.VUE_APP_PROJECT_KEY + '-Expires-In'
 
 export function getToken() {
   return Cookies.get(TokenKey)

+ 58 - 0
src/utils/exportexcel.js

@@ -0,0 +1,58 @@
+/*
+ * @Description:定出Excel文件方法封装处理
+ * @Author: Rockery
+ * @Date: 2021-04-20 14:01:42
+ * @LastEditors: Rockery
+ * @LastEditTime: 2021-04-26 15:55:00
+ * @FilePath: \pc_web\src\utils\exportexcel.js
+ * @Copyright: Copyright (c) 2016~2021 Rockery(1113269755@qq.com)
+ */
+
+import { parseTime } from "@/utils/ruoyi";
+import { Message } from 'element-ui';
+
+/**
+ * 导出Excel文件
+ * @param {*} data 文件数据流
+ * @param {String} filePrefix 文件前缀名
+ * @param {String} fileSuffix 文件后缀名
+ */
+export function exportExcel(data, filePrefix, fileSuffix) {
+  // 判断文件前缀名是否存在,不存在默认'EXPORTEXCEL'
+  filePrefix = filePrefix ?? 'EXPORTEXCEL';
+  // 判断文件后缀名是否存在,不存在默认'.xls'
+  fileSuffix = fileSuffix ?? '.xls';
+
+  // 处理文件数据流
+  const contentByExportExcel = data;
+  const blobByExportExcel = new Blob([contentByExportExcel], { type: "application/vnd.ms-excel;charset=utf-8" });
+
+  // 组装文件名称
+  const filenameByExportExcel = `${filePrefix}_${parseTime(new Date(), "{y}-{m}-{d}")}_${new Date().getTime()}${fileSuffix}`;
+
+  // 执行文件下载操作
+  if ('download' in document.createElement('a')) {
+    const elink = document.createElement('a');
+    elink.download = filenameByExportExcel;
+    elink.style.display = 'none';
+    elink.href = URL.createObjectURL(blobByExportExcel);
+    document.body.appendChild(elink);
+    elink.click();
+    URL.revokeObjectURL(elink.href);
+    document.body.removeChild(elink);
+    Message({
+      message: "导出Excel成功!",
+      type: 'success',
+      showClose: true,
+      center: true
+    });
+  } else {
+    navigator.msSaveBlob(blobByExportExcel, filenameByExportExcel);
+    Message({
+      message: "导出Excel成功!",
+      type: 'success',
+      showClose: true,
+      center: true
+    });
+  }
+}

文件差異過大導致無法顯示
+ 1 - 0
src/utils/jsonlint.js


+ 16 - 2
src/utils/request.js

@@ -4,6 +4,7 @@ import store from '@/store'
 import { getToken } from '@/utils/auth'
 import errorCode from '@/utils/errorCode'
 import { tansParams } from "@/utils/ruoyi";
+import jsonlint from "@/utils/jsonlint";
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
@@ -11,7 +12,17 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时
-  timeout: 10000
+  timeout: 60000,
+  withCredentials: true,
+  transformResponse: [function (data) {
+    // Do whatever you want to transform the data
+    if (typeof data === 'string') {
+      try {
+        data = jsonlint.parse(data);
+      } catch (e) { /* Ignore */ }
+    }
+    return data;
+  }]
 })
 
 // request拦截器
@@ -19,7 +30,10 @@ service.interceptors.request.use(config => {
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false
   if (getToken() && !isToken) {
-    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+    config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
+  }
+  if (store.getters && store.getters.name) {
+    config.headers['userName'] = store.getters.name; // 让每个请求携带userName 请根据实际情况自行修改
   }
   // get请求映射params参数
   if (config.method === 'get' && config.params) {

+ 42 - 0
src/utils/rockeryutil.js

@@ -0,0 +1,42 @@
+/*
+ * @Description: 定制封装公共方法
+ * @Author: Rockery
+ * @Date: 2021-04-26 15:53:59
+ * @LastEditors: Rockery
+ * @LastEditTime: 2021-04-26 16:04:44
+ * @FilePath: \pc_web\src\utils\rockeryutil.js
+ * @Copyright: Copyright (c) 2016~2021 Rockery(1113269755@qq.com)
+ */
+
+/**
+ * @description: 开启遮护罩
+ * @param {String} paramText 遮护罩描述信息
+ * @param {String} paramTarget 遮护罩位置,默认全局
+ * @return {*} 遮护罩对象
+ */
+export function handleOpenLoading(paramText, paramTarget) {
+  if (!paramTarget) {
+    return this.$loading({
+      lock: true,
+      text: paramText || "正在拼命加载中...",
+      spinner: 'el-icon-loading',
+      background: 'rgba(0, 0, 0, 0.5)'
+    });
+  }
+
+  return this.$loading({
+    lock: true,
+    text: paramText || "正在拼命加载中...",
+    spinner: 'el-icon-loading',
+    background: 'rgba(0, 0, 0, 0.5)',
+    target: paramTarget
+  });
+}
+
+/**
+ * @description: 关闭遮护罩
+ * @param {*} paramLoading 遮护罩对象
+ */
+export function handleCloseLoading(paramLoading) {
+  (null !== paramLoading) && paramLoading.close();
+}

+ 24 - 15
src/views/login.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">智慧党建管理系统</h3>
+      <h3 class="title">{{ loginTitle }}</h3>
       <el-form-item prop="username">
         <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
@@ -23,7 +23,7 @@
           v-model="loginForm.code"
           auto-complete="off"
           placeholder="验证码"
-          style="width: 63%"
+              style="width: 63%;"
           @keyup.enter.native="handleLogin"
         >
           <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
@@ -56,17 +56,19 @@
 <script>
 import { getCodeImg } from "@/api/login";
 import Cookies from "js-cookie";
-import { encrypt, decrypt } from '@/utils/jsencrypt'
+import { encrypt, decrypt } from '@/utils/jsencrypt';
+const loginAppProjectKey = process.env.VUE_APP_PROJECT_KEY + '-';
 
 export default {
   name: "Login",
   data() {
     return {
+      loginTitle: this.$store.getters.projectName,
       codeUrl: "",
       cookiePassword: "",
       loginForm: {
-        username: "admin",
-        password: "admin123",
+        username: "",
+        password: "",
         rememberMe: false,
         code: "",
         uuid: ""
@@ -93,6 +95,13 @@ export default {
     }
   },
   created() {
+    if (process.env.NODE_ENV === 'development') {
+      this.loginForm = {
+        ...this.loginForm,
+        username: 'admin',
+        password: 'admin123'
+      };
+    }
     this.getCode();
     this.getCookie();
   },
@@ -104,9 +113,9 @@ export default {
       });
     },
     getCookie() {
-      const username = Cookies.get("username");
-      const password = Cookies.get("password");
-      const rememberMe = Cookies.get('rememberMe')
+      const username = Cookies.get(loginAppProjectKey + "username");
+      const password = Cookies.get(loginAppProjectKey + "password");
+      const rememberMe = Cookies.get(loginAppProjectKey + 'rememberMe')
       this.loginForm = {
         username: username === undefined ? this.loginForm.username : username,
         password: password === undefined ? this.loginForm.password : decrypt(password),
@@ -118,16 +127,16 @@ export default {
         if (valid) {
           this.loading = true;
           if (this.loginForm.rememberMe) {
-            Cookies.set("username", this.loginForm.username, { expires: 30 });
-            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
-            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
+            Cookies.set(loginAppProjectKey + "username", this.loginForm.username, { expires: 30 });
+            Cookies.set(loginAppProjectKey + "password", encrypt(this.loginForm.password), { expires: 30 });
+            Cookies.set(loginAppProjectKey + 'rememberMe', this.loginForm.rememberMe, { expires: 30 });
           } else {
-            Cookies.remove("username");
-            Cookies.remove("password");
-            Cookies.remove('rememberMe');
+            Cookies.remove(loginAppProjectKey + "username");
+            Cookies.remove(loginAppProjectKey + "password");
+            Cookies.remove(loginAppProjectKey + 'rememberMe');
           }
           this.$store.dispatch("Login", this.loginForm).then(() => {
-            this.$router.push({ path: this.redirect || "/" }).catch(() => { });
+            this.$router.push({ path: "/" }).catch(() => { });
           }).catch(() => {
             this.loading = false;
             this.getCode();

+ 25 - 21
src/views/system/config/index.vue

@@ -1,13 +1,14 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="参数名称" prop="configName">
         <el-input
           v-model="queryParams.configName"
           placeholder="请输入参数名称"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -17,7 +18,7 @@
           placeholder="请输入参数键名"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -35,7 +36,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -48,7 +49,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -82,7 +85,7 @@
           v-hasPermi="['system:config:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -91,7 +94,7 @@
           @click="handleExport"
           v-hasPermi="['system:config:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -145,18 +148,19 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="参数名称" prop="configName">
-          <el-input v-model="form.configName" placeholder="请输入参数名称" />
+          <el-input v-model="form.configName" clearable placeholder="请输入参数名称" />
         </el-form-item>
         <el-form-item label="参数键名" prop="configKey">
-          <el-input v-model="form.configKey" placeholder="请输入参数键名" />
+          <el-input v-model="form.configKey" clearable placeholder="请输入参数键名" />
         </el-form-item>
         <el-form-item label="参数键值" prop="configValue">
-          <el-input v-model="form.configValue" placeholder="请输入参数键值" />
+          <el-input v-model="form.configValue" clearable placeholder="请输入参数键值" />
         </el-form-item>
         <el-form-item label="系统内置" prop="configType">
           <el-radio-group v-model="form.configType">
@@ -168,7 +172,7 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+          <el-input v-model="form.remark" type="textarea" clearable placeholder="请输入内容" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -243,10 +247,10 @@ export default {
     getList() {
       this.loading = true;
       listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.configList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
+        this.configList = response.rows || [];
+        this.total = response.total ?? 0;
+        this.loading = false;
+      }
       );
     },
     // 参数系统内置字典翻译
@@ -289,32 +293,32 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.configId)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
+      this.ids = selection.map(item => item.configId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       const configId = row.configId || this.ids
       getConfig(configId).then(response => {
-        this.form = response.data;
+        this.form = response.data || {};
         this.open = true;
         this.title = "修改参数";
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.configId != undefined) {
-            updateConfig(this.form).then(response => {
+            updateConfig(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addConfig(this.form).then(response => {
+            addConfig(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 12 - 8
src/views/system/dept/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="部门名称" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
@@ -25,7 +26,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -82,6 +85,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <!-- 添加或修改部门对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
@@ -94,7 +98,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="部门名称" prop="deptName">
-              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+              <el-input v-model="form.deptName" clearable placeholder="请输入部门名称" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -104,17 +108,17 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="负责人" prop="leader">
-              <el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
+              <el-input v-model="form.leader" placeholder="请输入负责人" clearable maxlength="20" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="联系电话" prop="phone">
-              <el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
+              <el-input v-model="form.phone" placeholder="请输入联系电话" clearable maxlength="11" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+              <el-input v-model="form.email" placeholder="请输入邮箱" clearable maxlength="50" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -280,17 +284,17 @@ export default {
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.deptId != undefined) {
-            updateDept(this.form).then(response => {
+            updateDept(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addDept(this.form).then(response => {
+            addDept(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 22 - 18
src/views/system/dict/data.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="字典名称" prop="dictType">
         <el-select v-model="queryParams.dictType" size="small">
           <el-option
@@ -35,7 +36,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -69,7 +72,7 @@
           v-hasPermi="['system:dict:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -78,7 +81,7 @@
           @click="handleExport"
           v-hasPermi="['system:dict:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -122,6 +125,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -130,10 +134,10 @@
           <el-input v-model="form.dictType" :disabled="true" />
         </el-form-item>
         <el-form-item label="数据标签" prop="dictLabel">
-          <el-input v-model="form.dictLabel" placeholder="请输入数据标签" />
+          <el-input v-model="form.dictLabel" clearable placeholder="请输入数据标签" />
         </el-form-item>
         <el-form-item label="数据键值" prop="dictValue">
-          <el-input v-model="form.dictValue" placeholder="请输入数据键值" />
+          <el-input v-model="form.dictValue" clearable placeholder="请输入数据键值" />
         </el-form-item>
         <el-form-item label="显示排序" prop="dictSort">
           <el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
@@ -148,7 +152,7 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+          <el-input v-model="form.remark" type="textarea" clearable placeholder="请输入内容"></el-input>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -220,7 +224,7 @@ export default {
     this.getType(dictId);
     this.getTypeList();
     this.getDicts("sys_normal_disable").then(response => {
-      this.statusOptions = response.data;
+      this.statusOptions = response.data || [];
     });
   },
   methods: {
@@ -235,15 +239,15 @@ export default {
     /** 查询字典类型列表 */
     getTypeList() {
       listType().then(response => {
-        this.typeOptions = response.rows;
+        this.typeOptions = response.rows || [];
       });
     },
     /** 查询字典数据列表 */
     getList() {
       this.loading = true;
       listData(this.queryParams).then(response => {
-        this.dataList = response.rows;
-        this.total = response.total;
+        this.dataList = response.rows || [];
+        this.total = response.total ?? 0;
         this.loading = false;
       });
     },
@@ -288,32 +292,32 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.dictCode)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
+      this.ids = selection.map(item => item.dictCode);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const dictCode = row.dictCode || this.ids
+      const dictCode = row.dictCode || this.ids;
       getData(dictCode).then(response => {
-        this.form = response.data;
+        this.form = response.data || {};
         this.open = true;
         this.title = "修改字典数据";
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.dictCode != undefined) {
-            updateData(this.form).then(response => {
+            updateData(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addData(this.form).then(response => {
+            addData(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 27 - 23
src/views/system/dict/index.vue

@@ -1,13 +1,14 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input
           v-model="queryParams.dictName"
           placeholder="请输入字典名称"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -17,7 +18,7 @@
           placeholder="请输入字典类型"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -27,7 +28,7 @@
           placeholder="字典状态"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
         >
           <el-option
             v-for="dict in statusOptions"
@@ -41,7 +42,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -54,7 +55,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -88,7 +91,7 @@
           v-hasPermi="['system:dict:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -97,7 +100,7 @@
           @click="handleExport"
           v-hasPermi="['system:dict:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -156,15 +159,16 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="字典名称" prop="dictName">
-          <el-input v-model="form.dictName" placeholder="请输入字典名称" />
+          <el-input v-model="form.dictName" clearable placeholder="请输入字典名称" />
         </el-form-item>
         <el-form-item label="字典类型" prop="dictType">
-          <el-input v-model="form.dictType" placeholder="请输入字典类型" />
+          <el-input v-model="form.dictType" clearable placeholder="请输入字典类型" />
         </el-form-item>
         <el-form-item label="状态" prop="status">
           <el-radio-group v-model="form.status">
@@ -176,7 +180,7 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+          <el-input v-model="form.remark" type="textarea" clearable placeholder="请输入内容"></el-input>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -240,7 +244,7 @@ export default {
   created() {
     this.getList();
     this.getDicts("sys_normal_disable").then(response => {
-      this.statusOptions = response.data;
+      this.statusOptions = response.data || [];
     });
   },
   methods: {
@@ -248,10 +252,10 @@ export default {
     getList() {
       this.loading = true;
       listType(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.typeList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
+        this.typeList = response.rows || [];
+        this.total = response.total ?? 0;
+        this.loading = false;
+      }
       );
     },
     // 字典状态字典翻译
@@ -293,32 +297,32 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.dictId)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
+      this.ids = selection.map(item => item.dictId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const dictId = row.dictId || this.ids
+      const dictId = row.dictId || this.ids;
       getType(dictId).then(response => {
-        this.form = response.data;
+        this.form = response.data || [];
         this.open = true;
         this.title = "修改字典类型";
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.dictId != undefined) {
-            updateType(this.form).then(response => {
+            updateType(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addType(this.form).then(response => {
+            addType(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 14 - 10
src/views/system/logininfor/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="登录地址" prop="ipaddr">
         <el-input
           v-model="queryParams.ipaddr"
@@ -27,7 +28,7 @@
           placeholder="登录状态"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
         >
           <el-option
             v-for="dict in statusOptions"
@@ -41,7 +42,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -54,7 +55,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -77,7 +80,7 @@
           v-hasPermi="['system:logininfor:remove']"
         >清空</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -86,7 +89,7 @@
           @click="handleExport"
           v-hasPermi="['system:logininfor:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -111,6 +114,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
   </div>
 </template>
 
@@ -150,7 +154,7 @@ export default {
   created() {
     this.getList();
     this.getDicts("sys_common_status").then(response => {
-      this.statusOptions = response.data;
+      this.statusOptions = response.data || [];
     });
   },
   methods: {
@@ -158,10 +162,10 @@ export default {
     getList() {
       this.loading = true;
       list(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.list = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
+        this.list = response.rows || [];
+        this.total = response.total ?? 0;
+        this.loading = false;
+      }
       );
     },
     // 登录状态字典翻译

+ 21 - 11
src/views/system/menu/index.vue

@@ -1,6 +1,7 @@
 <template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+  <div class="app-container app-menu">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="菜单名称" prop="menuName">
         <el-input
           v-model="queryParams.menuName"
@@ -25,7 +26,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -49,7 +52,7 @@
       <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
       <el-table-column prop="icon" label="图标" align="center" width="100">
         <template slot-scope="scope">
-          <svg-icon :icon-class="scope.row.icon" />
+            <svg-icon :icon-class="scope.row.icon || ''" />
         </template>
       </el-table-column>
       <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
@@ -86,10 +89,17 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <!-- 添加或修改菜单对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      <el-form
+        ref="form"
+        :model="form"
+        :rules="rules"
+        label-width="80px"
+        :close-on-click-modal="false"
+      >
         <el-row>
           <el-col :span="24">
             <el-form-item label="上级菜单">
@@ -135,7 +145,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="菜单名称" prop="menuName">
-              <el-input v-model="form.menuName" placeholder="请输入菜单名称" />
+              <el-input v-model="form.menuName" clearable placeholder="请输入菜单名称" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -153,17 +163,17 @@
           </el-col>
           <el-col :span="12">
             <el-form-item v-if="form.menuType != 'F'" label="路由地址" prop="path">
-              <el-input v-model="form.path" placeholder="请输入路由地址" />
+              <el-input v-model="form.path" clearable placeholder="请输入路由地址" />
             </el-form-item>
           </el-col>
           <el-col :span="12" v-if="form.menuType == 'C'">
             <el-form-item label="组件路径" prop="component">
-              <el-input v-model="form.component" placeholder="请输入组件路径" />
+              <el-input v-model="form.component" clearable placeholder="请输入组件路径" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item v-if="form.menuType != 'M'" label="权限标识">
-              <el-input v-model="form.perms" placeholder="请输入权限标识" maxlength="100" />
+              <el-input v-model="form.perms" clearable placeholder="请权限标识" maxlength="50" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -363,17 +373,17 @@ export default {
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.menuId != undefined) {
-            updateMenu(this.form).then(response => {
+            updateMenu(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addMenu(this.form).then(response => {
+            addMenu(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 9 - 5
src/views/system/notice/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="公告标题" prop="noticeTitle">
         <el-input
           v-model="queryParams.noticeTitle"
@@ -34,7 +35,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -127,6 +130,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改公告对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body>
@@ -134,7 +138,7 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="公告标题" prop="noticeTitle">
-              <el-input v-model="form.noticeTitle" placeholder="请输入公告标题" />
+              <el-input v-model="form.noticeTitle" clearable placeholder="请输入公告标题" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -305,17 +309,17 @@ export default {
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.noticeId != undefined) {
-            updateNotice(this.form).then(response => {
+            updateNotice(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addNotice(this.form).then(response => {
+            addNotice(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 10 - 6
src/views/system/operlog/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="系统模块" prop="title">
         <el-input
           v-model="queryParams.title"
@@ -27,7 +28,7 @@
           placeholder="操作类型"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
         >
           <el-option
             v-for="dict in typeOptions"
@@ -43,7 +44,7 @@
           placeholder="操作状态"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
         >
           <el-option
             v-for="dict in statusOptions"
@@ -57,7 +58,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -70,7 +71,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -93,7 +96,7 @@
           v-hasPermi="['system:operlog:remove']"
         >清空</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -102,7 +105,7 @@
           @click="handleExport"
           v-hasPermi="['system:operlog:export']"
         >导出</el-button>
-      </el-col>
+        </el-col> -->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -140,6 +143,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 操作日志详细 -->
     <el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body>

+ 10 - 6
src/views/system/post/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="岗位编码" prop="postCode">
         <el-input
           v-model="queryParams.postCode"
@@ -34,7 +35,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -68,7 +71,7 @@
           v-hasPermi="['system:post:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -77,7 +80,7 @@
           @click="handleExport"
           v-hasPermi="['system:post:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -120,6 +123,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改岗位对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -275,17 +279,17 @@ export default {
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.postId != undefined) {
-            updatePost(this.form).then(response => {
+            updatePost(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addPost(this.form).then(response => {
+            addPost(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 16 - 12
src/views/system/role/index.vue

@@ -1,13 +1,14 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="角色名称" prop="roleName">
         <el-input
           v-model="queryParams.roleName"
           placeholder="请输入角色名称"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -17,7 +18,7 @@
           placeholder="请输入权限字符"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
@@ -27,7 +28,7 @@
           placeholder="角色状态"
           clearable
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
         >
           <el-option
             v-for="dict in statusOptions"
@@ -41,7 +42,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -54,7 +55,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -88,7 +91,7 @@
           v-hasPermi="['system:role:remove']"
         >删除</el-button>
       </el-col>
-      <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -97,7 +100,7 @@
           @click="handleExport"
           v-hasPermi="['system:role:export']"
         >导出</el-button>
-      </el-col>
+        </el-col>-->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -156,6 +159,7 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
 
     <!-- 添加或修改角色配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -546,19 +550,19 @@ export default {
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.roleId != undefined) {
             this.form.menuIds = this.getMenuAllCheckedKeys();
-            updateRole(this.form).then(response => {
+            updateRole(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
             this.form.menuIds = this.getMenuAllCheckedKeys();
-            addRole(this.form).then(response => {
+            addRole(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -568,10 +572,10 @@ export default {
       });
     },
     /** 提交按钮(数据权限) */
-    submitDataScope: function() {
+    submitDataScope() {
       if (this.form.roleId != undefined) {
         this.form.deptIds = this.getDeptAllCheckedKeys();
-        dataScope(this.form).then(response => {
+        dataScope(this.form).then(() => {
           this.msgSuccess("修改成功");
           this.openDataScope = false;
           this.getList();

+ 24 - 18
src/views/system/user/index.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="app-container">
-    <el-row :gutter="20">
+    <el-row :gutter="15">
       <!--部门数据-->
       <el-col :span="4" :xs="24">
+        <div class="app-container-headtree">
         <div class="head-container">
           <el-input
             v-model="deptName"
@@ -10,7 +11,7 @@
             clearable
             size="small"
             prefix-icon="el-icon-search"
-            style="margin-bottom: 20px"
+              style="margin-bottom: 20px;"
           />
         </div>
         <div class="head-container">
@@ -24,17 +25,19 @@
             @node-click="handleNodeClick"
           />
         </div>
+        </div>
       </el-col>
       <!--用户数据-->
       <el-col :span="20" :xs="24">
-        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+        <div class="app-container-queryform" v-show="showSearch">
+          <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
           <el-form-item label="用户名称" prop="userName">
             <el-input
               v-model="queryParams.userName"
               placeholder="请输入用户名称"
               clearable
               size="small"
-              style="width: 240px"
+                style="width: 240px;"
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
@@ -44,7 +47,7 @@
               placeholder="请输入手机号码"
               clearable
               size="small"
-              style="width: 240px"
+                style="width: 240px;"
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
@@ -54,7 +57,7 @@
               placeholder="用户状态"
               clearable
               size="small"
-              style="width: 240px"
+                style="width: 240px;"
             >
               <el-option
                 v-for="dict in statusOptions"
@@ -68,7 +71,7 @@
             <el-date-picker
               v-model="dateRange"
               size="small"
-              style="width: 240px"
+                style="width: 240px;"
               value-format="yyyy-MM-dd"
               type="daterange"
               range-separator="-"
@@ -81,7 +84,9 @@
             <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
           </el-form-item>
         </el-form>
+        </div>
 
+        <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
             <el-button
@@ -115,7 +120,7 @@
               v-hasPermi="['system:user:remove']"
             >删除</el-button>
           </el-col>
-          <el-col :span="1.5">
+            <!-- <el-col :span="1.5">
             <el-button
               type="info"
               plain
@@ -134,7 +139,7 @@
               @click="handleExport"
               v-hasPermi="['system:user:export']"
             >导出</el-button>
-          </el-col>
+            </el-col> -->
           <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
         </el-row>
 
@@ -200,6 +205,7 @@
           :limit.sync="queryParams.pageSize"
           @pagination="getList"
         />
+        </div>
       </el-col>
     </el-row>
 
@@ -330,9 +336,9 @@
         </div>
         <div class="el-upload__tip" slot="tip">
           <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
-          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+          <el-link type="info" style="font-size:12px;" @click="importTemplate">下载模板</el-link>
         </div>
-        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+        <div class="el-upload__tip" style="color:red;" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitFileForm">确 定</el-button>
@@ -591,23 +597,23 @@ export default {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
       }).then(({ value }) => {
-          resetUserPwd(row.userId, value).then(response => {
-            this.msgSuccess("修改成功,新密码是:" + value);
-          });
-        }).catch(() => {});
+        resetUserPwd(row.userId, value).then(() => {
+          this.msgSuccess("修改成功,新密码是:" + value);
+        });
+      }).catch(() => { });
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.userId != undefined) {
-            updateUser(this.form).then(response => {
+            updateUser(this.form).then(() => {
               this.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addUser(this.form).then(response => {
+            addUser(this.form).then(() => {
               this.msgSuccess("新增成功");
               this.open = false;
               this.getList();

+ 1 - 1
src/views/system/user/profile/resetPwd.vue

@@ -56,7 +56,7 @@ export default {
       this.$refs["form"].validate(valid => {
         if (valid) {
           updateUserPwd(this.user.oldPassword, this.user.newPassword).then(
-            response => {
+            () => {
               this.msgSuccess("修改成功");
             }
           );

+ 2 - 2
src/views/system/user/profile/userAvatar.vue

@@ -3,7 +3,7 @@
     <div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div>
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened"  @close="closeDialog()">
       <el-row>
-        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+        <el-col :xs="24" :md="12" style="height: 350px;">
           <vue-cropper
             ref="cropper"
             :img="options.img"
@@ -16,7 +16,7 @@
             v-if="visible"
           />
         </el-col>
-        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+        <el-col :xs="24" :md="12" style="height: 350px;">
           <div class="avatar-upload-preview">
             <img :src="previews.url" :style="previews.img" />
           </div>

+ 1 - 1
src/views/system/user/profile/userInfo.vue

@@ -61,7 +61,7 @@ export default {
     submit() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          updateUserProfile(this.user).then(response => {
+          updateUserProfile(this.user).then(() => {
             this.msgSuccess("修改成功");
           });
         }

+ 1 - 1
src/views/tool/build/IconsDialog.vue

@@ -13,7 +13,7 @@
         <el-input
           v-model="key"
           size="mini"
-          :style="{width: '260px'}"
+          style="width: 260px;"
           placeholder="请输入图标名称"
           prefix-icon="el-icon-search"
           clearable

+ 11 - 11
src/views/tool/build/RightPanel.vue

@@ -15,7 +15,7 @@
             <el-select
               v-model="activeData.tagIcon"
               placeholder="请选择组件类型"
-              :style="{width: '100%'}"
+              style="width: 100%;"
               @change="tagChange"
             >
               <el-option-group v-for="group in tagList" :key="group.label" :label="group.label">
@@ -62,7 +62,7 @@
             </el-radio-group>
           </el-form-item>
           <el-form-item v-if="activeData.justify!==undefined&&activeData.type==='flex'" label="水平排列">
-            <el-select v-model="activeData.justify" placeholder="请选择水平排列" :style="{width: '100%'}">
+            <el-select v-model="activeData.justify" placeholder="请选择水平排列" style="width: 100%;">
               <el-option
                 v-for="(item, index) in justifyOptions"
                 :key="index"
@@ -192,7 +192,7 @@
             <el-select
               v-model="activeData.type"
               placeholder="请选择时间类型"
-              :style="{ width: '100%' }"
+              style="width: 100%;"
               @change="dateTypeChange"
             >
               <el-option
@@ -210,7 +210,7 @@
             <el-select
               v-model="activeData.accept"
               placeholder="请选择文件类型"
-              :style="{ width: '100%' }"
+              style="width: 100%;"
               clearable
             >
               <el-option label="图片" value="image/*" />
@@ -224,7 +224,7 @@
           </el-form-item>
           <el-form-item v-if="activeData.fileSize !== undefined" label="文件大小">
             <el-input v-model.number="activeData.fileSize" placeholder="请输入文件大小">
-              <el-select slot="append" v-model="activeData.sizeUnit" :style="{ width: '66px' }">
+              <el-select slot="append" v-model="activeData.sizeUnit" style="width: 66px;">
                 <el-option label="KB" value="KB" />
                 <el-option label="MB" value="MB" />
                 <el-option label="GB" value="GB" />
@@ -296,7 +296,7 @@
             </draggable>
             <div style="margin-left: 20px;">
               <el-button
-                style="padding-bottom: 0"
+                style="padding-bottom: 0;"
                 icon="el-icon-circle-plus-outline"
                 type="text"
                 @click="addSelectItem"
@@ -340,9 +340,9 @@
               :expand-on-click-node="false"
               :render-content="renderContent"
             />
-            <div v-if="activeData.dataType === 'static'" style="margin-left: 20px">
+            <div v-if="activeData.dataType === 'static'" style="margin-left: 20px;">
               <el-button
-                style="padding-bottom: 0"
+                style="padding-bottom: 0;"
                 icon="el-icon-circle-plus-outline"
                 type="text"
                 @click="addTreeItem"
@@ -395,7 +395,7 @@
             <el-select
               v-model="activeData['color-format']"
               placeholder="请选择颜色格式"
-              :style="{ width: '100%' }"
+              style="width: 100%;"
               @change="colorFormatChange"
             >
               <el-option
@@ -499,11 +499,11 @@
               <el-form-item label="表达式">
                 <el-input v-model="item.pattern" placeholder="请输入正则" />
               </el-form-item>
-              <el-form-item label="错误提示" style="margin-bottom:0">
+              <el-form-item label="错误提示" style="margin-bottom:0;">
                 <el-input v-model="item.message" placeholder="请输入错误提示" />
               </el-form-item>
             </div>
-            <div style="margin-left: 20px">
+            <div style="margin-left: 20px;">
               <el-button icon="el-icon-circle-plus-outline" type="text" @click="addReg">
                 添加规则
               </el-button>

+ 1 - 1
src/views/tool/build/TreeNodeDialog.vue

@@ -41,7 +41,7 @@
                 <el-select
                   slot="append"
                   v-model="dataType"
-                  :style="{width: '100px'}"
+                  style="width: 100px;"
                 >
                   <el-option
                     v-for="(item, index) in dataTypeOptions"

+ 5 - 5
src/views/tool/gen/basicInfoForm.vue

@@ -3,28 +3,28 @@
     <el-row>
       <el-col :span="12">
         <el-form-item label="表名称" prop="tableName">
-          <el-input placeholder="请输入仓库名称" v-model="info.tableName" />
+          <el-input placeholder="请输入仓库名称" clearable v-model="info.tableName" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
         <el-form-item label="表描述" prop="tableComment">
-          <el-input placeholder="请输入" v-model="info.tableComment" />
+          <el-input placeholder="请输入" clearable v-model="info.tableComment" />
         </el-form-item>
       </el-col>
 
       <el-col :span="12">
         <el-form-item label="实体类名称" prop="className">
-          <el-input placeholder="请输入" v-model="info.className" />
+          <el-input placeholder="请输入" clearable v-model="info.className" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
         <el-form-item label="作者" prop="functionAuthor">
-          <el-input placeholder="请输入" v-model="info.functionAuthor" />
+          <el-input placeholder="请输入" clearable v-model="info.functionAuthor" />
         </el-form-item>
       </el-col>
       <el-col :span="24">
         <el-form-item label="备注" prop="remark">
-          <el-input type="textarea" :rows="3" v-model="info.remark"></el-input>
+          <el-input type="textarea" clearable :rows="3" v-model="info.remark"></el-input>
         </el-form-item>
       </el-col>
     </el-row>

+ 2 - 2
src/views/tool/gen/editTable.vue

@@ -104,8 +104,8 @@
                   :key="dict.dictType"
                   :label="dict.dictName"
                   :value="dict.dictType">
-                  <span style="float: left">{{ dict.dictName }}</span>
-                  <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
+                  <span style="float: left;">{{ dict.dictName }}</span>
+                  <span style="float: right; color: #8492a6; font-size: 13px;">{{ dict.dictType }}</span>
               </el-option>
               </el-select>
             </template>

+ 14 - 4
src/views/tool/gen/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <div class="app-container-queryform" v-show="showSearch">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="表名称" prop="tableName">
         <el-input
           v-model="queryParams.tableName"
@@ -23,7 +24,7 @@
         <el-date-picker
           v-model="dateRange"
           size="small"
-          style="width: 240px"
+            style="width: 240px;"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -36,7 +37,9 @@
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
+    </div>
 
+    <div class="app-container-main" :class="showSearch ? 'mt15' : ''">
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -160,8 +163,15 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    </div>
     <!-- 预览界面 -->
-    <el-dialog :title="preview.title" :visible.sync="preview.open" width="80%" top="5vh" append-to-body>
+    <el-dialog
+      :title="preview.title"
+      :visible.sync="preview.open"
+      width="80%"
+      top="5vh"
+      append-to-body
+    >
       <el-tabs v-model="preview.activeName">
         <el-tab-pane
           v-for="(value, key) in preview.data"
@@ -265,7 +275,7 @@ export default {
         return;
       }
       if(row.genType === "1") {
-        genCode(row.tableName).then(response => {
+        genCode(row.tableName).then(() => {
           this.msgSuccess("成功生成到自定义路径:" + row.genPath);
         });
       } else {

+ 1 - 1
vue.config.js

@@ -35,7 +35,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `http://localhost:8080`,
-        target: `http://172.16.90.64:7000`,
+        target: `http://172.16.90.8:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''