allen 2 сар өмнө
parent
commit
c0f681cdcd

+ 0 - 2
ips-ui/src/directive/index.js

@@ -3,12 +3,10 @@ import hasPermi from './permission/hasPermi'
 import dialogDrag from './dialog/drag'
 import dialogDragWidth from './dialog/dragWidth'
 import dialogDragHeight from './dialog/dragHeight'
-import clipboard from './module/clipboard'
 
 const install = function(Vue) {
   Vue.directive('hasRole', hasRole)
   Vue.directive('hasPermi', hasPermi)
-  Vue.directive('clipboard', clipboard)
   Vue.directive('dialogDrag', dialogDrag)
   Vue.directive('dialogDragWidth', dialogDragWidth)
   Vue.directive('dialogDragHeight', dialogDragHeight)

+ 0 - 54
ips-ui/src/directive/module/clipboard.js

@@ -1,54 +0,0 @@
-/**
-* v-clipboard 文字复制剪贴
-* Copyright (c) 2021 ruoyi
-*/
-
-import Clipboard from 'clipboard'
-export default {
-  bind(el, binding, vnode) {
-    switch (binding.arg) {
-      case 'success':
-        el._vClipBoard_success = binding.value;
-        break;
-      case 'error':
-        el._vClipBoard_error = binding.value;
-        break;
-      default: {
-        const clipboard = new Clipboard(el, {
-          text: () => binding.value,
-          action: () => binding.arg === 'cut' ? 'cut' : 'copy'
-        });
-        clipboard.on('success', e => {
-          const callback = el._vClipBoard_success;
-          callback && callback(e);
-        });
-        clipboard.on('error', e => {
-          const callback = el._vClipBoard_error;
-          callback && callback(e);
-        });
-        el._vClipBoard = clipboard;
-      }
-    }
-  },
-  update(el, binding) {
-    if (binding.arg === 'success') {
-      el._vClipBoard_success = binding.value;
-    } else if (binding.arg === 'error') {
-      el._vClipBoard_error = binding.value;
-    } else {
-      el._vClipBoard.text = function () { return binding.value; };
-      el._vClipBoard.action = () => binding.arg === 'cut' ? 'cut' : 'copy';
-    }
-  },
-  unbind(el, binding) {
-    if (!el._vClipboard) return
-    if (binding.arg === 'success') {
-      delete el._vClipBoard_success;
-    } else if (binding.arg === 'error') {
-      delete el._vClipBoard_error;
-    } else {
-      el._vClipBoard.destroy();
-      delete el._vClipBoard;
-    }
-  }
-}

+ 0 - 14
ips-ui/src/router/index.js

@@ -161,20 +161,6 @@ export const dynamicRoutes = [
         meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
       }
     ]
-  },
-  {
-    path: '/tool/design',
-    component: Layout,
-    hidden: true,
-    permissions: ['tool:gen:edit'],
-    children: [
-      {
-        path: 'index/:tableId(\\d+)',
-        component: () => import('@/views/tool/design/index'),
-        name: 'Design',
-        meta: { title: '修改生成配置', activeMenu: '/tool/design' }
-      }
-    ]
   }
 ]
 

+ 1 - 0
ips-ui/src/views/biz/features/index.vue

@@ -344,6 +344,7 @@ import { getStatic } from "@/api/biz/common";
 import { getOptionsByType } from "@/api/biz/config";
 import DynamicFormDialog from "@/components/DynamicFormDialog";
 import LogViewer from "@/components/LogViewer";
