Zn 1 рік тому
батько
коміт
3c2d76e4b1

+ 3 - 0
ruoyi-ui/package.json

@@ -74,6 +74,8 @@
     "less-loader": "^4.1.0",
     "lucide-vue": "^0.89.0",
     "mockjs": "^1.1.0",
+    "monaco-editor": "^0.30.1",
+    "monaco-editor-webpack-plugin": "^6.0.0",
     "nprogress": "0.2.0",
     "quill": "1.3.7",
     "screenfull": "5.0.2",
@@ -88,6 +90,7 @@
     "vue-meta": "2.4.0",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "3.4.9",
+    "vue2-ace-editor": "^0.0.15",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0",
     "vuex-persistedstate": "^4.1.0",

+ 44 - 0
ruoyi-ui/src/api/tablelist/style.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询动态格样式列表
+export function listStyle(query) {
+  return request({
+    url: '/system/style/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询动态格样式详细
+export function getStyle(id) {
+  return request({
+    url: '/system/style/' + id,
+    method: 'get'
+  })
+}
+
+// 新增动态格样式
+export function addStyle(data) {
+  return request({
+    url: '/system/style',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改动态格样式
+export function updateStyle(data) {
+  return request({
+    url: '/system/style',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除动态格样式
+export function delStyle(id) {
+  return request({
+    url: '/system/style/' + id,
+    method: 'delete'
+  })
+}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
ruoyi-ui/src/assets/styles/index.min.css


+ 18 - 10
ruoyi-ui/src/assets/styles/index.scss

@@ -1,16 +1,17 @@
-@import './variables.scss';
-@import './mixin.scss';
-@import './transition.scss';
-@import './element-ui.scss';
-@import './sidebar.scss';
-@import './btn.scss';
+@import "./variables.scss";
+@import "./mixin.scss";
+@import "./transition.scss";
+@import "./element-ui.scss";
+@import "./sidebar.scss";
+@import "./btn.scss";
 
 body {
   height: 100%;
   -moz-osx-font-smoothing: grayscale;
   -webkit-font-smoothing: antialiased;
   text-rendering: optimizeLegibility;
-  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
+    Microsoft YaHei, Arial, sans-serif;
 }
 
 label {
@@ -104,7 +105,8 @@ aside {
   display: block;
   line-height: 32px;
   font-size: 16px;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
+    Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
   color: #2c3e50;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
@@ -134,7 +136,7 @@ aside {
 }
 
 .text-center {
-  text-align: center
+  text-align: center;
 }
 
 .sub-navbar {
@@ -145,7 +147,13 @@ aside {
   text-align: right;
   padding-right: 20px;
   transition: 600ms ease position;
-  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+  background: linear-gradient(
+    90deg,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(33, 120, 241, 1) 100%,
+    rgba(33, 120, 241, 1) 100%
+  );
 
   .subtitle {
     font-size: 20px;

+ 110 - 4
ruoyi-ui/src/views/bpmprocess/scriptManage.vue

@@ -113,11 +113,11 @@
         prop="scriptFunctionName"
       />
       <el-table-column label="脚本名称" align="center" prop="scriptName" />
-      <el-table-column
+      <!-- <el-table-column
         label="脚本方法体"
         align="center"
         prop="scriptFunctionCode"
-      />
+      /> -->
       <el-table-column label="脚本类型" align="center" prop="scriptType">
         <template slot-scope="scope">
           {{ getDictLabel(scope.row.scriptType, dict.type.bpm_script_type) }}
@@ -215,11 +215,14 @@
         </el-form-item>
 
         <el-form-item label="方法体:" prop="scriptFunctionCode">
-          <el-input
+          <!-- <el-input
             v-model="form.scriptFunctionCode"
             type="textarea"
             placeholder="请输入内容"
-          />
+          /> -->
+          <!-- <div ref="container" class="monaco-container">
+          </div> -->
+          <el-button icon="el-icon-edit" @click="drawerOpenHandler"></el-button>
         </el-form-item>
         <el-form-item label="脚本描述:" prop="scriptDescription">
           <el-input
@@ -233,6 +236,14 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    <el-drawer
+      :visible.sync="drawer"
+      direction="rtl"
+      :before-close="drawerHandleClose"
+      :with-header="false"
+    >
+      <div ref="container" class="monaco-container"></div>
+    </el-drawer>
   </div>
 </template>
 
@@ -245,10 +256,14 @@ import {
   updateScript,
 } from "@/api/bpmprocess/process";
 import uuid from "@/utils/bpmn/uuid";
+import Editor from "vue2-ace-editor";
+import * as monaco from "monaco-editor";
+import * as actions from "monaco-editor/esm/vs/platform/actions/common/actions";
 
 export default {
   name: "Script",
   dicts: ["bpm_script_type", "industry_type"],
+  components: { Editor },
   data() {
     return {
       // 遮罩层
@@ -301,12 +316,45 @@ export default {
           { required: true, message: "请选择脚本类型", trigger: "change" },
         ],
       },
+
+      // 代码编辑器相关数据
+      monacoEditor: null,
+      codes: "",
+      readOnly: false,
+      drawer: false,
+      editorOptions: {
+        selectOnLineNumbers: true,
+        roundedSelection: false,
+        readOnly: this.readOnly, // 只读
+        cursorStyle: "line", // 光标样式
+        automaticLayout: false, // 自动布局
+        glyphMargin: true, // 字形边缘
+        useTabStops: false,
+        fontSize: 28, // 字体大小
+        autoIndent: false, // 自动布局
+      },
     };
   },
   created() {
     this.getList();
+    // this.editorInit();
   },
   methods: {
+    // 编辑器初始化
+    editorInit() {
+      require("brace/theme/chrome");
+      require("brace/ext/language_tools"); //language extension prerequsite...
+      require("brace/mode/yaml");
+      require("brace/mode/json");
+      require("brace/mode/less");
+      require("brace/mode/java");
+      require("brace/snippets/json");
+      require("brace/mode/lua");
+      require("brace/snippets/lua");
+      require("brace/mode/javascript");
+      require("brace/snippets/javascript");
+    },
+
     /** 查询流程节点脚本列表 */
     getList() {
       this.loading = true;
@@ -358,12 +406,22 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
+      this.monacoEditor?.dispose();
       this.reset();
       this.open = true;
       this.title = "添加流程节点脚本";
+      // this.$nextTick(() => {
+      //   this.monacoEditor = monaco.editor.create(this.$refs.container, {
+      //     value: this.form.scriptFunctionCode,
+      //     language: "java",
+      //     theme: "vs-dark", // 编辑器主题:vs, hc-black, or vs-dark
+      //     editorOptions: this.editorOptions,
+      //   });
+      // });
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.monacoEditor?.dispose();
       this.reset();
       const id = row.id || this.ids;
       getScript(id).then((response) => {
@@ -375,6 +433,7 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
+      // console.log(this.monacoEditor?.getValue());
       this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.id != null) {
@@ -424,6 +483,53 @@ export default {
         return item.value == value;
       })?.label;
     },
+    // 抽屉打开回调
+    drawerOpenHandler() {
+      this.monacoEditor?.dispose();
+      this.drawer = true;
+      this.$nextTick(() => {
+        this.monacoEditor = monaco.editor.create(this.$refs.container, {
+          value: this.form.scriptFunctionCode,
+          language: "java",
+          theme: "vs-dark", // 编辑器主题:vs, hc-black, or vs-dark,更多选择详见官网
+          contextmenu: false, // 禁用右键菜单
+          editorOptions: this.editorOptions, // 同codes
+        });
+      });
+    },
+    // 抽屉关闭前回调
+    drawerHandleClose(done) {
+      this.$confirm("即将关闭编辑器,是否保存代码?")
+        .then(
+          (val) => {
+            this.form.scriptFunctionCode = this.monacoEditor?.getValue();
+            // this.drawer = false;
+            done();
+          },
+          (res) => {
+            // this.drawer = false;
+            done();
+          }
+        )
+        .catch(() => {});
+    },
   },
 };
 </script>
+
+<style lang="scss" scoped>
+.codeEditBox {
+  width: 100%;
+  height: 200px;
+}
+
+// ::v-deep div {
+//   font-family: "新宋体", serif;
+//   // font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
+//   font-size: 16px;
+// }
+.monaco-container {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 3 - 3
ruoyi-ui/src/views/system/bpmnPro/components/Panel/index.vue

@@ -155,13 +155,13 @@ export default {
       //   this.renderComponents.push(ElementExecutionListeners);
       // isAsynchronous(element) &&
       // this.renderComponents.push(ElementAsyncContinuations);
-      isStartInitializable(element) &&
-        this.renderComponents.push(ElementStartInitiator);
+      // isStartInitializable(element) &&
+      //   this.renderComponents.push(ElementStartInitiator);
       // this.renderComponents.push(ElementExtensionField);
       // 添加执行表单
       isTaskOrUserTask(element) &&
         this.renderComponents.push(ElementExecuteForm);
-      isTaskOrUserTask(element) &&
+      (isStartInitializable(element) || isTaskOrUserTask(element)) &&
         this.renderComponents.push(ElementNormalTask);
       !isProcess(element) && this.renderComponents.push(ElementUnusualTasks); //可处理异常
       isUserTask(element) && this.renderComponents.push(ElementExecuteUser);

+ 11 - 10
ruoyi-ui/src/views/system/bpmnPro/components/Toolbar/tools/Save.vue

@@ -126,8 +126,9 @@ export default {
       // 获取xml标签内容标签内容
       let xmlPro = await this.getProcess("xml");
       var xmlObj = this.xmlStr2XmlObj(xmlPro);
+
       // 生成节点顺序
-      getNodeSequence(xmlObj);
+      // getNodeSequence(xmlObj);
       // return;
       formData.startEventType =
         xmlObj
@@ -174,13 +175,13 @@ export default {
       // return;
       if (!data.bpmProcessConfigurationList.length) return;
       data.bpmProcessConfigurationList.forEach((item) => {
-        item.createBy = this.$store.state.user.name;
-        item.createById = this.$store.state.user.userId;
+        // item.createBy = this.$store.state.user.name;
+        // item.createById = this.$store.state.user.userId;
         item.nodeProcessKey = obj.getElementsByTagName("bpmn:process")[0].id;
-        item.createTime = moment().format("YYYY-MM-DD HH:mm:ss");
-        item.updateBy = this.$store.state.user.name;
-        item.updateById = this.$store.state.user.userId;
-        item.updateTime = moment().format("YYYY-MM-DD HH:mm:ss");
+        // item.createTime = moment().format("YYYY-MM-DD HH:mm:ss");
+        // item.updateBy = this.$store.state.user.name;
+        // item.updateById = this.$store.state.user.userId;
+        // item.updateTime = moment().format("YYYY-MM-DD HH:mm:ss");
       });
       try {
         let res = await addConfiguration(data);
@@ -193,10 +194,10 @@ export default {
       let theData = filterNodeMsg(this.nodeData(), data);
       if (!theData.bpmProcessConfigurationList.length) return;
       theData.bpmProcessConfigurationList.forEach((item) => {
-        item.updateBy = this.$store.state.user.name;
-        item.updateById = this.$store.state.user.userId;
+        // item.updateBy = this.$store.state.user.name;
+        // item.updateById = this.$store.state.user.userId;
         item.nodeProcessKey = obj.getElementsByTagName("bpmn:process")[0].id;
-        item.updateTime = moment().format("YYYY-MM-DD HH:mm:ss");
+        // item.updateTime = moment().format("YYYY-MM-DD HH:mm:ss");
       });
       try {
         let res = await updateConfiguration(theData);

+ 25 - 19
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/getNodeMsg.js

@@ -59,19 +59,20 @@ export function getNodeMsg(xmlObj) {
       updateBy: '',  //修改者
       remark: '',    //节点描述
     }
+    nodeObj.nodeType = node.localName;
+    if (nodeObj.nodeType == "sequenceFlow") return;
     let nodeExceptionList = getNodeException(node, nodeObj)
     let bpmNodeHandleUser = getBpmNodeHandleUser(node, nodeObj)
     bpmNodeScriptRelevanceList = [...bpmNodeScriptRelevanceList, ...nodeExceptionList];//获取节点脚本数据
     bpmNodeHandleUserList = [...bpmNodeHandleUserList, ...bpmNodeHandleUser]
-    console.dir(node);
     attributeArray.forEach(attr => {
       let tempAttr = prefix + ':' + attr
       nodeObj[attr] = node.attributes[tempAttr]?.nodeValue || ''
     });
     nodeObj.nodeKey = node.id;
-    nodeObj.nodeType = node.localName;
+    nodeObj.nodeName = node.getAttribute('name');
     bpmNodeHandleUser.length && (nodeObj.nodeRolePermission = node.getAttribute(`${prefix}:virtuallyRole`));
-    if (nodeObj.nodeType == "sequenceFlow") return;
+
     bpmProcessConfigurationList.push(nodeObj)
   })
   return {
@@ -82,7 +83,6 @@ export function getNodeMsg(xmlObj) {
 }
 
 function getNodeException(node, nodeObj) {
-  console.dir(node);
   let prefix = getProcessEngine();
   let res = []
   let { children } = node;
@@ -92,24 +92,24 @@ function getNodeException(node, nodeObj) {
       scriptTriggerType: node.getAttribute(`${prefix}:NormalScriptTriggerType`)
     })
   }
-  if (!children.length) return [];
-  children = Array.from(children);//数组化
-  let extensionElements = children.find((item) => item.nodeName == `bpmn:extensionElements`
-  )
-
-  if (!extensionElements) return [];
-  extensionElements.childNodes.forEach(item => {
-    if (item.nodeName == `${prefix}:unusualTask`) {
-      res.push({
-        scriptKey: item.attributes.scriptKey?.nodeValue,
-        scriptTriggerType: item.attributes?.scriptTriggerType?.nodeValue || 0
+  if (children.length) {
+    children = Array.from(children);//数组化
+    let extensionElements = children.find((item) => item.nodeName == `bpmn:extensionElements`
+    )
+    if (extensionElements) {
+      extensionElements.childNodes.forEach(item => {
+        if (item.nodeName == `${prefix}:unusualTask`) {
+          res.push({
+            scriptKey: item.attributes.scriptKey?.nodeValue,
+            scriptTriggerType: item.attributes?.scriptTriggerType?.nodeValue || 0
+          })
+        }
       })
-    }
-  })
+    };
+  };
   res.forEach((item) => {
     item.nodeKey = node.id;
   })
-  // console.log(res);
   if (res.length) {
     if (node.getAttribute(`${prefix}:scriptTriggerType`) == 'false') {
       nodeObj.nodeBefore = 'true';
@@ -148,7 +148,7 @@ function getBpmNodeHandleUser(node, nodeObj) {
 
 
 export function filterNodeMsg(oldMsg, newMsg) {
-  let keys = ['bpmProcessConfigurationList', 'bpmNodeScriptRelevanceList', 'bpmNodeHandleUserList']
+  let keys = ['bpmProcessConfigurationList', 'bpmNodeScriptRelevanceList', 'bpmNodeHandleUserList', 'removeNodeIds']
   newMsg[keys[0]].forEach(item => {
     let sameNode = oldMsg[keys[0]].find((oldItem) => oldItem.nodeKey == item.nodeKey)
     if (sameNode) {
@@ -168,5 +168,11 @@ export function filterNodeMsg(oldMsg, newMsg) {
     }
   })
 
+  newMsg[keys[3]] = oldMsg[keys[0]].filter(item => {
+    return !newMsg[keys[0]].find(sc => {
+      return sc.id == item.id
+    })
+  }).map(item => item.id)
+
   return newMsg;
 }

+ 330 - 0
ruoyi-ui/src/views/tableMange/components/StyleFormPanel.vue

@@ -0,0 +1,330 @@
+<template>
+  <div class="style-wrap">
+    <el-button
+      type="primary"
+      class="inline-large-button mb10"
+      icon="el-icon-plus"
+      size="mini"
+      @click="addDataDialog"
+    >
+      添加样式
+    </el-button>
+    <!-- 样式表格 -->
+    <el-table :data="[]" style="width: 100%">
+      <el-table-column label="序号" type="index" width="50"> </el-table-column>
+      <el-table-column prop="styleName" label="样式名" width="100">
+      </el-table-column>
+      <el-table-column prop="styleDescription" label="描述" width="100">
+      </el-table-column>
+      <el-table-column label="操作">
+        <template slot-scope="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="() => {}"
+                  >修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="() => {}"
+                  >删除
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog title="编辑样式" :visible.sync="dialogShow" width="50%">
+      <el-form
+        ref="styleFormDataRef"
+        :model="styleFormData"
+        label-width="100px"
+      >
+        <el-form-item label="样式名">
+          <el-input v-model="styleFormData.styleName"></el-input>
+        </el-form-item>
+        <el-form-item label="样式描述">
+          <el-input
+            type="textarea"
+            v-model="styleFormData.styleDescription"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="样式类型">
+          <el-radio-group v-model="styleFormData.styleType" size="small">
+            <el-radio-button :label="0">行样式</el-radio-button>
+            <el-radio-button :label="1">字段样式</el-radio-button>
+          </el-radio-group>
+        </el-form-item>
+        <template v-if="styleFormData.styleType == 0">
+          <el-form-item label="字体颜色">
+            <input
+              type="color"
+              :value="styleFormData.rowBgColor"
+              @input="selectColors($event, 'rowBgColor')"
+            />
+          </el-form-item>
+        </template>
+        <template v-else>
+          <el-form-item label="文本样式">
+            <el-radio-group v-model="styleFormData.fieldStyleType" size="small">
+              <el-radio-button :label="0">普通文本</el-radio-button>
+              <el-radio-button :label="1">标签</el-radio-button>
+            </el-radio-group>
+          </el-form-item>
+          <template v-if="styleFormData.fieldStyleType == 0">
+            <el-form-item label="字体颜色">
+              <input
+                type="color"
+                :value="styleFormData.fontColor"
+                @input="selectColors($event, 'fontColor')"
+              />
+            </el-form-item>
+          </template>
+          <template v-else>
+            <el-form-item label="标签样式">
+              <el-switch
+                v-model="styleFormData.isTagFullBg"
+                active-text="背景填充"
+                inactive-text="仅文字"
+              >
+              </el-switch>
+            </el-form-item>
+            <el-form-item label="标签类型">
+              <!-- <input
+                type="color"
+                :value="styleFormData.tagColor"
+                @input="selectColors($event, 'tagColor')"
+              /> -->
+              <el-select v-model="styleFormData.tagType">
+                <el-option
+                  v-for="(item, index) in tagTypeList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+
+              <el-tag
+                class="ml10"
+                size="normal"
+                :type="styleFormData.tagType"
+                :effect="styleFormData.isTagFullBg ? 'dark' : 'light'"
+                >标签一</el-tag
+              >
+            </el-form-item>
+          </template>
+        </template>
+        <div class="condition-table-wrap">
+          <span class="table-title">条件编辑</span>
+          <el-table :data="conditionTableData" style="width: 100%">
+            <el-table-column label="序号" type="index" width="50">
+            </el-table-column>
+            <el-table-column prop="tableKey" label="表名" width="150">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.tableKey" placeholder="请选择">
+                  <el-option
+                    v-for="item in []"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column prop="fieldName" label="字段名" width="150">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.fieldName" placeholder="请选择">
+                  <el-option
+                    v-for="item in []"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column prop="condition" label="条件" width="100">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.condition" placeholder="请选择">
+                  <el-option
+                    v-for="item in conditionList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column prop="flagValue" label="参照值" width="100">
+              <template slot-scope="scope">
+                <el-input
+                  v-model="scope.row.flagValue"
+                  @input="
+                    scope.row.flagValue = scope.row.flagValue.replace(
+                      /^(0+)|[^\d]+/g,
+                      ''
+                    )
+                  "
+                ></el-input>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="danger"
+                  icon="el-icon-delete"
+                  @click="() => {}"
+                  >删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-button
+            type="primary"
+            class="inline-large-button mb10"
+            icon="el-icon-plus"
+            size="mini"
+            style="width: 100%"
+            @click="addDataDialog"
+          >
+            添加条件
+          </el-button>
+        </div>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "StyleFormPanel",
+  props: [],
+  components: {},
+  data() {
+    return {
+      dialogShow: false,
+
+      // 表格样式数据
+      styleTableData: [],
+      styleFormData: {
+        styleName: "",
+        styleDescription: "",
+        styleType: 0, //0:行样式  1:字段样式
+        tableKey: "",
+        styleCode: "",
+        styleCondtion: "",
+        rowBgColor: "", //行背景色
+        fieldStyleType: 0, //字段样式类型 0:普通文本  1:标签
+        fontColor: "", //字体颜色
+        isTagFullBg: false, //tag背景色是否填满
+        tagType: "",
+
+        // styleCondtionObj: {
+        //   styleField: "", //样式生效字段
+        //   styleCondtionField: "", //样式条件依赖字段
+        //   styleCondtionList: [], //条件列表
+        // },
+      },
+      conditionTableData: [
+        {
+          tableKey: "",
+          fieldName: "",
+          condition: 1, //1:> 2:< 3:= 4:>= 5:<=
+          flagValue: 0,
+        },
+      ],
+      conditionList: [
+        {
+          value: 1,
+          label: ">",
+        },
+        {
+          value: 2,
+          label: "<",
+        },
+        {
+          value: 3,
+          label: "=",
+        },
+        {
+          value: 4,
+          label: ">=",
+        },
+        {
+          value: 5,
+          label: "<=",
+        },
+      ],
+      tagTypeList: [
+        {
+          value: "",
+          label: "默认",
+        },
+        {
+          value: "success",
+          label: "成功",
+        },
+        {
+          value: "info",
+          label: "普通",
+        },
+        {
+          value: "warning",
+          label: "警告",
+        },
+        {
+          value: "danger",
+          label: "危险",
+        },
+      ],
+    };
+  },
+  computed: {},
+  methods: {
+    // 添加一条样式数据回调
+    addDataDialog() {
+      this.dialogShow = true;
+    },
+
+    // 颜色改变回调
+    selectColors(event, tempField) {
+      console.log(tempField);
+      this.styleFormData[tempField] = event.target.value;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.style-wrap {
+  .condition-table-wrap {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    .table-title {
+      margin-bottom: 10px;
+      font-size: 16px;
+      font-weight: 600;
+    }
+  }
+}
+</style>

+ 171 - 146
ruoyi-ui/src/views/tableMange/index.vue

@@ -313,9 +313,9 @@
             >
               添加数据字段
             </el-button>
-            
+
             <!-- <el-button size="mini" type="primary" @click=countHandle>确定统计</el-button> -->
-         
+
             <el-table
               :data="dragTableStatisticList"
               border
@@ -369,40 +369,43 @@
               >
               </el-table-column>
               <el-table-column
-                  label="操作"
-                  align="center"
-                  class-name="small-padding fixed-width"
-                >
-              <template slot-scope="scope">
-                <el-dropdown>
-                  <el-button type="warning" plain size="small">
-                    处理<i class="el-icon-arrow-down el-icon--right"></i>
-                  </el-button>
-                  <el-dropdown-menu slot="dropdown">
-                    <el-dropdown-item>
-                      <el-button
-                        size="mini"
-                        type="text"
-                        icon="el-icon-edit"
-                        @click="handleUpdateStat(scope.row)"
-                        >修改
-                      </el-button>
-                    </el-dropdown-item>
-                        <el-dropdown-item>
-                          <el-button
-                            size="mini"
-                            type="text"
-                            icon="el-icon-delete"
-                            @click="handleDeleteStat(scope.row)"
-                            >删除
-                          </el-button>
-                        </el-dropdown-item>
-                      </el-dropdown-menu>
-                    </el-dropdown>
-                  </template>
-               </el-table-column>
+                label="操作"
+                align="center"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-dropdown>
+                    <el-button type="warning" plain size="small">
+                      处理<i class="el-icon-arrow-down el-icon--right"></i>
+                    </el-button>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item>
+                        <el-button
+                          size="mini"
+                          type="text"
+                          icon="el-icon-edit"
+                          @click="handleUpdateStat(scope.row)"
+                          >修改
+                        </el-button>
+                      </el-dropdown-item>
+                      <el-dropdown-item>
+                        <el-button
+                          size="mini"
+                          type="text"
+                          icon="el-icon-delete"
+                          @click="handleDeleteStat(scope.row)"
+                          >删除
+                        </el-button>
+                      </el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                </template>
+              </el-table-column>
             </el-table>
           </el-tab-pane>
+          <el-tab-pane label="样式编辑" name="styleEdit">
+            <StyleFormPanel />
+          </el-tab-pane>
         </el-tabs>
       </el-col>
     </el-row>
@@ -422,7 +425,13 @@
             :content="item.statisticTitle"
             placement="top-start"
           >
-            <div class="title">{{ item.statisticTitle ? item.statisticTitle : item.statisticDescription}}</div>
+            <div class="title">
+              {{
+                item.statisticTitle
+                  ? item.statisticTitle
+                  : item.statisticDescription
+              }}
+            </div>
           </el-tooltip>
 
           <!-- <el-tooltip
@@ -596,14 +605,8 @@
     </el-dialog>
 
     <!-- 添加数据统计对话框 -->
-    <el-dialog
-      :title="staictitle"
-      :visible.sync="isShowAddData"
-      width="30%">
-      
-      <el-form 
-      label-width="100px" 
-      :model="dataCountFormData">
+    <el-dialog :title="staictitle" :visible.sync="isShowAddData" width="30%">
+      <el-form label-width="100px" :model="dataCountFormData">
         <el-form-item label="统计标题" prop="statisticTitle">
           <el-input v-model="dataCountFormData.statisticTitle"></el-input>
         </el-form-item>
@@ -617,10 +620,14 @@
               v-for="item in dataArr"
               :key="item.id"
               :label="item.fieldName"
-              :value="item.tableName + '.'  + item.fieldName"
+              :value="item.tableName + '.' + item.fieldName"
             >
-            <span style="float: left;margin-right: 5px">{{ item.tableName }}  </span>
-            <span style="float: right; color: #8492a6; font-size: 13px">{{ item.fieldName }}</span>
+              <span style="float: left; margin-right: 5px"
+                >{{ item.tableName }}
+              </span>
+              <span style="float: right; color: #8492a6; font-size: 13px">{{
+                item.fieldName
+              }}</span>
             </el-option>
           </el-select>
         </el-form-item>
@@ -629,10 +636,16 @@
             <el-option label="数量" value="num"></el-option>
             <el-option label="状态" value="status"></el-option> -->
         <el-form-item label="统计类型">
-          <el-select 
-          v-model="dataCountFormData.statisticType" 
-          placeholder="请选择统计类型">
-            <el-option v-for="item in dataType" :key="item.dictCode" :label="item.dictLabel" :value="item.dictValue"></el-option>
+          <el-select
+            v-model="dataCountFormData.statisticType"
+            placeholder="请选择统计类型"
+          >
+            <el-option
+              v-for="item in dataType"
+              :key="item.dictCode"
+              :label="item.dictLabel"
+              :value="item.dictValue"
+            ></el-option>
             <!-- <el-option label="状态" value="status"></el-option> -->
           </el-select>
         </el-form-item>
@@ -646,7 +659,12 @@
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="closeAddDialog">取 消</el-button>
-        <el-button v-if="staictitle == '修改统计数据字段'" type="primary" @click="upadtaData">确 定</el-button>
+        <el-button
+          v-if="staictitle == '修改统计数据字段'"
+          type="primary"
+          @click="upadtaData"
+          >确 定</el-button
+        >
 
         <el-button v-else type="primary" @click="addData">确 定</el-button>
       </span>
@@ -663,7 +681,7 @@ import {
   getInfoBySqlKey,
   addTableData,
   addStatistic,
-  updateStatistic
+  updateStatistic,
 } from "@/api/tablelist/commonTable";
 import { getDicts } from "@/api/system/dict/data";
 import {
@@ -681,14 +699,16 @@ import Sortable from "sortablejs";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import { v4 as uuidv4 } from "uuid";
+
+import StyleFormPanel from "./components/StyleFormPanel.vue";
 export default {
   name: "tableMange",
   dicts: ["sys_time_format", "table_statistic_type"],
   props: [],
-  components: { Queryfrom, Treeselect },
+  components: { Queryfrom, Treeselect, StyleFormPanel },
   data() {
     return {
-      staictitle: '添加统计数据字段',
+      staictitle: "添加统计数据字段",
       isInputInvalid: false,
       // 修改表格时的menuId
       menuId: "",
@@ -705,7 +725,7 @@ export default {
       // 当前table唯一标识
       sqlKey: "",
       // 动态数据sqlkey
-      staticSqlKey: '',
+      staticSqlKey: "",
       // 表格的高度
       tableKey: "",
       // tableHeight: document.documentElement.scrollHeight - 245 + "px",
@@ -824,15 +844,15 @@ export default {
       dataCountFormData: {},
       // 添加数据统计表格
       dragTableStatisticList: [],
-      deepragTableStatisticList:[],
+      deepragTableStatisticList: [],
       tableSqlList: [],
       searchFieldList: [],
       // 是否切换到数据统计
       menudata: false,
       // 显示添加字段对话框
       isShowAddData: false,
-      dataType : [],
-      uuid: '',
+      dataType: [],
+      uuid: "",
     };
   },
   computed: {
@@ -1284,7 +1304,7 @@ export default {
       let asOrSpace = sqlType == "oracle" ? " " : " AS ";
 
       sql +=
-        key + 
+        key +
         " FROM " +
         isNeedUsername +
         // prefix +
@@ -1412,15 +1432,17 @@ export default {
             this.$message.warning("请至少选择一个包含查询字段");
             return false;
           }
-          const dataType = await this.getDicts("table_statistic_type")
-          this.deepragTableStatisticList = JSON.parse(JSON.stringify(this.dragTableStatisticList))
-          this.deepragTableStatisticList.forEach(item => {
-            dataType.data.forEach(val => {
-              if(val.dictValue ==  item.statisticType){
-                item.statisticType = val.dictLabel
+          const dataType = await this.getDicts("table_statistic_type");
+          this.deepragTableStatisticList = JSON.parse(
+            JSON.stringify(this.dragTableStatisticList)
+          );
+          this.deepragTableStatisticList.forEach((item) => {
+            dataType.data.forEach((val) => {
+              if (val.dictValue == item.statisticType) {
+                item.statisticType = val.dictLabel;
               }
-            })
-          })
+            });
+          });
           this.columns = this.columnsHandler(tempColumns);
           this.queryParams.isAsc = this.formData.isAsc;
           // 发送请求获取预览数据
@@ -1450,7 +1472,7 @@ export default {
     async createHandle() {
       // console.log(123);
       // this.sqlKey = uuidv4();
-      this.isInputInvalid = true
+      this.isInputInvalid = true;
       this.$refs.formData.validate(async (valid) => {
         if (valid) {
           // 检验表单合法性
@@ -1556,28 +1578,33 @@ export default {
               tableExportField: tableExportField, //导出字段名及列名
               echoData: JSON.stringify(echoData),
             };
-          
-            this.dragTableStatisticList?.forEach(item => {
-              if(this.tId == ''){
-                item.tableKey = this.tableKey
-                this.staticSqlKey = uuidv4()
-                item.sqlKey = this.staticSqlKey
+
+            this.dragTableStatisticList?.forEach((item) => {
+              if (this.tId == "") {
+                item.tableKey = this.tableKey;
+                this.staticSqlKey = uuidv4();
+                item.sqlKey = this.staticSqlKey;
               }
-              if(item.sqlKey){
-                this.staticSqlKey = item.sqlKey
+              if (item.sqlKey) {
+                this.staticSqlKey = item.sqlKey;
               } else {
-                this.staticSqlKey = uuidv4()
-                item.sqlKey = this.staticSqlKey
+                this.staticSqlKey = uuidv4();
+                item.sqlKey = this.staticSqlKey;
               }
-              
-              let key = item.statisticType + '(' + item.statisticField + ')'+ ' as result'
-              
+
+              let key =
+                item.statisticType +
+                "(" +
+                item.statisticField +
+                ")" +
+                " as result";
+
               this.tableSqlList.push({
-                tableSql: this.getStaticSQL(key), 
-                sqlKey: this.staticSqlKey, 
-              })
-              this.searchFieldList = searchFieldList
-            })
+                tableSql: this.getStaticSQL(key),
+                sqlKey: this.staticSqlKey,
+              });
+              this.searchFieldList = searchFieldList;
+            });
             let res;
             let res1;
             if (this.tId) {
@@ -1585,36 +1612,35 @@ export default {
               data.sqlKey = this.editData.sqlKey;
               data.tableKey = this.editData.tableKey;
               res = await editTable(data);
-              this.dragTableStatisticList.forEach(item => {
-                item.tableKey = this.editData.tableKey
-              })
+              this.dragTableStatisticList.forEach((item) => {
+                item.tableKey = this.editData.tableKey;
+              });
               res1 = await updateStatistic({
-                  tableKey: this.editData.tableKey,
-                  dragTableStatisticList: this.dragTableStatisticList,
-                  tableSqlList: this.tableSqlList,
-                  searchFieldList: this.searchFieldList,
-                  dtTableName: this.tableName
-              })
-
+                tableKey: this.editData.tableKey,
+                dragTableStatisticList: this.dragTableStatisticList,
+                tableSqlList: this.tableSqlList,
+                searchFieldList: this.searchFieldList,
+                dtTableName: this.tableName,
+              });
             } else {
               data.menuId = result.data;
               res = await addDragTable(data);
 
-              this.dragTableStatisticList.forEach(item => {
-                item.tableKey = this.tableKey
-              })
-              if(res.code == 200 && this.dragTableStatisticList.length !== 0){
+              this.dragTableStatisticList.forEach((item) => {
+                item.tableKey = this.tableKey;
+              });
+              if (res.code == 200 && this.dragTableStatisticList.length !== 0) {
                 // 新增统计数据
                 res1 = addStatistic({
                   tableKey: this.tableKey,
                   dragTableStatisticList: this.dragTableStatisticList,
                   tableSqlList: this.tableSqlList,
                   searchFieldList: this.searchFieldList,
-                  dtTableName: this.tableName
-                })
+                  dtTableName: this.tableName,
+                });
               }
             }
-            
+
             // 关闭当前页面
             if (this.tId) {
               if (res.code == 200) {
@@ -1645,7 +1671,7 @@ export default {
     async initTableData(tId) {
       let res = await getTableInfo(tId);
       if (res.code == 200) {
-        this.dragTableStatisticList = res.data.dragTableStatisticList
+        this.dragTableStatisticList = res.data.dragTableStatisticList;
         let echoData = JSON.parse(res.data.echoData);
         this.tableName = echoData.tableName;
         this.tableFieldList = echoData.tableFieldData;
@@ -1710,42 +1736,41 @@ export default {
     },
     // tab切换
     tabhandleClick() {
-      this.menudata = this.activeName === "datacount" ? true : false;
+      this.menudata = this.activeName != "menuedit" ? true : false;
     },
     // 添加数据字段对话框
     async addDataDialog() {
-      this.staictitle = '添加统计数据字段'
+      this.staictitle = "添加统计数据字段";
       this.isShowAddData = true;
       this.dataType = await this.getDicts("table_statistic_type");
       this.dataType = this.dataType.data;
       // console.log(this.dataType)
     },
     async updataDialog() {
-      
       // console.log(this.dataType)
     },
     // 修改数据字段
-    upadtaData(){
+    upadtaData() {
       this.dragTableStatisticList.forEach((item, index) => {
         // console.log(this.dataCountFormData);
-        if(item.id !== undefined && item.id == this.dataCountFormData.id){
-          this.dragTableStatisticList[index] = this.dataCountFormData
-        }else if(item.xid == this.dataCountFormData.xid){
-          this.dragTableStatisticList[index] = this.dataCountFormData
+        if (item.id !== undefined && item.id == this.dataCountFormData.id) {
+          this.dragTableStatisticList[index] = this.dataCountFormData;
+        } else if (item.xid == this.dataCountFormData.xid) {
+          this.dragTableStatisticList[index] = this.dataCountFormData;
         }
-      })
-      this.isShowAddData = false
+      });
+      this.isShowAddData = false;
       // console.log(this.dragTableStatisticList)
-      this.dataCountFormData = {}
+      this.dataCountFormData = {};
     },
     // 添加数据字段
-    addData(){
+    addData() {
       // console.log(this.dataCountFormData);
-      this.dataCountFormData.xid = Date.now()
-      this.dataCountFormData.tableKey = this.tableKey
-      this.dragTableStatisticList.push(this.dataCountFormData)
-      this.isShowAddData = false
-      this.dataCountFormData = {}
+      this.dataCountFormData.xid = Date.now();
+      this.dataCountFormData.tableKey = this.tableKey;
+      this.dragTableStatisticList.push(this.dataCountFormData);
+      this.isShowAddData = false;
+      this.dataCountFormData = {};
     },
     // 关闭添加数据字段
     closeAddDialog() {
@@ -1753,46 +1778,46 @@ export default {
       this.dataCountFormData = {};
     },
     // 确定统计
-    countHandle(){
+    countHandle() {
       addStatistic({
         dragTableStatisticList: this.dragTableStatisticList,
         tableSqlList: this.tableSqlList,
         searchFieldList: this.searchFieldList,
-        dtTableName: this.tableName
-      }).then(res=> {
+        dtTableName: this.tableName,
+      }).then((res) => {
         // console.log(res)
-      })
+      });
     },
     // 修改统计信息
-    async handleUpdateStat(row){
+    async handleUpdateStat(row) {
       // console.log(row);
-      this.dataCountFormData = row
-      this.dataCountFormData.xid = Date.now()
-      this.staictitle = '修改统计数据字段'
+      this.dataCountFormData = row;
+      this.dataCountFormData.xid = Date.now();
+      this.staictitle = "修改统计数据字段";
       this.dataType = await this.getDicts("table_statistic_type");
       this.dataType = this.dataType.data;
-      this.isShowAddData = true
+      this.isShowAddData = true;
       // console.log(this.dataCountFormData)
       // console.log(this.dragTableStatisticList);
     },
     // 删除统计信息
-    handleDeleteStat(row){
+    handleDeleteStat(row) {
       this.dragTableStatisticList.forEach((item, index) => {
-        if(item.id == row.id){
+        if (item.id == row.id) {
           this.dragTableStatisticList.splice(index, 1);
         }
-      })
+      });
     },
   },
   created() {},
-    async mounted() {
-      this.getAllTable();
-      this.initDragTable();
-      await this.getMenuList();
-      if (this.$route.query.tId) {
-        this.tId = this.$route.query.tId;
-        this.initTableData(this.tId);
-      }
+  async mounted() {
+    this.getAllTable();
+    this.initDragTable();
+    await this.getMenuList();
+    if (this.$route.query.tId) {
+      this.tId = this.$route.query.tId;
+      this.initTableData(this.tId);
+    }
   },
 };
 </script>
@@ -1841,7 +1866,7 @@ export default {
 }
 .card {
   /* width:15%; */
-  height:150px;
+  height: 150px;
   flex-basis: 15%;
   margin-bottom: 10px;
   margin-right: 15px;
@@ -1869,7 +1894,7 @@ export default {
   .type {
     float: right;
     margin-top: 40px;
-    .statisticType{
+    .statisticType {
       font-size: 18px;
     }
   }
@@ -1877,12 +1902,12 @@ export default {
     font-size: 25px;
   }
 }
-.mb8{
-  ::v-deep .el-col-18{
+.mb8 {
+  ::v-deep .el-col-18 {
     width: 30% !important;
     min-width: 220px !important;
   }
-  ::v-deep .previewbtn{
+  ::v-deep .previewbtn {
     min-width: 190px !important;
   }
 }

+ 56 - 56
ruoyi-ui/src/views/tablelist/commonTable/listInfo.vue

@@ -310,62 +310,6 @@ export default {
     this.sqlkey = this.$route.query.sqlkey;
   },
   methods: {
-    isUpperCase(char) {
-      return char === char.toUpperCase();
-    },
-    // 下划线命名转驼峰命名
-    toUnderScoreCase(str) {
-      if (str === null) {
-        return null;
-      }
-      let sb = "";
-      // 前置字符是否大写
-      let preCharIsUpperCase = true;
-      // 当前字符是否大写
-      let curreCharIsUpperCase = true;
-      // 下一字符是否大写
-      let nexteCharIsUpperCase = true;
-      for (let i = 0; i < str.length; i++) {
-        let c = str.charAt(i);
-        if (i > 0) {
-          preCharIsUpperCase = isUpperCase(str.charAt(i - 1));
-        } else {
-          preCharIsUpperCase = false;
-        }
-
-        curreCharIsUpperCase = isUpperCase(c);
-
-        if (i < str.length - 1) {
-          nexteCharIsUpperCase = isUpperCase(str.charAt(i + 1));
-        }
-
-        if (
-          preCharIsUpperCase &&
-          curreCharIsUpperCase &&
-          !nexteCharIsUpperCase
-        ) {
-          sb += SEPARATOR;
-        } else if (i !== 0 && !preCharIsUpperCase && curreCharIsUpperCase) {
-          sb += SEPARATOR;
-        }
-        sb += c.toLowerCase();
-      }
-
-      return sb;
-    },
-    // 处理列表信息
-    columnsHandler(columns) {
-      let resArr = [];
-      columns.forEach((item) => {
-        for (const key in item) {
-          let tempObj = {};
-          tempObj.key = camelCase(key);
-          tempObj.value = item[key];
-          resArr.push(tempObj);
-        }
-      });
-      return resArr;
-    },
     /** 查询列表 */
     getList(queryParams) {
       this.loading = true;
@@ -423,6 +367,62 @@ export default {
           })
         });
     },
+    isUpperCase(char) {
+      return char === char.toUpperCase();
+    },
+    // 下划线命名转驼峰命名
+    toUnderScoreCase(str) {
+      if (str === null) {
+        return null;
+      }
+      let sb = "";
+      // 前置字符是否大写
+      let preCharIsUpperCase = true;
+      // 当前字符是否大写
+      let curreCharIsUpperCase = true;
+      // 下一字符是否大写
+      let nexteCharIsUpperCase = true;
+      for (let i = 0; i < str.length; i++) {
+        let c = str.charAt(i);
+        if (i > 0) {
+          preCharIsUpperCase = isUpperCase(str.charAt(i - 1));
+        } else {
+          preCharIsUpperCase = false;
+        }
+
+        curreCharIsUpperCase = isUpperCase(c);
+
+        if (i < str.length - 1) {
+          nexteCharIsUpperCase = isUpperCase(str.charAt(i + 1));
+        }
+
+        if (
+          preCharIsUpperCase &&
+          curreCharIsUpperCase &&
+          !nexteCharIsUpperCase
+        ) {
+          sb += SEPARATOR;
+        } else if (i !== 0 && !preCharIsUpperCase && curreCharIsUpperCase) {
+          sb += SEPARATOR;
+        }
+        sb += c.toLowerCase();
+      }
+
+      return sb;
+    },
+    // 处理列表信息
+    columnsHandler(columns) {
+      let resArr = [];
+      columns.forEach((item) => {
+        for (const key in item) {
+          let tempObj = {};
+          tempObj.key = camelCase(key);
+          tempObj.value = item[key];
+          resArr.push(tempObj);
+        }
+      });
+      return resArr;
+    },
     // 取消按钮
     cancel() {
       this.open = false;

+ 17 - 2
ruoyi-ui/src/views/tablelist/commonTable/queryfrom.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <div class="cardBox" v-show="showCount">
+    <div class="cardBox" v-show="showCount" >
       <el-card
         shadow="hover"
         :body-style="{ padding: '20px' }"
@@ -85,6 +85,21 @@
               />
             </el-form-item>
           </span>
+          <!--      button按钮循环-->
+            <span
+              v-if="item.conditionType == 'button'"
+              style="width: 500px; height: 500px"
+            >
+            <el-form-item :label="item.conditionName"
+                          :prop="item.conditionField">
+              {{ queryParams.queryMap[item.conditionField] = item.conditionDefaultValue }}
+              <el-button
+                @keyup.enter.native="handleQuery"
+                @click="handleQuery">
+                {{ item.conditionNotes == null ? '按钮' : item.conditionNotes }}
+              </el-button>
+            </el-form-item>
+          </span>
           <!--      select下拉框循环-->
           <span
             v-if="item.conditionType == 'select'"
@@ -212,7 +227,7 @@ export default {
       // 单选/按钮
       radios: [],
       // card
-     
+
     };
   },
   watch: {

+ 7 - 1
ruoyi-ui/vue.config.js

@@ -4,6 +4,7 @@ const path = require('path')
 function resolve(dir) {
   return path.join(__dirname, dir)
 }
+const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
@@ -37,7 +38,11 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
+<<<<<<< HEAD
         target: `http://192.168.110.83:8080`,
+=======
+        target: `http://192.168.110.76:8080`,
+>>>>>>> 61c3b2a1bbef89cc20056ddf30d1203ffe17e3f1
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''
@@ -80,7 +85,8 @@ module.exports = {
         algorithm: 'gzip',              // 使用gzip压缩
         minRatio: 0.8,                   // 压缩率小于1才会压缩
 
-      })
+      }),
+      new MonacoWebpackPlugin()
     ],
     // devtool: isDev ? "source-map" : false
   },

Деякі файли не було показано, через те що забагато файлів було змінено