+const { shell } = window.require("electron");
 export default {
   name: "Features",
   dicts: ["biz_status"],

+ 0 - 828
ips-ui/src/views/tool/build/index.vue

@@ -1,828 +0,0 @@
-<template>
-  <div class="container">
-    <div class="left-board">
-      <div class="logo-wrapper">
-        <div class="logo"><img :src="logo" alt="logo" /> Form Generator</div>
-      </div>
-      <el-scrollbar class="left-scrollbar">
-        <div class="components-list">
-          <div class="components-title">
-            <svg-icon icon-class="component" />输入型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="inputComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <!--
-           draggable=".components-item"   只有class 为".components-item"的元素才能拖动
-          -->
-            <div
-              v-for="(element, index) in inputComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-          <div class="components-title">
-            <svg-icon icon-class="component" />选择型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="selectComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <div
-              v-for="(element, index) in selectComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-          <div class="components-title">
-            <svg-icon icon-class="component" /> 布局型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="layoutComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <div
-              v-for="(element, index) in layoutComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-        </div>
-      </el-scrollbar>
-    </div>
-
-    <div class="center-board">
-      <div class="action-bar">
-        <el-button icon="el-icon-download" type="text" @click="save">
-          保存vue文件到
-        </el-button>
-        <el-button icon="el-icon-download" type="text" @click="download">
-          导出vue文件
-        </el-button>
-        <el-button
-          class="copy-btn-main"
-          icon="el-icon-document-copy"
-          type="text"
-          @click="copy"
-        >
-          复制代码
-        </el-button>
-        <el-button
-          class="delete-btn"
-          icon="el-icon-delete"
-          type="text"
-          @click="empty"
-        >
-          清空
-        </el-button>
-      </div>
-      <el-scrollbar class="center-scrollbar">
-        <el-row class="center-board-row" :gutter="formConf.gutter">
-          <el-form
-            :size="formConf.size"
-            :label-position="formConf.labelPosition"
-            :disabled="formConf.disabled"
-            :label-width="formConf.labelWidth + 'px'"
-          >
-            <draggable
-              class="drawing-board"
-              :list="drawingList"
-              :animation="340"
-              group="componentsGroup"
-            >
-              <draggable-item
-                v-for="(element, index) in drawingList"
-                :key="element.renderKey"
-                :drawing-list="drawingList"
-                :element="element"
-                :index="index"
-                :active-id="activeId"
-                :form-conf="formConf"
-                @activeItem="activeFormItem"
-                @copyItem="drawingItemCopy"
-                @deleteItem="drawingItemDelete"
-              />
-            </draggable>
-            <div v-show="!drawingList.length" class="empty-info">
-              从左侧拖入或点选组件进行表单设计
-            </div>
-          </el-form>
-        </el-row>
-      </el-scrollbar>
-    </div>
-
-    <right-panel
-      :active-data="activeData"
-      :form-conf="formConf"
-      :show-field="!!drawingList.length"
-      @tag-change="tagChange"
-    />
-
-    <code-type-dialog
-      :visible.sync="dialogVisible"
-      title="选择生成类型"
-      :show-file-name="showFileName"
-      @confirm="generate"
-    />
-    <input id="copyNode" type="hidden" />
-  </div>
-</template>
-
-<script>
-import draggable from "vuedraggable";
-import beautifier from "js-beautify";
-import ClipboardJS from "clipboard";
-// import render from '@/utils/generator/render'
-import RightPanel from "./RightPanel";
-import {
-  inputComponents,
-  selectComponents,
-  layoutComponents,
-  formConf,
-} from "@/utils/generator/config";
-import { beautifierConf, titleCase } from "@/utils/index";
-import {
-  makeUpHtml,
-  vueTemplate,
-  vueScript,
-  cssStyle,
-} from "@/utils/generator/html";
-import { makeUpJs } from "@/utils/generator/js";
-import { makeUpCss } from "@/utils/generator/css";
-import drawingDefault from "@/utils/generator/drawingDefault";
-import logo from "@/assets/logo/xigongda_log.png";
-import CodeTypeDialog from "./CodeTypeDialog";
-import DraggableItem from "./DraggableItem";
-
-let oldActiveId;
-let tempActiveData;
-
-export default {
-  components: {
-    draggable,
-    // render,
-    RightPanel,
-    CodeTypeDialog,
-    DraggableItem,
-  },
-  data() {
-    return {
-      logo,
-      idGlobal: 100,
-      formConf,
-      inputComponents,
-      selectComponents,
-      layoutComponents,
-      labelWidth: 100,
-      drawingList: drawingDefault,
-      drawingData: {},
-      activeId: drawingDefault[0].formId,
-      drawerVisible: false,
-      formData: {},
-      dialogVisible: false,
-      generateConf: null,
-      showFileName: false,
-      activeData: drawingDefault[0],
-    };
-  },
-  created() {
-    // 防止 firefox 下 拖拽 会新打卡一个选项卡
-    document.body.ondrop = (event) => {
-      event.preventDefault();
-      event.stopPropagation();
-    };
-  },
-  watch: {
-    // eslint-disable-next-line func-names
-    "activeData.label": function (val, oldVal) {
-      if (
-        this.activeData.placeholder === undefined ||
-        !this.activeData.tag ||
-        oldActiveId !== this.activeId
-      ) {
-        return;
-      }
-      this.activeData.placeholder =
-        this.activeData.placeholder.replace(oldVal, "") + val;
-    },
-    activeId: {
-      handler(val) {
-        oldActiveId = val;
-      },
-      immediate: true,
-    },
-  },
-  mounted() {
-    const clipboard = new ClipboardJS("#copyNode", {
-      text: (trigger) => {
-        const codeStr = this.generateCode();
-        this.$notify({
-          title: "成功",
-          message: "代码已复制到剪切板,可粘贴。",
-          type: "success",
-        });
-        return codeStr;
-      },
-    });
-    clipboard.on("error", (e) => {
-      this.$message.error("代码复制失败");
-    });
-  },
-  methods: {
-    activeFormItem(element) {
-      console.log("activeFormItem", element);
-      this.activeData = element;
-      this.activeId = element.formId;
-    },
-    onEnd(obj, a) {
-      console.log("onEnd:", this.drawingList);
-      if (obj.from !== obj.to) {
-        this.activeData = tempActiveData;
-        this.activeId = this.idGlobal;
-      }
-    },
-    addComponent(item) {
-      console.log(item);
-      const clone = this.cloneComponent(item);
-      this.drawingList.push(clone);
-      this.activeFormItem(clone);
-    },
-    cloneComponent(origin) {
-      const clone = JSON.parse(JSON.stringify(origin));
-      clone.formId = ++this.idGlobal;
-      clone.span = formConf.span;
-      clone.renderKey = +new Date(); // 改变renderKey后可以实现强制更新组件
-      if (!clone.layout) clone.layout = "colFormItem";
-      if (clone.layout === "colFormItem") {
-        clone.vModel = `field${this.idGlobal}`;
-        clone.placeholder !== undefined && (clone.placeholder += clone.label);
-        tempActiveData = clone;
-      } else if (clone.layout === "rowFormItem") {
-        delete clone.label;
-        clone.componentName = `row${this.idGlobal}`;
-        clone.gutter = this.formConf.gutter;
-        tempActiveData = clone;
-      }
-      return tempActiveData; //这里返回的是vue对象,拖动后在vuedraggable-item里面进行渲染。
-    },
-    AssembleFormData() {
-      this.formData = {
-        fields: JSON.parse(JSON.stringify(this.drawingList)),
-        ...this.formConf,
-      };
-    },
-    generate(data) {
-      const func = this[`exec${titleCase(this.operationType)}`];
-      this.generateConf = data;
-      func && func(data);
-    },
-    execSave(data) {
-      this.AssembleFormData();
-      this.drawerVisible = true;
-    },
-    execRun(data) {
-      this.AssembleFormData();
-      this.drawerVisible = true;
-    },
-    execDownload(data) {
-      const codeStr = this.generateCode();
-      const blob = new Blob([codeStr], { type: "text/plain;charset=utf-8" });
-      this.$download.saveAs(blob, data.fileName);
-    },
-    execCopy(data) {
-      document.getElementById("copyNode").click();
-    },
-    empty() {
-      this.$confirm("确定要清空所有组件吗?", "提示", { type: "warning" }).then(
-        () => {
-          this.drawingList = [];
-        }
-      );
-    },
-    drawingItemCopy(item, parent) {
-      let clone = JSON.parse(JSON.stringify(item));
-      clone = this.createIdAndKey(clone);
-      parent.push(clone);
-      this.activeFormItem(clone);
-    },
-    createIdAndKey(item) {
-      item.formId = ++this.idGlobal;
-      item.renderKey = +new Date();
-      if (item.layout === "colFormItem") {
-        item.vModel = `field${this.idGlobal}`;
-      } else if (item.layout === "rowFormItem") {
-        item.componentName = `row${this.idGlobal}`;
-      }
-      if (Array.isArray(item.children)) {
-        item.children = item.children.map((childItem) =>
-          this.createIdAndKey(childItem)
-        );
-      }
-      return item;
-    },
-    drawingItemDelete(index, parent) {
-      parent.splice(index, 1);
-      this.$nextTick(() => {
-        const len = this.drawingList.length;
-        if (len) {
-          this.activeFormItem(this.drawingList[len - 1]);
-        }
-      });
-    },
-    generateCode() {
-      const { type } = this.generateConf;
-      this.AssembleFormData();
-      console.log(this.formData);
-      const script = vueScript(makeUpJs(this.formData, type));
-      const html = vueTemplate(makeUpHtml(this.formData, type));
-      const css = cssStyle(makeUpCss(this.formData));
-      return beautifier.html(html + script + css, beautifierConf.html);
-    },
-    download() {
-      this.dialogVisible = true;
-      this.showFileName = true;
-      this.operationType = "download";
-    },
-    save() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "save";
-    },
-    run() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "run";
-    },
-    copy() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "copy";
-    },
-    tagChange(newTag) {
-      newTag = this.cloneComponent(newTag);
-      newTag.vModel = this.activeData.vModel;
-      newTag.formId = this.activeId;
-      newTag.span = this.activeData.span;
-      delete this.activeData.tag;
-      delete this.activeData.tagIcon;
-      delete this.activeData.document;
-      Object.keys(newTag).forEach((key) => {
-        if (
-          this.activeData[key] !== undefined &&
-          typeof this.activeData[key] === typeof newTag[key]
-        ) {
-          newTag[key] = this.activeData[key];
-        }
-      });
-      this.activeData = newTag;
-      this.updateDrawingList(newTag, this.drawingList);
-    },
-    updateDrawingList(newTag, list) {
-      const index = list.findIndex((item) => item.formId === this.activeId);
-      if (index > -1) {
-        list.splice(index, 1, newTag);
-      } else {
-        list.forEach((item) => {
-          if (Array.isArray(item.children))
-            this.updateDrawingList(newTag, item.children);
-        });
-      }
-    },
-  },
-};
-</script>
-
-<style lang="scss">
-.editor-tabs {
-  background: #121315;
-  .el-tabs__header {
-    margin: 0;
-    border-bottom-color: #121315;
-    .el-tabs__nav {
-      border-color: #121315;
-    }
-  }
-  .el-tabs__item {
-    height: 32px;
-    line-height: 32px;
-    color: #888a8e;
-    border-left: 1px solid #121315 !important;
-    background: #363636;
-    margin-right: 5px;
-    user-select: none;
-  }
-  .el-tabs__item.is-active {
-    background: #1e1e1e;
-    border-bottom-color: #1e1e1e !important;
-    color: #fff;
-  }
-  .el-icon-edit {
-    color: #f1fa8c;
-  }
-  .el-icon-document {
-    color: #a95812;
-  }
-}
-
-// home
-.right-scrollbar {
-  .el-scrollbar__view {
-    padding: 12px 18px 15px 15px;
-  }
-}
-.left-scrollbar .el-scrollbar__wrap {
-  box-sizing: border-box;
-  overflow-x: hidden !important;
-  margin-bottom: 0 !important;
-}
-.center-tabs {
-  .el-tabs__header {
-    margin-bottom: 0 !important;
-  }
-  .el-tabs__item {
-    width: 50%;
-    text-align: center;
-  }
-  .el-tabs__nav {
-    width: 100%;
-  }
-}
-.reg-item {
-  padding: 12px 6px;
-  background: #f8f8f8;
-  position: relative;
-  border-radius: 4px;
-  .close-btn {
-    position: absolute;
-    right: -6px;
-    top: -6px;
-    display: block;
-    width: 16px;
-    height: 16px;
-    line-height: 16px;
-    background: rgba(0, 0, 0, 0.2);
-    border-radius: 50%;
-    color: #fff;
-    text-align: center;
-    z-index: 1;
-    cursor: pointer;
-    font-size: 12px;
-    &:hover {
-      background: rgba(210, 23, 23, 0.5);
-    }
-  }
-  & + .reg-item {
-    margin-top: 18px;
-  }
-}
-.action-bar {
-  & .el-button + .el-button {
-    margin-left: 15px;
-  }
-  & i {
-    font-size: 20px;
-    vertical-align: middle;
-    position: relative;
-    top: -1px;
-  }
-}
-
-.custom-tree-node {
-  width: 100%;
-  font-size: 14px;
-  .node-operation {
-    float: right;
-  }
-  i[class*="el-icon"] + i[class*="el-icon"] {
-    margin-left: 6px;
-  }
-  .el-icon-plus {
-    color: #409eff;
-  }
-  .el-icon-delete {
-    color: #157a0c;
-  }
-}
-
-.left-scrollbar .el-scrollbar__view {
-  overflow-x: hidden;
-}
-
-.el-rate {
-  display: inline-block;
-  vertical-align: text-top;
-}
-.el-upload__tip {
-  line-height: 1.2;
-}
-
-$selectedColor: #f6f7ff;
-$lighterBlue: #409eff;
-
-.container {
-  position: relative;
-  width: 100%;
-  height: 100%;
-}
-
-.components-list {
-  padding: 8px;
-  box-sizing: border-box;
-  height: 100%;
-  .components-item {
-    display: inline-block;
-    width: 48%;
-    margin: 1%;
-    transition: transform 0ms !important;
-  }
-}
-.components-draggable {
-  padding-bottom: 20px;
-}
-.components-title {
-  font-size: 14px;
-  color: #222;
-  margin: 6px 2px;
-  .svg-icon {
-    color: #666;
-    font-size: 18px;
-  }
-}
-
-.components-body {
-  padding: 8px 10px;
-  background: $selectedColor;
-  font-size: 12px;
-  cursor: move;
-  border: 1px dashed $selectedColor;
-  border-radius: 3px;
-  .svg-icon {
-    color: #777;
-    font-size: 15px;
-  }
-  &:hover {
-    border: 1px dashed #787be8;
-    color: #787be8;
-    .svg-icon {
-      color: #787be8;
-    }
-  }
-}
-
-.left-board {
-  width: 260px;
-  position: absolute;
-  left: 0;
-  top: 0;
-  height: 100vh;
-}
-.left-scrollbar {
-  height: calc(100vh - 42px);
-  overflow: hidden;
-}
-.center-scrollbar {
-  height: calc(100vh - 42px);
-  overflow: hidden;
-  border-left: 1px solid #f1e8e8;
-  border-right: 1px solid #f1e8e8;
-  box-sizing: border-box;
-}
-.center-board {
-  height: 100vh;
-  width: auto;
-  margin: 0 350px 0 260px;
-  box-sizing: border-box;
-}
-.empty-info {
-  position: absolute;
-  top: 46%;
-  left: 0;
-  right: 0;
-  text-align: center;
-  font-size: 18px;
-  color: #ccb1ea;
-  letter-spacing: 4px;
-}
-.action-bar {
-  position: relative;
-  height: 42px;
-  text-align: right;
-  padding: 0 15px;
-  box-sizing: border-box;
-  border: 1px solid #f1e8e8;
-  border-top: none;
-  border-left: none;
-  .delete-btn {
-    color: #f56c6c;
-  }
-}
-.logo-wrapper {
-  position: relative;
-  height: 42px;
-  background: #fff;
-  border-bottom: 1px solid #f1e8e8;
-  box-sizing: border-box;
-}
-.logo {
-  position: absolute;
-  left: 12px;
-  top: 6px;
-  line-height: 30px;
-  color: #00afff;
-  font-weight: 600;
-  font-size: 17px;
-  white-space: nowrap;
-  > img {
-    width: 30px;
-    height: 30px;
-    vertical-align: top;
-  }
-  .github {
-    display: inline-block;
-    vertical-align: sub;
-    margin-left: 15px;
-    > img {
-      height: 22px;
-    }
-  }
-}
-
-.center-board-row {
-  padding: 12px 12px 15px 12px;
-  box-sizing: border-box;
-  & > .el-form {
-    // 69 = 12+15+42
-    height: calc(100vh - 69px);
-  }
-}
-.drawing-board {
-  height: 100%;
-  position: relative;
-  .components-body {
-    padding: 0;
-    margin: 0;
-    font-size: 0;
-  }
-  .sortable-ghost {
-    position: relative;
-    display: block;
-    overflow: hidden;
-    &::before {
-      content: " ";
-      position: absolute;
-      left: 0;
-      right: 0;
-      top: 0;
-      height: 3px;
-      background: rgb(89, 89, 223);
-      z-index: 2;
-    }
-  }
-  .components-item.sortable-ghost {
-    width: 100%;
-    height: 60px;
-    background-color: $selectedColor;
-  }
-  .active-from-item {
-    & > .el-form-item {
-      background: $selectedColor;
-      border-radius: 6px;
-    }
-    & > .drawing-item-copy,
-    & > .drawing-item-delete {
-      display: initial;
-    }
-    & > .component-name {
-      color: $lighterBlue;
-    }
-  }
-  .el-form-item {
-    margin-bottom: 15px;
-  }
-}
-.drawing-item {
-  position: relative;
-  cursor: move;
-  &.unfocus-bordered:not(.activeFromItem) > div:first-child {
-    border: 1px dashed #ccc;
-  }
-  .el-form-item {
-    padding: 12px 10px;
-  }
-}
-.drawing-row-item {
-  position: relative;
-  cursor: move;
-  box-sizing: border-box;
-  border: 1px dashed #ccc;
-  border-radius: 3px;
-  padding: 0 2px;
-  margin-bottom: 15px;
-  .drawing-row-item {
-    margin-bottom: 2px;
-  }
-  .el-col {
-    margin-top: 22px;
-  }
-  .el-form-item {
-    margin-bottom: 0;
-  }
-  .drag-wrapper {
-    min-height: 80px;
-  }
-  &.active-from-item {
-    border: 1px dashed $lighterBlue;
-  }
-  .component-name {
-    position: absolute;
-    top: 0;
-    left: 0;
-    font-size: 12px;
-    color: #bbb;
-    display: inline-block;
-    padding: 0 6px;
-  }
-}
-.drawing-item,
-.drawing-row-item {
-  &:hover {
-    & > .el-form-item {
-      background: $selectedColor;
-      border-radius: 6px;
-    }
-    & > .drawing-item-copy,
-    & > .drawing-item-delete {
-      display: initial;
-    }
-  }
-  & > .drawing-item-copy,
-  & > .drawing-item-delete {
-    display: none;
-    position: absolute;
-    top: -10px;
-    width: 22px;
-    height: 22px;
-    line-height: 22px;
-    text-align: center;
-    border-radius: 50%;
-    font-size: 12px;
-    border: 1px solid;
-    cursor: pointer;
-    z-index: 1;
-  }
-  & > .drawing-item-copy {
-    right: 56px;
-    border-color: $lighterBlue;
-    color: $lighterBlue;
-    background: #fff;
-    &:hover {
-      background: $lighterBlue;
-      color: #fff;
-    }
-  }
-  & > .drawing-item-delete {
-    right: 24px;
-    border-color: #f56c6c;
-    color: #f56c6c;
-    background: #fff;
-    &:hover {
-      background: #f56c6c;
-      color: #fff;
-    }
-  }
-}
-</style>

+ 0 - 966
ips-ui/src/views/tool/design/index.vue

@@ -1,966 +0,0 @@
-<template>
-  <div class="container">
-    <div class="left-board">
-      <div class="logo-wrapper">
-        <div class="logo"><img :src="logo" alt="logo" /> DESIGNER</div>
-      </div>
-      <el-tabs v-model="currentTabLeft" class="center-tabs">
-        <el-tab-pane label="组件" name="componentListTab" />
-        <el-tab-pane label="业务对象" name="bizObjListTab" />
-      </el-tabs>
-      <el-scrollbar
-        class="left-scrollbar"
-        v-if="currentTabLeft === 'componentListTab'"
-      >
-        <div class="components-list">
-          <div class="components-title">
-            <svg-icon icon-class="component" />输入型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="inputComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <!--
-           draggable=".components-item"   只有class 为".components-item"的元素才能拖动
-          -->
-            <div
-              v-for="(element, index) in inputComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-          <div class="components-title">
-            <svg-icon icon-class="component" />选择型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="selectComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <div
-              v-for="(element, index) in selectComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-          <div class="components-title">
-            <svg-icon icon-class="component" /> 布局型组件
-          </div>
-          <draggable
-            class="components-draggable"
-            :list="layoutComponents"
-            :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-            :clone="cloneComponent"
-            draggable=".components-item"
-            :sort="false"
-            @end="onEnd"
-          >
-            <div
-              v-for="(element, index) in layoutComponents"
-              :key="index"
-              class="components-item"
-              @click="addComponent(element)"
-            >
-              <div class="components-body">
-                <svg-icon :icon-class="element.tagIcon" />
-                {{ element.label }}
-              </div>
-            </div>
-          </draggable>
-        </div>
-      </el-scrollbar>
-
-      <el-scrollbar
-        v-if="currentTabLeft === 'bizObjListTab'"
-        class="left-scrollbar"
-      >
-        <div class="components-list">
-          <el-collapse v-model="bizObjActiveNames" @change="handleChange">
-            <el-collapse-item :title="'业务对象:' + this.tableId" name="1">
-              <draggable
-                class="components-draggable"
-                :list="this.bizObjList.tableColList"
-                :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
-                :clone="cloneComponent"
-                draggable=".components-item"
-                :sort="false"
-                @end="onEnd"
-              >
-                <!--
-                draggable=".components-item"   只有class 为".components-item"的元素才能拖动
-                -->
-                <div
-                  v-for="(element, key, index) in this.bizObjList.tableColList"
-                  :key="key"
-                  class="components-item"
-                  @click="addComponent(element)"
-                >
-                  <div class="components-body">
-                    <!-- <svg-icon :icon-class="element.tagIcon" /> -->
-                    {{ element.columnName }}
-                  </div>
-                </div>
-              </draggable>
-            </el-collapse-item>
-          </el-collapse>
-
-          <!-- <div class="components-title">
-            <svg-icon icon-class="component" />子对象:{{key}}
-          </div> -->
-          <div
-            v-for="(elementList, key, index) in this.bizObjList.childColMap"
-            :key="key"
-          >
-            <el-collapse v-model="childActiveNames" @change="handleChange">
-              <el-collapse-item :title="'子对象:' + key" name="1">
-                <!-- <svg-icon icon-class="component" />子对象:{{key}} -->
-                <draggable
-                  class="components-draggable"
-                  :list="elementList"
-                  :group="{
-                    name: 'componentsGroup',
-                    pull: 'clone',
-                    put: false,
-                  }"
-                  :clone="cloneComponent"
-                  draggable=".components-item"
-                  :sort="false"
-                  @end="onEnd"
-                >
-                  <div
-                    v-for="(item, index) in elementList"
-                    :key="index"
-                    class="components-item"
-                    @click="addComponent(item)"
-                  >
-                    <div class="components-body">
-                      <!-- <svg-icon :icon-class="input" /> -->
-                      {{ item.columnName }}
-                    </div>
-                  </div>
-                </draggable>
-              </el-collapse-item>
-            </el-collapse>
-          </div>
-
-          <!-- <div class="components-title">
-            <svg-icon icon-class="component" /> 关联对象
-          </div> -->
-          <div
-            v-for="(elementList, key, index) in this.bizObjList.relColMap"
-            :key="key"
-          >
-            <el-collapse v-model="childActiveNames" @change="handleChange">
-              <el-collapse-item :title="'关联对象:' + key" name="1">
-                <!-- <svg-icon icon-class="component" />关联对象:{{key}} -->
-                <draggable
-                  class="components-draggable"
-                  :list="elementList"
-                  :group="{
-                    name: 'componentsGroup',
-                    pull: 'clone',
-                    put: false,
-                  }"
-                  :clone="cloneComponent"
-                  draggable=".components-item"
-                  :sort="false"
-                  @end="onEnd"
-                >
-                  <div
-                    v-for="(item, index) in elementList"
-                    :key="index"
-                    class="components-item"
-                    @click="addComponent(item)"
-                  >
-                    <div class="components-body">
-                      <!-- <svg-icon :icon-class="element.tagIcon" /> -->
-                      {{ item.columnName }}
-                    </div>
-                  </div>
-                </draggable>
-              </el-collapse-item>
-            </el-collapse>
-          </div>
-        </div>
-      </el-scrollbar>
-    </div>
-
-    <div class="center-board">
-      <div class="action-bar">
-        <el-button icon="el-icon-download" type="text" @click="save">
-          保存vue文件到
-        </el-button>
-        <el-button icon="el-icon-download" type="text" @click="download">
-          导出vue文件
-        </el-button>
-        <el-button
-          class="copy-btn-main"
-          icon="el-icon-document-copy"
-          type="text"
-          @click="copy"
-        >
-          复制代码
-        </el-button>
-        <el-button
-          class="delete-btn"
-          icon="el-icon-delete"
-          type="text"
-          @click="empty"
-        >
-          清空
-        </el-button>
-      </div>
-      <el-scrollbar class="center-scrollbar">
-        <el-row class="center-board-row" :gutter="formConf.gutter">
-          <el-form
-            :size="formConf.size"
-            :label-position="formConf.labelPosition"
-            :disabled="formConf.disabled"
-            :label-width="formConf.labelWidth + 'px'"
-          >
-            <draggable
-              class="drawing-board"
-              :list="drawingList"
-              :animation="340"
-              group="componentsGroup"
-            >
-              <draggable-item
-                v-for="(element, index) in drawingList"
-                :key="element.renderKey"
-                :drawing-list="drawingList"
-                :element="element"
-                :index="index"
-                :active-id="activeId"
-                :form-conf="formConf"
-                @activeItem="activeFormItem"
-                @copyItem="drawingItemCopy"
-                @deleteItem="drawingItemDelete"
-              />
-            </draggable>
-            <div v-show="!drawingList.length" class="empty-info">
-              从左侧拖入或点选组件进行表单设计
-            </div>
-          </el-form>
-        </el-row>
-      </el-scrollbar>
-    </div>
-
-    <right-panel
-      :active-data="activeData"
-      :form-conf="formConf"
-      :show-field="!!drawingList.length"
-      @tag-change="tagChange"
-    />
-
-    <code-type-dialog
-      :visible.sync="dialogVisible"
-      title="选择生成类型"
-      :show-file-name="showFileName"
-      @confirm="generate"
-    />
-    <input id="copyNode" type="hidden" />
-  </div>
-</template>
-
-<script>
-import draggable from "vuedraggable";
-import beautifier from "js-beautify";
-import ClipboardJS from "clipboard";
-// import render from '@/utils/generator/render'
-import RightPanel from "./RightPanel";
-import {
-  inputComponents,
-  selectComponents,
-  layoutComponents,
-  formConf,
-} from "@/utils/generator/config";
-import { beautifierConf, titleCase } from "@/utils/index";
-import {
-  makeUpHtml,
-  vueTemplate,
-  vueScript,
-  cssStyle,
-} from "@/utils/generator/html";
-import { makeUpJs } from "@/utils/generator/js";
-import { makeUpCss } from "@/utils/generator/css";
-import drawingDefault from "@/utils/generator/drawingDefault";
-import logo from "@/assets/logo/xigongda_log.png";
-import CodeTypeDialog from "./CodeTypeDialog";
-import DraggableItem from "./DraggableItem";
-import { getGenTable, updateGenTable } from "@/api/tool/gen";
-
-let oldActiveId;
-let tempActiveData;
-
-export default {
-  components: {
-    draggable,
-    // render,
-    RightPanel,
-    CodeTypeDialog,
-    DraggableItem,
-  },
-  props: {
-    bizObjList: {
-      type: Object,
-      default: null,
-    },
-  },
-  relObj: [],
-  data() {
-    return {
-      logo,
-      idGlobal: 100,
-      formConf,
-      inputComponents,
-      selectComponents,
-      objAttributes: [],
-      layoutComponents,
-      labelWidth: 100,
-      drawingList: drawingDefault,
-      drawingData: {},
-      activeId: drawingDefault[0].formId,
-      drawerVisible: false,
-      formData: {},
-      dialogVisible: false,
-      generateConf: null,
-      showFileName: false,
-      activeData: drawingDefault[0],
-      currentTabLeft: "bizObjListTab",
-      tableId: "",
-    };
-  },
-  created() {
-    // 防止 firefox 下 拖拽 会新打卡一个选项卡
-    document.body.ondrop = (event) => {
-      event.preventDefault();
-      event.stopPropagation();
-    };
-    const tableId = this.$route.params && this.$route.params.tableId;
-    this.tableId = tableId;
-    debugger;
-    // console.log('tableId::',this.tableId)
-  },
-  watch: {
-    // eslint-disable-next-line func-names
-    "activeData.label": function (val, oldVal) {
-      if (
-        this.activeData.placeholder === undefined ||
-        !this.activeData.tag ||
-        oldActiveId !== this.activeId
-      ) {
-        return;
-      }
-      this.activeData.placeholder =
-        this.activeData.placeholder.replace(oldVal, "") + val;
-    },
-    activeId: {
-      handler(val) {
-        oldActiveId = val;
-      },
-      immediate: true,
-    },
-  },
-  mounted() {
-    const clipboard = new ClipboardJS("#copyNode", {
-      text: (trigger) => {
-        const codeStr = this.generateCode();
-        this.$notify({
-          title: "成功",
-          message: "代码已复制到剪切板,可粘贴。",
-          type: "success",
-        });
-        return codeStr;
-      },
-    });
-    clipboard.on("error", (e) => {
-      this.$message.error("代码复制失败");
-    });
-  },
-  methods: {
-    activeFormItem(element) {
-      console.log("activeFormItem", element);
-      this.activeData = element;
-      this.activeId = element.formId;
-    },
-    onEnd(obj, a) {
-      console.log("onEnd:", this.drawingList);
-      if (obj.from !== obj.to) {
-        this.activeData = tempActiveData;
-        this.activeId = this.idGlobal;
-      }
-    },
-    addComponent(item) {
-      console.log(item);
-      const clone = this.cloneComponent(item);
-      this.drawingList.push(clone);
-      this.activeFormItem(clone);
-    },
-    cloneComponent(origin) {
-      const clone = JSON.parse(JSON.stringify(origin));
-      clone.formId = ++this.idGlobal;
-      clone.span = formConf.span;
-      clone.renderKey = +new Date(); // 改变renderKey后可以实现强制更新组件
-      if (!clone.layout) clone.layout = "colFormItem";
-      if (clone.layout === "colFormItem") {
-        clone.vModel = `field${this.idGlobal}`;
-        clone.placeholder !== undefined && (clone.placeholder += clone.label);
-        tempActiveData = clone;
-      } else if (clone.layout === "rowFormItem") {
-        delete clone.label;
-        clone.componentName = `row${this.idGlobal}`;
-        clone.gutter = this.formConf.gutter;
-        tempActiveData = clone;
-      }
-      return tempActiveData; //这里返回的是vue对象,拖动后在vuedraggable-item里面进行渲染。
-    },
-    AssembleFormData() {
-      this.formData = {
-        fields: JSON.parse(JSON.stringify(this.drawingList)),
-        ...this.formConf,
-      };
-    },
-    generate(data) {
-      const func = this[`exec${titleCase(this.operationType)}`];
-      this.generateConf = data;
-      func && func(data);
-    },
-    execSave(data) {
-      this.AssembleFormData();
-      this.drawerVisible = true;
-    },
-    execRun(data) {
-      this.AssembleFormData();
-      this.drawerVisible = true;
-    },
-    execDownload(data) {
-      const codeStr = this.generateCode();
-      const blob = new Blob([codeStr], { type: "text/plain;charset=utf-8" });
-      this.$download.saveAs(blob, data.fileName);
-    },
-    execCopy(data) {
-      document.getElementById("copyNode").click();
-    },
-    empty() {
-      this.$confirm("确定要清空所有组件吗?", "提示", { type: "warning" }).then(
-        () => {
-          this.drawingList = [];
-        }
-      );
-    },
-    drawingItemCopy(item, parent) {
-      let clone = JSON.parse(JSON.stringify(item));
-      clone = this.createIdAndKey(clone);
-      parent.push(clone);
-      this.activeFormItem(clone);
-    },
-    createIdAndKey(item) {
-      item.formId = ++this.idGlobal;
-      item.renderKey = +new Date();
-      if (item.layout === "colFormItem") {
-        item.vModel = `field${this.idGlobal}`;
-      } else if (item.layout === "rowFormItem") {
-        item.componentName = `row${this.idGlobal}`;
-      }
-      if (Array.isArray(item.children)) {
-        item.children = item.children.map((childItem) =>
-          this.createIdAndKey(childItem)
-        );
-      }
-      return item;
-    },
-    drawingItemDelete(index, parent) {
-      parent.splice(index, 1);
-      this.$nextTick(() => {
-        const len = this.drawingList.length;
-        if (len) {
-          this.activeFormItem(this.drawingList[len - 1]);
-        }
-      });
-    },
-    generateCode() {
-      const { type } = this.generateConf;
-      this.AssembleFormData();
-      console.log(this.formData);
-      const script = vueScript(makeUpJs(this.formData, type));
-      const html = vueTemplate(makeUpHtml(this.formData, type));
-      const css = cssStyle(makeUpCss(this.formData));
-      return beautifier.html(html + script + css, beautifierConf.html);
-    },
-    download() {
-      this.dialogVisible = true;
-      this.showFileName = true;
-      this.operationType = "download";
-    },
-    save() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "save";
-    },
-    run() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "run";
-    },
-    copy() {
-      this.dialogVisible = true;
-      this.showFileName = false;
-      this.operationType = "copy";
-    },
-    tagChange(newTag) {
-      newTag = this.cloneComponent(newTag);
-      newTag.vModel = this.activeData.vModel;
-      newTag.formId = this.activeId;
-      newTag.span = this.activeData.span;
-      delete this.activeData.tag;
-      delete this.activeData.tagIcon;
-      delete this.activeData.document;
-      Object.keys(newTag).forEach((key) => {
-        if (
-          this.activeData[key] !== undefined &&
-          typeof this.activeData[key] === typeof newTag[key]
-        ) {
-          newTag[key] = this.activeData[key];
-        }
-      });
-      this.activeData = newTag;
-      this.updateDrawingList(newTag, this.drawingList);
-    },
-
-    updateDrawingList(newTag, list) {
-      const index = list.findIndex((item) => item.formId === this.activeId);
-      if (index > -1) {
-        list.splice(index, 1, newTag);
-      } else {
-        list.forEach((item) => {
-          if (Array.isArray(item.children))
-            this.updateDrawingList(newTag, item.children);
-        });
-      }
-    },
-    handleChange() {},
-  },
-};
-</script>
-
-<style lang="scss">
-.editor-tabs {
-  background: #121315;
-  .el-tabs__header {
-    margin: 0;
-    border-bottom-color: #121315;
-    .el-tabs__nav {
-      border-color: #121315;
-    }
-  }
-  .el-tabs__item {
-    height: 32px;
-    line-height: 32px;
-    color: #888a8e;
-    border-left: 1px solid #121315 !important;
-    background: #363636;
-    margin-right: 5px;
-    user-select: none;
-  }
-  .el-tabs__item.is-active {
-    background: #1e1e1e;
-    border-bottom-color: #1e1e1e !important;
-    color: #fff;
-  }
-  .el-icon-edit {
-    color: #f1fa8c;
-  }
-  .el-icon-document {
-    color: #a95812;
-  }
-}
-
-// home
-.right-scrollbar {
-  .el-scrollbar__view {
-    padding: 12px 18px 15px 15px;
-  }
-}
-.left-scrollbar .el-scrollbar__wrap {
-  box-sizing: border-box;
-  overflow-x: hidden !important;
-  margin-bottom: 0 !important;
-}
-.center-tabs {
-  .el-tabs__header {
-    margin-bottom: 0 !important;
-  }
-  .el-tabs__item {
-    width: 50%;
-    text-align: center;
-  }
-  .el-tabs__nav {
-    width: 100%;
-  }
-}
-.reg-item {
-  padding: 12px 6px;
-  background: #f8f8f8;
-  position: relative;
-  border-radius: 4px;
-  .close-btn {
-    position: absolute;
-    right: -6px;
-    top: -6px;
-    display: block;
-    width: 16px;
-    height: 16px;
-    line-height: 16px;
-    background: rgba(0, 0, 0, 0.2);
-    border-radius: 50%;
-    color: #fff;
-    text-align: center;
-    z-index: 1;
-    cursor: pointer;
-    font-size: 12px;
-    &:hover {
-      background: rgba(210, 23, 23, 0.5);
-    }
-  }
-  & + .reg-item {
-    margin-top: 18px;
-  }
-}
-.action-bar {
-  & .el-button + .el-button {
-    margin-left: 15px;
-  }
-  & i {
-    font-size: 20px;
-    vertical-align: middle;
-    position: relative;
-    top: -1px;
-  }
-}
-
-.custom-tree-node {
-  width: 100%;
-  font-size: 14px;
-  .node-operation {
-    float: right;
-  }
-  i[class*="el-icon"] + i[class*="el-icon"] {
-    margin-left: 6px;
-  }
-  .el-icon-plus {
-    color: #409eff;
-  }
-  .el-icon-delete {
-    color: #157a0c;
-  }
-}
-
-.left-scrollbar .el-scrollbar__view {
-  overflow-x: hidden;
-}
-
-.el-rate {
-  display: inline-block;
-  vertical-align: text-top;
-}
-.el-upload__tip {
-  line-height: 1.2;
-}
-
-$selectedColor: #f6f7ff;
-$lighterBlue: #409eff;
-
-.container {
-  position: relative;
-  width: 100%;
-  height: 100%;
-}
-
-.components-list {
-  padding: 8px;
-  box-sizing: border-box;
-  height: 100%;
-  .components-item {
-    display: inline-block;
-    width: 48%;
-    margin: 1%;
-    transition: transform 0ms !important;
-  }
-}
-.components-draggable {
-  padding-bottom: 20px;
-}
-.components-title {
-  font-size: 14px;
-  color: #222;
-  margin: 6px 2px;
-  .svg-icon {
-    color: #666;
-    font-size: 18px;
-  }
-}
-
-.components-body {
-  padding: 8px 10px;
-  background: $selectedColor;
-  font-size: 12px;
-  cursor: move;
-  border: 1px dashed $selectedColor;
-  border-radius: 3px;
-  .svg-icon {
-    color: #777;
-    font-size: 15px;
-  }
-  &:hover {
-    border: 1px dashed #787be8;
-    color: #787be8;
-    .svg-icon {
-      color: #787be8;
-    }
-  }
-}
-
-.left-board {
-  width: 260px;
-  position: absolute;
-  left: 0;
-  top: 0;
-  height: 100vh;
-}
-.left-scrollbar {
-  height: calc(100vh - 42px);
-  overflow: hidden;
-}
-.center-scrollbar {
-  height: calc(100vh - 42px);
-  overflow: hidden;
-  border-left: 1px solid #f1e8e8;
-  border-right: 1px solid #f1e8e8;
-  box-sizing: border-box;
-}
-.center-board {
-  height: 100vh;
-  width: auto;
-  margin: 0 350px 0 260px;
-  box-sizing: border-box;
-}
-.empty-info {
-  position: absolute;
-  top: 46%;
-  left: 0;
-  right: 0;
-  text-align: center;
-  font-size: 18px;
-  color: #ccb1ea;
-  letter-spacing: 4px;
-}
-.action-bar {
-  position: relative;
-  height: 42px;
-  text-align: right;
-  padding: 0 15px;
-  box-sizing: border-box;
-  border: 1px solid #f1e8e8;
-  border-top: none;
-  border-left: none;
-  .delete-btn {
-    color: #f56c6c;
-  }
-}
-.logo-wrapper {
-  position: relative;
-  height: 42px;
-  background: #fff;
-  border-bottom: 1px solid #f1e8e8;
-  box-sizing: border-box;
-}
-.logo {
-  position: absolute;
-  left: 12px;
-  top: 6px;
-  line-height: 30px;
-  color: #00afff;
-  font-weight: 600;
-  font-size: 17px;
-  white-space: nowrap;
-  > img {
-    width: 30px;
-    height: 30px;
-    vertical-align: top;
-  }
-  .github {
-    display: inline-block;
-    vertical-align: sub;
-    margin-left: 15px;
-    > img {
-      height: 22px;
-    }
-  }
-}
-
-.center-board-row {
-  padding: 12px 12px 15px 12px;
-  box-sizing: border-box;
-  & > .el-form {
-    // 69 = 12+15+42
-    height: calc(100vh - 69px);
-  }
-}
-.drawing-board {
-  height: 100%;
-  position: relative;
-  .components-body {
-    padding: 0;
-    margin: 0;
-    font-size: 0;
-  }
-  .sortable-ghost {
-    position: relative;
-    display: block;
-    overflow: hidden;
-    &::before {
-      content: " ";
-      position: absolute;
-      left: 0;
-      right: 0;
-      top: 0;
-      height: 3px;
-      background: rgb(89, 89, 223);
-      z-index: 2;
-    }
-  }
-  .components-item.sortable-ghost {
-    width: 100%;
-    height: 60px;
-    background-color: $selectedColor;
-  }
-  .active-from-item {
-    & > .el-form-item {
-      background: $selectedColor;
-      border-radius: 6px;
-    }
-    & > .drawing-item-copy,
-    & > .drawing-item-delete {
-      display: initial;
-    }
-    & > .component-name {
-      color: $lighterBlue;
-    }
-  }
-  .el-form-item {
-    margin-bottom: 15px;
-  }
-}
-.drawing-item {
-  position: relative;
-  cursor: move;
-  &.unfocus-bordered:not(.activeFromItem) > div:first-child {
-    border: 1px dashed #ccc;
-  }
-  .el-form-item {
-    padding: 12px 10px;
-  }
-}
-.drawing-row-item {
-  position: relative;
-  cursor: move;
-  box-sizing: border-box;
-  border: 1px dashed #ccc;
-  border-radius: 3px;
-  padding: 0 2px;
-  margin-bottom: 15px;
-  .drawing-row-item {
-    margin-bottom: 2px;
-  }
-  .el-col {
-    margin-top: 22px;
-  }
-  .el-form-item {
-    margin-bottom: 0;
-  }
-  .drag-wrapper {
-    min-height: 80px;
-  }
-  &.active-from-item {
-    border: 1px dashed $lighterBlue;
-  }
-  .component-name {
-    position: absolute;
-    top: 0;
-    left: 0;
-    font-size: 12px;
-    color: #bbb;
-    display: inline-block;
-    padding: 0 6px;
-  }
-}
-.drawing-item,
-.drawing-row-item {
-  &:hover {
-    & > .el-form-item {
-      background: $selectedColor;
-      border-radius: 6px;
-    }
-    & > .drawing-item-copy,
-    & > .drawing-item-delete {
-      display: initial;
-    }
-  }
-  & > .drawing-item-copy,
-  & > .drawing-item-delete {
-    display: none;
-    position: absolute;
-    top: -10px;
-    width: 22px;
-    height: 22px;
-    line-height: 22px;
-    text-align: center;
-    border-radius: 50%;
-    font-size: 12px;
-    border: 1px solid;
-    cursor: pointer;
-    z-index: 1;
-  }
-  & > .drawing-item-copy {
-    right: 56px;
-    border-color: $lighterBlue;
-    color: $lighterBlue;
-    background: #fff;
-    &:hover {
-      background: $lighterBlue;
-      color: #fff;
-    }
-  }
-  & > .drawing-item-delete {
-    right: 24px;
-    border-color: #f56c6c;
-    color: #f56c6c;
-    background: #fff;
-    &:hover {
-      background: #f56c6c;
-      color: #fff;
-    }
-  }
-}
-</style>

+ 0 - 337
ips-ui/src/views/tool/gen/index.vue

@@ -1,337 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="表名称" prop="tableName">
-        <el-input
-          v-model="queryParams.tableName"
-          placeholder="请输入表名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="表描述" prop="tableComment">
-        <el-input
-          v-model="queryParams.tableComment"
-          placeholder="请输入表描述"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="创建时间">
-        <el-date-picker
-          v-model="dateRange"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleGenTable"
-          v-hasPermi="['tool:gen:code']"
-        >生成</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          plain
-          icon="el-icon-upload"
-          size="mini"
-          @click="openImportTable"
-          v-hasPermi="['tool:gen:import']"
-        >导入</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleEditTable"
-          v-hasPermi="['tool:gen:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['tool:gen:remove']"
-        >删除</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" align="center" width="55"></el-table-column>
-      <el-table-column label="序号" type="index" width="50" align="center">
-        <template slot-scope="scope">
-          <span>{{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}</span>
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="表名称"
-        align="center"
-        prop="tableName"
-        :show-overflow-tooltip="true"
-        width="120"
-      />
-      <el-table-column
-        label="表描述"
-        align="center"
-        prop="tableComment"
-        :show-overflow-tooltip="true"
-        width="120"
-      />
-      <el-table-column
-        label="实体"
-        align="center"
-        prop="className"
-        :show-overflow-tooltip="true"
-        width="120"
-      />
-      <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
-      <el-table-column label="更新时间" align="center" prop="updateTime" width="160" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            type="text"
-            size="small"
-            icon="el-icon-view"
-            @click="handlePreview(scope.row)"
-            v-hasPermi="['tool:gen:preview']"
-          >预览</el-button>
-          <el-button
-            type="text"
-            size="small"
-            icon="el-icon-edit"
-            @click="handleEditTable(scope.row)"
-            v-hasPermi="['tool:gen:edit']"
-          >编辑</el-button>
-          <el-button
-            type="text"
-            size="small"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['tool:gen:remove']"
-          >删除</el-button>
-          <el-button
-            type="text"
-            size="small"
-            icon="el-icon-refresh"
-            @click="handleSynchDb(scope.row)"
-            v-hasPermi="['tool:gen:edit']"
-          >同步</el-button>
-          <el-button
-            type="text"
-            size="small"
-            icon="el-icon-download"
-            @click="handleGenTable(scope.row)"
-            v-hasPermi="['tool:gen:code']"
-          >生成代码</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-    <!-- 预览界面 -->
-    <el-dialog :title="preview.title" :visible.sync="preview.open" width="80%" top="5vh" append-to-body class="scrollbar">
-      <el-tabs v-model="preview.activeName">
-        <el-tab-pane
-          v-for="(value, key) in preview.data"
-          :label="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
-          :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
-          :key="key"
-        >
-          <el-link :underline="false" icon="el-icon-document-copy" v-clipboard:copy="value" v-clipboard:success="clipboardSuccess" style="float:right">复制</el-link>
-          <pre><code class="hljs" v-html="highlightedCode(value, key)"></code></pre>
-        </el-tab-pane>
-      </el-tabs>
-    </el-dialog>
-    <import-table ref="import" @ok="handleQuery" />
-  </div>
-</template>
-
-<script>
-import { listTable, previewTable, delTable, genCode, synchDb } from "@/api/tool/gen";
-import importTable from "./importTable";
-import hljs from "highlight.js/lib/highlight";
-import "highlight.js/styles/github-gist.css";
-hljs.registerLanguage("java", require("highlight.js/lib/languages/java"));
-hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml"));
-hljs.registerLanguage("html", require("highlight.js/lib/languages/xml"));
-hljs.registerLanguage("vue", require("highlight.js/lib/languages/xml"));
-hljs.registerLanguage("javascript", require("highlight.js/lib/languages/javascript"));
-hljs.registerLanguage("sql", require("highlight.js/lib/languages/sql"));
-
-export default {
-  name: "Gen",
-  components: { importTable },
-  data() {
-    return {
-      // 遮罩层
-      loading: true,
-      // 唯一标识符
-      uniqueId: "",
-      // 选中数组
-      ids: [],
-      // 选中表数组
-      tableNames: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 表数据
-      tableList: [],
-      // 日期范围
-      dateRange: "",
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        tableName: undefined,
-        tableComment: undefined
-      },
-      // 预览参数
-      preview: {
-        open: false,
-        title: "代码预览",
-        data: {},
-        activeName: "domain.java"
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  activated() {
-    const time = this.$route.query.t;
-    if (time != null && time != this.uniqueId) {
-      this.uniqueId = time;
-      this.queryParams.pageNum = Number(this.$route.query.pageNum);
-      this.getList();
-    }
-  },
-  methods: {
-    /** 查询表集合 */
-    getList() {
-      this.loading = true;
-      listTable(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.tableList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
-      );
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 生成代码操作 */
-    handleGenTable(row) {
-      const tableNames = row.tableName || this.tableNames;
-      if (tableNames == "") {
-        this.$modal.msgError("请选择要生成的数据");
-        return;
-      }
-      if(row.genType === "1") {
-        genCode(row.tableName).then(response => {
-          this.$modal.msgSuccess("成功生成到自定义路径:" + row.genPath);
-        });
-      } else {
-        this.$download.zip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi.zip");
-      }
-    },
-    /** 同步数据库操作 */
-    handleSynchDb(row) {
-      const tableName = row.tableName;
-      this.$modal.confirm('确认要强制同步"' + tableName + '"表结构吗?').then(function() {
-        return synchDb(tableName);
-      }).then(() => {
-        this.$modal.msgSuccess("同步成功");
-      }).catch(() => {});
-    },
-    /** 打开导入表弹窗 */
-    openImportTable() {
-      this.$refs.import.show();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.dateRange = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    /** 预览按钮 */
-    handlePreview(row) {
-      previewTable(row.tableId).then(response => {
-        this.preview.data = response.data;
-        this.preview.open = true;
-        this.preview.activeName = "domain.java";
-      });
-    },
-    /** 高亮显示 */
-    highlightedCode(code, key) {
-      const vmName = key.substring(key.lastIndexOf("/") + 1, key.indexOf(".vm"));
-      var language = vmName.substring(vmName.indexOf(".") + 1, vmName.length);
-      const result = hljs.highlight(language, code || "", true);
-      return result.value || '&nbsp;';
-    },
-    /** 复制代码成功 */
-    clipboardSuccess() {
-      this.$modal.msgSuccess("复制成功");
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.tableId);
-      this.tableNames = selection.map(item => item.tableName);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
-    /** 修改按钮操作 */
-    handleEditTable(row) {
-      const tableId = row.tableId || this.ids[0];
-      const tableName = row.tableName || this.tableNames[0];
-      const params = { pageNum: this.queryParams.pageNum };
-      this.$tab.openPage("修改[" + tableName + "]生成配置", '/tool/gen-edit/index/' + tableId, params);
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const tableIds = row.tableId || this.ids;
-      this.$modal.confirm('是否确认删除表编号为"' + tableIds + '"的数据项?').then(function() {
-        return delTable(tableIds);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    }
-  }
-};
-</script>

+ 1 - 1
sql/ips_update20250701.sql

@@ -21,7 +21,7 @@ create table biz_attribute_identificationt (
 
 -- 菜单 SQL
 insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('属性识别', '2008', '1', 'identificationt', 'biz/identificationt/index', 1, 0, 'C', '0', '0', 'biz:identificationt:list', '#', 'admin', sysdate(), '', null, '属性识别菜单');
+values('属性识别', '2008', '6', 'identificationt', 'biz/identificationt/index', 1, 0, 'C', '0', '0', 'biz:identificationt:list', 'clipboard', 'admin', sysdate(), '', null, '属性识别菜单');
 
 -- 按钮父菜单ID
 SELECT @parentId := LAST_INSERT_ID();